pax_global_header00006660000000000000000000000064122177773170014530gustar00rootroot0000000000000052 comment=8b0b9a7e64e242b1bc08caa38ec4fa849a804530 navit-0.5.0~svn5643+dfsg.1/000077500000000000000000000000001221777731700152005ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/.gitignore000066400000000000000000000000431221777731700171650ustar00rootroot00000000000000/.gitk-tmp.* /CMakeLists.txt.user* navit-0.5.0~svn5643+dfsg.1/AUTHORS000066400000000000000000000005221221777731700162470ustar00rootroot00000000000000Michael Farmbauer Martin Schaller Pierre Grandin Alexander Atanasov And all the Navit Team members and contributors. See http://wiki.navit-project.org/index.php/Navit_project_members_and_contributors for the full list! navit-0.5.0~svn5643+dfsg.1/CMakeLists.txt000077500000000000000000000652751221777731700177620ustar00rootroot00000000000000set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.navitproject.navit") set(MACOSX_BUNDLE_BUNDLE_NAME "Navit") project(navit C) # Workaround for CMake issue 8345 / 9220, see http://trac.navit-project.org/ticket/1041 if(DEFINED CMAKE_CXX_COMPILER AND CMAKE_CXX_COMPILER MATCHES "^$") set(CMAKE_CXX_COMPILER CMAKE_CXX_COMPILER-NOTFOUND) endif(DEFINED CMAKE_CXX_COMPILER AND CMAKE_CXX_COMPILER MATCHES "^$") if (NOT DISABLE_CXX) enable_language(CXX OPTIONAL) endif(NOT DISABLE_CXX) cmake_minimum_required(VERSION 2.6) cmake_policy(VERSION 2.6) set(PACKAGE_VERSION "0.5.0") set(PACKAGE_NAME "navit-svn") set(PACKAGE "navit") set(PACKAGE_STRING "${PACKAGE} ${PACKAGE_VERSION}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") include("${PROJECT_SOURCE_DIR}/cmake/navit_macros.cmake") IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) # install path set(BIN_DIR bin) set(SHARE_DIR share/navit) set(LOCALE_DIR share/locale) set(IMAGE_DIR share/navit/xpm) set(MAN_DIR share/man/man1) # LIB_DIR IF(UNIX AND NOT ANDROID AND NOT APPLE) IF (NOT LIBDIR) MESSAGE(STATUS "LIBDIR variable is not defined. It will be autodetected now.") MESSAGE(STATUS "You can set it manually with -DLIBDIR=") # check 64 bit IF (CMAKE_SIZEOF_VOID_P EQUAL 4) SET(LIB_DIR lib) MESSAGE(STATUS " LIB_DIR (highest subdirectory if LIBDIR) is set to '${LIB_DIR}'") ELSE (CMAKE_SIZEOF_VOID_P EQUAL 4) SET(LIB_DIR lib64) MESSAGE(STATUS " LIB_DIR (highest subdirectory if LIBDIR) is set to '${LIB_DIR}'") ENDIF (CMAKE_SIZEOF_VOID_P EQUAL 4) ELSE (NOT LIBDIR) GET_FILENAME_COMPONENT (LIB_DIR ${LIBDIR} NAME) MESSAGE(STATUS " LIB_DIR (highest subdirectory if LIBDIR) is set to '${LIB_DIR}'") ENDIF (NOT LIBDIR) ELSE (UNIX AND NOT ANDROID AND NOT APPLE) SET(LIB_DIR lib) ENDIF (UNIX AND NOT ANDROID AND NOT APPLE) foreach(EXTRA_MODULE ${EXTRA_MODULES}) add_module(${EXTRA_MODULE} "extra module specified" TRUE) endforeach() if (EXTRA_LIBS) list(APPEND NAVIT_LIBS ${EXTRA_LIBS}) endif(EXTRA_LIBS) if (EXTRA_INCLUDES) include_directories(${EXTRA_INCLUDES}) endif(EXTRA_INCLUDES) if (EXTRA_LIBDIR) link_directories(${EXTRA_LIBDIR}) endif(EXTRA_LIBDIR) ### Detect environment add_plugin(support/ezxml "native Glib found" FALSE) add_plugin(support/glib "native Glib found" FALSE) add_plugin(support/zlib "native zlib found" FALSE) add_plugin(support/libpng "native libpng found" FALSE) add_plugin(support/wordexp "native wordexp found" FALSE) add_module(font/freetype "freetype not found" FALSE) add_module(graphics/android "FreeType library not found" FALSE) add_module(graphics/gd "FreeType library not found" FALSE) add_module(graphics/gtk_drawing_area "FreeType library not found" FALSE) add_module(graphics/opengl "FreeType library not found" FALSE) add_module(graphics/sdl "FreeType library not found" FALSE) add_module(graphics/qt_qpainter "Qt libraries not found" FALSE) add_module(gui/qml "Qt Declarative not found" FALSE) add_module(gui/gtk "GTK libs not found" FALSE) add_module(vehicle/gpsd "gpsd lib not found" FALSE) add_module(vehicle/gypsy "gypsy lib not found" FALSE) add_module(vehicle/maemo "Default" FALSE) add_module(binding/win32 "Default" FALSE) add_module(binding/dbus "dbus-glib-1 not found" FALSE) add_module(binding/python "python libraries not found" FALSE) add_module(speech/dbus "dbus-glib-1 not found" FALSE) add_module(speech/cmdline "neither system() nor CreateProcess() found" FALSE) add_module(vehicle/gpsd_dbus "dbus-glib-1 not found" FALSE) add_module(speech/speech_dispatcher "speech_dispatcher lib not found" FALSE) add_module(autoload/osso "Default" FALSE) add_module(map/garmin "Garmin library not found" FALSE) add_feature(USE_NATIVE_LANGUAGE_SUPPORT "Gettext not found and not on Windows" FALSE) INCLUDE (CPack) INCLUDE (CheckIncludeFiles) INCLUDE (CheckLibraryExists) INCLUDE (CheckFunctionExists) INCLUDE (CheckSymbolExists) find_package(Glib) find_package(Gmodule) find_package(ZLIB) find_package(Freetype) find_package(SDL) find_package(SDL_ttf) find_package(SDL_image) find_package(OpenGL) find_package(GLUT) find_package(GTK2 2.6 COMPONENTS gtk) find_package(XGettextGlade) find_package(PNG) find_package(DBusGLib) find_package(PythonLibs) find_package(OpenSSL) find_package(Threads) libfind_pkg_check_modules(FONTCONFIG fontconfig) #Qt detection if (NOT DISABLE_QT) # Unfortunately, CMake seems to ignore the "OPTIONAL_COMPONENTS" flag, # and actually requires all components to be installed. Maybe this can # be fixed later... find_package(Qt4 4.7 COMPONENTS QtCore OPTIONAL_COMPONENTS QtGui QtXml QtDeclarative QtSvg) endif (NOT DISABLE_QT) #pkg-config based detection find_package(PkgConfig) if(PKG_CONFIG_FOUND) pkg_check_modules(QUESOGLC quesoglc) pkg_check_modules(LIBLOCATION liblocation) pkg_check_modules(LIBOSSO libosso) pkg_check_modules(LIBGPS libgps>=3.1) # libgpsd=0.19.0) include_directories(${FREETYPE_INCLUDE_DIRS}) set_with_reason(font/freetype "freetype found" TRUE "${FREETYPE_LIBRARY};${FONTCONFIG_LDFLAGS};${FRIBIDI_LIBRARIES}") else(FREETYPE_FOUND) MESSAGE("No freetype library found, graphics modules may not be available") set_with_reason(graphics/android "FreeType library not found" FALSE) set_with_reason(graphics/gd "FreeType library not found" FALSE) set_with_reason(graphics/gtk_drawing_area "FreeType library not found" FALSE) set_with_reason(graphics/opengl "FreeType library not found" FALSE) set_with_reason(graphics/sdl "FreeType library not found" FALSE) endif(FREETYPE_FOUND) if(FONTCONFIG_FOUND) set(HAVE_FONTCONFIG 1) endif(FONTCONFIG_FOUND) if (QT_FOUND) if (QT_QTCORE_FOUND AND QT_QTGUI_FOUND AND FREETYPE_FOUND) include(${QT_USE_FILE}) set_with_reason(graphics/qt_qpainter "Qt libraries found" TRUE ${QT_LIBRARIES}) if (QT_QTDECLARATIVE_FOUND AND QT_QTXML_FOUND) set_with_reason(gui/qml "Qt Declarative found" TRUE ${QT_LIBRARIES}) endif() if (QT_QTSVG_FOUND) set(HAVE_QT_SVG 1) elseif( USE_SVG AND graphics/qt_qpainter) message( WARNING "QT compiled without SVG support") endif() endif() endif(QT_FOUND) if(GTK2_FOUND) # Include gtk.h with "SYSTEM" to avoid GCC compiler warning for gtkitemfactory.h. include_directories(SYSTEM ${GTK2_GTK_INCLUDE_DIR}) include_directories(${GTK2_INCLUDE_DIRS}) set(HAVE_GTK2 1) set_with_reason(gui/gtk "GTK libs found" TRUE ${GTK2_LIBRARIES}) if(FREETYPE_FOUND) set_with_reason(graphics/gtk_drawing_area "GTK libs found" TRUE ${GTK2_LIBRARIES}) endif(FREETYPE_FOUND) endif(GTK2_FOUND) CHECK_LIBRARY_EXISTS(freeimage FreeImage_Load "" HAVE_FREEIMAGE) if (USE_OPENGLES OR USE_OPENGLES2) CHECK_LIBRARY_EXISTS(EGL eglInitialize "" HAVE_EGL) endif(USE_OPENGLES OR USE_OPENGLES2) if (FREETYPE_FOUND) if (OPENGL_FOUND AND OPENGL_GLU_FOUND AND GLUT_FOUND AND OPENGL_INCLUDE_DIR) message (STATUS "opengl found: ${OPENGL_gl_LIBRARY}") include_directories(${OPENGL_INCLUDE_DIR}) if (USE_OPENGLES2) set(USE_OPENGLES TRUE) set(GRAPHICS_OPENGL_LIBRARY GLESv2 EGL) elseif (USE_OPENGLES) set(GRAPHICS_OPENGL_LIBRARY GLESv1_CM EGL) else() set(GRAPHICS_OPENGL_LIBRARY ${OPENGL_gl_LIBRARY};${OPENGL_glu_LIBRARY};${GLUT_glut_LIBRARY}) endif(USE_OPENGLES2) if (HAVE_FREEIMAGE) list(APPEND GRAPHICS_OPENGL_LIBRARY freeimage) endif(HAVE_FREEIMAGE) set_with_reason(graphics/opengl "Found OpenGL" TRUE ${GRAPHICS_OPENGL_LIBRARY}) else() message (STATUS "opengl not found") endif() else() message (STATUS "no Freetype found") endif(FREETYPE_FOUND) if(SDL_FOUND AND SDLIMAGE_FOUND AND FREETYPE_FOUND) set(SDL_IMAGE 1) if(SDLTTF_FOUND) set(SDL_TTF 1) list(APPEND SDL_LIBRARY ${SDLTTF_LIBRARY}) else(SDLTTF_FOUND) list(APPEND SDL_LIBRARY ${FREETYPE_LIBRARY}) endif(SDLTTF_FOUND) set_with_reason(graphics/sdl "SDL/SDL_image libs found" TRUE ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY}) endif(SDL_FOUND AND SDLIMAGE_FOUND AND FREETYPE_FOUND) if (LIBGPS_FOUND) set_with_reason(vehicle/gpsd "gpsd lib found" TRUE ${LIBGPS_LDFLAGS}) endif(LIBGPS_FOUND) if (GYPSY_FOUND) set_with_reason(vehicle/gypsy "gypsy lib found" TRUE) endif(GYPSY_FOUND) if (LIBGARMIN_FOUND) include_directories(${LIBGARMIN_INCLUDE_DIRS}) set_with_reason(map/garmin "Garmin library found" TRUE ${LIBGARMIN_LDFLAGS}) endif(LIBGARMIN_FOUND) if(DBusGLib_FOUND) include_directories(${DBusGLib_INCLUDE_DIRS}) set_with_reason(binding/dbus "dbus-glib-1 found" TRUE ${DBusGLib_LIBRARIES}) set_with_reason(speech/dbus "dbus-glib-1 found" TRUE ${DBusGLib_LIBRARIES}) set_with_reason(vehicle/gpsd_dbus "dbus-glib-1 found" TRUE ${DBusGLib_LIBRARIES}) endif() if(PYTHONLIBS_FOUND) set_with_reason(binding/python "python libraries [${PYTHONLIBS_VERSION_STRING}] found" TRUE ${PYTHON_LIBRARIES}) endif() if (HAVE_LIBSPEECHD) set_with_reason(speech/speech_dispatcher "speech_dispatcher lib found" TRUE speechd) endif(HAVE_LIBSPEECHD) if (HAVE_SYSTEM) set_with_reason(speech/cmdline "system() call is available" TRUE) endif(HAVE_SYSTEM) if (HAVE_CREATEPROCESS) set_with_reason(speech/cmdline "CreateProcess() call is available" TRUE) endif(HAVE_CREATEPROCESS) if (LIBLOCATION_FOUND) set_with_reason(vehicle/maemo "Maemo location library found" TRUE ${LIBLOCATION_LIBRARIES}) endif(LIBLOCATION_FOUND) if (LIBOSSO_FOUND) set_with_reason(autoload/osso "Maemo osso library found" TRUE ${LIBOSSO_LIBRARIES}) endif(LIBOSSO_FOUND) if (GETTEXT_FOUND) set_with_reason(USE_NATIVE_LANGUAGE_SUPPORT "Gettext found" TRUE) endif(GETTEXT_FOUND) #Independent modules add_module(graphics/null "Default" TRUE) add_module(osd/core "Default" TRUE) add_module(vehicle/demo "Default" TRUE) add_module(vehicle/file "Default" TRUE) add_module(vehicle/null "Default" FALSE) add_module(gui/internal "Default" TRUE) add_module(map/binfile "Default" TRUE) add_module(map/filter "Default" TRUE) if(NOT MSVC) add_module(map/mg "Default" TRUE) endif(NOT MSVC) add_module_plugin(support/shapefile "Default" TRUE) set(map_shapefile_INCLUDES "${CMAKE_SOURCE_DIR}/navit/support/shapefile") #set(map_shapefile_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/navit/support/shapefile") set(map_shapefile_LIBS "support_shapefile") add_module(map/shapefile "Default" TRUE) add_module(map/textfile "Default" TRUE) add_module(map/csv "Default" TRUE) #Modules without test yet add_module(plugin/pedestrian "Default" FALSE) add_module(speech/android "Default" FALSE) add_module(speech/espeak "Default" FALSE) add_module(speech/iphone "Default" FALSE) add_plugin(support/espeak "Default" FALSE) add_module(vehicle/android "Default" FALSE) add_module(vehicle/iphone "Default" FALSE) add_module(vehicle/wince "Default" FALSE) add_module(graphics/cocoa "Default" FALSE) # other features add_feature(USE_PLUGINS "default" TRUE) add_feature(SHARED_LIBNAVIT "default" FALSE) add_feature(USE_ROUTING "default" TRUE) add_feature(USE_SVG "default" TRUE) add_feature(SVG2PNG "default" TRUE) add_feature(SAMPLE_MAP "default" TRUE) IF(NOT svg2png_scaling) set(svg2png_scaling 0 16 32 48 64 96) ENDIF() IF(NOT svg2png_scaling_flag) set(svg2png_scaling_flag 32) ENDIF() IF(NOT svg2png_scaling_nav) set(svg2png_scaling_nav 64) ENDIF() add_feature(DBUS_USE_SYSTEM_BUS "default" FALSE) add_feature(BUILD_MAPTOOL "default" TRUE) add_feature(XSL_PROCESSING "default" TRUE) set(SUPPORTED_XSLT_PROCESSORS "saxonb-xslt;saxon;saxon8;saxon-xslt;xsltproc;transform.exe") find_program(XSLT_PROCESSOR NAMES ${SUPPORTED_XSLT_PROCESSORS}) if(XSLT_PROCESSOR) message(STATUS "Found XSLT processor: ${XSLT_PROCESSOR}") execute_process(COMMAND ${XSLT_PROCESSOR} -snone ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test.xml ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test.xslt RESULT_VARIABLE SAXON_ERROR ERROR_QUIET) if (NOT SAXON_ERROR) set (XSLT_PROCESSOR_OPTIONS -snone) endif() # additional parameter is passed to the stylesheet processor as transformation parameter macro(compose_xslt_transform_command CMDVAR XSLT_FILE SRC_XML DEST_XML) if(${XSLT_PROCESSOR} MATCHES "xsltproc") set(${CMDVAR} COMMAND ${XSLT_PROCESSOR} ${XSLT_PROCESSOR_OPTIONS} ${XSLT_FILE} ${SRC_XML} >${DEST_XML}) else() set(${CMDVAR} COMMAND ${XSLT_PROCESSOR} ${XSLT_PROCESSOR_OPTIONS} ${SRC_XML} ${XSLT_FILE} ${ARGN} >${DEST_XML}) endif() endmacro() else() cfg_feature(XSL_PROCESSING "Saxon missing" FALSE) endif(XSLT_PROCESSOR) if (NOT XSL_PROCESSING) message(WARNING "No XSLT processor available. You have to configure " "navit.xml yourself, or install an XSLT processor (supported: " "${SUPPORTED_XSLT_PROCESSORS}).") endif() ### Platform specific settings if(NOT CACHE_SIZE) SET(CACHE_SIZE 1048576) endif(NOT CACHE_SIZE) if(WIN32 OR WINCE) SET(CMAKE_EXECUTABLE_SUFFIX ".exe") add_module(graphics/win32 "Windows detected" TRUE) add_plugin(support/win32 "Windows detected" TRUE) SET(CMAKE_RC_COMPILE_OBJECT " -O coff -I ${CMAKE_CURRENT_SOURCE_DIR}/navit/gui/win32/resources -i -o ") set_with_reason(support/ezxml "Windows detected" TRUE) set_with_reason(speech/espeak "Windows detected" TRUE) set_with_reason(support/espeak "Windows detected" TRUE) set_with_reason(binding/win32 "Windows detected" TRUE) # vehicle_file is broken for windows. use vehicle_wince instead # whicle_wince isn't buildable on non-CE windows ssytems # plugins currently not supported on windows set_with_reason(USE_PLUGINS "win32: currently not supported" FALSE) set(HAVE_API_WIN32_BASE 1) set(EZXML_NOMMAP 1) # Image stuff if(NOT graphics/qt_qpainter) set_with_reason(USE_SVG "win32: SVGs currently not supported" FALSE) else(NOT graphics/qt_qpainter) MESSAGE(STATUS "win32: SVGs may not be supported by every available graphics") endif(NOT graphics/qt_qpainter) set(BIN_DIR bin) set(SHARE_DIR ./) set(LOCALE_DIR locale) set(IMAGE_DIR xpm) if(HAVE_GTK2 AND NOT MSVC) #GTK requires special compile flags add_definitions("-mms-bitfields") endif(HAVE_GTK2 AND NOT MSVC) if(MSVC AND support/espeak) add_definitions(-DPLATFORM_WINDOWS) endif(MSVC AND support/espeak) CHECK_LIBRARY_EXISTS(ws2_32 WSAStartup "" HAVE_WINSOCK) if(HAVE_WINSOCK) list(APPEND NAVIT_LIBS ws2_32) else() CHECK_LIBRARY_EXISTS(ws2 WSAStartup "" HAVE_WINSOCK_2) if(HAVE_WINSOCK_2) set(HAVE_WINSOCK 1) list(APPEND NAVIT_LIBS ws2) endif() endif(HAVE_WINSOCK) if(MSVC) set(HAVE_PRAGMA_PACK 1) add_plugin(support/xgetopt "Windows detected" TRUE) endif(MSVC) set_with_reason(USE_NATIVE_LANGUAGE_SUPPORT "Windows detected" TRUE) enable_language(RC) set(XSLTS "windows;${XSLTS}" CACHE STRING "define a semicolon seperated list of XSLTs to process") endif() if (WIN32 AND NOT WINCE) set(HAVE_PRAGMA_PACK 1) set(HAVE_API_WIN32 1) set(HAVE_STDINT_H 1) #set(BUILD_MAPTOOL FALSE) set(SAMPLE_MAP FALSE) list(APPEND NAVIT_LIBS winmm) endif() if(WINCE) add_plugin(support/libc "wince detected" TRUE) set(HAVE_PRAGMA_PACK 1) set(HAVE_API_WIN32_CE 1) set(BUILD_MAPTOOL FALSE) set_with_reason(vehicle/file "wince: currently broken" FALSE) set_with_reason(vehicle/wince "wince detected" TRUE) endif() if (APPLE OR USE_UIKIT) set_with_reason(vehicle/iphone "apple detected" TRUE) set_with_reason(graphics/cocoa "apple detected" TRUE) if (EXISTS "${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks/VoiceServices.framework") set_with_reason(speech/iphone "apple detected" TRUE) endif() set(BUILD_BUNDLE TRUE CACHE BOOLEAN "build an osx bundle") endif() set(LOCALEDIR "${LOCALE_DIR}/locale") find_program(BZCAT NAMES bzcat) if (SAMPLE_MAP) if(CMAKE_CROSSCOMPILING) cfg_feature(SAMPLE_MAP "downloading binary map because of cross compiling" TRUE) set(DOWNLOAD_SAMPLE_MAP TRUE) elseif(NOT BZCAT) cfg_feature(SAMPLE_MAP "downloading binary map because of missing bzcat" TRUE) set(DOWNLOAD_SAMPLE_MAP TRUE) endif(CMAKE_CROSSCOMPILING) endif(SAMPLE_MAP) if(ANDROID) # for android API 3 compatiblity SET(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,/data/data/org.navitproject.navit/lib/") find_program(ANDROID_LOCATION NAMES android android.bat) find_program(ANT_LOCATION NAMES ant) if (NOT ANT_LOCATION) message_error("Could not find ant. Please install ant and add it to the search path.") else() execute_process(COMMAND ${ANT_LOCATION} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake RESULT_VARIABLE ANT_VERSION_OK OUTPUT_QUIET ERROR_QUIET) if(ANT_VERSION_OK GREATER 0) message(WARNING "Old ant version detected. If you need crash reporter, update to at least ant 1.8") endif() endif() if (NOT ANDROID_LOCATION) message_error( "Could not find 'Android SDK and AVD Manager'. Please install the android sdk and add the /tools directory to the search path.") endif() set(XSLTS "android;${XSLTS}" CACHE STRING "define a semicolon seperated list of XSLTs to process") list(APPEND NAVIT_LIBS log) set(HAVE_API_ANDROID 1) set_with_reason(graphics/android "Android detected" TRUE) set_with_reason(speech/android "Android detected" TRUE) set_with_reason(vehicle/android "Android detected" TRUE) set_with_reason(plugin/pedestrian "Android detected" TRUE) cfg_feature(SHARED_LIBNAVIT "Android detected" TRUE) add_feature(XPM2PNG "Android detected" TRUE) set(NAVIT_COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS} -fPIC") endif(ANDROID) if(FREETYPE_FOUND AND NOT FONTCONFIG_FOUND) add_subdirectory( "${CMAKE_CURRENT_SOURCE_DIR}/navit/fonts") endif() # Image conversion find_program(IMAGE_CONVERTER NAMES convert) execute_process(COMMAND ${IMAGE_CONVERTER} -list format OUTPUT_VARIABLE CONVERT_FORMATS) if(CONVERT_FORMATS MATCHES ".*XPM[ *][ ]*XPM[ ]*r[w-].*") set(IMAGE_CONVERTER_XPM ${IMAGE_CONVERTER}) endif() set(CMAKE_APPBUNDLE_PATH "") if (SVG2PNG) if (NOT IMAGE_CONVERTER_SVGZ) set (SVG_CONVERTER_PROGS rsvg-convert ksvgtopng ksvgtopng4 inkscape) set (CMAKE_FIND_APPBUNDLE "NEVER") find_program(IMAGE_CONVERTER_SVGZ NAMES ${SVG_CONVERTER_PROGS} PATHS /Applications/Inkscape.app/Contents/Resources/bin) if (NOT IMAGE_CONVERTER_SVGZ) if(CONVERT_FORMATS MATCHES ".*[ ]*SVG[ ]*r[w-].*") set(IMAGE_CONVERTER_SVGZ ${IMAGE_CONVERTER}) endif() endif() endif(NOT IMAGE_CONVERTER_SVGZ) if (NOT IMAGE_CONVERTER_SVG) set(IMAGE_CONVERTER_SVG ${IMAGE_CONVERTER_SVGZ}) endif(NOT IMAGE_CONVERTER_SVG) message(STATUS "SVG2PNG-Converter: ${IMAGE_CONVERTER_SVGZ}") if (NOT IMAGE_CONVERTER_SVGZ) message(WARNING "No SVG2PNG converter found. Please install one of the following tools: ${SVG_CONVERTER_PROGS}, or imagemagick with svg support") set_with_reason(SVG2PNG "no converter found" FALSE) endif(NOT IMAGE_CONVERTER_SVGZ) endif(SVG2PNG) if (XPM2PNG) message(STATUS "XPM2PNG-Converter: ${IMAGE_CONVERTER_XPM}") if (NOT IMAGE_CONVERTER_XPM) message(WARNING "No XPM2PNG converter found. Please install imagemagick with xpm support") set_with_reason(XPM2PNG "no converter found" FALSE) endif(NOT IMAGE_CONVERTER_XPM) endif(XPM2PNG) set(XSLTS ${XSLTS} CACHE STRING "define a semicolon seperated list of XSLTs to process") # Plugins if(USE_PLUGINS) set(MODULE_BUILD_TYPE "MODULE") add_definitions("-fPIC") list(APPEND NAVIT_LIBS dl) else() set(MODULE_BUILD_TYPE "STATIC") endif(USE_PLUGINS) message(STATUS "Use plugins: ${MODULE_BUILD_TYPE}") if (SHARED_LIBNAVIT) set(NAVIT_CORE_BUILD_TYPE "STATIC") else(SHARED_LIBNAVIT) set(NAVIT_CORE_BUILD_TYPE "SHARED") endif(SHARED_LIBNAVIT) CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) CHECK_INCLUDE_FILES ("sys/param.h;sys/mount.h" HAVE_SYS_MOUNT_H) CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) CHECK_FUNCTION_EXISTS (getcwd HAVE_GETCWD) CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN) CHECK_FUNCTION_EXISTS (valloc HAVE_VALLOC) CHECK_FUNCTION_EXISTS (posix_memalign HAVE_POSIX_MEMALIGN) CHECK_FUNCTION_EXISTS (popen HAVE_POPEN) CHECK_FUNCTION_EXISTS (_atoi64 HAVE__ATOI64) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) # Compile with -Wall -Wextra. We need all the help we can get from the compiler :-). # Disabled warnings: # -Wno-missing-field-initializers: Used a lot, does not seem problematic. # -Wno-unused-parameter: Unfortunately occurs frequently because of # functions implementing the interface of a plugin. # -Wno-sign-compare: We currently just use int almost everywhere. # Unclear if it's really worth correcting. include(CheckCCompilerFlag) if(CMAKE_COMPILER_IS_GNUCC OR CCMAKE_COMPILER_IS_GNUCXX) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wcast-align -Wpointer-arith -Wextra -Wno-unused-parameter -Wno-sign-compare -Wmissing-prototypes -Wstrict-prototypes ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wcast-align -Wpointer-arith -Wextra -Wno-unused-parameter -Wno-sign-compare ") # -Wno-missing-field-initializers does not work with old gcc check_c_compiler_flag(-Wno-missing-field-initializers HAS_NO_MISSING_FIELD_INI) if (HAS_NO_MISSING_FIELD_INI) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-field-initializers ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-field-initializers ") endif() endif() if (EXTRA_DEFINES) add_definitions("${EXTRA_DEFINES}") endif(EXTRA_DEFINES) if (NOT NAVIT_DEPENDENCY_ERROR) message("\nSummary:\n") set(SUMMARY_COMPONENTS ${ALL_PLUGINS} ${ALL_MODULE_PLUGINS} ${ALL_MODULES}) list(SORT SUMMARY_COMPONENTS) set(LAST_TYPE NONE) foreach ( SUMMARY_COMP ${SUMMARY_COMPONENTS}) # split path to type and name string(REPLACE "/" ";" SUMMARY_COMP_LIST ${SUMMARY_COMP}) list(GET SUMMARY_COMP_LIST 0 SUMMARY_COMP_TYPE) list(LENGTH SUMMARY_COMP_LIST SUMMARY_COMP_LIST_LENGTH) if ( SUMMARY_COMP_LIST_LENGTH GREATER 1 ) list(GET SUMMARY_COMP_LIST 1 SUMMARY_COMP_NAME) else() set(SUMMARY_COMP_NAME ${SUMMARY_COMP}) endif() if ( NOT ${LAST_TYPE} STREQUAL ${SUMMARY_COMP_TYPE}) message("\n--->>> ${SUMMARY_COMP_TYPE}") set(LAST_TYPE ${SUMMARY_COMP_TYPE}) endif() if (${SUMMARY_COMP}) message("Enabled ${SUMMARY_COMP_NAME} ( ${${SUMMARY_COMP}_REASON} )") else() message("Disabled ${SUMMARY_COMP_NAME} ( ${${SUMMARY_COMP}_REASON} )") endif() endforeach() list(SORT ALL_FEATURES) message("\n--->>> Features") foreach ( FEATURE ${ALL_FEATURES}) if ( ${FEATURE} ) message("Enabled ${FEATURE} ( ${${FEATURE}_REASON} )") else() message("Disabled ${FEATURE} ( ${${FEATURE}_REASON} )") endif() endforeach() if (XSL_PROCESSING) if (XSLTS) message("\nProcessing XSLT files: ${XSLTS}") else() message("\nProcessing XSLT files: NONE") endif(XSLTS) message("See navit/xslt for available XSLT files, and put them into " "cache variable 'XSLTS' (without extension .xslt).") endif(XSL_PROCESSING) message("\nTo configure your build use 'cmake -L' to find changeable variables and run cmake again with 'cmake -D = ...'.") endif(NOT NAVIT_DEPENDENCY_ERROR) add_subdirectory (navit) add_subdirectory (man) if (USE_NATIVE_LANGUAGE_SUPPORT) add_subdirectory (po) endif(USE_NATIVE_LANGUAGE_SUPPORT) navit-0.5.0~svn5643+dfsg.1/COPYING000066400000000000000000000073231221777731700162400ustar00rootroot00000000000000The following files are lincensed under the terms of the GNU General Public License (see GPL-2): navit/tools/gpx2navit_txt/src/utils.c navit/tools/gpx2navit_txt/src/setmeta.c navit/tools/gpx2navit_txt/src/setpath.c navit/tools/gpx2navit_txt/src/emess.h navit/tools/gpx2navit_txt/src/main.c navit/tools/gpx2navit_txt/src/geod_for.c navit/tools/gpx2navit_txt/src/setwpt.c navit/tools/gpx2navit_txt/src/gpx2navit_txt.h navit/tools/gpx2navit_txt/src/geodesic.h navit/tools/gpx2navit_txt/src/geod_set.c navit/tools/gpx2navit_txt/src/errorcode.h navit/tools/gpx2navit_txt/src/geod_inv.c navit/tools/gpx2navit_txt/src/elementControl.c navit/tools/gpx2navit_txt/src/misc.c navit/tools/gpx2navit_txt/src/parser.c navit/tools/gpx2navit_txt/depcomp navit/tools/gpx2navit_txt/config.guess navit/tools/gpx2navit_txt/config.sub navit/tools/gpx2navit_txt/COPYING navit/tools/gpx2navit_txt/missing navit/vehicle/file/vehicle_file.c navit/vehicle/demo/vehicle_demo.c navit/vehicle/gpsd/vehicle_gpsd.c navit/gui/sdl/cegui_keyboard.h navit/gui/sdl/wmcontrol.c navit/gui/sdl/sdl_events.cpp navit/gui/sdl/wmcontrol.h navit/gui/sdl/gui_sdl.h navit/gui/sdl/sdl_events.h navit/gui/sdl/cegui_keyboard.cpp navit/gui/sdl/gui_sdl_window.cpp navit/gui/gtk/gui_gtk.h navit/gui/gtk/gui_gtk_window.c navit/gui/gtk/datawindow.c navit/gui/gtk/destination.c navit/gui/gtk/gui_gtk_statusbar.c navit/gui/gtk/gui_gtk_action.c navit/gui/internal/gui_internal.c navit/graphics/opengl/graphics_opengl.c navit/graphics/gtk_gl_ext/graphics_gtk_gl_ext.c navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c navit/graphics/null/graphics_null.c navit/speech/cmdline/speech_cmdline.c navit/speech/speech_dispatcher/speech_speech_dispatcher.c navit/data/mg/tree.c navit/data/mg/poly.c navit/data/mg/street.c navit/data/mg/town.c navit/data/mg/mg.h navit/data/mg/block.c navit/data/mg/map.c navit/data/textfile/textfile.c navit/data/textfile/textfile.h navit/data/csv/csv.c navit/data/csv/csv.h navit/data/binfile/binfile.c navit/data/garmin_img/garmin_img.c navit/data/garmin/gentypes.c navit/data/garmin/gar2navit.c navit/data/garmin/garmin.c navit/osd/core/osd_core.c navit/binding/python/binding_python.c navit/binding/dbus/binding_dbus.c navit/country.c navit/track.c navit/compass.c navit/util.c navit/debug.c navit/route.c navit/param.c navit/menu.c navit/speech.c navit/attr.c navit/transform.c navit/projection.c navit/layout.c navit/cursor.c navit/event.c navit/gui.c navit/osd.c navit/item.c navit/navigation.c navit/graphics.c navit/profile.c navit/popup.c navit/coord.c navit/maptool.c navit/mapset.c navit/plugin.c navit/data_window.c navit/search.c navit/map.c navit/maptype.c navit/file.c navit/vehicle.c navit/navit.c navit/log.c navit/phrase.c navit/main.c navit/xmlconfig.c navit/callback.c contrib/android_build.sh contrib/sjjb_import.pl The following files are lincensed under the terms of the GNU Library General Public License (see LGPL): navit/callback.h navit/country.h navit/track.h navit/compass.h navit/item_def.h navit/util.h navit/debug.h navit/point.h navit/route.h navit/param.h navit/zipfile.h navit/menu.h navit/map_data.h navit/speech.h navit/data.h navit/attr.h navit/data_window_int.h navit/transform.h navit/plugin_def.h navit/projection.h navit/layout.h navit/cursor.h navit/color.h navit/destination.h navit/event.h navit/gui.h navit/osd.h navit/item.h navit/navigation.h navit/graphics.h navit/profile.h navit/popup.h navit/types.h navit/coord.h navit/draw_info.h navit/endianess.h navit/map-share.h navit/mapset.h navit/plugin.h navit/data_window.h navit/search.h navit/gtkext.h navit/layer.h navit/map.h navit/maptype.h navit/file.h navit/vehicle.h navit/log.h navit/navit.h navit/phrase.h navit/main.h navit/xmlconfig.h navit/attr_def.h navit-0.5.0~svn5643+dfsg.1/COPYRIGHT000066400000000000000000000002201221777731700164650ustar00rootroot00000000000000Unless stated otherwise, all files are: Copyright 2005 - 2008 Navit Team (see AUTHORS) and are licensed under the GPLv2 (see GPL-2 and COPYING) navit-0.5.0~svn5643+dfsg.1/ChangeLog000066400000000000000000000003221221777731700167470ustar00rootroot00000000000000Changes and documentation about Navit can be found in the wiki at: http://wiki.navit-project.org A timeline of opened and closed issue tickets can be found at our trac instance: http://trac.navit-project.org navit-0.5.0~svn5643+dfsg.1/GPL-2000066400000000000000000000431031221777731700157050ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. navit-0.5.0~svn5643+dfsg.1/LGPL-2000066400000000000000000000613041221777731700160240ustar00rootroot00000000000000 GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! navit-0.5.0~svn5643+dfsg.1/Makefile.am000066400000000000000000000012511221777731700172330ustar00rootroot00000000000000ACLOCAL_AMFLAGS= -I m4 include $(top_srcdir)/Makefile.inc SUBDIRS= if USE_NATIVE_LANGUAGE_SUPPORT XCFLAGS=-DINSTALLPREFIX=INSTALLDIR if SUPPORT_WIN32 XCFLAGS+=-DSUBLANG_BENGALI_BANGLADESH=0x03 -DSUBLANG_PUNJABI_PAKISTAN=0x03 -DSUBLANG_ROMANIAN_MOLDOVA=0x03 if SUPPORT_WIN32CE if SHARED_LIBNAVIT XCFLAGS+=-L../navit/support/libc -lsupport_libc AM_MAKEFLAGS=l=l SUBDIRS+=navit/support/libc endif endif endif if SUPPORT_ANDROID XCFLAGS+=-Xcompiler -nostartfiles endif export XCFLAGS SUBDIRS+=intl po man endif SUBDIRS+=navit pkgdoc_DATA = README EXTRA_DIST = README COPYRIGHT LGPL-2 GPL-2 COPYING INSTALL contrib/android_build.sh contrib/sjjb_import.pl DIST_SUBDIRS=intl po navit man navit-0.5.0~svn5643+dfsg.1/Makefile.inc000066400000000000000000000007461221777731700174170ustar00rootroot00000000000000modulebindingdir=$(pkglibdir)/binding modulemapdir=$(pkglibdir)/map modulefontdir=$(pkglibdir)/font modulegraphicsdir=$(pkglibdir)/graphics moduleguidir=$(pkglibdir)/gui modulespeechdir=$(pkglibdir)/speech moduleosddir=$(pkglibdir)/osd modulevehicledir=$(pkglibdir)/vehicle moduleplugindir=$(pkglibdir)/plugin moduleautoloaddir=$(pkglibdir)/autoload pkgdocdir=$(pkgdatadir) imagedir=$(pkgdatadir)/xpm skinsdir=$(pkgdatadir)/skins fontsdir=$(pkgdatadir)/fonts mapsdir=$(pkgdatadir)/maps navit-0.5.0~svn5643+dfsg.1/NEWS000066400000000000000000000000001221777731700156650ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/README000066400000000000000000000050651221777731700160660ustar00rootroot00000000000000NavIT ===== Navit is a open source (GPL) car navigation system with routing engine. It's modular design is capable of using vector maps of various formats for routing and rendering of the displayed map. It's even possible to use multiple maps at a time. The GTK+ or SDL user interfaces are designed to work well with touch screen displays. Points of Interest of various formats are displayed on the map. The current vehicle position is either read from gpsd or directly from NMEA GPS sensors. The routing engine not only calculates an optimal route to your destination, but also generates directions and even speaks to you. Navit currently speaks 27 languages : - Brazilian Portuguese - Bulgarian - Chinese (Hong Kong) - Czech - Danish - Dutch - English - Estonian - Finnish - French - German - Hebrew - Hungarian - Italian - Japanese - Norwegian Bokmal - Polish - Portuguese - Romanian - Russian - Slovak - Slovenian - Spanish - Swedish - Telugu - Thai - Turkish You can help translating via our web based translation page : http://translations.launchpad.net/navit/trunk/+pots/navit For help or more information, please refer to the wiki : http://wiki.navit-project.org If you don't know where to start, we recommend you to read the Interactive Help : http://wiki.navit-project.org/index.php/Interactive_help Maps: ===== The best navigation system is useless without maps. Those three maps are known to work: - OpenStreetMaps : display, routing, but street name search isn't complete (see http://wiki.navit-project.org/index.php/OpenStreetMaps ) - Grosser Reiseplaner and compliant maps : full support (see http://wiki.navit-project.org/index.php/European_maps ) - Garmin maps : display, routing, search is being worked on (see http://wiki.navit-project.org/index.php/Garmin_maps ) GPS Support: ============ Navit read the current vehicle position : - directly from a file - from gpsd (local or remote) - from udp server (friends tracking) (experimental) Routing algorithm ================= NavIt uses a Dijkstra algorithm for routing. The routing starts at the destination by assigning a value to each point directly connected to destination point. The value represents the estimated time needed to pass this distance. Now the point with the lowest value is choosen using the Fibonacci heap and a value is assigned to connected points whos are unevaluated or whos current value ist greater than the new one. The search is repeated until the origin is found. Once the origin is reached, all that needs to be done is to follow the points with the lowest values to the destination. navit-0.5.0~svn5643+dfsg.1/Toolchain/000077500000000000000000000000001221777731700171205ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/Toolchain/arm-apple-darwin9.cmake000066400000000000000000000015471221777731700233620ustar00rootroot00000000000000 # specify the cross compiler SET(CMAKE_C_COMPILER "arm-apple-darwin9-gcc") SET(CMAKE_CXX_COMPILER "arm-apple-darwin9-g++") SET(CMAKE_RC_COMPILER_INIT "arm-apple-darwin9-windres") SET(PKG_CONFIG_EXECUTABLE "arm-apple-darwin9-pkg-config") get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} PATH) set (SDKROOT "/work/compile/cc/iphone/trunk/toolchain" CACHE STRING "PATH to iPhone SDK") set(CMAKE_FIND_ROOT_PATH "${SDKROOT}/sys") INCLUDE_DIRECTORIES("${SDKROOT}/sys/usr/include") SET(USE_UIKIT TRUE) SET(APPLE_BUILD TRUE) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) ADD_DEFINITIONS(-D__IPHONE_OS_VERSION_MIN_REQUIRED=20200) set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -lobjc -framework CoreFoundation -bind_at_load") navit-0.5.0~svn5643+dfsg.1/Toolchain/arm-eabi.cmake000077500000000000000000000030611221777731700216020ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME GNU) set(ANDROID TRUE) set(ANDROID_API_VERSION 8 CACHE STRING "Andriod API Version") set(ANDROID_NDK_API_VERSION ${ANDROID_API_VERSION} CACHE STRING "Andriod NDK API Version") set(ANDROID_ARCH "armeabi" CACHE STRING "Android architecture") find_program(CMAKE_C_COMPILER NAMES arm-eabi-gcc arm-eabi-gcc.exe arm-linux-androideabi-gcc arm-linux-androideabi-gcc.exe) find_program(CMAKE_CXX_COMPILER NAMES arm-eabi-gcc arm-eabi-g++.exe arm-linux-androideabi-g++ arm-linux-androideabi-g++.exe) set(PKG_CONFIG_EXECUTABLE "arm-eabi-pkg-config") get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} PATH) set(ANDROID_NDK "${COMPILER_PATH}/../../../../.." CACHE STRING "PATH to Andriod NDK") set(NDK_ARCH_DIR "${ANDROID_NDK}/platforms/android-${ANDROID_NDK_API_VERSION}/arch-arm") set(CMAKE_FIND_ROOT_PATH ${NDK_ARCH_DIR}) set(CMAKE_REQUIRED_FLAGS "-ldl --sysroot=${NDK_ARCH_DIR} ${EXTRA_COMPILER_FLAGS}") set(CMAKE_REQUIRED_INCLUDES "${NDK_ARCH_DIR}/usr/include") set(NAVIT_COMPILE_FLAGS "-I${NDK_ARCH_DIR}/usr/include -g -D_GNU_SOURCE -DANDROID -fno-short-enums ${CMAKE_REQUIRED_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined -Wl,-rpath,/system/lib") set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined") set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,-rpath,/data/data/org.navitproject.navit/lib") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) navit-0.5.0~svn5643+dfsg.1/Toolchain/arm-mingw32ce.cmake000066400000000000000000000005761221777731700225050ustar00rootroot00000000000000SET(CMAKE_SYSTEM_NAME WINCE) # specify the cross compiler FIND_PROGRAM(CMAKE_C_COMPILER NAMES arm-mingw32ce-gcc arm-wince-mingw32ce-gcc) FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES arm-mingw32ce-g++ arm-wince-mingw32ce-g++) FIND_PROGRAM(CMAKE_RC_COMPILER_INIT NAMES arm-mingw32ce-windres arm-wince-mingw32ce-windres) SET(PKG_CONFIG_EXECUTABLE "arm-mingw32ce-pkg-config") SET(WINCE TRUE) navit-0.5.0~svn5643+dfsg.1/Toolchain/i686-android.cmake000077500000000000000000000027451221777731700222470ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME GNU) set(ANDROID TRUE) set(ANDROID_API_VERSION 9 CACHE STRING "Andriod API Version") set(ANDROID_NDK_API_VERSION ${ANDROID_API_VERSION} CACHE STRING "Andriod NDK API Version") set(ANDROID_ARCH "x86" CACHE STRING "Android architecture") find_program(CMAKE_C_COMPILER NAMES i686-android-linux-gcc i686-android-linux-gcc.exe) find_program(CMAKE_CXX_COMPILER NAMES i686-android-linux-g++ i686-android-linux-g++.exe) set(PKG_CONFIG_EXECUTABLE "i686-android-pkg-config") get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} PATH) set(ANDROID_NDK "${COMPILER_PATH}/../../../../.." CACHE STRING "PATH to Andriod NDK") set(NDK_ARCH_DIR "${ANDROID_NDK}/platforms/android-${ANDROID_NDK_API_VERSION}/arch-x86") set(CMAKE_FIND_ROOT_PATH ${NDK_ARCH_DIR}) set(CMAKE_REQUIRED_FLAGS "-nostdlib -lc -ldl -lgcc -L${NDK_ARCH_DIR}/usr/lib") set(CMAKE_REQUIRED_INCLUDES "${NDK_ARCH_DIR}/usr/include") set(NAVIT_COMPILE_FLAGS "-I${NDK_ARCH_DIR}/usr/include -g -D_GNU_SOURCE -DANDROID -fno-short-enums ${CMAKE_REQUIRED_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined -Wl,-rpath,/system/lib") set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined") set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,-rpath,/data/data/org.navitproject.navit/lib") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) navit-0.5.0~svn5643+dfsg.1/Toolchain/mingw32.cmake000066400000000000000000000016101221777731700214060ustar00rootroot00000000000000SET(CMAKE_SYSTEM_NAME Windows) FIND_PROGRAM(CMAKE_C_COMPILER NAMES i686-w64-mingw32-gcc i686-mingw32-gcc i586-mingw32-gcc i386-mingw32-gcc mingw32-gcc) FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES i686-w64-mingw32-g++ i686-mingw32-g++ i586-mingw32-gcc i386-mingw32-gcc mingw32-g++) FIND_PROGRAM(CMAKE_RC_COMPILER_INIT NAMES i686-w64-mingw32-windres i686-mingw32-windres i586-mingw32-windres i386-mingw32-windres mingw32-windres windres.exe) FIND_PROGRAM(CMAKE_AR NAMES i686-w64-mingw32-ar i686-mingw32-ar i586-mingw32-ar i386-mingw32-ar mingw32-ar ar.exe) IF (NOT CMAKE_FIND_ROOT_PATH) EXECUTE_PROCESS( COMMAND ${CMAKE_C_COMPILER} -print-sysroot OUTPUT_VARIABLE CMAKE_FIND_ROOT_PATH ) ENDIF(NOT CMAKE_FIND_ROOT_PATH) set(PKG_CONFIG_EXECUTABLE "mingw32-pkg-config") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) navit-0.5.0~svn5643+dfsg.1/Toolchain/xcode-iphone-sim.cmake000066400000000000000000000005231221777731700232720ustar00rootroot00000000000000SET(USE_UIKIT 1) SET(TARGETSDK iPhoneSimulator3.2.sdk) SET(CMAKE_OSX_SYSROOT /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/${TARGETSDK} CACHE STRING "") SET(CMAKE_TRY_COMPILE_OSX_BUNDLE 1) SET(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT}) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) navit-0.5.0~svn5643+dfsg.1/Toolchain/xcode-iphone.cmake000066400000000000000000000006061221777731700225060ustar00rootroot00000000000000SET(USE_UIKIT 1) SET(TARGETSDK iPhoneOS4.3.sdk) SET(CMAKE_OSX_SYSROOT /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/${TARGETSDK} CACHE STRING "") SET(CMAKE_TRY_COMPILE_OSX_BUNDLE 1) SET(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") SET(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT}) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) navit-0.5.0~svn5643+dfsg.1/autogen.sh000077500000000000000000000006571221777731700172110ustar00rootroot00000000000000#!/bin/sh if [ `uname` = Darwin ]; then LIBTOOL=glibtool else LIBTOOL=libtool fi for pkg in pkg-config $LIBTOOL automake aclocal autoreconf:autoconf autopoint:gettext do if ! ${pkg%%:*} --version >/dev/null then echo "You need to install ${pkg##*:}" exit 1 fi done autoreconf --install -I m4 "$@" echo "***** WARNING *****" echo "Support for autotools will be removed soon from navit, please use cmake instead" sleep 5 navit-0.5.0~svn5643+dfsg.1/cmake/000077500000000000000000000000001221777731700162605ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/cmake/FindDBus.cmake000066400000000000000000000011041221777731700207140ustar00rootroot00000000000000include(LibFindMacros) libfind_pkg_check_modules(DBUS_PKGCONFIG dbus-1) FIND_PATH(DBus_INCLUDE_DIR dbus/dbus.h PATHS ${DBUS_PKGCONFIG_INCLUDE_DIRS} /usr/include/dbus-1.0 # PATH_SUFFIXES dbus ) FIND_PATH(DBus_INCLUDE_DIR_ARCH dbus/dbus-arch-deps.h PATHS ${DBUS_PKGCONFIG_INCLUDE_DIRS} /usr/lib/dbus-1.0/include # PATH_SUFFIXES dbus ) FIND_LIBRARY(DBus_LIBRARY NAMES dbus-1 PATHS ${DBUS_PKGCONFIG_LIBRARY_DIRS} ) set(DBus_PROCESS_INCLUDES DBus_INCLUDE_DIR DBus_INCLUDE_DIR_ARCH) set(DBus_PROCESS_LIBS DBus_LIBRARY) libfind_process(DBus) navit-0.5.0~svn5643+dfsg.1/cmake/FindDBusGLib.cmake000066400000000000000000000010141221777731700214520ustar00rootroot00000000000000FIND_PACKAGE(DBus) include(LibFindMacros) libfind_pkg_check_modules(DBUS_GLIB_PKGCONFIG dbus-glib-1) FIND_PATH(DBusGLib_INCLUDE_DIR dbus/dbus-glib.h PATHS ${DBUS_GLIB_PKGCONFIG_INCLUDE_DIRS} /usr/include/dbus-1.0 # PATH_SUFFIXES dbus ) FIND_LIBRARY(DBusGLib_LIBRARY NAMES dbus-glib-1 PATHS ${DBUS_GLIB_PKGCONFIG_LIBRARY_DIRS} ) set(DBusGLib_PROCESS_INCLUDES DBusGLib_INCLUDE_DIR DBus_INCLUDE_DIRS) set(DBusGLib_PROCESS_LIBS DBusGLib_LIBRARY DBus_LIBRARIES) libfind_process(DBusGLib) navit-0.5.0~svn5643+dfsg.1/cmake/FindGTK2.cmake000066400000000000000000000316101221777731700205730ustar00rootroot00000000000000# - Try to find GTK2 # Once done this will define # # GTK2_FOUND - System has Boost # GTK2_INCLUDE_DIRS - GTK2 include directory # GTK2_LIBRARIES - Link these to use GTK2 # GTK2_LIBRARY_DIRS - The path to where the GTK2 library files are. # GTK2_DEFINITIONS - Compiler switches required for using GTK2 # # Copyright (c) 2007 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # set(GTK2_DEBUG ON) macro(GTK2_DEBUG_MESSAGE _message) if (GTK2_DEBUG) message(STATUS "(DEBUG) ${_message}") endif (GTK2_DEBUG) endmacro(GTK2_DEBUG_MESSAGE _message) if (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS) # in cache already set(GTK2_FOUND TRUE) else (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS) # use pkg-config to get the directories and then use these values # in the FIND_PATH() and FIND_LIBRARY() calls include(UsePkgConfig) pkgconfig(gtk+-2.0 _GTK2IncDir _GTK2LinkDir _GTK2LinkFlags _GTK2Cflags) find_path(GTK2_GTK_INCLUDE_DIR NAMES gtk/gtk.h PATHS $ENV{GTK2_HOME} ${_GTK2IncDir} ${_GTK2IncDir}/gtk-2.0 /usr/include/gtk-2.0 /usr/local/include/gtk-2.0 /opt/include/gtk-2.0 /opt/gnome/include/gtk-2.0 /sw/include/gtk-2.0 ) gtk2_debug_message("GTK2_GTK_INCLUDE_DIR is ${GTK2_GTK_INCLUDE_DIR}") # Some Linux distributions (e.g. Red Hat) have glibconfig.h # and glib.h in different directories, so we need to look # for both. # - Atanas Georgiev pkgconfig(glib-2.0 _GLIB2IncDir _GLIB2LinkDir _GLIB2LinkFlags _GLIB2Cflags) pkgconfig(gmodule-2.0 _GMODULE2IncDir _GMODULE2LinkDir _GMODULE2LinkFlags _GMODULE2Cflags) find_path(GTK2_GLIBCONFIG_INCLUDE_DIR NAMES glibconfig.h PATHS ${_GLIB2IncDir} ${_GMODULE2IncDir} ${_GMODULE2IncDir}/glib-2.0 ${_GLIB2LinkDir}/glib-2.0/include /opt/gnome/lib64/glib-2.0/include /opt/gnome/lib/glib-2.0/include /opt/lib/glib-2.0/include /usr/lib64/glib-2.0/include /usr/lib/glib-2.0/include /sw/lib/glib-2.0/include ) gtk2_debug_message("GTK2_GLIBCONFIG_INCLUDE_DIR is ${GTK2_GLIBCONFIG_INCLUDE_DIR}") find_path(GTK2_GLIB_INCLUDE_DIR NAMES glib.h PATHS ${_GLIB2IncDir} ${_GLIB2IncDir}/glib-2.0 ${_GMODULE2IncDir} /opt/include/glib-2.0 /opt/gnome/include/glib-2.0 /usr/include/glib-2.0 /sw/include/glib-2.0 ) gtk2_debug_message("GTK2_GLIB_INCLUDE_DIR is ${GTK2_GLIB_INCLUDE_DIR}") pkgconfig(gdk-2.0 _GDK2IncDir _GDK2LinkDir _GDK2LinkFlags _GDK2Cflags) find_path(GTK2_GDK_INCLUDE_DIR NAMES gdkconfig.h PATHS ${_GDK2IncDir} ${_GDK2IncDir}/gtk-2.0 ${_GDK2LinkDir}/gtk-2.0/include /opt/gnome/lib/gtk-2.0/include /opt/gnome/lib64/gtk-2.0/include /opt/lib/gtk-2.0/include /usr/lib/gtk-2.0/include /usr/lib64/gtk-2.0/include /sw/lib/gtk-2.0/include ) gtk2_debug_message("GTK2_GDK_INCLUDE_DIR is ${GTK2_GDK_INCLUDE_DIR}") find_path(GTK2_GTKGL_INCLUDE_DIR NAMES gtkgl/gtkglarea.h PATHS ${_GLIB2IncDir} /usr/include /usr/local/include /usr/openwin/share/include /opt/gnome/include /opt/include /sw/include ) gtk2_debug_message("GTK2_GTKGL_INCLUDE_DIR is ${GTK2_GTKGL_INCLUDE_DIR}") pkgconfig(pango _PANGOIncDir _PANGOLinkDir _PANGOLinkFlags _PANGOCflags) find_path(GTK2_PANGO_INCLUDE_DIR NAMES pango/pango.h PATHS ${_PANGOIncDir} ${_PANGOIncDir}/pango-1.0/ /usr/include/pango-1.0 /opt/gnome/include/pango-1.0 /opt/include/pango-1.0 /sw/include/pango-1.0 ) gtk2_debug_message("GTK2_PANGO_INCLUDE_DIR is ${GTK2_PANGO_INCLUDE_DIR}") pkgconfig(cairo _CAIROIncDir _CAIROLinkDir _CAIROLinkFlags _CAIROCflags) find_path(GTK2_CAIRO_INCLUDE_DIR NAMES cairo.h PATHS ${_CAIROIncDir} ${_CAIROIncDir}/cairo /opt/gnome/include/cairo /usr/include /usr/include/cairo /opt/include /opt/include/cairo /sw/include /sw/include/cairo ) gtk2_debug_message("GTK2_CAIRO_INCLUDE_DIR is ${GTK2_CAIRO_INCLUDE_DIR}") pkgconfig(gdk-pixbuf-2.0 _GDKPIXBUFIncDir _GDKPIXBUFLinkDir _GDKPIXBUFLinkFlags _GDKPIXBUFCflags) find_path(GTK2_GDKPIXBUF_INCLUDE_DIR NAMES gdk-pixbuf/gdk-pixbuf.h PATHS ${_GDKPIXBUFIncDir} ${_GDKPIXBUFIncDir}/gdk-pixbuf-2.0 /opt/gnome/include/cairo /usr/include /usr/include/cairo /opt/include /opt/include/cairo /sw/include /sw/include/cairo /sw/include/gdk-pixbuf-2.0 ) gtk2_debug_message("GTK2_CAIRO_INCLUDE_DIR is ${GTK2_CAIRO_INCLUDE_DIR}") pkgconfig(atk _ATKIncDir _ATKLinkDir _ATKLinkFlags _ATKCflags) find_path(GTK2_ATK_INCLUDE_DIR NAMES atk/atk.h PATHS ${_ATKIncDir} ${_ATKIncDir}/atk-1.0 /opt/gnome/include/atk-1.0 /usr/include/atk-1.0 /opt/include/atk-1.0 /sw/include/atk-1.0 ) gtk2_debug_message("GTK2_ATK_INCLUDE_DIR is ${GTK2_ATK_INCLUDE_DIR}") if (UNIX) find_library(GTK2_GTK_LIBRARY NAMES gtk-x11-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTK_LIBRARY is ${GTK2_GTK_LIBRARY}") find_library(GTK2_GDK_LIBRARY NAMES gdk-x11-2.0 PATHS ${_GDK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GDK_LIBRARY is ${GTK2_GDK_LIBRARY}") endif(UNIX) if (WIN32) find_library(GTK2_GTK_LIBRARY NAMES gtk-win32-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTK_LIBRARY is ${GTK2_GTK_LIBRARY}") find_library(GTK2_GDK_LIBRARY NAMES gdk-win32-2.0 PATHS ${_GDK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) endif (WIN32) find_library(GTK2_GDK_PIXBUF_LIBRARY NAMES gdk_pixbuf-2.0 PATHS ${_GDK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GDK_PIXBUF_LIBRARY is ${GTK2_GDK_PIXBUF_LIBRARY}") find_library(GTK2_GMODULE_LIBRARY NAMES gmodule-2.0 PATHS ${_GMODULE2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GMODULE_LIBRARY is ${GTK2_GMODULE_LIBRARY}") find_library(GTK2_GTHREAD_LIBRARY NAMES gthread-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTHREAD_LIBRARY is ${GTK2_GTHREAD_LIBRARY}") find_library(GTK2_GOBJECT_LIBRARY NAMES gobject-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GOBJECT_LIBRARY is ${GTK2_GOBJECT_LIBRARY}") find_library(GTK2_GLIB_LIBRARY NAMES glib-2.0 PATHS ${_GLIB2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GLIB_LIBRARY is ${GTK2_GLIB_LIBRARY}") find_library(GTK2_GTKGL_LIBRARY NAMES gtkgl PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTKGL_LIBRARY is ${GTK2_GTKGL_LIBRARY}") find_library(GTK2_PANGO_LIBRARY NAMES pango-1.0 PATHS ${_PANGOLinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_PANGO_LIBRARY is ${GTK2_PANGO_LIBRARY}") find_library(GTK2_CAIRO_LIBRARY NAMES pangocairo-1.0 PATHS ${_CAIROLinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_PANGO_LIBRARY is ${GTK2_CAIRO_LIBRARY}") find_library(GTK2_ATK_LIBRARY NAMES atk-1.0 PATHS ${_ATKinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_ATK_LIBRARY is ${GTK2_ATK_LIBRARY}") set(GTK2_INCLUDE_DIRS ${GTK2_GTK_INCLUDE_DIR} ${GTK2_GLIBCONFIG_INCLUDE_DIR} ${GTK2_GLIB_INCLUDE_DIR} ${GTK2_GDK_INCLUDE_DIR} ${GTK2_PANGO_INCLUDE_DIR} ${GTK2_CAIRO_INCLUDE_DIR} ${GTK2_ATK_INCLUDE_DIR} ) if(GTK2_GDKPIXBUF_INCLUDE_DIR) set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIRS} ${GTK2_GDKPIXBUF_INCLUDE_DIR}) endif(GTK2_GDKPIXBUF_INCLUDE_DIR) if (GTK2_GTK_LIBRARY AND GTK2_GTK_INCLUDE_DIR) if (GTK2_GDK_LIBRARY AND GTK2_GDK_PIXBUF_LIBRARY AND GTK2_GDK_INCLUDE_DIR) if (GTK2_GMODULE_LIBRARY) if (GTK2_GTHREAD_LIBRARY) if (GTK2_GOBJECT_LIBRARY) if (GTK2_PANGO_LIBRARY AND GTK2_PANGO_INCLUDE_DIR) if (GTK2_CAIRO_LIBRARY AND GTK2_CAIRO_INCLUDE_DIR) if (GTK2_ATK_LIBRARY AND GTK2_ATK_INCLUDE_DIR) # set GTK2 libraries set (GTK2_LIBRARIES ${GTK2_GTK_LIBRARY} ${GTK2_GDK_LIBRARY} ${GTK2_GDK_PIXBUF_LIBRARY} ${GTK2_GMODULE_LIBRARY} ${GTK2_GTHREAD_LIBRARY} ${GTK2_GOBJECT_LIBRARY} ${GTK2_PANGO_LIBRARY} ${GTK2_CAIRO_LIBRARY} ${GTK2_ATK_LIBRARY} ) # check for gtkgl support if (GTK2_GTKGL_LIBRARY AND GTK2_GTKGL_INCLUDE_DIR) set(GTK2_GTKGL_FOUND TRUE) # set(GTK2_INCLUDE_DIRS # ${GTK2_INCLUDE_DIRS} # ${GTK2_GTKGL_INCLUDE_DIR} # ) # set(GTK2_LIBRARIES # ${GTK2_LIBRARIES} # ${GTK2_GTKGL_LIBRARY} # ) endif (GTK2_GTKGL_LIBRARY AND GTK2_GTKGL_INCLUDE_DIR) else (GTK2_ATK_LIBRARY AND GTK2_ATK_INCLUDE_DIR) endif (GTK2_ATK_LIBRARY AND GTK2_ATK_INCLUDE_DIR) else (GTK2_CAIRO_LIBRARY AND GTK2_CAIRO_INCLUDE_DIR) endif (GTK2_CAIRO_LIBRARY AND GTK2_CAIRO_INCLUDE_DIR) else (GTK2_PANGO_LIBRARY AND GTK2_PANGO_INCLUDE_DIR) endif (GTK2_PANGO_LIBRARY AND GTK2_PANGO_INCLUDE_DIR) else (GTK2_GOBJECT_LIBRARY) endif (GTK2_GOBJECT_LIBRARY) else (GTK2_GTHREAD_LIBRARY) endif (GTK2_GTHREAD_LIBRARY) else (GTK2_GMODULE_LIBRARY) endif (GTK2_GMODULE_LIBRARY) else (GTK2_GDK_LIBRARY AND GTK2_GDK_PIXBUF_LIBRARY AND GTK2_GDK_INCLUDE_DIR) endif (GTK2_GDK_LIBRARY AND GTK2_GDK_PIXBUF_LIBRARY AND GTK2_GDK_INCLUDE_DIR) else (GTK2_GTK_LIBRARY AND GTK2_GTK_INCLUDE_DIR) endif (GTK2_GTK_LIBRARY AND GTK2_GTK_INCLUDE_DIR) if (GTK2_INCLUDE_DIRS AND GTK2_LIBRARIES) set(GTK2_FOUND TRUE) endif (GTK2_INCLUDE_DIRS AND GTK2_LIBRARIES) if (GTK2_FOUND) if (NOT GTK2_FIND_QUIETLY) message(STATUS "Found GTK2: ${GTK2_LIBRARIES}") endif (NOT GTK2_FIND_QUIETLY) else (GTK2_FOUND) if (GTK2_FIND_REQUIRED) message(FATAL_ERROR "Could not find GTK2") endif (GTK2_FIND_REQUIRED) endif (GTK2_FOUND) # show the GTK2_INCLUDE_DIRS and GTK2_LIBRARIES variables only in the advanced view mark_as_advanced(GTK2_INCLUDE_DIRS GTK2_LIBRARIES) endif (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS) navit-0.5.0~svn5643+dfsg.1/cmake/FindGlib.cmake000066400000000000000000000021141221777731700207360ustar00rootroot00000000000000# - Try to find Glib-2.0 (with gobject) # Once done, this will define # # Glib_FOUND - system has Glib # Glib_INCLUDE_DIRS - the Glib include directories # Glib_LIBRARIES - link these to use Glib include(LibFindMacros) # Use pkg-config to get hints about paths libfind_pkg_check_modules(Glib_PKGCONF glib-2.0) # Main include dir find_path(Glib_INCLUDE_DIR NAMES glib.h PATHS ${Glib_PKGCONF_INCLUDE_DIRS} /sw/include PATH_SUFFIXES glib-2.0 ) # Glib-related libraries also use a separate config header, which is in lib dir find_path(GlibConfig_INCLUDE_DIR NAMES glibconfig.h PATHS ${Glib_PKGCONF_INCLUDE_DIRS} /usr /sw PATH_SUFFIXES lib/glib-2.0/include ) # Finally the library itself find_library(Glib_LIBRARY NAMES glib-2.0 PATHS ${Glib_PKGCONF_LIBRARY_DIRS} /sw/lib ) # Set the include dir variables and the libraries and let libfind_process do the rest. # NOTE: Singular variables for this library, plural for libraries this this lib depends on. set(Glib_PROCESS_INCLUDES Glib_INCLUDE_DIR GlibConfig_INCLUDE_DIR) set(Glib_PROCESS_LIBS Glib_LIBRARY) libfind_process(Glib) navit-0.5.0~svn5643+dfsg.1/cmake/FindGmodule.cmake000066400000000000000000000015051221777731700214600ustar00rootroot00000000000000# - Try to find Glib-2.0 (with gobject) # Once done, this will define # # Glib_FOUND - system has Glib # Glib_INCLUDE_DIRS - the Glib include directories # Glib_LIBRARIES - link these to use Glib include(LibFindMacros) libfind_pkg_check_modules(Gmodule_PKGCONF gmodule-2.0) # Main include dir find_path(Gmodule_INCLUDE_DIR NAMES gmodule.h PATHS ${Gmodule_PKGCONF_INCLUDE_DIRS} PATH_SUFFIXES gmodule-2.0 ) # Finally the modulerary itself find_library(Gmodule_LIBRARY NAMES gmodule-2.0 PATHS ${Gmodule_PKGCONF_LIBRARY_DIRS} ) # Set the include dir variables and the libraries and let libfind_process do the rest. # NOTE: Singular variables for this library, plural for libraries this this lib depends on. set(Gmodule_PROCESS_INCLUDES Gmodule_INCLUDE_DIR) set(Gmodule_PROCESS_LIBS Gmodule_LIBRARY) libfind_process(Gmodule) navit-0.5.0~svn5643+dfsg.1/cmake/FindXGettextGlade.cmake000066400000000000000000000004411221777731700225730ustar00rootroot00000000000000find_package(Gettext) FIND_PROGRAM(XGETTEXT xgettext) if (XGETTEXT) execute_process(COMMAND echo "" COMMAND xgettext -L glade - RESULT_VARIABLE GETTEXT_RET) if ("${GETTEXT_RET}" STREQUAL "0") set(XGETTEXT_GLADE TRUE) else() set(XGETTEXT_GLADE FALSE) endif() endif(XGETTEXT) navit-0.5.0~svn5643+dfsg.1/cmake/LibFindMacros.cmake000066400000000000000000000100421221777731700217330ustar00rootroot00000000000000# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments # used for the current package. For this to work, the first parameter must be the # prefix of the current package, then the prefix of the new package etc, which are # passed to find_package. macro (libfind_package PREFIX) set (LIBFIND_PACKAGE_ARGS ${ARGN}) if (${PREFIX}_FIND_QUIETLY) set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) endif (${PREFIX}_FIND_QUIETLY) if (${PREFIX}_FIND_REQUIRED) set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) endif (${PREFIX}_FIND_REQUIRED) find_package(${LIBFIND_PACKAGE_ARGS}) endmacro (libfind_package) # CMake developers made the UsePkgConfig system deprecated in the same release (2.6) # where they added pkg_check_modules. Consequently I need to support both in my scripts # to avoid those deprecated warnings. Here's a helper that does just that. # Works identically to pkg_check_modules, except that no checks are needed prior to use. macro (libfind_pkg_check_modules PREFIX PKGNAME) if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) include(UsePkgConfig) pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(${PREFIX} ${PKGNAME}) endif (PKG_CONFIG_FOUND) endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) endmacro (libfind_pkg_check_modules) # Do the final processing once the paths have been detected. # If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain # all the variables, each of which contain one include directory. # Ditto for ${PREFIX}_PROCESS_LIBS and library files. # Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. # Also handles errors in case library detection was required, etc. macro (libfind_process PREFIX) # Skip processing if already processed during this run if (NOT ${PREFIX}_FOUND) # Start with the assumption that the library was found set (${PREFIX}_FOUND TRUE) # Process all includes and set _FOUND to false if any are missing foreach (i ${${PREFIX}_PROCESS_INCLUDES}) if (${i}) set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) mark_as_advanced(${i}) else (${i}) set (${PREFIX}_FOUND FALSE) endif (${i}) endforeach (i) # Process all libraries and set _FOUND to false if any are missing foreach (i ${${PREFIX}_PROCESS_LIBS}) if (${i}) set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) mark_as_advanced(${i}) else (${i}) set (${PREFIX}_FOUND FALSE) endif (${i}) endforeach (i) # Print message and/or exit on fatal error if (${PREFIX}_FOUND) if (NOT ${PREFIX}_FIND_QUIETLY) message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") endif (NOT ${PREFIX}_FIND_QUIETLY) else (${PREFIX}_FOUND) if (${PREFIX}_FIND_REQUIRED) foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) message("${i}=${${i}}") endforeach (i) message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.") endif (${PREFIX}_FIND_REQUIRED) endif (${PREFIX}_FOUND) endif (NOT ${PREFIX}_FOUND) endmacro (libfind_process) macro(libfind_library PREFIX basename) set(TMP "") if(MSVC80) set(TMP -vc80) endif(MSVC80) if(MSVC90) set(TMP -vc90) endif(MSVC90) set(${PREFIX}_LIBNAMES ${basename}${TMP}) if(${ARGC} GREATER 2) set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) endif(${ARGC} GREATER 2) find_library(${PREFIX}_LIBRARY NAMES ${${PREFIX}_LIBNAMES} PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} ) endmacro(libfind_library) navit-0.5.0~svn5643+dfsg.1/cmake/build.xml000066400000000000000000000003131221777731700200760ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/cmake/copy_files.cmake000066400000000000000000000007761221777731700214300ustar00rootroot00000000000000message("Copy '${GLOB_EXP}' to '${DST}'") file(GLOB SRC_FILES ${GLOB_EXP}) if ( SRC_FILES ) foreach (FILE ${SRC_FILES}) if ( LOWER ) get_filename_component(FILEN_NAME ${FILE} NAME) string(TOLOWER ${FILEN_NAME} FILEN_NAME_LOWER) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST}/${FILEN_NAME_LOWER}) else() execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST}/) endif( LOWER ) endforeach() endif() navit-0.5.0~svn5643+dfsg.1/cmake/navit_download.cmake000066400000000000000000000006061221777731700222740ustar00rootroot00000000000000message("Downloading ${URL}") file(DOWNLOAD ${URL} ${DST} SHOW_PROGRESS STATUS DOWNLOAD_STATUS) list(GET DOWNLOAD_STATUS 0 DOWNLOAD_ERR) list(GET DOWNLOAD_STATUS 1 DOWNLOAD_MSG) if(DOWNLOAD_ERR) file(REMOVE ${DST}) message(SEND_ERROR "Download of sample map from ${URL} failed: " "${DOWNLOAD_MSG}\n" "To disable the sample map, run cmake with -DSAMPLE_MAP=n .") endif(DOWNLOAD_ERR) navit-0.5.0~svn5643+dfsg.1/cmake/navit_macros.cmake000066400000000000000000000073221221777731700217530ustar00rootroot00000000000000macro(set_feature_switch_default VARIABLE REASON ENABLE) if ((NOT DEFINED ${VARIABLE}) # variable not in cache (first run) OR ((DEFINED ${VARIABLE}_AUTODETECTED_VALUE) AND # variable in cache -> different from autodetected value? ((${VARIABLE}_AUTODETECTED_VALUE AND ${VARIABLE}) OR # poor man's boolean equal (NOT ${VARIABLE}_AUTODETECTED_VALUE AND NOT ${VARIABLE})))) set(${VARIABLE}_REASON ${REASON}) set(${VARIABLE} ${ENABLE} CACHE BOOL "feature switch" FORCE) else() set(${VARIABLE}_REASON "User defined") endif() set(${VARIABLE}_AUTODETECTED_VALUE ${ENABLE} CACHE INTERNAL "value autodetected by build script") endmacro() macro(set_with_reason VARIABLE REASON ENABLE) if (DEFINED ${VARIABLE}_REASON AND NOT ${VARIABLE}_REASON STREQUAL "User defined") set(${VARIABLE} ${ENABLE} CACHE BOOL "feature switch" FORCE) set(${VARIABLE}_REASON ${REASON}) string(REPLACE "/" "_" VARIABLE_NAMES ${VARIABLE}) set(${VARIABLE_NAMES}_LIBS ${ARGN}) endif() set(${VARIABLE}_AUTODETECTED_VALUE ${ENABLE} CACHE INTERNAL "value autodetected by build script") endmacro() macro(add_feature FEATURE REASON ENABLE) list(APPEND ALL_FEATURES ${FEATURE}) set_feature_switch_default(${FEATURE} ${REASON} ${ENABLE}) endmacro() macro(cfg_feature FEATURE REASON ENABLE) set(${FEATURE} ${ENABLE}) if (${FEATURE}_REASON STREQUAL "User defined") set(${FEATURE}_REASON "${REASON} *user setting overridden*") else() set(${FEATURE}_REASON ${REASON}) endif() endmacro() macro(add_module MODULE_PATH REASON ENABLE) list(APPEND ALL_MODULES ${MODULE_PATH}) set_feature_switch_default(${MODULE_PATH} ${REASON} ${ENABLE}) endmacro() # plugins are always linked static macro(add_plugin PLUGIN_PATH REASON ENABLE) list(APPEND ALL_PLUGINS ${PLUGIN_PATH}) set_feature_switch_default(${PLUGIN_PATH} ${REASON} ${ENABLE}) endmacro() # module plugins are always linked static macro(add_module_plugin PLUGIN_PATH REASON ENABLE) list(APPEND ALL_MODULE_PLUGINS ${PLUGIN_PATH}) set_feature_switch_default(${PLUGIN_PATH} ${REASON} ${ENABLE}) endmacro() macro(module_add_library MODULE_NAME ) LINK_DIRECTORIES(${${MODULE_NAME}_LIBRARY_DIRS}) add_library(${MODULE_NAME} ${MODULE_BUILD_TYPE} ${ARGN}) SET_TARGET_PROPERTIES(${MODULE_NAME} PROPERTIES COMPILE_DEFINITIONS "MODULE=${MODULE_NAME}") TARGET_LINK_LIBRARIES(${MODULE_NAME} ${${MODULE_NAME}_LIBS}) SET_TARGET_PROPERTIES( ${MODULE_NAME} PROPERTIES COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS} ${${MODULE_NAME}_FLAGS}") INCLUDE_DIRECTORIES(${${MODULE_NAME}_INCLUDES}) if (USE_PLUGINS) if (ANDROID) TARGET_LINK_LIBRARIES(${MODULE_NAME} ${NAVIT_LIBNAME}) endif() if (APPLE) set_target_properties( ${MODULE_NAME} PROPERTIES LINK_FLAGS "-Wl,-undefined -Wl,dynamic_lookup") endif() # workaround to be compatible with old paths set_target_properties( ${MODULE_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.libs") install(TARGETS ${MODULE_NAME} DESTINATION ${LIB_DIR}/navit/${${MODULE_NAME}_TYPE} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) endif() endmacro(module_add_library) macro(supportlib_add_library LIB_NAME ) add_library(${LIB_NAME} ${ARGN}) TARGET_LINK_LIBRARIES(${LIB_NAME} ${${LIB_NAME}_LIBS}) SET_TARGET_PROPERTIES( ${LIB_NAME} PROPERTIES COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS}") SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_DEFINITIONS "MODULE=${LIB_NAME}") endmacro(supportlib_add_library) macro(message_error) set(NAVIT_DEPENDENCY_ERROR 1) message( SEND_ERROR ${ARGN}) endmacro(message_error) navit-0.5.0~svn5643+dfsg.1/cmake/navit_po_version.cmake000066400000000000000000000003171221777731700226470ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) string(REGEX REPLACE "\"Project-Id-Version: [^\"]*\"" "\"Project-Id-Version: ${PACKAGE_STRING}\\\\n\"" OUTPUT_LINES "${OUTPUT_LINES}") file(WRITE "${DST}" "${OUTPUT_LINES}") navit-0.5.0~svn5643+dfsg.1/cmake/navit_writemapxml.cmake000066400000000000000000000001511221777731700230310ustar00rootroot00000000000000message("${TEXT}") file(WRITE ${DST} "\n") navit-0.5.0~svn5643+dfsg.1/cmake/navit_xml_parser.cmake000066400000000000000000000004101221777731700226320ustar00rootroot00000000000000file(STRINGS "${SRC}" TEXT_LINES REGEX "_\\(") file(WRITE ${DST} "// Strings from navit_shipped.xml\n") foreach (LINE ${TEXT_LINES}) string(REGEX REPLACE ".*(_\\(\"[^\"]*\"\\)).*" "\\1\n" OUTPUT_LINE ${LINE}) file(APPEND ${DST} ${OUTPUT_LINE}) endforeach() navit-0.5.0~svn5643+dfsg.1/cmake/navit_xml_parser_glade.cmake000066400000000000000000000007541221777731700240010ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) if (PREFIX) set(OUTPUT_LINES "" "${OUTPUT_LINES}") endif() string(REGEX REPLACE "vehicleprofile" "atkaction" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "name=" "description=" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "...CDATA" " " OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "\\]\\]" "" OUTPUT_LINES "${OUTPUT_LINES}") if (SUFFIX) set(OUTPUT_LINES "${OUTPUT_LINES}" "") endif() file(WRITE ${DST} ${OUTPUT_LINES}) navit-0.5.0~svn5643+dfsg.1/cmake/recolor.cmake000066400000000000000000000005161221777731700207310ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) string(REGEX REPLACE "fill:#111111" "fill:${BGCOLOR}" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "fill:#ffffff" "fill:${FGCOLOR}" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "stroke:#ffffff" "stroke:${FGCOLOR}" OUTPUT_LINES "${OUTPUT_LINES}") file(WRITE "${DST}" "${OUTPUT_LINES}") navit-0.5.0~svn5643+dfsg.1/cmake/replace.cmake000066400000000000000000000002231221777731700206720ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) string(REGEX REPLACE "${MATCHES}" "${REPLACE}" OUTPUT_LINES "${OUTPUT_LINES}") file(WRITE ${DST} ${OUTPUT_LINES}) navit-0.5.0~svn5643+dfsg.1/cmake/strings_xml_parser.cmake000066400000000000000000000007441221777731700232140ustar00rootroot00000000000000file(STRINGS "${SRC}" TEXT_LINES REGEX "]+>(.*).*" "\\1" MSGID ${LINE}) string(REGEX REPLACE "\\\\'" "'" MSGID ${MSGID}) string(REGEX REPLACE ".*]+name=\"([^>\"]+)\">.*.*" "\\1" RESID ${LINE}) file(APPEND ${DST} "// Android resource: @strings/${RESID}\n_(\"${MSGID}\")\n") endforeach() navit-0.5.0~svn5643+dfsg.1/cmake/test.xml000066400000000000000000000001411221777731700177550ustar00rootroot00000000000000 ]> navit-0.5.0~svn5643+dfsg.1/cmake/test.xslt000066400000000000000000000002211221777731700201460ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/cmake/version.cmake000066400000000000000000000017771221777731700207630ustar00rootroot00000000000000FIND_PROGRAM(GIT_EXECUTABLE NAMES git git.exe DOC "git command line client") get_filename_component(SOURCE_DIR ${SRC} PATH) EXECUTE_PROCESS( COMMAND ${GIT_EXECUTABLE} svn info COMMAND grep "Revision" WORKING_DIRECTORY "${SOURCE_DIR}" OUTPUT_VARIABLE VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) if (NOT DEFINED ${NAME}) set( ${NAME} "unknown" ) endif() if (NOT VERSION) FIND_PACKAGE(Subversion) if (Subversion_FOUND) EXECUTE_PROCESS( COMMAND svnversion WORKING_DIRECTORY "${SOURCE_DIR}" OUTPUT_VARIABLE VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) endif(Subversion_FOUND) if (VERSION AND (NOT ${VERSION} MATCHES "^exported")) if (STRIP_M) string(REGEX REPLACE "M$" "" VERSION ${VERSION}) endif() set( ${NAME} ${VERSION} ) endif() else() string(REGEX REPLACE "Revision: " "" ${NAME} ${VERSION}) endif(NOT VERSION) set(NAVIT_VARIANT "-") message (STATUS "SVN-version ${${NAME}}") CONFIGURE_FILE(${SRC} ${DST} @ONLY) navit-0.5.0~svn5643+dfsg.1/config.h.cmake000066400000000000000000000034011221777731700176730ustar00rootroot00000000000000#cmakedefine USE_NATIVE_LANGUAGE_SUPPORT 1 #cmakedefine HAVE_MALLOC_H 1 #cmakedefine HAVE_SYS_MOUNT_H 1 #cmakedefine HAVE_STDINT_H 1 #cmakedefine HAVE_API_ANDROID 1 #cmakedefine HAVE_API_WIN32_BASE 1 #cmakedefine HAVE_API_WIN32 1 #cmakedefine HAVE_API_WIN32_CE 1 #cmakedefine HAVE_GLIB 1 #cmakedefine HAVE_GMODULE 1 #cmakedefine HAVE_GETCWD 1 #define CACHE_SIZE ${CACHE_SIZE} #cmakedefine AVOID_FLOAT 1 #cmakedefine AVOID_UNALIGNED 1 #cmakedefine USE_LIBGNUINTL 1 #cmakedefine HAVE_BYTESWAP_H 1 /* Versions */ #cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" #cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" #cmakedefine PACKAGE "@PACKAGE@" #cmakedefine LOCALEDIR "@LOCALEDIR@" #cmakedefine HAVE_LIBCRYPTO 1 #cmakedefine HAVE_ZLIB 1 #cmakedefine USE_ROUTING 1 #cmakedefine HAVE_GTK2 1 #cmakedefine HAVE_FONTCONFIG 1 #cmakedefine USE_PLUGINS 1 #cmakedefine SDL_TTF 1 #cmakedefine SDL_IMAGE 1 #cmakedefine HAVE_QT_SVG 1 #cmakedefine HAVE_UNISTD_H 1 #cmakedefine DBUS_USE_SYSTEM_BUS 1 #cmakedefine HAVE_SOCKET 1 #cmakedefine HAVE_SNPRINTF 1 #cmakedefine HAVE_DECL__SNPRINTF 1 #cmakedefine HAVE_WINSOCK 1 #cmakedefine HAVE_MEMALIGN 1 #cmakedefine HAVE_POSIX_MEMALIGN 1 #cmakedefine HAVE_VALLOC 1 #cmakedefine HAVE_LC_MESSAGES 1 #cmakedefine HAVE_SYS_TIME_H 1 #cmakedefine HAVE_POPEN 1 #cmakedefine HAVE_GETOPT_H 1 #cmakedefine HAVE_GETTIMEOFDAY 1 #cmakedefine HAVE__ATOI64 1 #cmakedefine HAVE_STRING_H 1 #cmakedefine EZXML_NOMMAP 0 #cmakedefine HAVE_STPCPY 1 #cmakedefine HAVE_SBRK 1 #cmakedefine HAVE_PRAGMA_PACK 1 #cmakedefine HAVE_GETDELIM 1 #cmakedefine HAVE_GETLINE 1 #cmakedefine HAVE_FSYNC 1 #cmakedefine HAVE_ENDIAN_H 1 #cmakedefine HAVE_FREEIMAGE 1 #cmakedefine USE_OPENGLES 1 #cmakedefine USE_OPENGLES2 1 #cmakedefine HAVE_SHMEM 1 #cmakedefine HAVE_IMLIB2 1 navit-0.5.0~svn5643+dfsg.1/configure.in000066400000000000000000001464431221777731700175250ustar00rootroot00000000000000AC_INIT(navit, 0.5.0) AC_CONFIG_MACRO_DIR([m4]) SOURCE_MODE=svn AM_INIT_AUTOMAKE AM_CONFIG_HEADER(config.h) AC_SUBST(SOURCE_MODE) AM_CONDITIONAL(SOURCE_MODE_SVN, [test "x${SOURCE_MODE}" = "xsvn"]) if test "x${SOURCE_MODE}" = "xsvn" ; then USE_MAINTAINER_MODE=yes else USE_MAINTAINER_MODE=no fi AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is enabled by default (reason of inclusion of this function) AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) AM_MAINTAINER_MODE plugins=yes; plugins_reason=default postgresql=yes; postgresql_reason=default samplemap=yes; samplemap_reason=default binding_dbus=yes; binding_dbus_reason=default binding_dbus_use_system_bus=no binding_python=yes; binding_python_reason=default binding_win32=no; binding_win32_reason=default font_freetype=yes; font_freetype_reason=default fontconfig=yes; fontconfig_reason=default fribidi=yes; fribidi_reason=default gui_gtk=no; gui_gtk_reason=default gui_win32=no; gui_win32_reason=default gui_internal=yes; gui_internal_reason=default gui_qml=no; gui_qml_reason=default graphics=yes; graphics_reason=default graphics_gd=no; graphics_gd_reason=default graphics_gtk_drawing_area=no; graphics_gtk_drawing_area_reason=default graphics_qt_qpainter=yes; graphics_qt_qpainter_reason=default graphics_null=yes; graphics_null_reason=default graphics_opengl=yes; graphics_opengl_reason=default graphics_sdl=yes; graphics_sdl_reason=default graphics_win32=no; graphics_win32_reason=default maptool=yes; maptool_reason=default map_binfile=yes; map_binfile_reason=default map_filter=yes; map_filter_reason=default map_mg=yes; map_mg_reason=default map_shapefile=yes; map_shapefile_reason=default map_textfile=yes; map_textfile_reason=default map_csv=yes; map_csv_reason=default osd_core=yes; osd_core_reason=default plugin_pedestrian=no; plugin_pedestrian_reason=default routing=yes; routing_reason=default speech_android=no; speech_android_reason=default speech_cmdline=yes; speech_cmdline_reason=default speech_dbus=no; speech_dbus_reason=default speech_espeak=no; speech_espeak_reason=default speech_speech_dispatcher=yes; speech_speech_dispatcher_reason=default vehicle_demo=yes; vehicle_demo_reason=default vehicle_file=yes; vehicle_file_reason=default vehicle_gpsd=yes; vehicle_gpsd_reason=default vehicle_gpsd_dbus=no; vehicle_gpsd_dbus_reason=default vehicle_gypsy=yes; vehicle_gypsy_reason=default vehicle_null=no; vehicle_null_reason=default vehicle_wince=no; vehicle_wince_reason=default vehicle_iphone=no; vehicle_iphone_reason=default vehicle_android=no; vehicle_android_reason=default graphics_android=no; graphics_android_reason=default vehicle_maemo=no; vehicle_maemo_reason=default vehicle_webos=no; vehicle_webos_reason=default shared_libnavit=no LIBNAVIT=navit bin_navit=yes AC_CANONICAL_HOST win32=no win32ce=no case $host_os in wince|mingw32ce|cegcc) win32=yes win32ce=yes AC_DEFINE(HAVE_API_WIN32_BASE, 1, [Have Windows Base API]) AC_DEFINE(HAVE_API_WIN32_CE, 1, [Have Windows CE API]) AC_DEFINE(HAVE_PRAGMA_PACK, 1, [Have pragma pack]) binding_win32=yes; binding_win32_reason="host_os is wince" gui_win32=yes; gui_win32_reason="host_os is wince" graphics_win32=yes; graphics_win32_reason="host_os is wince" vehicle_wince=yes; vehcile_wince_reason="host_os is wince" speech_espeak=yes; speech_espeak_reason="host_os is wince" support_libpng=yes maptool=no; maptool_reason="host_os is wince" ;; mingw32) win32=yes AC_DEFINE(HAVE_API_WIN32_BASE, 1, [Have Windows Base API]) AC_DEFINE(HAVE_API_WIN32, 1, [Have Windows API]) binding_win32=yes; binding_win32_reason="host_os is mingw32" gui_win32=yes; gui_win32_reason="host_os is mingw32" graphics_win32=yes; graphics_win32_reason="host_os is mingw32" speech_espeak=yes; speech_espeak_reason="host_os is mingw32" support_libpng=yes ;; linux*_android) android=yes shared_libnavit=yes bin_navit=no AC_DEFINE(HAVE_API_ANDROID, 1, [Have Android API]) echo "void dl_unwind_find_exidx(void) {}" >crt0.c $CC -c crt0.c $AR r libg.a crt0.o vehicle_android=yes; vehicle_android_reason="host_os is android" graphics_android=yes; graphics_android_reason="host_os is android" speech_android=yes; speech_android_reason="host_os is android" MODULE_LDFLAGS="-module -Xcompiler -nostdlib -Xcompiler -Wl,-rpath -Xcompiler -Wl,/data/data/org.navitproject.navit/lib" MODULE_LIBADD="-llog" LIBNAVIT=_data_data_org.navitproject.navit_lib_navit NAVIT_MODULE_LDFLAGS="$MODULE_LDFLAGS -L\$(top_builddir)/navit -l$LIBNAVIT" ;; esac if test "x$win32" = "xyes" then NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/win32" NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/win32 -lsupport_win32" NAVIT_SOCKET_LDFLAGS="$MODULE_LDFLAGS -lws2_32" fi AM_CONDITIONAL(SUPPORT_WIN32, [test "x$win32" = "xyes"]) AM_CONDITIONAL(SUPPORT_WIN32CE, [test "x$win32ce" = "xyes"]) AM_CONDITIONAL(SUPPORT_ANDROID, [test "x$android" = "xyes"]) if test "x$support_libpng" = "xyes" then NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/libpng" NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/libpng -lsupport_libpng" fi AM_CONDITIONAL(SUPPORT_LIBPNG, [test "x$support_libpng" = "xyes"]) AC_SUBST(MODULE_LDFLAGS) AC_SUBST(MODULE_LIBADD) AC_SUBST(NAVIT_MODULE_LDFLAGS) AC_SUBST(NAVIT_SOCKET_LDFLAGS) LIBS="$LIBS -lm" if test "$win32" == "no" -a test "$host_os" != "cygwin"; then LIBS="$LIBS -rdynamic" fi m4_ifndef([AC_USE_SYSTEM_EXTENSIONS], [AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS], [AC_GNU_SOURCE])]) AC_USE_SYSTEM_EXTENSIONS m4_ifdef([AC_PROG_OBJC],[AC_PROG_OBJC]) AC_PROG_CC m4_ifdef([AC_PROG_OBJC],[AC_PROG_OBJC],[AC_SUBST([OBJC],["$CC"]) AC_SUBST([OBJCFLAGS],["$CFLAGS"])]) m4_ifndef([AC_PROG_OBJC],[_AM_DEPENDENCIES(OBJC)]) if eval "test x`uname` = xDarwin"; then CFLAGS="$CFLAGS -I/opt/local/include -L/opt/local/lib" fi if eval "test x$GCC = xyes"; then CFLAGS="$CFLAGS -Wall -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" fi AM_PROG_CC_C_O AC_PROG_CXX if eval "test x$GXX = xyes"; then CXXFLAGS="$CXXFLAGS -Wall -Wcast-align -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" fi PKG_CHECK_EXISTS if test "x${cross_compiling}" = "xyes"; then samplemap="no";samplemap_reason="not supported for cross compiling" binding_python="no";binding_python_reason="not supported for cross compiling" postgresql="no";postgresql_reason="not supported for cross compiling" AC_MSG_CHECKING([for a C compiler for build tools]) AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc) else CC_FOR_BUILD=$CC fi CCLD_FOR_BUILD="$CC_FOR_BUILD" AC_SUBST(cross_compiling) AM_CONDITIONAL(CROSS_COMPILING, test "x${cross_compiling}" = "xyes") AC_SUBST(CC_FOR_BUILD) AC_SUBST(CCLD_FOR_BUILD) # Endianness # defines WORDS_BIGENDIAN for big-endian systems AC_C_BIGENDIAN AC_ARG_ENABLE(variant, [ --enable-variant=something set variant], NAVIT_VARIANT=$enableval) AC_SUBST(NAVIT_VARIANT) AC_ARG_ENABLE(cache-size, [ --enable-cache-size=size in bytes set cache size], AC_DEFINE_UNQUOTED(CACHE_SIZE,[${enableval}], [Size of Cache in Bytes]),AC_DEFINE(CACHE_SIZE,[1048576], [Size of Cache in Bytes])) AC_ARG_ENABLE(avoid-unaligned, [ --enable-avoid-unaligned avoid unaligned accesses], AVOID_UNALIGNED=$enableval, AVOID_UNALIGNED=no) test x"${AVOID_UNALIGNED}" = xyes && AC_DEFINE(AVOID_UNALIGNED,[],Define to avoid unaligned access) AC_ARG_ENABLE(avoid-float, [ --enable-avoid-float avoid floating point calculations], AVOID_FLOAT=$enableval, AVOID_FLOAT=no) test x"${AVOID_FLOAT}" = xyes && AC_DEFINE(AVOID_FLOAT,[],Define to avoid floating point) AC_ARG_ENABLE(transformation-roll, [ --enable-transformation-roll add support for specifying roll angle in transformation], ENABLE_ROLL=$enableval, ENABLE_ROLL=no) test x"${ENABLE_ROLL}" = xyes && AC_DEFINE(ENABLE_ROLL,[],Define to add support for specifying roll angle in transformation) AC_ARG_ENABLE(hildon, [ --disable-hildon build without maemo/hildon support], enable_hildon=$enableval, enable_hildon=yes) if test "x${enable_hildon}" = "xyes" ; then PKG_CHECK_MODULES(HILDON, hildon-1 >= 0.9.9, , [ AC_MSG_RESULT(no) enable_hildon=no ]) PKG_CHECK_MODULES(GPSBT, gpsbt, [ AC_DEFINE(HAVE_GPSBT, 1, [Have the gpsbt library]) AC_SUBST(GPSBT_CFLAGS) AC_SUBST(GPSBT_LIBS) ], [ AC_MSG_RESULT(no) ]) if test x"${enable_hildon}" = xyes ; then AC_DEFINE(USE_HILDON, 1, [Build with maemo/hildon support]) AC_SUBST(HILDON_CFLAGS) AC_SUBST(HILDON_LIBS) fi fi AM_CONDITIONAL(USE_HILDON, test "${enable_hildon}" = "xyes") AC_ARG_ENABLE(osso, [ --disable-osso build without maemo/osso support], enable_osso=$enableval, enable_osso=yes) if test "x${enable_osso}" = "xyes" ; then PKG_CHECK_MODULES(LIBOSSO, libosso, , [ AC_MSG_RESULT(no) enable_osso=no ]) if test x"${enable_osso}" = xyes ; then AC_DEFINE(USE_OSSO, 1, [Build with maemo/osso support]) AC_SUBST(LIBOSSO_CFLAGS) AC_SUBST(LIBOSSO_LIBS) fi fi echo ${enable_osso} AM_CONDITIONAL(USE_OSSO, test "x${enable_osso}" = "xyes") AC_ARG_ENABLE(garmin, [ --disable-garmin disable garmin support], USE_GARMIN=$enableval, USE_GARMIN=yes) # samplemap AC_PATH_PROG(_PATH_BZCAT,[bzcat]) if test "x${_PATH_BZCAT}" = "x" ; then samplemap=no; samplemap_reason="bzcat missing" fi AC_ARG_ENABLE(maptool, [ --disable-maptool don't build maptool], maptool=$enableval;maptool_reason="configure parameter") AM_CONDITIONAL(MAPTOOL, [test "x$maptool" = "xyes"]) if test "x$maptool" != "xyes"; then samplemap=no; samplemap_reason="maptool disabled" fi AC_ARG_ENABLE(samplemap, [ --disable-samplemap don't build the samplemap], samplemap=$enableval;samplemap_reason="configure parameter") AM_CONDITIONAL(BUILD_SAMPLEMAP, [test "x$samplemap" = "xyes"]) AC_ARG_ENABLE(fastmath, [ --disable-fastmath don't build with fastmath], fastmath=$enableval, fastmath=yes) AM_CONDITIONAL(FASTMATH, [test "x$fastmath" = "xyes"]) if test x"$fastmath" = xyes; then if eval "test x$GCC = xyes"; then CFLAGS="$CFLAGS -ffast-math" fi fi X_CFLAGS="-I$x_includes" AS_IF([test -n "$ac_x_libraries"], [X_LIBS="-L$ac_x_libraries"]) # glib AC_ARG_ENABLE(glib, [ --disable-glib don't build with external glib], glib=$enableval, glib=yes) if test "x${glib}" = "xyes" -a "x${GLIB_CFLAGS}" = "x" -a "x${GLIB_LIBS}" = "x"; then PKG_CHECK_MODULES(GLIB, [glib-2.0 gthread-2.0], [glib=yes],[glib=no]) fi if test "x${glib}" = "xyes"; then AC_DEFINE(HAVE_GLIB, 1, [Define to 1 if you have (external) glib library]) else GLIB_CFLAGS="-I\$(top_srcdir)/navit/support -I\$(top_srcdir)/navit/support/glib -I\$(top_srcdir)/navit/support/ezxml" GLIB_LIBS="-L\$(top_builddir)/navit/support/glib -lsupport_glib -L\$(top_builddir)/navit/support/ezxml -lsupport_ezxml" if test "x${win32}" != "xyes" -a "x${android}" != "xyes"; then GLIB_LIBS="$GLIB_LIBS -lpthread" fi fi # gmodule AC_ARG_ENABLE(gmodule, [ --disable-gmodule don't build with gmodule], gmodule=$enableval, gmodule=yes) if test x"${gmodule}" = "xyes"; then PKG_CHECK_MODULES(GMODULE, [gmodule-2.0], [gmodule=yes], [gmodule=no]) fi if test "x${gmodule}" = "xyes"; then AC_DEFINE(HAVE_GMODULE, 1, [Define to 1 if you have gmodule]) else AC_CHECK_LIB(dl, dlopen, [plugins_reason="default, via dlopen";GMODULE_LIBS="-ldl";AC_DEFINE(HAVE_DLOPEN, 1, [Define to 1 if you have dlopen])], [plugins="no"; plugins_reason="package gmodule and dlopen missing"] ) fi # libcrypto AC_CHECK_LIB(crypto, AES_encrypt, [CRYPTO_LIBS="-lcrypto";AC_DEFINE(HAVE_LIBCRYPTO, 1, [Define to 1 if you have libcrypto])]) AC_SUBST(CRYPTO_LIBS) # plugins AC_ARG_ENABLE(plugins, [ --disable-plugins disable plugins], [ plugins=$enableval;plugin_reason="configure parameter" ]) AC_ARG_ENABLE(shared-libnavit, [ --enable-shared-libnavit], [ shared_libnavit=$enableval]) if test "x${plugins}" = "xyes"; then AC_ENABLE_SHARED AC_DISABLE_STATIC AC_DEFINE( [USE_PLUGINS], [], Define to 1 if you have plugins. ) if test "x${win32}" = "xyes"; then shared_libnavit=yes NAVIT_MODULE_LDFLAGS="-no-undefined -L\$(top_builddir)/navit -l$LIBNAVIT -L\$(top_builddir)/intl -lintl" fi else if test "x${shared_libnavit}" = "xyes"; then AC_ENABLE_SHARED AC_DISABLE_STATIC else AC_DISABLE_SHARED AC_ENABLE_STATIC fi fi AM_CONDITIONAL(PLUGINS, [test "x$plugins" = "xyes"]) AM_CONDITIONAL(SHARED_LIBNAVIT, [test "x$shared_libnavit" = "xyes"]) AM_CONDITIONAL(BIN_NAVIT, [test "x$bin_navit" = "xyes"]) AC_PROG_LIBTOOL AC_SUBST(LIBNAVIT) AM_CONDITIONAL(EVENT_GLIB, [test "x$glib" = "xyes"]) AM_CONDITIONAL(SUPPORT_GLIB, [test "x$glib" = "xno"]) AM_CONDITIONAL(SUPPORT_EZXML, [test "x$glib" = "xno"]) AC_CHECK_HEADER([sys/time.h], [AC_DEFINE( [HAVE_SYS_TIME_H], [1], [Define to 1 if you have the header file.]) ]) if test "x${ZLIB_CFLAGS}" = "x" -a "x${ZLIB_LIBS}" = "x"; then AC_CHECK_HEADER( zlib.h, AC_DEFINE( [HAVE_ZLIB], [], Define to 1 if you have the header file. ) ZLIB_LIBS="-lz" zlib=yes, ZLIB_CFLAGS="-I\$(top_srcdir)/navit/support/zlib" ZLIB_LIBS="-L\$(top_builddir)/navit/support/zlib -lsupport_zlib" zlib=no ) else zlib=yes fi AM_CONDITIONAL(SUPPORT_ZLIB, [test "x$zlib" = "xno"]) AC_SUBST(ZLIB_CFLAGS) AC_SUBST(ZLIB_LIBS) AC_CHECK_HEADER(sys/socket.h, AC_DEFINE([HAVE_SOCKET],[],Define to 1 if you have sockets)) AC_CHECK_HEADER(winsock2.h, AC_DEFINE([HAVE_WINSOCK],[],Define to 1 if you have Windows sockets)) # gtk PKG_CHECK_MODULES(GTK2, [gtk+-2.0], [gtk2_pkgconfig=yes], [gtk2_pkgconfig=no]) if test "x$gtk2_pkgconfig" = "xyes"; then AC_DEFINE(HAVE_GTK2, 1, [Define to 1 if you have gtk2]) graphics_gtk_drawing_area=yes; graphics_gtk_drawing_area_reason="gtk+-2.0 present" gui_gtk=yes; gui_gtk_reason="gtk+-2.0 present" fi # fsync AC_MSG_CHECKING(for fsync) AC_TRY_LINK([#include ], [fsync(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FSYNC, 1, [Define to 1 if you have the `fsync' function.]),AC_MSG_RESULT(no)) # system AC_MSG_CHECKING(for system) AC_TRY_LINK([#include ], [system("/bin/true");],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_SYSTEM, 1, [Define to 1 if you have the `system' function.]),speech_cmdline=no; speech_cmdline_reason="not supported without system()"; AC_MSG_RESULT(no)) AC_MSG_CHECKING(for CreateProcess) AC_TRY_LINK([#include ], [CreateProcess(NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_CREATEPROCESS, 1, [Define to 1 if you have the `CreateProcess' function.]) speech_cmdline=yes; speech_cmdline_reason="CreateProcess exists", AC_MSG_RESULT(no)) # sbrk AC_MSG_CHECKING(for sbrk) AC_TRY_LINK([#include ], [sbrk(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_SBRK, 1, [Define to 1 if you have the `sbrk' function.]),AC_MSG_RESULT(no)) AC_ARG_ENABLE(graphics-sdl, [ --disable-graphics-sdl don't create graphics sdl], graphics_sdl=$enableval;graphics_sdl_reason="configure parameter") if test "x${graphics_sdl}" = "xyes" ; then PKG_CHECK_MODULES(SDL, [sdl], [graphics_sdl="yes" graphics_sdl_reason="sdl present"] , [graphics_sdl="no" graphics_sdl_reason="sdl not available"] ) AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) fi if test "x${graphics_sdl}" = "xyes" ; then save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$SDL_CFLAGS $CPPFLAGS" AC_CHECK_HEADER(SDL_image.h,SDL_IMAGE_LIBS=-lSDL_image,graphics_sdl="no";graphics_sdl_reason="SDL_image.h missing") AC_SUBST(SDL_IMAGE_LIBS) CPPFLAGS=$save_CPPFLAGS fi if test "x${graphics_sdl}" = "xyes" ; then AC_DEFINE(GRAPHICS_SDL, 1, [Build with graphics sdl]) fi AM_CONDITIONAL(GRAPHICS_SDL, test "x${graphics_sdl}" = "xyes") AC_ARG_ENABLE(postgresql, [ --disable-postgresql don't add postgresql support to maptool], postgresql=$enableval;postgresql_reason="configure parameter") if test "x${postgresql}" = "xyes" ; then if test -z "$PG_CONFIG"; then AC_PATH_PROG([PG_CONFIG], [pg_config], []) fi AC_MSG_CHECKING([for PostgreSQL libraries with $PG_CONFIG]) if test ! -x "$PG_CONFIG"; then if test "x${PG_CONFIG}" = "x" ; then postgresql_reason="$PG_CONFIG not executable" else postgresql_reason="pg_config missing" fi postgresql=no AC_MSG_RESULT([no]) else POSTGRESQL_CFLAGS="-I`$PG_CONFIG --includedir`" POSTGRESQL_LIBS="-L`$PG_CONFIG --libdir` -lpq" AC_DEFINE(HAVE_POSTGRESQL, 1, [Postgresql libraries available]) AC_SUBST(POSTGRESQL_CFLAGS) AC_SUBST(POSTGRESQL_LIBS) AC_MSG_RESULT([yes]) fi fi AM_CONDITIONAL(HAVE_POSTGRESQL, test "x${postgresql}" = "xyes") # font # freetype AC_ARG_ENABLE(font-freetype, [ --disable-font-freetype don't add freetype support], font_freetype=$enableval;font_freetype_reason="configure parameter") if test "x${font_freetype}" = "xyes" -a "x${FREETYPE2_CFLAGS}" = "x" -a "x${FREETYPE2_LIBS}" = "x"; then PKG_CHECK_MODULES(FREETYPE2, [freetype2], , [font_freetype=no;font_freetype_reason="Package freetype2 missing"]) else fribidi=no fi AC_SUBST(FREETYPE2_CFLAGS) AC_SUBST(FREETYPE2_LIBS) AM_CONDITIONAL(FONT_FREETYPE, test "x${font_freetype}" = "xyes") AC_ARG_WITH(freetype-fonts, [ --with-freetype-fonts specify what fonts to use], AC_DEFINE_UNQUOTED(FREETYPE_FONTS,[${withval}],[Freetype fonts to use])) AC_ARG_ENABLE(fontconfig, [ --disable-fontconfig don't' add fontconfig support], fontconfig=$enableval;fontconfig_reason="configure parameter") if test "x${fontconfig}" = "xyes"; then PKG_CHECK_MODULES(FONTCONFIG, [fontconfig], [fontconfig=yes], [fontconfig=no]) fi if test "x$fontconfig" = "xyes"; then AC_DEFINE(HAVE_FONTCONFIG, 1, [Define to 1 if you have fontconfig]) fi AC_SUBST(FONTCONFIG_CFLAGS) AC_SUBST(FONTCONFIG_LIBS) AM_CONDITIONAL(FONTS, test "x${font_freetype}" = "xyes" -a "x$fontconfig" != "xyes") # fribidi AC_ARG_ENABLE(fribidi, [ --disable-fribidi dont build with fribidi], fribidi=$enableval;fribidi_reason="configure parameter", fribidi=yes) if test x"${fribidi}" = "xyes"; then PKG_CHECK_MODULES(FRIBIDI2, [fribidi >= 0.19.0], [fribidi=yes;oldfribidi=no], [ PKG_CHECK_MODULES([FRIBIDI], [fribidi], [fribidi=yes;oldfribidi=yes;fribid_reason="using old version"], [fribidi=no;fribidi_reason="FriBidi library not found"]) ]) fi if test x"${fribidi}" = "xyes"; then AC_DEFINE(USE_FRIBIDI, 1, [Build with fribidi support]) fi if test x"${oldfribidi}" = "xyes"; then AC_DEFINE(FRIBIDIOLD, 1, [Build with fribidi support for older versions of fribidi]) fi AC_SUBST(FRIBIDI2_CFLAGS) AC_SUBST(FRIBIDI2_LIBS) AC_SUBST(FRIBIDI_CFLAGS) AC_SUBST(FRIBIDI_LIBS) PKG_CHECK_MODULES(IMLIB2, [imlib2], [imlib2_pkgconfig=yes], [imlib2_pkgconfig=no]) if test "x$imlib2_pkgconfig" = "xyes"; then AC_DEFINE(HAVE_IMLIB2, 1, [Define to 1 if you have imlib2]) fi AC_SUBST(IMLIB2_CFLAGS) AC_SUBST(IMLIB2_LIBS) AC_ARG_ENABLE(graphics-opengl, [ --disable-graphics-opengl disable graphics type OpenGL], graphics_opengl=$enableval;graphics_opengl_reason="configure parameter") if test "x${graphics_opengl}" = "xyes" ; then AC_CHECK_HEADER( GL/gl.h, AC_DEFINE( [HAVE_OPENGL], [], Define to 1 if you have the header file. ) OPENGL_LIBS="$X_LIBS -lGL -lglut -lfreeimage" opengl=yes, AC_MSG_WARN([*** no GL/gl.h -- opengl graphics support disabled];graphics_opengl=no;graphics_opengl_reason="GL/gl.h header missing") ) AC_CHECK_HEADER( GL/glut.h, AC_DEFINE( [HAVE_GLUT], [], Define to 1 if you have the header file. ) glut=yes, AC_MSG_WARN([*** no GL/glut.h -- opengl graphics support disabled]);graphics_opengl=no;graphics_opengl_reason="GL/glut.h header missing" ) AC_CHECK_HEADER( GL/freeglut.h, AC_DEFINE( [HAVE_FREEGLUT], [], Define to 1 if you have the header file. ) freeglut=yes, AC_MSG_WARN([*** no GL/freeglut.h -- opengl support disabled]);graphics_opengl=no;graphics_opengl_reason="Headers missing" ) AC_SUBST(OPENGL_CFLAGS) AC_SUBST(OPENGL_LIBS) AC_CHECK_HEADER( GL/glc.h, AC_DEFINE( [HAVE_GLC], [], Define to 1 if you have the header file. ) GLC_LIBS="-lGLC" glc=yes, AC_MSG_WARN([*** no GL/glc.h -- opengl graphics support disabled]);graphics_opengl=no;graphics_opengl_reason="GL/glc.h header missing" ) AC_CHECK_HEADER( FreeImage.h, AC_DEFINE( [HAVE_FREEIMAGE], [1], Define to 1 if you have the header file. ) FREEIMAGE_LIBS="-lfreeimage" freeimage=yes, AC_MSG_WARN([*** no FreeImage.h -- opengl support disabled]);graphics_opengl=no;graphics_opengl_reason="Headers missing" ) AC_SUBST(FREEIMAGE_LIBS) AC_SUBST(GLC_CFLAGS) AC_SUBST(GLC_LIBS) fi AM_CONDITIONAL(GRAPHICS_OPENGL, [test "x$glut" = "xyes" -a "x$freeglut" = "xyes" -a "x$opengl" = "xyes" -a "x$freeimage" = "xyes" -a "x$glc" = "xyes" ]) system_shapefile=no if test x"${map_shapefile}" = xyes then AC_CHECK_HEADERS( [shapefil.h libshp/shapefil.h], [AC_DEFINE( [HAVE_SYS_SHAPEFILELIB], [1], Define to 1 if you have the header file. )], [SHAPEFILE_CFLAGS="-I\$(top_srcdir)/navit/support/shapefile"] ) AC_CHECK_LIB( [shp], [DBFDeleteField], [SHAPEFILE_LIBS="-lshp" system_shapefile=yes], [SHAPEFILE_LIBS="-L\$(top_builddir)/navit/support/shapefile -lsupport_shapefile" system_shapefile=no] ) if test x"${system_shapefile}" = xno then AC_MSG_WARN([*** The shapefile library(libshp) from the system is to old or not found! -- using included copy]) fi fi AC_SUBST(SHAPEFILE_CFLAGS) AC_SUBST(SHAPEFILE_LIBS) AM_CONDITIONAL(HAVE_SYSTEM_SHAPEFILELIB, [test "x$system_shapefile" = "xyes" ]) if test x"${USE_GARMIN}" = xyes then # check for libgarmin PKG_CHECK_MODULES(LIBGARMIN, libgarmin, use_libgarmin=yes, use_libgarmin=no) AC_SUBST(LIBGARMIN_CFLAGS) AC_SUBST(LIBGARMIN_LIBS) fi AM_CONDITIONAL(HAVELIBGARMIN, [test "x$use_libgarmin" = "xyes"]) ## binding # python AC_ARG_ENABLE(binding-python, [ --disable-binding-python don't create binding python], binding_python=$enableval;binding_python_reason="configure parameter") if test "x${binding_python}" = "xyes"; then AC_PATH_PROG(_PATH_PYTHON,[python]) dnl Libraries and flags for embedded Python. dnl FIXME: I wish there was a less icky way to get this. if test "x${_PATH_PYTHON}" != "x" ; then AC_MSG_CHECKING(for Python linkage) AC_PATH_PROG([PYTHONCONFIG], [python-config], []) if test "x${PYTHONCONFIG}" = "x" ; then py_prefix=`$_PATH_PYTHON -c 'import sys; print sys.prefix'` py_ver=`$_PATH_PYTHON -c 'import sys; print sys.version[[:3]]'` py_lib=`$_PATH_PYTHON -c 'import sys; print sys.lib'` py_libdir="${py_prefix}/${py_lib}/python${py_ver}" PYTHON_CFLAGS="-I${py_prefix}/include/python${py_ver}" if test -f $py_libdir/config/Makefile -a -f $py_prefix/include/python${py_ver}/Python.h; then py_libs=`grep '^LIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_libc=`grep '^LIBC=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_libm=`grep '^LIBM=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_liblocalmod=`grep '^LOCALMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_libbasemod=`grep '^BASEMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` PYTHON_LIBS="-L$py_libdir/config $py_libs $py_libc $py_libm -lpython$py_ver $py_liblocalmod $py_libbasemod" PYTHON_LIBS=`echo $PYTHON_LIBS | sed -e 's/[ \\t]*/ /g'` AC_MSG_RESULT($py_libdir) else binding_python="no" binding_python_reason="$py_libdir/config/Makefile or $py_prefix/include/python${py_ver}/Python.h missing" fi else PYTHON_CFLAGS="`${PYTHONCONFIG} --cflags`" PYTHON_LIBS="`${PYTHONCONFIG} --ldflags`" fi else binding_python="no" binding_python_reason="python executable missing" fi fi if test "x${binding_python}" = xyes ; then AC_DEFINE(USE_BINDING_PYTHON, 1, [Build with binding python]) fi AC_SUBST(PYTHON_CFLAGS) AC_SUBST(PYTHON_LIBS) AM_CONDITIONAL(BINDING_PYTHON, test "x${binding_python}" = "xyes") # dbus AC_ARG_ENABLE(binding-dbus, [ --disable-binding-dbus don't create binding dbus], binding_dbus=$enableval;binding_dbus_reason="configure parameter") AC_ARG_ENABLE(binding-dbus-use-system-bus, [ --enable-binding-dbus-use-system-bus use system bus for dbus binding], binding_dbus_use_system_bus=$enableval) if test "x${binding_dbus}" = "xyes" ; then PKG_CHECK_MODULES(DBUS, [dbus-glib-1], ,binding_dbus=no) fi if test "x${binding_dbus}" = "xyes" ; then AC_DEFINE(USE_BINDING_DBUS, 1, [Build with binding dbus]) vehicle_gpsd_dbus="yes" vehicle_gpsd_dbus_reason="dbus binding present" speech_dbus="yes" speech_dbus_reason="dbus binding present" fi if test "x${binding_dbus_use_system_bus}" = "xyes" ; then AC_DEFINE(DBUS_USE_SYSTEM_BUS, 1, [Use system bus instead of session bus for binding dbus]) fi AC_SUBST(DBUS_CFLAGS) AC_SUBST(DBUS_LIBS) AM_CONDITIONAL(BINDING_DBUS, test "x${binding_dbus}" = "xyes") AM_CONDITIONAL(VEHICLE_GPSD_DBUS, test "x${vehicle_gpsd_dbus}" = "xyes") AM_CONDITIONAL(SPEECH_DBUS, test "x${speech_dbus}" = "xyes") AC_ARG_WITH(dbus-service-dir, [ --with-dbus-service-dir specify where the dbus service dir resides], DBUS_SERVICE_DIR=$withval, DBUS_SERVICE_DIR="$datarootdir/dbus-1/services") AC_SUBST(DBUS_SERVICE_DIR) # win32 binding AC_ARG_ENABLE(binding-win32, [ --disable-binding-win32 don't create binding win32], binding_win32=$enableval;binding_win32_reason="configure parameter") if test "x${binding_win32}" = "xyes" ; then AC_DEFINE(USE_BINDING_WIN32, 1, [Build with binding win32]) fi AM_CONDITIONAL(BINDING_WIN32, test "x${binding_win32}" = "xyes") # svg AC_ARG_ENABLE(svg, [ --disable-svg disable Scalable Vector Graphics], enable_svg=$enableval, enable_svg=yes) AC_ARG_ENABLE(svg2png, [ --disable-svg2png disable conversion of svgs to pngs], enable_svg2png=$enableval, enable_svg2png=yes) AC_ARG_ENABLE(svg2png-scaling, [ --enable-svg2png-scaling enable conversion of svgs to pngs with specified sizes], SVG2PNG_SCALES=$enableval, SVG2PNG_SCALES="8 16 32 48 96") AC_ARG_ENABLE(svg2png-scaling-flag, [ --enable-svg2png-scaling-flag enable conversion of flag svgs to pngs with specified sizes], SVG2PNG_SCALES_FLAG=$enableval, SVG2PNG_SCALES_FLAG="8 16 32 48 96") AC_ARG_ENABLE(svg2png-scaling-nav, [ --enable-svg2png-scaling-nav enable conversion of nav svgs to pngs with specified sizes], SVG2PNG_SCALES_NAV=$enableval, SVG2PNG_SCALES_NAV="8 16 32 48 96") AC_ARG_WITH(svg2png-use-convert, [ --with-svg2png-use-convert use imagemagick's convert for png creation], SVG2PNG_CONVERTER="convert") AC_ARG_WITH(svg2png-use-rsvg-convert, [ --with-svg2png-use-rsvg-convert use librsvg's rsvg-convert for png creation], SVG2PNG_CONVERTER="rsvg-convert") AC_ARG_WITH(svg2png-use-inkscape, [ --with-svg2png-use-inkscape use inkscapes internal convert routines for png creation], SVG2PNG_CONVERTER="inkscape") AC_ARG_WITH(svg2png-use-ksvgtopng4, [ --with-svg2png-use-ksvgtopng4 use kde4's ksvgtopng4 for png creation], SVG2PNG_CONVERTER="ksvgtopng4") AC_ARG_WITH(svg2png-use-ksvgtopng, [ --with-svg2png-use-ksvgtopng use kde3's convert for png creation], SVG2PNG_CONVERTER="ksvgtopng") if test "x${enable_svg2png}" = "xyes" ; then if test "x${SVG2PNG_CONVERTER}" = "x"; then SVG2PNG_CONVERTER="rsvg-convert ksvgtopng ksvgtopng4 inkscape convert" fi AC_PATH_PROGS([SVG2PNG], ${SVG2PNG_CONVERTER}, [none]) if test "x${SVG2PNG}" = "xnone"; then enable_svg2png="no" fi fi AC_SUBST(SVG2PNG) AC_SUBST(SVG2PNG_SCALES) AC_SUBST(SVG2PNG_SCALES_FLAG) AC_SUBST(SVG2PNG_SCALES_NAV) AM_CONDITIONAL(USE_SVG2PNG_SCALES, test "x${SVG2PNG_SCALES}" != "xyes" -a "x${SVG2PNG_SCALES}" != "x") AM_CONDITIONAL(USE_SVG2PNG_SCALES_FLAG, test "x${SVG2PNG_SCALES_FLAG}" != "xyes" -a "x${SVG2PNG_SCALES_FLAG}" != "x") AM_CONDITIONAL(USE_SVG2PNG_SCALES_NAV, test "x${SVG2PNG_SCALES_NAV}" != "xyes" -a "x${SVG2PNG_SCALES_NAV}" != "x") AM_CONDITIONAL(USE_SVG2PNG, test "x${enable_svg2png}" = "xyes") AM_CONDITIONAL(USE_SVG, test "x${enable_svg}" = "xyes") # XSLTS AC_ARG_WITH(xslts, [ --with-xslts enable processing of navit.xml with given xslt scripts], XSLTS=$withval, XSLTS="") AC_SUBST(XSLTS) AC_ARG_WITH(saxon, [ --with-saxon specify the saxon xslt processor], SAXON=$withval, SAXON="saxon") AC_SUBST(SAXON) # Android Permissions AC_ARG_WITH(android-permissions, [ --with-android-permissions Set additional android permissions], ANDROID_PERMISSIONS=$withval, ANDROID_PERMISSIONS="") AC_SUBST(ANDROID_PERMISSIONS) # Android Project AC_ARG_WITH(android-project, [ --with-android-project Set android project], ANDROID_PROJECT=$withval, ANDROID_PROJECT="3") AC_SUBST(ANDROID_PROJECT) # NLS AC_ARG_ENABLE(nls, [ --disable-nls disable Native Language Support ( gettext/libintl )], enable_nls=$enableval, enable_nls=yes) INTLIBS="" MOFILES="" POFILES="" POIFILES="" LINGUAS="" xgettext_glade=no if test "x$enable_nls" = "xyes"; then AC_CHECK_FUNC(gettext, [HAVEGETTEXT="yes"],[INTLIBS="-lintl" HAVEGETTEXT="yes"]) AC_CHECK_PROG(XGETTEXT, xgettext, xgettext) AC_CHECK_PROG(MSGMERGE, msgmerge, msgmerge) AC_CHECK_PROG(MSGFMT, msgfmt, msgfmt) if test "$XGETTEXT" != ""; then if $XGETTEXT --help 2>&1 | grep illegal >/dev/null ; then echo "xgettext isn't GNU version" XGETTEXT="" else if echo '' | $XGETTEXT -L Glade - ; then xgettext_glade=yes fi fi fi if test "$XGETTEXT" != "" ; then PO="" if test "$LINGUAS" = ""; then ling=` (cd $srcdir/po; /bin/ls *.po.in) ` for l in $ling; do lcode=`basename $l .po.in` LINGUAS="$LINGUAS$lcode " done fi AC_DEFINE(USE_NATIVE_LANGUAGE_SUPPORT, [1], [NLS Please]) echo "xgettext and gettext() exist; will build i18n support for $LINGUAS" else LINGUAS="" PO="" echo "xgettext doesn't exist; will not build i18n support" enable_nls=no fi for lang in $LINGUAS; do MOFILES="$MOFILES $lang.mo" done for lang in $LINGUAS; do POFILES="$POFILES $lang.po" done for lang in $LINGUAS; do POIFILES="$POIFILES $lang.po.in" done AC_SUBST(INTLIBS) AC_SUBST(MOFILES) AC_SUBST(POFILES) AC_SUBST(POIFILES) AM_GNU_GETTEXT_VERSION AM_GNU_GETTEXT(no-libtool, need-ngettext, \$(top_builddir)/intl/) if test "x${shared_libnavit}" = "xyes" -a "x${win32ce}" = "xyes"; then INTLLIBS="\$(top_builddir)/intl/libintl.la" LIBINTL=$INTLLIBS LTLIBINTL=$INTLLIBS fi AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) if test x"$LIBINTL" != "x" ;then CFLAGS="$CFLAGS -I\$(top_builddir)/intl/" fi fi AM_CONDITIONAL(USE_NATIVE_LANGUAGE_SUPPORT, [test "x$enable_nls" = "xyes"]) AM_CONDITIONAL(XGETTEXT_GLADE, [test "x$xgettext_glade" = "xyes"]) AC_CHECK_HEADER( byteswap.h, AC_DEFINE( [HAVE_BYTESWAP_H], [1], [Define to 1 if you have byteswap.h], ) , ) AC_CHECK_HEADER(sys/endian.h,AC_DEFINE([USE_SYS_ENDIAN_H], [1], [Define to 1 if you have sys/endian.h],),) PACKAGE=navit AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") AC_DEFINE_UNQUOTED(VERSION, "$VERSION") AC_SUBST(PACKAGE) AC_SUBST(VERSION) AC_CHECK_HEADER(wordexp.h,wordexp_h=yes,wordexp_h=no;NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/wordexp";WORDEXP_LIBS="-L\$(top_builddir)/navit/support/wordexp -lsupport_wordexp") AM_CONDITIONAL(SUPPORT_WORDEXP, [test "x$wordexp_h" = "xno"]) support_libc=no AC_ARG_ENABLE(support_libc, [ --enable-support-libc enable builtin mini libc ], support_libc=$enableval) AM_CONDITIONAL(SUPPORT_LIBC, [test "x$support_libc" = "xyes"]) if test "x$support_libc" = "xyes"; then CFLAGS="$CFLAGS -I\$(top_srcdir)/navit/support/libc" LIBC_LIBS="-L\$(top_builddir)/navit/support/libc -lsupport_libc" fi ## graphics AC_ARG_ENABLE(graphics, [ --disable-graphics disable graphics], graphics=$enableval;graphics_reason="configure parameter") AM_CONDITIONAL(GRAPHICS, test "x${graphics}" = "xyes") if test "x$graphics" = "xyes"; then AC_DEFINE([USE_GRAPHICS],[1],Define to 1 if you want to use graphics.) fi # gd # android AC_ARG_ENABLE(graphics-android, [ --disable-graphics-android disable graphics type android], graphics_android=$enableval;graphics_android_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_ANDROID, test "x${graphics_android}" = "xyes") # gd AC_ARG_ENABLE(graphics-gd, [ --enable-graphics-gd enable graphics type gd], graphics_gd=$enableval;graphics_gd_reason="configure parameter") if test "x${graphics_gd}" = "xyes" ; then if test -z "$GDLIB_CONFIG"; then AC_PATH_PROG([GDLIB_CONFIG], [gdlib-config], []) fi AC_MSG_CHECKING([for gdlib with $GDLIB_CONFIG]) if test ! -x "$GDLIB_CONFIG"; then if test "x${GDLIB_CONFIG}" = "x" ; then graphics_gd_reason="$GDLIB_CONFIG not executable" else graphics_gd_reason="gdlib-config missing" fi graphics_gd=no AC_MSG_RESULT([no]) else if test "x${GD_CFLAGS}" = "x" ; then GD_CFLAGS="-I`$GDLIB_CONFIG --includedir`" fi if test "x${GD_LIBS}" = "x" ; then GD_LIBS="-L`$GDLIB_CONFIG --libdir` -lgd `$GDLIB_CONFIG --libs`" fi AC_SUBST(GD_CFLAGS) AC_SUBST(GD_LIBS) AC_MSG_RESULT([yes]) fi fi AM_CONDITIONAL(GRAPHICS_GD, test "x${graphics_gd}" = "xyes") AC_CHECK_HEADER( sys/shm.h, AC_DEFINE( [HAVE_SHMEM], [], Define to 1 if you have shared memory ) ) AC_CHECK_HEADER( X11/xpm.h, AC_DEFINE( [HAVE_XPM], [], Define to 1 if you have xpm header ) ) AC_CHECK_HEADER( getopt.h, AC_DEFINE( [HAVE_GETOPT_H], [], Define to 1 if you have the getopt header ) ) if test "x${graphics_gd}" = "xyes" ; then save_CPPFLAGS=$CPPFLAGS save_LIBS=$LIBS LIBS="$GD_LIBS $LIBS" CPPFLAGS="$GD_CFLAGS $CPPFLAGS" AC_TRY_LINK([#include ], [gdImageCreateFromPng(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_GRAPHICS_GD_PNG, 1, [Define to 1 if you have png support in gd.]),AC_MSG_RESULT(no)) CPPFLAGS=$save_CPPFLAGS LIBS=$save_LIBS fi # gtk_drawing_area AC_ARG_ENABLE(graphics-gtk-drawing-area, [ --disable-graphics-gtk-drawing-area disable graphics type gtk_drawing_area], graphics_gtk_drawing_area=$enableval;graphics_gtk_drawing_area_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_GTK_DRAWING_AREA, [test "x${graphics_gtk_drawing_area}" = "xyes"]) # null AC_ARG_ENABLE(graphics-null, [ --disable-graphics-null disable graphics type null], graphics_null=$enableval;graphics_null_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_NULL, test "x${graphics_null}" = "xyes") # win32 AC_ARG_ENABLE(graphics-win32, [ --disable-graphics-win32 disable graphics type win32], graphics_win32=$enableval;graphics_win32_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_WIN32, test "x${graphics_win32}" = "xyes") # qt_qpainter AC_ARG_ENABLE(graphics-qt-qpainter, [ --disable-graphics-qt-qpainter disable graphics type qt-qpainter], graphics_qt_qpainter=$enableval;graphics_qt_qpainter_reason="configure parameter") if test "x${graphics_qt_qpainter}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_GUI, [QtGui QtCore],graphics_qt_qpainter=yes,graphics_qt_qpainter=no;graphics_qt_qpainter_reason="Packages QtGui and/or QtCore missing") if test "x${graphics_qt_qpainter}" = "xno"; then PKG_CHECK_MODULES(QT_GUI, [qt-mt],graphics_qt_qpainter=yes;graphics_qt_qpainter_reason="Package qt-mt present",graphics_qt_qpainter=no) fi fi if test "x${graphics_qt_qpainter}" = "xyes" ; then PKG_CHECK_MODULES(QT_SVG, [QtSvg], have_qt_svg=yes, have_qt_svg=no) if test "x${have_qt_svg}" = "xyes"; then AC_DEFINE([HAVE_QT_SVG],[],Define to 1 if qt supports svg) fi fi if test "x${graphics_qt_qpainter}" = "xyes" ; then AC_DEFINE(USE_GRAPICS_QT_QPAINTER, 1, [Build with graphics qt_qpainter]) fi AC_SUBST(QT_GUI_CFLAGS) AC_SUBST(QT_GUI_LIBS) AC_SUBST(QT_SVG_CFLAGS) AC_SUBST(QT_SVG_LIBS) AM_CONDITIONAL(GRAPHICS_QT_QPAINTER, test "x${graphics_qt_qpainter}" = "xyes") MOC=`$PKG_CONFIG QtGui --variable=moc_location` if test "x${MOC}" = "x"; then AC_CHECK_PROG(MOC, moc, moc) fi AC_SUBST(MOC) ## map # binfile AC_ARG_ENABLE(map-binfile, [ --disable-map-binfile disable map binfile], map_binfile=$enableval;map_binfile_reason="configure parameter") AM_CONDITIONAL(MAP_BINFILE, test "x${map_binfile}" = "xyes") # filter AC_ARG_ENABLE(map-filter, [ --disable-map-filter disable map filter], map_filter=$enableval;map_filter_reason="configure parameter") AM_CONDITIONAL(MAP_FILTER, test "x${map_filter}" = "xyes") # mg AC_ARG_ENABLE(map-mg, [ --disable-map-mg disable map mg], map_mg=$enableval;map_mg_reason="configure parameter") AM_CONDITIONAL(MAP_MG, test "x${map_mg}" = "xyes") # shapefile AC_ARG_ENABLE(map-shapefile, [ --disable-map-shapefile disable map shapefile], map_shapefile=$enableval;map_shapefile_reason="configure parameter") AM_CONDITIONAL(MAP_SHAPEFILE, test "x${map_shapefile}" = "xyes") # textfile AC_ARG_ENABLE(map-textfile, [ --disable-map-textfile disable map textfile], map_textfile=$enableval;map_textfile_reason="configure parameter") AM_CONDITIONAL(MAP_TEXTFILE, test "x${map_textfile}" = "xyes") # csv AC_ARG_ENABLE(map-csv, [ --disable-map-csv disable map csv], map_csv=$enableval;map_csv_reason="configure parameter") AM_CONDITIONAL(MAP_CSV, test "x${map_csv}" = "xyes") ## osd # core AC_ARG_ENABLE(osd-core, [ --disable-osd-core disable osd core], osd_core=$enableval;osd_core_reason="configure parameter") AM_CONDITIONAL(OSD_CORE, test "x${osd_core}" = "xyes") ## gui # gtk AC_ARG_ENABLE(gui-gtk, [ --disable-gui-gtk disable gui type gtk ], gui_gtk=$enableval) AM_CONDITIONAL(GUI_GTK, [test "x${gui_gtk}" = "xyes"]) # internal AC_ARG_ENABLE(gui-internal, [ --disable-gui-internal disable gui type internal], gui_internal=$enableval;gui_internal_reason="configure parameter") AM_CONDITIONAL(GUI_INTERNAL, test "x${gui_internal}" = "xyes") # win32 AC_ARG_ENABLE(gui-win32, [ --disable-gui-win32 disable gui type win32], gui_win32=$enableval;gui_win32_reason="configure parameter") AM_CONDITIONAL(GUI_WIN32, test "x${gui_win32}" = "xyes") # qml AC_ARG_ENABLE(gui-qml, [ --disable-gui-qml disable gui type QML], gui_qml=$enableval;gui_qml_reason="configure parameter") if test "x${gui_qml}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_GUI, [QtGui QtCore], ,gui_qml=no;gui_qml_reason="Packages QtGui and/or QtCore are missing") fi if test "x${gui_qml}" = "xyes" -a "x${QT_XML_CFLAGS}" = "x" -a "x${QT_XML_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_XML, [QtXml], ,gui_qml=no;gui_qml_reason="Package QtXml is missing") fi if test "x${gui_qml}" = "xyes" -a "x${QT_DECLARATIVE_CFLAGS}" = "x" -a "x${QT_DECLARATIVE_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_DECLARATIVE, [QtDeclarative >= 4.6.0 ], ,gui_qml=no;gui_qml_reason="Packages QtDeclarative is missing") fi if test "x${gui_qml}" = "xyes" ; then AC_DEFINE(USE_GUI_QML, 1, [Build with gui qml]) fi AC_SUBST(QT_GUI_CFLAGS) AC_SUBST(QT_GUI_LIBS) AC_SUBST(QT_DECLARATIVE_CFLAGS) AC_SUBST(QT_DECLARATIVE_LIBS) AC_SUBST(QT_XML_CFLAGS) AC_SUBST(QT_XML_LIBS) AM_CONDITIONAL(GUI_QML, test "x${gui_qml}" = "xyes") ## plugins # pedestrian AC_ARG_ENABLE(plugin-pedestrian, [ --enable-plugin-pedestrian enable pedestrian plugin], plugin_pedestrian=$enableval;plugin_pedestrian_reason="configure parameter") AM_CONDITIONAL(PLUGIN_PEDESTRIAN, test "x${plugin_pedestrian}" = "xyes") ## routing AC_ARG_ENABLE(routing, [ --disable-routing disable routing], routing=$enableval;routing_reason="configure parameter") AM_CONDITIONAL(ROUTING, test "x${routing}" = "xyes") if test "x$routing" = "xyes"; then AC_DEFINE([USE_ROUTING],[1],Define to 1 if you want to have routing.) fi ## speech # android AC_ARG_ENABLE(speech-android, [ --disable-speech-android disable speech type android], speech_android=$enableval;speech_android_reason="configure parameter") AM_CONDITIONAL(SPEECH_ANDROID, test "x${speech_android}" = "xyes") # cmdline AC_ARG_ENABLE(speech-cmdline, [ --disable-speech-cmdline disable speech type cmdline], speech_cmdline=$enableval;speech_cmdline_reason="configure parameter") AM_CONDITIONAL(SPEECH_CMDLINE, test "x${speech_cmdline}" = "xyes") # espeak AC_ARG_ENABLE(speech-espeak, [ --disable-speech-espeak disable speech type espeak], speech_espeak=$enableval;speech_espeak_reason="configure parameter") AM_CONDITIONAL(SPEECH_ESPEAK, test "x${speech_espeak}" = "xyes") # speech-dispatcher AC_ARG_ENABLE(speech-speech-dispatcher, [ --disable-speech-speech-dispatcher disable speech type speech-dispatcher], speech_speech_dispatcher=$enableval;speech_speech_dispatcher_reason="configure parameter") if test "x$speech_speech_dispatcher" = "xyes"; then AC_CHECK_HEADER(libspeechd.h, AC_DEFINE([HAVE_LIBSPEECHD],[],Define to 1 if you have the header file.) SPEECHD_LIBS="-lspeechd", speech_speech_dispatcher=no; speech_speech_dispatcher_reason="libspeechd.h missing") fi AC_SUBST(SPEECHD_CFLAGS) AC_SUBST(SPEECHD_LIBS) AM_CONDITIONAL(SPEECH_SPEECH_DISPATCHER, test "x${speech_speech_dispatcher}" = "xyes") AM_CONDITIONAL(SUPPORT_ESPEAK, test "x${support_espeak}" = "xyes") ## vehicle # android AC_ARG_ENABLE(vehicle-android, [ --disable-vehicle-android disable vehicle type android], vehicle_android=$enableval;vehicle_android_reason="configure parameter") AM_CONDITIONAL(VEHICLE_ANDROID, test "x${vehicle_android}" = "xyes") # demo AC_ARG_ENABLE(vehicle-demo, [ --disable-vehicle-demo disable vehicle type demo], vehicle_demo=$enableval;vehicle_demo_reason="configure parameter") AM_CONDITIONAL(VEHICLE_DEMO, test "x${vehicle_demo}" = "xyes") # file AC_ARG_ENABLE(vehicle-file, [ --disable-vehicle-file disable vehicle type file], vehicle_file=$enableval;vehicle_file_reason="configure parameter") AM_CONDITIONAL(VEHICLE_FILE, test "x${vehicle_file}" = "xyes") # gpsd AC_ARG_ENABLE(vehicle-gpsd, [ --disable-vehicle-gpsd disable vehicle type gpsd], vehicle_gpsd=$enableval;vehicle_gpsd_reason="configure parameter") if test "x${vehicle_gpsd}" = xyes then PKG_CHECK_MODULES([GPSD], [libgps >= 3.10], ,vehicle_gpsd="no";vehicle_gpsd_reason="package libgps >=V3.1 missing") fi AC_SUBST(GPSD_CFLAGS) AC_SUBST(GPSD_LIBS) AM_CONDITIONAL(VEHICLE_GPSD, [test "x${vehicle_gpsd}" = "xyes"]) # gypsy AC_ARG_ENABLE(vehicle-gypsy,[ --disable-vehicle-gypsy disable vehicle type gypsy], vehicle_gypsy=$enableval;vehicle_gypsy_reason="configure parameter") if test "x${vehicle_gypsy}" = "xyes" then PKG_CHECK_MODULES(GYPSY, gypsy, ,vehicle_gypsy=no;vehicle_gypsy_reason="package gypsy missing") fi AC_SUBST(GYPSY_CFLAGS) AC_SUBST(GYPSY_LIBS) AM_CONDITIONAL(VEHICLE_GYPSY, test "x${vehicle_gypsy}" = "xyes") # maemo AC_ARG_ENABLE(vehicle-maemo, [ --disable-vehicle-maemo disable vehicle type maemo], vehicle_maemo=$enableval;vehicle_maemo_reason="configure parameter") if test "x${vehicle_maemo}" = "xyes" ; then PKG_CHECK_MODULES(LIBLOCATION, liblocation, [ AC_SUBST(LIBLOCATION_CFLAGS) AC_SUBST(LIBLOCATION_LIBS) ], [ AC_MSG_RESULT(no) vehicle_maemo=no vehicle_maemo_reason="no maemo location library found" ]) fi AM_CONDITIONAL(VEHICLE_MAEMO, test "x${vehicle_maemo}" = "xyes") # null AC_ARG_ENABLE(vehicle-null, [ --enable-vehicle-null enable vehicle type null], vehicle_null=$enableval;vehicle_null_reason="configure parameter") AM_CONDITIONAL(VEHICLE_NULL, test "x${vehicle_null}" = "xyes") # wince AC_ARG_ENABLE(vehicle-wince, [ --disable-vehicle-wince disable vehicle type wince], vehicle_wince=$enableval;vehicle_wince_reason="configure parameter") AM_CONDITIONAL(VEHICLE_WINCE, test "x${vehicle_wince}" = "xyes") # iphone AC_ARG_ENABLE(vehicle-iphone, [ --disable-vehicle-iphone disable vehicle type iphone], vehicle_iphone=$enableval;vehicle_iphone_reason="configure parameter") AM_CONDITIONAL(VEHICLE_IPHONE, test "x${vehicle_iphone}" = "xyes") if test "x${vehicle_iphone}" = "xyes" then IPHONE_LIBS=-Wl,-framework,CoreLocation fi AC_SUBST(IPHONE_CFLAGS) AC_SUBST(IPHONE_LIBS) # webos AC_ARG_ENABLE(vehicle-webos, [ --enable-vehicle-webos enable vehicle type webos], vehicle_webos=$enableval;vehicle_webos_reason="configure parameter") AM_CONDITIONAL(VEHICLE_WEBOS, test "x${vehicle_webos}" = "xyes") if test "x${vehicle_webos}" = "xyes" then AC_DEFINE(USE_WEBOS,[],Build with webOS support) LIBPDL_CFLAGS="$SDL_CFLAGS -I/usr/local/include" LIBPDL_LIBS="-L/usr/local/lib -lpdl" AC_SUBST(LIBPDL_CFLAGS) AC_SUBST(LIBPDL_LIBS) fi NAVIT_CFLAGS="$NAVIT_CFLAGS $GLIB_CFLAGS $GMODULE_CFLAGS" NAVIT_LIBS="$NAVIT_LIBS $GLIB_LIBS $GMODULE_LIBS $LIBINTL" AC_SUBST(NAVIT_CFLAGS) AC_SUBST(NAVIT_LIBS) AC_SUBST(WORDEXP_LIBS) AC_SUBST(LIBC_LIBS) AC_SUBST(WINDRES) AC_CONFIG_FILES([ Makefile navit/Makefile navit/autoload/Makefile navit/autoload/osso/Makefile navit/binding/Makefile navit/binding/python/Makefile navit/binding/dbus/Makefile navit/binding/win32/Makefile navit/map/Makefile navit/map/mg/Makefile navit/map/textfile/Makefile navit/map/csv/Makefile navit/map/shapefile/Makefile navit/map/filter/Makefile navit/map/binfile/Makefile navit/map/garmin/Makefile navit/maptool/Makefile navit/fib-1.1/Makefile navit/font/Makefile navit/font/freetype/Makefile navit/fonts/Makefile navit/graphics/Makefile navit/graphics/android/Makefile navit/graphics/gd/Makefile navit/graphics/gtk_drawing_area/Makefile navit/graphics/opengl/Makefile navit/graphics/null/Makefile navit/graphics/sdl/Makefile navit/graphics/qt_qpainter/Makefile navit/graphics/win32/Makefile navit/gui/Makefile navit/gui/gtk/Makefile navit/gui/internal/Makefile navit/gui/win32/Makefile navit/gui/qml/Makefile navit/gui/qml/skins/Makefile navit/gui/qml/skins/navit/Makefile navit/osd/Makefile navit/osd/core/Makefile navit/plugin/Makefile navit/plugin/pedestrian/Makefile navit/speech/Makefile navit/speech/android/Makefile navit/speech/cmdline/Makefile navit/speech/dbus/Makefile navit/speech/espeak/Makefile navit/speech/speech_dispatcher/Makefile navit/support/Makefile navit/support/espeak/Makefile navit/support/ezxml/Makefile navit/support/glib/Makefile navit/support/libc/Makefile navit/support/libpng/Makefile navit/support/shapefile/Makefile navit/support/win32/Makefile navit/support/wordexp/Makefile navit/support/zlib/Makefile navit/vehicle/Makefile navit/vehicle/android/Makefile navit/vehicle/file/Makefile navit/vehicle/gpsd/Makefile navit/vehicle/gpsd_dbus/Makefile navit/vehicle/gypsy/Makefile navit/vehicle/maemo/Makefile navit/vehicle/null/Makefile navit/vehicle/demo/Makefile navit/vehicle/wince/Makefile navit/vehicle/iphone/Makefile navit/vehicle/webos/Makefile navit/xpm/Makefile navit/maps/Makefile intl/Makefile po/Makefile man/Makefile ]) #src/data/garmin_img/Makefile AC_OUTPUT echo "" echo "" echo "Summary of your installation :" # FIXME : maybe elaborate missing dependencies if test x"$graphics_sdl" != xyes then sdl_failures="(libsdl maybe?) " fi if test x"$glut" != xyes then sdl_failures=$sdl_failures"glut " fi if test x"$glc" != xyes then sdl_failures=$sdl_failures"quesoglc " fi if test -z "$sdl_failures" then echo "OpenGL gui : ENABLED, with $CEGUI_LIBS" else echo "OpenGL gui : DISABLED : you are missing $sdl_failures" fi if test x"$enable_hildon" = xyes then echo "Maemo/Hildon: ENABLED" else echo "Maemo/Hildon: DISABLED" fi if test x"$enable_osso" = xyes then echo "Maemo/OSSO: ENABLED" else echo "Maemo/OSSO: DISABLED" fi if test x"${USE_GARMIN}" = xyes then if test "x$use_libgarmin" = "xyes" then echo "Garmin IMG : ENABLED" else echo "Garmin IMG : DISABLED (you don't have libgarmin)" fi else echo "Garmin IMG : DISABLED (you requested it)" fi if test x"$LIBINTL" = "x" ;then nls_libs="system gettext support" else nls_libs="$LIBINTL" fi echo "Plugins: $plugins ($plugins_reason)" echo "Postgresql: $postgresql ($postgresql_reason)" echo "Samplemap: $samplemap ($samplemap_reason)" echo "NLS Support: $enable_nls ($nls_libs)" echo "Routing: $routing ($routing_reason)" echo "Font renderers:" echo " freetype: $font_freetype ($font_freetype_reason)" echo " FriBidi enabled: $fribidi ($fribidi_reason)" echo "Graphics types: $graphics ($graphics_reason)" echo " android: $graphics_android ($graphics_android_reason)" echo " gtk_drawing_area: $graphics_gtk_drawing_area ($graphics_gtk_drawing_area_reason)" echo " null: $graphics_null ($graphics_null_reason)" echo " qt_qpainter: $graphics_qt_qpainter ($graphics_qt_qpainter_reason)" echo " win32: $graphics_win32 ($graphics_win32_reason)" echo " OpenGL: $graphics_opengl ($graphics_opengl_reason)" echo " gd: $graphics_gd ($graphics_gd_reason)" echo " sdl: $graphics_sdl ($graphics_sdl_reason)" echo "GUI types:" echo " gtk: $gui_gtk ($gui_gtk_reason)" echo " internal: $gui_internal ($gui_internal_reason)" echo " win32: $gui_win32 ($gui_win32_reason)" echo " qml: $gui_qml ($gui_qml_reason)" echo "Map types:" echo " binfile: $map_binfile ($map_binfile_reason)" echo " filter: $map_filter ($map_filter_reason)" echo " mg: $map_mg ($map_mg_reason)" echo " shapefile: $map_shapefile ($map_shapefile_reason)" echo " textfile: $map_textfile ($map_textfile_reason)" echo " csv: $map_csv ($map_csv_reason)" echo "Bindings:" echo " dbus: $binding_dbus ($binding_dbus_reason)" echo " python: $binding_python ($binding_python_reason)" echo "OSD types:" echo " core: $osd_core ($osd_core_reason)" echo "Plugins:" echo " pedestrian: $plugin_pedestrian ($plugin_pedestrian_reason)" echo "Speech types:" echo " android: $speech_android ($speech_android_reason)" echo " cmdline: $speech_cmdline ($speech_cmdline_reason)" echo " dbus: $speech_dbus ($speech_dbus_reason)" echo " espeak: $speech_espeak ($speech_espeak_reason)" echo " speech_dispatcher: $speech_speech_dispatcher ($speech_speech_dispatcher_reason)" echo "Vehicle types:" echo " android: $vehicle_android ($vehicle_android_reason)" echo " demo: $vehicle_demo ($vehicle_demo_reason)" echo " file: $vehicle_file ($vehicle_file_reason)" echo " gpsd: $vehicle_gpsd ($vehicle_gpsd_reason)" echo " gpsd_dbus: $vehicle_gpsd_dbus ($vehicle_gpsd_dbus_reason)" echo " gypsy: $vehicle_gypsy ($vehicle_gypsy_reason)" echo " maemo: $vehicle_maemo ($vehicle_maemo_reason)" echo " null: $vehicle_null ($vehicle_null_reason)" echo " wince: $vehicle_wince ($vehicle_wince_reason)" echo " iphone: $vehicle_iphone ($vehicle_iphone_reason)" echo " webos: $vehicle_webos ($vehicle_webos_reason)" if test "x${gtk2_pkgconfig}" != "xyes" -a "x${gui_win32}" != "xyes" -a "x${gui_internal}" != "xyes" -a "x${gui_qml}" != "xyes" then echo "" echo "" echo "*** WARNING! you have no gui that can be built! ***" echo "Please install the dependency for at least gtk or sdl gui" echo "For more details, see the wiki at http://wiki.navit-project.org/" echo "" fi echo "Support for autotools will be removed soon from navit, please use cmake instead" sleep 5 navit-0.5.0~svn5643+dfsg.1/contrib/000077500000000000000000000000001221777731700166405ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/contrib/sjjb_import.pl000066400000000000000000000146571221777731700215340ustar00rootroot00000000000000#!/usr/bin/perl -w # Convert the map icons from http://www.sjjb.co.uk/mapicons/ # for use by navit - we want the "Positive" variant and we want # a different color for each section. # WARNING: EXISTING FILES WILL BE OVERWRITTEN WITHOUT HESITATION! # Usage: # sjjb_import.pl [source-dir] [dest-dir] # (C)opyright 2012 Lutz Möhrmann # License: GPL v2 ### config ######################################################### # TODO: Set to 1 to get the "Negative" version as shown here: # http://www.sjjb.co.uk/mapicons/contactsheet # The first value from $colors will be used as background in this # case, otherwise it's the foreground #$negative = 0; # TODO: Foreground color if $negative is set. $fg_color = 'ffffff'; # Use the second value from $colors to produce a tiny border $use_border = 0; # Some icons in place_of_worship/ (and possibly other directories) # contain a drop-shadow. Set to 1 to keep it. $use_shadow = 0; # TODO: produce "White Glow" #$use_glow = 1; # Format is main-color, border-color %colors = ( accommodation => ['00c08f', '226282'], amenity => ['734A08', '825d22'], barrier => ['666666', '808080'], education => ['39ac39', '208020'], food => ['c02727', '815c21'], health => ['da0092', '822262'], landuse => ['999999', '666666'], money => ['000000', '404040'], place_of_worship => ['5e8019', '7a993d'], poi => ['990808', '802020'], power => ['8e7409', '806d20'], shopping => ['ad30c0', '762282'], sport => ['39ac39', '208020'], tourist => ['b26609', 'bf8830'], transport => ['0089cd', '206080'], water => ['0050da', '204380'], ); # Select/rename icons. The first string is the source filename (with path, # but w/o .svg suffix), the second one is the destination filename. If omited, # the source fn is used. @icons = ( ['accommodation/shelter2', 'shelter'], ['amenity/library'], ['amenity/town_hall2', 'townhall'], # ['barrier/', ''], # ['education/', ''], ['food/biergarten'], ['food/drinkingtap', 'drinking_water'], ['health/hospital_emergency', 'emergency'], # ['landuse/', ''], # ['money/', ''], ['place_of_worship/bahai3', 'bahai'], ['place_of_worship/buddhist3', 'buddhist'], # ['place_of_worship/christian3', 'christian'], # that's "church" ['place_of_worship/hindu3', 'hindu'], ['place_of_worship/islamic3', 'islamic'], ['place_of_worship/jain3', 'jain'], ['place_of_worship/jewish3', 'jewish'], ['place_of_worship/pagan3', 'pagan'], # not there (yet) ['place_of_worship/pastafarian3', 'pastafarian'], # not there (yet) ['place_of_worship/shinto3', 'shinto'], ['place_of_worship/sikh3', 'sikh'], ['place_of_worship/taoist3', 'taoist'], # not there (yet) ['place_of_worship/unknown', 'worship'], # ['poi/', ''], # ['power/', ''], # ['shopping/', ''], ['sport/leisure_centre', 'sport'], ['tourist/casino'], ['tourist/castle2', 'castle'], ['tourist/memorial'], ['tourist/picnic'], ['tourist/theatre', 'theater'], ['transport/bus_stop2', 'bus_stop'], ['transport/daymark'], # not there (yet) ['transport/rental_car', 'car_rent'], ['shopping/car', 'car_dealer'], ['shopping/clothes', 'shop_apparel'], ['shopping/computer', 'shop_computer'], ['shopping/department_store', 'shop_department'], ['water/dam'], ); ### /config ######################################################## use File::Basename; use XML::Twig; @fg_patterns= ("fill:white:1", "stroke:white:1", "fill:#ffffff:1", "stroke:#ffffff:1"); @bg_patterns= ("fill:#111111:1", "fill:#111:1"); @brd_patterns= ("stroke:#eeeeee:1", "stroke:#eee:1"); @sh_patterns= ('fill:#ffffff:0.25', 'stroke:#ffffff:0.25'); $dbg_level= 1; sub dbg { my ($lvl, $text)= @_; if ($lvl <= $dbg_level) { print STDERR $text; } } sub change { my ($value, $patterns, $color, $transparent)= @_; &dbg(3, "change('$$value', , '$color', '$transparent')\n"); foreach $p (@{$patterns}) { my ($k, $v, $a)= split(':', $p); $o= $opacity; if ($$value =~ m/\Aopacity:([.0-9]+)/i) { $o*= $1; } elsif ($$value =~ m/;opacity:([.0-9]+)/i) { $o*= $1; } if ($$value =~ m/$k-opacity:([.0-9]+)/i) { $o*= $1; } if ($o >= 0.5) # we don't want half transparent stuff like in tourist/memorial or amenity/town_hall2 { $o= 1; } &dbg(4, "p='$p' k='$k' v='$v' a='$a' o='$o'\n"); if ( !($$value =~ m/$k:$v/i) or ((defined $a) and ($a != $o)) ) { next; } if (!$transparent) { &dbg(4, "changing color to '$color'\n"); $$value =~ s/$k:$v/$k:$color/i; } else { &dbg(4, "changing opacity to '0'\n"); if ($$value =~ m/$k-opacity:[0-9]/i) { $$value =~ s/$k-opacity:[0-9]/$k-opacity:0/i; } else { $$value =~ s/$k:$v/$k:$v;$k-opacity:0/i; } } } } sub g_handler { my $att= $_->{'att'}; if (!defined $att->{'style'}) { return; } if ($att->{'style'} =~ m/[^-]?opacity:([.0-9]+)/i) { $opacity= $1; } } sub handler { my $att= $_->{'att'}; if (!defined $att->{'style'}) { return; } &dbg(2, " in: '$att->{'style'}'\n"); my $fg= $negative ? $fg_color : $color1; &change(\$att->{'style'}, \@sh_patterns, $fg, !$use_shadow); &change(\$att->{'style'}, \@fg_patterns, $fg, 0); &change(\$att->{'style'}, \@bg_patterns, $color1, !$negative); &change(\$att->{'style'}, \@brd_patterns, $color2, !$use_border); &dbg(2, " out: '$att->{'style'}'\n\n"); } sub get_arg { my ($no, $q)= @_; if ($ARGV[$no]) { return $ARGV[$no]; } else { print $q."\n"; $input= ; chomp($input); return $input; } } $sjjb_dir= get_arg(0, "Directory holding the extracted svg's from http://www.sjjb.co.uk/mapicons/downloads"); $dest_dir= $ARGV[1] ? $ARGV[1] : dirname(__FILE__)."/../navit/xpm/"; foreach $i (@icons) { my ($path, $icon)= split('/', $i->[0]); my ($dest)= $i->[1] ? $i->[1] : $icon; $color1= '#'.$colors{$path}[0]; $color2= '#'.$colors{$path}[1]; $opacity= 1.0; my $in_fn= "$sjjb_dir/$path/$icon.svg"; open(my $in_f, $in_fn) or die "Couldn't read '$in_fn': $!"; my $decl= <$in_f>; chomp $decl; # save the ') { $in.= $_; } close($in_f); &dbg(1, "file $in_fn: ".length($in)." bytes.\n"); my $xml= XML::Twig->new( pretty_print => 'indented', twig_handlers => { 'path' => \&handler, 'rect' => \&handler, 'circle' => \&handler, 'svg:path' => \&handler, 'svg:rect' => \&handler, 'svg:circle' => \&handler, }, start_tag_handlers => { 'g' => \&g_handler, 'svg:g' => \&g_handler, }, ); $xml->parse($in); my $out_fn= "$dest_dir/$dest.svg"; open(my $out_f, "> $out_fn") or die "Couldn't write to '$out_fn': $!"; print $out_f $decl."\n".$xml->sprint(); $xml->purge; } navit-0.5.0~svn5643+dfsg.1/intl/000077500000000000000000000000001221777731700161465ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/intl/VERSION000066400000000000000000000000501221777731700172110ustar00rootroot00000000000000GNU gettext library from gettext-0.14.1 navit-0.5.0~svn5643+dfsg.1/man/000077500000000000000000000000001221777731700157535ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/man/CMakeLists.txt000066400000000000000000000000701221777731700205100ustar00rootroot00000000000000INSTALL(FILES maptool.1 navit.1 DESTINATION ${MAN_DIR}) navit-0.5.0~svn5643+dfsg.1/man/Makefile.am000066400000000000000000000000401221777731700200010ustar00rootroot00000000000000dist_man_MANS=maptool.1 navit.1 navit-0.5.0~svn5643+dfsg.1/man/maptool.1000066400000000000000000000046451221777731700175210ustar00rootroot00000000000000.TH maptool 1 "$Date$" "$Revision$" "USER COMMANDS" .SH NAME maptool \- parse osm textfile and convert to Navit binfile format .SH SYNOPSIS .B For OSM XML data: .B bzcat planet.osm.bz2 | maptool mymap.bin [\-h] [\-2] [\-5 ] [\-6] [\-a ] [\-c] -[\-d ] [\-i ] [\-k] [\-M] [\-N] [\-o] [\-r ] [\-s ] [\-S ] [\-w] [\-W] [\-U] [\-z ] .B For OSM Protobuf/PBF data: .B maptool \-\-protobuf \-i planet.osm.pbf planet.bin [\-h] [\-2] [\-5 ] [\-6] [\-a ] [\-c] [\-e ] [\-i ] [\-k] [\-M] [\-N] [\-o] [\-P] [\-r ] [\-s ] [\-S ] [\-w] [\-W] [\-U] [\-z ] .SH DESCRIPTION maptool parses osm textfile and converts it to Navit binfile format .SH OPTIONS .TP \-h (\-\-help) display a short help message .TP \-2 (\-\-dowai2poi) convert ways and polygons to POIs when applicable .TP \-4 (\-\-md5) set file where to write md5 sum .TP \-6 (\-\-64bit) set zip 64 bit compression .TP \-a (\-\-attr-debug-level) control which data is included in the debug attribute .TP \-c (\-\-dump-coordinates) dump coordinates after phase 1 .TP \-d (\-\-db) get osm data out of a postgresql database with osm simple scheme and given connect string .TP \-e (\-\-end) end at specified phase .TP \-i (\-\-input-file) specify the input file name (OSM), overrules default stdin .TP \-k (\-\-keep-tmpfiles) do not delete tmp files after processing. useful to reuse them .TP \-N (\-\-nodes-only) process only nodes .TP \-o (\-\-coverage) converts every street to street_converage, resulting in a big fat black line. You can overlay this map with another vector map or image map, and every street you will still see is missing in the \-o map .TP \-P (\-\-protobuf) input file is protobuf .TP \-r (\-\-rule-file) read mapping rules from specified file .TP \-s (\-\-start) start at specified phase .TP \-S (\-\-slice-size) defines the amount of memory to use, in bytes. Default is 1GB .TP \-w (\-\-dedupe-ways) ensure no duplicate ways or nodes. useful when using several input files .TP \-W (\-\-ways-only) process only ways .TP \-U (\-\-unknown-country) add objects with unknown country to index .TP \-z (\-\-compression-level) set the compression level .SH BUGS Should you find one, please report it : http://trac.navit-project.org .SH AUTHOR The navit Team - http://www.navit-project.org .SH SEE ALSO navit(1) navit-0.5.0~svn5643+dfsg.1/man/navit.1000066400000000000000000000032541221777731700171620ustar00rootroot00000000000000.TH navit 1 "$Date$" "$Revision$" "USER COMMANDS" .SH NAME navit \- The modular touchscreen-friendly vector based navigation software. .SH SYNOPSIS .B navit [\-h] [\-v] [\-d ] [\-c ] .SH DESCRIPTION Navit is a open source (GPL) car navigation system with routing engine. Its modular design is capable of using vector maps of various formats for routing and rendering of the displayed map. It's even possible to use multiple maps at a time. The GTK+ or SDL user interfaces are designed to work well with touch screen displays. Points of Interest of various formats are displayed on the map. The current vehicle position is either read from gpsd or directly from NMEA GPS sensors. The routing engine not only calculates an optimal route to your destination, but also generates directions and even speaks to you. Navit is translated in more than 40 languages currently, please see https://translations.launchpad.net/navit/trunk For more informations, please refer to our wiki : http://wiki.navit-project.org You can also try our mailing lists : http://sourceforge.net/mailarchive/forum.php?forum_name=navit-users Or visit us on IRC : #navit on the freenode network .SH OPTIONS .TP \-h Display a short help text and exit. .TP \-v Display the version number and exit. .TP \-d Increase debugging output. Debuglevel 0 is the default, higher values will print more debugging output. .TP \-c Specify the config file (navit.xml) to use. If not specified, Navit will use a default config file. .SH BUGS Should you find one, please report it : http://trac.navit-project.org .SH AUTHOR The navit Team - http://www.navit-project.org .SH SEE ALSO maptool(1) navit-0.5.0~svn5643+dfsg.1/navit/000077500000000000000000000000001221777731700163215ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/CMakeLists.txt000066400000000000000000000204361221777731700210660ustar00rootroot00000000000000include_directories( "${PROJECT_BINARY_DIR}") include_directories( "${PROJECT_SOURCE_DIR}") include_directories( "${CMAKE_CURRENT_SOURCE_DIR}") include_directories( "${CMAKE_CURRENT_BINARY_DIR}") include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/support") # navit cre set(NAVIT_SRC announcement.c atom.c attr.c cache.c callback.c command.c compass.c config_.c coord.c country.c data_window.c debug.c event.c file.c geom.c graphics.c gui.c item.c layout.c log.c main.c map.c maps.c linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c navit.c navit_nls.c navigation.c osd.c param.c phrase.c plugin.c popup.c profile.c profile_option.c projection.c roadprofile.c route.c routech.c script.c search.c speech.c start_real.c sunriset.c transform.c track.c util.c vehicle.c vehicleprofile.c xmlconfig.c ) if(NOT USE_PLUGINS) list(APPEND NAVIT_SRC ${CMAKE_CURRENT_BINARY_DIR}/builtin.c) endif(NOT USE_PLUGINS) if (${HAVE_GLIB}) list(APPEND NAVIT_SRC event_glib.c) endif() if(ANDROID) list(APPEND NAVIT_SRC android.c) set(NAVIT_LIBNAME navit) else() set(NAVIT_LIBNAME navit_core) endif() foreach ( PLUGIN_PATH ${ALL_PLUGINS}) if (${PLUGIN_PATH}) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/${PLUGIN_PATH}") string(REPLACE "/" "_" MODULE_INC ${PLUGIN_PATH}) list(APPEND NAVIT_SUPPORT_LIBS ${MODULE_INC}) endif() endforeach() foreach ( MODULE_PATH ${ALL_MODULES}) if ( ${MODULE_PATH} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_PATH}") string(REPLACE "/" "_" MODULE_INC ${MODULE_PATH}) list(APPEND MODULES_PROTOTYPE "\nvoid\tmodule_${MODULE_INC}_init(void)") list(APPEND MODULES_FUNC "\nmodule_${MODULE_INC}_init()") if (NOT USE_PLUGINS) list(APPEND MODULES_NAME ${MODULE_INC}) else() string(REGEX REPLACE "(^[^/]*)/.*" "\\1" ${MODULE_INC}_TYPE ${MODULE_PATH}) endif() endif() endforeach() CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/builtin.c.in ${CMAKE_CURRENT_BINARY_DIR}/builtin.c) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/fib-1.1") # Add module paths foreach (CURRENT_MODULE ${ALL_PLUGINS} ${ALL_MODULE_PLUGINS} ${ALL_MODULES}) if (${CURRENT_MODULE}) add_subdirectory( "${CMAKE_CURRENT_SOURCE_DIR}/${CURRENT_MODULE}") endif() endforeach() add_subdirectory (fib-1.1) if(NOT ANDROID) set(NAVIT_START_SRC start.c) if(WIN32 OR WINCE AND NOT WIN_OMIT_RESOURCES) list(APPEND NAVIT_START_SRC ${CMAKE_CURRENT_SOURCE_DIR}/gui/win32/resources/resource.rc) else() if (APPLE) set(NAVIT_START_SRC start_apple.m) endif() endif() if (BUILD_BUNDLE) list(APPEND NAVIT_START_SRC resources/share resources/Icon.png resources/Default.png) add_custom_command(OUTPUT resources/Icon.png COMMAND convert -scale 79x79 -crop 60x60+8+19 ${CMAKE_CURRENT_SOURCE_DIR}/xpm/desktop_icons/128x128/navit.png resources/Icon.png) add_custom_command(OUTPUT resources/Default.png COMMAND convert -scale 79x79 -crop 60x60+8+19 ${CMAKE_CURRENT_SOURCE_DIR}/xpm/desktop_icons/128x128/navit.png resources/Default.png) endif() add_executable(navit ${NAVIT_START_SRC}) target_link_libraries (navit ${NAVIT_LIBNAME}) set_target_properties(navit PROPERTIES COMPILE_DEFINITIONS "MODULE=${MODULE_NAME}") if (BUILD_BUNDLE) add_custom_command(OUTPUT resources/share COMMAND mkdir -p resources/share) set_source_files_properties(resources/share resources/Icon.png resources/Default.png PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set_target_properties(navit PROPERTIES MACOSX_BUNDLE TRUE) set_target_properties(navit PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) add_dependencies(navit navit_config_xml_resource) add_dependencies(navit images_resource) add_dependencies(navit locale_resource) endif() endif() if (SHARED_LIBNAVIT) add_library (${NAVIT_LIBNAME} SHARED ${NAVIT_SRC} ) else(SHARED_LIBNAVIT) add_library (${NAVIT_LIBNAME} STATIC ${NAVIT_SRC} ) endif(SHARED_LIBNAVIT) if(NOT MSVC) SET(NAVIT_LIBS ${NAVIT_LIBS} m) endif(NOT MSVC) target_link_libraries(${NAVIT_LIBNAME} ${MODULES_NAME} ${NAVIT_SUPPORT_LIBS} fib ${NAVIT_LIBS} ) set_target_properties(${NAVIT_LIBNAME} PROPERTIES COMPILE_DEFINITIONS "MODULE=navit;LIBDIR=\"${CMAKE_INSTALL_PREFIX}/${LIB_DIR}\";PREFIX=\"${CMAKE_INSTALL_PREFIX}\"") if (DEFINED NAVIT_COMPILE_FLAGS) set_target_properties(${NAVIT_LIBNAME} PROPERTIES COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS}") endif() # Subversion revision ADD_CUSTOM_TARGET( version ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/version.h.in -D DST=${CMAKE_CURRENT_BINARY_DIR}/version.h -D NAME=SVN_VERSION -P ${PROJECT_SOURCE_DIR}/cmake/version.cmake ) # additional parameter are passed to the stylesheet processor as parameter macro(process_xslt SRC_XML DEST_XML) set(XSLT_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy ${SRC_XML} ${DEST_XML} COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/navit/navit.dtd ${CMAKE_CURRENT_BINARY_DIR}/navit.dtd) if(XSL_PROCESSING AND XSLTS) string(REPLACE "," ";" XSLTS "${XSLTS}") foreach(tmp ${XSLTS}) set(XSLT_FILE "${PROJECT_SOURCE_DIR}/navit/xslt/${tmp}.xslt") list(APPEND XSLT_FILES "${XSLT_FILE}") list(APPEND XSLT_COMMANDS COMMAND ${CMAKE_COMMAND} -E echo Applying ${tmp}.xslt) compose_xslt_transform_command(CMD "${XSLT_FILE}" "${DEST_XML}" "${DEST_XML}.tmp" "${ARGN}") list(APPEND XSLT_COMMANDS ${CMD}) list(APPEND XSLT_COMMANDS COMMAND ${CMAKE_COMMAND} -E rename ${DEST_XML}.tmp ${DEST_XML}) endforeach() endif() ADD_CUSTOM_COMMAND( OUTPUT ${DEST_XML} DEPENDS ${SRC_XML} ${XSLT_FILES} ${XSLT_COMMANDS} ) endmacro() if(ANDROID) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navithdpi.xml OSD_SIZE=2 ICON_MEDIUM=48) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitmdpi.xml OSD_SIZE=1.33) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitldpi.xml OSD_SIZE=1) add_custom_target( navit_config_xml ALL DEPENDS navithdpi.xml navitmdpi.xml navitldpi.xml) else() process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navit.xml "") add_custom_target( navit_config_xml_resource DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/navit.xml COMMAND mkdir -p resources/share/navit COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/navit.xml resources/share/navit) add_custom_target( locale_resource DEPENDS locales COMMAND mkdir -p resources/share COMMAND cp -a ${CMAKE_CURRENT_BINARY_DIR}/../locale resources/share/locale) add_custom_target( navit_config_xml ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/navit.xml) endif() ADD_DEPENDENCIES(${NAVIT_LIBNAME} version) if (USE_LIBGNUINTL AND NOT HAVE_GLIB) ADD_DEPENDENCIES(support_glib intl_cmake) endif() add_subdirectory (maptool) add_subdirectory (xpm) add_subdirectory (maps) if(ANDROID) add_subdirectory (android) endif() install(TARGETS navit DESTINATION ${BIN_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/navit.xml DESTINATION ${SHARE_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) get_directory_property(INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES) WRITE_FILE("cmake_plugin_settings.txt" "set(APPLE ${APPLE} CACHE BOOL init)\n" "set(ANDROID ${ANDROID} CACHE BOOL init)\n" "set(USE_PLUGINS ${USE_PLUGINS} CACHE BOOL init)\n" "set(MODULE_BUILD_TYPE \"${MODULE_BUILD_TYPE}\" CACHE STRING init)\n" "set(NAVIT_COMPILE_FLAGS \"${NAVIT_COMPILE_FLAGS}\" CACHE STRING init)\n" "set(navit_SOURCE_DIR \"${navit_SOURCE_DIR}\" CACHE STRING init)\n" "set(NAVIT_LIBNAME \"${NAVIT_LIBNAME}\" CACHE STRING init)\n" "set(ANDROID_API_VERSION \"${ANDROID_API_VERSION}\" CACHE STRING init)\n" "set(ANDROID_NDK_API_VERSION \"${ANDROID_NDK_API_VERSION}\" CACHE STRING init)\n" "set(CMAKE_TOOLCHAIN_FILE \"${CMAKE_TOOLCHAIN_FILE}\" CACHE STRING init)\n" "set(INCLUDE_DIRECTORIES \"${INCLUDE_DIRECTORIES}\" CACHE STRING init)\n" "set(LIB_DIR \"${LIB_DIR}\" CACHE STRING init)\n" "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\" CACHE STRING init)\n" ) navit-0.5.0~svn5643+dfsg.1/navit/Doxyfile000066400000000000000000001427061221777731700200410ustar00rootroot00000000000000# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = navit # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ../doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO navit-0.5.0~svn5643+dfsg.1/navit/Info.plist000066400000000000000000000021401221777731700202660ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable $(EXECUTABLE_NAME) CFBundleGetInfoString CFBundleIconFile CFBundleIdentifier org.navitproject.navit CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString CFBundleDisplayName Navit CFBundleName Navit CFBundlePackageType APPL CFBundleShortVersionString CFBundleSignature ???? CFBundleVersion CSResourcesFileMapped LSRequiresCarbon NSHumanReadableCopyright UIFileSharingEnabled navit-0.5.0~svn5643+dfsg.1/navit/Makefile.am000066400000000000000000000303431221777731700203600ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc comma=, SUBDIRS=fib-1.1 support if PLUGINS SUBDIRS += . endif DIST_SUBDIRS=autoload binding map maptool fib-1.1 font fonts gui graphics osd plugin speech support vehicle xpm maps SUBDIRS+=autoload binding map font gui graphics osd plugin speech vehicle xpm MODULES = $(wildcard $(top_builddir)/navit/binding/*/*.la $(top_builddir)/navit/font/*/*.la $(top_builddir)/navit/graphics/*/*.la $(top_builddir)/navit/gui/*/*.la $(top_builddir)/navit/map/*/*.la $(top_builddir)/navit/osd/*/*.la $(top_builddir)/navit/speech/*/*.la $(top_builddir)/navit/vehicle/*/*.la) if FONTS SUBDIRS += fonts endif if !PLUGINS SUBDIRS += . endif if MAPTOOL SUBDIRS += maptool endif if BUILD_SAMPLEMAP SUBDIRS += maps endif AM_CPPFLAGS = -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ @ZLIB_CFLAGS@ -DPREFIX=\"@prefix@\" -DLIBDIR=\"@libdir@\" -DMODULE=navit BUILT_SOURCES = version.h navit_config.h if BIN_NAVIT bin_PROGRAMS = navit endif if SHARED_LIBNAVIT lib_LTLIBRARIES = lib@LIBNAVIT@.la lib@LIBNAVIT@_la_LDFLAGS = -avoid-version @MODULE_LDFLAGS@ @NAVIT_SOCKET_LDFLAGS@ -no-undefined -Wl,--no-undefined else noinst_LTLIBRARIES = lib@LIBNAVIT@.la endif lib@LIBNAVIT@_la_LIBADD = @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @INTLLIBS@ -Lfib-1.1 -lfib @MODULE_LIBADD@ @CRYPTO_LIBS@ if SUPPORT_WIN32CE lib@LIBNAVIT@_la_LIBADD += -Lsupport/libc -lsupport_libc endif pkgdata_DATA = navit.xml EXTRA_DIST = navit_shipped.xml navit.dtd lib@LIBNAVIT@_la_SOURCES = announcement.c atom.c attr.c cache.c callback.c command.c compass.c config_.c coord.c country.c data_window.c debug.c \ event.c event_glib.h file.c geom.c graphics.c gui.c item.c layout.c log.c main.c map.c maps.c \ linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c bookmarks.h navit.c navigation.c osd.c param.c phrase.c plugin.c popup.c \ profile.c profile_option.c projection.c roadprofile.c route.c routech.c search.c script.c speech.c start_real.c transform.c track.c \ util.c vehicle.c vehicleprofile.c xmlconfig.c announcement.h atom.h attr.h attr_def.h cache.h callback.h color.h command.h compass.h config_.h coord.h country.h \ android.h data.h data_window.h data_window_int.h debug.h destination.h draw_info.h endianess.h event.h \ file.h geom.h graphics.h gtkext.h gui.h item.h item_def.h keys.h log.h layer.h layout.h linguistics.h main.h map-share.h map.h\ map_data.h mapset.h maptype.h menu.h messages.h navigation.h navit.h osd.h \ param.h phrase.h plugin.h point.h plugin_def.h projection.h popup.h route.h profile.h roadprofile.h search.h speech.h start_real.h \ transform.h track.h types.h util.h vehicle.h vehicleprofile.h window.h xmlconfig.h zipfile.h \ navit_nls.c navit_nls.h sunriset.c sunriset.h glib_slice.h XSLTS=@XSLTS@ navit.xml: navit_shipped.xml $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))) navit_android_xml cp $< navit.xml.new if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi for i in $^; do if [ "$${i%.xslt}" != "$$i" ]; then echo "Applying $$i" ; @SAXON@ -snone navit.xml.new $$i >navit.xml.tmp || exit ; mv -f navit.xml.tmp navit.xml.new || exit ; fi ; done mv -f navit.xml.new navit.xml rm -f navit.xml.tmp navit_android_xml: navit_shipped.xml if SUPPORT_ANDROID # new android xml files for (mdpi,ldpi,hdpi) cp $(srcdir)/navit_shipped.xml navit_android.xml.new if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi # # now apply any other xslt files (this would allow for pedestrian plugin) # for i in $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))); do if [ "$${i%.xslt}" != "$$i" ]; then j=`basename $$i` ; if [ "$$j" != "android.xslt" ] ; then echo "Android: Applying $$i" ; @SAXON@ -snone navit_android.xml.new $(srcdir)/"$$i" >navit_android.xml.new.tmp || exit ; mv navit_android.xml.new.tmp navit_android.xml.new || exit ; fi ; fi ; done # # for now disable pedestrian plugin (zoff99) @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_mdpi.xslt >navit_android_mdpi.xml.tmp @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_ldpi.xslt >navit_android_ldpi.xml.tmp @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_hdpi.xslt >navit_android_hdpi.xml.tmp rm -f navit_android.xml.new rm -f navit_android.xml.new.tmp mv -f navit_android_mdpi.xml.tmp navit_android_mdpi.xml mv -f navit_android_ldpi.xml.tmp navit_android_ldpi.xml mv -f navit_android_hdpi.xml.tmp navit_android_hdpi.xml rm -f navit_android_mdpi.xml.tmp rm -f navit_android_ldpi.xml.tmp rm -f navit_android_hdpi.xml.tmp else echo "no Android support" endif if SUPPORT_ANDROID lib@LIBNAVIT@_la_SOURCES += android.c navit_SOURCES = navit_LDADD = v_int = $$(cat $(srcdir)/android/Android_Market_Version_int.txt|grep v_int|cut -d ":" -f 2) v_name = "0.5.0-"$$(LANG=C svnversion $(top_srcdir) 2> /dev/null|tr -d ":A-Z" 2> /dev/null) android/AndroidManifest.xml: android/AndroidManifest.xml.in mkdir -p $(builddir)/android sed '0,/$@ for i in $(subst $(comma), ,@ANDROID_PERMISSIONS@); do echo " " >>$@; done sed '0,/>$@ sed -e "s/@ANDROID_VERSION_INT@/$(v_int)/" <$@ >android/AndroidManifest.xml.tmp mv -f android/AndroidManifest.xml.tmp $@ sed -e "s/@ANDROID_VERSION_NAME@/$(v_name)/" <$@ >android/AndroidManifest.xml.tmp mv -f android/AndroidManifest.xml.tmp $@ android/build.xml: android/AndroidManifest.xml android/dummy.txt # this is needed, otherwise somehow the files cant be deleted mkdir -p $(builddir)/android/src/ if [ "$(builddir)" != "$(srcdir)" ]; then chmod -R u+w $(builddir)/android/src/; fi if [ "$(builddir)" != "$(srcdir)" ]; then rm -Rf $(builddir)/android/src/; fi if [ "$(builddir)" != "$(srcdir)" ]; then cp -rpf $(srcdir)/android/* $(builddir)/android; fi touch $(srcdir)/android/dummy.txt touch $(builddir)/android/dummy.txt android update project -t @ANDROID_PROJECT@ -p android apkg-all: all android/build.xml navit.xml mkdir -p android/libs/armeabi cp .libs/*.so android/libs/armeabi/libnavit.so for i in */*/.libs/*.so ; do sed 's&lib_data_data_org\.navitproject\.navit_lib_&/data/data/org.navitproject.navit/lib/lib&' <$$i >android/libs/armeabi/$$(basename $$i); done for i in $(shell cd $(srcdir)/../po && echo ??_*.po.in ??.po.in); do echo Gnerating strings.xml from $$i ; mkdir -p $(builddir)/android/res/values-$$(echo $$i | sed -e s/\\.po\\.in// -e s/_/-r/) ; @SAXON@ $(srcdir)/android/res/values/strings.xml $(srcdir)/android/po2xml.xslt po_file=$(abs_top_srcdir)/po/$$i >$(builddir)/android/res/values-$$(echo $$i | sed -e s/\\.po\\.in// -e s/_/-r/)/strings.xml ; done mkdir -p android/res/drawable-ldpi mkdir -p android/res/drawable-mdpi mkdir -p android/res/drawable-hdpi for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$${i%.xpm}.png; done for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$${i%.xpm}.png; done for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$${i%.xpm}.png; done # for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi # if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi # if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 75% $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 150% $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi mkdir -p android/res/raw for i in $(shell cd ../po && echo *.mo); do cp ../po/$$i android/res/raw/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # cp navit.xml android/res/raw cp navit_android_mdpi.xml android/res/raw/navitmdpi.xml cp navit_android_ldpi.xml android/res/raw/navitldpi.xml cp navit_android_hdpi.xml android/res/raw/navithdpi.xml apkg: apkg-all touch $(srcdir)/android/dummy.txt touch $(builddir)/android/dummy.txt cd android && ant debug apkg-release: apkg-all touch $(srcdir)/android/dummy.txt touch $(builddir)/android/dummy.txt cd android && ant release jarsigner $$(cat ~/.keystore_args) android/bin/Navit-unsigned.apk mykey # zipalign -f 4 android/bin/Navit-unsigned.apk android/bin/Navit-unsigned-aligned.apk else navit_SOURCES = start.c navit_LDADD = lib@LIBNAVIT@.la endif if EVENT_GLIB lib@LIBNAVIT@_la_SOURCES += event_glib.c endif navit_LDFLAGS = -export-dynamic if !PLUGINS lib@LIBNAVIT@_la_SOURCES += builtin.c lib@LIBNAVIT@_la_LIBADD += $(MODULES) endif navit_LDADD += @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ if SUPPORT_WIN32 navit_LDADD += resource.rsc if SUPPORT_WIN32CE navit_LDADD += -lcommctrl -Lsupport/libc else navit_LDADD += -lgdi32 -lcomctl32 -lwinmm endif resource.rsc: $(top_srcdir)/navit/gui/win32/resources/resource.rc $(WINDRES) -I $(top_srcdir)/navit/gui/win32/resources $(top_srcdir)/navit/gui/win32/resources/resource.rc resource.rsc endif .PHONY: version.h.tmp version.h.tmp: echo "#include \"config.h\"" >version.h.tmp if SOURCE_MODE_SVN echo "#define SVN_VERSION \"$$(LANG=C svnversion $(top_srcdir) 2>/dev/null)\"" >>version.h.tmp else echo "#define SVN_VERSION \"@SOURCE_MODE@\"" >>version.h.tmp endif echo "#define NAVIT_VARIANT \"@NAVIT_VARIANT@\"" >>version.h.tmp if ! diff version.h.tmp version.h >/dev/null 2>/dev/null; \ then \ mv -f version.h.tmp version.h; \ fi version.h: version.h.tmp navit_config.h: ../config.h cp ../config.h navit_config.h.tmp if ! diff navit_config.h.tmp navit_config.h >/dev/null 2>/dev/null; \ then \ mv -f navit_config.h.tmp navit_config.h; \ fi distclean-local: rm -f version.h version.h.tmp navit_config.h navit_config.h.tmp builtin.c support-builtin.c navit.xml resurce.rsc if [ "$(top_builddir)" != "$(top_srcdir)" ]; then rm -f navit.dtd; fi builtin.c: $(top_builddir)/config.h ls $(top_builddir)/navit/*/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >builtin.c echo "extern void builtin_init(void);" >>builtin.c echo "void builtin_init(void) {" >>builtin.c ls $(top_builddir)/navit/*/*/*.la | grep -v shapefile | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>builtin.c echo "}" >>builtin.c support-builtin.c: $(top_builddir)/config.h ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >support-builtin.c echo "extern void builtin_init(void);" >>support-builtin.c echo "void builtin_init(void) {" >>support-builtin.c ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>support-builtin.c echo "}" >>support-builtin.c navit-0.5.0~svn5643+dfsg.1/navit/android/000077500000000000000000000000001221777731700177415ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/res/000077500000000000000000000000001221777731700205325ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/res/values/000077500000000000000000000000001221777731700220315ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/res/values/strings.xml000066400000000000000000000074271221777731700242560ustar00rootroot00000000000000 Yes No Navit started Navit running Welcome to Navit Thank you for installing Navit!\n\nTo start, select \"Download maps\" from the menu to download a map. Note: The map filesize may be large (>50MB) - a wifi connection is recommended.\n\nMapdata: (c) OpenStreetMap contributors\n\nEnjoy Navit! OK More info Zoom in Zoom out Download maps Toggle POIs Exit Navit Backup / Restore Position Route to here Delete this map? Map download Downloading: ETA ready Error downloading map. Map download aborted Not enough free space No location. Reopen after location fix. Maps containing current location Address search Enter destination Match partial address Search Searching... Address not found Getting search results Loading search results No results found No text entered Setting destination to: Towns Streets Choose an action Please insert an SD Card Backing up... Restoring... Failed to create backup directory Backup failed No backup found Failed to restore Backup successful Restore Successful\nPlease restart Navit Backup not found Restore failed Select backup Backup Restore navit-0.5.0~svn5643+dfsg.1/navit/android/src/000077500000000000000000000000001221777731700205305ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/000077500000000000000000000000001221777731700213175ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/000077500000000000000000000000001221777731700240275ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/000077500000000000000000000000001221777731700251505ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/Navit.java000066400000000000000000000555671221777731700271160ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Message; import android.os.PowerManager; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.inputmethod.InputMethodManager; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class Navit extends Activity { public NavitDialogs dialogs; private PowerManager.WakeLock wl; private NavitActivityResult ActivityResults[]; public static InputMethodManager mgr = null; public static DisplayMetrics metrics = null; public static Boolean show_soft_keyboard = false; public static Boolean show_soft_keyboard_now_showing = false; public static long last_pressed_menu_key = 0L; public static long time_pressed_menu_key = 0L; private static Intent startup_intent = null; private static long startup_intent_timestamp = 0L; public static String my_display_density = "mdpi"; public static final int NavitDownloaderSelectMap_id = 967; public static final int MAP_NUM_PRIMARY = 11; public static final int NavitAddressSearch_id = 70; public static String NavitLanguage; public static Resources NavitResources = null; public static final int MAP_NUM_SECONDARY = 12; static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit"; static final String TAG = "Navit"; static final String MAP_FILENAME_PATH = Environment.getExternalStorageDirectory().getPath() + "/navit/"; static final String NAVIT_DATA_DIR = "/data/data/" + NAVIT_PACKAGE_NAME; static final String NAVIT_DATA_SHARE_DIR = NAVIT_DATA_DIR + "/share"; static final String FIRST_STARTUP_FILE = NAVIT_DATA_SHARE_DIR + "/has_run_once.txt"; public static final String NAVIT_PREFS = "NavitPrefs"; public void removeFileIfExists(String source) { File file = new File(source); if (!file.exists()) return; file.delete(); } public void copyFileIfExists(String source, String destination) throws IOException { File file = new File(source); if (!file.exists()) return; FileInputStream is = null; FileOutputStream os = null; try { is = new FileInputStream(source); os = new FileOutputStream(destination); int len; byte buffer[] = new byte[1024]; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } } finally { /* Close the FileStreams to prevent Resource leaks */ if (is != null) is.close(); if (os != null) os.close(); } return; } public static String _(String in) { return NavitTextTranslations.get_text(in); } private boolean extractRes(String resname, String result) { boolean needs_update = false; Log.e(TAG, "Res Name " + resname + ", result " + result); int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); Log.e(TAG, "Res ID " + id); if (id == 0) return false; File resultfile = new File(result); if (!resultfile.exists()) { needs_update = true; File path = resultfile.getParentFile(); if ( !path.exists() && !resultfile.getParentFile().mkdirs()) return false; } else { PackageManager pm = getPackageManager(); ApplicationInfo appInfo; long apkUpdateTime = 0; try { appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0); apkUpdateTime = new File(appInfo.sourceDir).lastModified(); } catch (NameNotFoundException e) { Log.e(TAG, "Could not read package infos"); e.printStackTrace(); } if (apkUpdateTime > resultfile.lastModified()) needs_update = true; } if (needs_update) { Log.e(TAG, "Extracting resource"); try { InputStream resourcestream = NavitResources.openRawResource(id); FileOutputStream resultfilestream = new FileOutputStream(resultfile); byte[] buf = new byte[1024]; int i = 0; while ((i = resourcestream.read(buf)) != -1) { resultfilestream.write(buf, 0, i); } } catch (Exception e) { Log.e(TAG, "Exception " + e.getMessage()); return false; } } return true; } private void showInfos() { SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); boolean firstStart = settings.getBoolean("firstStart", true); if (firstStart) { AlertDialog.Builder infobox = new AlertDialog.Builder(this); infobox.setTitle(getString(R.string.initial_info_box_title)); // TRANS infobox.setCancelable(false); final TextView message = new TextView(this); message.setFadingEdgeLength(20); message.setVerticalFadingEdgeEnabled(true); // message.setVerticalScrollBarEnabled(true); RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); message.setLayoutParams(rlp); final SpannableString s = new SpannableString(getString(R.string.initial_info_box_message)); // TRANS Linkify.addLinks(s, Linkify.WEB_URLS); message.setText(s); message.setMovementMethod(LinkMovementMethod.getInstance()); infobox.setView(message); // TRANS infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "Ok, user saw the infobox"); } }); // TRANS infobox.setNeutralButton(getString(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "user wants more info, show the website"); String url = "http://wiki.navit-project.org/index.php/Navit_on_Android"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); } }); infobox.show(); SharedPreferences.Editor edit_settings = settings.edit(); edit_settings.putBoolean("firstStart", false); edit_settings.commit(); } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dialogs = new NavitDialogs(this); NavitResources = getResources(); // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.) Navit.startup_intent = this.getIntent(); // hack! Remember time stamps, and only allow 4 secs. later in onResume to set target! Navit.startup_intent_timestamp = System.currentTimeMillis(); Log.e("Navit", "**1**A " + startup_intent.getAction()); Log.e("Navit", "**1**D " + startup_intent.getDataString()); // init translated text NavitTextTranslations.init(); // NOTIFICATION // Setup the status bar notification // This notification is removed in the exit() function NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager Notification NavitNotification = new Notification(R.drawable.icon, getString(R.string.notification_ticker), System.currentTimeMillis()); // Create a new notification, with the text string to show when the notification first appears PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); NavitNotification.setLatestEventInfo(getApplicationContext(), "Navit", getString(R.string.notification_event_default), appIntent); // Set the text in the notification NavitNotification.flags|=Notification.FLAG_ONGOING_EVENT; // Ensure that the notification appears in Ongoing nm.notify(R.string.app_name, NavitNotification); // Set the notification // get the local language ------------- Locale locale = java.util.Locale.getDefault(); String lang = locale.getLanguage(); String langu = lang; String langc = lang; Log.e("Navit", "lang=" + lang); int pos = langu.indexOf('_'); if (pos != -1) { langc = langu.substring(0, pos); NavitLanguage = langc + langu.substring(pos).toUpperCase(locale); Log.e("Navit", "substring lang " + NavitLanguage.substring(pos).toUpperCase(locale)); // set lang. for translation NavitTextTranslations.main_language = langc; NavitTextTranslations.sub_language = NavitLanguage.substring(pos).toUpperCase(locale); } else { String country = locale.getCountry(); Log.e("Navit", "Country1 " + country); Log.e("Navit", "Country2 " + country.toUpperCase(locale)); NavitLanguage = langc + "_" + country.toUpperCase(locale); // set lang. for translation NavitTextTranslations.main_language = langc; NavitTextTranslations.sub_language = country.toUpperCase(locale); } Log.e("Navit", "Language " + lang); // make sure the new path for the navitmap.bin file(s) exist!! File navit_maps_dir = new File(MAP_FILENAME_PATH); navit_maps_dir.mkdirs(); // make sure the share dir exists File navit_data_share_dir = new File(NAVIT_DATA_SHARE_DIR); navit_data_share_dir.mkdirs(); Display display_ = getWindowManager().getDefaultDisplay(); int width_ = display_.getWidth(); int height_ = display_.getHeight(); metrics = new DisplayMetrics(); display_.getMetrics(Navit.metrics); int densityDpi = (int)(( Navit.metrics.density*160)+.5f); Log.e("Navit", "Navit -> pixels x=" + width_ + " pixels y=" + height_); Log.e("Navit", "Navit -> dpi=" + densityDpi); Log.e("Navit", "Navit -> density=" + Navit.metrics.density); Log.e("Navit", "Navit -> scaledDensity=" + Navit.metrics.scaledDensity); ActivityResults = new NavitActivityResult[16]; setVolumeControlStream(AudioManager.STREAM_MUSIC); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen"); if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) { Log.e("Navit", "Failed to extract language resource " + langc); } if (densityDpi <= 120) { my_display_density = "ldpi"; } else if (densityDpi <= 160) { my_display_density = "mdpi"; } else if (densityDpi < 320) { my_display_density = "hdpi"; } else { Log.e("Navit", "found xhdpi device, this is not fully supported!!"); Log.e("Navit", "using hdpi values"); my_display_density = "hdpi"; } if (!extractRes("navit" + my_display_density, NAVIT_DATA_DIR + "/share/navit.xml")) { Log.e("Navit", "Failed to extract navit.xml for " + my_display_density); } // --> dont use android.os.Build.VERSION.SDK_INT, needs API >= 4 Log.e("Navit", "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, NAVIT_DATA_DIR+"/bin/navit"); showInfos(); Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); } @Override public void onResume() { super.onResume(); Log.e("Navit", "OnResume"); //InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // DEBUG // intent_data = "google.navigation:q=Wien Burggasse 27"; // intent_data = "google.navigation:q=48.25676,16.643"; // intent_data = "google.navigation:ll=48.25676,16.643&q=blabla-strasse"; // intent_data = "google.navigation:ll=48.25676,16.643"; if (startup_intent != null) { if (System.currentTimeMillis() <= Navit.startup_intent_timestamp + 4000L) { Log.e("Navit", "**2**A " + startup_intent.getAction()); Log.e("Navit", "**2**D " + startup_intent.getDataString()); String navi_scheme = startup_intent.getScheme(); if ( navi_scheme != null && navi_scheme.equals("google.navigation")) { parseNavigationURI(startup_intent.getData().getSchemeSpecificPart()); } } else { Log.e("Navit", "timestamp for navigate_to expired! not using data"); } } } private void parseNavigationURI(String schemeSpecificPart) { String naviData[]= schemeSpecificPart.split("&"); Pattern p = Pattern.compile("(.*)=(.*)"); Map params = new HashMap(); for (int count=0; count < naviData.length; count++) { Matcher m = p.matcher(naviData[count]); if (m.matches()) { params.put(m.group(1), m.group(2)); } } // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts) // a: google.navigation:ll=48.25676,16.643&q=blabla-strasse // c: google.navigation:ll=48.25676,16.643 // b: google.navigation:q=48.25676,16.643 Float lat; Float lon; Bundle b = new Bundle(); String geoString = params.get("ll"); if (geoString != null) { String address = params.get("q"); if (address != null) b.putString("q", address); } else { geoString = params.get("q"); } if ( geoString != null) { if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) { String geo[] = geoString.split(","); if (geo.length == 2) { try { lat = Float.valueOf(geo[0]); lon = Float.valueOf(geo[1]); b.putFloat("lat", lat); b.putFloat("lon", lon); Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); msg.setData(b); msg.sendToTarget(); Log.e("Navit", "target found (b): " + geoString); } catch (NumberFormatException e) { } // nothing to do here } } else { start_targetsearch_from_intent(geoString); } } } public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) { //Log.e("Navit", "setActivityResult " + requestCode); ActivityResults[requestCode] = ActivityResult; } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); //Log.e("Navit","onPrepareOptionsMenu"); // this gets called every time the menu is opened!! // change menu items here! menu.clear(); // group-id,item-id,sort order number menu.add(1, 1, 100, getString(R.string.optionsmenu_zoom_in)); //TRANS menu.add(1, 2, 200, getString(R.string.optionsmenu_zoom_out)); //TRANS menu.add(1, 3, 300, getString(R.string.optionsmenu_download_maps)); //TRANS menu.add(1, 5, 400, getString(R.string.optionsmenu_toggle_poi)); //TRANS menu.add(1, 6, 500, getString(R.string.optionsmenu_address_search)); //TRANS menu.add(1, 99, 900, getString(R.string.optionsmenu_exit_navit)); //TRANS /* Only show the Backup to SD-Card Option if we really have one */ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) menu.add(1, 7, 700, getString(R.string.optionsmenu_backup_restore)); //TRANS return true; } // define callback id here public static NavitGraphics N_NavitGraphics = null; // callback id gets set here when called from NavitGraphics public static void setKeypressCallback(int kp_cb_id, NavitGraphics ng) { //Log.e("Navit", "setKeypressCallback -> id1=" + kp_cb_id); //Log.e("Navit", "setKeypressCallback -> ng=" + String.valueOf(ng)); //N_KeypressCallbackID = kp_cb_id; N_NavitGraphics = ng; } public static void setMotionCallback(int mo_cb_id, NavitGraphics ng) { //Log.e("Navit", "setKeypressCallback -> id2=" + mo_cb_id); //Log.e("Navit", "setKeypressCallback -> ng=" + String.valueOf(ng)); //N_MotionCallbackID = mo_cb_id; N_NavitGraphics = ng; } public void start_targetsearch_from_intent(String target_address) { if (target_address == null || target_address.equals("")) { // empty search string entered Toast.makeText(getApplicationContext(), getString(R.string.address_search_not_found), Toast.LENGTH_LONG).show(); //TRANS } else { Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); search_intent.putExtra("search_string", target_address); this.startActivityForResult(search_intent, NavitAddressSearch_id); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case 1 : // zoom in Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_IN.ordinal()).sendToTarget(); // if we zoom, hide the bubble Log.e("Navit", "onOptionsItemSelected -> zoom in"); break; case 2 : // zoom out Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_OUT.ordinal()).sendToTarget(); // if we zoom, hide the bubble Log.e("Navit", "onOptionsItemSelected -> zoom out"); break; case 3 : // map download menu Intent map_download_list_activity = new Intent(this, NavitDownloadSelectMapActivity.class); startActivityForResult(map_download_list_activity, Navit.NavitDownloaderSelectMap_id); break; case 5 : // toggle the normal POI layers (to avoid double POIs) Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); Bundle b = new Bundle(); b.putString("cmd", "toggle_layer(\"POI Symbols\");"); msg.setData(b); msg.sendToTarget(); // toggle full POI icons on/off msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); b = new Bundle(); b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");"); msg.setData(b); msg.sendToTarget(); break; case 6 : // ok startup address search activity Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); this.startActivityForResult(search_intent, NavitAddressSearch_id); break; case 7 : /* Backup / Restore */ showDialog(NavitDialogs.DIALOG_BACKUP_RESTORE); break; case 99 : // exit this.onStop(); this.exit(); break; } return true; } void setDestination(float latitude, float longitude, String address) { Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + address, Toast.LENGTH_LONG).show(); //TRANS Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); Bundle b = new Bundle(); b.putFloat("lat", latitude); b.putFloat("lon", longitude); b.putString("q", address); msg.setData(b); msg.sendToTarget(); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Navit.NavitDownloaderSelectMap_id : if (resultCode == Activity.RESULT_OK) { Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD , data.getIntExtra("map_index", -1), 0); msg.sendToTarget(); } break; case NavitAddressSearch_id : if (resultCode == Activity.RESULT_OK) { Bundle destination = data.getExtras(); Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + destination.getString(("q")), Toast.LENGTH_LONG).show(); //TRANS Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); msg.setData(destination); msg.sendToTarget(); } break; default : //Log.e("Navit", "onActivityResult " + requestCode + " " + resultCode); ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); break; } } @Override protected void onPrepareDialog(int id, Dialog dialog) { dialogs.prepareDialog(id, dialog); super.onPrepareDialog(id, dialog); } protected Dialog onCreateDialog(int id) { return dialogs.createDialog(id); } @Override public void onDestroy() { super.onDestroy(); Log.e("Navit", "OnDestroy"); // TODO next call will kill our app the hard way. This should not be necessary, but ensures navit is // properly restarted and no resources are wasted with navit in background. Remove this call after // code review NavitDestroy(); } public void disableSuspend() { wl.acquire(); wl.release(); } public void exit() { NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.cancel(R.string.app_name); NavitVehicle.removeListener(); finish(); } public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path); public native void NavitDestroy(); /* * this is used to load the 'navit' native library on * application startup. The library has already been unpacked at * installation time by the package manager. */ static { System.loadLibrary("navit"); } } navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java000066400000000000000000000312121221777731700332440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Locale; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; public class NavitAddressSearchActivity extends Activity { public static final class NavitAddress { public NavitAddress(int type, float latitude, float longitude, String address) { result_type = type; lat = latitude; lon = longitude; addr = address; } int result_type; float lat; float lon; String addr; } private static final String TAG = "NavitAddress"; private static final int ADDRESS_RESULT_PROGRESS_MAX = 10; private List Addresses_found = null; private List addresses_shown = null; private String mAddressString = ""; private boolean mPartialSearch = false; private String mCountry; private ImageButton mCountryButton; ProgressDialog search_results_wait = null; public RelativeLayout NavitAddressSearchActivity_layout; private int search_results_towns = 0; private int search_results_streets = 0; private int search_results_streets_hn = 0; private long search_handle = 0; // TODO remember settings private static String last_address_search_string = ""; private static Boolean last_address_partial_match = false; private static String last_country = ""; private int getDrawableID(String resourceName) { int drawableId = 0; try { Class res = R.drawable.class; Field field = res.getField(resourceName); drawableId = field.getInt(null); } catch (Exception e) { Log.e("NavitAddressSearch", "Failure to get drawable id.", e); } return drawableId; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = getIntent().getExtras(); if ( extras != null ) { String search_string = extras.getString(("search_string")); if (search_string != null) { mPartialSearch = true; mAddressString = search_string; executeSearch(); return; } } mPartialSearch = last_address_partial_match; mAddressString = last_address_search_string; getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); LinearLayout panel = new LinearLayout(this); panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); panel.setOrientation(LinearLayout.VERTICAL); // address: label and text field SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); mCountry = settings.getString(("DefaultCountry") , null); if (mCountry == null) { Locale defaultLocale = Locale.getDefault(); mCountry = defaultLocale.getCountry().toLowerCase(defaultLocale); SharedPreferences.Editor edit_settings = settings.edit(); edit_settings.putString("DefaultCountry", mCountry); edit_settings.commit(); } mCountryButton = new ImageButton(this); mCountryButton.setImageResource(getDrawableID("country_" + mCountry)); mCountryButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { requestCountryDialog(); } }); // address: label and text field TextView addr_view = new TextView(this); addr_view.setText(Navit._("Enter Destination")); // TRANS addr_view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); addr_view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); addr_view.setPadding(4, 4, 4, 4); // partial match checkbox final CheckBox checkboxPartialMatch = new CheckBox(this); checkboxPartialMatch.setText(Navit._("partial match")); // TRANS checkboxPartialMatch.setChecked(last_address_partial_match); checkboxPartialMatch.setGravity(Gravity.CENTER); final EditText address_string = new EditText(this); address_string.setText(last_address_search_string); address_string.setSelectAllOnFocus(true); // search button final Button btnSearch = new Button(this); btnSearch.setText(Navit._("Search")); // TRANS btnSearch.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); btnSearch.setGravity(Gravity.CENTER); btnSearch.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPartialSearch = checkboxPartialMatch.isChecked(); mAddressString = address_string.getText().toString(); last_address_partial_match = mPartialSearch; last_address_search_string = mAddressString; executeSearch(); } }); ListView lastAddresses = new ListView(this); NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext(); final List addresses = navitConfig.getLastAddresses(); int addressCount = addresses.size(); if (addressCount > 0) { String[] strAddresses = new String[addressCount]; for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { strAddresses[addrIndex] = addresses.get(addrIndex).addr; } ArrayAdapter addressList = new ArrayAdapter(this, android.R.layout.simple_list_item_1, strAddresses); lastAddresses.setAdapter(addressList); lastAddresses.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { NavitAddress addressSelected = addresses.get(arg2); Intent resultIntent = new Intent(); resultIntent.putExtra("lat", addressSelected.lat); resultIntent.putExtra("lon", addressSelected.lon); resultIntent.putExtra("q", addressSelected.addr); setResult(Activity.RESULT_OK, resultIntent); finish(); } }); } String title = getString(R.string.address_search_title); if (title != null && title.length() > 0) this.setTitle(title); LinearLayout searchSettingsLayout = new LinearLayout(this); searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL); searchSettingsLayout.addView(mCountryButton); searchSettingsLayout.addView(checkboxPartialMatch); panel.addView(addr_view); panel.addView(address_string); panel.addView(searchSettingsLayout); panel.addView(btnSearch); panel.addView(lastAddresses); setContentView(panel); } private void requestCountryDialog() { final String[][] all_countries = NavitGraphics.GetAllCountries(); Comparator country_comperator = new Comparator() { public int compare(String[] object1, String[] object2) { return object1[1].compareTo(object2[1]); } }; Arrays.sort(all_countries, country_comperator); AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this); // ToDo also show icons and country code String[] country_name = new String[all_countries.length]; for (int country_index = 0; country_index < all_countries.length; country_index++) { country_name[country_index] = all_countries[country_index][1]; } mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); mCountry = all_countries[item][0]; SharedPreferences.Editor edit_settings = settings.edit(); edit_settings.putString("DefaultCountry", mCountry); edit_settings.commit(); mCountryButton.setImageResource(getDrawableID("country_" + mCountry)); } }); mapModeChooser.show(); } /** * start a search on the map */ public void receiveAddress(int type, float latitude, float longitude, String address) { Log.e(TAG, "(" + String.valueOf(latitude) + ", " + String.valueOf(longitude) + ") " + address); switch (type) { case 0: search_results_towns++; break; case 1: search_results_streets++; break; case 2: search_results_streets_hn++; break; } search_results_wait.setMessage(Navit._("Towns") + ":" + search_results_towns + " " + Navit._("Streets") + ":" + search_results_streets + "/" + search_results_streets_hn); search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); Addresses_found.add(new NavitAddress(type, latitude, longitude, address)); } public void finishAddressSearch() { if (Addresses_found.isEmpty()) { Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); //TRANS setResult(Activity.RESULT_CANCELED); finish(); } ListView addressesFound = new ListView(this); ArrayAdapter addressList = new ArrayAdapter(this, android.R.layout.simple_list_item_1); addresses_shown = new ArrayList(); for (NavitAddress currentAddress : Addresses_found) { if (currentAddress.result_type != 0 || search_results_streets == 0) { addressList.add(currentAddress.addr); addresses_shown.add(currentAddress); } } addressesFound.setAdapter(addressList); addressesFound.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { NavitAddress addressSelected = addresses_shown.get(arg2); Intent resultIntent = new Intent(); resultIntent.putExtra("lat", addressSelected.lat); resultIntent.putExtra("lon", addressSelected.lon); resultIntent.putExtra("q", addressSelected.addr); setResult(Activity.RESULT_OK, resultIntent); finish(); } }); setContentView(addressesFound); search_results_wait.dismiss(); } public native long CallbackStartAddressSearch(int partial_match, String country, String s); public native void CallbackCancelAddressSearch(long handle); @Override protected Dialog onCreateDialog(int id) { search_results_wait = new ProgressDialog(this); search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); search_results_wait.setTitle("Loading search results"); search_results_wait.setMessage("--"); search_results_wait.setCancelable(true); search_results_wait.setProgress(0); search_results_wait.setMax(10); Addresses_found = new ArrayList(); search_results_towns = 0; search_results_streets = 0; search_results_streets_hn = 0; search_handle = CallbackStartAddressSearch(mPartialSearch ? 1 : 0, mCountry, mAddressString); search_results_wait.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { CallbackCancelAddressSearch(search_handle); search_handle = 0; search_results_wait.dismiss(); } }); return search_results_wait; } void executeSearch() { showDialog(0); } } navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java000066400000000000000000000166521221777731700317510ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.RectF; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.MotionEvent; import android.widget.ImageView; public class NavitAndroidOverlay extends ImageView implements Runnable { public Boolean draw_bubble = false; public static Boolean confirmed_bubble = false; public static long bubble_max_showing_timespan = 8000L; // 8 secs. public static class NavitAndroidOverlayBubble { int x; int y; String text = null; } private NavitAndroidOverlayBubble bubble_001 = null; public NavitAndroidOverlay(Context context) { super(context); } public void show_bubble() { //Log.e("Navit", "NavitAndroidOverlay -> show_bubble"); if (!this.draw_bubble) { Handler handler = new Handler(); handler.postDelayed(this, bubble_max_showing_timespan); NavitAndroidOverlay.confirmed_bubble = false; this.draw_bubble = true; } } public Boolean get_show_bubble() { return this.draw_bubble; } public void hide_bubble() { confirmed_bubble = false; draw_bubble = false; Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_REDRAW.ordinal()); msg.sendToTarget(); postInvalidate(); } public void set_bubble(NavitAndroidOverlayBubble b) { this.bubble_001 = b; } @Override public boolean onTouchEvent(MotionEvent event) { //Log.e("Navit", "NavitAndroidOverlay -> onTouchEvent"); super.onTouchEvent(event); int x = (int) event.getX(); int y = (int) event.getY(); if ((this.draw_bubble) && (!NavitAndroidOverlay.confirmed_bubble)) { // bubble is showing, test if we touch it to confirm destination float draw_factor = 1.0f; if (Navit.my_display_density.compareTo("mdpi") == 0) { draw_factor = 1.0f; } else if (Navit.my_display_density.compareTo("ldpi") == 0) { draw_factor = 0.7f; } else if (Navit.my_display_density.compareTo("hdpi") == 0) { draw_factor = 1.5f; } int dx = (int) ((20 / 1.5f) * draw_factor); int dy = (int) ((-100 / 1.5f) * draw_factor); int bubble_size_x = (int) ((150 / 1.5f) * draw_factor); int bubble_size_y = (int) ((60 / 1.5f) * draw_factor); RectF box_rect = new RectF(this.bubble_001.x + dx, this.bubble_001.y + dy, this.bubble_001.x + bubble_size_x + dx, this.bubble_001.y + bubble_size_y + dy); if (box_rect.contains(x, y)) { // bubble touched to confirm destination NavitAndroidOverlay.confirmed_bubble = true; // draw confirmed bubble this.postInvalidate(); // set destination Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal()); Bundle b = new Bundle(); b.putInt("x", this.bubble_001.x); b.putInt("y", this.bubble_001.y); msg.setData(b); msg.sendToTarget(); // consume the event return true; } } // false -> we dont use this event, give it to other layers return false; } public void onDraw(Canvas c) { //Log.e("Navit", "NavitAndroidOverlay -> onDraw"); float draw_factor = 1.0f; if (Navit.my_display_density.compareTo("mdpi") == 0) { draw_factor = 1.0f; } else if (Navit.my_display_density.compareTo("ldpi") == 0) { draw_factor = 0.7f; } else if (Navit.my_display_density.compareTo("hdpi") == 0) { draw_factor = 1.5f; } if (this.draw_bubble) { //Log.e("Navit", "NavitAndroidOverlay -> onDraw -> bubble"); int dx = (int) ((20 / 1.5f) * draw_factor); int dy = (int) ((-100 / 1.5f) * draw_factor); Paint bubble_paint = new Paint(0); int bubble_size_x = (int) ((150 / 1.5f) * draw_factor); int bubble_size_y = (int) ((60 / 1.5f) * draw_factor); // yellow-ish funny lines int lx = (int) ((15 / 1.5f) * draw_factor); int ly = (int) ((15 / 1.5f) * draw_factor); bubble_paint.setStyle(Style.FILL); bubble_paint.setAntiAlias(true); bubble_paint.setStrokeWidth(8 / 1.5f * draw_factor); bubble_paint.setColor(Color.parseColor("#FFF8C6")); c.drawLine(this.bubble_001.x + dx, this.bubble_001.y + dy + bubble_size_y - ly, this.bubble_001.x, this.bubble_001.y, bubble_paint); c.drawLine(this.bubble_001.x + dx + lx, this.bubble_001.y + dy + bubble_size_y, this.bubble_001.x, this.bubble_001.y, bubble_paint); // draw black funny lines to target bubble_paint.setStyle(Style.STROKE); bubble_paint.setAntiAlias(true); bubble_paint.setStrokeWidth(3); bubble_paint.setColor(Color.parseColor("#000000")); c.drawLine(this.bubble_001.x + dx, this.bubble_001.y + dy + bubble_size_y - ly, this.bubble_001.x, this.bubble_001.y, bubble_paint); c.drawLine(this.bubble_001.x + dx + lx, this.bubble_001.y + dy + bubble_size_y, this.bubble_001.x, this.bubble_001.y, bubble_paint); // filled rect yellow-ish bubble_paint.setStyle(Style.FILL); bubble_paint.setStrokeWidth(0); bubble_paint.setAntiAlias(false); bubble_paint.setColor(Color.parseColor("#FFF8C6")); RectF box_rect = new RectF(this.bubble_001.x + dx, this.bubble_001.y + dy, this.bubble_001.x + bubble_size_x + dx, this.bubble_001.y + bubble_size_y + dy); int rx = (int) (20 / 1.5f * draw_factor); int ry = (int) (20 / 1.5f * draw_factor); c.drawRoundRect(box_rect, rx, ry, bubble_paint); if (NavitAndroidOverlay.confirmed_bubble) { // filled red rect (for confirmed bubble) //bubble_paint.setStyle(Style.FILL); //bubble_paint.setStrokeWidth(0); //bubble_paint.setAntiAlias(false); bubble_paint.setColor(Color.parseColor("#EC294D")); c.drawRoundRect(box_rect, rx, ry, bubble_paint); } // black outlined rect bubble_paint.setStyle(Style.STROKE); bubble_paint.setStrokeWidth(3); bubble_paint.setAntiAlias(true); bubble_paint.setColor(Color.parseColor("#000000")); c.drawRoundRect(box_rect, rx, ry, bubble_paint); int inner_dx = (int) (30 / 1.5f * draw_factor); int inner_dy = (int) (36 / 1.5f * draw_factor); bubble_paint.setAntiAlias(true); bubble_paint.setStyle(Style.FILL); bubble_paint.setTextSize((int) (20 / 1.5f * draw_factor)); bubble_paint.setStrokeWidth(3); bubble_paint.setColor(Color.parseColor("#3b3131")); c.drawText(Navit._("Route to here"), this.bubble_001.x + dx + inner_dx, this.bubble_001.y + dy + inner_dy, bubble_paint); } } public void run() { hide_bubble(); } } navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/NavitDialogs.java000066400000000000000000000164551221777731700304120ustar00rootroot00000000000000package org.navitproject.navit; import java.io.File; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.Toast; import android.os.Environment; public class NavitDialogs extends Handler{ // Dialogs public static final int DIALOG_MAPDOWNLOAD = 1; public static final int DIALOG_BACKUP_RESTORE = 2; public static final int DIALOG_SELECT_BACKUP = 3; // dialog messages static final int MSG_MAP_DOWNLOAD_FINISHED = 0; static final int MSG_PROGRESS_BAR = 1; static final int MSG_TOAST = 2; static final int MSG_TOAST_LONG = 3; static final int MSG_POSITION_MENU = 6; static final int MSG_START_MAP_DOWNLOAD = 7; static final int MSG_REMOVE_DIALOG_GENERIC = 99; static Handler mHandler; private ProgressDialog mapdownloader_dialog = null; private NavitMapDownloader mapdownloader = null; private Navit mActivity; public NavitDialogs(Navit activity) { super(); mActivity = activity; mHandler = this; } static public void sendDialogMessage(int what, String title, String text, int dialog_num, int value1, int value2) { Message msg = mHandler.obtainMessage(what); Bundle data = new Bundle(); data.putString("title", title); data.putString("text", text); data.putInt("value1", value1); data.putInt("value2", value2); data.putInt("dialog_num", dialog_num); msg.setData(data); mHandler.sendMessage(msg); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_MAP_DOWNLOAD_FINISHED : { // dismiss dialog, remove dialog mActivity.dismissDialog(DIALOG_MAPDOWNLOAD); mActivity.removeDialog(DIALOG_MAPDOWNLOAD); if (msg.getData().getInt("value1") == 1) { Message activate_map_msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_LOAD_MAP.ordinal()); activate_map_msg.setData(msg.getData()); activate_map_msg.sendToTarget(); } break; } case MSG_PROGRESS_BAR : // change progressbar values mapdownloader_dialog.setMax(msg.getData().getInt("value1")); mapdownloader_dialog.setProgress(msg.getData().getInt("value2")); mapdownloader_dialog.setTitle(msg.getData().getString(("title"))); mapdownloader_dialog.setMessage(msg.getData().getString(("text"))); break; case MSG_TOAST : Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_SHORT).show(); break; case MSG_TOAST_LONG : Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_LONG).show(); break; case MSG_START_MAP_DOWNLOAD: { int download_map_id = msg.arg1; Log.d("Navit", "PRI id=" + download_map_id); // set map id to download // show the map download progressbar, and download the map if (download_map_id > -1) { mapdownloader = new NavitMapDownloader(download_map_id); mActivity.showDialog(NavitDialogs.DIALOG_MAPDOWNLOAD); mapdownloader.start(); } } break; case MSG_REMOVE_DIALOG_GENERIC : // dismiss dialog, remove dialog - generic mActivity.dismissDialog(msg.getData().getInt("dialog_num")); mActivity.removeDialog(msg.getData().getInt("dialog_num")); break; } } Dialog createDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); switch (id) { case DIALOG_MAPDOWNLOAD : mapdownloader_dialog = new ProgressDialog(mActivity); mapdownloader_dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mapdownloader_dialog.setTitle("--"); mapdownloader_dialog.setMessage("--"); mapdownloader_dialog.setCancelable(true); mapdownloader_dialog.setProgress(0); mapdownloader_dialog.setMax(200); DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() { public void onDismiss(DialogInterface dialog) { Log.e("Navit", "onDismiss: mapdownloader_dialog"); mapdownloader.stop_thread(); } }; mapdownloader_dialog.setOnDismissListener(onDismissListener); // show license for OSM maps Toast.makeText(mActivity.getApplicationContext(), Navit._("Map data (c) OpenStreetMap contributors, ODBL"), Toast.LENGTH_LONG).show(); //TRANS return mapdownloader_dialog; case DIALOG_BACKUP_RESTORE : /* Create a Dialog that Displays Options wether to Backup or Restore */ builder.setTitle(mActivity.getString(R.string.choose_an_action)). setCancelable(true). setItems(R.array.dialog_backup_restore_items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /* Notify User if no SD Card present */ if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) Toast.makeText(mActivity,mActivity.getString(R.string.please_insert_an_sd_card), Toast.LENGTH_LONG).show(); switch (which) { case 0: /* Backup */ new NavitBackupTask(mActivity).execute(); break; case 1: /* Restore */ mActivity.showDialog(DIALOG_SELECT_BACKUP); break; } }}); return builder.create(); case DIALOG_SELECT_BACKUP : /* Create a Dialog with a list from which the user selects the Backup to be restored */ File mainBackupDir = new File(Environment.getExternalStorageDirectory().getPath() + "/navit/backup/"); String[] backups = null; if(mainBackupDir.isDirectory()) backups = mainBackupDir.list(); if(backups == null || backups.length == 0) { /* No Backups were found */ builder.setTitle(mActivity.getText(R.string.no_backup_found)); builder.setNegativeButton(mActivity.getText(android.R.string.cancel), null); return builder.create(); } builder.setTitle(mActivity.getString(R.string.select_backup)); final ArrayAdapter adapter = new ArrayAdapter(mActivity, android.R.layout.simple_spinner_item, backups); builder.setAdapter(adapter, new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { new NavitRestoreTask(mActivity, adapter.getItem(which)).execute(); }}); builder.setNegativeButton(mActivity.getString(android.R.string.cancel), null); return builder.create(); } // should never get here!! return null; } public void prepareDialog(int id, Dialog dialog) { /* Remove the Dialog to force Android to rerun onCreateDialog */ if(id == DIALOG_SELECT_BACKUP) mActivity.removeDialog(id); } } NavitDownloadSelectMapActivity.java000066400000000000000000000223141221777731700340220ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.ExpandableListActivity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Message; import android.os.StatFs; import android.util.Log; import android.view.View; import android.widget.ExpandableListView; import android.widget.RelativeLayout; import android.widget.SimpleExpandableListAdapter; import android.widget.TextView; public class NavitDownloadSelectMapActivity extends ExpandableListActivity { private static SimpleExpandableListAdapter adapter = null; private static final String MAP_BULLETPOINT = " * "; private static ArrayList> downloaded_maps_childs = null; private static ArrayList> maps_current_position_childs = null; private static boolean currentLocationKnown = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (adapter == null) { adapter = createAdapter(); } updateDownloadedMaps(); updateMapsForLocation(NavitMapDownloader.osm_maps); setListAdapter(adapter); setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available"); } protected long getFreeSpace() { StatFs fsInfo = new StatFs(NavitMapDownloader.MAP_FILENAME_PATH); return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); } private void updateDownloadedMaps() { downloaded_maps_childs.clear(); for (NavitMap map : NavitMapDownloader.getAvailableMaps()) { HashMap child = new HashMap(); child.put("map_name", map.mapName + " " + (map.size() / 1024 / 1024) + "MB"); child.put("map_location", map.getLocation()); downloaded_maps_childs.add(child); } } private void updateMapsForLocation(NavitMapDownloader.osm_map_values osm_maps[]) { Location currentLocation = NavitVehicle.lastLocation; if (maps_current_position_childs.size() == 0 || (currentLocation != null && !currentLocationKnown)) { if (currentLocation == null) { LocationManager mapLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); List providers = mapLocationManager.getProviders(true); long lastUpdate = 0; long bestUpdateTime = -1; for (String provider : providers) { Location lastKnownLocation = mapLocationManager.getLastKnownLocation(provider); if (lastKnownLocation != null) { lastUpdate = lastKnownLocation.getTime(); if (lastUpdate > bestUpdateTime) { currentLocation = lastKnownLocation; bestUpdateTime = lastUpdate; } } } } else currentLocationKnown = true; if (currentLocation != null) { // if this map contains data to our current position, add it to // the // MapsOfCurrentLocation-list for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { if (osm_maps[currentMapIndex].isInMap(currentLocation)) { HashMap currentPositionMapChild = new HashMap(); currentPositionMapChild.put("map_name", osm_maps[currentMapIndex].map_name + " " + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex)); maps_current_position_childs.add(currentPositionMapChild); } } } } } private SimpleExpandableListAdapter createAdapter() { NavitMapDownloader.osm_map_values osm_maps[] = NavitMapDownloader.osm_maps; ArrayList> resultGroups = new ArrayList>(); ArrayList>> resultChilds = new ArrayList>>(); // add already downloaded maps (group and empty child list HashMap downloaded_maps_hash = new HashMap(); downloaded_maps_hash.put("category_name", Navit._("Downloaded maps")); resultGroups.add(downloaded_maps_hash); downloaded_maps_childs = new ArrayList>(); resultChilds.add(downloaded_maps_childs); ArrayList> secList = new ArrayList>(); maps_current_position_childs = new ArrayList>(); // maps containing the current location HashMap matching_maps = new HashMap(); matching_maps.put("category_name", Navit.NavitResources.getString(R.string.maps_for_current_location)); resultGroups.add(matching_maps); resultChilds.add(maps_current_position_childs); // add all maps for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { if (osm_maps[currentMapIndex].level == 0) { if (secList != null && secList.size() > 0) { resultChilds.add(secList); } secList = new ArrayList>(); HashMap map_info_hash = new HashMap(); map_info_hash.put("category_name", osm_maps[currentMapIndex].map_name); resultGroups.add(map_info_hash); } HashMap child = new HashMap(); child.put("map_name", (osm_maps[currentMapIndex].level > 1 ? MAP_BULLETPOINT : "") + osm_maps[currentMapIndex].map_name + " " + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); child.put("map_index", String.valueOf(currentMapIndex)); secList.add(child); } resultChilds.add(secList); return new SimpleExpandableListAdapter(this, resultGroups, android.R.layout.simple_expandable_list_item_1, new String[] { "category_name" }, new int[] { android.R.id.text1 }, resultChilds, android.R.layout.simple_expandable_list_item_1, new String[] { "map_name" }, new int[] { android.R.id.text1 }); } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { super.onChildClick(parent, v, groupPosition, childPosition, id); Log.d("Navit", "p:" + groupPosition + ", child_pos:" + childPosition); @SuppressWarnings("unchecked") HashMap child = (HashMap) adapter.getChild(groupPosition, childPosition); String map_index = child.get("map_index"); if (map_index != null) { Intent resultIntent = new Intent(); resultIntent.putExtra("map_index", Integer.parseInt(map_index)); setResult(Activity.RESULT_OK, resultIntent); finish(); } else { // ask user if to delete this map askForMapDeletion(child.get("map_location")); } return true; } private void askForMapDeletion(final String map_location) { AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this); deleteMapBox.setTitle(getString(R.string.map_delete)); // TRANS deleteMapBox.setCancelable(true); final TextView message = new TextView(this); message.setFadingEdgeLength(20); message.setVerticalFadingEdgeEnabled(true); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); message.setLayoutParams(layoutParams); NavitMap maptoDelete = new NavitMap(map_location); message.setText(maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + "MB"); deleteMapBox.setView(message); // TRANS deleteMapBox.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "Delete Map"); Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); Bundle b = new Bundle(); b.putString("title", map_location); msg.setData(b); msg.sendToTarget(); finish(); } }); // TRANS deleteMapBox.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "don't delete map"); } }); deleteMapBox.show(); } } navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/NavitGraphics.java000066400000000000000000000620271221777731700305640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.Message; import android.util.FloatMath; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.RelativeLayout; public class NavitGraphics { private NavitGraphics parent_graphics; private ArrayList overlays = new ArrayList(); int bitmap_w; int bitmap_h; int pos_x; int pos_y; int pos_wraparound; int overlay_disabled; float trackball_x, trackball_y; View view; RelativeLayout relativelayout; NavitCamera camera; Activity activity; public static Boolean in_map = false; // for menu key private static long time_for_long_press = 300L; private static long interval_for_long_press = 200L; private Handler timer_handler = new Handler(); public void SetCamera(int use_camera) { if (use_camera != 0 && camera == null) { // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); camera = new NavitCamera(activity); relativelayout.addView(camera); relativelayout.bringChildToFront(view); } } protected Rect get_rect() { Rect ret=new Rect(); ret.left=pos_x; ret.top=pos_y; if (pos_wraparound != 0) { if (ret.left < 0) { ret.left+=parent_graphics.bitmap_w; } if (ret.top < 0) { ret.top+=parent_graphics.bitmap_h; } } ret.right=ret.left+bitmap_w; ret.bottom=ret.top+bitmap_h; if (pos_wraparound != 0) { if (bitmap_w < 0) { ret.right=ret.left+bitmap_w+parent_graphics.bitmap_w; } if (bitmap_h < 0) { ret.bottom=ret.top+bitmap_h+parent_graphics.bitmap_h; } } return ret; } private class NavitView extends View implements Runnable, MenuItem.OnMenuItemClickListener{ int touch_mode = NONE; float oldDist = 0; static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; static final int PRESSED = 3; Method eventGetX = null; Method eventGetY = null; public PointF mPressedPosition = null; public NavitView(Context context) { super(context); try { eventGetX = android.view.MotionEvent.class.getMethod("getX", int.class); eventGetY = android.view.MotionEvent.class.getMethod("getY", int.class); } catch (Exception e) { Log.e("NavitGraphics", "Multitouch zoom not supported"); } } @Override protected void onCreateContextMenu(ContextMenu menu) { super.onCreateContextMenu(menu); menu.setHeaderTitle("Position..."); menu.add(1, 1, NONE, Navit._("Route to here")).setOnMenuItemClickListener(this); // menu.add(1, 2, NONE, Navit._("Add to contacts")).setOnMenuItemClickListener(this); } public boolean onMenuItemClick(MenuItem item) { switch(item.getItemId()) { case 1: Message msg = Message.obtain(callback_handler, msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal() , (int)mPressedPosition.x, (int)mPressedPosition.y); msg.sendToTarget(); break; case 2: break; } return false; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(draw_bitmap, pos_x, pos_y, null); if (overlay_disabled == 0) { //Log.e("NavitGraphics", "view -> onDraw 1"); // assume we ARE in map view mode! in_map = true; Object overlays_array[]; overlays_array = overlays.toArray(); for (Object overlay : overlays_array) { //Log.e("NavitGraphics","view -> onDraw 2"); NavitGraphics overlay_graphics = (NavitGraphics) overlay; if (overlay_graphics.overlay_disabled == 0) { //Log.e("NavitGraphics","view -> onDraw 3"); Rect r=overlay_graphics.get_rect(); canvas.drawBitmap(overlay_graphics.draw_bitmap, r.left, r.top, null); } } } else { if (Navit.show_soft_keyboard) { if (Navit.mgr != null) { //Log.e("NavitGraphics", "view -> SHOW SoftInput"); //Log.e("NavitGraphics", "view mgr=" + String.valueOf(Navit.mgr)); Navit.mgr.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); Navit.show_soft_keyboard_now_showing = true; // clear the variable now, keyboard will stay on screen until backbutton pressed Navit.show_soft_keyboard = false; } } } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Log.e("Navit", "NavitGraphics -> onSizeChanged pixels x=" + w + " pixels y=" + h); Log.e("Navit", "NavitGraphics -> onSizeChanged density=" + Navit.metrics.density); Log.e("Navit", "NavitGraphics -> onSizeChanged scaledDensity=" + Navit.metrics.scaledDensity); super.onSizeChanged(w, h, oldw, oldh); draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); draw_canvas = new Canvas(draw_bitmap); bitmap_w = w; bitmap_h = h; SizeChangedCallback(SizeChangedCallbackID, w, h); } public void do_longpress_action() { Log.e("NavitGraphics", "do_longpress_action enter"); activity.openContextMenu(this); } private int getActionField(String fieldname, Object obj) { int ret_value = -999; try { java.lang.reflect.Field field = android.view.MotionEvent.class.getField(fieldname); try { ret_value = field.getInt(obj); } catch (Exception e) { e.printStackTrace(); } } catch (NoSuchFieldException ex) {} return ret_value; } @Override public boolean onTouchEvent(MotionEvent event) { //Log.e("NavitGraphics", "onTouchEvent"); super.onTouchEvent(event); int x = (int) event.getX(); int y = (int) event.getY(); int _ACTION_POINTER_UP_ = getActionField("ACTION_POINTER_UP", event); int _ACTION_POINTER_DOWN_ = getActionField("ACTION_POINTER_DOWN", event); int _ACTION_MASK_ = getActionField("ACTION_MASK", event); int switch_value = event.getAction(); if (_ACTION_MASK_ != -999) { switch_value = (event.getAction() & _ACTION_MASK_); } if (switch_value == MotionEvent.ACTION_DOWN) { touch_mode = PRESSED; if (!in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down mPressedPosition = new PointF(x, y); postDelayed(this, time_for_long_press); } else if ((switch_value == MotionEvent.ACTION_UP) || (switch_value == _ACTION_POINTER_UP_)) { Log.e("NavitGraphics", "ACTION_UP"); if ( touch_mode == DRAG ) { Log.e("NavitGraphics", "onTouch move"); MotionCallback(MotionCallbackID, x, y); ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up } else if (touch_mode == ZOOM) { //Log.e("NavitGraphics", "onTouch zoom"); float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); float scale = 0; if (newDist > 10f) { scale = newDist / oldDist; } if (scale > 1.3) { // zoom in CallbackMessageChannel(1, null); //Log.e("NavitGraphics", "onTouch zoom in"); } else if (scale < 0.8) { // zoom out CallbackMessageChannel(2, null); //Log.e("NavitGraphics", "onTouch zoom out"); } } else if (touch_mode == PRESSED) { if (in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up } touch_mode = NONE; } else if (switch_value == MotionEvent.ACTION_MOVE) { //Log.e("NavitGraphics", "ACTION_MOVE"); if (touch_mode == DRAG) { MotionCallback(MotionCallbackID, x, y); } else if (touch_mode == ZOOM) { float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); float scale = newDist / oldDist; Log.e("NavitGraphics", "New scale = " + scale); if (scale > 1.2) { // zoom in CallbackMessageChannel(1, ""); oldDist = newDist; //Log.e("NavitGraphics", "onTouch zoom in"); } else if (scale < 0.8) { oldDist = newDist; // zoom out CallbackMessageChannel(2, ""); //Log.e("NavitGraphics", "onTouch zoom out"); } } else if (touch_mode == PRESSED) { Log.e("NavitGraphics", "Start drag mode"); if ( spacing(mPressedPosition, new PointF(event.getX(), event.getY())) > 20f) { ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down touch_mode = DRAG; } } } else if (switch_value == _ACTION_POINTER_DOWN_) { //Log.e("NavitGraphics", "ACTION_POINTER_DOWN"); oldDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); if (oldDist > 2f) { touch_mode = ZOOM; //Log.e("NavitGraphics", "--> zoom"); } } return true; } private float spacing(PointF a, PointF b) { float x = a.x - b.x; float y = a.y - b.y; return FloatMath.sqrt(x * x + y * y); } private PointF getFloatValue(Object instance, Object argument) { PointF pos = new PointF(0,0); if (eventGetX != null && eventGetY != null) { try { Float x = (java.lang.Float) eventGetX.invoke(instance, argument); Float y = (java.lang.Float) eventGetY.invoke(instance, argument); pos.set(x.floatValue(), y.floatValue()); } catch (Exception e){} } return pos; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { int i; String s = null; boolean handled = true; i = event.getUnicodeChar(); //Log.e("NavitGraphics", "onKeyDown " + keyCode + " " + i); // Log.e("NavitGraphics","Unicode "+event.getUnicodeChar()); if (i == 0) { if (keyCode == android.view.KeyEvent.KEYCODE_DEL) { s = java.lang.String.valueOf((char) 8); } else if (keyCode == android.view.KeyEvent.KEYCODE_MENU) { if (!in_map) { // if last menukeypress is less than 0.2 seconds away then count longpress if ((System.currentTimeMillis() - Navit.last_pressed_menu_key) < interval_for_long_press) { Navit.time_pressed_menu_key = Navit.time_pressed_menu_key + (System.currentTimeMillis() - Navit.last_pressed_menu_key); //Log.e("NavitGraphics", "press time=" + Navit.time_pressed_menu_key); // on long press let softkeyboard popup if (Navit.time_pressed_menu_key > time_for_long_press) { //Log.e("NavitGraphics", "long press menu key!!"); Navit.show_soft_keyboard = true; Navit.time_pressed_menu_key = 0L; // need to draw to get the keyboard showing this.postInvalidate(); } } else { Navit.time_pressed_menu_key = 0L; } Navit.last_pressed_menu_key = System.currentTimeMillis(); // if in menu view: // use as OK (Enter) key s = java.lang.String.valueOf((char) 13); handled = true; // dont use menu key here (use it in onKeyUp) return handled; } else { // if on map view: // volume UP //s = java.lang.String.valueOf((char) 1); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_SEARCH) { s = java.lang.String.valueOf((char) 19); } else if (keyCode == android.view.KeyEvent.KEYCODE_BACK) { //Log.e("NavitGraphics", "KEYCODE_BACK down"); s = java.lang.String.valueOf((char) 27); } else if (keyCode == android.view.KeyEvent.KEYCODE_CALL) { s = java.lang.String.valueOf((char) 3); } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_UP) { if (!in_map) { // if in menu view: // use as UP key s = java.lang.String.valueOf((char) 16); handled = true; } else { // if on map view: // volume UP //s = java.lang.String.valueOf((char) 21); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_DOWN) { if (!in_map) { // if in menu view: // use as DOWN key s = java.lang.String.valueOf((char) 14); handled = true; } else { // if on map view: // volume DOWN //s = java.lang.String.valueOf((char) 4); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_CENTER) { s = java.lang.String.valueOf((char) 13); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_DOWN) { s = java.lang.String.valueOf((char) 16); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_LEFT) { s = java.lang.String.valueOf((char) 2); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_RIGHT) { s = java.lang.String.valueOf((char) 6); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_UP) { s = java.lang.String.valueOf((char) 14); } } else if (i == 10) { s = java.lang.String.valueOf((char) 13); } if (s != null) { KeypressCallback(KeypressCallbackID, s); } return handled; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { //Log.e("NavitGraphics", "onKeyUp " + keyCode); int i; String s = null; boolean handled = true; i = event.getUnicodeChar(); if (i == 0) { if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_UP) { if (!in_map) { //s = java.lang.String.valueOf((char) 16); handled = true; return handled; } else { //s = java.lang.String.valueOf((char) 21); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_DOWN) { if (!in_map) { //s = java.lang.String.valueOf((char) 14); handled = true; return handled; } else { //s = java.lang.String.valueOf((char) 4); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_BACK) { if (Navit.show_soft_keyboard_now_showing) { Navit.show_soft_keyboard_now_showing = false; } //Log.e("NavitGraphics", "KEYCODE_BACK up"); //s = java.lang.String.valueOf((char) 27); handled = true; return handled; } else if (keyCode == android.view.KeyEvent.KEYCODE_MENU) { if (!in_map) { if (Navit.show_soft_keyboard_now_showing) { // if soft keyboard showing on screen, dont use menu button as select key } else { // if in menu view: // use as OK (Enter) key s = java.lang.String.valueOf((char) 13); handled = true; } } else { // if on map view: // volume UP //s = java.lang.String.valueOf((char) 1); handled = false; return handled; } } } else if(i!=10) { s = java.lang.String.valueOf((char) i); } if (s != null) { KeypressCallback(KeypressCallbackID, s); } return handled; } @Override public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) { String s = null; if(keyCode == KeyEvent.KEYCODE_UNKNOWN) { s=event.getCharacters(); KeypressCallback(KeypressCallbackID, s); return true; } return super.onKeyMultiple(keyCode, count, event); } @Override public boolean onTrackballEvent(MotionEvent event) { //Log.e("NavitGraphics", "onTrackball " + event.getAction() + " " + event.getX() + " " // + event.getY()); String s = null; if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) { s = java.lang.String.valueOf((char) 13); } if (event.getAction() == android.view.MotionEvent.ACTION_MOVE) { trackball_x += event.getX(); trackball_y += event.getY(); //Log.e("NavitGraphics", "trackball " + trackball_x + " " + trackball_y); if (trackball_x <= -1) { s = java.lang.String.valueOf((char) 2); trackball_x += 1; } if (trackball_x >= 1) { s = java.lang.String.valueOf((char) 6); trackball_x -= 1; } if (trackball_y <= -1) { s = java.lang.String.valueOf((char) 16); trackball_y += 1; } if (trackball_y >= 1) { s = java.lang.String.valueOf((char) 14); trackball_y -= 1; } } if (s != null) { KeypressCallback(KeypressCallbackID, s); } return true; } @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); //Log.e("NavitGraphics", "FocusChange " + gainFocus); } public void run() { if (in_map && touch_mode == PRESSED) { do_longpress_action(); touch_mode = NONE; } } } public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, int alpha, int wraparound, int use_camera) { if (parent == null) { this.activity = activity; view = new NavitView(activity); //activity.registerForContextMenu(view); view.setClickable(false); view.setFocusable(true); view.setFocusableInTouchMode(true); view.setKeepScreenOn(true); relativelayout = new RelativeLayout(activity); if (use_camera != 0) { SetCamera(use_camera); } relativelayout.addView(view); activity.setContentView(relativelayout); view.requestFocus(); } else { draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmap_w = w; bitmap_h = h; pos_x = x; pos_y = y; pos_wraparound = wraparound; draw_canvas = new Canvas(draw_bitmap); parent.overlays.add(this); } parent_graphics = parent; } static public enum msg_type { CLB_ZOOM_IN, CLB_ZOOM_OUT, CLB_REDRAW, CLB_MOVE, CLB_BUTTON_UP, CLB_BUTTON_DOWN, CLB_SET_DESTINATION , CLB_SET_DISPLAY_DESTINATION, CLB_CALL_CMD, CLB_COUNTRY_CHOOSER, CLB_LOAD_MAP, CLB_UNLOAD_MAP, CLB_DELETE_MAP }; static public msg_type[] msg_values = msg_type.values(); public Handler callback_handler = new Handler() { public void handleMessage(Message msg) { switch (msg_values[msg.what]) { case CLB_ZOOM_IN: CallbackMessageChannel(1, ""); break; case CLB_ZOOM_OUT: CallbackMessageChannel(2, ""); break; case CLB_MOVE: MotionCallback(MotionCallbackID, msg.getData().getInt("x"), msg.getData().getInt("y")); break; case CLB_SET_DESTINATION: String lat = Float.toString(msg.getData().getFloat("lat")); String lon = Float.toString(msg.getData().getFloat("lon")); String q = msg.getData().getString(("q")); CallbackMessageChannel(3, lat + "#" + lon + "#" + q); break; case CLB_SET_DISPLAY_DESTINATION: int x = msg.arg1; int y = msg.arg2; CallbackMessageChannel(4, "" + x + "#" + y); break; case CLB_CALL_CMD: String cmd = msg.getData().getString(("cmd")); CallbackMessageChannel(5, cmd); break; case CLB_BUTTON_UP: ButtonCallback(ButtonCallbackID, 0, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // up break; case CLB_BUTTON_DOWN: ButtonCallback(ButtonCallbackID, 1, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // down break; case CLB_COUNTRY_CHOOSER: break; case CLB_LOAD_MAP: CallbackMessageChannel(6, msg.getData().getString(("title"))); break; case CLB_DELETE_MAP: File toDelete = new File( msg.getData().getString(("title"))); toDelete.delete(); //fallthrough case CLB_UNLOAD_MAP: CallbackMessageChannel(7, msg.getData().getString(("title"))); break; } } }; public native void SizeChangedCallback(int id, int x, int y); public native void KeypressCallback(int id, String s); public native int CallbackMessageChannel(int i, String s); public native void ButtonCallback(int id, int pressed, int button, int x, int y); public native void MotionCallback(int id, int x, int y); public native String GetDefaultCountry(int id, String s); public static native String[][] GetAllCountries(); private Canvas draw_canvas; private Bitmap draw_bitmap; private int SizeChangedCallbackID, ButtonCallbackID, MotionCallbackID, KeypressCallbackID; // private int count; public void setSizeChangedCallback(int id) { SizeChangedCallbackID = id; } public void setButtonCallback(int id) { ButtonCallbackID = id; } public void setMotionCallback(int id) { MotionCallbackID = id; Navit.setMotionCallback(id, this); } public void setKeypressCallback(int id) { KeypressCallbackID = id; // set callback id also in main intent (for menus) Navit.setKeypressCallback(id, this); } protected void draw_polyline(Paint paint, int c[]) { // Log.e("NavitGraphics","draw_polyline"); paint.setStyle(Paint.Style.STROKE); //paint.setAntiAlias(true); //paint.setStrokeWidth(0); Path path = new Path(); path.moveTo(c[0], c[1]); for (int i = 2; i < c.length; i += 2) { path.lineTo(c[i], c[i + 1]); } //global_path.close(); draw_canvas.drawPath(path, paint); } protected void draw_polygon(Paint paint, int c[]) { //Log.e("NavitGraphics","draw_polygon"); paint.setStyle(Paint.Style.FILL); //paint.setAntiAlias(true); //paint.setStrokeWidth(0); Path path = new Path(); path.moveTo(c[0], c[1]); for (int i = 2; i < c.length; i += 2) { path.lineTo(c[i], c[i + 1]); } //global_path.close(); draw_canvas.drawPath(path, paint); } protected void draw_rectangle(Paint paint, int x, int y, int w, int h) { //Log.e("NavitGraphics","draw_rectangle"); Rect r = new Rect(x, y, x + w, y + h); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); //paint.setStrokeWidth(0); draw_canvas.drawRect(r, paint); } protected void draw_circle(Paint paint, int x, int y, int r) { //Log.e("NavitGraphics","draw_circle"); // float fx = x; // float fy = y; // float fr = r / 2; paint.setStyle(Paint.Style.STROKE); draw_canvas.drawCircle(x, y, r / 2, paint); } protected void draw_text(Paint paint, int x, int y, String text, int size, int dx, int dy) { // float fx = x; // float fy = y; //Log.e("NavitGraphics","Text size "+size + " vs " + paint.getTextSize()); paint.setTextSize(size / 15); paint.setStyle(Paint.Style.FILL); if (dx == 0x10000 && dy == 0) { draw_canvas.drawText(text, x, y, paint); } else { Path path = new Path(); path.moveTo(x, y); path.rLineTo(dx, dy); paint.setTextAlign(android.graphics.Paint.Align.LEFT); draw_canvas.drawTextOnPath(text, path, 0, 0, paint); } } protected void draw_image(Paint paint, int x, int y, Bitmap bitmap) { //Log.e("NavitGraphics","draw_image"); // float fx = x; // float fy = y; draw_canvas.drawBitmap(bitmap, x, y, paint); } protected void draw_mode(int mode) { //Log.e("NavitGraphics", "draw_mode mode=" + mode + " parent_graphics=" // + String.valueOf(parent_graphics)); if (mode == 2) { if (parent_graphics == null) { view.invalidate(); } else { parent_graphics.view.invalidate(get_rect()); } } if (mode == 1 || (mode == 0 && parent_graphics != null)) draw_bitmap.eraseColor(0); } protected void draw_drag(int x, int y) { //Log.e("NavitGraphics","draw_drag"); pos_x = x; pos_y = y; } protected void overlay_disable(int disable) { Log.e("NavitGraphics","overlay_disable: " + disable + "Parent: " + (parent_graphics != null)); // assume we are NOT in map view mode! if (parent_graphics == null) in_map = (disable==0); if (overlay_disabled != disable) { overlay_disabled = disable; if (parent_graphics != null) { parent_graphics.view.invalidate(get_rect()); } } } protected void overlay_resize(int x, int y, int w, int h, int alpha, int wraparond) { //Log.e("NavitGraphics","overlay_resize"); pos_x = x; pos_y = y; } public static String getLocalizedString(String text) { String ret = CallbackLocalizedString(text); //Log.e("NavitGraphics", "callback_handler -> lozalized string=" + ret); return ret; } /** * get localized string */ public static native String CallbackLocalizedString(String s); } navit-0.5.0~svn5643+dfsg.1/navit/android/src/org/navitproject/navit/NavitMapDownloader.java000066400000000000000000001027471221777731700315640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import android.location.Location; import android.os.Bundle; import android.os.Message; import android.os.StatFs; import android.util.Log; /** * @author rikky * */ public class NavitMapDownloader extends Thread { public static class osm_map_values { String lon1; String lat1; String lon2; String lat2; String map_name = ""; long est_size_bytes = 0; int level = 0; public osm_map_values(String mapname, String lon_1, String lat_1, String lon_2, String lat_2, long bytes_est, int level) { this.map_name = mapname; this.lon1 = lon_1; this.lat1 = lat_1; this.lon2 = lon_2; this.lat2 = lat_2; this.est_size_bytes = bytes_est; this.level = level; } public boolean isInMap(Location location) { double longitude_1 = Double.valueOf(this.lon1); double latitude_1 = Double.valueOf(this.lat1); double longitude_2 = Double.valueOf(this.lon2); double latitude_2 = Double.valueOf(this.lat2); if (location.getLongitude() < longitude_1) return false; if (location.getLongitude() > longitude_2) return false; if (location.getLatitude() < latitude_1) return false; if (location.getLatitude() > latitude_2) return false; return true; } } // // define the maps here // public static final osm_map_values[] osm_maps = { new osm_map_values(Navit._("Whole Planet"),"-180","-90","180","90", 7449814676L, 0), new osm_map_values(Navit._("Africa"),"-30.89","-36.17","61.68","38.40", 280880799L, 0), new osm_map_values(Navit._("Angola"),"11.4","-18.1","24.2","-5.3", 55850695L, 1), new osm_map_values(Navit._("Burundi"),"28.9","-4.5","30.9","-2.2", 60694550L, 1), new osm_map_values(Navit._("Canary Islands"),"-18.69","26.52","-12.79","29.99", 58904212L, 1), new osm_map_values(Navit._("Congo, Democratic Republic of the"),"11.7","-13.6","31.5","5.7", 70168822L, 1), new osm_map_values(Navit._("Ethiopia"),"32.89","3.33","48.07","14.97", 68113437L, 1), new osm_map_values(Navit._("Guinea"),"-15.47","7.12","-7.58","12.74", 57466702L, 1), new osm_map_values(Navit._("Cote d'Ivoire"),"-8.72","4.09","-2.43","10.80", 62652062L, 1), new osm_map_values(Navit._("Kenya"),"33.8","-5.2","42.4","4.9", 64420106L, 1), new osm_map_values(Navit._("Lesotho"),"26.9","-30.7","29.6","-28.4", 55533656L, 1), new osm_map_values(Navit._("Liberia"),"-15.00","-0.73","-7.20","8.65", 55963569L, 1), new osm_map_values(Navit._("Libya"),"9.32","19.40","25.54","33.63", 63127225L, 1), new osm_map_values(Navit._("Madagascar"),"42.25","-26.63","51.20","-11.31", 56681202L, 1), new osm_map_values(Navit._("Namibia")+"+"+Navit._("Botswana"),"11.4","-29.1","29.5","-16.9", 64357926L, 1), new osm_map_values(Navit._("Reunion"),"55.2","-21.4","55.9","-20.9", 59487456L, 1), new osm_map_values(Navit._("Rwanda"),"28.8","-2.9","30.9","-1.0", 60654274L, 1), new osm_map_values(Navit._("South Africa")+"+"+Navit._("Lesotho"),"15.93","-36.36","33.65","-22.08", 79904318L, 1), new osm_map_values(Navit._("Tanzania, United Republic of"),"29.19","-11.87","40.74","-0.88", 65380211L, 1), new osm_map_values(Navit._("Uganda"),"29.3","-1.6","35.1","4.3", 61521337L, 1), new osm_map_values(Navit._("Asia"),"23.8","0.1","195.0","82.4", 1185692230L, 0), new osm_map_values(Navit._("Azerbaijan"),"44.74","38.34","51.69","42.37", 64563990L, 1), new osm_map_values(Navit._("China"),"67.3","5.3","135.0","54.5", 354889731L, 1), new osm_map_values(Navit._("Cyprus"),"32.0","34.5","34.9","35.8", 62657503L, 1), new osm_map_values(Navit._("India")+"+"+Navit._("Nepal"),"67.9","5.5","89.6","36.0", 96930647L, 1), new osm_map_values(Navit._("Indonesia"),"93.7","-17.3","155.5","7.6", 81860551L, 1), new osm_map_values(Navit._("Iran, Islamic Republic of"),"43.5","24.4","63.6","40.4", 79782055L, 1), new osm_map_values(Navit._("Iraq"),"38.7","28.5","49.2","37.4", 64053119L, 1), new osm_map_values(Navit._("Israel"),"33.99","29.8","35.95","33.4", 73981247L, 1), new osm_map_values(Navit._("Japan")+"+"+Navit._("Korea")+"+"+Navit._("Taiwan"),"117.6","20.5","151.3","47.1", 451295345L, 1), new osm_map_values(Navit._("Kazakhstan"),"46.44","40.89","87.36","55.45", 114949353L, 1), new osm_map_values(Navit._("Kyrgyzstan"),"69.23","39.13","80.33","43.29", 62425757L, 1), new osm_map_values(Navit._("Malaysia")+"+"+Navit._("Singapore"),"94.3","-5.9","108.6","6.8", 61142116L, 1), new osm_map_values(Navit._("Mongolia"),"87.5","41.4","120.3","52.7", 66228736L, 1), new osm_map_values(Navit._("Pakistan"),"60.83","23.28","77.89","37.15", 74060802L, 1), new osm_map_values(Navit._("Philippines"),"115.58","4.47","127.85","21.60", 71601316L, 1), new osm_map_values(Navit._("Saudi Arabia"),"33.2","16.1","55.9","33.5", 100651634L, 1), new osm_map_values(Navit._("Thailand"),"97.5","5.7","105.2","19.7", 68260330L, 1), new osm_map_values(Navit._("Turkey"),"25.1","35.8","46.4","42.8", 105200911L, 1), new osm_map_values(Navit._("Turkmenistan"),"51.78","35.07","66.76","42.91", 62188003L, 1), new osm_map_values(Navit._("UAE+Other"),"51.5","22.6","56.7","26.5", 61873090L, 1), new osm_map_values(Navit._("Australia")+"+"+Navit._("Oceania"),"89.84","-57.39","179.79","7.26", 185657003L, 0), new osm_map_values(Navit._("Australia"),"110.5","-44.2","154.9","-9.2", 138812990L, 0), new osm_map_values(Navit._("Tasmania"),"144.0","-45.1","155.3","-24.8", 109169592L, 1), new osm_map_values(Navit._("Victoria")+"+"+Navit._("New South Wales"),"140.7","-39.4","153.7","-26.9", 104820309L, 1), new osm_map_values(Navit._("New Caledonia"),"157.85","-25.05","174.15","-16.85", 54512722L, 1), new osm_map_values(Navit._("New Zealand"),"165.2","-47.6","179.1","-33.7", 68221081L, 1), new osm_map_values(Navit._("Europe"),"-12.97","33.59","34.15","72.10", 3570653608L, 0), new osm_map_values(Navit._("Western Europe"),"-17.6","34.5","42.9","70.9", 3700019849L, 1), new osm_map_values(Navit._("Austria"),"9.4","46.32","17.21","49.1", 289080462L, 1), new osm_map_values(Navit._("Azores"),"-31.62","36.63","-24.67","40.13", 54507108L, 1), new osm_map_values(Navit._("BeNeLux"),"2.08","48.87","7.78","54.52", 656716695L, 1), new osm_map_values(Navit._("Netherlands"),"3.07","50.75","7.23","53.73", 525336576L, 1), new osm_map_values(Navit._("Denmark"),"7.65","54.32","15.58","58.07", 154275079L, 1), new osm_map_values(Navit._("Faroe Islands"),"-7.8","61.3","-6.1","62.5", 54931474L, 1), new osm_map_values(Navit._("France"),"-5.45","42.00","8.44","51.68", 1468741961L, 1), new osm_map_values(Navit._("Alsace"),"6.79","47.27","8.48","49.17", 144023488L, 2), new osm_map_values(Navit._("Aquitaine"),"-2.27","42.44","1.50","45.76", 186786072L, 2), new osm_map_values(Navit._("Auvergne"),"2.01","44.57","4.54","46.85", 118942252L, 2), new osm_map_values(Navit._("Basse-Normandie"),"-2.09","48.13","1.03","49.98", 111940365L, 2), new osm_map_values(Navit._("Bourgogne"),"2.80","46.11","5.58","48.45", 114109115L, 2), new osm_map_values(Navit._("Bretagne"),"-5.58","46.95","-0.96","48.99", 188689862L, 2), new osm_map_values(Navit._("Centre"),"0.01","46.29","3.18","48.99", 208870488L, 2), new osm_map_values(Navit._("Champagne-Ardenne"),"3.34","47.53","5.94","50.28", 112266252L, 2), new osm_map_values(Navit._("Corse"),"8.12","41.32","9.95","43.28", 67997394L, 2), new osm_map_values(Navit._("Franche-Comte"),"5.20","46.21","7.83","48.07", 131236689L, 2), new osm_map_values(Navit._("Haute-Normandie"),"-0.15","48.62","1.85","50.18", 90484736L, 2), new osm_map_values(Navit._("Ile-de-France"),"1.40","48.07","3.61","49.29", 152890366L, 2), new osm_map_values(Navit._("Languedoc-Roussillon"),"1.53","42.25","4.89","45.02", 168413195L, 2), new osm_map_values(Navit._("Limousin"),"0.58","44.87","2.66","46.50", 98422724L, 2), new osm_map_values(Navit._("Lorraine"),"4.84","47.77","7.72","49.73", 137538540L, 2), new osm_map_values(Navit._("Midi-Pyrenees"),"-0.37","42.18","3.50","45.10", 186740619L, 2), new osm_map_values(Navit._("Nord-pas-de-Calais"),"1.42","49.92","4.49","51.31", 145320230L, 2), new osm_map_values(Navit._("Pays-de-la-Loire"),"-2.88","46.20","0.97","48.62", 243736184L, 2), new osm_map_values(Navit._("Picardie"),"1.25","48.79","4.31","50.43", 163238861L, 2), new osm_map_values(Navit._("Poitou-Charentes"),"-1.69","45.04","1.26","47.23", 197886714L, 2), new osm_map_values(Navit._("Provence-Alpes-Cote-d-Azur"),"4.21","42.91","7.99","45.18", 179863755L, 2), new osm_map_values(Navit._("Rhone-Alpes"),"3.65","44.07","7.88","46.64", 201452039L, 2), new osm_map_values(Navit._("Germany"),"5.18","46.84","15.47","55.64", 1187298374L, 1), new osm_map_values(Navit._("Baden-Wuerttemberg"),"7.32","47.14","10.57","49.85", 247149038L, 2), new osm_map_values(Navit._("Bayern"),"8.92","47.22","13.90","50.62", 306577202L, 2), new osm_map_values(Navit._("Mittelfranken"),"9.86","48.78","11.65","49.84", 95916401L, 2), new osm_map_values(Navit._("Niederbayern"),"11.55","47.75","14.12","49.42", 119427776L, 2), new osm_map_values(Navit._("Oberbayern"),"10.67","47.05","13.57","49.14", 147630851L, 2), new osm_map_values(Navit._("Oberfranken"),"10.31","49.54","12.49","50.95", 104963024L, 2), new osm_map_values(Navit._("Oberpfalz"),"11.14","48.71","13.47","50.43", 112413336L, 2), new osm_map_values(Navit._("Schwaben"),"9.27","47.10","11.36","49.09", 126836560L, 2), new osm_map_values(Navit._("Unterfranken"),"8.59","49.16","10.93","50.67", 124601596L, 2), new osm_map_values(Navit._("Berlin"),"13.03","52.28","13.81","52.73", 78189548L, 2), new osm_map_values(Navit._("Brandenburg"),"11.17","51.30","14.83","53.63", 126821283L, 2), new osm_map_values(Navit._("Bremen"),"8.43","52.96","9.04","53.66", 69427370L, 2), new osm_map_values(Navit._("Hamburg"),"9.56","53.34","10.39","53.80", 76388380L, 2), new osm_map_values(Navit._("Hessen"),"7.72","49.34","10.29","51.71", 155980870L, 2), new osm_map_values(Navit._("Mecklenburg-Vorpommern"),"10.54","53.05","14.48","55.05", 92107050L, 2), new osm_map_values(Navit._("Niedersachsen"),"6.40","51.24","11.69","54.22", 288712601L, 2), new osm_map_values(Navit._("Nordrhein-westfalen"),"5.46","50.26","9.52","52.59", 335383638L, 2), new osm_map_values(Navit._("Rheinland-Pfalz"),"6.06","48.91","8.56","51.00", 157909942L, 2), new osm_map_values(Navit._("Saarland"),"6.30","49.06","7.46","49.69", 78579241L, 2), new osm_map_values(Navit._("Sachsen-Anhalt"),"10.50","50.88","13.26","53.11", 115314663L, 2), new osm_map_values(Navit._("Sachsen"),"11.82","50.11","15.10","51.73", 134182818L, 2), new osm_map_values(Navit._("Schleswig-Holstein"),"7.41","53.30","11.98","55.20", 114865543L, 2), new osm_map_values(Navit._("Thueringen"),"9.81","50.15","12.72","51.70", 112896293L, 2), new osm_map_values(Navit._("Germany")+"+"+Navit._("Austria")+"+"+Navit._("Switzerland"),"3.4","44.5","18.6","55.1", 1763000779L, 1), new osm_map_values(Navit._("Iceland"),"-25.3","62.8","-11.4","67.5", 58803839L, 1), new osm_map_values(Navit._("Ireland"),"-11.17","51.25","-5.23","55.9", 74456575L, 1), new osm_map_values(Navit._("Italy"),"6.52","36.38","18.96","47.19", 373215809L, 1), new osm_map_values(Navit._("Spain")+"+"+Navit._("Portugal"),"-11.04","34.87","4.62","44.41", 354839261L, 1), new osm_map_values(Navit._("Mallorca"),"2.2","38.8","4.7","40.2", 66781797L, 2), new osm_map_values(Navit._("Galicia"),"-10.0","41.7","-6.3","44.1", 69081612L, 2), new osm_map_values(Navit._("Scandinavia"),"4.0","54.4","32.1","71.5", 386082513L, 1), new osm_map_values(Navit._("Finland"),"18.6","59.2","32.3","70.3", 167464389L, 1), new osm_map_values(Navit._("Denmark"),"7.49","54.33","13.05","57.88", 142017133L, 1), new osm_map_values(Navit._("Switzerland"),"5.79","45.74","10.59","47.84", 197612725L, 1), new osm_map_values(Navit._("United Kingdom"),"-9.7","49.6","2.2","61.2", 308044592L, 1), new osm_map_values(Navit._("England"),"-7.80","48.93","2.41","56.14", 331085897L, 1), new osm_map_values(Navit._("Buckinghamshire"),"-1.19","51.44","-0.43","52.25", 74619627L, 2), new osm_map_values(Navit._("Cambridgeshire"),"-0.55","51.96","0.56","52.79", 71849188L, 2), new osm_map_values(Navit._("Cumbria"),"-3.96","53.85","-2.11","55.24", 71699620L, 2), new osm_map_values(Navit._("East yorkshire with hull"),"-1.16","53.50","0.54","54.26", 68241870L, 2), new osm_map_values(Navit._("Essex"),"-0.07","51.40","1.36","52.14", 82991499L, 2), new osm_map_values(Navit._("Herefordshire"),"-3.19","51.78","-2.29","52.45", 66471962L, 2), new osm_map_values(Navit._("Kent"),"-0.02","50.81","1.65","51.53", 75449128L, 2), new osm_map_values(Navit._("Lancashire"),"-3.20","53.43","-2.00","54.29", 75096621L, 2), new osm_map_values(Navit._("Leicestershire"),"-1.65","52.34","-0.61","53.03", 75492394L, 2), new osm_map_values(Navit._("Norfolk"),"0.10","52.30","2.04","53.41", 71556838L, 2), new osm_map_values(Navit._("Nottinghamshire"),"-1.39","52.73","-0.62","53.55", 72979826L, 2), new osm_map_values(Navit._("Oxfordshire"),"-1.77","51.41","-0.82","52.22", 73351886L, 2), new osm_map_values(Navit._("Shropshire"),"-3.29","52.26","-2.18","53.05", 69144272L, 2), new osm_map_values(Navit._("Somerset"),"-3.89","50.77","-2.20","51.40", 72098176L, 2), new osm_map_values(Navit._("South yorkshire"),"-1.88","53.25","-0.80","53.71", 72594920L, 2), new osm_map_values(Navit._("Suffolk"),"0.29","51.88","1.81","52.60", 72985880L, 2), new osm_map_values(Navit._("Surrey"),"-0.90","51.02","0.10","51.52", 79850137L, 2), new osm_map_values(Navit._("Wiltshire"),"-2.41","50.90","-1.44","51.76", 71244578L, 2), new osm_map_values(Navit._("Scotland"),"-8.13","54.49","-0.15","61.40", 102111248L, 2), new osm_map_values(Navit._("Wales"),"-5.56","51.28","-2.60","53.60", 84860075L, 2), new osm_map_values(Navit._("Albania"),"19.09","39.55","21.12","42.72", 71097966L, 1), new osm_map_values(Navit._("Belarus"),"23.12","51.21","32.87","56.23", 100471644L, 1), new osm_map_values(Navit._("Russian Federation"),"27.9","41.5","190.4", "77.6", 508559360L, 1), new osm_map_values(Navit._("Bulgaria"),"24.7","42.1","24.8","42.1", 62211433L, 1), new osm_map_values(Navit._("Bosnia and Herzegovina"),"15.69","42.52","19.67","45.32", 75756822L, 1), new osm_map_values(Navit._("Czech Republic"),"11.91","48.48","19.02","51.17", 288911729L, 1), new osm_map_values(Navit._("Croatia"),"13.4","42.1","19.4","46.9", 118479986L, 1), new osm_map_values(Navit._("Estonia"),"21.5","57.5","28.2","59.6", 86149958L, 1), new osm_map_values(Navit._("Greece"),"28.9","37.8","29.0","37.8", 59191120L, 1), new osm_map_values(Navit._("Crete"),"23.3","34.5","26.8","36.0", 61121443L, 1), new osm_map_values(Navit._("Hungary"),"16.08","45.57","23.03","48.39", 129046944L, 1), new osm_map_values(Navit._("Latvia"),"20.7","55.6","28.3","58.1", 81683354L, 1), new osm_map_values(Navit._("Lithuania"),"20.9","53.8","26.9","56.5", 77228922L, 1), new osm_map_values(Navit._("Poland"),"13.6","48.8","24.5","55.0", 331299544L, 1), new osm_map_values(Navit._("Romania"),"20.3","43.5","29.9","48.4", 150011857L, 1), new osm_map_values(Navit._("North America"),"-178.1","6.5","-10.4","84.0", 2738147321L, 0), new osm_map_values(Navit._("Alaska"),"-179.5","49.5","-129","71.6", 72413728L, 1), new osm_map_values(Navit._("Canada"),"-141.3","41.5","-52.2","70.2", 1125713287L, 1), new osm_map_values(Navit._("Hawaii"),"-161.07","18.49","-154.45","22.85", 57463829L, 1), new osm_map_values(Navit._("USA")+Navit._(" (except Alaska and Hawaii)"),"-125.4","24.3","-66.5","49.3", 2356238167L, 1), new osm_map_values(Navit._("Midwest"),"-104.11","35.92","-80.46","49.46", 663062321L, 2), new osm_map_values(Navit._("Michigan"),"-90.47","41.64","-79.00","49.37", 207416918L, 2), new osm_map_values(Navit._("Ohio"),"-84.87","38.05","-79.85","43.53", 143571732L, 2), new osm_map_values(Navit._("Northeast"),"-80.58","38.72","-66.83","47.53", 517925445L, 2), new osm_map_values(Navit._("Massachusetts"),"-73.56","40.78","-68.67","42.94", 159493455L, 2), new osm_map_values(Navit._("Vermont"),"-73.49","42.68","-71.41","45.07", 74308439L, 2), new osm_map_values(Navit._("Pacific"),"-180.05","15.87","-129.75","73.04", 78496182L, 2), new osm_map_values(Navit._("South"),"-106.70","23.98","-71.46","40.70", 1135650708L, 2), new osm_map_values(Navit._("Arkansas"),"-94.67","32.95","-89.59","36.60", 89637645L, 2), new osm_map_values(Navit._("District of Columbia"),"-77.17","38.74","-76.86","39.05", 64042148L, 2), new osm_map_values(Navit._("Florida"),"-88.75","23.63","-77.67","31.05", 118647388L, 2), new osm_map_values(Navit._("Louisiana"),"-94.09","28.09","-88.62","33.07", 136435773L, 2), new osm_map_values(Navit._("Maryland"),"-79.54","37.83","-74.99","40.22", 134152161L, 2), new osm_map_values(Navit._("Mississippi"),"-91.71","29.99","-88.04","35.05", 100291749L, 2), new osm_map_values(Navit._("Oklahoma"),"-103.41","33.56","-94.38","37.38", 106601625L, 2), new osm_map_values(Navit._("Texas"),"-106.96","25.62","-92.97","36.58", 220587321L, 2), new osm_map_values(Navit._("Virginia"),"-83.73","36.49","-74.25","39.52", 218627122L, 2), new osm_map_values(Navit._("West Virginia"),"-82.70","37.15","-77.66","40.97", 133830267L, 2), new osm_map_values(Navit._("West"),"-133.11","31.28","-101.99","49.51", 616041200L, 2), new osm_map_values(Navit._("Arizona"),"-114.88","30.01","-108.99","37.06", 89434673L, 2), new osm_map_values(Navit._("California"),"-125.94","32.43","-114.08","42.07", 303663259L, 2), new osm_map_values(Navit._("Colorado"),"-109.11","36.52","-100.41","41.05", 132835514L, 2), new osm_map_values(Navit._("Idaho"),"-117.30","41.93","-110.99","49.18", 97305030L, 2), new osm_map_values(Navit._("Montana"),"-116.10","44.31","-102.64","49.74", 93935496L, 2), new osm_map_values(Navit._("New Mexico"),"-109.10","26.98","-96.07","37.05", 185648327L, 2), new osm_map_values(Navit._("Nevada"),"-120.2","35.0","-113.8","42.1", 138055868L, 2), new osm_map_values(Navit._("Oregon"),"-124.8","41.8","-116.3","46.3", 103551459L, 2), new osm_map_values(Navit._("Utah"),"-114.11","36.95","-108.99","42.05", 78249845L, 2), new osm_map_values(Navit._("Washington State"),"-125.0","45.5","-116.9","49.0", 100601625L, 2), new osm_map_values(Navit._("South+Middle America"),"-83.5","-56.3","-30.8","13.7", 204217202L, 0), new osm_map_values(Navit._("Argentina"),"-73.9","-57.3","-51.6","-21.0", 105910515L, 1), new osm_map_values(Navit._("Argentina")+"+"+Navit._("Chile"),"-77.2","-56.3","-52.7","-16.1", 111585063L, 1), new osm_map_values(Navit._("Bolivia"),"-70.5","-23.1","-57.3","-9.3", 59215113L, 1), new osm_map_values(Navit._("Brazil"),"-71.4","-34.7","-32.8","5.4", 127279780L, 1), new osm_map_values(Navit._("Chile"),"-81.77","-58.50","-65.46","-17.41", 84808355L, 1), new osm_map_values(Navit._("Cuba"),"-85.3","19.6","-74.0","23.6", 57704852L, 1), new osm_map_values(Navit._("Colombia"),"-79.1","-4.0","-66.7","12.6", 85701114L, 1), new osm_map_values(Navit._("Ecuador"),"-82.6","-5.4","-74.4","2.3", 63453353L, 1), new osm_map_values(Navit._("Guyana")+"+"+Navit._("Suriname")+"+"+Navit._("Guyane Francaise"),"-62.0","1.0","-51.2","8.9", 57226004L, 1), new osm_map_values(Navit._("Haiti")+"+"+Navit._("Dominican Republic"),"-74.8","17.3","-68.2","20.1", 63826780L, 1), new osm_map_values(Navit._("Jamaica"),"-78.6","17.4","-75.9","18.9", 53888545L, 1), new osm_map_values(Navit._("Mexico"),"-117.6","14.1","-86.4","32.8", 258877491L, 1), new osm_map_values(Navit._("Paraguay"),"-63.8","-28.1","-53.6","-18.8", 60539032L, 1), new osm_map_values(Navit._("Peru"),"-82.4","-18.1","-67.5","0.4", 71286591L, 1), new osm_map_values(Navit._("Uruguay"),"-59.2","-36.5","-51.7","-29.7", 64850903L, 1), new osm_map_values(Navit._("Venezuela"),"-73.6","0.4","-59.7","12.8", 74521456L, 1) }; public static final String MAP_FILENAME_PATH = Navit.MAP_FILENAME_PATH; public static NavitMap[] getAvailableMaps() { class filterMaps implements FilenameFilter { public boolean accept(File dir, String filename) { if (filename.endsWith(".bin")) return true; return false; } } NavitMap maps[] = new NavitMap[0]; File map_dir = new File(MAP_FILENAME_PATH); String map_file_names[] = map_dir.list(new filterMaps()); if (map_file_names != null) { maps = new NavitMap[map_file_names.length]; for (int map_file_index = 0; map_file_index < map_file_names.length; map_file_index++) { maps[map_file_index] = new NavitMap(MAP_FILENAME_PATH, map_file_names[map_file_index]); } } return maps; } private Boolean stop_me = false; private osm_map_values map_values; private long uiLastUpdated = -1; private Boolean retryDownload = false; //Download failed, but //we should try to resume private static final int SOCKET_CONNECT_TIMEOUT = 60000; // 60 secs. private static final int SOCKET_READ_TIMEOUT = 120000; // 120 secs. private static final int MAP_WRITE_FILE_BUFFER = 1024 * 64; private static final int MAP_WRITE_MEM_BUFFER = 1024 * 64; private static final int MAP_READ_FILE_BUFFER = 1024 * 64; private static final int UPDATE_PROGRESS_TIME_NS = 1000 * 1000000; // 1ns=1E-9s private static final int MAX_RETRIES = 5; private static final String TAG = "NavitMapDownloader"; protected int retry_counter = 0; public NavitMapDownloader(int map_id) { this.map_values = osm_maps[map_id]; } public void run() { stop_me = false; retry_counter = 0; Log.v(TAG, "start download " + map_values.map_name); updateProgress(0, 20, Navit._("downloading") + ": " + map_values.map_name); boolean success; do { try { Thread.sleep(10 + retry_counter * 1000); } catch (InterruptedException e1) {} retryDownload = false; success = download_osm_map(); } while ( !success && retryDownload && retry_counter < MAX_RETRIES && !stop_me); if (success) { toast(map_values.map_name + " " + Navit._("ready")); Log.d(TAG, "success"); } if (success || stop_me ) { NavitDialogs.sendDialogMessage( NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED , MAP_FILENAME_PATH + map_values.map_name + ".bin", null, -1, success ? 1 : 0 , 0 ); } } public void stop_thread() { stop_me = true; Log.d(TAG, "stop_me -> true"); } protected boolean checkFreeSpace(long needed_bytes) { long free_space = getFreeSpace(); if ( needed_bytes <= 0 ) needed_bytes = MAP_WRITE_FILE_BUFFER; if (free_space < needed_bytes ) { Log.e(TAG, "Not enough free space. Please free at least " + needed_bytes / 1024 /1024 + "Mb."); updateProgress(free_space, needed_bytes, Navit._("Error downloading map!") + "\n" + Navit._("Not enough free space")); return false; } return true; } protected boolean deleteMap() { File finalOutputFile = getMapFile(); if (finalOutputFile.exists()) { Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); Bundle b = new Bundle(); b.putString("title", finalOutputFile.getAbsolutePath()); msg.setData(b); msg.sendToTarget(); return true; } return false; } /** * @param map_values * @return */ protected boolean download_osm_map() { long already_read = 0; long real_size_bytes = 0; boolean resume = true; File outputFile = getDestinationFile(); long old_download_size = outputFile.length(); URL url = null; if (old_download_size > 0) { url = readFileInfo(); } if (url == null) { resume = false; url = getDownloadURL(); } // URL url = new URL("http://192.168.2.101:8080/zweibruecken.bin"); URLConnection c = initConnection(url); if (c != null) { if (resume) { c.setRequestProperty("Range", "bytes=" + old_download_size + "-"); already_read = old_download_size; } real_size_bytes = c.getContentLength() + already_read; long fileTime = c.getLastModified(); if (!resume) { outputFile.delete(); writeFileInfo(c, real_size_bytes); } if (real_size_bytes <= 0) real_size_bytes = map_values.est_size_bytes; Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + fileTime + ", Connection ref: " + c.getURL()); if (checkFreeSpace(real_size_bytes - already_read) && downloadData(c, already_read, real_size_bytes, resume, outputFile)) { File finalOutputFile = getMapFile(); // delete an already existing file first finalOutputFile.delete(); // rename file to its final name outputFile.renameTo(finalOutputFile); return true; } } return false; } protected File getDestinationFile() { File outputFile = new File(MAP_FILENAME_PATH, map_values.map_name + ".tmp"); outputFile.getParentFile().mkdir(); return outputFile; } protected boolean downloadData(URLConnection c, long already_read, long real_size_bytes , boolean resume,File outputFile) { boolean success = false; BufferedOutputStream buf = getOutputStream(outputFile, resume); BufferedInputStream bif = getInputStream(c); if (buf != null && bif != null) { success = readData(buf, bif, already_read, real_size_bytes); // always cleanup, as we might get errors when trying to resume try { buf.flush(); buf.close(); bif.close(); } catch (IOException e) { } } return success; } protected URL getDownloadURL() { URL url = null; try { url = new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," + map_values.lat1 + "," + map_values.lon2 + "," + map_values.lat2); } catch (MalformedURLException e) { Log.e(TAG, "We failed to create a URL to " + map_values.map_name); e.printStackTrace(); return null; } Log.v(TAG, "connect to " + url.toString()); return url; } protected long getFreeSpace() { StatFs fsInfo = new StatFs(MAP_FILENAME_PATH); return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); } protected BufferedInputStream getInputStream(URLConnection c) { BufferedInputStream bif = null; try { bif = new BufferedInputStream(c.getInputStream(), MAP_READ_FILE_BUFFER); } catch (FileNotFoundException e) { Log.e(TAG, "File not found on server: " + e); if (retry_counter > 0) { getMapInfoFile().delete(); } enableRetry(); bif = null; } catch (IOException e) { Log.e(TAG, "Error reading from server: " + e); enableRetry(); bif = null; } return bif; } protected File getMapFile() { return new File(MAP_FILENAME_PATH, map_values.map_name + ".bin"); } protected File getMapInfoFile() { return new File(MAP_FILENAME_PATH, map_values.map_name + ".tmp.info"); } protected BufferedOutputStream getOutputStream(File outputFile, boolean resume) { BufferedOutputStream buf = null; try { buf = new BufferedOutputStream(new FileOutputStream(outputFile, resume), MAP_WRITE_FILE_BUFFER); } catch (FileNotFoundException e) { Log.e(TAG, "Could not open output file for writing: " + e); buf = null; } return buf; } protected URLConnection initConnection(URL url) { HttpURLConnection c = null; try { c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); } catch (Exception e) { Log.e(TAG, "Failed connecting server: " + e); enableRetry(); return null; } c.setReadTimeout(SOCKET_READ_TIMEOUT); c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT); return c; } protected boolean readData(OutputStream buf, InputStream bif, long already_read, long real_size_bytes) { long start_timestamp = System.nanoTime(); byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; int len1 = 0; long mapFileSize = real_size_bytes; long startOffset = already_read; boolean success = false; try { while (!stop_me && (len1 = bif.read(buffer)) != -1) { already_read += len1; updateProgress(start_timestamp, startOffset, already_read, mapFileSize); try { buf.write(buffer, 0, len1); } catch (IOException e) { Log.d(TAG, "Error: " + e); if ( !checkFreeSpace(real_size_bytes - already_read + MAP_WRITE_FILE_BUFFER)) { if (deleteMap()) { enableRetry(); } else { updateProgress(already_read, real_size_bytes, Navit._("Error downloading map!") + "\n" + Navit._("Not enough free space")); } } else { updateProgress(already_read, real_size_bytes, Navit._("Error writing map!")); } return false; } } if (stop_me) { toast(Navit._("Map download aborted!")); } else if ( already_read < real_size_bytes ) { Log.d(TAG, "Server send only " + already_read + " bytes of " + real_size_bytes); enableRetry(); } else { success = true; } } catch (IOException e) { Log.d(TAG, "Error: " + e); enableRetry(); updateProgress(already_read, real_size_bytes, Navit._("Error downloading map!")); } return success; } protected URL readFileInfo() { URL url = null; try { ObjectInputStream infoStream = new ObjectInputStream(new FileInputStream(getMapInfoFile())); String resume_proto = infoStream.readUTF(); infoStream.readUTF(); // read the host name (unused for now) String resume_file = infoStream.readUTF(); infoStream.close(); // looks like the same file, try to resume Log.v(TAG, "Try to resume download"); url = new URL(resume_proto + "://" + "maps.navit-project.org" + resume_file); } catch (Exception e) { getMapInfoFile().delete(); } return url; } protected void toast(String message) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST, null, message, -1, 0, 0); } protected void updateProgress(long startTime, long offsetBytes, long readBytes, long maxBytes) { long currentTime = System.nanoTime(); if (currentTime > uiLastUpdated + UPDATE_PROGRESS_TIME_NS) { float per_second_overall = (readBytes - offsetBytes) / ((currentTime - startTime) / 1000000000f); long bytes_remaining = maxBytes - readBytes; int eta_seconds = (int) (bytes_remaining / per_second_overall); String eta_string; if (eta_seconds > 60) { eta_string = (int) (eta_seconds / 60f) + " m"; } else { eta_string = eta_seconds + " s"; } String info = String.format("%s: %s\n %dMb / %dMb\n %.1f kb/s %s: %s", Navit._("downloading") , map_values.map_name, readBytes / 1024 / 1024, maxBytes / 1024 / 1024, per_second_overall / 1024f, Navit._("ETA"), eta_string); if (retry_counter > 0) { info += "\n Retry " + retry_counter + "/" + MAX_RETRIES; } Log.e(TAG, "info: " + info); updateProgress(readBytes, maxBytes, info); uiLastUpdated = currentTime; } } protected void updateProgress(long positionBytes, long maximumBytes, String infoText) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_PROGRESS_BAR, Navit._("Map download"), infoText , NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024), (int) (positionBytes / 1024)); } protected void writeFileInfo(URLConnection c, long sizeInBytes) { ObjectOutputStream infoStream; try { infoStream = new ObjectOutputStream(new FileOutputStream(getMapInfoFile())); infoStream.writeUTF(c.getURL().getProtocol()); infoStream.writeUTF(c.getURL().getHost()); infoStream.writeUTF(c.getURL().getFile()); infoStream.writeLong(sizeInBytes); infoStream.close(); } catch (Exception e) { Log.e(TAG, "Could not write info file for map download. Resuming will not be possible. (" + e.getMessage() + ")"); } } void enableRetry() { retryDownload = true; retry_counter++; } // dialog send helper methods } navit-0.5.0~svn5643+dfsg.1/navit/announcement.c000066400000000000000000000034321221777731700211610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "item.h" #include "announcement.h" struct announcement { struct attr **attrs; }; struct announcement * announcement_new(struct attr *parent, struct attr **attrs) { struct announcement *this_; struct attr *type_attr; if (! (type_attr=attr_search(attrs, NULL, attr_name))) { return NULL; } this_=g_new0(struct announcement, 1); this_->attrs=attr_list_dup(attrs); return this_; } int announcement_get_attr(struct announcement *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int announcement_set_attr(struct announcement *this_, struct attr *attr) { this_->attrs=attr_generic_set_attr(this_->attrs, attr); return 1; } int announcement_add_attr(struct announcement *this_, struct attr *attr) { this_->attrs=attr_generic_add_attr(this_->attrs, attr); return 1; } int announcement_remove_attr(struct announcement *this_, struct attr *attr) { this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; } navit-0.5.0~svn5643+dfsg.1/navit/announcement.h000066400000000000000000000022241221777731700211640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct announcement * announcement_new(struct attr *parent, struct attr **attrs); int announcement_get_attr(struct announcement *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int announcement_set_attr(struct announcement *this_, struct attr *attr); int announcement_add_attr(struct announcement *this_, struct attr *attr); int announcement_remove_attr(struct announcement *this_, struct attr *attr); navit-0.5.0~svn5643+dfsg.1/navit/atom.c000066400000000000000000000006751221777731700174350ustar00rootroot00000000000000#include #include "atom.h" static GHashTable *atom_hash; char * atom_lookup(char *name) { if (!atom_hash) return NULL; return g_hash_table_lookup(atom_hash,name); } char * atom(char *name) { char *id=atom_lookup(name); if (id) return id; if (!atom_hash) return NULL; id=g_strdup(name); g_hash_table_insert(atom_hash, id, id); return id; } void atom_init(void) { atom_hash=g_hash_table_new(g_str_hash, g_str_equal); } navit-0.5.0~svn5643+dfsg.1/navit/atom.h000066400000000000000000000002221221777731700174260ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif char * atom_lookup(char *name); char * atom(char *name); void atom_init(void); #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/attr.c000066400000000000000000000557511221777731700174540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "item.h" #include "coord.h" #include "transform.h" #include "color.h" #include "attr.h" #include "map.h" #include "config.h" #include "endianess.h" #include "util.h" #include "types.h" #include "xmlconfig.h" struct attr_name { enum attr_type attr; char *name; }; static struct attr_name attr_names[]={ #define ATTR2(x,y) ATTR(y) #define ATTR(x) { attr_##x, #x }, #include "attr_def.h" #undef ATTR2 #undef ATTR }; static GHashTable *attr_hash; void attr_create_hash(void) { int i; attr_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { g_hash_table_insert(attr_hash, attr_names[i].name, GINT_TO_POINTER(attr_names[i].attr)); } } void attr_destroy_hash(void) { g_hash_table_destroy(attr_hash); attr_hash=NULL; } enum attr_type attr_from_name(const char *name) { int i; if (attr_hash) return GPOINTER_TO_INT(g_hash_table_lookup(attr_hash, name)); for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { if (! strcmp(attr_names[i].name, name)) return attr_names[i].attr; } return attr_none; } static int attr_match(enum attr_type search, enum attr_type found); char * attr_to_name(enum attr_type attr) { int i; for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { if (attr_names[i].attr == attr) return attr_names[i].name; } return NULL; } struct attr * attr_new_from_text(const char *name, const char *value) { enum attr_type attr; struct attr *ret; struct coord_geo *g; struct coord c; enum item_type item_type; char *pos,*type_str,*str,*tok; int min,max,count; ret=g_new0(struct attr, 1); dbg(3,"enter name='%s' value='%s'\n", name, value); attr=attr_from_name(name); ret->type=attr; switch (attr) { case attr_item_type: ret->u.item_type=item_from_name(value); break; case attr_item_types: count=0; type_str=g_strdup(value); str=type_str; while ((tok=strtok(str, ","))) { ret->u.item_types=g_realloc(ret->u.item_types, (count+2)*sizeof(enum item_type)); item_type=item_from_name(tok); if (item_type!=type_none) { ret->u.item_types[count++]=item_type; ret->u.item_types[count]=type_none; } else { dbg(0,"Unknown item type '%s' ignored.\n",tok); } str=NULL; } g_free(type_str); break; case attr_attr_types: count=0; type_str=g_strdup(value); str=type_str; while ((tok=strtok(str, ","))) { ret->u.attr_types=g_realloc(ret->u.attr_types, (count+2)*sizeof(enum attr_type)); ret->u.attr_types[count++]=attr_from_name(tok); ret->u.attr_types[count]=attr_none; str=NULL; } g_free(type_str); break; case attr_dash: count=0; type_str=g_strdup(value); str=type_str; while ((tok=strtok(str, ","))) { ret->u.dash=g_realloc(ret->u.dash, (count+2)*sizeof(int)); ret->u.dash[count++]=g_ascii_strtoull(tok,NULL,0); ret->u.dash[count]=0; str=NULL; } g_free(type_str); break; case attr_order: case attr_sequence_range: case attr_angle_range: case attr_speed_range: pos=strchr(value, '-'); min=0; max=32767; if (! pos) { sscanf(value,"%d",&min); max=min; } else if (pos == value) sscanf(value,"-%d",&max); else sscanf(value,"%d-%d",&min, &max); ret->u.range.min=min; ret->u.range.max=max; break; default: if (attr >= attr_type_string_begin && attr <= attr_type_string_end) { ret->u.str=g_strdup(value); break; } if (attr >= attr_type_int_begin && attr <= attr_type_int_end) { if (value[0] == '0' && value[1] == 'x') ret->u.num=strtoul(value, NULL, 0); else ret->u.num=strtol(value, NULL, 0); if ((attr >= attr_type_rel_abs_begin) && (attr < attr_type_boolean_begin)) { /* Absolute values are from -0x40000000 - 0x40000000, with 0x0 being 0 (who would have thought that?) Relative values are from 0x40000001 - 0x80000000, with 0x60000000 being 0 */ if (strchr(value, '%')) { if ((ret->u.num > 0x20000000) || (ret->u.num < -0x1FFFFFFF)) { dbg(0, "Relative possibly-relative attribute with invalid value %li\n", ret->u.num); } ret->u.num += 0x60000000; } else { if ((ret->u.num > 0x40000000) || (ret->u.num < -0x40000000)) { dbg(0, "Non-relative possibly-relative attribute with invalid value %li\n", ret->u.num); } } } else if (attr >= attr_type_boolean_begin) { // also check for yes and no if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) ret->u.num=1; else ret->u.num=0; } break; } if (attr >= attr_type_color_begin && attr <= attr_type_color_end) { struct color *color=g_new0(struct color, 1); int r,g,b,a; ret->u.color=color; if(strlen(value)==7){ sscanf(value,"#%02x%02x%02x", &r, &g, &b); color->r = (r << 8) | r; color->g = (g << 8) | g; color->b = (b << 8) | b; color->a = (65535); } else if(strlen(value)==9){ sscanf(value,"#%02x%02x%02x%02x", &r, &g, &b, &a); color->r = (r << 8) | r; color->g = (g << 8) | g; color->b = (b << 8) | b; color->a = (a << 8) | a; } else { dbg(0,"color %s has unknown format\n",value); } break; } if (attr >= attr_type_coord_geo_begin && attr <= attr_type_coord_geo_end) { g=g_new(struct coord_geo, 1); ret->u.coord_geo=g; coord_parse(value, projection_mg, &c); transform_to_geo(projection_mg, &c, g); break; } dbg(1,"default\n"); g_free(ret); ret=NULL; } return ret; } static char * flags_to_text(int flags) { char *ret=g_strdup_printf("0x%x:",flags); if (flags & AF_ONEWAY) ret=g_strconcat_printf(ret,"%sAF_ONEWAY",ret?"|":""); if (flags & AF_ONEWAYREV) ret=g_strconcat_printf(ret,"%sAF_ONEWAYREV",ret?"|":""); if (flags & AF_SEGMENTED) ret=g_strconcat_printf(ret,"%sAF_SEGMENTED",ret?"|":""); if (flags & AF_ROUNDABOUT) ret=g_strconcat_printf(ret,"%sAF_ROUNDABOUT",ret?"|":""); if (flags & AF_ROUNDABOUT_VALID) ret=g_strconcat_printf(ret,"%sAF_ROUNDABOUT_VALID",ret?"|":""); if (flags & AF_ONEWAY_EXCEPTION) ret=g_strconcat_printf(ret,"%sAF_ONEWAY_EXCEPTION",ret?"|":""); if (flags & AF_SPEED_LIMIT) ret=g_strconcat_printf(ret,"%sAF_SPEED_LIMIT",ret?"|":""); if (flags & AF_RESERVED1) ret=g_strconcat_printf(ret,"%sAF_RESERVED1",ret?"|":""); if (flags & AF_SIZE_OR_WEIGHT_LIMIT) ret=g_strconcat_printf(ret,"%sAF_SIZE_OR_WEIGHT_LIMIT",ret?"|":""); if (flags & AF_THROUGH_TRAFFIC_LIMIT) ret=g_strconcat_printf(ret,"%sAF_THROUGH_TRAFFIC_LIMIT",ret?"|":""); if (flags & AF_TOLL) ret=g_strconcat_printf(ret,"%sAF_TOLL",ret?"|":""); if (flags & AF_SEASONAL) ret=g_strconcat_printf(ret,"%sAF_SEASONAL",ret?"|":""); if (flags & AF_UNPAVED) ret=g_strconcat_printf(ret,"%sAF_UNPAVED",ret?"|":""); if (flags & AF_FORD) ret=g_strconcat_printf(ret,"%sAF_FORD",ret?"|":""); if (flags & AF_UNDERGROUND) ret=g_strconcat_printf(ret,"%sAF_UNDERGROUND",ret?"|":""); if (flags & AF_DANGEROUS_GOODS) ret=g_strconcat_printf(ret,"%sAF_DANGEROUS_GOODS",ret?"|":""); if ((flags & AF_ALL) == AF_ALL) return g_strconcat_printf(ret,"%sAF_ALL",ret?"|":""); if ((flags & AF_ALL) == AF_MOTORIZED_FAST) return g_strconcat_printf(ret,"%sAF_MOTORIZED_FAST",ret?"|":""); if (flags & AF_EMERGENCY_VEHICLES) ret=g_strconcat_printf(ret,"%sAF_EMERGENCY_VEHICLES",ret?"|":""); if (flags & AF_TRANSPORT_TRUCK) ret=g_strconcat_printf(ret,"%sAF_TRANSPORT_TRUCK",ret?"|":""); if (flags & AF_DELIVERY_TRUCK) ret=g_strconcat_printf(ret,"%sAF_DELIVERY_TRUCK",ret?"|":""); if (flags & AF_PUBLIC_BUS) ret=g_strconcat_printf(ret,"%sAF_PUBLIC_BUS",ret?"|":""); if (flags & AF_TAXI) ret=g_strconcat_printf(ret,"%sAF_TAXI",ret?"|":""); if (flags & AF_HIGH_OCCUPANCY_CAR) ret=g_strconcat_printf(ret,"%sAF_HIGH_OCCUPANCY_CAR",ret?"|":""); if (flags & AF_CAR) ret=g_strconcat_printf(ret,"%sAF_CAR",ret?"|":""); if (flags & AF_MOTORCYCLE) ret=g_strconcat_printf(ret,"%sAF_MOTORCYCLE",ret?"|":""); if (flags & AF_MOPED) ret=g_strconcat_printf(ret,"%sAF_MOPED",ret?"|":""); if (flags & AF_HORSE) ret=g_strconcat_printf(ret,"%sAF_HORSE",ret?"|":""); if (flags & AF_BIKE) ret=g_strconcat_printf(ret,"%sAF_BIKE",ret?"|":""); if (flags & AF_PEDESTRIAN) ret=g_strconcat_printf(ret,"%sAF_PEDESTRIAN",ret?"|":""); return ret; } char * attr_to_text_ext(struct attr *attr, char *sep, enum attr_format fmt, enum attr_format def_fmt, struct map *map) { char *ret; enum attr_type type=attr->type; if (!sep) sep=""; if (type >= attr_type_item_begin && type <= attr_type_item_end) { struct item *item=attr->u.item; struct attr type, data; if (! item) return g_strdup("(nil)"); if (! item->map || !map_get_attr(item->map, attr_type, &type, NULL)) type.u.str=""; if (! item->map || !map_get_attr(item->map, attr_data, &data, NULL)) data.u.str=""; return g_strdup_printf("type=0x%x id=0x%x,0x%x map=%p (%s:%s)", item->type, item->id_hi, item->id_lo, item->map, type.u.str, data.u.str); } if (type >= attr_type_string_begin && type <= attr_type_string_end) { if (map) { char *mstr; if (attr->u.str) { mstr=map_convert_string(map, attr->u.str); ret=g_strdup(mstr); map_convert_free(mstr); } else ret=g_strdup("(null)"); } else ret=g_strdup(attr->u.str); return ret; } if (type == attr_flags || type == attr_through_traffic_flags) return flags_to_text(attr->u.num); if (type == attr_destination_length) { if (fmt == attr_format_with_units) { double distance=attr->u.num; if (distance > 10000) return g_strdup_printf("%.0f%skm",distance/1000,sep); return g_strdup_printf("%.1f%skm",distance/1000,sep); } } if (type == attr_destination_time) { if (fmt == attr_format_with_units) { int seconds=(attr->u.num+5)/10; int minutes=seconds/60; int hours=minutes/60; int days=hours/24; hours%=24; minutes%=60; seconds%=60; if (days) return g_strdup_printf("%d:%02d:%02d:%02d",days,hours,minutes,seconds); if (hours) return g_strdup_printf("%02d:%02d:%02d",hours,minutes,seconds); return g_strdup_printf("%02d:%02d",minutes,seconds); } } if (type >= attr_type_int_begin && type <= attr_type_int_end) return g_strdup_printf("%ld", attr->u.num); if (type >= attr_type_int64_begin && type <= attr_type_int64_end) return g_strdup_printf(LONGLONG_FMT, *attr->u.num64); if (type >= attr_type_double_begin && type <= attr_type_double_end) return g_strdup_printf("%f", *attr->u.numd); if (type >= attr_type_object_begin && type <= attr_type_object_end) return g_strdup_printf("(object[%s])", attr_to_name(type)); if (type >= attr_type_color_begin && type <= attr_type_color_end) { if (attr->u.color->a != 65535) return g_strdup_printf("#%02x%02x%02x%02x", attr->u.color->r>>8,attr->u.color->g>>8,attr->u.color->b>>8, attr->u.color->a>>8); else return g_strdup_printf("#%02x%02x%02x", attr->u.color->r>>8,attr->u.color->g>>8,attr->u.color->b>>8); } if (type >= attr_type_coord_geo_begin && type <= attr_type_coord_geo_end) return g_strdup_printf("%f %f",attr->u.coord_geo->lng,attr->u.coord_geo->lat); if (type == attr_zipfile_ref_block) { int *data=attr->u.data; return g_strdup_printf("0x%x,0x%x,0x%x",data[0],data[1],data[2]); } if (type == attr_item_id) { int *data=attr->u.data; return g_strdup_printf("0x%x,0x%x",data[0],data[1]); } if (type == attr_item_types) { enum item_type *item_types=attr->u.item_types; char *sep="",*ret=NULL; while (item_types && *item_types) { ret=g_strconcat_printf(ret,"%s%s",sep,item_to_name(*item_types++)); sep=","; } return ret; } if (type >= attr_type_group_begin && type <= attr_type_group_end) { int i=0; char *ret=g_strdup(""); char *sep=""; while (attr->u.attrs[i].type) { char *val=attr_to_text_ext(&attr->u.attrs[i], sep, fmt, def_fmt, map); ret=g_strconcat_printf(ret,"%s%s=%s",sep,attr_to_name(attr->u.attrs[i].type),val); g_free(val); sep=" "; i++; } return ret; } if (type >= attr_type_item_type_begin && type <= attr_type_item_type_end) { return g_strdup_printf("0x%ld[%s]",attr->u.num,item_to_name(attr->u.num)); } return g_strdup_printf("(no text[%s])", attr_to_name(type)); } char * attr_to_text(struct attr *attr, struct map *map, int pretty) { return attr_to_text_ext(attr, NULL, attr_format_default, attr_format_default, map); } struct attr * attr_search(struct attr **attrs, struct attr *last, enum attr_type attr) { dbg(2, "enter attrs=%p\n", attrs); while (*attrs) { dbg(3,"*attrs=%p\n", *attrs); if ((*attrs)->type == attr) { return *attrs; } attrs++; } return NULL; } static int attr_match(enum attr_type search, enum attr_type found) { switch (search) { case attr_any: return 1; case attr_any_xml: switch (found) { case attr_callback: return 0; default: return 1; } default: return search == found; } } int attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter) { while (attrs && *attrs) { if (attr_match(type,(*attrs)->type)) { *attr=**attrs; if (!iter) return 1; if (*((void **)iter) < (void *)attrs) { *((void **)iter)=(void *)attrs; return 1; } } attrs++; } if (type == attr_any || type == attr_any_xml) return 0; while (def_attrs && *def_attrs) { if ((*def_attrs)->type == type) { *attr=**def_attrs; return 1; } def_attrs++; } return 0; } struct attr ** attr_generic_set_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,count=0; while (curr && *curr) { if ((*curr)->type == attr->type) { attr_free(*curr); *curr=attr_dup(attr); return attrs; } curr++; count++; } curr=g_new0(struct attr *, count+2); for (i = 0 ; i < count ; i++) curr[i]=attrs[i]; curr[count]=attr_dup(attr); curr[count+1]=NULL; g_free(attrs); return curr; } struct attr ** attr_generic_add_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,count=0; while (curr && *curr) { curr++; count++; } curr=g_new0(struct attr *, count+2); for (i = 0 ; i < count ; i++) curr[i]=attrs[i]; curr[count]=attr_dup(attr); curr[count+1]=NULL; g_free(attrs); return curr; } struct attr ** attr_generic_add_attr_list(struct attr **attrs, struct attr **add) { while (add && *add) { attrs=attr_generic_add_attr(attrs, *add); add++; } return attrs; } struct attr ** attr_generic_prepend_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,count=0; while (curr && *curr) { curr++; count++; } curr=g_new0(struct attr *, count+2); for (i = 0 ; i < count ; i++) curr[i+1]=attrs[i]; curr[0]=attr_dup(attr); curr[count+1]=NULL; g_free(attrs); return curr; } struct attr ** attr_generic_remove_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,j,count=0,found=0; while (curr && *curr) { if ((*curr)->type == attr->type && (*curr)->u.data == attr->u.data) found=1; curr++; count++; } if (!found) return attrs; curr=g_new0(struct attr *, count); j=0; for (i = 0 ; i < count ; i++) { if (attrs[i]->type != attr->type || attrs[i]->u.data != attr->u.data) curr[j++]=attrs[i]; else attr_free(attrs[i]); } curr[j]=NULL; g_free(attrs); return curr; } enum attr_type attr_type_begin(enum attr_type type) { if (type < attr_type_item_begin) return attr_none; if (type < attr_type_int_begin) return attr_type_item_begin; if (type < attr_type_string_begin) return attr_type_int_begin; if (type < attr_type_special_begin) return attr_type_string_begin; if (type < attr_type_double_begin) return attr_type_special_begin; if (type < attr_type_coord_geo_begin) return attr_type_double_begin; if (type < attr_type_color_begin) return attr_type_coord_geo_begin; if (type < attr_type_object_begin) return attr_type_color_begin; if (type < attr_type_coord_begin) return attr_type_object_begin; if (type < attr_type_pcoord_begin) return attr_type_coord_begin; if (type < attr_type_callback_begin) return attr_type_pcoord_begin; if (type < attr_type_int64_begin) return attr_type_callback_begin; if (type <= attr_type_int64_end) return attr_type_int64_begin; return attr_none; } int attr_data_size(struct attr *attr) { if (attr->type == attr_none) return 0; if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) return strlen(attr->u.str)+1; if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) return sizeof(attr->u.num); if (attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) return sizeof(*attr->u.coord_geo); if (attr->type >= attr_type_color_begin && attr->type <= attr_type_color_end) return sizeof(*attr->u.color); if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) return sizeof(void *); if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) return sizeof(struct item); if (attr->type >= attr_type_int64_begin && attr->type <= attr_type_int64_end) return sizeof(*attr->u.num64); if (attr->type == attr_order) return sizeof(attr->u.range); if (attr->type >= attr_type_double_begin && attr->type <= attr_type_double_end) return sizeof(*attr->u.numd); if (attr->type == attr_item_types) { int i=0; while (attr->u.item_types[i++] != type_none); return i*sizeof(enum item_type); } if (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) return sizeof(enum item_type); if (attr->type == attr_attr_types) { int i=0; while (attr->u.attr_types[i++] != attr_none); return i*sizeof(enum attr_type); } dbg(0,"size for %s unknown\n", attr_to_name(attr->type)); return 0; } void * attr_data_get(struct attr *attr) { if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) return &attr->u.num; if (attr->type == attr_order) return &attr->u.range; return attr->u.data; } void attr_data_set(struct attr *attr, void *data) { if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) attr->u.num=*((int *)data); else attr->u.data=data; } void attr_data_set_le(struct attr * attr, void * data) { if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) attr->u.num=le32_to_cpu(*((int *)data)); else if (attr->type == attr_order) { attr->u.num=le32_to_cpu(*((int *)data)); attr->u.range.min=le16_to_cpu(attr->u.range.min); attr->u.range.max=le16_to_cpu(attr->u.range.max); } else /* Fixme: Handle long long */ attr->u.data=data; } static void attr_free_content_do(struct attr *attr) { if (!attr) return; if (HAS_OBJECT_FUNC(attr->type)) { struct navit_object *obj=attr->u.data; if (obj && obj->func && obj->func->unref) obj->func->unref(obj); } if (!(attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) && !(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end)) g_free(attr->u.data); } void attr_free_content(struct attr *attr) { attr_free_content_do(attr); memset(attr,0,sizeof(*attr)); } void attr_free(struct attr *attr) { attr_free_content_do(attr); g_free(attr); } void attr_dup_content(struct attr *src, struct attr *dst) { int size; dst->type=src->type; if (src->type >= attr_type_int_begin && src->type <= attr_type_int_end) dst->u.num=src->u.num; else if (src->type >= attr_type_object_begin && src->type <= attr_type_object_end) { if (HAS_OBJECT_FUNC(src->type)) { struct navit_object *obj=src->u.data; if (obj && obj->func && obj->func->ref) { dst->u.data=obj->func->ref(obj); } else dst->u.data=obj; } else dst->u.data=src->u.data; } else { size=attr_data_size(src); if (size) { dst->u.data=g_malloc(size); memcpy(dst->u.data, src->u.data, size); } } } struct attr * attr_dup(struct attr *attr) { struct attr *ret=g_new0(struct attr, 1); attr_dup_content(attr, ret); return ret; } void attr_list_free(struct attr **attrs) { int count=0; while (attrs && attrs[count]) { attr_free(attrs[count++]); } g_free(attrs); } struct attr ** attr_list_dup(struct attr **attrs) { struct attr **ret; int i,count=0; if (!attrs) return NULL; while (attrs[count]) count++; ret=g_new0(struct attr *, count+1); for (i = 0 ; i < count ; i++) ret[i]=attr_dup(attrs[i]); return ret; } int attr_from_line(char *line, char *name, int *pos, char *val_ret, char *name_ret) { int len=0,quoted; char *p,*e,*n; dbg(1,"get_tag %s from %s\n", name, line); if (name) len=strlen(name); if (pos) p=line+*pos; else p=line; for(;;) { while (*p == ' ') { p++; } if (! *p) return 0; n=p; e=strchr(p,'='); if (! e) return 0; p=e+1; quoted=0; while (*p) { if (*p == ' ' && !quoted) break; if (*p == '"') quoted=1-quoted; p++; } if (name == NULL || (e-n == len && !strncmp(n, name, len))) { if (name_ret) { len=e-n; strncpy(name_ret, n, len); name_ret[len]='\0'; } e++; len=p-e; if (e[0] == '"') { e++; len-=2; } strncpy(val_ret, e, len); val_ret[len]='\0'; if (pos) *pos=p-line; return 1; } } return 0; } /** * Check if an enumeration of attribute types contains a specific attribute. * * @param types Pointer to the attr_type enumeration to be searched * @param type The attr_type to be searched for * * @return 1 if the attribute type was found, 0 if it was not found or if a null pointer was passed as types */ int attr_types_contains(enum attr_type *types, enum attr_type type) { while (types && *types != attr_none) { if (*types == type) return 1; types++; } return 0; } /** * Check if an enumeration of attribute types contains a specific attribute. * It is different from attr_types_contains in that it returns a caller-defined value if the pointer to the enumeration is NULL. * * @param types Pointer to the attr_type enumeration to be searched * @param type The attr_type to be searched for * @param deflt The default value to return if types is NULL. * * @return 1 if the attribute type was found, 0 if it was not found, the value of the deflt argument if types is NULL. */ int attr_types_contains_default(enum attr_type *types, enum attr_type type, int deflt) { if (!types) { return deflt; } return attr_types_contains(types, type); } navit-0.5.0~svn5643+dfsg.1/navit/attr.h000066400000000000000000000165251221777731700174550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_ATTR_H #define NAVIT_ATTR_H #ifdef __cplusplus extern "C" { #endif #include "projection.h" enum item_type; enum attr_type { #define ATTR2(x,y) attr_##y=x, #define ATTR(x) attr_##x, #include "attr_def.h" #undef ATTR2 #undef ATTR }; enum attr_format { attr_format_default=0, attr_format_with_units=1, }; #define AF_ONEWAY (1<<0) #define AF_ONEWAYREV (1<<1) #define AF_NOPASS (AF_ONEWAY|AF_ONEWAYREV) #define AF_ONEWAYMASK (AF_ONEWAY|AF_ONEWAYREV) #define AF_SEGMENTED (1<<2) #define AF_ROUNDABOUT (1<<3) #define AF_ROUNDABOUT_VALID (1<<4) #define AF_ONEWAY_EXCEPTION (1<<5) #define AF_SPEED_LIMIT (1<<6) #define AF_RESERVED1 (1<<7) #define AF_SIZE_OR_WEIGHT_LIMIT (1<<8) #define AF_THROUGH_TRAFFIC_LIMIT (1<<9) #define AF_TOLL (1<<10) #define AF_SEASONAL (1<<11) #define AF_UNPAVED (1<<12) #define AF_FORD (1<<13) #define AF_UNDERGROUND (1<<14) #define AF_DANGEROUS_GOODS (1<<19) #define AF_EMERGENCY_VEHICLES (1<<20) #define AF_TRANSPORT_TRUCK (1<<21) #define AF_DELIVERY_TRUCK (1<<22) #define AF_PUBLIC_BUS (1<<23) #define AF_TAXI (1<<24) #define AF_HIGH_OCCUPANCY_CAR (1<<25) #define AF_CAR (1<<26) #define AF_MOTORCYCLE (1<<27) #define AF_MOPED (1<<28) #define AF_HORSE (1<<29) #define AF_BIKE (1<<30) #define AF_PEDESTRIAN (1<<31) #define AF_PBH (AF_PEDESTRIAN|AF_BIKE|AF_HORSE) #define AF_MOTORIZED_FAST (AF_MOTORCYCLE|AF_CAR|AF_HIGH_OCCUPANCY_CAR|AF_TAXI|AF_PUBLIC_BUS|AF_DELIVERY_TRUCK|AF_TRANSPORT_TRUCK|AF_EMERGENCY_VEHICLES) #define AF_ALL (AF_PBH|AF_MOPED|AF_MOTORIZED_FAST) #define AF_DG_ANY (1<<0) #define AF_DG_WATER_HARMFUL (1<<1) #define AF_DG_EXPLOSIVE (1<<2) #define AF_DG_FLAMMABLE (1<<3) /* Values for attributes that could carry relative values */ #define ATTR_REL_MAXABS 0x40000000 #define ATTR_REL_RELSHIFT 0x60000000 enum attr_position_valid { attr_position_valid_invalid, attr_position_valid_static, attr_position_valid_extrapolated_time, attr_position_valid_extrapolated_spatial, attr_position_valid_valid, }; #define ATTR_IS_INT(x) ((x) >= attr_type_int_begin && (x) <= attr_type_int_end) #define ATTR_IS_DOUBLE(x) ((x) >= attr_type_double_begin && (x) <= attr_type_double_end) #define ATTR_IS_STRING(x) ((x) >= attr_type_string_begin && (x) <= attr_type_string_end) #define ATTR_IS_OBJECT(x) ((x) >= attr_type_object_begin && (x) <= attr_type_object_end) #define ATTR_IS_ITEM(x) ((x) >= attr_type_item_begin && (x) <= attr_type_item_end) #define ATTR_IS_COORD_GEO(x) ((x) >= attr_type_coord_geo_begin && (x) <= attr_type_coord_geo_end) #define ATTR_IS_NUMERIC(x) (ATTR_IS_INT(x) || ATTR_IS_DOUBLE(x)) #define ATTR_IS_COLOR(x) ((x) >= attr_type_color_begin && (x) <= attr_type_color_end) #define ATTR_IS_PCOORD(x) ((x) >= attr_type_pcoord_begin && (x) <= attr_type_pcoord_end) #define ATTR_IS_COORD(x) ((x) >= attr_type_coord_begin && (x) <= attr_type_coord_end) #define ATTR_IS_GROUP(x) ((x) >= attr_type_group_begin && (x) <= attr_type_group_end) #define ATTR_INT(x,y) ((struct attr){attr_##x,{(char *)(y)}}) #define ATTR_OBJECT(x,y) ((struct attr){attr_##x,{(char *)(y)}}) #define ATTR_DEF_STR(x,y) (&(struct attr){attr_##x,{y}}) #define ATTR_DEF_INT(x,y) (&(struct attr){attr_##x,{(char *)(y)}}) #define ATTR_DEF_ITEMS(x,...) (&(struct attr){attr_##x,{(char *)((enum item_type[]){__VA_ARGS__ , type_none})}}) #define ATTR_LIST(...) (struct attr *[]) { __VA_ARGS__, NULL} struct range { short min, max; }; struct attr { enum attr_type type; union { char *str; void *data; long num; struct item *item; enum item_type item_type; enum projection projection; double * numd; struct color *color; struct coord_geo *coord_geo; struct navit *navit; struct callback *callback; struct callback_list *callback_list; struct vehicle *vehicle; struct layout *layout; struct layer *layer; struct map *map; struct mapset *mapset; struct log *log; struct route *route; struct navigation *navigation; struct coord *coord; struct pcoord *pcoord; struct gui *gui; struct graphics *graphics; struct tracking *tracking; struct itemgra *itemgra; struct plugin *plugin; struct plugins *plugins; struct polygon *polygon; struct polyline *polyline; struct circle *circle; struct text *text; struct icon *icon; struct image *image; struct arrows *arrows; struct element *element; struct speech *speech; struct cursor *cursor; struct displaylist *displaylist; struct transformation *transformation; struct vehicleprofile *vehicleprofile; struct roadprofile *roadprofile; struct bookmarks *bookmarks; struct config *config; struct osd *osd; struct range range; struct navit_object *navit_object; int *dash; enum item_type *item_types; enum attr_type *attr_types; long long *num64; struct attr *attrs; } u; }; struct attr_iter; /* prototypes */ void attr_create_hash(void); void attr_destroy_hash(void); enum attr_type attr_from_name(const char *name); char *attr_to_name(enum attr_type attr); struct attr *attr_new_from_text(const char *name, const char *value); char *attr_to_text_ext(struct attr *attr, char *sep, enum attr_format fmt, enum attr_format def_fmt, struct map *map); char *attr_to_text(struct attr *attr, struct map *map, int pretty); struct attr *attr_search(struct attr **attrs, struct attr *last, enum attr_type attr); int attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct attr **attr_generic_set_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_add_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_add_attr_list(struct attr **attrs, struct attr **add); struct attr **attr_generic_prepend_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_remove_attr(struct attr **attrs, struct attr *attr); enum attr_type attr_type_begin(enum attr_type type); int attr_data_size(struct attr *attr); void *attr_data_get(struct attr *attr); void attr_data_set(struct attr *attr, void *data); void attr_data_set_le(struct attr *attr, void *data); void attr_free_content(struct attr *attr); void attr_free(struct attr *attr); void attr_dup_content(struct attr *src, struct attr *dst); struct attr *attr_dup(struct attr *attr); void attr_list_free(struct attr **attrs); struct attr **attr_list_dup(struct attr **attrs); struct attr **attr_list_append(struct attr **attrs, struct attr *attr); int attr_from_line(char *line, char *name, int *pos, char *val_ret, char *name_ret); int attr_types_contains(enum attr_type *types, enum attr_type type); int attr_types_contains_default(enum attr_type *types, enum attr_type type, int deflt); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/attr_def.h000066400000000000000000000236151221777731700202710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* prototypes */ /* common */ ATTR2(0x00000000,none) ATTR(any) ATTR(any_xml) ATTR2(0x00010000,type_item_begin) ATTR(town_streets_item) ATTR(street_name_item) ATTR(street_name_numbers_item) ATTR(street_item) ATTR(street_number_item) ATTR(position_sat_item) ATTR(current_item) ATTR2(0x0001ffff,type_item_end) ATTR2(0x00020000,type_int_begin) ATTR(h_remove) ATTR(id) ATTR(flags) ATTR(w_remove) ATTR(x_remove) ATTR(y_remove) ATTR(flush_size) ATTR(flush_time) ATTR(zipfile_ref) ATTR(country_id) ATTR(position_sats) ATTR(position_sats_used) ATTR(update) ATTR(follow) ATTR(length) ATTR(time) ATTR(destination_length) ATTR(destination_time) ATTR(speed) ATTR(interval) ATTR(position_qual) ATTR(zoom) ATTR(retry_interval) ATTR(projection) ATTR(offroad) ATTR(vocabulary_name) ATTR(vocabulary_name_systematic) ATTR(vocabulary_distances) ATTR(announce_name_systematic_first) ATTR(antialias) ATTR(order_delta) ATTR(baudrate) ATTR(font_size_remove) ATTR(icon_xs) ATTR(icon_l) ATTR(icon_s) ATTR(spacing) ATTR(recent_dest) ATTR(destination_distance) ATTR(check_version) ATTR(details) ATTR(width) ATTR(offset) ATTR(directed) ATTR(radius) ATTR(text_size) ATTR(level) ATTR(icon_w) ATTR(icon_h) ATTR(rotation) ATTR(checksum_ignore) ATTR(position_fix_type) ATTR(timeout) ATTR(orientation) ATTR(keyboard) ATTR(position_sats_signal) ATTR(cps) ATTR(fast) ATTR(osd_configuration) ATTR(columns) ATTR(align) ATTR(sat_prn) ATTR(sat_elevation) ATTR(sat_azimuth) ATTR(sat_snr) ATTR(autozoom) ATTR(version) ATTR(autozoom_min) ATTR(maxspeed) ATTR(cdf_histsize) ATTR(message_maxage) ATTR(message_maxnum) ATTR(pitch) ATTR(roll) ATTR(yaw) ATTR(route_status) ATTR(route_weight) ATTR(distance_metric) ATTR(route_mode) ATTR(maxspeed_handling) ATTR(flags_forward_mask) ATTR(flags_reverse_mask) ATTR(house_number_interpolation) ATTR(house_number_left_interpolation) ATTR(house_number_right_interpolation) ATTR(delay) ATTR(lag) ATTR(bpp) ATTR(fullscreen) ATTR(windowid) ATTR(hog) ATTR(flags_town) ATTR(flags_street) ATTR(flags_house_number) ATTR(use_camera) ATTR(flags_graphics) ATTR(zoom_min) ATTR(zoom_max) ATTR(gamma) ATTR(brightness) ATTR(contrast) ATTR(height) ATTR(minspeed) ATTR(recspeed) ATTR(speed_cond) ATTR(shmkey) ATTR(vehicle_width) ATTR(vehicle_length) ATTR(vehicle_height) ATTR(vehicle_weight) ATTR(vehicle_axle_weight) ATTR(vehicle_dangerous_goods) ATTR(shmsize) ATTR(shmoffset) ATTR(speed_category) ATTR(static_speed) ATTR(static_distance) ATTR(through_traffic_penalty) ATTR(through_traffic_flags) ATTR(speed_exceed_limit_offset) ATTR(speed_exceed_limit_percent) ATTR(map_border) ATTR(angle_pref) ATTR(connected_pref) ATTR(nostop_pref) ATTR(offroad_limit_pref) ATTR(route_pref) ATTR(overspeed_pref) ATTR(overspeed_percent_pref) ATTR(autosave_period) ATTR(tec_type) ATTR(tec_dirtype) ATTR(tec_direction) ATTR(imperial) ATTR(update_period) ATTR(tunnel_extrapolation) ATTR(street_count) ATTR(min_dist) ATTR(max_dist) ATTR(cache_size) ATTR(battery_voltage) /* mV */ ATTR(battery_current) /* mA */ ATTR(battery_capacity) /* Wh */ ATTR(battery_capacity_rel) /* ppm */ ATTR(battery_charge) /* mAh */ ATTR(battery_resistance) /* mOhm */ ATTR(battery_temperature) /* mK */ ATTR(turn_around_count) ATTR(turn_around_penalty) ATTR(turn_around_penalty2) ATTR(autozoom_max) ATTR2(0x00027500,type_rel_abs_begin) /* These attributes are int that can either hold relative * * or absolute values. A relative value is indicated by * * adding 0x60000000. * * * * The range of valid absolute values is -0x40000000 to * * 0x40000000, the range of relative values is from * * -0x20000000 to 0x20000000. */ ATTR(h) ATTR(w) ATTR(x) ATTR(y) ATTR(font_size) ATTR2(0x00028000,type_boolean_begin) /* boolean */ ATTR(overwrite) ATTR(active) ATTR(follow_cursor) ATTR(orientation_removeme) ATTR(tracking) ATTR(menubar) ATTR(statusbar) ATTR(toolbar) ATTR(animate) ATTR(lazy) ATTR(mkdir) ATTR(predraw) ATTR(postdraw) ATTR(button) ATTR(ondemand) ATTR(menu_on_map_click) ATTR(direction) ATTR(route_follow_straight_REMOVE) // This is to be removed with the next version ATTR(gui_speech) ATTR(town_id) /* fixme? */ ATTR(street_id) /* fixme? */ ATTR(district_id) /* fixme? */ ATTR(drag_bitmap) ATTR(use_mousewheel) ATTR(fullscreen_old) ATTR(position_magnetic_direction) ATTR(use_overlay) ATTR(night_mode) ATTR(autozoom_active) ATTR(position_valid) ATTR(frame) ATTR(tell_street_name) ATTR(bluetooth) ATTR(signal_on_map_click) ATTR(route_active) ATTR(search_active) ATTR(unsuspend) ATTR(announce_on) ATTR(disable_reset) ATTR(autostart) ATTR(readwrite) ATTR(cache) ATTR(create) ATTR(persistent) ATTR(waypoints_flag) /* toggle for "set as destination" to switch between start a new route or add */ ATTR(no_warning_if_map_file_missing) ATTR(duplicate) ATTR2(0x0002ffff,type_int_end) ATTR2(0x00030000,type_string_begin) ATTR(type) ATTR(label) ATTR(data) ATTR(charset) ATTR(country_all) ATTR(country_iso3) ATTR(country_iso2) ATTR(country_car) ATTR(country_name) ATTR(town_name) ATTR(town_postal) ATTR(district_name) ATTR(street_name) ATTR(street_name_systematic) ATTR(street_number) ATTR(debug) ATTR(address) ATTR(phone) ATTR(entry_fee) ATTR(open_hours) ATTR(skin) ATTR(fullscreen_removeme) ATTR(view_mode) ATTR(tilt) ATTR(window_title) ATTR(media_cmd) ATTR(image_codec) /* poi */ ATTR(icono) ATTR(info_html) ATTR(price_html) /* navigation */ ATTR(navigation_short) ATTR(navigation_long) ATTR(navigation_long_exact) ATTR(navigation_speech) ATTR(name) ATTR(cursorname) ATTR(source) ATTR(description) ATTR(gc_type) ATTR(layout_removeme) ATTR(position_nmea) ATTR(gpsd_query) ATTR(on_eof) ATTR(command) ATTR(src) ATTR(path) ATTR(font) ATTR(url_local) ATTR(gc_size) ATTR(gc_difficulty) ATTR(gc_terrain) ATTR(icon_src) ATTR(position_time_iso8601) ATTR(house_number) ATTR(osm_member) ATTR(osm_tag) ATTR(municipality_name) ATTR(county_name) ATTR(state_name) ATTR(message) ATTR(callbacks) ATTR(enable_expression) ATTR(fax) ATTR(email) ATTR(url) ATTR(profilename) ATTR(projectionname) ATTR(town_or_district_name) ATTR(postal) ATTR(postal_mask) ATTR(house_number_first) ATTR(house_number_last) ATTR(house_number_left_first) ATTR(house_number_left_last) ATTR(house_number_right_first) ATTR(house_number_right_last) ATTR(town_name_match) ATTR(district_name_match) ATTR(street_name_match) ATTR(language) ATTR(subtype) ATTR(filter) ATTR(daylayout) ATTR(nightlayout) ATTR(xml_text) ATTR(layout_name) ATTR(user_name) ATTR(user_pass) ATTR(status_text) ATTR(log_gpx_desc) ATTR(map_pass) ATTR(validity_period) ATTR(socket) ATTR(house_number_left) ATTR(house_number_left_odd) ATTR(house_number_left_even) ATTR(house_number_right) ATTR(house_number_right_odd) ATTR(house_number_right_even) ATTR(map_release) ATTR(accesskey) ATTR(http_method) ATTR(http_header) ATTR(progress) ATTR(sample_dir) ATTR(sample_suffix) ATTR(dbus_destination) ATTR(dbus_path) ATTR(dbus_interface) ATTR(dbus_method) ATTR(osm_is_in) ATTR(event_loop_system) ATTR(map_name) ATTR(item_name) ATTR(state_file) ATTR(on_map_click) ATTR(route_depth) ATTR(ref) ATTR(tile_name) ATTR(first_key) ATTR(last_key) ATTR(src_dir) ATTR(refresh_cond) ATTR2(0x0003ffff,type_string_end) ATTR2(0x00040000,type_special_begin) ATTR(order) ATTR(item_type) ATTR(item_types) ATTR(dash) ATTR(sequence_range) ATTR(angle_range) ATTR(speed_range) ATTR(attr_types) ATTR(ch_edge) ATTR(zipfile_ref_block) ATTR(item_id) ATTR(pdl_gps_update) ATTR2(0x0004ffff,type_special_end) ATTR2(0x00050000,type_double_begin) ATTR(position_height) ATTR(position_speed) ATTR(position_direction) ATTR(position_hdop) ATTR(position_radius) ATTR(position_longitude) ATTR(position_latitude) ATTR(position_direction_matched) ATTR2(0x0005ffff,type_double_end) ATTR2(0x00060000,type_coord_geo_begin) ATTR(position_coord_geo) ATTR(center) ATTR(click_coord_geo) ATTR2(0x0006ffff,type_coord_geo_end) ATTR2(0x00070000,type_color_begin) ATTR(color) ATTR(color2) ATTR(background_color) ATTR(text_color) ATTR(idle_color) ATTR(background_color2) ATTR2(0x0007ffff,type_color_end) ATTR2(0x00080000,type_object_begin) ATTR(navit) ATTR(log) ATTR(callback) ATTR(route) ATTR(navigation) ATTR(vehicle) ATTR(map) ATTR(bookmark_map) ATTR(bookmarks) ATTR(former_destination_map) ATTR(graphics) ATTR(gui) ATTR(trackingo) /* fixme */ ATTR(plugins) ATTR(layer) ATTR(itemgra) ATTR(polygon) ATTR(polyline) ATTR(circle) ATTR(text) ATTR(icon) ATTR(image) ATTR(arrows) ATTR(mapset) ATTR(osd) ATTR(plugin) ATTR(speech) ATTR(coord) ATTR(private_data) ATTR(callback_list) ATTR(displaylist) ATTR(transformation) ATTR(vehicleprofile) ATTR(roadprofile) ATTR(announcement) ATTR(cursor) ATTR(config) ATTR(maps) ATTR(layout) ATTR(profile_option) ATTR(script) ATTR2(0x0008ffff,type_object_end) ATTR2(0x00090000,type_coord_begin) ATTR2(0x0009ffff,type_coord_end) ATTR2(0x000a0000,type_pcoord_begin) ATTR(destination) ATTR(position) ATTR2(0x000affff,type_pcoord_end) ATTR2(0x000b0000,type_callback_begin) ATTR(resize) ATTR(motion) ATTR(keypress) ATTR(window_closed) ATTR(log_gpx) ATTR(log_textfile) ATTR(graphics_ready) ATTR(destroy) ATTR(wm_copydata) ATTR2(0x000bffff,type_callback_end) ATTR2(0x000c0000,type_int64_begin) ATTR(osm_nodeid) ATTR(osm_wayid) ATTR(osm_relationid) ATTR2(0x000cffff,type_int64_end) ATTR2(0x000d0000,type_group_begin) ATTR(speed_dep) ATTR2(0x000dffff,type_group_end) ATTR2(0x000e0000,type_item_type_begin) ATTR(alt_item_type) ATTR2(0x000effff,type_item_type_end) navit-0.5.0~svn5643+dfsg.1/navit/autoload/000077500000000000000000000000001221777731700201315ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/autoload/Makefile.am000066400000000000000000000001041221777731700221600ustar00rootroot00000000000000SUBDIRS= if USE_OSSO SUBDIRS += osso endif DIST_SUBDIRS= osso navit-0.5.0~svn5643+dfsg.1/navit/autoload/osso/000077500000000000000000000000001221777731700211145ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/autoload/osso/CMakeLists.txt000066400000000000000000000000531221777731700236520ustar00rootroot00000000000000module_add_library(autoload_osso osso.c) navit-0.5.0~svn5643+dfsg.1/navit/autoload/osso/Makefile.am000066400000000000000000000005121221777731700231460ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBOSSO_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_osso moduleautoload_LTLIBRARIES = libplugin_osso.la libplugin_osso_la_LDFLAGS=-module -avoid-version @NAVIT_MODULE_LDFLAGS@ @LIBOSSO_LIBS@ #-Wl,--no-undefined libplugin_osso_la_SOURCES = osso.c navit-0.5.0~svn5643+dfsg.1/navit/autoload/osso/osso.c000066400000000000000000000045351221777731700222520ustar00rootroot00000000000000#include #include #include "config.h" #include "debug.h" #include "item.h" #include "attr.h" #include "navit.h" #include "plugin.h" #include "callback.h" #include "config_.h" static osso_context_t *osso_context; static struct attr callback = { attr_callback }; extern char *version; struct cb_hw_state_trail { struct navit* nav; osso_hw_state_t *state; }; static void osso_display_on(struct navit *this_) { osso_return_t err; err = osso_display_blanking_pause(osso_context); dbg(1, "Unblank result: ", err == OSSO_OK ? "Ok" : (err == OSSO_ERROR ? "Error" : "Invalid context")); } static gboolean osso_cb_hw_state_idle(struct cb_hw_state_trail * params) { dbg(0, "(inact=%d, save=%d, shut=%d, memlow=%d, state=%d)\n", params->state->system_inactivity_ind, params->state->save_unsaved_data_ind, params->state->shutdown_ind, params->state->memory_low_ind, params->state->sig_device_mode_ind); if (params->state->shutdown_ind) { /* we are going down, down, down */ navit_destroy(params->nav); } g_free(params->state); g_free(params); return FALSE; } /** * * Handle osso events * * @param state Osso hardware state * * @param data ptr to private data * * @returns nothing **/ static void osso_cb_hw_state(osso_hw_state_t * state, gpointer data) { struct navit *nav = (struct navit*)data; struct cb_hw_state_trail *params = g_new(struct cb_hw_state_trail,1); params->nav=nav; params->state = g_new(osso_hw_state_t, 1); memcpy(params->state, state, sizeof(osso_hw_state_t)); g_idle_add((GSourceFunc) osso_cb_hw_state_idle, params); } static void osso_navit(struct navit *nav, int add) { dbg(1, "Installing osso context for org.navit_project.navit\n"); osso_context = osso_initialize("org.navit_project.navit", version, TRUE, NULL); if (osso_context == NULL) { dbg(0, "error initiating osso context\n"); } osso_hw_set_event_cb(osso_context, NULL, osso_cb_hw_state, nav); if (add > 0) { /* add callback to unblank screen */ navit_add_callback(nav, callback_new_attr_0(callback_cast (osso_display_on), attr_unsuspend)); } } void plugin_init(void) { //struct callback *cb; dbg(2, "enter\n"); callback.u.callback = callback_new_attr_0(callback_cast(osso_navit), attr_navit); config_add_attr(config, &callback); } void plugin_deinit(void) { osso_deinitialize(osso_context); } navit-0.5.0~svn5643+dfsg.1/navit/binding/000077500000000000000000000000001221777731700177335ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/binding/Makefile.am000066400000000000000000000002441221777731700217670ustar00rootroot00000000000000SUBDIRS= if BINDING_PYTHON SUBDIRS+=python endif if BINDING_DBUS SUBDIRS+=dbus endif if BINDING_WIN32 SUBDIRS+=win32 endif DIST_SUBDIRS=python dbus win32 navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/000077500000000000000000000000001221777731700206705ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/CMakeLists.txt000066400000000000000000000005751221777731700234370ustar00rootroot00000000000000module_add_library(binding_dbus binding_dbus.c) set(bindir ${CMAKE_INSTALL_PREFIX}/${BIN_DIR}) configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/org.navit_project.navit.service.in" "${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service" ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dbus-1/services/) navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/Makefile.am000066400000000000000000000011441221777731700227240ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_dbus modulebinding_LTLIBRARIES = libbinding_dbus.la libbinding_dbus_la_SOURCES = binding_dbus.c libbinding_dbus_la_LIBADD = @DBUS_LIBS@ libbinding_dbus_la_LDFLAGS = -module -avoid-version servicedir = @DBUS_SERVICE_DIR@ service_in_files = org.navit_project.navit.service.in service_DATA = $(service_in_files:.service.in=.service) $(service_DATA): $(service_in_files) Makefile sed -e "s|\@bindir\@|$(bindir)|" $< > $@ EXTRA_DIST = $(service_in_files) distclean-local: rm -f $(service_DATA) navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/binding_dbus.c000066400000000000000000002066351221777731700234770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #define DBUS_API_SUBJECT_TO_CHANGE #include #include #include #include "config.h" #include "config_.h" #include "navit.h" #include "coord.h" #include "point.h" #include "plugin.h" #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "attr.h" #include "layout.h" #include "navigation.h" #include "command.h" #include "callback.h" #include "graphics.h" #include "track.h" #include "vehicle.h" #include "vehicleprofile.h" #include "map.h" #include "mapset.h" #include "osd.h" #include "route.h" #include "search.h" #include "callback.h" #include "gui.h" #include "layout.h" #include "roadprofile.h" #include "util.h" static DBusConnection *connection; static dbus_uint32_t dbus_serial; static char *service_name = "org.navit_project.navit"; static char *object_path = "/org/navit_project/navit"; char *navitintrospectxml_head1 = "\n" "\n" " \n" " \n" " \n" " \n" " \n"; GHashTable *object_hash; GHashTable *object_hash_rev; GHashTable *object_count; struct dbus_callback { struct callback *callback; char *signal; }; static char * object_new(char *type, void *object) { int id; char *ret; dbg(1,"enter %s\n", type); if ((ret=g_hash_table_lookup(object_hash_rev, object))) return ret; id=GPOINTER_TO_INT(g_hash_table_lookup(object_count, type)); g_hash_table_insert(object_count, type, GINT_TO_POINTER((id+1))); ret=g_strdup_printf("%s/%s/%d", object_path, type, id); g_hash_table_insert(object_hash, ret, object); g_hash_table_insert(object_hash_rev, object, ret); dbg(1,"return %s\n", ret); return (ret); } static void * object_get(const char *path) { return g_hash_table_lookup(object_hash, path); } static void object_destroy(const char *path, void *object) { if (!path && !object) return; if (!object) object=g_hash_table_lookup(object_hash, path); if (!path) path=g_hash_table_lookup(object_hash_rev, object); g_hash_table_remove(object_hash, path); g_hash_table_remove(object_hash_rev, object); } static void * resolve_object(const char *opath, char *type) { char *prefix; const char *oprefix; void *ret=NULL; char *def_navit="/default_navit"; char *def_gui="/default_gui"; char *def_graphics="/default_graphics"; char *def_vehicle="/default_vehicle"; char *def_vehicleprofile="/default_vehicleprofile"; char *def_mapset="/default_mapset"; char *def_map="/default_map"; char *def_navigation="/default_navigation"; char *def_route="/default_route"; char *def_tracking="/default_tracking"; struct attr attr; if (strncmp(opath, object_path, strlen(object_path))) { dbg(0,"wrong object path %s\n",opath); return NULL; } prefix=g_strdup_printf("%s/%s/", object_path, type); if (!strncmp(prefix, opath, strlen(prefix))) { ret=object_get(opath); g_free(prefix); return ret; } g_free(prefix); oprefix=opath+strlen(object_path); if (!strncmp(oprefix,def_navit,strlen(def_navit))) { oprefix+=strlen(def_navit); struct attr navit; if (!config_get_attr(config, attr_navit, &navit, NULL)) return NULL; if (!oprefix[0]) { dbg(0,"default_navit\n"); return navit.u.navit; } if (!strncmp(oprefix,def_graphics,strlen(def_graphics))) { if (navit_get_attr(navit.u.navit, attr_graphics, &attr, NULL)) { return attr.u.graphics; } return NULL; } if (!strncmp(oprefix,def_gui,strlen(def_gui))) { if (navit_get_attr(navit.u.navit, attr_gui, &attr, NULL)) { return attr.u.gui; } return NULL; } if (!strncmp(oprefix,def_vehicleprofile,strlen(def_vehicleprofile))) { if (navit_get_attr(navit.u.navit, attr_vehicleprofile, &attr, NULL)) { return attr.u.vehicleprofile; } return NULL; } if (!strncmp(oprefix,def_vehicle,strlen(def_vehicle))) { if (navit_get_attr(navit.u.navit, attr_vehicle, &attr, NULL)) { return attr.u.vehicle; } return NULL; } if (!strncmp(oprefix,def_mapset,strlen(def_mapset))) { oprefix+=strlen(def_mapset); if (navit_get_attr(navit.u.navit, attr_mapset, &attr, NULL)) { if (!oprefix[0]) { return attr.u.mapset; } if (!strncmp(oprefix,def_map,strlen(def_map))) { if (mapset_get_attr(attr.u.mapset, attr_map, &attr, NULL)) { return attr.u.map; } return NULL; } } return NULL; } if (!strncmp(oprefix,def_navigation,strlen(def_navigation))) { if (navit_get_attr(navit.u.navit, attr_navigation, &attr, NULL)) { return attr.u.navigation; } return NULL; } if (!strncmp(oprefix,def_route,strlen(def_route))) { oprefix+=strlen(def_route); if (navit_get_attr(navit.u.navit, attr_route, &attr, NULL)) { return attr.u.route; } return NULL; } if (!strncmp(oprefix,def_tracking,strlen(def_tracking))) { if (navit_get_attr(navit.u.navit, attr_trackingo, &attr, NULL)) { return attr.u.tracking; } return NULL; } } return NULL; } static void * object_get_from_message_arg(DBusMessageIter *iter, char *type) { char *opath; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH) return NULL; dbus_message_iter_get_basic(iter, &opath); dbus_message_iter_next(iter); return resolve_object(opath, type); } static void * object_get_from_message(DBusMessage *message, char *type) { return resolve_object(dbus_message_get_path(message), type); } static enum attr_type attr_type_get_from_message(DBusMessageIter *iter) { char *attr_type; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) return attr_none; dbus_message_iter_get_basic(iter, &attr_type); dbus_message_iter_next(iter); return attr_from_name(attr_type); } static void encode_variant_string(DBusMessageIter *iter, char *str) { DBusMessageIter variant; dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &variant); dbus_message_iter_append_basic(&variant, DBUS_TYPE_STRING, &str); dbus_message_iter_close_container(iter, &variant); } static void encode_dict_string_variant_string(DBusMessageIter *iter, char *key, char *value) { DBusMessageIter dict; dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict); dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &key); encode_variant_string(&dict, value); dbus_message_iter_close_container(iter, &dict); } static int encode_attr(DBusMessageIter *iter1, struct attr *attr) { char *name=attr_to_name(attr->type); DBusMessageIter iter2,iter3; dbus_message_iter_append_basic(iter1, DBUS_TYPE_STRING, &name); if (attr->type >= attr_type_int_begin && attr->type < attr_type_boolean_begin) { dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &iter2); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &attr->u.num); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_BOOLEAN_AS_STRING, &iter2); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_BOOLEAN, &attr->u.num); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { encode_variant_string(iter1, attr->u.str); } if ((attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) || attr->type == attr_item_type) { encode_variant_string(iter1, item_to_name(attr->u.item_type)); } if (attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, "ai", &iter2); dbus_message_iter_open_container(&iter2, DBUS_TYPE_ARRAY, "i", &iter3); if (attr->u.pcoord) { dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->pro); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->x); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->y); } dbus_message_iter_close_container(&iter2, &iter3); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { char *object=object_new(attr_to_name(attr->type), attr->u.data); dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter2); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_OBJECT_PATH, &object); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type == attr_item_types) { char *str=attr_to_text(attr,NULL,0); encode_variant_string(iter1, str); g_free(str); } return 1; } static DBusHandlerResult empty_reply(DBusConnection *connection, DBusMessage *message) { DBusMessage *reply; reply = dbus_message_new_method_return(message); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult dbus_error(DBusConnection *connection, DBusMessage *message, char *error, char *msg) { DBusMessage *reply; reply = dbus_message_new_error(message, error, msg); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult dbus_error_invalid_attr_type(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "attribute type invalid"); } static DBusHandlerResult dbus_error_invalid_parameter(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "parameter invalid"); } static DBusHandlerResult dbus_error_invalid_object_path(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path invalid"); } static DBusHandlerResult dbus_error_invalid_object_path_parameter(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path parameter invalid"); } static DBusHandlerResult dbus_error_no_data_available(DBusConnection *connection, DBusMessage *message) { #if 1 return dbus_error(connection, message, DBUS_ERROR_FILE_NOT_FOUND, "no data available"); #else return empty_reply(connection, message); #endif } #if 0 static void dbus_dump_iter(char *prefix, DBusMessageIter *iter) { char *prefixr,*vals; int arg,vali; DBusMessageIter iterr; while ((arg=dbus_message_iter_get_arg_type(iter)) != DBUS_TYPE_INVALID) { switch (arg) { case DBUS_TYPE_INT32: dbus_message_iter_get_basic(iter, &vali); dbg(0,"%sDBUS_TYPE_INT32: %d\n",prefix,vali); break; case DBUS_TYPE_STRING: dbus_message_iter_get_basic(iter, &vals); dbg(0,"%sDBUS_TYPE_STRING: %s\n",prefix,vals); break; case DBUS_TYPE_STRUCT: dbg(0,"%sDBUS_TYPE_STRUCT:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; case DBUS_TYPE_VARIANT: dbg(0,"%sDBUS_TYPE_VARIANT:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; case DBUS_TYPE_DICT_ENTRY: dbg(0,"%sDBUS_TYPE_DICT_ENTRY:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; case DBUS_TYPE_ARRAY: dbg(0,"%sDBUS_TYPE_ARRAY:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; default: dbg(0,"%c\n",arg); } dbus_message_iter_next(iter); } } static void dbus_dump(DBusMessage *message) { DBusMessageIter iter; dbus_message_iter_init(message, &iter); dbus_dump_iter("",&iter); } #endif /** * Extracts a struct pcoord from a DBus message * * @param message The DBus message * @param iter Sort of pointer that points on that (iii)-object in the message * @param pc Pointer where the data should get stored * @returns Returns 1 when everything went right, otherwise 0 */ static int pcoord_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct pcoord *pc) { if(!strcmp(dbus_message_iter_get_signature(iter), "s")) { char *coordstring; dbus_message_iter_get_basic(iter, &coordstring); if(!pcoord_parse(coordstring, projection_mg, pc)) return 0; return 1; } else { DBusMessageIter iter2; dbus_message_iter_recurse(iter, &iter2); if(!strcmp(dbus_message_iter_get_signature(iter), "(is)")) { char *coordstring; int projection; dbus_message_iter_get_basic(&iter2, &projection); dbus_message_iter_next(&iter2); dbus_message_iter_get_basic(&iter2, &coordstring); if(!pcoord_parse(coordstring, projection, pc)) return 0; return 1; } else if(!strcmp(dbus_message_iter_get_signature(iter), "(iii)")) { dbus_message_iter_get_basic(&iter2, &pc->pro); dbus_message_iter_next(&iter2); dbus_message_iter_get_basic(&iter2, &pc->x); dbus_message_iter_next(&iter2); dbus_message_iter_get_basic(&iter2, &pc->y); return 1; } } return 0; } static void pcoord_encode(DBusMessageIter *iter, struct pcoord *pc) { DBusMessageIter iter2; dbus_message_iter_open_container(iter,DBUS_TYPE_STRUCT,NULL,&iter2); if (pc) { dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->pro); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->x); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->y); } else { int n=0; dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); } dbus_message_iter_close_container(iter, &iter2); } static enum attr_type decode_attr_type_from_iter(DBusMessageIter *iter) { char *attr_type; enum attr_type ret; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) return attr_none; dbus_message_iter_get_basic(iter, &attr_type); dbus_message_iter_next(iter); ret=attr_from_name(attr_type); dbg(1, "attr value: 0x%x string: %s\n", ret, attr_type); return ret; } static int decode_attr_from_iter(DBusMessageIter *iter, struct attr *attr) { DBusMessageIter iterattr, iterstruct; int ret=1; double d; attr->type=decode_attr_type_from_iter(iter); if (attr->type == attr_none) return 0; dbus_message_iter_recurse(iter, &iterattr); dbus_message_iter_next(iter); dbg(1, "seems valid. signature: %s\n", dbus_message_iter_get_signature(&iterattr)); if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) return 0; if (attr->type >= attr_type_int_begin && attr->type <= attr_type_boolean_begin) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_INT32) { dbus_message_iter_get_basic(&iterattr, &attr->u.num); return 1; } return 0; } if(attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_BOOLEAN) { dbus_message_iter_get_basic(&iterattr, &attr->u.num); return 1; } return 0; } if(attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRING) { dbus_message_iter_get_basic(&iterattr, &attr->u.str); return 1; } return 0; } if(attr->type >= attr_type_double_begin && attr->type <= attr_type_double_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_DOUBLE) { attr->u.numd=g_new(typeof(*attr->u.numd),1); dbus_message_iter_get_basic(&iterattr, attr->u.numd); return 1; } } if(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_OBJECT_PATH) { char *obj; dbus_message_iter_get_basic(&iterattr, &obj); attr->u.data=object_get(obj); if (attr->u.data) { return 1; } } return 0; } if(attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { attr->u.coord_geo=g_new(typeof(*attr->u.coord_geo),1); dbus_message_iter_recurse(&iterattr, &iterstruct); if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { dbus_message_iter_get_basic(&iterstruct, &d); dbus_message_iter_next(&iterstruct); attr->u.coord_geo->lng=d; } else ret=0; if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { dbus_message_iter_get_basic(&iterstruct, &d); attr->u.coord_geo->lat=d; } else ret=0; if (!ret) { g_free(attr->u.coord_geo); attr->u.coord_geo=NULL; } return ret; } } if (attr->type == attr_callback) { struct dbus_callback *callback=object_get_from_message_arg(&iterattr, "callback"); if (callback) { attr->u.callback=callback->callback; return 1; } } return 0; } static int decode_attr(DBusMessage *message, struct attr *attr) { DBusMessageIter iter; dbus_message_iter_init(message, &iter); return decode_attr_from_iter(&iter, attr); } static void destroy_attr(struct attr *attr) { if(attr->type > attr_type_double_begin && attr->type < attr_type_double_end) { g_free(attr->u.numd); } } static char * get_iter_name(char *type) { return g_strdup_printf("%s_attr_iter",type); } static DBusHandlerResult request_attr_iter(DBusConnection *connection, DBusMessage *message, char *type, struct attr_iter *(*func)(void)) { DBusMessage *reply; char *iter_name; char *opath; struct attr_iter *attr_iter; attr_iter=(*func)(); iter_name=get_iter_name(type); opath=object_new(iter_name,attr_iter); g_free(iter_name); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_attr_iter_destroy(DBusConnection *connection, DBusMessage *message, char *type, void (*func)(struct attr_iter *)) { struct attr_iter *attr_iter; DBusMessageIter iter; char *iter_name; dbus_message_iter_init(message, &iter); iter_name=get_iter_name(type); attr_iter=object_get_from_message_arg(&iter, iter_name); g_free(iter_name); if (! attr_iter) return dbus_error_invalid_object_path_parameter(connection, message); object_destroy(NULL, attr_iter); func(attr_iter); return empty_reply(connection, message); } static DBusHandlerResult request_destroy(DBusConnection *connection, DBusMessage *message, char *type, void *data, void (*func)(void *)) { if (!data) data=object_get_from_message(message, type); if (!data) return dbus_error_invalid_object_path(connection, message); object_destroy(NULL, data); func(data); return empty_reply(connection, message); } static DBusHandlerResult request_get_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) { DBusMessage *reply; DBusMessageIter iter; struct attr attr; enum attr_type attr_type; struct attr_iter *attr_iter; char *iter_name; if (! data) data = object_get_from_message(message, type); if (! data) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); attr_type=attr_type_get_from_message(&iter); if (attr_type == attr_none) return dbus_error_invalid_attr_type(connection, message); iter_name=get_iter_name(type); attr_iter=object_get_from_message_arg(&iter, iter_name); g_free(iter_name); if (func(data, attr_type, &attr, attr_iter)) { DBusMessageIter iter1; reply = dbus_message_new_method_return(message); dbus_message_iter_init_append(reply, &iter1); encode_attr(&iter1, &attr); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } return dbus_error_no_data_available(connection, message); } static DBusHandlerResult request_command(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) { DBusMessageIter iter; struct attr attr; char *command; if (! data) data = object_get_from_message(message, type); if (! data) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &command); dbus_message_iter_next(&iter); if (func(data, attr_callback_list, &attr, NULL)) { int valid=0; callback_list_call_attr_4(attr.u.callback_list, attr_command, command, NULL, NULL, &valid); } return empty_reply(connection, message); } static DBusHandlerResult request_set_add_remove_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, struct attr *attr)) { struct attr attr; int ret; if (! data) data = object_get_from_message(message, type); if (! data) return dbus_error_invalid_object_path(connection, message); if (decode_attr(message, &attr)) { ret=(*func)(data, &attr); destroy_attr(&attr); if (ret) return empty_reply(connection, message); dbg(0,"failed to set/add/remove attr\n"); } else { dbg(0,"failed to decode attr\n"); } return dbus_error_invalid_parameter(connection, message); } /* callback */ static void dbus_callback_emit_signal(struct dbus_callback *dbus_callback) { DBusMessage* msg; msg = dbus_message_new_signal(object_path, service_name, dbus_callback->signal); if (msg) { dbus_connection_send(connection, msg, &dbus_serial); dbus_connection_flush(connection); dbus_message_unref(msg); } } static void request_callback_destroy_do(struct dbus_callback *data) { callback_destroy(data->callback); g_free(data->signal); g_free(data); } static DBusHandlerResult request_callback_destroy(DBusConnection *connection, DBusMessage *message) { return request_destroy(connection, message, "callback", NULL, (void (*)(void *)) request_callback_destroy_do); } static DBusHandlerResult request_callback_new(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; DBusMessage *reply; struct dbus_callback *callback; char *signal,*opath; enum attr_type type; dbus_message_iter_init(message, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &signal); dbus_message_iter_next(&iter); callback=g_new0(struct dbus_callback, 1); callback->signal=g_strdup(signal); if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) { type=attr_type_get_from_message(&iter); callback->callback=callback_new_attr_1(callback_cast(dbus_callback_emit_signal), type, callback); } else callback->callback=callback_new_1(callback_cast(dbus_callback_emit_signal), callback); opath=object_new("callback", callback); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } /* config */ static DBusHandlerResult request_config_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "config", config, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))config_get_attr); } static DBusHandlerResult request_config_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "config", (struct attr_iter * (*)(void))config_attr_iter_new); } static DBusHandlerResult request_config_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "config", (void (*)(struct attr_iter *))config_attr_iter_destroy); } /* graphics */ static DBusHandlerResult request_graphics_get_data(DBusConnection *connection, DBusMessage *message) { struct graphics *graphics; char *data; struct graphics_data_image *image; DBusMessage *reply; graphics = object_get_from_message(message, "graphics"); if (! graphics) return dbus_error_invalid_object_path(connection, message); if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID)) return dbus_error_invalid_parameter(connection, message); image=graphics_get_data(graphics, data); if (image) { DBusMessageIter iter1,iter2; reply = dbus_message_new_method_return(message); #if 0 dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); #endif dbus_message_iter_init_append(reply, &iter1); dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "y", &iter2); if (image->data && image->size) dbus_message_iter_append_fixed_array(&iter2, DBUS_TYPE_BYTE, &image->data, image->size); dbus_message_iter_close_container(&iter1, &iter2); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } return dbus_error_no_data_available(connection, message); } /* gui */ static DBusHandlerResult request_gui_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); } static DBusHandlerResult request_gui_command(DBusConnection *connection, DBusMessage *message) { return request_command(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); } static DBusHandlerResult request_graphics_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "graphics", NULL, (int (*)(void *, struct attr *))graphics_set_attr); } /* layout */ static DBusHandlerResult request_layout_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "layout", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))layout_get_attr); } /* map */ static DBusHandlerResult request_map_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "map", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr); } static DBusHandlerResult request_map_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "map", NULL, (int (*)(void *, struct attr *))map_set_attr); } /* mapset */ static DBusHandlerResult request_mapset_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "mapset", (struct attr_iter * (*)(void))mapset_attr_iter_new); } static DBusHandlerResult request_mapset_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "mapset", (void (*)(struct attr_iter *))mapset_attr_iter_destroy); } static DBusHandlerResult request_mapset_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "mapset", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))mapset_get_attr); } /* navigation */ static DBusHandlerResult request_navigation_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "navigation", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navigation_get_attr); } /* osd */ static DBusHandlerResult request_osd_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "osd", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))osd_get_attr); } static DBusHandlerResult request_osd_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "osd", NULL, (int (*)(void *, struct attr *))osd_set_attr); } /* roadprofile */ static DBusHandlerResult request_roadprofile_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "roadprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))roadprofile_get_attr); } static DBusHandlerResult request_roadprofile_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "roadprofile", NULL, (int (*)(void *, struct attr *))roadprofile_set_attr); } static DBusHandlerResult request_roadprofile_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "roadprofile", (struct attr_iter * (*)(void))roadprofile_attr_iter_new); } static DBusHandlerResult request_roadprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "roadprofile", (void (*)(struct attr_iter *))roadprofile_attr_iter_destroy); } /* route */ static DBusHandlerResult request_route_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "route", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))route_get_attr); } static DBusHandlerResult request_route_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_set_attr); } static DBusHandlerResult request_route_add_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_add_attr); } static DBusHandlerResult request_route_remove_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_remove_attr); } /* navit */ static DBusHandlerResult request_navit_draw(DBusConnection *connection, DBusMessage *message) { struct navit *navit; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); navit_draw(navit); return empty_reply(connection, message); } /** * Extracts a struct point from a DBus message * * @param message The DBus message * @param iter Sort of pointer that points on that (ii)-object in the message * @param p Pointer where the data should get stored * @returns Returns 1 when everything went right, otherwise 0 */ static int point_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct point *p) { DBusMessageIter iter2; dbg(0,"%s\n", dbus_message_iter_get_signature(iter)); dbus_message_iter_recurse(iter, &iter2); if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) return 0; dbus_message_iter_get_basic(&iter2, &p->x); dbus_message_iter_next(&iter2); if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) return 0; dbus_message_iter_get_basic(&iter2, &p->y); dbg(0, " x -> %x y -> %x\n", p->x, p->y); dbus_message_iter_next(&iter2); if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INVALID) return 0; return 1; } /** * @brief Shows up a message * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the coordinates * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_add_message(DBusConnection *connection, DBusMessage *message) { struct navit *navit; char *usermessage; DBusMessageIter iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &usermessage); navit_add_message(navit, usermessage); return empty_reply(connection, message); } /** * @brief Centers the screen on a specified position \a pc on the world * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the coordinates * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_set_center(DBusConnection *connection, DBusMessage *message) { struct pcoord pc; struct navit *navit; DBusMessageIter iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!pcoord_get_from_message(message, &iter, &pc)) return dbus_error_invalid_parameter(connection, message); navit_set_center(navit, &pc, 0); return empty_reply(connection, message); } /** * @brief Centers the screen on a specified position \a p shown on the screen * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the x and y value * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_set_center_screen(DBusConnection *connection, DBusMessage *message) { struct point p; struct navit *navit; DBusMessageIter iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!point_get_from_message(message, &iter, &p)) return dbus_error_invalid_parameter(connection, message); navit_set_center_screen(navit, &p, 0); return empty_reply(connection, message); } /** * @brief Sets the layout to \a new_layout_name extracted from \a message * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the name of the layout * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_set_layout(DBusConnection *connection, DBusMessage *message) { char *new_layout_name; struct navit *navit; struct attr attr; struct attr_iter *iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &new_layout_name, DBUS_TYPE_INVALID)) return dbus_error_invalid_parameter(connection, message); iter=navit_attr_iter_new(); while(navit_get_attr(navit, attr_layout, &attr, iter)) { if (strcmp(attr.u.layout->name, new_layout_name) == 0) { navit_set_attr(navit, &attr); } } return empty_reply(connection, message); } static DBusHandlerResult request_navit_zoom(DBusConnection *connection, DBusMessage *message) { int factor; struct point p, *pp=NULL; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbg(0,"%s\n", dbus_message_iter_get_signature(&iter)); dbus_message_iter_get_basic(&iter, &factor); if (dbus_message_iter_has_next(&iter)) { dbus_message_iter_next(&iter); if (!point_get_from_message(message, &iter, &p)) return dbus_error_invalid_parameter(connection, message); pp=&p; } if (factor > 1) navit_zoom_in(navit, factor, pp); else if (factor < -1) navit_zoom_out(navit, 0-factor, pp); return empty_reply(connection, message); } static DBusHandlerResult request_navit_block(DBusConnection *connection, DBusMessage *message) { int mode; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &mode); navit_block(navit, mode); return empty_reply(connection, message); } static DBusHandlerResult request_navit_resize(DBusConnection *connection, DBusMessage *message) { struct navit *navit; int w, h; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbg(0,"%s\n", dbus_message_iter_get_signature(&iter)); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &w); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &h); dbg(0, " w -> %i h -> %i\n", w, h); navit_handle_resize(navit, w, h); return empty_reply(connection, message); } static DBusHandlerResult request_navit_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "navit", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr); } static DBusHandlerResult request_navit_attr_iter(DBusConnection *connection, DBusMessage *message) { DBusMessage *reply; struct attr_iter *attr_iter=navit_attr_iter_new(); char *opath=object_new("navit_attr_iter",attr_iter); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_navit_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { struct attr_iter *attr_iter; DBusMessageIter iter; dbus_message_iter_init(message, &iter); attr_iter=object_get_from_message_arg(&iter, "navit_attr_iter"); if (! attr_iter) return dbus_error_invalid_object_path_parameter(connection, message); navit_attr_iter_destroy(attr_iter); return empty_reply(connection, message); } static DBusHandlerResult request_navit_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_set_attr); } static DBusHandlerResult request_navit_add_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_add_attr); } static DBusHandlerResult request_navit_remove_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_remove_attr); } static DBusHandlerResult request_navit_set_position(DBusConnection *connection, DBusMessage *message) { struct pcoord pc; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!pcoord_get_from_message(message, &iter, &pc)) return dbus_error_invalid_parameter(connection, message); navit_set_position(navit, &pc); return empty_reply(connection, message); } static DBusHandlerResult request_navit_set_destination(DBusConnection *connection, DBusMessage *message) { struct pcoord pc; struct navit *navit; DBusMessageIter iter; char *description; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!pcoord_get_from_message(message, &iter, &pc)) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_next(&iter); dbus_message_iter_get_basic(&iter, &description); dbg(0, " destination -> %s\n", description); navit_set_destination(navit, &pc, description, 1); return empty_reply(connection, message); } static DBusHandlerResult request_navit_clear_destination(DBusConnection *connection, DBusMessage *message) { struct navit *navit; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); navit_set_destination(navit, NULL, NULL, 0); return empty_reply(connection, message); } static DBusHandlerResult request_navit_evaluate(DBusConnection *connection, DBusMessage *message) { struct navit *navit; char *command; char *result; struct attr attr; DBusMessage *reply; int error; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); attr.type=attr_navit; attr.u.navit=navit; if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &command, DBUS_TYPE_INVALID)) return dbus_error_invalid_parameter(connection, message); result=command_evaluate_to_string(&attr, command, &error); reply = dbus_message_new_method_return(message); if (error) dbus_message_append_args(reply, DBUS_TYPE_INT32, &error, DBUS_TYPE_INVALID); else if (result) dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } /* search_list */ static DBusHandlerResult request_search_list_destroy(DBusConnection *connection, DBusMessage *message) { return request_destroy(connection, message, "search_list", NULL, (void (*)(void *)) search_list_destroy); } void request_search_list_common(struct search_list_common *slc, DBusMessageIter *iter4) { if (slc->postal) encode_dict_string_variant_string(iter4, "postal", slc->postal); if (slc->postal_mask) encode_dict_string_variant_string(iter4, "postal_mask", slc->postal_mask); } static DBusHandlerResult request_search_list_get_result(DBusConnection *connection, DBusMessage *message) { struct search_list *search_list; struct search_list_result *result; DBusMessage *reply; DBusMessageIter iter,iter2,iter3,iter4; char *country="country"; char *town="town"; char *street="street"; char *house_number="housenumber"; search_list = object_get_from_message(message, "search_list"); if (! search_list) return dbus_error_invalid_object_path(connection, message); result=search_list_get_result(search_list); if (!result) return dbus_error_no_data_available(connection, message); reply = dbus_message_new_method_return(message); dbus_message_iter_init_append(reply, &iter); dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &result->id); pcoord_encode(&iter, result->c); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &iter2); if (result->country && (result->country->car || result->country->iso2 || result->country->iso3 || result->country->name)) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &country); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); if (result->country->car) encode_dict_string_variant_string(&iter4, "car", result->country->car); if (result->country->iso2) encode_dict_string_variant_string(&iter4, "iso2", result->country->iso2); if (result->country->iso3) encode_dict_string_variant_string(&iter4, "iso3", result->country->iso3); if (result->country->name) encode_dict_string_variant_string(&iter4, "name", result->country->name); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } if (result->town && (result->town->common.district_name || result->town->common.town_name)) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &town); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); request_search_list_common(&result->town->common,&iter4); if (result->town->common.district_name) encode_dict_string_variant_string(&iter4, "district", result->town->common.district_name); if (result->town->common.town_name) encode_dict_string_variant_string(&iter4, "name", result->town->common.town_name); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } if (result->street && result->street->name) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &street); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); request_search_list_common(&result->street->common,&iter4); if (result->street->name) encode_dict_string_variant_string(&iter4, "name", result->street->name); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } if (result->house_number && result->house_number->house_number) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &house_number); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); request_search_list_common(&result->house_number->common,&iter4); encode_dict_string_variant_string(&iter4, "name", result->house_number->house_number); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } dbus_message_iter_close_container(&iter, &iter2); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_search_list_new(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; DBusMessage *reply; struct mapset *mapset; struct search_list *search_list; char *opath; dbus_message_iter_init(message, &iter); mapset=object_get_from_message_arg(&iter, "mapset"); if (! mapset) return dbus_error_invalid_object_path_parameter(connection, message); search_list=search_list_new(mapset); opath=object_new("search_list", search_list); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_search_list_search(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; struct search_list *search_list; struct attr attr; int partial; search_list = object_get_from_message(message, "search_list"); if (! search_list) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!decode_attr_from_iter(&iter, &attr)) return dbus_error_invalid_parameter(connection, message); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &partial); search_list_search(search_list, &attr, partial); return empty_reply(connection, message); } static DBusHandlerResult request_search_list_select(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; struct search_list *search_list; int id, mode; enum attr_type attr_type; search_list = object_get_from_message(message, "search_list"); if (! search_list) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); attr_type=decode_attr_type_from_iter(&iter); if (attr_type == attr_none) return dbus_error_invalid_parameter(connection, message); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &id); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &mode); search_list_select(search_list, attr_type, id, mode); return empty_reply(connection, message); } /* tracking */ static DBusHandlerResult request_tracking_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "tracking", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr); } /* vehicle */ static DBusHandlerResult request_vehicle_set_attr(DBusConnection *connection, DBusMessage *message) { struct vehicle *vehicle; struct attr attr; int ret; vehicle = object_get_from_message(message, "vehicle"); if (! vehicle) return dbus_error_invalid_object_path(connection, message); if (decode_attr(message, &attr)) { ret=vehicle_set_attr(vehicle, &attr); destroy_attr(&attr); if (ret) return empty_reply(connection, message); } return dbus_error_invalid_parameter(connection, message); } /* vehicleprofile */ static DBusHandlerResult request_vehicleprofile_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicleprofile_get_attr); } static DBusHandlerResult request_vehicleprofile_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, struct attr *))vehicleprofile_set_attr); } static DBusHandlerResult request_vehicleprofile_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "vehicleprofile", (struct attr_iter * (*)(void))vehicleprofile_attr_iter_new); } static DBusHandlerResult request_vehicleprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "vehicleprofile", (void (*)(struct attr_iter *))vehicleprofile_attr_iter_destroy); } struct dbus_method { char *path; char *method; char *signature; char *signature_name; char *response; char *response_name; DBusHandlerResult(*func)(DBusConnection *connection, DBusMessage *message); } dbus_methods[] = { {"", "attr_iter", "", "", "o", "attr_iter", request_config_attr_iter}, {"", "attr_iter_destroy", "o", "attr_iter", "", "", request_config_attr_iter_destroy}, {"", "get_attr", "s", "attrname", "sv", "attrname,value",request_config_get_attr}, {"", "get_attr_wi", "so", "attrname,attr_iter", "sv", "attrname,value",request_config_get_attr}, {"", "callback_new", "s", "signalname", "o", "callback",request_callback_new}, {"", "callback_attr_new", "ss", "signalname,attribute", "o", "callback",request_callback_new}, {"", "search_list_new", "o", "mapset", "o", "search",request_search_list_new}, {".callback","destroy", "", "", "", "", request_callback_destroy}, {".graphics","get_data", "s", "type", "ay", "data", request_graphics_get_data}, {".graphics","set_attr", "sv", "attribute,value", "", "", request_graphics_set_attr}, {".gui", "get_attr", "s", "attribute", "sv", "attrname,value", request_gui_get_attr}, {".gui", "command_parameter", "sa{sa{sv}}","command,parameter", "a{sa{sv}}", "return", request_gui_command}, {".gui", "command", "s", "command", "a{sa{sv}}", "return", request_gui_command}, {".navit", "draw", "", "", "", "", request_navit_draw}, {".navit", "add_message", "s", "message", "", "", request_navit_add_message}, {".navit", "set_center_by_string","s", "(coordinates)", "", "", request_navit_set_center}, {".navit", "set_center", "(is)", "(projection,coordinates)", "", "", request_navit_set_center}, {".navit", "set_center", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_center}, {".navit", "set_center_screen", "(ii)", "(pixel_x,pixel_y)", "", "", request_navit_set_center_screen}, {".navit", "set_layout", "s", "layoutname", "", "", request_navit_set_layout}, {".navit", "zoom", "i(ii)", "factor(pixel_x,pixel_y)", "", "", request_navit_zoom}, {".navit", "zoom", "i", "factor", "", "", request_navit_zoom}, {".navit", "block", "i", "mode", "", "", request_navit_block}, {".navit", "resize", "ii", "upperleft,lowerright", "", "", request_navit_resize}, {".navit", "attr_iter", "", "", "o", "attr_iter", request_navit_attr_iter}, {".navit", "attr_iter_destroy", "o", "attr_iter", "", "", request_navit_attr_iter_destroy}, {".navit", "get_attr", "s", "attribute", "sv", "attrname,value", request_navit_get_attr}, {".navit", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_navit_get_attr}, {".navit", "set_attr", "sv", "attribute,value", "", "", request_navit_set_attr}, {".navit", "add_attr", "sv", "attribute,value", "", "", request_navit_add_attr}, {".navit", "remove_attr", "sv", "attribute,value", "", "", request_navit_remove_attr}, {".navit", "set_position", "s", "(coordinates)", "", "", request_navit_set_position}, {".navit", "set_position", "(is)", "(projection,coordinated)", "", "", request_navit_set_position}, {".navit", "set_position", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_position}, {".navit", "set_destination", "ss", "coordinates,comment", "", "", request_navit_set_destination}, {".navit", "set_destination", "(is)s", "(projection,coordinates)comment", "", "", request_navit_set_destination}, {".navit", "set_destination", "(iii)s", "(projection,longitude,latitude)comment", "", "", request_navit_set_destination}, {".navit", "clear_destination", "", "", "", "", request_navit_clear_destination}, {".navit", "evaluate", "s", "command", "s", "", request_navit_evaluate}, {".layout", "get_attr", "s", "attribute", "sv", "attrname,value", request_layout_get_attr}, {".map", "get_attr", "s", "attribute", "sv", "attrname,value", request_map_get_attr}, {".map", "set_attr", "sv", "attribute,value", "", "", request_map_set_attr}, {".mapset", "attr_iter", "", "", "o", "attr_iter", request_mapset_attr_iter}, {".mapset", "attr_iter_destroy", "o", "attr_iter", "", "", request_mapset_attr_iter_destroy}, {".mapset", "get_attr", "s", "attribute", "sv", "attrname,value", request_mapset_get_attr}, {".mapset", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_mapset_get_attr}, {".navigation","get_attr", "s", "attribute", "", "", request_navigation_get_attr}, {".osd", "get_attr", "s", "attribute", "sv", "attrname,value", request_osd_get_attr}, {".osd", "set_attr", "sv", "attribute,value", "", "", request_osd_set_attr}, {".roadprofile", "get_attr", "s", "attribute", "sv", "attrname,value", request_roadprofile_get_attr}, {".roadprofile", "get_attr_wi", "so", "attribute,attr_iter", "", "", request_roadprofile_get_attr}, {".roadprofile", "set_attr", "sv", "attribute,value", "", "", request_roadprofile_set_attr}, {".roadprofile", "attr_iter", "", "", "o", "attr_iter", request_roadprofile_attr_iter}, {".roadprofile", "attr_iter_destroy","o", "attr_iter", "", "", request_roadprofile_attr_iter_destroy}, {".route", "get_attr", "s", "attribute", "sv", "attrname,value", request_route_get_attr}, {".route", "set_attr", "sv", "attribute,value", "", "", request_route_set_attr}, {".route", "add_attr", "sv", "attribute,value", "", "", request_route_add_attr}, {".route", "remove_attr", "sv", "attribute,value", "", "", request_route_remove_attr}, {".search_list","destroy", "", "", "", "", request_search_list_destroy}, {".search_list","get_result", "", "", "i(iii)a{sa{sv}}", "id,coord,dict", request_search_list_get_result}, {".search_list","search", "svi", "attribute,value,partial", "", "", request_search_list_search}, {".search_list","select", "sii", "attribute_type,id,mode", "", "", request_search_list_select}, {".tracking","get_attr", "s", "attribute", "", "", request_tracking_get_attr}, {".vehicle","set_attr", "sv", "attribute,value", "", "", request_vehicle_set_attr}, {".vehicleprofile","get_attr", "s", "attribute", "", "", request_vehicleprofile_get_attr}, {".vehicleprofile","get_attr_wi", "so", "attribute,attr_iter", "", "", request_vehicleprofile_get_attr}, {".vehicleprofile","set_attr", "sv", "attribute,value", "", "", request_vehicleprofile_set_attr}, {".vehicleprofile","attr_iter", "", "", "o", "attr_iter", request_vehicleprofile_attr_iter}, {".vehicleprofile","attr_iter_destroy","o", "attr_iter", "", "", request_vehicleprofile_attr_iter_destroy}, }; static char * introspect_path(const char *object) { char *ret; int i; char *def=".default_"; int def_len=strlen(def); if (strncmp(object, object_path, strlen(object_path))) return NULL; ret=g_strdup(object+strlen(object_path)); dbg(1,"path=%s\n",ret); for (i = strlen(ret)-1 ; i >= 0 ; i--) { if (ret[i] == '/' || (ret[i] >= '0' && ret[i] <= '9')) ret[i]='\0'; else break; } for (i = 0 ; i < strlen(ret); i++) if (ret[i] == '/') ret[i]='.'; for (i = strlen(ret)-1 ; i >= 0 ; i--) { if (!strncmp(ret+i, def, def_len)) { memmove(ret+1,ret+i+def_len,strlen(ret+i+def_len)+1); break; } } return ret; } static char * generate_navitintrospectxml(const char *object) { int i,methods_size,n=0; char *navitintrospectxml; char *path=introspect_path(object); if (!path) return NULL; dbg(1,"path=%s\n",path); // write header and make navit introspectable navitintrospectxml = g_strdup_printf("%s%s%s\n", navitintrospectxml_head1, object, navitintrospectxml_head2); methods_size=sizeof(dbus_methods)/sizeof(struct dbus_method); for (i = 0 ; i < methods_size ; i++) { // start new interface if it's the first method or it changed if (strcmp(dbus_methods[i].path, path)) continue; if ((n == 0) || strcmp(dbus_methods[i-1].path, dbus_methods[i].path)) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", service_name, dbus_methods[i].path); n++; // start the new method navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].method); // set input signature if existent if (strcmp(dbus_methods[i].signature, "")) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].signature_name, dbus_methods[i].signature); // set response signature if existent if (strcmp(dbus_methods[i].response, "")) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].response_name, dbus_methods[i].response); // close the method navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n"); // close the interface if we reached the last method or the interface changes if ((methods_size == i+1) || ((methods_size > i+1) && strcmp(dbus_methods[i+1].path, dbus_methods[i].path))) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n\n"); } // close the "mother tag" navitintrospectxml = g_strconcat_printf(navitintrospectxml, "\n"); return navitintrospectxml; } static DBusHandlerResult navit_handler_func(DBusConnection *connection, DBusMessage *message, void *user_data) { int i; char *path; dbg(1,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { DBusMessage *reply; char *navitintrospectxml = generate_navitintrospectxml(dbus_message_get_path(message)); dbg(1,"Introspect %s:Result:%s\n",dbus_message_get_path(message), navitintrospectxml); if (navitintrospectxml) { reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_STRING, &navitintrospectxml, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); g_free(navitintrospectxml); return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } for (i = 0 ; i < sizeof(dbus_methods)/sizeof(struct dbus_method) ; i++) { path=g_strdup_printf("%s%s", service_name, dbus_methods[i].path); if (dbus_message_is_method_call(message, path, dbus_methods[i].method) && dbus_message_has_signature(message, dbus_methods[i].signature)) { g_free(path); return dbus_methods[i].func(connection, message); } g_free(path); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static DBusObjectPathVTable dbus_navit_vtable = { NULL, navit_handler_func, NULL }; #if 0 DBusHandlerResult filter(DBusConnection *connection, DBusMessage *message, void *user_data) { dbg(0,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } #endif static int dbus_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) { DBusMessage* msg; char *opath=object_new("navit",navit); char *interface=g_strdup_printf("%s%s", service_name, ".navit"); dbg(0,"enter %s %s %s\n",opath,command,interface); msg = dbus_message_new_signal(opath, interface, "signal"); if (msg) { DBusMessageIter iter1,iter2,iter3; dbus_message_iter_init_append(msg, &iter1); dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "{sv}", &iter2); if (in) { while (*in) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); encode_attr(&iter3, *in); dbus_message_iter_close_container(&iter2, &iter3); in++; } } dbus_message_iter_close_container(&iter1, &iter2); dbus_connection_send(connection, msg, &dbus_serial); dbus_connection_flush(connection); dbus_message_unref(msg); } g_free(interface); return 0; } static struct command_table commands[] = { {"dbus_send_signal",command_cast(dbus_cmd_send_signal)}, }; static void dbus_main_navit(struct navit *navit, int added) { struct attr attr; if (added==1) { DBusMessage* msg; char *opath=object_new("navit",navit); char *interface=g_strdup_printf("%s%s", service_name, ".navit"); command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); navit_add_attr(navit, &attr); msg = dbus_message_new_signal(opath, interface, "startup"); dbus_connection_send(connection, msg, &dbus_serial); dbus_connection_flush(connection); dbus_message_unref(msg); g_free(interface); } } void plugin_init(void) { DBusError error; struct attr callback; object_hash=g_hash_table_new(g_str_hash, g_str_equal); object_hash_rev=g_hash_table_new(NULL, NULL); object_count=g_hash_table_new(g_str_hash, g_str_equal); dbg(1,"enter\n"); dbus_error_init(&error); #ifdef DBUS_USE_SYSTEM_BUS connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); #else connection = dbus_bus_get(DBUS_BUS_SESSION, &error); #endif if (!connection) { dbg(0,"Failed to open connection to session message bus: %s\n", error.message); dbus_error_free(&error); return; } dbus_connection_setup_with_g_main(connection, NULL); #if 0 dbus_connection_add_filter(connection, filter, NULL, NULL); dbus_bus_add_match(connection, "type='signal',""interface='" DBUS_INTERFACE_DBUS "'", &error); #endif dbus_connection_register_fallback(connection, object_path, &dbus_navit_vtable, NULL); dbus_bus_request_name(connection, service_name, 0, &error); if (dbus_error_is_set(&error)) { dbg(0,"Failed to request name: %s", error.message); dbus_error_free (&error); } callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(dbus_main_navit),attr_navit); config_add_attr(config, &callback); } navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/eval.py000077500000000000000000000007671221777731700222060ustar00rootroot00000000000000#! /usr/bin/python import dbus import sys bus = dbus.SessionBus() conn = bus.get_object('org.navit_project.navit', '/org/navit_project/navit') iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit'); iter=iface.attr_iter(); navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi('navit',iter)[1]); iface.attr_iter_destroy(iter); navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit'); print navit_iface.evaluate(sys.argv[1]); navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/navit.introspect000066400000000000000000000020441221777731700241250ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/org.navit_project.navit.service.in000066400000000000000000000001011221777731700274240ustar00rootroot00000000000000[D-BUS Service] Name=org.navit_project.navit Exec=@bindir@/navit navit-0.5.0~svn5643+dfsg.1/navit/binding/dbus/test.py000077500000000000000000000007621221777731700222310ustar00rootroot00000000000000#! /usr/bin/python import dbus bus = dbus.SessionBus() conn = bus.get_object('org.navit_project.navit', '/org/navit_project/navit') iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit'); iter=iface.attr_iter(); navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi("navit",iter)[1]); iface.attr_iter_destroy(iter); navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit'); navit_iface.set_center((1,0x138a4a,0x5d773f)); navit-0.5.0~svn5643+dfsg.1/navit/binding/python/000077500000000000000000000000001221777731700212545ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/binding/python/CMakeLists.txt000066400000000000000000000002261221777731700240140ustar00rootroot00000000000000include_directories(${PYTHON_INCLUDE_DIRS}) module_add_library(binding_python attr.c binding_python.c config.c navigation.c navit.c pcoord.c route.c) navit-0.5.0~svn5643+dfsg.1/navit/binding/python/Makefile.am000066400000000000000000000006001221777731700233040ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @PYTHON_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_python modulebinding_LTLIBRARIES = libbinding_python.la libbinding_python_la_SOURCES = binding_python.c config.c navit.c pcoord.c route.c navigation.c attr.c common.h libbinding_python_la_LIBADD = @PYTHON_LIBS@ libbinding_python_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/binding/python/attr.c000066400000000000000000000041201221777731700223670ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "attr.h" typedef struct { PyObject_HEAD int ref; struct attr *attr; } attrObject; static PyObject * attr_func(attrObject *self, PyObject *args) { const char *file; int ret; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; ret=0; return Py_BuildValue("i",ret); } static PyMethodDef attr_methods[] = { {"func", (PyCFunction) attr_func, METH_VARARGS }, {NULL, NULL }, }; static PyObject * attr_getattr_py(PyObject *self, char *name) { return Py_FindMethod(attr_methods, self, name); } static void attr_destroy_py(attrObject *self) { if (! self->ref) attr_free(self->attr); } PyTypeObject attr_Type = { Obj_HEAD .tp_name="attr", .tp_basicsize=sizeof(attrObject), .tp_dealloc=(destructor)attr_destroy_py, .tp_getattr=attr_getattr_py, }; struct attr * attr_py_get(PyObject *self) { return ((attrObject *)self)->attr; } PyObject * attr_new_py(PyObject *self, PyObject *args) { attrObject *ret; const char *name,*value; if (!PyArg_ParseTuple(args, "ss", &name, &value)) return NULL; ret=PyObject_NEW(attrObject, &attr_Type); ret->attr=attr_new_from_text(name, value); ret->ref=0; return (PyObject *)ret; } PyObject * attr_new_py_ref(struct attr *attr) { attrObject *ret; ret=PyObject_NEW(attrObject, &attr_Type); ret->ref=1; ret->attr=attr; return (PyObject *)ret; } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/binding_python.c000066400000000000000000000173611221777731700244430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include #include "common.h" #include #include "coord.h" #include "projection.h" #include "debug.h" #include "item.h" #include "map.h" #include "mapset.h" #include "plugin.h" #include "debug.h" #include "item.h" #include "attr.h" #include "xmlconfig.h" #if defined(MS_WINDOWS) || defined(__CYGWIN__) #define Obj_HEAD PyObject_HEAD_INIT(NULL); #else #define Obj_HEAD PyObject_HEAD_INIT(&PyType_Type) #endif /* *** coord *** */ typedef struct { PyObject_HEAD struct coord *c; } coordObject; static void coord_destroy_py(coordObject *self); PyTypeObject coord_Type = { Obj_HEAD .tp_name="coord", .tp_basicsize=sizeof(coordObject), .tp_dealloc=(destructor)coord_destroy_py, }; /* *** map *** */ typedef struct { PyObject_HEAD int ref; struct map *m; } mapObject; static void map_destroy_py(mapObject *self); static PyObject *map_getattr_py(PyObject *self, char *name); PyTypeObject map_Type = { Obj_HEAD .tp_name="map", .tp_basicsize=sizeof(mapObject), .tp_dealloc=(destructor)map_destroy_py, .tp_getattr=map_getattr_py, }; /* *** IMPLEMENTATIONS *** */ /* *** coord *** */ static PyObject * coord_new_py(PyObject *self, PyObject *args) { coordObject *ret; int x,y; if (!PyArg_ParseTuple(args, "ii:navit.coord",&x,&y)) return NULL; ret=PyObject_NEW(coordObject, &coord_Type); ret->c=coord_new(x,y); return (PyObject *)ret; } static void coord_destroy_py(coordObject *self) { coord_destroy(self->c); } /* *** coord_rect *** */ typedef struct { PyObject_HEAD struct coord_rect *r; } coord_rectObject; static void coord_rect_destroy_py(coord_rectObject *self); PyTypeObject coord_rect_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) PyObject_HEAD_INIT(NULL); #else PyObject_HEAD_INIT(&PyType_Type) #endif .tp_name="coord_rect", .tp_basicsize=sizeof(coord_rectObject), .tp_dealloc=(destructor)coord_rect_destroy_py, }; static PyObject * coord_rect_new_py(PyObject *self, PyObject *args) { coord_rectObject *ret; coordObject *lu,*rd; if (!PyArg_ParseTuple(args, "O!O!:navit.coord_rect_rect",&coord_Type,&lu,&coord_Type,&rd)) return NULL; ret=PyObject_NEW(coord_rectObject, &coord_rect_Type); ret->r=coord_rect_new(lu->c,rd->c); return (PyObject *)ret; } static void coord_rect_destroy_py(coord_rectObject *self) { coord_rect_destroy(self->r); } /* *** map_rect *** */ typedef struct { PyObject_HEAD struct map_rect *mr; } map_rectObject; static void map_rect_destroy_py(map_rectObject *self); PyTypeObject map_rect_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) PyObject_HEAD_INIT(NULL); #else PyObject_HEAD_INIT(&PyType_Type) #endif .tp_name="map_rect", .tp_basicsize=sizeof(map_rectObject), .tp_dealloc=(destructor)map_rect_destroy_py, }; static PyObject * map_rect_new_py(mapObject *self, PyObject *args) { map_rectObject *ret; coord_rectObject *r; if (!PyArg_ParseTuple(args, "O!:navit.map_rect_rect",&coord_rect_Type,&r)) return NULL; ret=PyObject_NEW(map_rectObject, &map_rect_Type); ret->mr=map_rect_new(self->m, NULL); return (PyObject *)ret; } static void map_rect_destroy_py(map_rectObject *self) { map_rect_destroy(self->mr); } /* *** map *** */ static PyObject * map_dump_file_py(mapObject *self, PyObject *args) { const char *s; if (!PyArg_ParseTuple(args, "s",&s)) return NULL; map_dump_file(self->m, s); Py_RETURN_NONE; } static PyObject * map_set_attr_py(mapObject *self, PyObject *args) { PyObject *attr; if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) return NULL; map_set_attr(self->m, attr_py_get(attr)); Py_RETURN_NONE; } static PyMethodDef map_methods[] = { {"dump_file", (PyCFunction) map_dump_file_py, METH_VARARGS }, {"map_rect_new", (PyCFunction) map_rect_new_py, METH_VARARGS }, {"set_attr", (PyCFunction) map_set_attr_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * map_getattr_py(PyObject *self, char *name) { return Py_FindMethod(map_methods, self, name); } static PyObject * map_new_py(PyObject *self, PyObject *args) { mapObject *ret; char *type, *filename; if (!PyArg_ParseTuple(args, "ss:navit.map", &type, &filename)) return NULL; ret=PyObject_NEW(mapObject, &map_Type); ret->m=map_new(NULL,NULL); ret->ref=0; return (PyObject *)ret; } PyObject * map_py_ref(struct map *map) { mapObject *ret; ret=PyObject_NEW(mapObject, &map_Type); ret->m=map; ret->ref=1; return (PyObject *)ret; } static void map_destroy_py(mapObject *self) { if (!self->ref) map_destroy(self->m); } /* *** mapset *** */ typedef struct { PyObject_HEAD struct mapset *ms; } mapsetObject; static void mapset_destroy_py(mapsetObject *self); static PyObject *mapset_getattr_py(PyObject *self, char *name); PyTypeObject mapset_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) PyObject_HEAD_INIT(NULL); #else PyObject_HEAD_INIT(&PyType_Type) #endif .tp_name="mapset", .tp_basicsize=sizeof(mapsetObject), .tp_dealloc=(destructor)mapset_destroy_py, .tp_getattr=mapset_getattr_py, }; static PyObject * mapset_add_py(mapsetObject *self, PyObject *args) { mapObject *map; if (!PyArg_ParseTuple(args, "O:navit.mapset", &map)) return NULL; Py_INCREF(map); mapset_add_attr(self->ms, &(struct attr){attr_map,.u.map=map->m}); return Py_BuildValue(""); } static PyMethodDef mapset_methods[] = { {"add", (PyCFunction) mapset_add_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * mapset_getattr_py(PyObject *self, char *name) { return Py_FindMethod(mapset_methods, self, name); } static PyObject * mapset_new_py(PyObject *self, PyObject *args) { mapsetObject *ret; if (!PyArg_ParseTuple(args, ":navit.mapset")) return NULL; ret=PyObject_NEW(mapsetObject, &mapset_Type); ret->ms=mapset_new(NULL,NULL); return (PyObject *)ret; } static void mapset_destroy_py(mapsetObject *self) { mapset_destroy(self->ms); } static PyObject * config_load_py(PyObject *self, PyObject *args) { const char *file; int ret; xmlerror *error; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; ret=config_load(file, &error); return Py_BuildValue("i",ret); } static PyMethodDef navitMethods[]={ {"attr", attr_new_py, METH_VARARGS}, {"coord", coord_new_py, METH_VARARGS, "Create a new coordinate point."}, {"coord_rect", coord_rect_new_py, METH_VARARGS, "Create a new coordinate rectangle."}, {"map", map_new_py, METH_VARARGS, "Create a new map."}, {"mapset", mapset_new_py, METH_VARARGS, "Create a new mapset."}, {"config_load", config_load_py, METH_VARARGS, "Load a config"}, {"config", config_py, METH_VARARGS, "Get Config Object"}, {"pcoord", pcoord_py, METH_VARARGS}, {NULL, NULL, 0, NULL} }; PyObject * python_object_from_attr(struct attr *attr) { switch (attr->type) { case attr_navigation: return navigation_py_ref(attr->u.navigation); case attr_route: return route_py_ref(attr->u.route); default: return NULL; } return NULL; } void plugin_init(void) { int fd,size; char buffer[65536]; Py_Initialize(); Py_InitModule("navit", navitMethods); fd=open("startup.py",O_RDONLY); if (fd >= 0) { size=read(fd, buffer, 65535); if (size > 0) { buffer[size]='\0'; PyRun_SimpleString(buffer); } } Py_Finalize(); } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/common.h000066400000000000000000000033661221777731700227250ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #if defined(MS_WINDOWS) || defined(__CYGWIN__) #define Obj_HEAD PyObject_HEAD_INIT(NULL); #else #define Obj_HEAD PyObject_HEAD_INIT(&PyType_Type) #endif struct navit; struct map; PyObject * python_object_from_attr(struct attr *attr); PyObject * config_py(PyObject *self, PyObject *args); PyObject * map_py_ref(struct map *map); struct navigation; PyObject * navigation_py(PyObject *self, PyObject *args); PyObject * navigation_py_ref(struct navigation *navigation); PyObject * navit_py(PyObject *self, PyObject *args); PyObject * navit_py_ref(struct navit *navit); extern PyTypeObject pcoord_Type; PyObject * pcoord_py(PyObject *self, PyObject *args); struct pcoord *pcoord_py_get(PyObject *self); struct route; PyObject * route_py(PyObject *self, PyObject *args); PyObject * route_py_ref(struct route *route); extern PyTypeObject attr_Type; PyObject * attr_new_py(PyObject *self, PyObject *args); PyObject * attr_new_py_ref(struct attr *attr); struct attr * attr_py_get(PyObject *self); navit-0.5.0~svn5643+dfsg.1/navit/binding/python/config.c000066400000000000000000000032341221777731700226670ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "config_.h" typedef struct { PyObject_HEAD } configObject; static PyObject * config_navit(PyObject *self, PyObject *args) { struct attr navit; if (config_get_attr(config, attr_navit, &navit, NULL)) return navit_py_ref(navit.u.navit); return NULL; } static PyMethodDef config_methods[] = { {"navit", (PyCFunction) config_navit, METH_VARARGS }, {NULL, NULL }, }; static PyObject * config_getattr_py(PyObject *self, char *name) { return Py_FindMethod(config_methods, self, name); } static void config_destroy_py(configObject *self) { } PyTypeObject config_Type = { Obj_HEAD .tp_name="config", .tp_basicsize=sizeof(configObject), .tp_dealloc=(destructor)config_destroy_py, .tp_getattr=config_getattr_py, }; PyObject * config_py(PyObject *self, PyObject *args) { configObject *ret; dbg(0,"enter\n"); ret=PyObject_NEW(configObject, &config_Type); return (PyObject *)ret; } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/navigation.c000066400000000000000000000036431221777731700235650ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "navigation.h" typedef struct { PyObject_HEAD struct navigation *navigation; } navigationObject; static PyObject * navigation_get_map_py(navigationObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; return map_py_ref(navigation_get_map(self->navigation)); } static PyMethodDef navigation_methods[] = { {"get_map", (PyCFunction) navigation_get_map_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * navigation_getattr_py(PyObject *self, char *name) { return Py_FindMethod(navigation_methods, self, name); } static void navigation_destroy_py(navigationObject *self) { } PyTypeObject navigation_Type = { Obj_HEAD .tp_name="navigation", .tp_basicsize=sizeof(navigationObject), .tp_dealloc=(destructor)navigation_destroy_py, .tp_getattr=navigation_getattr_py, }; PyObject * navigation_py(PyObject *self, PyObject *args) { navigationObject *ret; ret=PyObject_NEW(navigationObject, &navigation_Type); return (PyObject *)ret; } PyObject * navigation_py_ref(struct navigation *navigation) { navigationObject *ret; ret=PyObject_NEW(navigationObject, &navigation_Type); ret->navigation=navigation; return (PyObject *)ret; } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/navit.c000066400000000000000000000070661221777731700225520ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "navit.h" typedef struct { PyObject_HEAD struct navit *navit; } navitObject; static PyObject * navit_set_attr_py(navitObject *self, PyObject *args) { PyObject *attr; if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) return NULL; navit_set_attr(self->navit, attr_py_get(attr)); Py_RETURN_NONE; } static PyObject * navit_get_attr_py(navitObject *self, PyObject *args) { char *name; struct attr attr; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; if (!navit_get_attr(self->navit, attr_from_name(name), &attr, NULL)) { dbg(0,"get_attr not ok\n"); Py_RETURN_NONE; } dbg(0,"get_attr ok\n"); return python_object_from_attr(&attr); } static PyObject * navit_set_center_py(navitObject *self, PyObject *args) { PyObject *pcoord; if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) return NULL; navit_set_center(self->navit, pcoord_py_get(pcoord), 0); Py_RETURN_NONE; } static PyObject * navit_set_destination_py(navitObject *self, PyObject *args) { PyObject *pcoord; const char *description; int async; if (!PyArg_ParseTuple(args, "O!si", &pcoord_Type, &pcoord, &description, &async)) return NULL; navit_set_destination(self->navit, pcoord_py_get(pcoord), description, async); Py_RETURN_NONE; } static PyObject * navit_set_position_py(navitObject *self, PyObject *args) { PyObject *pcoord; if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) return NULL; navit_set_position(self->navit, pcoord_py_get(pcoord)); Py_RETURN_NONE; } static PyObject * navit_zoom_to_route_py(navitObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; navit_zoom_to_route(self->navit,0); Py_RETURN_NONE; } static PyMethodDef navit_methods[] = { {"set_attr", (PyCFunction) navit_set_attr_py, METH_VARARGS }, {"get_attr", (PyCFunction) navit_get_attr_py, METH_VARARGS }, {"set_center", (PyCFunction) navit_set_center_py, METH_VARARGS }, {"set_destination", (PyCFunction) navit_set_destination_py, METH_VARARGS }, {"set_position", (PyCFunction) navit_set_position_py, METH_VARARGS }, {"zoom_to_route", (PyCFunction) navit_zoom_to_route_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * navit_getattr_py(PyObject *self, char *name) { return Py_FindMethod(navit_methods, self, name); } static void navit_destroy_py(navitObject *self) { } PyTypeObject navit_Type = { Obj_HEAD .tp_name="navit", .tp_basicsize=sizeof(navitObject), .tp_dealloc=(destructor)navit_destroy_py, .tp_getattr=navit_getattr_py, }; PyObject * navit_py(PyObject *self, PyObject *args) { navitObject *ret; dbg(0,"enter\n"); ret=PyObject_NEW(navitObject, &navit_Type); return (PyObject *)ret; } PyObject * navit_py_ref(struct navit *navit) { dbg(0,"navit=%p\n", navit); navitObject *ret=PyObject_NEW(navitObject, &navit_Type); ret->navit=navit; return (PyObject *)ret; } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/navit.xml.python000066400000000000000000000004041221777731700244350ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/binding/python/pcoord.c000066400000000000000000000036751221777731700227210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "coord.h" typedef struct { PyObject_HEAD struct pcoord pc; } pcoordObject; static PyObject * pcoord_func(pcoordObject *self, PyObject *args) { const char *file; int ret=0; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; return Py_BuildValue("i",ret); } static PyMethodDef pcoord_methods[] = { {"func", (PyCFunction) pcoord_func, METH_VARARGS }, {NULL, NULL }, }; static PyObject * pcoord_getattr_py(PyObject *self, char *name) { return Py_FindMethod(pcoord_methods, self, name); } static void pcoord_destroy_py(pcoordObject *self) { } PyTypeObject pcoord_Type = { Obj_HEAD .tp_name="pcoord", .tp_basicsize=sizeof(pcoordObject), .tp_dealloc=(destructor)pcoord_destroy_py, .tp_getattr=pcoord_getattr_py, }; PyObject * pcoord_py(PyObject *self, PyObject *args) { pcoordObject *ret; const char *str; enum projection pro; struct coord c; if (!PyArg_ParseTuple(args, "si", &str, &pro)) return NULL; ret=PyObject_NEW(pcoordObject, &pcoord_Type); coord_parse(str, pro, &c); ret->pc.pro=pro; ret->pc.x=c.x; ret->pc.y=c.y; dbg(0,"0x%x,0x%x\n", c.x, c.y); return (PyObject *)ret; } struct pcoord * pcoord_py_get(PyObject *self) { return &((pcoordObject *)self)->pc; } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/route.c000066400000000000000000000034551221777731700225650ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "coord.h" #include "route.h" typedef struct { PyObject_HEAD struct route *route; } routeObject; static PyObject * route_get_map_py(routeObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; return map_py_ref(route_get_map(self->route)); } static PyMethodDef route_methods[] = { {"get_map", (PyCFunction) route_get_map_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * route_getattr_py(PyObject *self, char *name) { return Py_FindMethod(route_methods, self, name); } static void route_destroy_py(routeObject *self) { } PyTypeObject route_Type = { Obj_HEAD .tp_name="route", .tp_basicsize=sizeof(routeObject), .tp_dealloc=(destructor)route_destroy_py, .tp_getattr=route_getattr_py, }; PyObject * route_py(PyObject *self, PyObject *args) { routeObject *ret; ret=PyObject_NEW(routeObject, &route_Type); return (PyObject *)ret; } PyObject * route_py_ref(struct route *route) { routeObject *ret; ret=PyObject_NEW(routeObject, &route_Type); ret->route=route; return (PyObject *)ret; } navit-0.5.0~svn5643+dfsg.1/navit/binding/python/startup.py000066400000000000000000000004011221777731700233230ustar00rootroot00000000000000import navit navit.config_load("navit.xml.local") pos=navit.pcoord("5023.7493 N 00730.2898 E",1); dest=navit.pcoord("5023.6604 N 00729.8500 E",1); inst=navit.config().navit(); inst.set_position(pos); inst.set_destination(dest,"Test"); inst.set_center(pos); navit-0.5.0~svn5643+dfsg.1/navit/binding/python/template.c000066400000000000000000000041201221777731700232300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "template.h" typedef struct { PyObject_HEAD int ref; struct template *template; } templateObject; static PyObject * template_func(templateObject *self, PyObject *args) { const char *file; int ret; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; ret=0; return Py_BuildValue("i",ret); } static PyMethodDef template_methods[] = { {"func", (PyCFunction) template_func, METH_VARARGS }, {NULL, NULL }, }; static PyObject * template_getattr_py(PyObject *self, char *name) { return Py_FindMethod(template_methods, self, name); } static void template_destroy_py(templateObject *self) { if (! self->ref) template_destroy(self->template); } PyTypeObject template_Type = { Obj_HEAD .tp_name="template", .tp_basicsize=sizeof(templateObject), .tp_dealloc=(destructor)template_destroy_py, .tp_getattr=template_getattr_py, }; struct template * template_py_get(PyObject *self) { return ((templateObject *)self)->template; } PyObject * template_new_py(PyObject *self, PyObject *args) { templateObject *ret; ret=PyObject_NEW(templateObject, &template_Type); ret->template=template_new(); ret->ref=0; return (PyObject *)ret; } PyObject * template_new_py_ref(struct template *template) { templateObject *ret; ret=PyObject_NEW(templateObject, &template_Type); ret->ref=1; ret->template=template; return (PyObject *)ret; } navit-0.5.0~svn5643+dfsg.1/navit/bookmarks.c000066400000000000000000000567451221777731700204760ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include "file.h" #include "debug.h" #include "projection.h" #include "coord.h" #include "transform.h" #include "callback.h" #include "map.h" #include "command.h" #include "bookmarks.h" #include "navit.h" #include "navit_nls.h" #include "util.h" /* FIXME: Move this to support directory */ #ifdef _MSC_VER #include static int ftruncate(int fd, __int64 length) { HANDLE fh = (HANDLE)_get_osfhandle(fd); if (!fh || _lseeki64(fd, length, SEEK_SET)) { return -1; } return SetEndOfFile(fh) ? 0 : -1; } #endif /* _MSC_VER */ struct bookmarks { //data storage struct map *bookmark; struct map_rect *mr; GHashTable *bookmarks_hash; GList *bookmarks_list; char* bookmark_file; char *working_file; struct bookmark_item_priv* clipboard; struct bookmark_item_priv* root; struct bookmark_item_priv* current; //Refs to other objects struct transformation *trans; struct attr **attrs; struct callback_list *attr_cbl; struct attr *parent; }; struct bookmark_item_priv { char *label; enum item_type type; struct pcoord c; GList *children; GList *iter; struct bookmark_item_priv *parent; struct item item; }; void bookmarks_move_root(struct bookmarks *this_) { this_->current=this_->root; this_->current->iter=g_list_first(this_->current->children); dbg(2,"Root list have %u entries\n",g_list_length(this_->current->children)); return; } void bookmarks_move_up(struct bookmarks *this_) { if (this_->current->parent) { this_->current=this_->current->parent; this_->current->iter=this_->current->children; } return; } int bookmarks_move_down(struct bookmarks *this_,const char* name) { bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,name)) { this_->current=(struct bookmark_item_priv*)this_->current->iter->data; this_->current->iter=g_list_first(this_->current->children); dbg(2,"%s list have %u entries\n",this_->current->label,g_list_length(this_->current->children)); return 1; } this_->current->iter=g_list_next(this_->current->iter); } return 0; } void bookmarks_item_rewind(struct bookmarks* this_) { this_->current->children=g_list_first(this_->current->children); this_->current->iter=this_->current->children; this_->current->iter=this_->current->children; } struct item* bookmarks_get_item(struct bookmarks* this_) { struct item item,*ret; if (this_->current->iter==NULL) { return NULL; } item=((struct bookmark_item_priv*)this_->current->iter->data)->item; this_->current->iter=g_list_next(this_->current->iter); ret = map_rect_get_item_byid(this_->mr, item.id_hi, item.id_lo); return ret; } int bookmarks_get_bookmark_count(struct bookmarks* this_) { int ret=0; bookmarks_item_rewind(this_); while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (data->type == type_bookmark) { ret++; } this_->current->iter=g_list_next(this_->current->iter); } return ret; } const char* bookmarks_item_cwd(struct bookmarks* this_) { return this_->current->label; } static void bookmarks_clear_item(struct bookmark_item_priv *b_item) { b_item->children=g_list_first(b_item->children); while(b_item->children) { bookmarks_clear_item((struct bookmark_item_priv*)b_item->children->data); b_item->children=g_list_next(b_item->children); } g_free(b_item->label); g_free(b_item); } static void bookmarks_clear_hash(struct bookmarks *this_) { if (this_->mr) { map_rect_destroy(this_->mr); } bookmarks_clear_item(this_->root); g_hash_table_destroy(this_->bookmarks_hash); g_list_free(this_->bookmarks_list); } static void bookmarks_load_hash(struct bookmarks *this_) { struct bookmark_item_priv *b_item; struct item *item; struct attr attr; struct coord c; char *pos,*finder; char *copy_helper; if (this_->mr) { map_rect_destroy(this_->mr); } this_->mr=map_rect_new(this_->bookmark, NULL); this_->bookmarks_hash=g_hash_table_new(g_str_hash, g_str_equal); this_->root=g_new0(struct bookmark_item_priv,1); this_->root->type=type_none; this_->root->parent=NULL; this_->root->children=NULL; bookmarks_move_root(this_); while ((item=map_rect_get_item(this_->mr))) { if (item->type != type_bookmark && item->type != type_bookmark_folder ) continue; if (!item_attr_get(item, attr_path, &attr)) { item_attr_get(item, attr_label, &attr); } item_coord_get(item, &c, 1); b_item=g_new0(struct bookmark_item_priv,1); b_item->c.x=c.x; b_item->c.y=c.y; b_item->label=g_strdup(attr.u.str); b_item->type=item->type; b_item->item=*item; //Prepare position bookmarks_move_root(this_); finder=b_item->label; while ((pos=strchr(finder,'/'))) { *pos=0x00; dbg(1,"Found path entry: %s\n",finder); if (!bookmarks_move_down(this_,finder)) { struct bookmark_item_priv *path_item=g_new0(struct bookmark_item_priv,1); path_item->type=type_bookmark_folder; path_item->parent=this_->current; path_item->children=NULL; path_item->label=g_strdup(finder); this_->current->children=g_list_append(this_->current->children,path_item); this_->current=path_item; g_hash_table_insert(this_->bookmarks_hash,b_item->label,path_item); this_->bookmarks_list=g_list_append(this_->bookmarks_list,path_item); } finder+=strlen(finder)+1; } copy_helper=g_strdup(finder); free(b_item->label); b_item->label=copy_helper; b_item->parent=this_->current; g_hash_table_insert(this_->bookmarks_hash,b_item->label,b_item); this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); this_->current->children=g_list_append(this_->current->children,b_item); this_->current->children=g_list_first(this_->current->children); dbg(1,"Added %s to %s and current list now %u long\n",b_item->label,this_->current->label,g_list_length(this_->current->children)); } bookmarks_move_root(this_); } struct bookmarks * bookmarks_new(struct attr *parent, struct attr **attrs, struct transformation *trans) { struct bookmarks *this_; if (parent->type!=attr_navit) { return NULL; } this_ = g_new0(struct bookmarks,1); this_->attr_cbl=callback_list_new(); this_->parent=parent; //this_->attrs=attr_list_dup(attrs); this_->trans=trans; this_->bookmark_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/bookmark.txt", NULL); this_->working_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/bookmark.txt.tmp", NULL); this_->clipboard=g_new0(struct bookmark_item_priv,1); { //Load map now struct attr type={attr_type, {"textfile"}}, data={attr_data, {this_->bookmark_file}}, no_warn={attr_no_warning_if_map_file_missing, {(void *)1}}; struct attr *attrs[]={&type, &data, &no_warn, NULL}; this_->bookmark=map_new(this_->parent, attrs); if (!this_->bookmark) return NULL; bookmarks_load_hash(this_); } return this_; } void bookmarks_destroy(struct bookmarks *this_) { bookmarks_clear_hash(this_); map_destroy(this_->bookmark); callback_list_destroy(this_->attr_cbl); g_free(this_->bookmark_file); g_free(this_->working_file); g_free(this_->clipboard); g_free(this_); } struct map* bookmarks_get_map(struct bookmarks *this_) { return this_->bookmark; } enum projection bookmarks_get_projection(struct bookmarks *this_){ return map_projection(this_->bookmark); } void bookmarks_add_callback(struct bookmarks *this_, struct callback *cb) { callback_list_add(this_->attr_cbl, cb); } static int bookmarks_store_bookmarks_to_file(struct bookmarks *this_, int limit,int replace) { FILE *f; struct bookmark_item_priv *item,*parent_item; char *fullname; const char *prostr; int result; GHashTable *dedup=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,NULL); f=fopen(this_->working_file, replace ? "w+" : "a+"); if (f==NULL) { navit_add_message(this_->parent->u.navit,_("Failed to write bookmarks file")); return FALSE; } this_->bookmarks_list=g_list_first(this_->bookmarks_list); while (this_->bookmarks_list) { item=(struct bookmark_item_priv*)this_->bookmarks_list->data; parent_item=item; fullname=g_strdup(item->label); while ((parent_item=parent_item->parent)) { char *pathHelper; if (parent_item->label) { pathHelper=g_strconcat(parent_item->label,"/",fullname,NULL); g_free(fullname); fullname=g_strdup(pathHelper); g_free(pathHelper); dbg(1,"full name: %s\n",fullname); } } if (!g_hash_table_lookup(dedup,fullname)) { g_hash_table_insert(dedup,fullname,fullname); if (item->type == type_bookmark) { prostr = projection_to_name(projection_mg); if (fprintf(f,"%s%s%s0x%x %s0x%x type=%s label=\"%s\" path=\"%s\"\n", prostr, *prostr ? ":" : "", item->c.x >= 0 ? "":"-", item->c.x >= 0 ? item->c.x : -item->c.x, item->c.y >= 0 ? "":"-", item->c.y >= 0 ? item->c.y : -item->c.y, "bookmark", item->label,fullname)<1) { g_free(fullname); break; } } if (item->type == type_bookmark_folder) { prostr = projection_to_name(projection_mg); if (fprintf(f,"%s%s%s0x%x %s0x%x type=%s label=\"%s\" path=\"%s\"\n", prostr, *prostr ? ":" : "", "", 0, "", 0, "bookmark_folder", item->label,fullname)<1) { g_free(fullname); break; } } } /* Limit could be zero, so we start decrementing it from zero and never reach 1 or it was bigger and we decreased it earlier. So when this counter becomes 1, we know that we have enough entries in bookmarks file */ if (limit==1) { break; } limit--; this_->bookmarks_list=g_list_next(this_->bookmarks_list); } fclose(f); g_hash_table_destroy(dedup); if (this_->mr) { map_rect_destroy(this_->mr); this_->mr = 0; } unlink(this_->bookmark_file); result=(rename(this_->working_file,this_->bookmark_file)==0); if (!result) { navit_add_message(this_->parent->u.navit,_("Failed to write bookmarks file")); } return result; } /** * @param create: create the directory where the file is stored * if it does not exist * @return The name of the file used to store destinations with its * full path. Should be freed using g_free. * */ char* bookmarks_get_destination_file(gboolean create) { return g_strjoin(NULL, navit_get_user_data_directory(create), "/destination.txt", NULL); } /* * bookmarks_get_center_file * * returns the name of the file used to store the center file with its * full path * * arg: gboolean create: create the directory where the file is stored * if it does not exist */ char* bookmarks_get_center_file(gboolean create) { return g_strjoin(NULL, navit_get_user_data_directory(create), "/center.txt", NULL); } void bookmarks_set_center_from_file(struct bookmarks *this_, char *file) { FILE *f; char *line = NULL; size_t line_size = 0; enum projection pro; struct coord *center; f = fopen(file, "r"); if (! f) return; getline(&line, &line_size, f); fclose(f); if (line) { center = transform_center(this_->trans); pro = transform_get_projection(this_->trans); coord_parse(g_strchomp(line), pro, center); free(line); } return; } void bookmarks_write_center_to_file(struct bookmarks *this_, char *file) { FILE *f; enum projection pro; struct coord *center; f = fopen(file, "w+"); if (f) { center = transform_center(this_->trans); pro = transform_get_projection(this_->trans); coord_print(pro, center, f); fclose(f); } else { perror(file); } return; } static void bookmarks_emit_dbus_signal(struct bookmarks *this_, struct pcoord *c, const char *description,int create) { struct attr attr1,attr2,attr3,attr4,cb,*attr_list[5]; int valid=0; attr1.type=attr_type; attr1.u.str="bookmark"; attr2.type=attr_data; attr2.u.str=create ? "create" : "delete"; attr3.type=attr_data; attr3.u.str=(char *)description; attr4.type=attr_coord; attr4.u.pcoord=c; attr_list[0]=&attr1; attr_list[1]=&attr2; attr_list[2]=&attr3; attr_list[3]=&attr4; attr_list[4]=NULL; if (navit_get_attr(this_->parent->u.navit, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); } /** * Record the given set of coordinates as a bookmark * * @param navit The navit instance * @param c The coordinate to store * @param description A label which allows the user to later identify this bookmark * @returns nothing */ int bookmarks_add_bookmark(struct bookmarks *this_, struct pcoord *pc, const char *description) { struct bookmark_item_priv *b_item=g_new0(struct bookmark_item_priv,1); int result; if (pc) { b_item->c.x=pc->x; b_item->c.y=pc->y; b_item->type=type_bookmark; } else { b_item->type=type_bookmark_folder; } b_item->label=g_strdup(description); b_item->parent=this_->current; b_item->children=NULL; this_->current->children=g_list_first(this_->current->children); this_->current->children=g_list_append(this_->current->children,b_item); this_->bookmarks_list=g_list_first(this_->bookmarks_list); this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); bookmarks_emit_dbus_signal(this_,&(b_item->c),description,TRUE); return result; } int bookmarks_cut_bookmark(struct bookmarks *this_, const char *label) { if (bookmarks_copy_bookmark(this_,label)) { return bookmarks_delete_bookmark(this_,label); } return FALSE; } int bookmarks_copy_bookmark(struct bookmarks *this_, const char *label) { bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,label)) { this_->clipboard->c=data->c; this_->clipboard->type=data->type; this_->clipboard->item=data->item; this_->clipboard->children=data->children; if (!this_->clipboard->label) { g_free(this_->clipboard->label); } this_->clipboard->label=g_strdup(data->label); return TRUE; } this_->current->iter=g_list_next(this_->current->iter); } return FALSE; } int bookmarks_paste_bookmark(struct bookmarks *this_) { int result; struct bookmark_item_priv* b_item; if (!this_->clipboard->label) { return FALSE; } b_item=g_new0(struct bookmark_item_priv,1); b_item->c.x=this_->clipboard->c.x; b_item->c.y=this_->clipboard->c.y; b_item->label=g_strdup(this_->clipboard->label); b_item->type=this_->clipboard->type; b_item->item=this_->clipboard->item; b_item->parent=this_->current; b_item->children=this_->clipboard->children; g_hash_table_insert(this_->bookmarks_hash,b_item->label,b_item); this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); this_->current->children=g_list_append(this_->current->children,b_item); this_->current->children=g_list_first(this_->current->children); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); return result; } int bookmarks_delete_bookmark(struct bookmarks *this_, const char *label) { int result; bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,label)) { this_->bookmarks_list=g_list_first(this_->bookmarks_list); this_->bookmarks_list=g_list_remove(this_->bookmarks_list,data); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); bookmarks_emit_dbus_signal(this_,&(data->c),label,FALSE); return result; } this_->current->iter=g_list_next(this_->current->iter); } return FALSE; } int bookmarks_rename_bookmark(struct bookmarks *this_, const char *oldName, const char* newName) { int result; bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,oldName)) { g_free(data->label); data->label=g_strdup(newName); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); return result; } this_->current->iter=g_list_next(this_->current->iter); } return FALSE; } struct former_destination{ enum item_type type; char* description; GList* c; }; static void free_former_destination(struct former_destination* former_destination){ g_free(former_destination->description); g_list_foreach(former_destination->c, (GFunc)g_free, NULL); g_list_free(former_destination->c); g_free(former_destination); } /* * Doesn't read any items besides former_destination. So active waypoints items of type former_itinerary and former_itinerary_part are skipped. */ static GList* read_former_destination_map_as_list(struct map *map){ struct map_rect *mr; struct item *item; struct attr attr; struct former_destination *dest; struct coord c; int more; GList* list = NULL; if (map && (mr=map_rect_new(map, NULL))) { while ((item=map_rect_get_item(mr))) { if (item->type != type_former_destination) continue; dest = g_new0(struct former_destination, 1); dest->type=item->type; item_attr_get(item, attr_label, &attr); dest->description = g_strdup(attr.u.str); more = item_coord_get(item, &c, 1); while (more) { dest->c = g_list_append(dest->c, g_new(struct coord, 1)); *(struct coord *)g_list_last(dest->c)->data = c; more = item_coord_get(item, &c, 1); } list = g_list_prepend(list, dest); } map_rect_destroy(mr); } return g_list_reverse(list); } static int destination_equal(struct former_destination* dest1, struct former_destination* dest2, int ignore_descriptions) { if ((dest1->type == dest2->type) && (ignore_descriptions || !strcmp(dest1->description, dest2->description)) && (coord_equal((struct coord *)g_list_last(dest1->c)->data, (struct coord *)g_list_last(dest2->c)->data))){ return TRUE; } return FALSE; } /* * Find destination in given GList. If remove_found is non-zero, any matching items are removed and new beginning of the list is returned. * If remove_found is zero, last matching item is returned. In the latter case, description is ignored and can be NULL. */ static GList* find_destination_in_list(struct former_destination* dest_to_remove, GList* former_destinations, int remove_found) { GList* curr_el = former_destinations; GList* prev_el = NULL; GList* found_el = NULL; struct former_destination* curr_dest; while(curr_el){ curr_dest = curr_el->data; if (destination_equal(dest_to_remove, curr_dest, remove_found?0:1)) { if(remove_found) { free_former_destination(curr_dest); curr_el = g_list_remove(curr_el, curr_dest); continue; } else { found_el=curr_el; } } prev_el = curr_el; curr_el = g_list_next(curr_el); } if(remove_found) return g_list_first(prev_el); else return found_el; } static void write_former_destinations(GList* former_destinations, char *former_destination_file, enum projection proj) { FILE *f; GList* currdest = NULL; GList* c_list = NULL; struct coord *c; struct former_destination *dest; const char* prostr = projection_to_name(proj); f=fopen(former_destination_file, "w"); if (f) { for(currdest = former_destinations; currdest; currdest = g_list_next(currdest)){ dest = currdest->data; if (dest->description) fprintf(f,"type=%s label=\"%s\"\n", item_to_name(dest->type), dest->description); else fprintf(f,"type=%s\n", item_to_name(dest->type)); c_list = dest->c; do { c = (struct coord *)c_list->data; fprintf(f,"%s%s%s0x%x %s0x%x\n", prostr, *prostr ? ":" : "", c->x >= 0 ? "":"-", c->x >= 0 ? c->x : -c->x, c->y >= 0 ? "":"-", c->y >= 0 ? c->y : -c->y); c_list = g_list_next(c_list); } while (c_list); } fclose(f); } else { dbg(0, "Error updating destinations file %s: %s\n", former_destination_file, strerror(errno)); } } /** * Append recent destination(s) item to the former destionations map. * @param former_destination_map * @param former_destination_file * @param c coordinates of item point(s). Can be set to NULL when navigation is stopped to remove type_former_itinerary and * type_former_itinerary_part items from the file. * @param count number of points in this item. Set to 0 when navigation is stopped. * @param type type_former_destination, type_former_itinerary and type_former_itinerary_part are meaningful here * @param description character string used to identify this destination. If NULL, most recent waypoint at these coordinates will be used * to get description. * @param limit Limits the number of entries in the "backlog". Set to 0 for "infinite" */ void bookmarks_append_destinations(struct map *former_destination_map, char *former_destination_file, struct pcoord *c, int count, enum item_type type, const char *description, int limit) { struct former_destination *new_dest=NULL; GList* former_destinations = NULL; GList* former_destinations_shortened = NULL; struct coord* c_dup; int no_of_former_destinations; int i; former_destinations = read_former_destination_map_as_list(former_destination_map); if(c && count>0) { GList *older; struct coord ctmp; new_dest = g_new0(struct former_destination, 1); new_dest->type = type; for (i=0; ic = g_list_append(new_dest->c, c_dup); } older=find_destination_in_list(new_dest, former_destinations,0); if(!description && older) description=((struct former_destination *)older->data)->description; new_dest->description = g_strdup(description?description:_("Map Point")); former_destinations = find_destination_in_list(new_dest, former_destinations, 1); former_destinations = g_list_append(former_destinations, new_dest); } no_of_former_destinations = g_list_length(former_destinations); if (limit > 0 && no_of_former_destinations > limit) former_destinations_shortened = g_list_nth(former_destinations, no_of_former_destinations - limit); else former_destinations_shortened = former_destinations; write_former_destinations(former_destinations_shortened, former_destination_file, map_projection(former_destination_map)); g_list_foreach(former_destinations, (GFunc) free_former_destination, NULL); g_list_free(former_destinations); } navit-0.5.0~svn5643+dfsg.1/navit/bookmarks.h000066400000000000000000000051471221777731700204710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_BOOKMARKS_H #define NAVIT_BOOKMARKS_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ struct bookmarks; struct bookmarks *bookmarks_new(struct attr *parent, struct attr **attrs, struct transformation *trans); void bookmarks_destroy(struct bookmarks *this_); void bookmarks_add_callback(struct bookmarks *this_, struct callback *cb); int bookmarks_add_bookmark(struct bookmarks *this_, struct pcoord *c, const char *description); int bookmarks_cut_bookmark(struct bookmarks *this_, const char *label); int bookmarks_copy_bookmark(struct bookmarks *this_, const char *label); int bookmarks_paste_bookmark(struct bookmarks *this_); int bookmarks_rename_bookmark(struct bookmarks *this_, const char *oldName, const char* newName); int bookmarks_delete_bookmark(struct bookmarks *this_, const char *label); struct map* bookmarks_get_map(struct bookmarks *this_); enum projection bookmarks_get_projection(struct bookmarks *this_); void bookmarks_move_root(struct bookmarks *this_); void bookmarks_move_up(struct bookmarks *this_); int bookmarks_move_down(struct bookmarks *this_,const char* name); struct item* bookmarks_get_item(struct bookmarks* this_); int bookmarks_get_bookmark_count(struct bookmarks* this_); void bookmarks_item_rewind(struct bookmarks* this_); const char* bookmarks_item_cwd(struct bookmarks* this_); char* bookmarks_get_user_data_directory(gboolean create); char* bookmarks_get_destination_file(gboolean create); void bookmarks_set_center_from_file(struct bookmarks *this_, char *file); char* bookmarks_get_center_file(gboolean create); void bookmarks_write_center_to_file(struct bookmarks *this_, char *file); void bookmarks_append_destinations(struct map *former_destination_map, char *file, struct pcoord *c, int count, enum item_type type, const char *description, int limit); /* end of prototypes */ #ifdef __cplusplus } #endif #endif /* NAVIT_BOOKMARKS_H */ navit-0.5.0~svn5643+dfsg.1/navit/browserplugin.c000066400000000000000000000336701221777731700214000ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-navit-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Josh Aas * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "browserplugin.h" #include #include #include #include #include #include #include #define PLUGIN_NAME "Navit Sample Plug-in" #define PLUGIN_DESCRIPTION PLUGIN_NAME " (Mozilla SDK)" #define PLUGIN_VERSION "1.0.0.0" static NPNetscapeFuncs *sBrowserFuncs = NULL; extern struct NPClass navitclass,navitclass2; typedef struct InstanceData { NPP npp; NPWindow window; } InstanceData; static void fillPluginFunctionTable(NPPluginFuncs * pFuncs) { pFuncs->version = 11; pFuncs->size = sizeof(*pFuncs); pFuncs->newp = NPP_New; pFuncs->destroy = NPP_Destroy; pFuncs->setwindow = NPP_SetWindow; pFuncs->newstream = NPP_NewStream; pFuncs->destroystream = NPP_DestroyStream; pFuncs->asfile = NPP_StreamAsFile; pFuncs->writeready = NPP_WriteReady; pFuncs->write = NPP_Write; pFuncs->print = NPP_Print; pFuncs->event = NPP_HandleEvent; pFuncs->urlnotify = NPP_URLNotify; pFuncs->getvalue = NPP_GetValue; pFuncs->setvalue = NPP_SetValue; } NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs * bFuncs, NPPluginFuncs * pFuncs) { NPError err = NPERR_NO_ERROR; NPBool supportsXEmbed = false; NPNToolkitType toolkit = 0; sBrowserFuncs = bFuncs; fillPluginFunctionTable(pFuncs); err = sBrowserFuncs->getvalue(NULL, NPNVSupportsXEmbedBool, (void *) &supportsXEmbed); if (err != NPERR_NO_ERROR || supportsXEmbed != true) return NPERR_INCOMPATIBLE_VERSION_ERROR; err = sBrowserFuncs->getvalue(NULL, NPNVToolkit, (void *) &toolkit); if (err != NPERR_NO_ERROR || toolkit != NPNVGtk2) return NPERR_INCOMPATIBLE_VERSION_ERROR; return NPERR_NO_ERROR; } NP_EXPORT(char *) NP_GetPluginVersion() { return PLUGIN_VERSION; } NP_EXPORT(char *) NP_GetMIMEDescription() { return "application/navit-plugin:nsc:Navit plugin"; } NP_EXPORT(NPError) NP_GetValue(void *future, NPPVariable aVariable, void *aValue) { fprintf(stderr, "NP_GetValue %d\n", aVariable); switch (aVariable) { case NPPVpluginNameString: *((char **) aValue) = PLUGIN_NAME; break; case NPPVpluginDescriptionString: *((char **) aValue) = PLUGIN_DESCRIPTION; break; default: return NPERR_INVALID_PARAM; break; } return NPERR_NO_ERROR; } NP_EXPORT(NPError) NP_Shutdown() { return NPERR_NO_ERROR; } NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData * saved) { char *args[]={"/usr/bin/navit",NULL}; // Make sure we can render this plugin NPBool browserSupportsWindowless = false; sBrowserFuncs->getvalue(instance, NPNVSupportsWindowless, &browserSupportsWindowless); if (!browserSupportsWindowless) { printf("Windowless mode not supported by the browser\n"); return NPERR_GENERIC_ERROR; } #if 0 sBrowserFuncs->setvalue(instance, NPPVpluginWindowBool, (void *) true); #endif // set up our our instance data InstanceData *instanceData = (InstanceData *) malloc(sizeof(InstanceData)); if (!instanceData) return NPERR_OUT_OF_MEMORY_ERROR; memset(instanceData, 0, sizeof(InstanceData)); instanceData->npp = instance; instance->pdata = instanceData; fprintf(stderr, "npp=%p\n", instance); main_real(1, args); return NPERR_NO_ERROR; } NPError NPP_Destroy(NPP instance, NPSavedData ** save) { InstanceData *instanceData = (InstanceData *) (instance->pdata); free(instanceData); return NPERR_NO_ERROR; } NPError NPP_SetWindow(NPP instance, NPWindow * window) { struct attr navit,graphics,windowid; InstanceData *instanceData = (InstanceData *) (instance->pdata); if (window->window == instanceData->window.window) return; instanceData->window = *window; fprintf(stderr, "Window 0x%x\n", window->window); if (!config_get_attr(config, attr_navit, &navit, NULL)) { fprintf(stderr,"No navit\n"); return NPERR_GENERIC_ERROR; } if (!navit_get_attr(navit.u.navit, attr_graphics, &graphics, NULL)) { fprintf(stderr,"No Graphics\n"); return NPERR_GENERIC_ERROR; } windowid.type=attr_windowid; windowid.u.num=window->window; if (!graphics_set_attr(graphics.u.graphics, &windowid)) { fprintf(stderr,"Failed to set window\n"); return NPERR_GENERIC_ERROR; } return NPERR_NO_ERROR; } NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream * stream, NPBool seekable, uint16_t * stype) { return NPERR_GENERIC_ERROR; } NPError NPP_DestroyStream(NPP instance, NPStream * stream, NPReason reason) { return NPERR_GENERIC_ERROR; } int32_t NPP_WriteReady(NPP instance, NPStream * stream) { return 0; } int32_t NPP_Write(NPP instance, NPStream * stream, int32_t offset, int32_t len, void *buffer) { return 0; } void NPP_StreamAsFile(NPP instance, NPStream * stream, const char *fname) { } void NPP_Print(NPP instance, NPPrint * platformPrint) { } int16_t NPP_HandleEvent(NPP instance, void *event) { return 0; #if 0 InstanceData *instanceData = (InstanceData *) (instance->pdata); XEvent *nativeEvent = (XEvent *) event; if (nativeEvent->type != GraphicsExpose) return 0; XGraphicsExposeEvent *expose = &nativeEvent->xgraphicsexpose; instanceData->window.window = (void *) (expose->drawable); GdkNativeWindow nativeWinId = (XID) (instanceData->window.window); GdkDrawable *gdkWindow = GDK_DRAWABLE(gdk_window_foreign_new(nativeWinId)); drawWindow(instanceData, gdkWindow); g_object_unref(gdkWindow); #endif return 1; } void NPP_URLNotify(NPP instance, const char *URL, NPReason reason, void *notifyData) { } struct NavitObject { NPClass *class; uint32_t referenceCount; InstanceData *instanceData; int is_attr; struct attr attr; }; void printIdentifier(NPIdentifier name) { NPUTF8 *str; str = sBrowserFuncs->utf8fromidentifier(name); fprintf(stderr, "%s\n", str); sBrowserFuncs->memfree(str); } NPObject * allocate(NPP npp, NPClass * aClass) { struct NavitObject *ret = calloc(sizeof(struct NavitObject), 1); if (ret) { ret->class = aClass; ret->instanceData = npp->pdata; fprintf(stderr, "instanceData for %p is %p\n", ret, ret->instanceData); } return (NPObject *) ret; } void invalidate(NPObject * npobj) { fprintf(stderr, "invalidate\n"); } bool hasMethod(NPObject * npobj, NPIdentifier name) { fprintf(stderr, "hasMethod\n"); printIdentifier(name); if (name == sBrowserFuncs->getstringidentifier("command")) return true; if (name == sBrowserFuncs->getstringidentifier("get_attr")) return true; if (name == sBrowserFuncs->getstringidentifier("toString")) return true; if (name == sBrowserFuncs->getstringidentifier("nativeMethod")) return true; if (name == sBrowserFuncs->getstringidentifier("anotherNativeMethod")) return true; return false; } enum attr_type variant_to_attr_type(const NPVariant *variant) { if (NPVARIANT_IS_STRING(*variant)) return attr_from_name(NPVARIANT_TO_STRING(*variant).utf8characters); return attr_none; } bool invoke(NPObject * npobj, NPIdentifier name, const NPVariant * args, uint32_t argCount, NPVariant * result) { struct NavitObject *obj = (struct NavitObject *) npobj; fprintf(stderr, "invoke\n"); printIdentifier(name); if (name == sBrowserFuncs->getstringidentifier("get_attr")) { enum attr_type attr_type; struct attr attr; if (!argCount) return false; attr_type=variant_to_attr_type(&args[0]); if (attr_type == attr_none) return false; if (config_get_attr(config, attr_type, &attr, NULL)) { struct NavitObject *obj2 = (struct NavitObject *)sBrowserFuncs->createobject(obj->instanceData->npp, &navitclass); obj2->is_attr=1; obj2->attr=attr; OBJECT_TO_NPVARIANT((NPObject *)obj2, *result); return true; } else { VOID_TO_NPVARIANT(*result); return true; } } if (name == sBrowserFuncs->getstringidentifier("command")) { enum attr_type attr_type; struct attr attr; NPObject *window; NPError err; NPVariant value; if (!argCount || !NPVARIANT_IS_STRING(args[0])) return false; if (navit_get_attr(obj->attr.u.navit, attr_callback_list, &attr, NULL)) { int valid=0; callback_list_call_attr_4(attr.u.callback_list, attr_command, NPVARIANT_TO_STRING(args[0]), NULL, NULL, &valid); } err=sBrowserFuncs->getvalue(obj->instanceData->npp, NPNVWindowNPObject, (void *) &window); fprintf(stderr,"error1:%d\n",err); //OBJECT_TO_NPVARIANT(window, *result); err=sBrowserFuncs->invoke(obj->instanceData->npp, window, sBrowserFuncs->getstringidentifier("Array"), window, 0, result); fprintf(stderr,"error2:%d\n",err); INT32_TO_NPVARIANT(23, value); err=sBrowserFuncs->setproperty(obj->instanceData->npp, NPVARIANT_TO_OBJECT(*result), sBrowserFuncs->getintidentifier(0), &value); INT32_TO_NPVARIANT(42, value); err=sBrowserFuncs->setproperty(obj->instanceData->npp, NPVARIANT_TO_OBJECT(*result), sBrowserFuncs->getintidentifier(1), &value); fprintf(stderr,"error3:%d\n",err); //VOID_TO_NPVARIANT(*result); return true; } if (name == sBrowserFuncs->getstringidentifier("toString")) { char *s; if (obj->is_attr) { s="[NavitObject attribute]"; STRINGZ_TO_NPVARIANT(strdup(s), *result); return true; } s=g_strdup_printf("[NavitObject %s]",attr_to_name(obj->attr.type)); STRINGZ_TO_NPVARIANT(strdup(s), *result); g_free(s); return true; } if (name == sBrowserFuncs->getstringidentifier("nativeMethod")) { result->type = NPVariantType_Int32; result->value.intValue = 23; return true; } if (name == sBrowserFuncs->getstringidentifier("anotherNativeMethod")) { result->type = NPVariantType_Int32; result->value.intValue = 42; return true; } return false; } bool invokeDefault(NPObject * npobj, const NPVariant * args, uint32_t argCount, NPVariant * result) { fprintf(stderr, "invokeDefault\n"); return false; } bool hasProperty(NPObject * npobj, NPIdentifier name) { struct NavitObject *obj = (struct NavitObject *) npobj; fprintf(stderr, "hasProperty\n"); printIdentifier(name); if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("type")) return true; if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("val")) return true; if (name == sBrowserFuncs->getstringidentifier("nativeProperty")) { return true; } return false; } bool getProperty(NPObject * npobj, NPIdentifier name, NPVariant * result) { struct NavitObject *obj = (struct NavitObject *) npobj; fprintf(stderr, "getProperty %p\n", obj); fprintf(stderr, "instanceData %p\n", obj->instanceData); if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("type")) { STRINGZ_TO_NPVARIANT(strdup(attr_to_name(obj->attr.type)), *result); return true; } if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("val")) { struct NavitObject *obj2 = (struct NavitObject *)sBrowserFuncs->createobject(obj->instanceData->npp, &navitclass); obj2->attr=obj->attr; OBJECT_TO_NPVARIANT((NPObject *)obj2, *result); return true; } if (name == sBrowserFuncs->getstringidentifier("nativeProperty")) { result->type = NPVariantType_Object; fprintf(stderr, "npp=%p\n", obj->instanceData->npp); result->value.objectValue = sBrowserFuncs->createobject(obj->instanceData->npp, &navitclass2); return true; } return false; } bool setProperty(NPObject * npobj, NPIdentifier name, const NPVariant * value) { fprintf(stderr, "setProperty\n"); return false; } bool removeProperty(NPObject * npobj, NPIdentifier name) { fprintf(stderr, "removeProperty\n"); return false; } struct NPClass navitclass = { 1, allocate, NULL, /* deallocate */ invalidate, hasMethod, invoke, invokeDefault, hasProperty, getProperty, setProperty, removeProperty, }; struct NPClass navitclass2 = { 1, allocate, /* allocate */ NULL, /* deallocate */ invalidate, hasMethod, invoke, invokeDefault, hasProperty, getProperty, setProperty, removeProperty, }; NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) { fprintf(stderr, "NPP_GetValue %d %d\n", variable, NPPVpluginScriptableNPObject); if (variable == NPPVpluginNeedsXEmbed) { *((NPBool *) value) = true; fprintf(stderr, "Xembedd\n"); return NPERR_NO_ERROR; } if (variable == NPPVpluginScriptableNPObject) { *(NPObject **) value = sBrowserFuncs->createobject(instance, &navitclass); return NPERR_NO_ERROR; } return NPERR_GENERIC_ERROR; } NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) { return NPERR_GENERIC_ERROR; } navit-0.5.0~svn5643+dfsg.1/navit/builtin.c.in000066400000000000000000000001511221777731700205350ustar00rootroot00000000000000${MODULES_PROTOTYPE}; extern void builtin_init(void); void builtin_init(void) { ${MODULES_FUNC}; } navit-0.5.0~svn5643+dfsg.1/navit/cache.c000066400000000000000000000227221221777731700175350ustar00rootroot00000000000000#include "glib_slice.h" #ifdef DEBUG_CACHE #include #endif #include #include "debug.h" #include "cache.h" struct cache_entry { int usage; int size; struct cache_entry_list *where; struct cache_entry *next; struct cache_entry *prev; int id[0]; }; struct cache_entry_list { struct cache_entry *first, *last; int size; }; struct cache { struct cache_entry_list t1,b1,t2,b2,*insert; int size,id_size,entry_size; int t1_target; int misses; int hits; GHashTable *hash; }; static void cache_entry_dump(struct cache *cache, struct cache_entry *entry) { int i,size; dbg(0,"Usage: %d size %d\n",entry->usage, entry->size); if (cache) size=cache->id_size; else size=5; for (i = 0 ; i < size ; i++) { dbg(0,"0x%x\n", entry->id[i]); } } static void cache_list_dump(char *str, struct cache *cache, struct cache_entry_list *list) { struct cache_entry *first=list->first; dbg(0,"dump %s %d\n",str, list->size); while (first) { cache_entry_dump(cache, first); first=first->next; } } static guint cache_hash4(gconstpointer key) { int *id=(int *)key; return id[0]; } static guint cache_hash20(gconstpointer key) { int *id=(int *)key; return id[0]^id[1]^id[2]^id[3]^id[4]; } static gboolean cache_equal4(gconstpointer a, gconstpointer b) { int *ida=(int *)a; int *idb=(int *)b; return ida[0] == idb[0]; } static gboolean cache_equal20(gconstpointer a, gconstpointer b) { int *ida=(int *)a; int *idb=(int *)b; return(ida[0] == idb[0] && ida[1] == idb[1] && ida[2] == idb[2] && ida[3] == idb[3] && ida[4] == idb[4]); } struct cache * cache_new(int id_size, int size) { struct cache *cache=g_new0(struct cache, 1); cache->id_size=id_size/4; cache->entry_size=cache->id_size*sizeof(int)+sizeof(struct cache_entry); cache->size=size; switch (id_size) { case 4: cache->hash=g_hash_table_new(cache_hash4, cache_equal4); break; case 20: cache->hash=g_hash_table_new(cache_hash20, cache_equal20); break; default: dbg(0,"cache with id_size of %d not supported\n", id_size); g_free(cache); cache=NULL; } return cache; } void cache_resize(struct cache *cache, int size) { cache->size=size; } static void cache_insert_mru(struct cache *cache, struct cache_entry_list *list, struct cache_entry *entry) { entry->prev=NULL; entry->next=list->first; entry->where=list; if (entry->next) entry->next->prev=entry; list->first=entry; if (! list->last) list->last=entry; list->size+=entry->size; if (cache) g_hash_table_insert(cache->hash, (gpointer)entry->id, entry); } static void cache_remove_from_list(struct cache_entry_list *list, struct cache_entry *entry) { if (entry->prev) entry->prev->next=entry->next; else list->first=entry->next; if (entry->next) entry->next->prev=entry->prev; else list->last=entry->prev; list->size-=entry->size; } static void cache_remove(struct cache *cache, struct cache_entry *entry) { dbg(1,"remove 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); g_hash_table_remove(cache->hash, (gpointer)(entry->id)); g_slice_free1(entry->size, entry); } static struct cache_entry * cache_remove_lru_helper(struct cache_entry_list *list) { struct cache_entry *last=list->last; if (! last) return NULL; list->last=last->prev; if (last->prev) last->prev->next=NULL; else list->first=NULL; list->size-=last->size; return last; } static struct cache_entry * cache_remove_lru(struct cache *cache, struct cache_entry_list *list) { struct cache_entry *last; int seen=0; while (list->last && list->last->usage && seen < list->size) { last=cache_remove_lru_helper(list); cache_insert_mru(NULL, list, last); seen+=last->size; } last=list->last; if (! last || last->usage || seen >= list->size) return NULL; dbg(1,"removing %d\n", last->id[0]); cache_remove_lru_helper(list); if (cache) { cache_remove(cache, last); return NULL; } return last; } void * cache_entry_new(struct cache *cache, void *id, int size) { struct cache_entry *ret; size+=cache->entry_size; cache->misses+=size; ret=(struct cache_entry *)g_slice_alloc0(size); ret->size=size; ret->usage=1; memcpy(ret->id, id, cache->id_size*sizeof(int)); return &ret->id[cache->id_size]; } void cache_entry_destroy(struct cache *cache, void *data) { struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); dbg(1,"destroy 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); entry->usage--; } static struct cache_entry * cache_trim(struct cache *cache, struct cache_entry *entry) { struct cache_entry *new_entry; dbg(1,"trim 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); dbg(1,"Trim %x from %d -> %d\n", entry->id[0], entry->size, cache->size); if ( cache->entry_size < entry->size ) { g_hash_table_remove(cache->hash, (gpointer)(entry->id)); new_entry = g_slice_alloc0(cache->entry_size); memcpy(new_entry, entry, cache->entry_size); g_slice_free1( entry->size, entry); new_entry->size = cache->entry_size; g_hash_table_insert(cache->hash, (gpointer)new_entry->id, new_entry); } else { new_entry = entry; } return new_entry; } static struct cache_entry * cache_move(struct cache *cache, struct cache_entry_list *old, struct cache_entry_list *new) { struct cache_entry *entry; entry=cache_remove_lru(NULL, old); if (! entry) return NULL; entry=cache_trim(cache, entry); cache_insert_mru(NULL, new, entry); return entry; } static int cache_replace(struct cache *cache) { if (cache->t1.size >= MAX(1,cache->t1_target)) { dbg(1,"replace 12\n"); if (!cache_move(cache, &cache->t1, &cache->b1)) cache_move(cache, &cache->t2, &cache->b2); } else { dbg(1,"replace t2\n"); if (!cache_move(cache, &cache->t2, &cache->b2)) cache_move(cache, &cache->t1, &cache->b1); } #if 0 if (! entry) { cache_dump(cache); exit(0); } #endif return 1; } void cache_flush(struct cache *cache, void *id) { struct cache_entry *entry=g_hash_table_lookup(cache->hash, id); if (entry) { cache_remove_from_list(entry->where, entry); cache_remove(cache, entry); } } void cache_flush_data(struct cache *cache, void *data) { struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); if (entry) { cache_remove_from_list(entry->where, entry); cache_remove(cache, entry); } } void * cache_lookup(struct cache *cache, void *id) { struct cache_entry *entry; dbg(1,"get %d\n", ((int *)id)[0]); entry=g_hash_table_lookup(cache->hash, id); if (entry == NULL) { cache->insert=&cache->t1; #ifdef DEBUG_CACHE fprintf(stderr,"-"); #endif dbg(1,"not in cache\n"); return NULL; } dbg(1,"found 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); if (entry->where == &cache->t1 || entry->where == &cache->t2) { cache->hits+=entry->size; #ifdef DEBUG_CACHE if (entry->where == &cache->t1) fprintf(stderr,"h"); else fprintf(stderr,"H"); #endif dbg(1,"in cache %s\n", entry->where == &cache->t1 ? "T1" : "T2"); cache_remove_from_list(entry->where, entry); cache_insert_mru(NULL, &cache->t2, entry); entry->usage++; return &entry->id[cache->id_size]; } else { if (entry->where == &cache->b1) { #ifdef DEBUG_CACHE fprintf(stderr,"m"); #endif dbg(1,"in phantom cache B1\n"); cache->t1_target=MIN(cache->t1_target+MAX(cache->b2.size/cache->b1.size, 1),cache->size); cache_remove_from_list(&cache->b1, entry); } else if (entry->where == &cache->b2) { #ifdef DEBUG_CACHE fprintf(stderr,"M"); #endif dbg(1,"in phantom cache B2\n"); cache->t1_target=MAX(cache->t1_target-MAX(cache->b1.size/cache->b2.size, 1),0); cache_remove_from_list(&cache->b2, entry); } else { dbg(0,"**ERROR** invalid where\n"); } cache_replace(cache); cache_remove(cache, entry); cache->insert=&cache->t2; return NULL; } } void cache_insert(struct cache *cache, void *data) { struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); dbg(1,"insert 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); if (cache->insert == &cache->t1) { if (cache->t1.size + cache->b1.size >= cache->size) { if (cache->t1.size < cache->size) { cache_remove_lru(cache, &cache->b1); cache_replace(cache); } else { cache_remove_lru(cache, &cache->t1); } } else { if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= cache->size) { if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= 2*cache->size) cache_remove_lru(cache, &cache->b2); cache_replace(cache); } } } cache_insert_mru(cache, cache->insert, entry); } void * cache_insert_new(struct cache *cache, void *id, int size) { void *data=cache_entry_new(cache, id, size); cache_insert(cache, data); return data; } static void cache_stats(struct cache *cache) { dbg(0,"hits %d misses %d hitratio %d size %d entry_size %d id_size %d T1 target %d\n", cache->hits, cache->misses, cache->hits*100/(cache->hits+cache->misses), cache->size, cache->entry_size, cache->id_size, cache->t1_target); dbg(0,"T1:%d B1:%d T2:%d B2:%d\n", cache->t1.size, cache->b1.size, cache->t2.size, cache->b2.size); cache->hits=0; cache->misses=0; } void cache_dump(struct cache *cache) { cache_stats(cache); cache_list_dump("T1", cache, &cache->t1); cache_list_dump("B1", cache, &cache->b1); cache_list_dump("T2", cache, &cache->t2); cache_list_dump("B2", cache, &cache->b2); dbg(0,"dump end\n"); } navit-0.5.0~svn5643+dfsg.1/navit/cache.h000066400000000000000000000011371221777731700175370ustar00rootroot00000000000000struct cache_entry; struct cache; /* prototypes */ struct cache *cache_new(int id_size, int size); void cache_resize(struct cache *cache, int size); void *cache_entry_new(struct cache *cache, void *id, int size); void cache_entry_destroy(struct cache *cache, void *data); void *cache_lookup(struct cache *cache, void *id); void cache_insert(struct cache *cache, void *data); void *cache_insert_new(struct cache *cache, void *id, int size); void cache_flush(struct cache *cache, void *id); void cache_dump(struct cache *cache); void cache_flush_data(struct cache *cache, void *data); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/callback.c000066400000000000000000000134661221777731700202330ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "item.h" #include "debug.h" #include "callback.h" struct callback { /* func has variable number of arguments, not (void), * but we must declare something... */ void (*func)(void); int pcount; enum attr_type type; void *p[0]; }; struct callback_list { GList *list; }; struct callback_list * callback_list_new(void) { struct callback_list *ret=g_new0(struct callback_list, 1); return ret; } struct callback * callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p) { struct callback *ret; int i; ret=g_malloc0(sizeof(struct callback)+pcount*sizeof(void *)); ret->func=func; ret->pcount=pcount; ret->type=type; for (i = 0 ; i < pcount ; i++) { ret->p[i]=p[i]; } return ret; } struct callback * callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); return callback_new_attr(func, type, count, p); } struct callback * callback_new(void (*func)(void), int pcount, void **p) { return callback_new_attr(func, attr_none, pcount, p); } struct callback * callback_new_args(void (*func)(void), int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); return callback_new(func, count, p); } void callback_destroy(struct callback *cb) { g_free(cb); } void callback_set_arg(struct callback *cb, int arg, void *p) { if (arg < 0 || arg > cb->pcount) return; cb->p[arg]=p; } void callback_list_add(struct callback_list *l, struct callback *cb) { l->list=g_list_prepend(l->list, cb); } struct callback * callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p) { struct callback *ret; ret=callback_new(func, pcount, p); callback_list_add(l, ret); return ret; } void callback_list_remove(struct callback_list *l, struct callback *cb) { l->list=g_list_remove(l->list, cb); } void callback_list_remove_destroy(struct callback_list *l, struct callback *cb) { callback_list_remove(l, cb); g_free(cb); } void callback_call(struct callback *cb, int pcount, void **p) { int i; void *pf[8]; if (! cb) return; if (cb->pcount + pcount <= 8) { dbg(3,"cb->pcount=%d\n", cb->pcount); if (cb->pcount && cb->p) dbg(3,"cb->p[0]=%p\n", cb->p[0]); dbg(3,"pcount=%d\n", pcount); if (pcount) { dbg_assert(p!=NULL); dbg(3,"p[0]=%p\n", p[0]); } for (i = 0 ; i < cb->pcount ; i++) pf[i]=cb->p[i]; for (i = 0 ; i < pcount ; i++) pf[i+cb->pcount]=p[i]; switch (cb->pcount+pcount) { case 8: ((int (*)(void*,void*,void*,void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6],pf[7]); break; case 7: ((int (*)(void*,void*,void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6]); break; case 6: ((int (*)(void*,void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4],pf[5]); break; case 5: ((int (*)(void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4]); break; case 4: ((int (*)(void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3]); break; case 3: ((int (*)(void*,void*,void*))cb->func)( pf[0],pf[1],pf[2]); break; case 2: ((int (*)(void*,void*))cb->func)( pf[0],pf[1]); break; case 1: ((int (*)(void*))cb->func)( pf[0]); break; case 0: cb->func(); break; } } else { dbg(0,"too many parameters for callback (%d+%d)\n", cb->pcount, pcount); } } void callback_call_args(struct callback *cb, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); callback_call(cb, count, p); } void callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p) { GList *cbi; struct callback *cb; if (!l) { return; } cbi=l->list; while (cbi) { cb=cbi->data; if (type == attr_any || cb->type == attr_any || cb->type == type) callback_call(cb, pcount, p); cbi=g_list_next(cbi); } } void callback_list_call_attr_args(struct callback_list *cbl, enum attr_type type, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); callback_list_call_attr(cbl, type, count, p); } void callback_list_call(struct callback_list *l, int pcount, void **p) { callback_list_call_attr(l, attr_any, pcount, p); } void callback_list_call_args(struct callback_list *cbl, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); callback_list_call(cbl, count, p); } void callback_list_destroy(struct callback_list *l) { GList *cbi; cbi=l->list; while (cbi) { g_free(cbi->data); cbi=g_list_next(cbi); } g_list_free(l->list); g_free(l); } navit-0.5.0~svn5643+dfsg.1/navit/callback.h000066400000000000000000000105741221777731700202350ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_CALLBACK_H #define NAVIT_CALLBACK_H #include "item.h" #include "attr.h" #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; struct callback; struct callback_list; struct callback_list *callback_list_new(void); struct callback *callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p); struct callback *callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...); struct callback *callback_new(void (*func)(void), int pcount, void **p); struct callback *callback_new_args(void (*func)(void), int count, ...); void callback_destroy(struct callback *cb); void callback_set_arg(struct callback *cb, int arg, void *p); void callback_list_add(struct callback_list *l, struct callback *cb); struct callback *callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p); void callback_list_remove(struct callback_list *l, struct callback *cb); void callback_list_remove_destroy(struct callback_list *l, struct callback *cb); void callback_call(struct callback *cb, int pcount, void **p); void callback_call_args(struct callback *cb, int count, ...); void callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p); void callback_list_call_attr_args(struct callback_list *cbl, enum attr_type type, int count, ...); void callback_list_call(struct callback_list *l, int pcount, void **p); void callback_list_call_args(struct callback_list *cbl, int count, ...); void callback_list_destroy(struct callback_list *l); /* end of prototypes */ #define callback_new_0(func) callback_new_args(func, 0) #define callback_new_1(func,p1) callback_new_args(func, 1, p1) #define callback_new_2(func,p1,p2) callback_new_args(func, 2, p1, p2) #define callback_new_3(func,p1,p2,p3) callback_new_args(func, 3, p1, p2, p3) #define callback_new_4(func,p1,p2,p3,p4) callback_new_args(func, 4, p1, p2, p3, p4) #define callback_new_attr_0(func,type) callback_new_attr_args(func, type, 0) #define callback_new_attr_1(func,type,p1) callback_new_attr_args(func, type, 1, p1) #define callback_new_attr_2(func,type,p1,p2) callback_new_attr_args(func, type, 2, p1, p2) #define callback_new_attr_3(func,type,p1,p2,p3) callback_new_attr_args(func, type, 3, p1, p2, p3) #define callback_new_attr_4(func,type,p1,p2,p3,p4) callback_new_attr_args(func, type, 4, p1, p2, p3, p4) #define callback_call_0(cb) callback_call_args(cb, 0) #define callback_call_1(cb,p1) callback_call_args(cb, 1, p1) #define callback_call_2(cb,p1,p2) callback_call_args(cb, 2, p1, p2) #define callback_call_3(cb,p1,p2,p3) callback_call_args(cb, 3, p1, p2, p3) #define callback_call_4(cb,p1,p2,p3,p4) callback_call_args(cb, 4, p1, p2, p3, p4) #define callback_list_call_0(cbl) callback_list_call_args(cbl, 0) #define callback_list_call_1(cbl,p1) callback_list_call_args(cbl, 1, p1) #define callback_list_call_2(cbl,p1,p2) callback_list_call_args(cbl, 2, p1, p2) #define callback_list_call_3(cbl,p1,p2,p3) callback_list_call_args(cbl, 3, p1, p2, p3) #define callback_list_call_4(cbl,p1,p2,p3,p4) callback_list_call_args(cbl, 4, p1, p2, p3, p4) #define callback_list_call_attr_0(cbl,type) callback_list_call_attr_args(cbl,type, 0) #define callback_list_call_attr_1(cbl,type,p1) callback_list_call_attr_args(cbl, type, 1, p1) #define callback_list_call_attr_2(cbl,type,p1,p2) callback_list_call_attr_args(cbl, type, 2, p1, p2) #define callback_list_call_attr_3(cbl,type,p1,p2,p3) callback_list_call_attr_args(cbl, type, 3, p1, p2, p3) #define callback_list_call_attr_4(cbl,type,p1,p2,p3,p4) callback_list_call_attr_args(cbl, type, 4, p1, p2, p3, p4) #define callback_cast(x) (void (*)(void))(x) #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/color.h000066400000000000000000000027761221777731700176240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COLOR_H #define NAVIT_COLOR_H struct color { int r,g,b,a; }; #define COLOR_WHITE_ 0xffff,0xffff,0xffff,0xffff #define COLOR_BLACK_ 0x0000,0x0000,0x0000,0xffff #define COLOR_BACKGROUND_ 0xffff, 0xefef, 0xb7b7, 0xffff #define COLOR_TRANSPARENT__ 0x0000,0x0000,0x0000,0xffff #define COLOR_WHITE ((struct color) {COLOR_WHITE_}) #define COLOR_BLACK ((struct color) {COLOR_BLACK_}) #define COLOR_TRANSPARENT ((struct color) {COLOR_TRANSPARENT_}) #define COLOR_FMT "0x%x,0x%x,0x%x,0x%x" #define COLOR_ARGS(c) (c).r,(c).g,(c).b,(c).a #define COLOR_IS_SAME(c1,c2) ((c1).r==(c2).r && (c1).g==(c2).g && (c1).b==(c2).b && (c1).a==(c2).a) #define COLOR_IS_WHITE(c) COLOR_IS_SAME(c, COLOR_WHITE) #define COLOR_IS_BLACK(c) COLOR_IS_SAME(c, COLOR_BLACK) #endif navit-0.5.0~svn5643+dfsg.1/navit/command.c000066400000000000000000001102151221777731700201030ustar00rootroot00000000000000#include #include #include #include #include #include "item.h" #include "xmlconfig.h" #include "main.h" #include "navit.h" #include "vehicle.h" #include "speech.h" #include "gui.h" #include "debug.h" #include "callback.h" #include "command.h" #include "event.h" #include "navit_nls.h" /* gui.fullscreen=!gui.fullscreen gui.menu() gui.get_data() zoom_in() zoom_out() speech.active=!speech.active osd_configuration=1 osd[@type=="xxx"].active=0;osd[@type=="yyy"].active=0 */ struct result { struct attr attr; double val; const char *var; int varlen; const char *attrn; int attrnlen; int allocated; }; struct result_list { struct attr **attrs; }; struct context { struct attr *attr; int error; int skip; const char *expr; struct result res; }; struct command_saved_cb { struct callback *cb; struct attr attr; }; struct command_saved { struct context ctx; struct result res; char *command; // The command string itself struct event_idle *idle_ev; // Event to update this command struct callback *idle_cb; struct callback *register_cb; // Callback to register all the callbacks struct event_idle *register_ev; // Idle event to register all the callbacks struct attr context_attr; int num_cbs; struct command_saved_cb *cbs; // List of callbacks for this saved command struct callback *cb; // Callback that should be called when we re-evaluate int error; int async; }; enum error { no_error=0, missing_double_quote, missing_opening_parenthesis, missing_closing_parenthesis, missing_closing_brace, missing_colon, missing_semicolon, wrong_type, illegal_number_format, illegal_character, missing_closing_bracket, invalid_type, not_ready, internal, eof_reached }; enum op_type { op_type_binary, op_type_prefix, op_type_suffix }; enum set_type { set_type_symbol, set_type_string, set_type_integer, set_type_float }; static void eval_comma(struct context *ctx, struct result *res); static struct attr ** eval_list(struct context *ctx); static void result_free(struct result *res) { if(res->allocated) { attr_free_content(&res->attr); res->allocated=0; } else { res->attr.type=type_none; res->attr.u.data=NULL; } } static int command_register_callbacks(struct command_saved *cs); static const char * get_op(struct context *ctx, int test, ...) { char *op; const char *ret=NULL; va_list ap; while (*ctx->expr && g_ascii_isspace(*ctx->expr)) { ctx->expr++; } va_start(ap, test); while ((op = va_arg(ap, char *))) { if (!strncmp(ctx->expr, op, strlen(op))) { ret=op; if (! test) ctx->expr+=strlen(op); break; } } va_end(ap); return ret; } /*static int is_int(struct result *res) { return 1; }*/ static int is_double(struct result *res) { return 0; } static void dump(struct result *res) { #if 0 char object[res->varlen+1]; char attribute[res->attrnlen+1]; if (res->var) strncpy(object, res->var, res->varlen); object[res->varlen]='\0'; if (res->attrn) strncpy(attribute, res->attrn, res->attrnlen); attribute[res->attrnlen]='\0'; dbg(0,"type:%s\n", attr_to_name(res->attr.type)); dbg(0,"attribute '%s' from '%s'\n", attribute, object); #endif } static enum attr_type command_attr_type(struct result *res) { char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1)); strncpy(attrn, res->attrn, res->attrnlen); attrn[res->attrnlen]='\0'; return attr_from_name(attrn); } static int command_object_get_attr(struct context *ctx, struct attr *object, enum attr_type attr_type, struct attr *ret) { int r; struct attr dup; struct object_func *func=object_func_lookup(object->type); if (!object->u.data || !func || !func->get_attr) return 0; r=func->get_attr(object->u.data, attr_type, &dup, NULL); if(r) attr_dup_content(&dup,ret); return r; } static int command_object_add_attr(struct context *ctx, struct attr *object, struct attr *attr) { struct object_func *func=object_func_lookup(object->type); if (!object->u.data || !func || !func->add_attr) return 0; return func->add_attr(object->u.data, attr); } static int command_object_remove_attr(struct context *ctx, struct attr *object, struct attr *attr) { struct object_func *func=object_func_lookup(object->type); if (!object->u.data || !func || !func->remove_attr) return 0; return func->remove_attr(object->u.data, attr); } static void command_get_attr(struct context *ctx, struct result *res) { int result; struct result tmp={{0,},}; enum attr_type attr_type=command_attr_type(res); if (ctx->skip) return; result=command_object_get_attr(ctx, &res->attr, attr_type, &tmp.attr); result_free(res); *res=tmp; res->allocated=1; if (result) { res->var=res->attrn; res->varlen=res->attrnlen; } else { result_free(res); res->attr.type=attr_none; res->var=NULL; res->varlen=0; } res->attrn=NULL; res->attrnlen=0; dump(res); } static void command_set_attr(struct context *ctx, struct result *res, struct result *newres) { enum attr_type attr_type=command_attr_type(res); struct object_func *func=object_func_lookup(res->attr.type); if (ctx->skip) return; if (!res->attr.u.data || !func || !func->set_attr) return; if (attr_type == attr_attr_types) { char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1)); struct attr *tmp; strncpy(attrn, res->attrn, res->attrnlen); attrn[res->attrnlen]='\0'; tmp=attr_new_from_text(attrn, newres->attr.u.str); newres->attr.u.data=tmp->u.data; newres->allocated=1; g_free(tmp); } newres->attr.type=attr_type; func->set_attr(res->attr.u.data, &newres->attr); result_free(res); *res=*newres; } static void resolve_object(struct context *ctx, struct result *res) { if (res->attr.type == attr_none && res->varlen) { res->attr=*ctx->attr; res->attrn=res->var; res->attrnlen=res->varlen; res->var=NULL; res->varlen=0; } } static void resolve(struct context *ctx, struct result *res, struct attr *parent) //FIXME What is that parent for? { resolve_object(ctx, res); if (res->attrn) command_get_attr(ctx, res); } static double get_double(struct context *ctx, struct result *res) { resolve(ctx, res, NULL); return res->val; } static int get_int_bool(struct context *ctx, int is_bool, struct result *res) { resolve(ctx, res, NULL); if (res->attr.type == attr_none) return 0; if (res->attr.type >= attr_type_int_begin && res->attr.type <= attr_type_int_end) { return res->attr.u.num; } if (res->attr.type >= attr_type_double_begin && res->attr.type <= attr_type_double_end) { return (int) (*res->attr.u.numd); } if (is_bool && ATTR_IS_OBJECT(res->attr.type)) return res->attr.u.data != NULL; if (is_bool && ATTR_IS_STRING(res->attr.type)) return res->attr.u.data != NULL; dbg(0,"bool %d %s\n",is_bool,attr_to_name(res->attr.type)); ctx->error=wrong_type; return 0; } static int get_int(struct context *ctx, struct result *res) { return get_int_bool(ctx, 0, res); } static int get_bool(struct context *ctx, struct result *res) { return !!get_int_bool(ctx, 1, res); } static char * get_string(struct context *ctx, struct result *res) { resolve(ctx, res, NULL); return attr_to_text(&res->attr, NULL, 0); } static void set_double(struct context *ctx, struct result *res, double val) { result_free(res); res->attr.type=attr_type_double_begin; res->attr.u.numd=&res->val; res->val=val; } static void set_int(struct context *ctx, struct result *res, int val) { result_free(res); res->attr.type=attr_type_int_begin; res->attr.u.num=val; } static void result_op(struct context *ctx, enum op_type op_type, const char *op, struct result *inout, struct result *in) { if (ctx->skip) return; switch (op_type) { case op_type_prefix: switch ((op[0] << 8) | op[1]) { case ('!' << 8): set_int(ctx, inout, !get_bool(ctx, inout)); return; case ('~' << 8): set_int(ctx, inout, ~get_int(ctx, inout)); return; } break; case op_type_binary: resolve(ctx, inout, NULL); resolve(ctx, in, NULL); switch ((op[0] << 8) | op[1]) { case ('=' << 8)|'=': if (inout->attr.type == attr_none || in->attr.type == attr_none) { set_int(ctx, inout, 0); } else if (ATTR_IS_STRING(inout->attr.type) && ATTR_IS_STRING(in->attr.type)) { char *s1=get_string(ctx, inout),*s2=get_string(ctx, in); set_int(ctx, inout, (!strcmp(s1,s2))); g_free(s1); g_free(s2); } else if (ATTR_IS_OBJECT(inout->attr.type) && ATTR_IS_OBJECT(in->attr.type)) { set_int(ctx, inout, inout->attr.u.data == in->attr.u.data); } else set_int(ctx, inout, (get_int(ctx, inout) == get_int(ctx, in))); return; case ('!' << 8)|'=': if (inout->attr.type == attr_none || in->attr.type == attr_none) { set_int(ctx, inout, 1); } else if (ATTR_IS_STRING(inout->attr.type) && ATTR_IS_STRING(in->attr.type)) { char *s1=get_string(ctx, inout),*s2=get_string(ctx, in); set_int(ctx, inout, (!!strcmp(s1,s2))); g_free(s1); g_free(s2); } else if (ATTR_IS_OBJECT(inout->attr.type) && ATTR_IS_OBJECT(in->attr.type)) { set_int(ctx, inout, inout->attr.u.data != in->attr.u.data); } else set_int(ctx, inout, (get_int(ctx, inout) != get_int(ctx, in))); return; case ('<' << 8): set_int(ctx, inout, (get_int(ctx, inout) < get_int(ctx, in))); return; case ('<' << 8)|'=': set_int(ctx, inout, (get_int(ctx, inout) <= get_int(ctx, in))); return; case ('>' << 8): set_int(ctx, inout, (get_int(ctx, inout) > get_int(ctx, in))); return; case ('>' << 8)|'=': set_int(ctx, inout, (get_int(ctx, inout) >= get_int(ctx, in))); return; case ('*' << 8): if (is_double(inout) || is_double(in)) set_double(ctx, inout, get_double(ctx, inout) * get_double(ctx, in)); else set_int(ctx, inout, get_int(ctx, inout) * get_int(ctx, in)); return; case ('/' << 8): if (is_double(inout) || is_double(in)) set_double(ctx, inout, get_double(ctx, inout) * get_double(ctx, in)); else set_int(ctx, inout, get_int(ctx, inout) * get_int(ctx, in)); return; case ('%' << 8): set_int(ctx, inout, get_int(ctx, inout) % get_int(ctx, in)); return; case ('+' << 8): if (is_double(inout) || is_double(in)) set_double(ctx, inout, get_double(ctx, inout) + get_double(ctx, in)); else if (ATTR_IS_STRING(inout->attr.type) && ATTR_IS_STRING(in->attr.type)) { char *str=g_strdup_printf("%s%s",inout->attr.u.str,in->attr.u.str); result_free(inout); inout->attr.type=attr_type_string_begin; inout->attr.u.str=str; inout->allocated=1; } else set_int(ctx, inout, get_int(ctx, inout) + get_int(ctx, in)); return; case ('-' << 8): if (is_double(inout) || is_double(in)) set_int(ctx, inout, get_int(ctx, inout) - get_int(ctx, in)); else set_double(ctx, inout, get_double(ctx, inout) - get_double(ctx, in)); return; case ('&' << 8): set_int(ctx, inout, get_int(ctx, inout) & get_int(ctx, in)); return; case ('^' << 8): set_int(ctx, inout, get_int(ctx, inout) ^ get_int(ctx, in)); return; case ('|' << 8): set_int(ctx, inout, get_int(ctx, inout) | get_int(ctx, in)); return; case (('&' << 8) | '&'): set_int(ctx, inout, get_int(ctx, inout) && get_int(ctx, in)); return; case (('|' << 8) | '|'): set_int(ctx, inout, get_int(ctx, inout) || get_int(ctx, in)); return; default: break; } default: break; } dbg(0,"Unkown op %d %s\n",op_type,op); ctx->error=internal; } static void result_set(struct context *ctx, enum set_type set_type, const char *op, int len, struct result *out) { if (ctx->skip) return; switch (set_type) { case set_type_symbol: out->attr.type=attr_none; out->var=op; out->varlen=len; return; case set_type_integer: out->attr.type=attr_type_int_begin; out->attr.u.num=atoi(ctx->expr); return; case set_type_float: out->val = strtod(ctx->expr, NULL); out->attr.type=attr_type_double_begin; out->attr.u.numd=&out->val; return; case set_type_string: if (len >= 2) { out->attr.type=attr_type_string_begin; out->attr.u.str=g_malloc(len-1); strncpy(out->attr.u.str, op+1, len-2); out->attr.u.str[len-2]='\0'; out->allocated=1; return; } break; default: break; } dbg(0,"unknown set type %d %s\n",set_type,op); ctx->error=internal; } static void eval_value(struct context *ctx, struct result *res) { const char *op; int dots=0; op=ctx->expr; result_free(res); res->varlen=0; res->var=NULL; res->attrnlen=0; res->attrn=NULL; while (g_ascii_isspace(*op)) { op++; } if ((op[0] >= 'a' && op[0] <= 'z') || (op[0] >= 'A' && op[0] <= 'Z') || op[0] == '_') { const char *s=op; for (;;) { while ((op[0] >= 'a' && op[0] <= 'z') || (op[0] >= 'A' && op[0] <= 'Z') || (op[0] >= '0' && op[0] <= '9') || op[0] == '_') { op++; } if (op-s == 3 && !strncmp(s,"new",3) && op[0] == ' ') { op++; } else break; } result_set(ctx, set_type_symbol, ctx->expr, op-ctx->expr, res); ctx->expr=op; return; } if ((op[0] >= '0' && op[0] <= '9') || (op[0] == '.' && op[1] >= '0' && op[1] <= '9') || (op[0] == '-' && op[1] >= '0' && op[1] <= '9') || (op[0] == '-' && op[1] == '.' && op[2] >= '0' && op[2] <= '9')) { while ((op[0] >= '0' && op[0] <= '9') || op[0] == '.' || (res->varlen == 0 && op[0] == '-')) { if (op[0] == '.') dots++; if (dots > 1) { ctx->error=illegal_number_format; return; } op++; } result_set(ctx, dots?set_type_float:set_type_integer, ctx->expr, op-ctx->expr, res); ctx->expr=op; return; } if (op[0] == '"') { int escaped=0; do { if (op[0] == '\\') { escaped=1; if (op[1] == '"') op++; } op++; } while (op[0] && op[0] != '"'); if(!*op) { ctx->error=missing_double_quote; return; } op++; if (escaped) { char *tmpstr=g_malloc(op-ctx->expr+1),*s=tmpstr; op=ctx->expr; do { if (op[0] == '\\') op++; *s++=*op++; } while (op[0] != '"'); *s++=*op++; result_set(ctx, set_type_string, tmpstr, s-tmpstr, res); g_free(tmpstr); } else result_set(ctx, set_type_string, ctx->expr, op-ctx->expr, res); ctx->expr=op; return; } if (!*op) ctx->error=eof_reached; else { dbg(0,"illegal character 0x%x\n",*op); ctx->error=illegal_character; } } static int get_next_object(struct context *ctx, struct result *res) { while (*ctx->expr) { res->varlen = 0; ctx->error = 0; eval_value(ctx,res); if ((res->attr.type == attr_none) && (res->varlen > 0)) { if (ctx->expr[0] != '.') { return 1; // 1 means "this is the final object name" } else { return 2; // 2 means "there are more object names following" (e.g. we just hit 'vehicle' in 'vehicle.position_speed' } } if (ctx->error) { // Probably hit an operator ctx->expr++; } } return 0; } static void eval_brace(struct context *ctx, struct result *res) { if (get_op(ctx,0,"(",NULL)) { eval_comma(ctx, res); if (ctx->error) return; if (!get_op(ctx,0,")",NULL)) ctx->error=missing_closing_parenthesis; return; } eval_value(ctx, res); } static void command_call_function(struct context *ctx, struct result *res) { struct attr cbl,**list=NULL; char *function=g_alloca(sizeof(char)*(res->attrnlen+1)); if (res->attrn) strncpy(function, res->attrn, res->attrnlen); function[res->attrnlen]='\0'; dbg(1,"function=%s\n", function); if (ctx->expr[0] != ')') { list=eval_list(ctx); if (ctx->error) { attr_list_free(list); return; } } if (!get_op(ctx,0,")",NULL)) { attr_list_free(list); ctx->error=missing_closing_parenthesis; return; } if (!ctx->skip) { if (!strcmp(function,"_") && list && list[0] && list[0]->type >= attr_type_string_begin && list[0]->type <= attr_type_string_end) { result_free(res); res->attr.type=list[0]->type; res->attr.u.str=g_strdup(navit_nls_gettext(list[0]->u.str)); res->allocated=1; } else if (!strncmp(function,"new ",4)) { enum attr_type attr_type=attr_from_name(function+4); result_free(res); if (ATTR_IS_INT(attr_type)) { if (list && list[0] && ATTR_IS_INT(list[0]->type)) { res->attr.type=attr_type; res->attr.u.num=list[0]->u.num; res->allocated=0; } else { dbg(0,"don't know how to create int of args\n"); } } else if (ATTR_IS_STRING(attr_type)) { if (list && list[0] && ATTR_IS_STRING(list[0]->type)) { res->attr.type=attr_type; res->attr.u.str=g_strdup(list[0]->u.str); res->allocated=1; } else { dbg(0,"don't know how to create string of args\n"); } } else if (ATTR_IS_OBJECT(attr_type)) { struct object_func *func=object_func_lookup(attr_type); if (func && func->create) { res->attr.type=attr_type; res->attr.u.data=func->create(list[0], list+1); /* Setting allocated to 1 here will make object to be destroyed when last reference is destroyed. So created persistent objects should be stored with set_attr_var command. */ res->allocated=1; } } else { dbg(0,"don't know how to create %s (%s)\n",attr_to_name(attr_type),function+4); } } else if (!strcmp(function,"add_attr")) { command_object_add_attr(ctx, &res->attr, list[0]); } else if (!strcmp(function,"remove_attr")) { command_object_remove_attr(ctx, &res->attr, list[0]); } else { if (command_object_get_attr(ctx, &res->attr, attr_callback_list, &cbl)) { int valid =0; struct attr **out=NULL; dbg(1,"function call %s from %s\n",function, attr_to_name(res->attr.type)); callback_list_call_attr_4(cbl.u.callback_list, attr_command, function, list, &out, &valid); if (valid!=1){ dbg(0, "invalid command ignored: \"%s\"; see http://wiki.navit-project.org/index.php/" "The_Navit_Command_Interface for valid commands.\n", function); } if (out && out[0]) { result_free(res); attr_dup_content(out[0], &res->attr); res->allocated=1; attr_list_free(out); } else result_free(res); } else result_free(res); } } attr_list_free(list); res->var=NULL; res->varlen=0; res->attrn=NULL; res->attrnlen=0; } static void eval_postfix(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_brace(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"[","(",".",NULL))) return; if (op[0] == '.') { eval_brace(ctx, &tmp); if (ctx->error) return; resolve(ctx, res,NULL); if (ctx->error) return; res->attrn=tmp.var; res->attrnlen=tmp.varlen; dump(res); } else if (op[0] == '[') { resolve_object(ctx, res); if (ctx->error) return; if (get_op(ctx,0,"@",NULL)) { if (!ctx->skip) { struct object_func *obj_func=object_func_lookup(res->attr.type); struct attr_iter *iter; struct attr attr; enum attr_type attr_type=command_attr_type(res); void *obj=res->attr.u.data; if (!obj) { dbg(0,"no object\n"); return; } if (!obj_func) { dbg(0,"no object func\n"); return; } if (!obj_func->iter_new || !obj_func->iter_destroy) { dbg(0,"no iter func\n"); return; } iter = obj_func->iter_new(NULL); result_free(res); res->varlen=0; res->attrn=NULL; while (obj_func->get_attr(obj, attr_type, &attr, iter)) { if (command_evaluate_to_boolean(&attr, ctx->expr, &ctx->error)) { result_free(res); res->attr=attr; } } obj_func->iter_destroy(iter); } if (ctx->error) return; ctx->expr+=command_evaluate_to_length(ctx->expr, &ctx->error); } if (!get_op(ctx,0,"]",NULL)) { ctx->error=missing_closing_bracket; return; } } else if (op[0] == '(') { dbg(1,"function call\n"); resolve_object(ctx, res); command_call_function(ctx, res); } } } static void eval_unary(struct context *ctx, struct result *res) { const char *op; op=get_op(ctx,0,"~","!",NULL); if (op) { eval_unary(ctx, res); if (ctx->error) return; result_op(ctx, op_type_prefix, op, res, NULL); } else eval_postfix(ctx, res); } static void eval_multiplicative(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_unary(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"*","/","%",NULL))) return; eval_unary(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, op, res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_additive(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_multiplicative(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"-","+",NULL))) return; eval_multiplicative(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, op, res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_equality(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_additive(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"==","!=","<=",">=","<",">",NULL))) return; eval_additive(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, op, res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_bitwise_and(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_equality(ctx, res); if (ctx->error) return; for (;;) { if (get_op(ctx,1,"&&",NULL)) return; if (!get_op(ctx,0,"&",NULL)) return; eval_equality(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "&", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_bitwise_xor(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_bitwise_and(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,"^",NULL)) return; eval_bitwise_and(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "^", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_bitwise_or(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_bitwise_xor(ctx, res); if (ctx->error) return; for (;;) { if (get_op(ctx,1,"||",NULL)) return; if (!get_op(ctx,0,"|",NULL)) return; eval_bitwise_xor(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "|", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_logical_and(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_bitwise_or(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,"&&",NULL)) return; eval_bitwise_or(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "&&", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_logical_or(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_logical_and(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,"||",NULL)) return; eval_logical_and(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "||", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_conditional(struct context *ctx, struct result *res) { struct result tmp={{0,},}; int cond=0; int skip; eval_logical_or(ctx, res); if (ctx->error) return; if (!get_op(ctx,0,"?",NULL)) return; skip=ctx->skip; cond=get_bool(ctx, res); result_free(res); if (ctx->error) return; ctx->skip=!cond || skip; eval_logical_or(ctx, &tmp); ctx->skip=skip; if (ctx->error) { result_free(&tmp); return; } *res=tmp; memset(&tmp,0,sizeof(tmp)); if (!get_op(ctx,0,":",NULL)) { dbg(0,"ctxerr\n"); ctx->error=missing_colon; return; } ctx->skip=cond || skip; eval_logical_or(ctx, &tmp); ctx->skip=skip; if (ctx->error) { result_free(&tmp); return; } if (!cond) { result_free(res); *res=tmp; } else result_free(&tmp); } /* = *= /= %= += -= >>= <<= &= ^= |= */ static void eval_assignment(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_conditional(ctx, res); if (ctx->error) return; if (!get_op(ctx,0,"=",NULL)) return; eval_conditional(ctx, &tmp); if (ctx->error) { result_free(&tmp); return; } resolve(ctx, &tmp, NULL); if (ctx->error) { result_free(&tmp); return; } resolve_object(ctx, res); command_set_attr(ctx, res, &tmp); } /* , */ static void eval_comma(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_assignment(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,",",NULL)) return; eval_assignment(ctx, &tmp); if (ctx->error) return; result_free(res); *res=tmp; } } static struct attr ** eval_list(struct context *ctx) { struct result tmp={{0,},}; struct attr **ret=NULL; for (;;) { eval_assignment(ctx, &tmp); if (ctx->error) { result_free(&tmp); attr_list_free(ret); return NULL; } resolve(ctx, &tmp, NULL); ret=attr_generic_add_attr(ret, &tmp.attr); result_free(&tmp); if (!get_op(ctx,0,",",NULL)) return ret; } } #if 0 void command(struct attr *attr, char *expr) { struct result res; struct context ctx; memset(&res, 0, sizeof(res)); memset(&ctx, 0, sizeof(ctx)); ctx.attr=attr; ctx.error=0; ctx.expr=expr; printf("command='%s'\n", expr); eval_comma(&ctx,&res); printf("err=%d %s\n", ctx.error, ctx.expr); dump(&res); printf("***\n"); resolve(&ctx, &res, NULL); dump(&res); printf("%s\n", get_string(&ctx, &res)); } #endif static void command_evaluate_to(struct attr *attr, const char *expr, struct context *ctx, struct result *res) { result_free(res); memset(res, 0, sizeof(*res)); memset(ctx, 0, sizeof(*ctx)); ctx->attr=attr; ctx->expr=expr; eval_comma(ctx,res); } enum attr_type command_evaluate_to_attr(struct attr *attr, char *expr, int *error, struct attr *ret) { struct result res={{0,},}; struct context ctx; command_evaluate_to(attr, expr, &ctx, &res); if (ctx.error) return attr_none; resolve_object(&ctx, &res); *ret=res.attr; dbg(1,"type %s\n",attr_to_name(command_attr_type(&res))); return command_attr_type(&res); } void command_evaluate_to_void(struct attr *attr, char *expr, int *error) { struct result res={{0,},}; struct context ctx; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res, NULL); if (error) *error=ctx.error; result_free(&res); } char * command_evaluate_to_string(struct attr *attr, char *expr, int *error) { struct result res={{0,},}; struct context ctx; char *ret=NULL; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res, NULL); if (!ctx.error) ret=get_string(&ctx, &res); if (error) *error=ctx.error; result_free(&res); if (ctx.error) return NULL; else return ret; } int command_evaluate_to_int(struct attr *attr, char *expr, int *error) { struct result res={{0,},}; struct context ctx; int ret=0; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res, NULL); if (!ctx.error) ret=get_int(&ctx, &res); if (error) *error=ctx.error; result_free(&res); if (ctx.error) return 0; else return ret; } int command_evaluate_to_boolean(struct attr *attr, const char *expr, int *error) { struct result res={{0,},}; struct context ctx; int ret=0; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res, NULL); if (!ctx.error) { if (res.attr.type == attr_none) ret=0; else if ((res.attr.type >= attr_type_int_begin && res.attr.type <= attr_type_int_end) || (res.attr.type >= attr_type_double_begin && res.attr.type <= attr_type_double_end)) ret=get_int(&ctx, &res); else ret=res.attr.u.data != NULL; } result_free(&res); if (error) *error=ctx.error; if (ctx.error) return 0; else return ret; } int command_evaluate_to_length(const char *expr, int *error) { struct attr attr; struct result res={{0,},}; struct context ctx; attr.type=attr_none; attr.u.data=NULL; command_evaluate_to(&attr, expr, &ctx, &res); result_free(&res); if (!ctx.error) return ctx.expr-expr; return 0; } static int command_evaluate_single(struct context *ctx) { struct result res={{0,},},tmp={{0,},}; const char *op,*a,*f,*end; enum attr_type attr_type; void *obj; struct object_func *obj_func; struct attr_iter *iter; struct attr attr; int cond=0; int skip=ctx->skip; if (!(op=get_op(ctx,0,"foreach","if","{",NULL))) { eval_comma(ctx,&res); if (ctx->error) return 0; resolve(ctx, &res, NULL); result_free(&res); if (ctx->error) return 0; return get_op(ctx,0,";",NULL) != NULL; } switch (op[0]) { case 'f': if (!get_op(ctx,0,"(",NULL)) { ctx->error=missing_opening_parenthesis; return 0; } ctx->skip=1; a=ctx->expr; eval_conditional(ctx, &res); resolve_object(ctx, &res); ctx->skip=skip; if (!get_op(ctx,0,";",NULL)) { ctx->error=missing_semicolon; return 0; } eval_comma(ctx,&res); attr_type=command_attr_type(&res); obj=res.attr.u.data; obj_func=object_func_lookup(res.attr.type); if (!get_op(ctx,0,")",NULL)) { ctx->error=missing_closing_parenthesis; return 0; } f=ctx->expr; ctx->skip=1; if (!command_evaluate_single(ctx)) { ctx->skip=skip; return 0; } ctx->skip=skip; if (ctx->skip) { result_free(&res); return 1; } end=ctx->expr; if (!obj) { dbg(0,"no object\n"); return 0; } if (!obj_func) { dbg(0,"no object func\n"); return 0; } if (!obj_func->iter_new || !obj_func->iter_destroy) { dbg(0,"no iter func\n"); return 0; } iter = obj_func->iter_new(NULL); while (obj_func->get_attr(obj, attr_type, &attr, iter)) { ctx->expr=a; eval_conditional(ctx, &res); resolve_object(ctx, &res); tmp.attr=attr; resolve(ctx, &tmp, NULL); if (ctx->error) { result_free(&tmp); return 0; } command_set_attr(ctx, &res, &tmp); result_free(&tmp); ctx->expr=f; if (!command_evaluate_single(ctx)) { obj_func->iter_destroy(iter); return 0; } } obj_func->iter_destroy(iter); ctx->expr=end; return 1; case 'i': if (!get_op(ctx,0,"(",NULL)) { ctx->error=missing_opening_parenthesis; return 0; } eval_comma(ctx,&res); if (!skip && !ctx->error) cond=get_bool(ctx, &res); result_free(&res); if (ctx->error) return 0; if (!get_op(ctx,0,")",NULL)) { ctx->error=missing_closing_parenthesis; return 0; } ctx->skip=!cond || skip; command_evaluate_single(ctx); ctx->skip=skip; if (ctx->error) return 0; if (get_op(ctx,0,"else",NULL)) { ctx->skip=cond || skip; command_evaluate_single(ctx); ctx->skip=skip; if (ctx->error) return 0; } return 1; case '{': while (!get_op(ctx,0,"}",NULL)) { if (!command_evaluate_single(ctx)) return 0; } return 1; default: return 0; } } void command_evaluate(struct attr *attr, const char *expr) { /* Once the eval has started we can't rely anymore on the content of * expr which may be freed when the calling widget is destroyed by a * subsequent command call. Hence the g_strdup. */ char *expr_dup; struct context ctx={0,}; ctx.attr=attr; ctx.error=0; ctx.expr=expr_dup=g_strdup(expr); for (;;) { if (!command_evaluate_single(&ctx)) break; } if (ctx.error && ctx.error != eof_reached) { char expr[32]; strncpy(expr, ctx.expr, 32); expr[31]='\0'; dbg(0,"error %d starting at %s\n",ctx.error,expr); } g_free(expr_dup); } #if 0 void command_interpreter(struct attr *attr) { char buffer[4096]; int size; for (;;) { size=read(0, buffer, 4095); buffer[size]='\0'; if (size) { buffer[size-1]='\0'; } command(attr, buffer); } } #endif static void command_table_call(struct command_table *table, int count, void *data, char *command, struct attr **in, struct attr ***out, int *valid) { int i; for (i = 0 ; i < count ; i++) { if (!strcmp(command,table->command)) { if (valid) *valid=1; table->func(data, command, in, out); } table++; } } void command_add_table_attr(struct command_table *table, int count, void *data, struct attr *attr) { attr->type=attr_callback; attr->u.callback=callback_new_attr_3(callback_cast(command_table_call),attr_command, table, count, data); } void command_add_table(struct callback_list *cbl, struct command_table *table, int count, void *data) { struct attr attr; command_add_table_attr(table, count, data, &attr); callback_list_add(cbl, attr.u.callback); } void command_saved_set_cb (struct command_saved *cs, struct callback *cb) { cs->cb = cb; } int command_saved_get_int (struct command_saved *cs) { return get_int(&cs->ctx, &cs->res); } int command_saved_error (struct command_saved *cs) { return cs->error; } static void command_saved_evaluate_idle (struct command_saved *cs) { // Only run once at a time if (cs->idle_ev) { event_remove_idle(cs->idle_ev); cs->idle_ev = NULL; } command_evaluate_to(&cs->context_attr, cs->command, &cs->ctx, &cs->res); if (!cs->ctx.error) { cs->error = 0; if (cs->cb) { callback_call_1(cs->cb, cs); } } else { cs->error = cs->ctx.error; } } static void command_saved_evaluate(struct command_saved *cs) { if (!cs->async) { command_saved_evaluate_idle(cs); return; } if (cs->idle_ev) { // We're already scheduled for reevaluation return; } if (!cs->idle_cb) { cs->idle_cb = callback_new_1(callback_cast(command_saved_evaluate_idle), cs); } cs->idle_ev = event_add_idle(100, cs->idle_cb); } static void command_saved_callbacks_changed(struct command_saved *cs) { // For now, we delete each and every callback and then re-create them int i; struct object_func *func; struct attr attr; if (cs->register_ev) { event_remove_idle(cs->register_ev); cs->register_ev = NULL; } attr.type = attr_callback; for (i = 0; i < cs->num_cbs; i++) { func = object_func_lookup(cs->cbs[i].attr.type); if (!func->remove_attr) { dbg(0, "Could not remove command-evaluation callback because remove_attr is missing for type %i!\n", cs->cbs[i].attr.type); continue; } attr.u.callback = cs->cbs[i].cb; func->remove_attr(cs->cbs[i].attr.u.data, &attr); callback_destroy(cs->cbs[i].cb); } g_free(cs->cbs); cs->cbs = NULL; cs->num_cbs = 0; // Now, re-create all the callbacks command_register_callbacks(cs); } static int command_register_callbacks(struct command_saved *cs) { struct attr prev,cb_attr,attr; int status; struct object_func *func; struct callback *cb; attr = cs->context_attr; cs->ctx.expr = cs->command; cs->ctx.attr = &attr; prev = cs->context_attr; while ((status = get_next_object(&cs->ctx, &cs->res)) != 0) { resolve(&cs->ctx, &cs->res, NULL); if (cs->ctx.error || (cs->res.attr.type == attr_none)) { // We could not resolve an object, perhaps because it has not been created return 0; } if (prev.type != attr_none) { func = object_func_lookup(prev.type); if (func->add_attr) { if (status == 2) { // This is not the final attribute name cb = callback_new_attr_1(callback_cast(command_saved_callbacks_changed), cs->res.attr.type, (void*)cs); attr = cs->res.attr; } else if (status == 1) { // This is the final attribute name cb = callback_new_attr_1(callback_cast(command_saved_evaluate), cs->res.attr.type, (void*)cs); cs->ctx.attr = &cs->context_attr; } else { dbg(0, "Error: Strange status returned from get_next_object()\n"); } cs->num_cbs++; cs->cbs = g_realloc(cs->cbs, (sizeof(struct command_saved_cb) * cs->num_cbs)); cs->cbs[cs->num_cbs-1].cb = cb; cs->cbs[cs->num_cbs-1].attr = prev; cb_attr.u.callback = cb; cb_attr.type = attr_callback; func->add_attr(prev.u.data, &cb_attr); } else { dbg(0, "Could not add callback because add_attr is missing for type %i}n", prev.type); } } if (status == 2) { prev = cs->res.attr; } else { prev = cs->context_attr; } } command_saved_evaluate_idle(cs); return 1; } struct command_saved * command_saved_attr_new(char *command, struct attr *attr, struct callback *cb, int async) { struct command_saved *ret; ret = g_new0(struct command_saved, 1); ret->command = g_strdup(command); ret->context_attr = *attr; ret->cb = cb; ret->error = not_ready; ret->async = async; if (!command_register_callbacks(ret)) { // We try this as an idle call again ret->register_cb = callback_new_1(callback_cast(command_saved_callbacks_changed), ret); ret->register_ev = event_add_idle(300, ret->register_cb); } return ret; } struct command_saved * command_saved_new(char *command, struct navit *navit, struct callback *cb, int async) { struct attr attr=ATTR_OBJECT(navit, navit); return command_saved_attr_new(command, &attr, cb, async); } void command_saved_destroy(struct command_saved *cs) { g_free(cs->command); g_free(cs); } navit-0.5.0~svn5643+dfsg.1/navit/command.h000066400000000000000000000046341221777731700201170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COMMAND_H #define NAVIT_COMMAND_H #ifdef __cplusplus extern "C" { #endif struct command_table { const char *command; int (*func)(void *data, char *cmd, struct attr **in, struct attr ***out); }; #define command_cast(x) (int (*)(void *, char *, struct attr **, struct attr ***))(x) /* prototypes */ enum attr_type; struct attr; struct callback; struct callback_list; struct command_saved; struct command_table; struct navit; enum attr_type command_evaluate_to_attr(struct attr *attr, char *expr, int *error, struct attr *ret); void command_evaluate_to_void(struct attr *attr, char *expr, int *error); char *command_evaluate_to_string(struct attr *attr, char *expr, int *error); int command_evaluate_to_int(struct attr *attr, char *expr, int *error); int command_evaluate_to_boolean(struct attr *attr, const char *expr, int *error); int command_evaluate_to_length(const char *expr, int *error); void command_evaluate(struct attr *attr, const char *expr); void command_add_table_attr(struct command_table *table, int count, void *data, struct attr *attr); void command_add_table(struct callback_list *cbl, struct command_table *table, int count, void *data); void command_saved_set_cb(struct command_saved *cs, struct callback *cb); int command_saved_get_int(struct command_saved *cs); int command_saved_error(struct command_saved *cs); struct command_saved *command_saved_attr_new(char *command, struct attr *context, struct callback *cb, int async); struct command_saved *command_saved_new(char *command, struct navit *navit, struct callback *cb, int async); void command_saved_destroy(struct command_saved *cs); /* end of prototypes */ #ifdef __cplusplus } #endif #endif /* NAVIT_COMMAND_H */ navit-0.5.0~svn5643+dfsg.1/navit/compass.c000066400000000000000000000074631221777731700201440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "point.h" #include "coord.h" #include "graphics.h" #include "transform.h" #include "item.h" #include "route.h" #include "vehicle.h" #include "navit.h" #include "compass.h" #if 0 struct compass { struct graphics *gr; struct graphics_gc *bg; struct graphics_gc *white; struct graphics_gc *green; struct graphics_font *font; }; static void transform_rotate(struct point *center, int angle, struct point *p, int count) { int i,x,y; double dx,dy; for (i = 0 ; i < count ; i++) { dx=sin(M_PI*angle/180.0); dy=cos(M_PI*angle/180.0); x=dy*p->x-dx*p->y; y=dx*p->x+dy*p->y; p->x=center->x+x; p->y=center->y+y; p++; } } static void handle(struct graphics *gr, struct graphics_gc *gc, struct point *p, int r, int dir) { struct point ph[3]; int l=r*0.4; ph[0].x=0; ph[0].y=r; ph[1].x=0; ph[1].y=-r; transform_rotate(p, dir, ph, 2); gr->draw_lines(gr, gc, ph, 2); ph[0].x=-l; ph[0].y=-r+l; ph[1].x=0; ph[1].y=-r; ph[2].x=l; ph[2].y=-r+l; transform_rotate(p, dir, ph, 3); gr->draw_lines(gr, gc, ph, 3); } void compass_draw(struct compass *comp, struct container *co) { struct point p; struct coord *pos, *dest; double *vehicle_dir,dir,distance; int dx,dy; char buffer[16]; if (! co->vehicle) return; vehicle_dir=vehicle_dir_get(co->vehicle); comp->gr->draw_mode(comp->gr, draw_mode_begin); p.x=0; p.y=0; comp->gr->draw_rectangle(comp->gr, comp->bg, &p, 60, 80); p.x=30; p.y=30; comp->gr->draw_circle(comp->gr, comp->white, &p, 50); if (co->flags->orient_north) handle(comp->gr,comp->white, &p, 20,0); else handle(comp->gr, comp->white, &p, 20, -*vehicle_dir); #if 0 /* FIXME */ dest=route_get_destination(co->route); if (dest) { pos=vehicle_pos_get(co->vehicle); dx=dest->x-pos->x; dy=dest->y-pos->y; dir=atan2(dx,dy)*180.0/M_PI; #if 0 printf("dx %d dy %d dir=%f vehicle_dir=%f\n", dx, dy, dir, *vehicle_dir); #endif if (! co->flags->orient_north) dir-=*vehicle_dir; handle(comp->gr, comp->green, &p, 20, dir); p.x=8; p.y=72; distance=transform_distance(projection_mg, pos, dest)/1000.0; if (distance >= 100) sprintf(buffer,"%.0f km", distance); else if (distance >= 10) sprintf(buffer,"%.1f km", distance); else sprintf(buffer,"%.2f km", distance); comp->gr->draw_text(comp->gr, comp->green, NULL, comp->font, buffer, &p, 0x10000, 0); } #endif comp->gr->draw_mode(comp->gr, draw_mode_end); } struct compass * compass_new(struct container *co) { struct compass *this=g_new0(struct compass, 1); struct point p; p.x=10; p.y=10; this->gr=co->gra->overlay_new(co->gra, &p, 60, 80); this->bg=this->gr->gc_new(this->gr); this->gr->gc_set_foreground(this->bg, 0, 0, 0); this->white=this->gr->gc_new(this->gr); this->gr->gc_set_foreground(this->white, 0xffff, 0xffff, 0xffff); this->gr->gc_set_linewidth(this->white, 2); this->green=this->gr->gc_new(this->gr); this->gr->gc_set_foreground(this->green, 0x0, 0xffff, 0x0); this->gr->gc_set_linewidth(this->green, 2); this->font=this->gr->font_new(this->gr, 200); compass_draw(this, co); return this; } #endif navit-0.5.0~svn5643+dfsg.1/navit/compass.h000066400000000000000000000016561221777731700201470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COMPASS_H #define NAVIT_COMPASS_H struct compass * compass_new(struct container *co); void compass_draw(struct compass *comp, struct container *co); #endif navit-0.5.0~svn5643+dfsg.1/navit/config_.c000066400000000000000000000075351221777731700201030ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "callback.h" #include "navit.h" #include "config_.h" #include "file.h" #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif struct config { NAVIT_OBJECT } *config; struct config * config_get(void) { return config; } int config_empty_ok; int configured; struct attr_iter { void *iter; }; void config_destroy(struct config *this_) { attr_list_free(this_->attrs); g_free(config); exit(0); } static void config_terminate(int sig) { dbg(0,"terminating\n"); config_destroy(config); } static void config_new_int(void) { config=g_new0(struct config, 1); #ifndef HAVE_API_WIN32_CE signal(SIGTERM, config_terminate); #ifndef HAVE_API_WIN32 #ifndef _MSC_VER #ifndef __MINGW32__ signal(SIGPIPE, SIG_IGN); #endif /* __MINGW32__ */ #endif #endif #endif } int config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } static int config_set_attr_int(struct config *this_, struct attr *attr) { switch (attr->type) { case attr_language: setenv("LANG",attr->u.str,1); return 1; case attr_cache_size: return file_set_cache_size(attr->u.num); default: return 0; } } int config_set_attr(struct config *this_, struct attr *attr) { if (config_set_attr_int(this_, attr)) return navit_object_set_attr((struct navit_object *)this_, attr); else return 0; } int config_add_attr(struct config *this_, struct attr *attr) { if (!config) { config_new_int(); this_=config; } return navit_object_add_attr((struct navit_object *)this_, attr); } int config_remove_attr(struct config *this_, struct attr *attr) { return navit_object_remove_attr((struct navit_object *)this_, attr); } struct attr_iter * config_attr_iter_new() { return navit_object_attr_iter_new(); } void config_attr_iter_destroy(struct attr_iter *iter) { navit_object_attr_iter_destroy(iter); } struct config * config_new(struct attr *parent, struct attr **attrs) { if (configured) { dbg(0,"only one config allowed\n"); return config; } if (parent) { dbg(0,"no parent in config allowed\n"); return NULL; } if (!config) config_new_int(); config->func=&config_func; navit_object_ref((struct navit_object *)config); config->attrs=attr_generic_add_attr_list(config->attrs, attrs); while (*attrs) { if (!config_set_attr_int(config,*attrs)) { dbg(0,"failed to set attribute '%s'\n",attr_to_name((*attrs)->type)); config_destroy(config); config=NULL; break; } attrs++; } configured=1; return config; } struct object_func config_func = { attr_config, (object_func_new)config_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)config_set_attr, (object_func_add_attr)config_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/config_.h000066400000000000000000000015201221777731700200740ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif extern int main_argc; extern char * const* main_argv; extern struct config *config; extern int configured; extern int config_empty_ok; /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct config; struct config * config_get(void); void config_destroy(struct config *this_); int config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int config_set_attr(struct config *this_, struct attr *attr); int config_add_attr(struct config *this_, struct attr *attr); int config_remove_attr(struct config *this_, struct attr *attr); struct attr_iter *config_attr_iter_new(void); void config_attr_iter_destroy(struct attr_iter *iter); struct config *config_new(struct attr *parent, struct attr **attrs); /* end of prototypes */ #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/coord.c000066400000000000000000000236021221777731700175760ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "debug.h" #include "item.h" #include "coord.h" #include "transform.h" #include "projection.h" /** * @defgroup coord Coordinate handling functions * @{ */ /** * Get a coordinate * * @param p Pointer to the coordinate * @returns the coordinate */ struct coord * coord_get(unsigned char **p) { struct coord *ret=(struct coord *)(*p); *p += sizeof(*ret); return ret; } struct coord * coord_new(int x, int y) { struct coord *c=g_new(struct coord, 1); c->x=x; c->y=y; return c; } struct coord * coord_new_from_attrs(struct attr *parent, struct attr **attrs) { struct attr *x,*y; x=attr_search(attrs, NULL, attr_x); y=attr_search(attrs, NULL, attr_y); if (!x || !y) return NULL; return coord_new(x->u.num, y->u.num); } void coord_destroy(struct coord *c) { g_free(c); } struct coord_rect * coord_rect_new(struct coord *lu, struct coord *rl) { struct coord_rect *r=g_new(struct coord_rect, 1); dbg_assert(lu->x <= rl->x); dbg_assert(lu->y >= rl->y); r->lu=*lu; r->rl=*rl; return r; } void coord_rect_destroy(struct coord_rect *r) { g_free(r); } int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2) { dbg_assert(r1->lu.x <= r1->rl.x); dbg_assert(r1->lu.y >= r1->rl.y); dbg_assert(r2->lu.x <= r2->rl.x); dbg_assert(r2->lu.y >= r2->rl.y); dbg(3,"0x%x,0x%x - 0x%x,0x%x vs 0x%x,0x%x - 0x%x,0x%x\n", r1->lu.x, r1->lu.y, r1->rl.x, r1->rl.y, r2->lu.x, r2->lu.y, r2->rl.x, r2->rl.y); if (r1->lu.x > r2->rl.x) return 0; if (r1->rl.x < r2->lu.x) return 0; if (r1->lu.y < r2->rl.y) return 0; if (r1->rl.y > r2->lu.y) return 0; return 1; } int coord_rect_contains(struct coord_rect *r, struct coord *c) { dbg_assert(r->lu.x <= r->rl.x); dbg_assert(r->lu.y >= r->rl.y); if (c->x < r->lu.x) return 0; if (c->x > r->rl.x) return 0; if (c->y < r->rl.y) return 0; if (c->y > r->lu.y) return 0; return 1; } void coord_rect_extend(struct coord_rect *r, struct coord *c) { if (c->x < r->lu.x) r->lu.x=c->x; if (c->x > r->rl.x) r->rl.x=c->x; if (c->y < r->rl.y) r->rl.y=c->y; if (c->y > r->lu.y) r->lu.y=c->y; } /** * Parses \c char \a *c_str and writes back the coordinates to \c coord \a *c_ret. Uses \c projection \a pro if no projection is given in \c char \a *c_str. * The format for \a *c_str can be: * \li [Proj:]-0xX [-]0xX * - where Proj can be mg/garmin, defaults to mg * \li [Proj:][D][D]Dmm.ss[S][S] N/S [D][D]DMM.ss[S][S]... E/W * \li [Proj:][-][D]D.d[d]... [-][D][D]D.d[d] * - where Proj can be geo * * @param *c_str String to be parsed * @param pro Projection of the string * @param *pc_ret Where the \a pcoord should get stored * @returns The lenght of the parsed string */ int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret) { int debug=0; char *proj=NULL,*s,*co; const char *str=c_str; int args,ret = 0; struct coord_geo g; struct coord c,offset; enum projection str_pro=projection_none; dbg(1,"enter('%s',%d,%p)\n", c_str, pro, c_ret); s=strchr(str,' '); co=strchr(str,':'); if (co && co < s) { proj=malloc(co-str+1); strncpy(proj, str, co-str); proj[co-str]='\0'; dbg(1,"projection=%s\n", proj); str=co+1; s=strchr(str,' '); if (!strcmp(proj, "mg")) str_pro = projection_mg; else if (!strcmp(proj, "garmin")) str_pro = projection_garmin; else if (!strcmp(proj, "geo")) str_pro = projection_none; else { str_pro = projection_from_name(proj,&offset); if (str_pro == projection_none) { dbg(0, "Unknown projection: %s\n", proj); goto out; } } } if (! s) { ret=0; goto out; } while (*s == ' ') { s++; } if (!strncmp(s, "0x", 2) || !strncmp(s, "-0x", 3)) { args=sscanf(str, "%i %i%n",&c.x, &c.y, &ret); if (args < 2) goto out; dbg(1,"str='%s' x=0x%x y=0x%x c=%d\n", str, c.x, c.y, ret); dbg(1,"rest='%s'\n", str+ret); if (str_pro == projection_none) str_pro=projection_mg; if (str_pro != pro) { transform_to_geo(str_pro, &c, &g); transform_from_geo(pro, &g, &c); } *c_ret=c; } else if (*s == 'N' || *s == 'n' || *s == 'S' || *s == 's') { double lng, lat; char ns, ew; dbg(1,"str='%s'\n", str); args=sscanf(str, "%lf %c %lf %c%n", &lat, &ns, &lng, &ew, &ret); dbg(1,"args=%d\n", args); dbg(1,"lat=%f %c lon=%f %c\n", lat, ns, lng, ew); if (args < 4) goto out; dbg(1,"projection=%d str_pro=%d projection_none=%d\n", pro, str_pro, projection_none); if (str_pro == projection_none) { g.lat=floor(lat/100); lat-=g.lat*100; g.lat+=lat/60; g.lng=floor(lng/100); lng-=g.lng*100; g.lng+=lng/60; if (ns == 's' || ns == 'S') g.lat=-g.lat; if (ew == 'w' || ew == 'W') g.lng=-g.lng; dbg(1,"transform_from_geo(%f,%f)",g.lat,g.lng); transform_from_geo(pro, &g, c_ret); dbg(1,"result 0x%x,0x%x\n", c_ret->x,c_ret->y); } dbg(3,"str='%s' x=%f ns=%c y=%f ew=%c c=%d\n", str, lng, ns, lat, ew, ret); dbg(3,"rest='%s'\n", str+ret); } else if (str_pro == projection_utm || str_pro == projection_gk) { double x,y; args=sscanf(str, "%lf %lf%n", &x, &y, &ret); if (args < 2) goto out; c.x=x+offset.x; c.y=y+offset.y; if (str_pro != pro) { transform_to_geo(str_pro, &c, &g); transform_from_geo(pro, &g, &c); } *c_ret=c; } else { double lng, lat; args=sscanf(str, "%lf %lf%n", &lng, &lat, &ret); if (args < 2) goto out; dbg(1,"str='%s' x=%f y=%f c=%d\n", str, lng, lat, ret); dbg(1,"rest='%s'\n", str+ret); g.lng=lng; g.lat=lat; transform_from_geo(pro, &g, c_ret); } if (debug) printf("rest='%s'\n", str+ret); ret+=str-c_str; if (debug) { printf("args=%d\n", args); printf("ret=%d delta=%d ret_str='%s'\n", ret, GPOINTER_TO_INT(str-c_str), c_str+ret); } out: free(proj); return ret; } /** * A wrapper for pcoord_parse that also return the projection * @param *c_str String to be parsed * @param pro Projection of the string * @param *pc_ret Where the \a pcoord should get stored * @returns The lenght of the parsed string */ int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *pc_ret) { struct coord c; int ret; ret = coord_parse(c_str, pro, &c); pc_ret->x = c.x; pc_ret->y = c.y; pc_ret->pro = pro; return ret; } void coord_print(enum projection pro, struct coord *c, FILE *out) { unsigned int x; unsigned int y; char *sign_x = ""; char *sign_y = ""; if ( c->x < 0 ) { x = -c->x; sign_x = "-"; } else { x = c->x; } if ( c->y < 0 ) { y = -c->y; sign_y = "-"; } else { y = c->y; } fprintf( out, "%s: %s0x%x %s0x%x\n", projection_to_name( pro ), sign_x, x, sign_y, y ); return; } /** * @brief Converts a lat/lon into a text formatted text string. * @param lat The latitude (if lat is 360 or greater, the latitude will be omitted) * @param lng The longitude (if lng is 360 or greater, the longitude will be omitted) * @param fmt The format to use. * @li DEGREES_DECIMAL=>Degrees with decimal places, i.e. 20.5000°N 110.5000°E * @li DEGREES_MINUTES=>Degrees and minutes, i.e. 20°30.00'N 110°30.00'E * @li DEGREES_MINUTES_SECONDS=>Degrees, minutes and seconds, i.e. 20°30'30.00"N 110°30'30"E * * * @param buffer A buffer large enough to hold the output + a terminating NULL (up to 31 bytes) * @param size The size of the buffer * */ void coord_format(float lat,float lng, enum coord_format fmt, char * buffer, int size) { char lat_c='N'; char lng_c='E'; float lat_deg,lat_min,lat_sec; float lng_deg,lng_min,lng_sec; int size_used=0; if (lng < 0) { lng=-lng; lng_c='W'; } if (lat < 0) { lat=-lat; lat_c='S'; } lat_deg=lat; lat_min=(lat-floor(lat_deg))*60; lat_sec=fmod(lat*3600,60); lng_deg=lng; lng_min=(lng-floor(lng_deg))*60; lng_sec=fmod(lng*3600,60); switch(fmt) { case DEGREES_DECIMAL: if (lat<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.6f°%c",lat,lat_c); if ((lat<360)&&(lng<360)) size_used+=g_snprintf(buffer+size_used,size-size_used," "); if (lng<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.7f°%c",lng,lng_c); break; case DEGREES_MINUTES: if (lat<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.0f°%07.4f' %c",floor(lat_deg),lat_min,lat_c); if ((lat<360)&&(lng<360)) size_used+=g_snprintf(buffer+size_used,size-size_used," "); if (lng<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.0f°%07.4f' %c",floor(lng_deg),lng_min,lng_c); break; case DEGREES_MINUTES_SECONDS: if (lat<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.0f°%02.0f'%05.2f\" %c",floor(lat_deg),floor(lat_min),lat_sec,lat_c); if ((lat<360)&&(lng<360)) size_used+=g_snprintf(buffer+size_used,size-size_used," "); if (lng<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.0f°%02.0f'%05.2f\" %c",floor(lng_deg),floor(lng_min),lng_sec,lng_c); break; } } unsigned int coord_hash(const void *key) { const struct coord *c=key; return c->x^c->y; } int coord_equal(const void *a, const void *b) { const struct coord *c_a=a; const struct coord *c_b=b; if (c_a->x == c_b->x && c_a->y == c_b->y) return TRUE; return FALSE; } /** @} */ navit-0.5.0~svn5643+dfsg.1/navit/coord.h000066400000000000000000000111651221777731700176040ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COORD_H #define NAVIT_COORD_H #ifdef __cplusplus extern "C" { #endif #include #include "config.h" #include "projection.h" #define coord_is_equal(a,b) ((a).x==(b).x && (a).y==(b).y) /*! A integer mercator coordinate */ struct coord { int x; /*!< X-Value */ int y; /*!< Y-Value */ }; /*! A integer mercator coordinate carrying its projection */ struct pcoord { enum projection pro; int x; /*!< X-Value */ int y; /*!< Y-Value */ }; struct coord_rect { struct coord lu; struct coord rl; }; #ifdef AVOID_FLOAT /** * On platforms where we are trying to avoid floats, sometimes we can't. * It is better on these platforms to use single precision floating points * over double percision ones since performance is much better. */ typedef float navit_float; #define navit_sin(x) sinf(x) #define navit_cos(x) cosf(x) #define navit_tan(x) tanf(x) #define navit_atan(x) atanf(x) #define navit_acos(x) acosf(x) #define navit_asin(x) asinf(x) #define navit_sqrt(x) sqrtf(x) #else typedef double navit_float; #define navit_sin(x) sin(x) #define navit_cos(x) cos(x) #define navit_tan(x) tan(x) #define navit_atan(x) atan(x) #define navit_acos(x) acos(x) #define navit_asin(x) asin(x) #define navit_sqrt(x) sqrt(x) #endif //! A double mercator coordinate struct coord_d { double x; /*!< X-Value */ double y; /*!< Y-Value */ }; //! A WGS84 coordinate struct coord_geo { navit_float lng; /*!< Longitude */ navit_float lat; /*!< Latitude */ }; //! A cartesian coordinate struct coord_geo_cart { navit_float x; /*!< X-Value */ navit_float y; /*!< Y-Value */ navit_float z; /*!< Z-Value */ }; /** * An enumeration of formats for printing geographic coordinates in. * */ enum coord_format { /** * Degrees with decimal places. * Ie 20.5000 N 110.5000 E */ DEGREES_DECIMAL, /** * Degrees and minutes. * ie 20 30.00 N 110 30.00 E */ DEGREES_MINUTES, /** * Degrees, minutes and seconds. * ie 20 30 30.00 N 110 30 30 E */ DEGREES_MINUTES_SECONDS }; enum projection; struct attr; struct coord * coord_get(unsigned char **p); struct coord * coord_new(int x, int y); struct coord * coord_new_from_attrs(struct attr *parent, struct attr **attrs); void coord_destroy(struct coord *c); int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret); int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *c_ret); void coord_print(enum projection pro, struct coord *c, FILE *out); struct coord_rect * coord_rect_new(struct coord *lu, struct coord *rl); void coord_rect_destroy(struct coord_rect *r); int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2); int coord_rect_contains(struct coord_rect *r, struct coord *c); void coord_rect_extend(struct coord_rect *r, struct coord *c); void coord_format(float lat,float lng, enum coord_format, char * buffer, int size); /* prototypes */ enum coord_format; enum projection; struct attr; struct coord; struct coord_rect; struct pcoord; struct coord *coord_get(unsigned char **p); struct coord *coord_new(int x, int y); struct coord *coord_new_from_attrs(struct attr *parent, struct attr **attrs); void coord_destroy(struct coord *c); struct coord_rect *coord_rect_new(struct coord *lu, struct coord *rl); void coord_rect_destroy(struct coord_rect *r); int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2); int coord_rect_contains(struct coord_rect *r, struct coord *c); void coord_rect_extend(struct coord_rect *r, struct coord *c); int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret); int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *pc_ret); void coord_print(enum projection pro, struct coord *c, FILE *out); void coord_format(float lat, float lng, enum coord_format fmt, char *buffer, int size); unsigned int coord_hash(const void *key); int coord_equal(const void *a, const void *b); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/country.c000066400000000000000000000454521221777731700202020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "item.h" #include "country.h" #include "search.h" #include "linguistics.h" #include "navit_nls.h" struct country { int id; const char *car; const char *iso2; const char *iso3; const char *name; }; /* List of all known countries and their codes. * If you update this list, look at country_table array in maptool/osm.c also. */ static struct country country[]= { { 20, "AND", "AD", "AND", /* 020 */ _n("Andorra")}, {784, "UAE", "AE", "ARE", /* 784 */ _n("United Arab Emirates")}, { 4, "AFG", "AF", "AFG", /* 004 */ _n("Afghanistan")}, { 28, "AG", "AG", "ATG", /* 028 */ _n("Antigua and Barbuda")}, {660, NULL, "AI", "AIA", /* 660 */ _n("Anguilla")}, { 8, "AL", "AL", "ALB", /* 008 */ _n("Albania")}, { 51, "ARM", "AM", "ARM", /* 051 */ _n("Armenia")}, {530, "NA", "AN", "ANT", /* 530 */ _n("Netherlands Antilles")}, { 24, "ANG", "AO", "AGO", /* 024 */ _n("Angola")}, { 10, NULL, "AQ", "ATA", /* 010 */ _n("Antarctica")}, { 32, "RA", "AR", "ARG", /* 032 */ _n("Argentina")}, { 16, NULL, "AS", "ASM", /* 016 */ _n("American Samoa")}, { 40, "A", "AT", "AUT", /* 040 */ _n("Austria")}, { 36, "AUS", "AU", "AUS", /* 036 */ _n("Australia")}, {533, "ARU", "AW", "ABW", /* 533 */ _n("Aruba")}, {248, "AX", "AX", "ALA", /* 248 */ _n("Aland Islands")}, { 31, "AZ", "AZ", "AZE", /* 031 */ _n("Azerbaijan")}, { 70, "BiH", "BA", "BIH", /* 070 */ _n("Bosnia and Herzegovina")}, { 52, "BDS", "BB", "BRB", /* 052 */ _n("Barbados")}, { 50, "BD", "BD", "BGD", /* 050 */ _n("Bangladesh")}, { 56, "B", "BE", "BEL", /* 056 */ _n("Belgium")}, {854, "BF", "BF", "BFA", /* 854 */ _n("Burkina Faso")}, {100, "BG", "BG", "BGR", /* 100 */ _n("Bulgaria")}, { 48, "BRN", "BH", "BHR", /* 048 */ _n("Bahrain")}, {108, "RU", "BI", "BDI", /* 108 */ _n("Burundi")}, {204, "BJ", "BJ", "BEN", /* 204 */ _n("Benin")}, {652, NULL, "BL", "BLM", /* 652 */ _n("Saint Barthelemy")}, { 60, NULL, "BM", "BMU", /* 060 */ _n("Bermuda")}, { 96, "BRU", "BN", "BRN", /* 096 */ _n("Brunei Darussalam")}, { 68, "BOL", "BO", "BOL", /* 068 */ _n("Bolivia")}, {535, NULL, "BQ", "BES", /* 535 */ _n("Bonaire, Sint Eustatius and Saba")}, { 76, "BR", "BR", "BRA", /* 076 */ _n("Brazil")}, { 44, "BS", "BS", "BHS", /* 044 */ _n("Bahamas")}, { 64, "BHT", "BT", "BTN", /* 064 */ _n("Bhutan")}, { 74, NULL, "BV", "BVT", /* 074 */ _n("Bouvet Island")}, { 72, "RB", "BW", "BWA", /* 072 */ _n("Botswana")}, {112, "BY", "BY", "BLR", /* 112 */ _n("Belarus")}, { 84, "BZ", "BZ", "BLZ", /* 084 */ _n("Belize")}, {124, "CDN", "CA", "CAN", /* 124 */ _n("Canada")}, {166, NULL, "CC", "CCK", /* 166 */ _n("Cocos (Keeling) Islands")}, {180, "CGO", "CD", "COD", /* 180 */ _n("Congo, Democratic Republic of the")}, {140, "RCA", "CF", "CAF", /* 140 */ _n("Central African Republic")}, {178, NULL, "CG", "COG", /* 178 */ _n("Congo")}, {756, "CH", "CH", "CHE", /* 756 */ _n("Switzerland")}, {384, "CI", "CI", "CIV", /* 384 */ _n("Cote d'Ivoire")}, {184, NULL, "CK", "COK", /* 184 */ _n("Cook Islands")}, {152, "RCH", "CL", "CHL", /* 152 */ _n("Chile")}, {120, "CAM", "CM", "CMR", /* 120 */ _n("Cameroon")}, {156, "RC", "CN", "CHN", /* 156 */ _n("China")}, {170, "CO", "CO", "COL", /* 170 */ _n("Colombia")}, {188, "CR", "CR", "CRI", /* 188 */ _n("Costa Rica")}, {192, "C", "CU", "CUB", /* 192 */ _n("Cuba")}, {132, "CV", "CV", "CPV", /* 132 */ _n("Cape Verde")}, {531, NULL, "CW", "CUW", /* 531 */ _n("Curacao")}, {162, NULL, "CX", "CXR", /* 162 */ _n("Christmas Island")}, {196, "CY", "CY", "CYP", /* 196 */ _n("Cyprus")}, {203, "CZ", "CZ", "CZE", /* 203 */ _n("Czech Republic")}, {276, "D", "DE", "DEU", /* 276 */ _n("Germany")}, {262, "DJI", "DJ", "DJI", /* 262 */ _n("Djibouti")}, {208, "DK", "DK", "DNK", /* 208 */ _n("Denmark")}, {212, "WD", "DM", "DMA", /* 212 */ _n("Dominica")}, {214, "DOM", "DO", "DOM", /* 214 */ _n("Dominican Republic")}, { 12, "DZ", "DZ", "DZA", /* 012 */ _n("Algeria")}, {218, "EC", "EC", "ECU", /* 218 */ _n("Ecuador")}, {233, "EST", "EE", "EST", /* 233 */ _n("Estonia")}, {818, "ET", "EG", "EGY", /* 818 */ _n("Egypt")}, {732, "WSA", "EH", "ESH", /* 732 */ _n("Western Sahara")}, {232, "ER", "ER", "ERI", /* 232 */ _n("Eritrea")}, {724, "E", "ES", "ESP", /* 724 */ _n("Spain")}, {231, "ETH", "ET", "ETH", /* 231 */ _n("Ethiopia")}, {246, "FIN", "FI", "FIN", /* 246 */ _n("Finland")}, {242, "FJI", "FJ", "FJI", /* 242 */ _n("Fiji")}, {238, NULL, "FK", "FLK", /* 238 */ _n("Falkland Islands (Malvinas)")}, {583, "FSM", "FM", "FSM", /* 583 */ _n("Micronesia, Federated States of")}, {234, "FO", "FO", "FRO", /* 234 */ _n("Faroe Islands")}, {250, "F", "FR", "FRA", /* 250 */ _n("France")}, {266, "G", "GA", "GAB", /* 266 */ _n("Gabon")}, {826, "GB", "GB", "GBR", /* 826 */ _n("United Kingdom")}, {308, "WG", "GD", "GRD", /* 308 */ _n("Grenada")}, {268, "GE", "GE", "GEO", /* 268 */ _n("Georgia")}, {254, NULL, "GF", "GUF", /* 254 */ _n("French Guiana")}, {831, NULL, "GG", "GGY", /* 831 */ _n("Guernsey")}, {288, "GH", "GH", "GHA", /* 288 */ _n("Ghana")}, {292, "GBZ", "GI", "GIB", /* 292 */ _n("Gibraltar")}, {304, "KN", "GL", "GRL", /* 304 */ _n("Greenland")}, {270, "WAG", "GM", "GMB", /* 270 */ _n("Gambia")}, {324, "RG", "GN", "GIN", /* 324 */ _n("Guinea")}, {312, NULL, "GP", "GLP", /* 312 */ _n("Guadeloupe")}, {226, "GQ", "GQ", "GNQ", /* 226 */ _n("Equatorial Guinea")}, {300, "GR", "GR", "GRC", /* 300 */ _n("Greece")}, {239, NULL, "GS", "SGS", /* 239 */ _n("South Georgia and the South Sandwich Islands")}, {320, "GCA", "GT", "GTM", /* 320 */ _n("Guatemala")}, {316, NULL, "GU", "GUM", /* 316 */ _n("Guam")}, {624, "GUB", "GW", "GNB", /* 624 */ _n("Guinea-Bissau")}, {328, "GUY", "GY", "GUY", /* 328 */ _n("Guyana")}, {344, "HK", "HK", "HKG", /* 344 */ _n("Hong Kong")}, {334, NULL, "HM", "HMD", /* 334 */ _n("Heard Island and McDonald Islands")}, {340, "HN", "HN", "HND", /* 340 */ _n("Honduras")}, {191, "HR", "HR", "HRV", /* 191 */ _n("Croatia")}, {332, "RH", "HT", "HTI", /* 332 */ _n("Haiti")}, {348, "H", "HU", "HUN", /* 348 */ _n("Hungary")}, {360, "RI", "ID", "IDN", /* 360 */ _n("Indonesia")}, {372, "IRL", "IE", "IRL", /* 372 */ _n("Ireland")}, {376, "IL", "IL", "ISR", /* 376 */ _n("Israel")}, {833, NULL, "IM", "IMN", /* 833 */ _n("Isle of Man")}, {356, "IND", "IN", "IND", /* 356 */ _n("India")}, { 86, NULL, "IO", "IOT", /* 086 */ _n("British Indian Ocean Territory")}, {368, "IRQ", "IQ", "IRQ", /* 368 */ _n("Iraq")}, {364, "IR", "IR", "IRN", /* 364 */ _n("Iran, Islamic Republic of")}, {352, "IS", "IS", "ISL", /* 352 */ _n("Iceland")}, {380, "I", "IT", "ITA", /* 380 */ _n("Italy")}, {832, NULL, "JE", "JEY", /* 832 */ _n("Jersey")}, {388, "JA", "JM", "JAM", /* 388 */ _n("Jamaica")}, {400, "JOR", "JO", "JOR", /* 400 */ _n("Jordan")}, {392, "J", "JP", "JPN", /* 392 */ _n("Japan")}, {404, "EAK", "KE", "KEN", /* 404 */ _n("Kenya")}, {417, "KS", "KG", "KGZ", /* 417 */ _n("Kyrgyzstan")}, {116, "K", "KH", "KHM", /* 116 */ _n("Cambodia")}, {296, "KIR", "KI", "KIR", /* 296 */ _n("Kiribati")}, {174, "COM", "KM", "COM", /* 174 */ _n("Comoros")}, {659, "KAN", "KN", "KNA", /* 659 */ _n("Saint Kitts and Nevis")}, {408, "KP", "KP", "PRK", /* 408 */ _n("Korea, Democratic People's Republic of")}, {410, "ROK", "KR", "KOR", /* 410 */ _n("Korea, Republic of")}, {414, "KWT", "KW", "KWT", /* 414 */ _n("Kuwait")}, {136, NULL, "KY", "CYM", /* 136 */ _n("Cayman Islands")}, {398, "KZ", "KZ", "KAZ", /* 398 */ _n("Kazakhstan")}, {418, "LAO", "LA", "LAO", /* 418 */ _n("Lao People's Democratic Republic")}, {422, "RL", "LB", "LBN", /* 422 */ _n("Lebanon")}, {662, "WL", "LC", "LCA", /* 662 */ _n("Saint Lucia")}, {438, "FL", "LI", "LIE", /* 438 */ _n("Liechtenstein")}, {144, "CL", "LK", "LKA", /* 144 */ _n("Sri Lanka")}, {430, "LB", "LR", "LBR", /* 430 */ _n("Liberia")}, {426, "LS", "LS", "LSO", /* 426 */ _n("Lesotho")}, {440, "LT", "LT", "LTU", /* 440 */ _n("Lithuania")}, {442, "L", "LU", "LUX", /* 442 */ _n("Luxembourg")}, {428, "LV", "LV", "LVA", /* 428 */ _n("Latvia")}, {434, "LAR", "LY", "LBY", /* 434 */ _n("Libya")}, {504, "MA", "MA", "MAR", /* 504 */ _n("Morocco")}, {492, "MC", "MC", "MCO", /* 492 */ _n("Monaco")}, {498, "MD", "MD", "MDA", /* 498 */ _n("Moldova, Republic of")}, {499, "MNE", "ME", "MNE", /* 499 */ _n("Montenegro")}, {663, NULL, "MF", "MAF", /* 663 */ _n("Saint Martin (French part)")}, {450, "RM", "MG", "MDG", /* 450 */ _n("Madagascar")}, {584, "MH", "MH", "MHL", /* 584 */ _n("Marshall Islands")}, {807, "MK", "MK", "MKD", /* 807 */ _n("Macedonia, the former Yugoslav Republic of")}, {466, "RMM", "ML", "MLI", /* 466 */ _n("Mali")}, {104, "MYA", "MM", "MMR", /* 104 */ _n("Myanmar")}, {496, "MGL", "MN", "MNG", /* 496 */ _n("Mongolia")}, {446, NULL, "MO", "MAC", /* 446 */ _n("Macao")}, {580, NULL, "MP", "MNP", /* 580 */ _n("Northern Mariana Islands")}, {474, NULL, "MQ", "MTQ", /* 474 */ _n("Martinique")}, {478, "RIM", "MR", "MRT", /* 478 */ _n("Mauritania")}, {500, NULL, "MS", "MSR", /* 500 */ _n("Montserrat")}, {470, "M", "MT", "MLT", /* 470 */ _n("Malta")}, {480, "MS", "MU", "MUS", /* 480 */ _n("Mauritius")}, {462, "MV", "MV", "MDV", /* 462 */ _n("Maldives")}, {454, "MW", "MW", "MWI", /* 454 */ _n("Malawi")}, {484, "MEX", "MX", "MEX", /* 484 */ _n("Mexico")}, {458, "MAL", "MY", "MYS", /* 458 */ _n("Malaysia")}, {508, "MOC", "MZ", "MOZ", /* 508 */ _n("Mozambique")}, {516, "NAM", "NA", "NAM", /* 516 */ _n("Namibia")}, {540, "NCL", "NC", "NCL", /* 540 */ _n("New Caledonia")}, {562, "RN", "NE", "NER", /* 562 */ _n("Niger")}, {574, NULL, "NF", "NFK", /* 574 */ _n("Norfolk Island")}, {566, "NGR", "NG", "NGA", /* 566 */ _n("Nigeria")}, {558, "NIC", "NI", "NIC", /* 558 */ _n("Nicaragua")}, {528, "NL", "NL", "NLD", /* 528 */ _n("Netherlands")}, {578, "N", "NO", "NOR", /* 578 */ _n("Norway")}, {524, "NEP", "NP", "NPL", /* 524 */ _n("Nepal")}, {520, "NAU", "NR", "NRU", /* 520 */ _n("Nauru")}, {570, NULL, "NU", "NIU", /* 570 */ _n("Niue")}, {554, "NZ", "NZ", "NZL", /* 554 */ _n("New Zealand")}, {512, "OM", "OM", "OMN", /* 512 */ _n("Oman")}, {591, "PA", "PA", "PAN", /* 591 */ _n("Panama")}, {604, "PE", "PE", "PER", /* 604 */ _n("Peru")}, {258, NULL, "PF", "PYF", /* 258 */ _n("French Polynesia")}, {598, "PNG", "PG", "PNG", /* 598 */ _n("Papua New Guinea")}, {608, "RP", "PH", "PHL", /* 608 */ _n("Philippines")}, {586, "PK", "PK", "PAK", /* 586 */ _n("Pakistan")}, {616, "PL", "PL", "POL", /* 616 */ _n("Poland")}, {666, NULL, "PM", "SPM", /* 666 */ _n("Saint Pierre and Miquelon")}, {612, NULL, "PN", "PCN", /* 612 */ _n("Pitcairn")}, {630, "PRI", "PR", "PRI", /* 630 */ _n("Puerto Rico")}, {275, "AUT", "PS", "PSE", /* 275 */ _n("Palestinian Territory, Occupied")}, {620, "P", "PT", "PRT", /* 620 */ _n("Portugal")}, {585, "PAL", "PW", "PLW", /* 585 */ _n("Palau")}, {600, "PY", "PY", "PRY", /* 600 */ _n("Paraguay")}, {634, "Q", "QA", "QAT", /* 634 */ _n("Qatar")}, {638, NULL, "RE", "REU", /* 638 */ _n("Reunion")}, {642, "RO", "RO", "ROU", /* 642 */ _n("Romania")}, {688, "SRB", "RS", "SRB", /* 688 */ _n("Serbia")}, {643, "RUS", "RU", "RUS", /* 643 */ _n("Russian Federation")}, {646, "RWA", "RW", "RWA", /* 646 */ _n("Rwanda")}, {682, "KSA", "SA", "SAU", /* 682 */ _n("Saudi Arabia")}, { 90, "SOL", "SB", "SLB", /* 090 */ _n("Solomon Islands")}, {690, "SY", "SC", "SYC", /* 690 */ _n("Seychelles")}, {736, "SUD", "SD", "SDN", /* 736 */ _n("Sudan")}, {752, "S", "SE", "SWE", /* 752 */ _n("Sweden")}, {702, "SGP", "SG", "SGP", /* 702 */ _n("Singapore")}, {654, NULL, "SH", "SHN", /* 654 */ _n("Saint Helena")}, {705, "SLO", "SI", "SVN", /* 705 */ _n("Slovenia")}, {744, NULL, "SJ", "SJM", /* 744 */ _n("Svalbard and Jan Mayen")}, {703, "SK", "SK", "SVK", /* 703 */ _n("Slovakia")}, {694, "WAL", "SL", "SLE", /* 694 */ _n("Sierra Leone")}, {674, "RSM", "SM", "SMR", /* 674 */ _n("San Marino")}, {686, "SN", "SN", "SEN", /* 686 */ _n("Senegal")}, {706, "SO", "SO", "SOM", /* 706 */ _n("Somalia")}, {740, "SME", "SR", "SUR", /* 740 */ _n("Suriname")}, {728, NULL, "SS", "SSD", /* 728 */ _n("South Sudan")}, {678, "STP", "ST", "STP", /* 678 */ _n("Sao Tome and Principe")}, {222, "ES", "SV", "SLV", /* 222 */ _n("El Salvador")}, {534, NULL, "SX", "SXM", /* 534 */ _n("Sint Maarten (Dutch part)")}, {760, "SYR", "SY", "SYR", /* 760 */ _n("Syrian Arab Republic")}, {748, "SD", "SZ", "SWZ", /* 748 */ _n("Swaziland")}, {796, NULL, "TC", "TCA", /* 796 */ _n("Turks and Caicos Islands")}, {148, "TD", "TD", "TCD", /* 148 */ _n("Chad")}, {260, "ARK", "TF", "ATF", /* 260 */ _n("French Southern Territories")}, {768, "RT", "TG", "TGO", /* 768 */ _n("Togo")}, {764, "T", "TH", "THA", /* 764 */ _n("Thailand")}, {762, "TJ", "TJ", "TJK", /* 762 */ _n("Tajikistan")}, {772, NULL, "TK", "TKL", /* 772 */ _n("Tokelau")}, {626, "TL", "TL", "TLS", /* 626 */ _n("Timor-Leste")}, {795, "TM", "TM", "TKM", /* 795 */ _n("Turkmenistan")}, {788, "TN", "TN", "TUN", /* 788 */ _n("Tunisia")}, {776, "TON", "TO", "TON", /* 776 */ _n("Tonga")}, {792, "TR", "TR", "TUR", /* 792 */ _n("Turkey")}, {780, "TT", "TT", "TTO", /* 780 */ _n("Trinidad and Tobago")}, {798, "TUV", "TV", "TUV", /* 798 */ _n("Tuvalu")}, {158, NULL, "TW", "TWN", /* 158 */ _n("Taiwan, Province of China")}, {834, "EAT", "TZ", "TZA", /* 834 */ _n("Tanzania, United Republic of")}, {804, "UA", "UA", "UKR", /* 804 */ _n("Ukraine")}, {800, "EAU", "UG", "UGA", /* 800 */ _n("Uganda")}, {581, NULL, "UM", "UMI", /* 581 */ _n("United States Minor Outlying Islands")}, {840, "USA", "US", "USA", /* 840 */ _n("United States")}, {858, "ROU", "UY", "URY", /* 858 */ _n("Uruguay")}, {860, "UZ", "UZ", "UZB", /* 860 */ _n("Uzbekistan")}, {336, "SCV", "VA", "VAT", /* 336 */ _n("Holy See (Vatican City State)")}, {670, "WV", "VC", "VCT", /* 670 */ _n("Saint Vincent and the Grenadines")}, {862, "YV", "VE", "VEN", /* 862 */ _n("Venezuela")}, { 92, NULL, "VG", "VGB", /* 092 */ _n("Virgin Islands, British")}, {850, NULL, "VI", "VIR", /* 850 */ _n("Virgin Islands, U.S.")}, {704, "VN", "VN", "VNM", /* 704 */ _n("Viet Nam")}, {548, "VAN", "VU", "VUT", /* 548 */ _n("Vanuatu")}, {876, NULL, "WF", "WLF", /* 876 */ _n("Wallis and Futuna")}, {882, "WS", "WS", "WSM", /* 882 */ _n("Samoa")}, {887, "YAR", "YE", "YEM", /* 887 */ _n("Yemen")}, {175, NULL, "YT", "MYT", /* 175 */ _n("Mayotte")}, {710, "ZA", "ZA", "ZAF", /* 710 */ _n("South Africa") }, {894, "Z", "ZM", "ZMB", /* 894 */ _n("Zambia")}, {716, "ZW", "ZW", "ZWE", /* 716 */ _n("Zimbabwe")}, {999, "*", "*", "*", _n("* Unknown, add is_in tags to those cities")}, }; struct country_search { struct attr search; int len; int partial; struct item item; int count; struct country *country; enum attr_type attr_next; }; static int country_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct country_search *this_=priv_data; struct country *country=this_->country; attr->type=attr_type; switch (attr_type) { case attr_any: while (this_->attr_next != attr_none) { if (country_attr_get(this_, this_->attr_next, attr)) return 1; } return 0; // Cast to char* necessary but safe, because our callers know // not to modify attr->u.str (hopefully). case attr_label: attr->u.str=(char*)navit_nls_gettext(country->name); this_->attr_next=attr_country_id; return 1; case attr_country_id: attr->u.num=country->id; this_->attr_next=country->car ? attr_country_car : attr_country_iso2; return 1; case attr_country_car: attr->u.str=(char*)country->car; this_->attr_next=attr_country_iso2; return attr->u.str ? 1 : 0; case attr_country_iso2: attr->u.str=(char*)country->iso2; this_->attr_next=attr_country_iso3; return 1; case attr_country_iso3: attr->u.str=(char*)country->iso3; this_->attr_next=attr_country_name; return 1; case attr_country_name: attr->u.str=(char*)navit_nls_gettext(country->name); this_->attr_next=attr_none; return 1; default: return 0; } } struct item_methods country_meth = { NULL, /* coord_rewind */ NULL, /* coord_get */ NULL, /* attr_rewind */ country_attr_get, /* attr_get */ }; struct country_search * country_search_new(struct attr *search, int partial) { struct country_search *ret=g_new(struct country_search, 1); ret->search=*search; ret->search.u.str=linguistics_casefold(ret->search.u.str); if (search->type != attr_country_id) ret->len=strlen(ret->search.u.str); else ret->len=0; ret->partial=partial; ret->count=0; ret->item.type=type_country_label; ret->item.id_hi=0; ret->item.map=NULL; ret->item.meth=&country_meth; ret->item.priv_data=ret; return ret; } static int match(struct country_search *this_, enum attr_type type, const char *name) { int ret; if (!name) return 0; if (this_->search.type != type && this_->search.type != attr_country_all) return 0; ret=linguistics_compare(name, this_->search.u.str, linguistics_cmp_expand | (this_->partial?linguistics_cmp_partial:0) | linguistics_cmp_words)==0; return ret; } struct item * country_search_get_item(struct country_search *this_) { for (;;) { if (this_->count >= sizeof(country)/sizeof(struct country)) return NULL; this_->country=&country[this_->count++]; if ((this_->search.type == attr_country_id && this_->search.u.num == this_->country->id) || match(this_, attr_country_iso3, this_->country->iso3) || match(this_, attr_country_iso2, this_->country->iso2) || match(this_, attr_country_car, this_->country->car) || match(this_, attr_country_name, navit_nls_gettext(this_->country->name))) { this_->item.id_lo=this_->country->id; return &this_->item; } } } static struct attr country_default_attr; static char iso2[3]; struct attr * country_default(void) { char *lang; if (country_default_attr.u.str) return &country_default_attr; lang=getenv("LANG"); if (!lang || strlen(lang) < 5) return NULL; strncpy(iso2, lang+3, 2); country_default_attr.type=attr_country_iso2; country_default_attr.u.str=iso2; return &country_default_attr; } void country_search_destroy(struct country_search *this_) { g_free(this_->search.u.str); g_free(this_); } navit-0.5.0~svn5643+dfsg.1/navit/country.h000066400000000000000000000023121221777731700201730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COUNTRY_H #define NAVIT_COUNTRY_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ struct attr; struct country_search; struct item; struct country_search *country_search_new(struct attr *search, int partial); struct item *country_search_get_item(struct country_search *this_); struct attr *country_default(void); void country_search_destroy(struct country_search *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/data.h000066400000000000000000000043201221777731700174020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DATA_H #define NAVIT_DATA_H #include "config.h" #ifdef WORDS_BIGENDIAN #include #endif static inline unsigned char get_u8(unsigned char **p) { return *((*p)++); } static inline unsigned short get_u16(unsigned char **p) { unsigned short ret; ret=*((unsigned short *)*p); *p+=sizeof(unsigned short); #ifdef WORDS_BIGENDIAN return __bswap_16(ret); #else return ret; #endif } static inline unsigned short get_u16_unal(unsigned char **p) { unsigned short ret; ret=*(*p)++; ret|=(*(*p)++) << 8; return ret; } static inline unsigned int get_u24(unsigned char **p) { unsigned long ret; ret=get_u16(p); ret|=*((*p)++) << 16; return ret; } static inline unsigned int get_u24_unal(unsigned char **p) { unsigned long ret; ret=get_u16_unal(p); ret|=*((*p)++) << 16; return ret; } static inline unsigned int get_u32(unsigned char **p) { unsigned long ret; ret=*((unsigned int *)*p); *p+=sizeof(unsigned int); #ifdef WORDS_BIGENDIAN return __bswap_32(ret); #else return ret; #endif } static inline unsigned int get_u32_unal(unsigned char **p) { unsigned long ret; ret=*(*p)++; ret|=(*(*p)++) << 8; ret|=(*(*p)++) << 16; ret|=(*(*p)++) << 24; return ret; } static inline char * get_string(unsigned char **p) { char *ret=(char *)(*p); while (**p) (*p)++; (*p)++; return ret; } #define L(x) ({ unsigned char *t=(unsigned char *)&(x); t[0] | (t[1] << 8) | (t[2] << 16) | (t[3] << 24); }) #endif navit-0.5.0~svn5643+dfsg.1/navit/data_window.c000066400000000000000000000021271221777731700207670ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "data_window.h" void datawindow_mode(struct datawindow *win, int start) { win->meth.mode(win->priv, start); } void datawindow_add(struct datawindow *win, struct param_list *param, int count) { win->meth.add(win->priv, param, count); } void datawindow_destroy(struct datawindow *win) { win->meth.destroy(win->priv); g_free(win); } navit-0.5.0~svn5643+dfsg.1/navit/data_window.h000066400000000000000000000025561221777731700210020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DATA_WINDOW_H #define NAVIT_DATA_WINDOW_H struct datawindow; struct param_list; struct datawindow_priv; struct datawindow_methods { void (*destroy)(struct datawindow_priv *win); void (*add)(struct datawindow_priv *win, struct param_list *param, int count); void (*mode)(struct datawindow_priv *win, int start); }; struct datawindow { struct datawindow_priv *priv; struct datawindow_methods meth; }; void datawindow_destroy(struct datawindow *win); void datawindow_add(struct datawindow *win, struct param_list *param, int count); void datawindow_mode(struct datawindow *win, int start); #endif navit-0.5.0~svn5643+dfsg.1/navit/data_window_int.h000066400000000000000000000017411221777731700216470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DATA_WINDOW_INT_H #define NAVIT_DATA_WINDOW_INT_H struct data_window { GtkWidget *window; GtkWidget *scrolled_window; GtkWidget *treeview; void(*callback)(struct data_window *, char **cols); }; #endif navit-0.5.0~svn5643+dfsg.1/navit/debug.c000066400000000000000000000244721221777731700175640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "config.h" #include "file.h" #include "item.h" #include "debug.h" #ifdef HAVE_API_ANDROID #include #endif #if defined HAVE_API_WIN32_CE || defined _MSC_VER #include #include #endif #ifdef HAVE_SOCKET #include #include #include #include static int debug_socket=-1; static struct sockaddr_in debug_sin; #endif int debug_level=0; #define GLOBAL_DEBUG_LEVEL_UNSET -1 int global_debug_level=GLOBAL_DEBUG_LEVEL_UNSET; int segv_level=0; int timestamp_prefix=0; static int dummy; static GHashTable *debug_hash; static gchar *gdb_program; static FILE *debug_fp; #if defined(_WIN32) || defined(__CEGCC__) static void sigsegv(int sig) { } #else #include static void sigsegv(int sig) { char buffer[256]; if (segv_level > 1) sprintf(buffer, "gdb -ex bt %s %d", gdb_program, getpid()); else sprintf(buffer, "gdb -ex bt -ex detach -ex quit %s %d", gdb_program, getpid()); system(buffer); exit(1); } #endif void debug_init(const char *program_name) { gdb_program=g_strdup(program_name); signal(SIGSEGV, sigsegv); debug_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED debug_fp = stdout; #else debug_fp = stderr; #endif } static void debug_update_level(gpointer key, gpointer value, gpointer user_data) { if (debug_level < GPOINTER_TO_INT(value)) debug_level = GPOINTER_TO_INT(value); } void debug_set_global_level(int level, int override_old_value ) { if (global_debug_level == GLOBAL_DEBUG_LEVEL_UNSET || override_old_value) { global_debug_level=level; if (debug_level < global_debug_level){ debug_level = global_debug_level; } } } void debug_level_set(const char *name, int level) { if (!strcmp(name, "segv")) { segv_level=level; if (segv_level) signal(SIGSEGV, sigsegv); else signal(SIGSEGV, NULL); } else if (!strcmp(name, "timestamps")) { timestamp_prefix=level; } else if (!strcmp(name, DEBUG_MODULE_GLOBAL)) { debug_set_global_level(level, 0); } else { g_hash_table_insert(debug_hash, g_strdup(name), GINT_TO_POINTER(level)); g_hash_table_foreach(debug_hash, debug_update_level, NULL); } } struct debug * debug_new(struct attr *parent, struct attr **attrs) { struct attr *name,*level; name=attr_search(attrs, NULL, attr_name); level=attr_search(attrs, NULL, attr_level); #ifdef HAVE_SOCKET if (!name && !level) { struct attr *socket_attr=attr_search(attrs, NULL, attr_socket); char *p,*s; if (!socket_attr) return NULL; s=g_strdup(socket_attr->u.str); p=strchr(s,':'); if (!p) { g_free(s); return NULL; } *p++='\0'; debug_sin.sin_family=AF_INET; if (!inet_aton(s, &debug_sin.sin_addr)) { g_free(s); return NULL; } debug_sin.sin_port=ntohs(atoi(p)); if (debug_socket == -1) debug_socket=socket(PF_INET, SOCK_DGRAM, 0); g_free(s); return (struct debug *)&dummy; } #endif if (!name || !level) return NULL; debug_level_set(name->u.str, level->u.num); return (struct debug *)&dummy; } int debug_level_get(const char *name) { if (!debug_hash) return 0; return GPOINTER_TO_INT(g_hash_table_lookup(debug_hash, name)); } static void debug_timestamp(char *buffer) { #if defined HAVE_API_WIN32_CE || defined _MSC_VER LARGE_INTEGER counter, frequency; double val; QueryPerformanceCounter(&counter); QueryPerformanceFrequency(&frequency); val=counter.HighPart * 4294967296.0 + counter.LowPart; val/=frequency.HighPart * 4294967296.0 + frequency.LowPart; sprintf(buffer,"%.6f|",val); #else struct timeval tv; if (gettimeofday(&tv, NULL) == -1) return; /* Timestamps are UTC */ sprintf(buffer, "%02d:%02d:%02d.%03d|", (int)(tv.tv_sec/3600)%24, (int)(tv.tv_sec/60)%60, (int)tv.tv_sec % 60, (int)tv.tv_usec/1000); #endif } void debug_vprintf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap) { #if defined HAVE_API_WIN32_CE || defined _MSC_VER char buffer[4096]; #else char buffer[mlen+flen+3]; #endif FILE *fp=debug_fp; sprintf(buffer, "%s:%s", module, function); if (global_debug_level >= level || debug_level_get(module) >= level || debug_level_get(buffer) >= level) { #if defined(DEBUG_WIN32_CE_MESSAGEBOX) wchar_t muni[4096]; #endif char xbuffer[4096]; xbuffer[0]='\0'; if (prefix) { if (timestamp_prefix) debug_timestamp(xbuffer); strcpy(xbuffer+strlen(xbuffer),buffer); strcpy(xbuffer+strlen(xbuffer),":"); } #if defined HAVE_API_WIN32_CE #define vsnprintf _vsnprintf #endif vsnprintf(xbuffer+strlen(xbuffer),4095-strlen(xbuffer),fmt,ap); #ifdef DEBUG_WIN32_CE_MESSAGEBOX mbstowcs(muni, xbuffer, strlen(xbuffer)+1); MessageBoxW(NULL, muni, TEXT("Navit - Error"), MB_APPLMODAL|MB_OK|MB_ICONERROR); #else #ifdef HAVE_API_ANDROID __android_log_print(ANDROID_LOG_ERROR,"navit", "%s", xbuffer); #else #ifdef HAVE_SOCKET if (debug_socket != -1) { sendto(debug_socket, xbuffer, strlen(xbuffer), 0, (struct sockaddr *)&debug_sin, sizeof(debug_sin)); return; } #endif if (! fp) fp = stderr; fprintf(fp,"%s",xbuffer); fflush(fp); #endif #endif } } void debug_printf(int level, const char *module, const int mlen,const char *function, const int flen, int prefix, const char *fmt, ...) { va_list ap; va_start(ap, fmt); debug_vprintf(level, module, mlen, function, flen, prefix, fmt, ap); va_end(ap); } void debug_assert_fail(const char *module, const int mlen,const char *function, const int flen, const char *file, int line, const char *expr) { debug_printf(0,module,mlen,function,flen,1,"%s:%d assertion failed:%s\n", file, line, expr); abort(); } void debug_destroy(void) { if (!debug_fp) return; if (debug_fp == stderr || debug_fp == stdout) return; fclose(debug_fp); debug_fp = NULL; } void debug_set_logfile(const char *path) { FILE *fp; fp = fopen(path, "a"); if (fp) { debug_destroy(); debug_fp = fp; fprintf(debug_fp, "Navit log started\n"); fflush(debug_fp); } } struct malloc_head { int magic; int size; char *where; void *return_address[8]; struct malloc_head *prev; struct malloc_head *next; } *malloc_heads; struct malloc_tail { int magic; }; int mallocs,debug_malloc_size,debug_malloc_size_m; void debug_dump_mallocs(void) { struct malloc_head *head=malloc_heads; int i; dbg(0,"mallocs %d\n",mallocs); while (head) { fprintf(stderr,"unfreed malloc from %s of size %d\n",head->where,head->size); for (i = 0 ; i < 8 ; i++) fprintf(stderr,"\tlist *%p\n",head->return_address[i]); #if 0 fprintf(stderr,"%s\n",head+1); #endif head=head->next; } } void * debug_malloc(const char *where, int line, const char *func, int size) { struct malloc_head *head; struct malloc_tail *tail; if (!size) return NULL; mallocs++; debug_malloc_size+=size; if (debug_malloc_size/(1024*1024) != debug_malloc_size_m) { debug_malloc_size_m=debug_malloc_size/(1024*1024); dbg(0,"malloced %d kb\n",debug_malloc_size/1024); } head=malloc(size+sizeof(*head)+sizeof(*tail)); head->magic=0xdeadbeef; head->size=size; head->prev=NULL; head->next=malloc_heads; malloc_heads=head; if (head->next) head->next->prev=head; head->where=g_strdup_printf("%s:%d %s",where,line,func); #if !defined (__GNUC__) #define __builtin_return_address(x) NULL #endif head->return_address[0]=__builtin_return_address(0); head->return_address[1]=__builtin_return_address(1); head->return_address[2]=__builtin_return_address(2); head->return_address[3]=__builtin_return_address(3); head->return_address[4]=__builtin_return_address(4); head->return_address[5]=__builtin_return_address(5); head->return_address[6]=__builtin_return_address(6); head->return_address[7]=__builtin_return_address(7); head++; tail=(struct malloc_tail *)((unsigned char *)head+size); tail->magic=0xdeadbef0; return head; } void * debug_malloc0(const char *where, int line, const char *func, int size) { void *ret=debug_malloc(where, line, func, size); if (ret) memset(ret, 0, size); return ret; } void * debug_realloc(const char *where, int line, const char *func, void *ptr, int size) { void *ret=debug_malloc(where, line, func, size); if (ret && ptr) memcpy(ret, ptr, size); debug_free(where, line, func, ptr); return ret; } char * debug_strdup(const char *where, int line, const char *func, const char *ptr) { int size; char *ret; if (!ptr) return NULL; size=strlen(ptr)+1; ret=debug_malloc(where, line, func, size); memcpy(ret, ptr, size); return ret; } char * debug_guard(const char *where, int line, const char *func, char *str) { char *ret=debug_strdup(where, line, func, str); g_free(str); return ret; } void debug_free(const char *where, int line, const char *func, void *ptr) { struct malloc_head *head; struct malloc_tail *tail; if (!ptr) return; mallocs--; head=(struct malloc_head *)((unsigned char *)ptr-sizeof(*head)); tail=(struct malloc_tail *)((unsigned char *)ptr+head->size); debug_malloc_size-=head->size; if (head->magic != 0xdeadbeef || tail->magic != 0xdeadbef0) { fprintf(stderr,"Invalid free from %s:%d %s\n",where,line,func); } head->magic=0; tail->magic=0; if (head->prev) head->prev->next=head->next; else malloc_heads=head->next; if (head->next) head->next->prev=head->prev; free(head->where); free(head); } void debug_free_func(void *ptr) { debug_free("unknown",0,"unknown",ptr); } void debug_finished(void) { debug_dump_mallocs(); g_free(gdb_program); g_hash_table_destroy(debug_hash); debug_destroy(); } navit-0.5.0~svn5643+dfsg.1/navit/debug.h000066400000000000000000000101461221777731700175620ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DEBUG_H #define NAVIT_DEBUG_H #ifdef __cplusplus extern "C" { #endif #include #include #ifdef _MSC_VER #define __PRETTY_FUNCTION__ __FUNCTION__ /* Uncomment the following define to enable MSVC's memory debugging support */ /*#define _CRTDBG_MAP_ALLOC*/ #ifdef _CRTDBG_MAP_ALLOC #include #include #endif #endif extern int debug_level; #define dbg_str2(x) #x #define dbg_str1(x) dbg_str2(x) #define dbg_module dbg_str1(MODULE) #define dbg(level,...) { if (debug_level >= level) debug_printf(level,dbg_module,strlen(dbg_module),__PRETTY_FUNCTION__, strlen(__PRETTY_FUNCTION__),1,__VA_ARGS__); } #define dbg_assert(expr) ((expr) ? (void) 0 : debug_assert_fail(dbg_module,strlen(dbg_module),__PRETTY_FUNCTION__, strlen(__PRETTY_FUNCTION__),__FILE__,__LINE__,dbg_str1(expr))) #define DEBUG_MODULE_GLOBAL "global" #ifdef DEBUG_MALLOC #undef g_new #undef g_new0 #define g_new(type, size) (type *)debug_malloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,sizeof(type)*(size)) #define g_new0(type, size) (type *)debug_malloc0(__FILE__,__LINE__,__PRETTY_FUNCTION__,sizeof(type)*(size)) #define g_malloc(size) debug_malloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,(size)) #define g_malloc0(size) debug_malloc0(__FILE__,__LINE__,__PRETTY_FUNCTION__,(size)) #define g_realloc(ptr,size) debug_realloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr,(size)) #define g_free(ptr) debug_free(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr) #define g_strdup(ptr) debug_strdup(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr) #define g_strdup_printf(fmt...) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,g_strdup_printf(fmt)) #define graphics_icon_path(x) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,graphics_icon_path(x)) #define dbg_guard(x) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,x) #define g_free_func debug_free_func #else #define g_free_func g_free #define dbg_guard(x) x #endif /* prototypes */ struct attr; struct debug; void debug_init(const char *program_name); void debug_level_set(const char *name, int level); struct debug *debug_new(struct attr *parent, struct attr **attrs); int debug_level_get(const char *name); void debug_vprintf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap); void debug_printf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, ...) #ifdef __GNUC__ __attribute__ ((format (printf, 7, 8))) #endif ; void debug_assert_fail(const char *module, const int mlen, const char *function, const int flen, const char *file, int line, const char *expr); void debug_destroy(void); void debug_set_logfile(const char *path); void debug_dump_mallocs(void); void *debug_malloc(const char *where, int line, const char *func, int size); void *debug_malloc0(const char *where, int line, const char *func, int size); char *debug_strdup(const char *where, int line, const char *func, const char *ptr); char *debug_guard(const char *where, int line, const char *func, char *str); void debug_free(const char *where, int line, const char *func, void *ptr); void debug_free_func(void *ptr); void debug_finished(void); void *debug_realloc(const char *where, int line, const char *func, void *ptr, int size); void debug_set_global_level(int level, int override_old_value); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/destination.h000066400000000000000000000016471221777731700210230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DESTINATION_H #define NAVIT_DESTINATION_H /* prototypes */ struct navit; int destination_address(struct navit *nav); /* end of prototypes */ #endif navit-0.5.0~svn5643+dfsg.1/navit/draw_info.h000066400000000000000000000016071221777731700204460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DRAW_INFO_H #define NAVIT_DRAW_INFO_H struct draw_info { struct container *co; int display; int limit; }; #endif navit-0.5.0~svn5643+dfsg.1/navit/endianess.h000066400000000000000000000101071221777731700204420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __ENDIANESS_HANDLER__ /* The following is based on xorg/xserver/GL/glx/glxbyteorder.h * which is (c) IBM Corp. 2006,2007 and originally licensed under the following * BSD-license. All modifications in navit are licensed under the GNU GPL as * described in file "COPYRIGHT". * * Portions also from GNU C Library include/bits/byteswap.h Also licsend * under the GPL. * * -------------------------- * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sub license, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDERS, THE AUTHORS, AND/OR THEIR SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #if HAVE_BYTESWAP_H /* machine dependent versions of byte swapping functions. GNU extension.*/ #include #if HAVE_ENDIAN_H #include #endif #elif defined(USE_SYS_ENDIAN_H) #include #if defined(_BYTE_ORDER) && !defined(__BYTE_ORDER) #define __BYTE_ORDER _BYTE_ORDER #define __LITTLE_ENDIAN _LITTLE_ENDIAN #define __BIG_ENDIAN _BIG_ENDIAN #endif #elif defined(__APPLE__) #include #define __bswap_16 OSSwapInt16 #define __bswap_32 OSSwapInt32 #define __bswap_64 OSSwapInt64 #ifndef __BYTE_ORDER #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #if defined(__LITTLE_ENDIAN__) #define __BYTE_ORDER __LITTLE_ENDIAN #elif defined(__BIG_ENDIAN__) #define __BYTE_ORDER __BIG_ENDIAN #else #error "No endianness defined for Mac OS!" #endif #endif #elif defined(_WIN32) || defined(__CEGCC__) #define __BIG_ENDIAN 4321 #define __LITTLE_ENDIAN 1234 #define __BYTE_ORDER __LITTLE_ENDIAN #else #define __bswap_16(__bsx) ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)) #define __bswap_32(__bsx) ((((__bsx) & 0xff000000) >> 24) | \ (((__bsx) & 0x00ff0000) >> 8) |\ (((__bsx) & 0x0000ff00) << 8) | \ (((__bsx) & 0x000000ff) << 24)) #endif #if __BYTE_ORDER == __BIG_ENDIAN #define le16_to_cpu(x) __bswap_16 (x) #define le32_to_cpu(x) __bswap_32 (x) #define le64_to_cpu(x) __bswap_64 (x) #define cpu_to_le16(x) __bswap_16 (x) #define cpu_to_le32(x) __bswap_32 (x) #define cpu_to_le64(x) __bswap_64 (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define le16_to_cpu(x) (x) #define le32_to_cpu(x) (x) #define cpu_to_le16(x) (x) #define cpu_to_le32(x) (x) #else #error "Unknown endianess" #endif #define __ENDIANESS_HANDLER__ #endif navit-0.5.0~svn5643+dfsg.1/navit/event.c000066400000000000000000000052741221777731700176160ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "event.h" #include "plugin.h" #include "debug.h" static struct event_methods event_methods; static const char *e_requestor; static const char *e_system; static int has_quit; void event_main_loop_run(void) { if (! event_methods.main_loop_run) { dbg(0,"no event system set\n"); return; } event_methods.main_loop_run(); } void event_main_loop_quit(void) { if (event_methods.main_loop_quit) event_methods.main_loop_quit(); has_quit=1; } int event_main_loop_has_quit(void) { return has_quit; } struct event_watch * event_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) { return event_methods.add_watch(fd, cond, cb); } void event_remove_watch(struct event_watch *ev) { event_methods.remove_watch(ev); } struct event_timeout * event_add_timeout(int timeout, int multi, struct callback *cb) { return event_methods.add_timeout(timeout, multi, cb); } void event_remove_timeout(struct event_timeout *ev) { event_methods.remove_timeout(ev); } struct event_idle * event_add_idle(int priority, struct callback *cb) { return event_methods.add_idle(priority,cb); } void event_remove_idle(struct event_idle *ev) { event_methods.remove_idle(ev); } void event_call_callback(struct callback_list *cb) { event_methods.call_callback(cb); } char const * event_system(void) { return e_system; } int event_request_system(const char *system, const char *requestor) { void (*event_type_new)(struct event_methods *meth); if (e_system) { if (strcmp(e_system, system)) { dbg(0,"system '%s' already requested by '%s', can't set to '%s' as requested from '%s'\n", e_system, e_requestor, system, requestor); return 0; } return 1; } event_type_new=plugin_get_event_type(system); if (! event_type_new) { dbg(0,"unsupported event system '%s' requested from '%s'\n", system, requestor); return 0; } event_type_new(&event_methods); e_system=system; e_requestor=requestor; return 1; } navit-0.5.0~svn5643+dfsg.1/navit/event.h000066400000000000000000000045441221777731700176220ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { #endif struct event_idle; struct event_timeout; struct event_watch; struct callback; struct callback_list; struct file; enum event_watch_cond { event_watch_cond_read=1, event_watch_cond_write, event_watch_cond_except, }; struct event_methods { void (*main_loop_run)(void); void (*main_loop_quit)(void); struct event_watch *(*add_watch)(void *fd, enum event_watch_cond cond, struct callback *cb); void (*remove_watch)(struct event_watch *ev); struct event_timeout *(*add_timeout)(int timeout, int multi, struct callback *cb); void (*remove_timeout)(struct event_timeout *ev); struct event_idle *(*add_idle)(int priority, struct callback *cb); void (*remove_idle)(struct event_idle *ev); void (*call_callback)(struct callback_list *cb); }; /* prototypes */ enum event_watch_cond; struct callback; struct callback_list; struct event_idle; struct event_timeout; struct event_watch; void event_main_loop_run(void); void event_main_loop_quit(void); int event_main_loop_has_quit(void); struct event_watch *event_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb); void event_remove_watch(struct event_watch *ev); struct event_timeout *event_add_timeout(int timeout, int multi, struct callback *cb); void event_remove_timeout(struct event_timeout *ev); struct event_idle *event_add_idle(int priority, struct callback *cb); void event_remove_idle(struct event_idle *ev); void event_call_callback(struct callback_list *cb); char const *event_system(void); int event_request_system(const char *system, const char *requestor); /* end of prototypes */ #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/event_glib.c000066400000000000000000000102401221777731700206000ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "event.h" #include "event_glib.h" #include "debug.h" #include "callback.h" #include "plugin.h" static GMainLoop *loop; static void event_glib_main_loop_run(void) { loop = g_main_loop_new (NULL, TRUE); if (g_main_loop_is_running (loop)) { g_main_loop_run (loop); } } static void event_glib_main_loop_quit(void) { if (loop) { g_main_loop_quit(loop); g_main_loop_unref(loop); } } struct event_watch { GIOChannel *iochan; guint source; }; static gboolean event_glib_call_watch(GIOChannel * iochan, GIOCondition condition, gpointer t) { struct callback *cb=t; callback_call_0(cb); return TRUE; } static struct event_watch * event_glib_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) { struct event_watch *ret=g_new0(struct event_watch, 1); int flags=0; ret->iochan = g_io_channel_unix_new(GPOINTER_TO_INT(fd)); switch (cond) { case event_watch_cond_read: flags=G_IO_IN; break; case event_watch_cond_write: flags=G_IO_OUT; break; case event_watch_cond_except: flags=G_IO_ERR|G_IO_HUP; break; } ret->source = g_io_add_watch(ret->iochan, flags, event_glib_call_watch, (gpointer)cb); return ret; } static void event_glib_remove_watch(struct event_watch *ev) { if (! ev) return; g_source_remove(ev->source); g_io_channel_unref(ev->iochan); g_free(ev); } struct event_timeout { guint source; struct callback *cb; }; static gboolean event_glib_call_timeout_single(struct event_timeout *ev) { callback_call_0(ev->cb); g_free(ev); return FALSE; } static gboolean event_glib_call_timeout_multi(struct event_timeout *ev) { callback_call_0(ev->cb); return TRUE; } static struct event_timeout * event_glib_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout *ret=g_new0(struct event_timeout, 1); ret->cb=cb; ret->source = g_timeout_add(timeout, multi ? (GSourceFunc)event_glib_call_timeout_multi : (GSourceFunc)event_glib_call_timeout_single, (gpointer)ret); return ret; } static void event_glib_remove_timeout(struct event_timeout *ev) { if (! ev) return; g_source_remove(ev->source); g_free(ev); } struct event_idle { guint source; struct callback *cb; }; static gboolean event_glib_call_idle(struct event_idle *ev) { callback_call_0(ev->cb); return TRUE; } static struct event_idle * event_glib_add_idle(int priority, struct callback *cb) { struct event_idle *ret=g_new0(struct event_idle, 1); ret->cb=cb; ret->source = g_idle_add_full(priority+100, (GSourceFunc)event_glib_call_idle, (gpointer)ret, NULL); return ret; } static void event_glib_remove_idle(struct event_idle *ev) { if (! ev) return; g_source_remove(ev->source); g_free(ev); } static void event_glib_call_callback(struct callback_list *cb) { /* Idea for implementation: Create a pipe then use add_watch add callback to a queue from here write to the pipe to wakeup the pool then from the gui thread process the callback queue */ } static struct event_methods event_glib_methods = { event_glib_main_loop_run, event_glib_main_loop_quit, event_glib_add_watch, event_glib_remove_watch, event_glib_add_timeout, event_glib_remove_timeout, event_glib_add_idle, event_glib_remove_idle, event_glib_call_callback, }; struct event_priv { int data; }; static struct event_priv* event_glib_new(struct event_methods *meth) { *meth=event_glib_methods; return (struct event_priv *)event_glib_new; } void event_glib_init(void) { plugin_register_event_type("glib", event_glib_new); } navit-0.5.0~svn5643+dfsg.1/navit/event_glib.h000066400000000000000000000001051221777731700206040ustar00rootroot00000000000000/* prototypes */ void event_glib_init(void); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/000077500000000000000000000000001221777731700173565ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/CMakeLists.txt000066400000000000000000000000431221777731700221130ustar00rootroot00000000000000supportlib_add_library(fib fib.c) navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/Makefile.am000066400000000000000000000002671221777731700214170ustar00rootroot00000000000000noinst_LTLIBRARIES = libfib.la libfib_la_SOURCES = fib.c fib.h fibpriv.h EXTRA_DIST=README configure.in fh_extractmin.3 fh_makeheap.3 fh_makekeyheap.3 fibtest.c fibtest2.c tt.c use.c navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/README000066400000000000000000000024321221777731700202370ustar00rootroot00000000000000Version 1.1 now supports increasing the key using the fh_replace* functions. Previously it would simply return NULL when you tried to increase the key. It also improves performance slightly by only calling checkcons when we are about to use it, at extract, instead of calling it on every insert. I have now fixed fh_union and it properly updates the minimum. Thanks to Ryan Earl for pointing out that in fh_consolidate, it is VERY time consuming to constantly malloc/free an array of pointers. The array is small enough that simply reallocating when more pointers are needed is ok. Thanks to Thomas Eschbach and Wolfgang Guenther who have pointed out bugs with my code. Wolfgang Guenther provided a fix which put in on the correct track for where the bug was. They have also provided a few test programs that exhibited other bugs which I have now integrated into my source so that you can easily regress test the library. I have reciently completed a review of the code. I have made a number of improvements with a few minor interface changes. There is another improvement to the rh_replace* family of functions to help eliminate redundant code. I'm still planning on writing a type safe memory allocator for use with the code instead of using malloc to hopefully improve performance slightly. navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/configure000077500000000000000000001014221221777731700212650ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=fib.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:529: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:609: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:622: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in limits.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:716: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:726: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking for inline""... $ac_c" 1>&6 echo "configure:754: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* done fi echo "$ac_t""$ac_cv_c_inline" 1>&6 case "$ac_cv_c_inline" in inline | yes) ;; no) cat >> confdefs.h <<\EOF #define inline EOF ;; *) cat >> confdefs.h < confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@CPP@%$CPP%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/configure.in000066400000000000000000000005271221777731700216730ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT(fib.c) dnl Checks for programs. dnl Checks for libraries. dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(limits.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE dnl Checks for library functions. AC_OUTPUT(Makefile) navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fh_extractmin.3000066400000000000000000000032731221777731700223020ustar00rootroot00000000000000.TH FH_EXTRACTMIN 3 "29 Mar 2000" "libfib" .SH NAME fh_extractmin \- extract minimum element from a Fibonacci Heap .SH SYNOPSIS #include .PP void * .PD 0 .HP 8 .BR fh_extractmin "(struct fibheap *heap)" .PD .PP void * .PD 0 .HP 8 .BR fh_min "(struct fibheap *heap)" .PD .PP void * .PD 0 .HP 8 .BR fh_replacedata "(struct fibheap *heap, struct fibheap_el *elem, void *data)" .PD .PP void * .PD 0 .HP 8 .BR fh_delete "(struct fibheap *heap, struct fibheap_el *elem)" .PD .PP void .PD 0 .HP 8 .BR fh_deleteheap "(struct fibheap *heap)" .PD .PP struct fibheap * .PD 0 .HP 8 .BR fh_union "(struct fibheap *heapa, struct fibheap *heapb)" .PD .SH DESCRIPTION These functions are shared between both key heaps and normal heaps. .PP Once a .B elem pointer has been passed to .BR fh_delete (3) that .B elem pointer may be reused to store another datum. You should make sure that you destroy any copies of the pointer. .SH RETURN VALUES The .B fh_extractmin function returns the value of .B data that is the minimum element and removes it from the heap. .PP The .B fh_min function returns the current minimum element but does .I not remove it from the heap. .PP The .B fh_replacedata replaces the data in .B elem and returns the old data. .PP The .B fh_delete function removes .B elem from the heap, and returns the .B data that was stored in the element. .PP The .B fh_deleteheap complete destroys the heap. It does not free any user supplied .B data elements stored in the heap. .PP The .B fh_union function returns the union of the two heaps .B heapa and .BR heapb . .SH SEE ALSO .BR fh_makeheap (3), .BR fh_makekeyheap (3) .SH AUTHORS This library and man page was writen by John-Mark Gurney . .SH BUGS navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fh_makeheap.3000066400000000000000000000005041221777731700216710ustar00rootroot00000000000000.TH FH_MAKEHEAP 3 "29 Mar 2000" "libfib" .SH NAME fh_makeheap \- make a Fibonacci Heap .SH SYNOPSIS .nf #include .PP struct fibheap * .BR fh_makeheap (void) .fi .SH DESCRIPTION .SH RETURN VALUES .SH FILES .SH SEE ALSO .SH AUTHORS This library and man page was writen by John-Mark Gurney . .SH BUGS navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fh_makekeyheap.3000066400000000000000000000037001221777731700224030ustar00rootroot00000000000000.TH FH_MAKEKEYHEAP 3 "29 Mar 2000" "libfib" .SH NAME fh_makekeyheap \- make a Fibonacci key Heap .SH SYNOPSIS #include .PP struct fibheap * .PD 0 .HP 8 .BR fh_makekeyheap (void) .PD .PP struct fibheap_el * .PD 0 .HP 8 .BR fh_insertkey "(struct fibheap *heap, int key, void *data)" .PD .PP int .PD 0 .HP 8 .BR fh_minkey "(struct fibheap *heap)" .PD .PP void * .PD 0 .HP 8 .BR fh_replacekey "(struct fibheap *heap, struct fibheap_el *elem, int key)" .PD .PP void * .PD 0 .HP 8 .BR fh_replacekeydata "(struct fibheap *heap, struct fibheap_el *elem, int key, void *data)" .PD .SH DESCRIPTION The .B fh_makekeyheap function makes a Fibonacci heap which does ordering based on an integer key that is given in addition to the data. This menthod is useful so that you can eliminate the need to call a comparision function to order the data in the heap. .PP The pointer to the structure .B fibheap returned by .B fh_makekeyheap is an opaque structure. The the pointer can only be passed to other functions in the .B libfib library. .PP The .B fh_insertkey function inserts the .B data element into the heap with a value of .BR key . The pointer returned can be used in calls to functions like .BR fh_delete (3) to delete the key from the heap before it gets extracted via .BR fh_extractmin (3). .SH RETURN VALUES The .B fh_makekeyheap function returns a pointer to a heap structure used to insert and extract data elements. .PP The .B fh_insertkey functions returns a pointer to a heap element structure which can be used to manimulate that data element in the heap. .PP The .B fh_minkey function returns the integer key of the data at the top of the heap. If you would like to view the data, see .BR fh_min (3). .SH SEE ALSO .BR fh_extractmin (3) .SH AUTHORS This library and man page was writen by John-Mark Gurney . .SH BUGS A key heap does not provide a way for handling key collitions and deffering decission to a user provided function to resolve colissions. navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fib.c000066400000000000000000000303231221777731700202630ustar00rootroot00000000000000/*- * Copyright 1997-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: fib.c,v 1.2 2007-07-04 22:44:39 martin-s Exp $ * */ #include #include #include #include #define swap(type, a, b) \ do { \ type c; \ c = a; \ a = b; \ b = c; \ } while (0) \ #define INT_BITS (sizeof(int) * 8) static int ceillog2(unsigned int a) { int oa; int i; int b; oa = a; b = INT_BITS / 2; i = 0; while (b) { i = (i << 1); if (a >= (1 << b)) { a /= (1 << b); i = i | 1; } else a &= (1 << b) - 1; b /= 2; } if ((1 << i) == oa) return i; else return i + 1; } /* * Private Heap Functions */ static void fh_deleteel(struct fibheap *h, struct fibheap_el *x) { void *data; int key; data = x->fhe_data; key = x->fhe_key; if (!h->fh_keys) fh_replacedata(h, x, h->fh_neginf); else fh_replacekey(h, x, INT_MIN); if (fh_extractminel(h) != x) { /* * XXX - This should never happen as fh_replace should set it * to min. */ abort(); } x->fhe_data = data; x->fhe_key = key; } static void fh_initheap(struct fibheap *new) { new->fh_cmp_fnct = NULL; new->fh_neginf = NULL; new->fh_n = 0; new->fh_Dl = -1; new->fh_cons = NULL; new->fh_min = NULL; new->fh_root = NULL; new->fh_keys = 0; #ifdef FH_STATS new->fh_maxn = 0; new->fh_ninserts = 0; new->fh_nextracts = 0; #endif } static void fh_destroyheap(struct fibheap *h) { h->fh_cmp_fnct = NULL; h->fh_neginf = NULL; if (h->fh_cons != NULL) free(h->fh_cons); h->fh_cons = NULL; free(h); } /* * Public Heap Functions */ struct fibheap * fh_makekeyheap() { struct fibheap *n; if ((n = malloc(sizeof *n)) == NULL) return NULL; fh_initheap(n); n->fh_keys = 1; return n; } struct fibheap * fh_makeheap() { struct fibheap *n; if ((n = malloc(sizeof *n)) == NULL) return NULL; fh_initheap(n); return n; } voidcmp fh_setcmp(struct fibheap *h, voidcmp fnct) { voidcmp oldfnct; oldfnct = h->fh_cmp_fnct; h->fh_cmp_fnct = fnct; return oldfnct; } void * fh_setneginf(struct fibheap *h, void *data) { void *old; old = h->fh_neginf; h->fh_neginf = data; return old; } struct fibheap * fh_union(struct fibheap *ha, struct fibheap *hb) { struct fibheap_el *x; if (ha->fh_root == NULL || hb->fh_root == NULL) { /* either one or both are empty */ if (ha->fh_root == NULL) { fh_destroyheap(ha); return hb; } else { fh_destroyheap(hb); return ha; } } ha->fh_root->fhe_left->fhe_right = hb->fh_root; hb->fh_root->fhe_left->fhe_right = ha->fh_root; x = ha->fh_root->fhe_left; ha->fh_root->fhe_left = hb->fh_root->fhe_left; hb->fh_root->fhe_left = x; ha->fh_n += hb->fh_n; /* * we probably should also keep stats on number of unions */ /* set fh_min if necessary */ if (fh_compare(ha, hb->fh_min, ha->fh_min) < 0) ha->fh_min = hb->fh_min; fh_destroyheap(hb); return ha; } void fh_deleteheap(struct fibheap *h) { /* * We could do this even faster by walking each binomial tree, but * this is simpler to code. */ while (h->fh_min != NULL) fhe_destroy(fh_extractminel(h)); fh_destroyheap(h); } /* * Public Key Heap Functions */ struct fibheap_el * fh_insertkey(struct fibheap *h, int key, void *data) { struct fibheap_el *x; if ((x = fhe_newelem()) == NULL) return NULL; /* just insert on root list, and make sure it's not the new min */ x->fhe_data = data; x->fhe_key = key; fh_insertel(h, x); return x; } int fh_minkey(struct fibheap *h) { if (h->fh_min == NULL) return INT_MIN; return h->fh_min->fhe_key; } int fh_replacekey(struct fibheap *h, struct fibheap_el *x, int key) { int ret; ret = x->fhe_key; (void)fh_replacekeydata(h, x, key, x->fhe_data); return ret; } #include void * fh_replacekeydata(struct fibheap *h, struct fibheap_el *x, int key, void *data) { void *odata; int okey; struct fibheap_el *y; int r; odata = x->fhe_data; okey = x->fhe_key; /* * we can increase a key by deleting and reinserting, that * requires O(lgn) time. */ if ((r = fh_comparedata(h, key, data, x)) > 0) { printf("fh_comparedata r=%d key=%d data=%p\n", r, key, data); /* XXX - bad code! */ abort(); fh_deleteel(h, x); x->fhe_data = data; x->fhe_key = key; fh_insertel(h, x); return odata; } x->fhe_data = data; x->fhe_key = key; /* because they are equal, we don't have to do anything */ if (r == 0) return odata; y = x->fhe_p; if (h->fh_keys && okey == key) return odata; if (y != NULL && fh_compare(h, x, y) <= 0) { fh_cut(h, x, y); fh_cascading_cut(h, y); } /* * the = is so that the call from fh_delete will delete the proper * element. */ if (fh_compare(h, x, h->fh_min) <= 0) h->fh_min = x; return odata; } /* * Public void * Heap Functions */ /* * this will return these values: * NULL failed for some reason * ptr token to use for manipulation of data */ struct fibheap_el * fh_insert(struct fibheap *h, void *data) { struct fibheap_el *x; if ((x = fhe_newelem()) == NULL) return NULL; /* just insert on root list, and make sure it's not the new min */ x->fhe_data = data; fh_insertel(h, x); return x; } void * fh_min(struct fibheap *h) { if (h->fh_min == NULL) return NULL; return h->fh_min->fhe_data; } void * fh_extractmin(struct fibheap *h) { struct fibheap_el *z; void *ret; ret = NULL; if (h->fh_min != NULL) { z = fh_extractminel(h); ret = z->fhe_data; #ifndef NO_FREE fhe_destroy(z); #endif } return ret; } void * fh_replacedata(struct fibheap *h, struct fibheap_el *x, void *data) { return fh_replacekeydata(h, x, x->fhe_key, data); } void * fh_delete(struct fibheap *h, struct fibheap_el *x) { void *k; k = x->fhe_data; if (!h->fh_keys) fh_replacedata(h, x, h->fh_neginf); else fh_replacekey(h, x, INT_MIN); fh_extractmin(h); return k; } /* * Statistics Functions */ #ifdef FH_STATS int fh_maxn(struct fibheap *h) { return h->fh_maxn; } int fh_ninserts(struct fibheap *h) { return h->fh_ninserts; } int fh_nextracts(struct fibheap *h) { return h->fh_nextracts; } #endif /* * begin of private element fuctions */ static struct fibheap_el * fh_extractminel(struct fibheap *h) { struct fibheap_el *ret; struct fibheap_el *x, *y, *orig; ret = h->fh_min; orig = NULL; /* put all the children on the root list */ /* for true consistancy, we should use fhe_remove */ for(x = ret->fhe_child; x != orig && x != NULL;) { if (orig == NULL) orig = x; y = x->fhe_right; x->fhe_p = NULL; fh_insertrootlist(h, x); x = y; } /* remove minimum from root list */ fh_removerootlist(h, ret); h->fh_n--; /* if we aren't empty, consolidate the heap */ if (h->fh_n == 0) h->fh_min = NULL; else { h->fh_min = ret->fhe_right; fh_consolidate(h); } #ifdef FH_STATS h->fh_nextracts++; #endif return ret; } static void fh_insertrootlist(struct fibheap *h, struct fibheap_el *x) { if (h->fh_root == NULL) { h->fh_root = x; x->fhe_left = x; x->fhe_right = x; return; } fhe_insertafter(h->fh_root, x); } static void fh_removerootlist(struct fibheap *h, struct fibheap_el *x) { if (x->fhe_left == x) h->fh_root = NULL; else h->fh_root = fhe_remove(x); } static void fh_consolidate(struct fibheap *h) { struct fibheap_el **a; struct fibheap_el *w; struct fibheap_el *y; struct fibheap_el *x; int i; int d; int D; fh_checkcons(h); /* assign a the value of h->fh_cons so I don't have to rewrite code */ D = h->fh_Dl + 1; a = h->fh_cons; for (i = 0; i < D; i++) a[i] = NULL; while ((w = h->fh_root) != NULL) { x = w; fh_removerootlist(h, w); d = x->fhe_degree; /* XXX - assert that d < D */ while(a[d] != NULL) { y = a[d]; if (fh_compare(h, x, y) > 0) swap(struct fibheap_el *, x, y); fh_heaplink(h, y, x); a[d] = NULL; d++; } a[d] = x; } h->fh_min = NULL; for (i = 0; i < D; i++) if (a[i] != NULL) { fh_insertrootlist(h, a[i]); if (h->fh_min == NULL || fh_compare(h, a[i], h->fh_min) < 0) h->fh_min = a[i]; } } static void fh_heaplink(struct fibheap *h, struct fibheap_el *y, struct fibheap_el *x) { /* make y a child of x */ if (x->fhe_child == NULL) x->fhe_child = y; else fhe_insertbefore(x->fhe_child, y); y->fhe_p = x; x->fhe_degree++; y->fhe_mark = 0; } static void fh_cut(struct fibheap *h, struct fibheap_el *x, struct fibheap_el *y) { fhe_remove(x); y->fhe_degree--; fh_insertrootlist(h, x); x->fhe_p = NULL; x->fhe_mark = 0; } static void fh_cascading_cut(struct fibheap *h, struct fibheap_el *y) { struct fibheap_el *z; while ((z = y->fhe_p) != NULL) { if (y->fhe_mark == 0) { y->fhe_mark = 1; return; } else { fh_cut(h, y, z); y = z; } } } /* * begining of handling elements of fibheap */ static struct fibheap_el * fhe_newelem() { struct fibheap_el *e; if ((e = malloc(sizeof *e)) == NULL) return NULL; fhe_initelem(e); return e; } static void fhe_initelem(struct fibheap_el *e) { e->fhe_degree = 0; e->fhe_mark = 0; e->fhe_p = NULL; e->fhe_child = NULL; e->fhe_left = e; e->fhe_right = e; e->fhe_data = NULL; } static void fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b) { if (a == a->fhe_right) { a->fhe_right = b; a->fhe_left = b; b->fhe_right = a; b->fhe_left = a; } else { b->fhe_right = a->fhe_right; a->fhe_right->fhe_left = b; a->fhe_right = b; b->fhe_left = a; } } static void fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b) { fhe_insertafter(a->fhe_left, b); } static struct fibheap_el * fhe_remove(struct fibheap_el *x) { struct fibheap_el *ret; if (x == x->fhe_left) ret = NULL; else ret = x->fhe_left; /* fix the parent pointer */ if (x->fhe_p != NULL && x->fhe_p->fhe_child == x) x->fhe_p->fhe_child = ret; x->fhe_right->fhe_left = x->fhe_left; x->fhe_left->fhe_right = x->fhe_right; /* clear out hanging pointers */ x->fhe_p = NULL; x->fhe_left = x; x->fhe_right = x; return ret; } static void fh_checkcons(struct fibheap *h) { int oDl; /* make sure we have enough memory allocated to "reorganize" */ if (h->fh_Dl == -1 || h->fh_n > (1 << h->fh_Dl)) { oDl = h->fh_Dl; if ((h->fh_Dl = ceillog2(h->fh_n) + 1) < 8) h->fh_Dl = 8; if (oDl != h->fh_Dl) h->fh_cons = (struct fibheap_el **)realloc(h->fh_cons, sizeof *h->fh_cons * (h->fh_Dl + 1)); if (h->fh_cons == NULL) abort(); } } static int fh_compare(struct fibheap *h, struct fibheap_el *a, struct fibheap_el *b) { if (h->fh_keys) { if (a->fhe_key < b->fhe_key) return -1; if (a->fhe_key == b->fhe_key) return 0; return 1; } else return h->fh_cmp_fnct(a->fhe_data, b->fhe_data); } static int fh_comparedata(struct fibheap *h, int key, void *data, struct fibheap_el *b) { struct fibheap_el a; a.fhe_key = key; a.fhe_data = data; return fh_compare(h, &a, b); } static void fh_insertel(struct fibheap *h, struct fibheap_el *x) { fh_insertrootlist(h, x); if (h->fh_min == NULL || (h->fh_keys ? x->fhe_key < h->fh_min->fhe_key : h->fh_cmp_fnct(x->fhe_data, h->fh_min->fhe_data) < 0)) h->fh_min = x; h->fh_n++; #ifdef FH_STATS if (h->fh_n > h->fh_maxn) h->fh_maxn = h->fh_n; h->fh_ninserts++; #endif } navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fib.h000066400000000000000000000047371221777731700203020ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: fib.h,v 1.1 2005-12-02 10:41:56 martin-s Exp $ * */ #ifndef _FIB_H_ #define _FIB_H_ struct fibheap; struct fibheap_el; typedef int (*voidcmp)(void *, void *); /* functions for key heaps */ struct fibheap *fh_makekeyheap(void); struct fibheap_el *fh_insertkey(struct fibheap *, int, void *); int fh_minkey(struct fibheap *); int fh_replacekey(struct fibheap *, struct fibheap_el *, int); void *fh_replacekeydata(struct fibheap *, struct fibheap_el *, int, void *); /* functions for void * heaps */ struct fibheap *fh_makeheap(void); voidcmp fh_setcmp(struct fibheap *, voidcmp); void *fh_setneginf(struct fibheap *, void *); struct fibheap_el *fh_insert(struct fibheap *, void *); /* shared functions */ void *fh_extractmin(struct fibheap *); void *fh_min(struct fibheap *); void *fh_replacedata(struct fibheap *, struct fibheap_el *, void *); void *fh_delete(struct fibheap *, struct fibheap_el *); void fh_deleteheap(struct fibheap *); struct fibheap *fh_union(struct fibheap *, struct fibheap *); #ifdef FH_STATS int fh_maxn(struct fibheap *); int fh_ninserts(struct fibheap *); int fh_nextracts(struct fibheap *); #endif #endif /* _FIB_H_ */ navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fibpriv.h000066400000000000000000000065161221777731700212000ustar00rootroot00000000000000/*- * Copyright 1997, 1999-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: fibpriv.h,v 1.1 2005-12-02 10:41:56 martin-s Exp $ * */ #ifndef _FIBPRIV_H_ #define _FIBPRIV_H_ struct fibheap_el; /* * global heap operations */ struct fibheap { int (*fh_cmp_fnct)(void *, void *); int fh_n; int fh_Dl; struct fibheap_el **fh_cons; struct fibheap_el *fh_min; struct fibheap_el *fh_root; void *fh_neginf; int fh_keys : 1; #ifdef FH_STATS int fh_maxn; int fh_ninserts; int fh_nextracts; #endif }; static void fh_initheap(struct fibheap *); static void fh_insertrootlist(struct fibheap *, struct fibheap_el *); static void fh_removerootlist(struct fibheap *, struct fibheap_el *); static void fh_consolidate(struct fibheap *); static void fh_heaplink(struct fibheap *h, struct fibheap_el *y, struct fibheap_el *x); static void fh_cut(struct fibheap *, struct fibheap_el *, struct fibheap_el *); static void fh_cascading_cut(struct fibheap *, struct fibheap_el *); static struct fibheap_el *fh_extractminel(struct fibheap *); static void fh_checkcons(struct fibheap *h); static void fh_destroyheap(struct fibheap *h); static int fh_compare(struct fibheap *h, struct fibheap_el *a, struct fibheap_el *b); static int fh_comparedata(struct fibheap *h, int key, void *data, struct fibheap_el *b); static void fh_insertel(struct fibheap *h, struct fibheap_el *x); static void fh_deleteel(struct fibheap *h, struct fibheap_el *x); /* * specific node operations */ struct fibheap_el { int fhe_degree; int fhe_mark; struct fibheap_el *fhe_p; struct fibheap_el *fhe_child; struct fibheap_el *fhe_left; struct fibheap_el *fhe_right; int fhe_key; void *fhe_data; }; static struct fibheap_el *fhe_newelem(void); static void fhe_initelem(struct fibheap_el *); static void fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b); static void fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b); static struct fibheap_el *fhe_remove(struct fibheap_el *a); #define fhe_destroy(x) free((x)) /* * general functions */ static int ceillog2(unsigned int a); #endif /* _FIBPRIV_H_ */ navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fibtest.c000066400000000000000000000065701221777731700211720ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include "fib.h" int main(void) { struct fibheap *a; void *arr[10]; int i; a = fh_makekeyheap(); for (i=1 ; i < 10 ; i++) { arr[i]= fh_insertkey(a,0,(void *)i); printf("adding: 0 %d \n",i); } printf(" \n"); fh_replacekey(a, arr[1],-1); fh_replacekey(a, arr[6],-1); fh_replacekey(a, arr[4],-1); fh_replacekey(a, arr[2],-1); fh_replacekey(a, arr[8],-1); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[7],-33); /* -> node 7 becomes root node, but is still pointed to by node 6 */ fh_replacekey(a, arr[4],-36); fh_replacekey(a, arr[3],-1); fh_replacekey(a, arr[9],-81); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[6],-68); fh_replacekey(a, arr[2],-69); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[1],-52); fh_replacekey(a, arr[3],-2); fh_replacekey(a, arr[4],-120); fh_replacekey(a, arr[5],-48); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-3); fh_replacekey(a, arr[5],-63); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[5],-110); fh_replacekey(a, arr[7],-115); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[5],-188); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-4); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_deleteheap(a); return 0; } navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fibtest.out000066400000000000000000000005311221777731700215460ustar00rootroot00000000000000adding: 0 1 adding: 0 2 adding: 0 3 adding: 0 4 adding: 0 5 adding: 0 6 adding: 0 7 adding: 0 8 adding: 0 9 value(minkey) -1 id: 8 value(minkey) -81 id: 9 value(minkey) -69 id: 2 value(minkey) -120 id: 4 value(minkey) -68 id: 6 value(minkey) -115 id: 7 value(minkey) -188 id: 5 value(minkey) -52 id: 1 value(minkey) -4 id: 3 navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fibtest2.c000066400000000000000000000065231221777731700212520ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include "fib.h" int main(void) { struct fibheap *a; void *arr[10]; int i; a = fh_makekeyheap(); for (i=1 ; i < 10 ; i++) { arr[i]= fh_insertkey(a,0,(void *)i); printf("adding: 0 %d \n",i); } printf(" \n"); fh_replacekey(a, arr[1],-38); fh_replacekey(a, arr[7],-34); printf("wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[2],-55); fh_replacekey(a, arr[5],-56); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[4],-1); fh_replacekey(a, arr[2],-102); fh_replacekey(a, arr[6],-1); fh_replacekey(a, arr[9],-1); fh_replacekey(a, arr[8],-4); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-74); fh_replacekey(a, arr[8],-55); fh_replacekey(a, arr[4],-2); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[4],-3); fh_replacekey(a, arr[6],-2); fh_replacekey(a, arr[7],-99); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[6],-3); fh_replacekey(a, arr[4],-4); fh_replacekey(a, arr[8],-94); fh_replacekey(a, arr[9],-2); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[6],-4); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); /*fh_replacekey(a, arr[9],-3);*/ printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); /*fh_replacekey(a, arr[9],-49);*/ fh_deleteheap(a); return 0; } navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/fibtest2.out000066400000000000000000000005611221777731700216330ustar00rootroot00000000000000adding: 0 1 adding: 0 2 adding: 0 3 adding: 0 4 adding: 0 5 adding: 0 6 adding: 0 7 adding: 0 8 adding: 0 9 wert(minkey) -38 Knoten: 1 Wert(minkey) -56 Knoten: 5 Wert(minkey) -102 Knoten: 2 Wert(minkey) -74 Knoten: 3 Wert(minkey) -99 Knoten: 7 Wert(minkey) -94 Knoten: 8 Wert(minkey) -4 Knoten: 6 Wert(minkey) -4 Knoten: 4 Wert(minkey) -2 Knoten: 9 navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/tt.c000066400000000000000000000054651221777731700201630ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include "fib.h" int main(void) { struct fibheap *a; void *arr[10]; int i; a = fh_makekeyheap(); for (i=1 ; i < 8 ; i++) { arr[i]= fh_insertkey(a,0,(void *)i); printf("adding: 0 %d \n",i); } printf(" \n"); fh_replacekey(a, arr[1],-2); fh_replacekey(a, arr[4],-3); fh_replacekey(a, arr[7],-5); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-2); fh_replacekey(a, arr[6],-1); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[1],-9); fh_replacekey(a, arr[5],-3); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[2],-4); fh_replacekey(a, arr[5],-5); fh_replacekey(a, arr[6],-3); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[2],-6); fh_replacekey(a, arr[6],-6); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_deleteheap(a); return 0; } navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/tt.out000066400000000000000000000004321221777731700205350ustar00rootroot00000000000000adding: 0 1 adding: 0 2 adding: 0 3 adding: 0 4 adding: 0 5 adding: 0 6 adding: 0 7 Wert(minkey) -5 Knoten: 7 Wert(minkey) -3 Knoten: 4 Wert(minkey) -9 Knoten: 1 Wert(minkey) -5 Knoten: 5 Wert(minkey) -6 Knoten: 6 Wert(minkey) -6 Knoten: 2 Wert(minkey) -2 Knoten: 3 navit-0.5.0~svn5643+dfsg.1/navit/fib-1.1/use.c000066400000000000000000000072071221777731700203240ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include "fib.h" #define TESTCASE 1 #define COUNT 100000 #define DIF 1000 #define MAXEXT 10 #define VERBOSE 1 int cmp(void *, void *); int cmp(void *x, void *y) { int a, b; a = (int)x; b = (int)y; if (a < b) return -1; if (a == b) return 0; return 1; } int main(void) { #if !TESTCASE struct fibheap_el *w; #else int e, j, k; #endif struct fibheap *a; int i, x; a = fh_makeheap(); fh_setcmp(a, cmp); srandom(time(NULL)); #if TESTCASE #if VERBOSE printf("inserting: "); #endif e = 0; for (i = 0; i < COUNT; i++) { #if VERBOSE if (i) printf(", "); #endif fh_insert(a, (void *)(x = random()/10)); #if VERBOSE printf("%d", x); #endif if (i - e > DIF) { k = random() % MAXEXT; for (j = 0; j < k; j++, e++) printf("throwing: %d\n", (int)fh_extractmin(a)); } } #if VERBOSE printf("\nremaining: %d\n", COUNT - e); printf("extracting: "); #endif for (i = 0; i < COUNT - e; i++) { #if VERBOSE if (i) printf(", "); printf("%d", (int)fh_extractmin(a)); #else fh_extractmin(a); #endif } #if VERBOSE printf("\n"); #endif if ((int)fh_extractmin(a) == 0) printf("heap empty!\n"); else { printf("heap not empty! ERROR!\n"); exit(1); } #else w = fh_insert(a, (void *)6); printf("adding: %d\n", 6); fh_insert(a, (void *)9); printf("adding: %d\n", 9); fh_insert(a, (void *)1); printf("adding: %d\n", 1); for(i = 0; i < 5; i++) { x = random()/10000; printf("adding: %d\n", x); fh_insert(a, (void *)x); } fh_insert(a, (void *)4); printf("adding: %d\n", 4); fh_insert(a, (void *)8); printf("adding: %d\n", 8); printf("first: %d\n", (int)fh_extractmin(a)); printf("deleting: %d\n", (int)fh_delete(a, w)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); for(i = 0; i < 5; i++) { x = random()/10000; printf("adding: %d\n", x); fh_insert(a, (void *)x); } printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); #endif fh_deleteheap(a); return 0; } navit-0.5.0~svn5643+dfsg.1/navit/file.c000066400000000000000000000457111221777731700174140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef _MSC_VER #include #else #include #endif /* _MSC_VER */ #include #include #include #include #include #include #include #include #include #include "debug.h" #include "cache.h" #include "file.h" #include "atom.h" #include "item.h" #include "util.h" #include "types.h" #include "zipfile.h" #ifdef HAVE_SOCKET #include #include #endif extern char *version; #ifdef HAVE_LIBCRYPTO #include #include #include #include #include #endif #ifdef HAVE_API_ANDROID #define lseek lseek64 #endif #ifndef O_LARGEFILE #define O_LARGEFILE 0 #endif #ifndef O_BINARY #define O_BINARY 0 #endif #ifdef CACHE_SIZE static GHashTable *file_name_hash; #endif static struct cache *file_cache; #ifdef HAVE_PRAGMA_PACK #pragma pack(push) #pragma pack(1) #endif struct file_cache_id { long long offset; int size; int file_name_id; int method; } ATTRIBUTE_PACKED; #ifdef HAVE_PRAGMA_PACK #pragma pack(pop) #endif #ifdef HAVE_SOCKET static int file_socket_connect(char *host, char *service) { struct addrinfo hints; struct addrinfo *result, *rp; int fd=-1,s; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; s = getaddrinfo(host, service, &hints, &result); if (s != 0) { dbg(0,"getaddrinfo error %s\n",gai_strerror(s)); return -1; } for (rp = result; rp != NULL; rp = rp->ai_next) { fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (fd != -1) { if (connect(fd, rp->ai_addr, rp->ai_addrlen) != -1) break; close(fd); fd=-1; } } freeaddrinfo(result); return fd; } static void file_http_request(struct file *file, char *method, char *host, char *path, char *header, int persistent) { char *request=g_strdup_printf("%s %s HTTP/1.0\r\nUser-Agent: navit %s\r\nHost: %s\r\n%s%s%s\r\n",method,path,version,host,persistent?"Connection: Keep-Alive\r\n":"",header?header:"",header?"\r\n":""); write(file->fd, request, strlen(request)); dbg(1,"%s\n",request); file->requests++; } static int file_request_do(struct file *file, struct attr **options, int connect) { struct attr *attr; char *name; if (!options) return 0; attr=attr_search(options, NULL, attr_url); if (!attr) return 0; name=attr->u.str; if (!name) return 0; g_free(file->name); file->name = g_strdup(name); if (!strncmp(name,"http://",7)) { char *host=g_strdup(name+7); char *port=strchr(host,':'); char *path=strchr(name+7,'/'); char *method="GET"; char *header=NULL; int persistent=0; if ((attr=attr_search(options, NULL, attr_http_method)) && attr->u.str) method=attr->u.str; if ((attr=attr_search(options, NULL, attr_http_header)) && attr->u.str) header=attr->u.str; if ((attr=attr_search(options, NULL, attr_persistent))) persistent=attr->u.num; if (path) host[path-name-7]='\0'; if (port) *port++='\0'; dbg(1,"host=%s path=%s\n",host,path); if (connect) file->fd=file_socket_connect(host,port?port:"80"); file_http_request(file,method,host,path,header,persistent); file->special=1; g_free(host); } return 1; } #endif static unsigned char * file_http_header_end(unsigned char *str, int len) { int i; for (i=0; i+1headers) return NULL; return g_hash_table_lookup(f->headers, header); } struct file * file_create(char *name, struct attr **options) { struct file *file= g_new0(struct file,1); struct attr *attr; int open_flags=O_LARGEFILE|O_BINARY; if (options && (attr=attr_search(options, NULL, attr_url))) { #ifdef HAVE_SOCKET file_request_do(file, options, 1); #endif } else { if (options && (attr=attr_search(options, NULL, attr_readwrite)) && attr->u.num) { open_flags |= O_RDWR; if ((attr=attr_search(options, NULL, attr_create)) && attr->u.num) open_flags |= O_CREAT|O_TRUNC; } else open_flags |= O_RDONLY; file->name = g_strdup(name); file->fd=open(name, open_flags, 0666); if (file->fd == -1) { g_free(file->name); g_free(file); return NULL; } dbg(1,"fd=%d\n", file->fd); file->size=lseek(file->fd, 0, SEEK_END); if (file->size < 0) file->size=0; dbg(1,"size="LONGLONG_FMT"\n", file->size); file->name_id = (long)atom(name); } #ifdef CACHE_SIZE if (!options || !(attr=attr_search(options, NULL, attr_cache)) || attr->u.num) file->cache=1; #endif dbg_assert(file != NULL); return file; } #if 0 struct file * file_create_url(char *url) { } #endif #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif int file_is_dir(char *name) { struct stat buf; if (! stat(name, &buf)) { return S_ISDIR(buf.st_mode); } return 0; } int file_is_reg(char *name) { struct stat buf; if (! stat(name, &buf)) { return S_ISREG(buf.st_mode); } return 0; } long long file_size(struct file *file) { return file->size; } int file_mkdir(char *name, int pflag) { char *buffer=g_alloca(sizeof(char)*(strlen(name)+1)); int ret; char *next; dbg(1,"enter %s %d\n",name,pflag); if (!pflag) { if (file_is_dir(name)) return 0; #if defined HAVE_API_WIN32_BASE || defined _MSC_VER return mkdir(name); #else return mkdir(name, 0777); #endif } strcpy(buffer, name); next=buffer; while ((next=strchr(next, '/'))) { *next='\0'; if (*buffer) { ret=file_mkdir(buffer, 0); if (ret) return ret; } *next++='/'; } if (pflag == 2) return 0; return file_mkdir(buffer, 0); } int file_mmap(struct file *file) { #if 0 int mmap_size=file->size+1024*1024; #else int mmap_size=file->size; #endif #ifdef HAVE_API_WIN32_BASE file->begin = (unsigned char*)mmap_readonly_win32( file->name, &file->map_handle, &file->map_file ); #else file->begin=mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, file->fd, 0); dbg_assert(file->begin != NULL); if (file->begin == (void *)0xffffffff) { perror("mmap"); return 0; } #endif dbg_assert(file->begin != (void *)0xffffffff); file->mmap_end=file->begin+mmap_size; file->end=file->begin+file->size; return 1; } unsigned char * file_data_read(struct file *file, long long offset, int size) { void *ret; if (file->special) return NULL; if (file->begin) return file->begin+offset; if (file->cache) { struct file_cache_id id={offset,size,file->name_id,0}; ret=cache_lookup(file_cache,&id); if (ret) return ret; ret=cache_insert_new(file_cache,&id,size); } else ret=g_malloc(size); lseek(file->fd, offset, SEEK_SET); if (read(file->fd, ret, size) != size) { file_data_free(file, ret); ret=NULL; } return ret; } static void file_process_headers(struct file *file, unsigned char *headers) { char *tok; char *cl; if (file->headers) g_hash_table_destroy(file->headers); file->headers=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); while ((tok=strtok((char*)headers, "\r\n"))) { char *sep; tok=g_strdup(tok); sep=strchr(tok,':'); if (!sep) sep=strchr(tok,'/'); if (!sep) { g_free(tok); continue; } *sep++='\0'; if (*sep == ' ') sep++; strtolower(tok, tok); dbg(1,"header '%s'='%s'\n",tok,sep); g_hash_table_insert(file->headers, tok, sep); headers=NULL; } cl=g_hash_table_lookup(file->headers, "content-length"); if (cl) #ifdef HAVE__ATOI64 file->size=_atoi64(cl); #else file->size=atoll(cl); #endif } static void file_shift_buffer(struct file *file, int amount) { memmove(file->buffer, file->buffer+amount, file->buffer_len-amount); file->buffer_len-=amount; } unsigned char * file_data_read_special(struct file *file, int size, int *size_ret) { unsigned char *ret,*hdr; int rets=0,rd; int buffer_size=8192; int eof=0; if (!file->special) return NULL; if (!file->buffer) file->buffer=g_malloc(buffer_size); ret=g_malloc(size); while ((size > 0 || file->requests) && (!eof || file->buffer_len)) { int toread=buffer_size-file->buffer_len; if (toread >= 4096 && !eof) { if (!file->requests && toread > size) toread=size; rd=read(file->fd, file->buffer+file->buffer_len, toread); if (rd > 0) { file->buffer_len+=rd; } else eof=1; } if (file->requests) { dbg(1,"checking header\n"); if ((hdr=file_http_header_end(file->buffer, file->buffer_len))) { hdr[-1]='\0'; dbg(1,"found %s (%d bytes)\n",file->buffer,sizeof(file->buffer)); file_process_headers(file, file->buffer); file_shift_buffer(file, hdr-file->buffer); file->requests--; if (file_http_header(file, "location")) break; } } if (!file->requests) { rd=file->buffer_len; if (rd > size) rd=size; memcpy(ret+rets, file->buffer, rd); file_shift_buffer(file, rd); rets+=rd; size-=rd; } } *size_ret=rets; return ret; } unsigned char * file_data_read_all(struct file *file) { return file_data_read(file, 0, file->size); } void file_data_flush(struct file *file, long long offset, int size) { if (file->cache) { struct file_cache_id id={offset,size,file->name_id,0}; cache_flush(file_cache,&id); dbg(1,"Flushing "LONGLONG_FMT" %d bytes\n",offset,size); } } int file_data_write(struct file *file, long long offset, int size, const void *data) { file_data_flush(file, offset, size); lseek(file->fd, offset, SEEK_SET); if (write(file->fd, data, size) != size) return 0; if (file->size < offset+size) file->size=offset+size; return 1; } int file_get_contents(char *name, unsigned char **buffer, int *size) { struct file *file; file=file_create(name, 0); if (!file) return 0; file->cache=0; *size=file_size(file); *buffer=file_data_read_all(file); file_destroy(file); return 1; } static int uncompress_int(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit2(&stream, -MAX_WBITS); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } unsigned char * file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp) { void *ret; char *buffer = 0; uLongf destLen=size_uncomp; if (file->cache) { struct file_cache_id id={offset,size,file->name_id,1}; ret=cache_lookup(file_cache,&id); if (ret) return ret; ret=cache_insert_new(file_cache,&id,size_uncomp); } else ret=g_malloc(size_uncomp); lseek(file->fd, offset, SEEK_SET); buffer = (char *)g_malloc(size); if (read(file->fd, buffer, size) != size) { g_free(ret); ret=NULL; } else { if (uncompress_int(ret, &destLen, (Bytef *)buffer, size) != Z_OK) { dbg(0,"uncompress failed\n"); g_free(ret); ret=NULL; } } g_free(buffer); return ret; } unsigned char * file_data_read_encrypted(struct file *file, long long offset, int size, int size_uncomp, int compressed, char *passwd) { #ifdef HAVE_LIBCRYPTO void *ret; unsigned char *buffer = 0; uLongf destLen=size_uncomp; if (file->cache) { struct file_cache_id id={offset,size,file->name_id,1}; ret=cache_lookup(file_cache,&id); if (ret) return ret; ret=cache_insert_new(file_cache,&id,size_uncomp); } else ret=g_malloc(size_uncomp); lseek(file->fd, offset, SEEK_SET); buffer = (unsigned char *)g_malloc(size); if (read(file->fd, buffer, size) != size) { g_free(ret); ret=NULL; } else { unsigned char key[34], salt[8], verify[2], counter[16], xor[16], mac[10], *datap; int overhead=sizeof(salt)+sizeof(verify)+sizeof(mac); int esize=size-overhead; PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), (unsigned char *)buffer, 8, 1000, 34, key); if (key[32] == buffer[8] && key[33] == buffer[9] && esize >= 0) { AES_KEY aeskey; AES_set_encrypt_key(key, 128, &aeskey); datap=buffer+sizeof(salt)+sizeof(verify); memset(counter, 0, sizeof(counter)); while (esize > 0) { int i,curr_size,idx=0; do { counter[idx]++; } while (!counter[idx++]); AES_encrypt(counter, xor, &aeskey); curr_size=esize; if (curr_size > sizeof(xor)) curr_size=sizeof(xor); for (i = 0 ; i < curr_size ; i++) *datap++^=xor[i]; esize-=curr_size; } size-=overhead; datap=buffer+sizeof(salt)+sizeof(verify); if (compressed) { if (uncompress_int(ret, &destLen, (Bytef *)datap, size) != Z_OK) { dbg(0,"uncompress failed\n"); g_free(ret); ret=NULL; } } else { if (size == destLen) memcpy(ret, buffer, destLen); else { dbg(0,"memcpy failed\n"); g_free(ret); ret=NULL; } } } else { g_free(ret); ret=NULL; } } g_free(buffer); return ret; #else return NULL; #endif } void file_data_free(struct file *file, unsigned char *data) { if (file->begin) { if (data == file->begin) return; if (data >= file->begin && data < file->end) return; } if (file->cache && data) { cache_entry_destroy(file_cache, data); } else g_free(data); } void file_data_remove(struct file *file, unsigned char *data) { if (file->begin) { if (data == file->begin) return; if (data >= file->begin && data < file->end) return; } if (file->cache && data) { cache_flush_data(file_cache, data); } else g_free(data); } int file_exists(char const *name) { struct stat buf; if (! stat(name, &buf)) return 1; return 0; } void file_remap_readonly(struct file *f) { #if defined(_WIN32) || defined(__CEGCC__) #else void *begin; munmap(f->begin, f->size); begin=mmap(f->begin, f->size, PROT_READ, MAP_PRIVATE, f->fd, 0); if (f->begin != begin) printf("remap failed\n"); #endif } void file_unmap(struct file *f) { #if defined(_WIN32) || defined(__CEGCC__) mmap_unmap_win32( f->begin, f->map_handle , f->map_file ); #else munmap(f->begin, f->size); #endif } #ifndef _MSC_VER void * file_opendir(char *dir) { return opendir(dir); } #else void * file_opendir(char *dir) { WIN32_FIND_DATAA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; #undef UNICODE // we need FindFirstFileA() which takes an 8-bit c-string char* fname=g_alloca(sizeof(char)*(strlen(dir)+4)); sprintf(fname,"%s\\*",dir); hFind = FindFirstFileA(fname, &FindFileData); return hFind; } #endif #ifndef _MSC_VER char * file_readdir(void *hnd) { struct dirent *ent; ent=readdir(hnd); if (! ent) return NULL; return ent->d_name; } #else char * file_readdir(void *hnd) { WIN32_FIND_DATA FindFileData; if (FindNextFile(hnd, &FindFileData) ) { return FindFileData.cFileName; } else { return NULL; } } #endif /* _MSC_VER */ #ifndef _MSC_VER void file_closedir(void *hnd) { closedir(hnd); } #else void file_closedir(void *hnd) { FindClose(hnd); } #endif /* _MSC_VER */ struct file * file_create_caseinsensitive(char *name, struct attr **options) { char *dirname=g_alloca(sizeof(char)*(strlen(name)+1)); char *filename; char *p; void *d; struct file *ret; ret=file_create(name, options); if (ret) return ret; strcpy(dirname, name); p=dirname+strlen(name); while (p > dirname) { if (*p == '/') break; p--; } *p=0; d=file_opendir(dirname); if (d) { *p++='/'; while ((filename=file_readdir(d))) { if (!g_ascii_strcasecmp(filename, p)) { strcpy(p, filename); ret=file_create(dirname, options); if (ret) break; } } file_closedir(d); } return ret; } void file_fsync(struct file *f) { #ifdef HAVE_FSYNC fsync(f->fd); #endif } void file_destroy(struct file *f) { if (f->headers) g_hash_table_destroy(f->headers); switch (f->special) { case 0: case 1: close(f->fd); break; } if ( f->begin != NULL ) { file_unmap( f ); } g_free(f->buffer); g_free(f->name); g_free(f); } struct file_wordexp { int err; char *pattern; wordexp_t we; }; struct file_wordexp * file_wordexp_new(const char *pattern) { struct file_wordexp *ret=g_new0(struct file_wordexp, 1); ret->pattern=g_strdup(pattern); ret->err=wordexp(pattern, &ret->we, 0); if (ret->err) dbg(0,"wordexp('%s') returned %d\n", pattern, ret->err); return ret; } int file_wordexp_get_count(struct file_wordexp *wexp) { if (wexp->err) return 1; return wexp->we.we_wordc; } char ** file_wordexp_get_array(struct file_wordexp *wexp) { if (wexp->err) return &wexp->pattern; return wexp->we.we_wordv; } void file_wordexp_destroy(struct file_wordexp *wexp) { if (! wexp->err) wordfree(&wexp->we); g_free(wexp->pattern); g_free(wexp); } int file_version(struct file *file, int mode) { #ifndef HAVE_API_WIN32_BASE struct stat st; int error; if (mode == 3) { long long size=lseek(file->fd, 0, SEEK_END); if (file->begin && file->begin+size > file->mmap_end) { file->version++; } else { file->size=size; if (file->begin) file->end=file->begin+file->size; } } else { if (mode == 2) error=stat(file->name, &st); else error=fstat(file->fd, &st); if (error || !file->version || file->mtime != st.st_mtime || file->ctime != st.st_ctime) { file->mtime=st.st_mtime; file->ctime=st.st_ctime; file->version++; dbg(1,"%s now version %d\n", file->name, file->version); } } return file->version; #else return 0; #endif } void * file_get_os_handle(struct file *file) { return GINT_TO_POINTER(file->fd); } int file_set_cache_size(int cache_size) { #ifdef CACHE_SIZE cache_resize(file_cache, cache_size); return 1; #else return 0; #endif } void file_init(void) { #ifdef CACHE_SIZE file_name_hash=g_hash_table_new(g_str_hash, g_str_equal); file_cache=cache_new(sizeof(struct file_cache_id), CACHE_SIZE); #endif } navit-0.5.0~svn5643+dfsg.1/navit/file.h000066400000000000000000000065711221777731700174220ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_FILE_H #define NAVIT_FILE_H #ifdef __cplusplus extern "C" { #endif #ifndef PATH_MAX #define PATH_MAX 4096 #endif #ifndef __CEGCC__ #include #endif #include "param.h" #include struct file { struct file *next; unsigned char *begin; unsigned char *end; unsigned char *mmap_end; long long size; int name_id; int fd; #ifndef __CEGCC__ time_t mtime; time_t ctime; int version; #endif #if defined(_WIN32) || defined(__CEGCC__) long map_handle; long map_file; #endif char *name; int special; int cache; int requests; unsigned char *buffer; int buffer_len; GHashTable *headers; }; struct attr; /* prototypes */ int file_request(struct file *f, struct attr **options); char *file_http_header(struct file *f, char *header); struct file *file_create(char *name, struct attr **options); int file_is_dir(char *name); long long file_size(struct file *file); int file_mkdir(char *name, int pflag); int file_mmap(struct file *file); unsigned char *file_data_read(struct file *file, long long offset, int size); unsigned char *file_data_read_special(struct file *file, int size, int *size_ret); unsigned char *file_data_read_all(struct file *file); void file_data_flush(struct file *file, long long offset, int size); int file_data_write(struct file *file, long long offset, int size, const void *data); int file_get_contents(char *name, unsigned char **buffer, int *size); unsigned char *file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp); unsigned char *file_data_read_encrypted(struct file *file, long long offset, int size, int size_uncomp, int compressed, char *passwd); void file_data_free(struct file *file, unsigned char *data); int file_exists(char const *name); void file_remap_readonly(struct file *f); void file_unmap(struct file *f); void *file_opendir(char *dir); char *file_readdir(void *hnd); void file_closedir(void *hnd); struct file *file_create_caseinsensitive(char *name, struct attr **options); void file_fsync(struct file *f); void file_destroy(struct file *f); struct file_wordexp *file_wordexp_new(const char *pattern); int file_wordexp_get_count(struct file_wordexp *wexp); char **file_wordexp_get_array(struct file_wordexp *wexp); void file_wordexp_destroy(struct file_wordexp *wexp); int file_get_param(struct file *file, struct param_list *param, int count); int file_version(struct file *file, int byname); void *file_get_os_handle(struct file *file); int file_set_cache_size(int cache_size); void file_init(void); int file_is_reg(char *name); void file_data_remove(struct file *file, unsigned char *data); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/font/000077500000000000000000000000001221777731700172675ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/font/Makefile.am000066400000000000000000000000641221777731700213230ustar00rootroot00000000000000SUBDIRS= if FONT_FREETYPE SUBDIRS+=freetype endif navit-0.5.0~svn5643+dfsg.1/navit/font/freetype/000077500000000000000000000000001221777731700211125ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/font/freetype/CMakeLists.txt000066400000000000000000000006421221777731700236540ustar00rootroot00000000000000module_add_library(font_freetype font_freetype.c) if (FRIBIDI_FOUND) include_directories(${FRIBIDI_INCLUDE_DIRS}) set_property( TARGET font_freetype APPEND PROPERTY COMPILE_DEFINITIONS USE_FRIBIDI=1 ) if (NOT FRIBIDI2_FOUND) set_property( TARGET font_freetype APPEND PROPERTY COMPILE_DEFINITIONS FRIBIDIOLD=1 ) endif (NOT FRIBIDI2_FOUND) endif (FRIBIDI_FOUND) navit-0.5.0~svn5643+dfsg.1/navit/font/freetype/Makefile.am000066400000000000000000000007341221777731700231520ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @FREETYPE2_CFLAGS@ @FONTCONFIG_CFLAGS@ @FRIBIDI2_CFLAGS@ @FRIBIDI_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=font_freetype if PLUGINS modulefont_LTLIBRARIES = libfont_freetype.la else noinst_LTLIBRARIES = libfont_freetype.la endif libfont_freetype_la_SOURCES = font_freetype.c font_freetype.h libfont_freetype_la_LDFLAGS = @FREETYPE2_LIBS@ @FONTCONFIG_LIBS@ @FRIBIDI2_LIBS@ @FRIBIDI_LIBS@ -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/font/freetype/font_freetype.c000066400000000000000000000457341221777731700241440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_FONTCONFIG #include #endif #include #include #include FT_FREETYPE_H #ifndef USE_CACHING #define USE_CACHING 1 #endif #if USE_CACHING #include FT_CACHE_H #endif #if USE_FRIBIDI #include #endif #include #include "point.h" #include "graphics.h" #include "debug.h" #include "plugin.h" #include "color.h" #include "atom.h" #include "font_freetype.h" #ifndef HAVE_LOOKUP_SCALER #if FREETYPE_MAJOR * 10000 + FREETYPE_MINOR * 100 + FREETYPE_PATCH > 20304 #define HAVE_LOOKUP_SCALER 1 #else #define HAVE_LOOKUP_SCALER 0 #endif #endif struct font_freetype_font { int size; #if USE_CACHING #if HAVE_LOOKUP_SCALER FTC_ScalerRec scaler; #else FTC_ImageTypeRec scaler; #endif int charmap_index; #else FT_Face face; #endif }; struct font_priv { int data; }; static struct font_priv dummy; static FT_Library library; #if USE_CACHING static FTC_Manager manager; static FTC_ImageCache image_cache; static FTC_CMapCache charmap_cache; static FTC_SBitCache sbit_cache; #endif static int library_init = 0; static int library_deinit = 0; static void font_freetype_get_text_bbox(struct graphics_priv *gr, struct font_freetype_font *font, char *text, int dx, int dy, struct point *ret, int estimate) { char *p = text; FT_BBox bbox; FT_UInt glyph_index; FT_Glyph glyph; FT_Matrix matrix; FT_Vector pen; int i; struct point pt; int n, len, x = 0, y = 0; pen.x = 0 * 64; pen.y = 0 * 64; #if 0 matrix.xx = dx; matrix.xy = dy; matrix.yx = -dy; matrix.yy = dx; #else matrix.xx = 0x10000; matrix.xy = 0; matrix.yx = 0; matrix.yy = 0x10000; #endif len = g_utf8_strlen(text, -1); if (estimate) { bbox.xMin = 0; bbox.yMin = 0; bbox.yMax = 13*font->size/256; bbox.xMax = 9*font->size*len/256; } else { bbox.xMin = bbox.yMin = 32000; bbox.xMax = bbox.yMax = -32000; #if !USE_CACHING FT_Set_Transform(font->face, &matrix, &pen); #endif for (n = 0; n < len; n++) { FT_BBox glyph_bbox; #if USE_CACHING FTC_Node anode = NULL; FT_Glyph cached_glyph; glyph_index = FTC_CMapCache_Lookup(charmap_cache, font->scaler.face_id, font->charmap_index, g_utf8_get_char(p)); #if HAVE_LOOKUP_SCALER FTC_ImageCache_LookupScaler(image_cache, &font->scaler, FT_LOAD_DEFAULT, glyph_index, &cached_glyph, &anode); #else FTC_ImageCache_Lookup(image_cache, &font->scaler, glyph_index, &cached_glyph, &anode); #endif /* HAVE_LOOKUP_SCALER */ FT_Glyph_Copy(cached_glyph, &glyph); FT_Glyph_Transform(glyph, &matrix, &pen); #else glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT); FT_Get_Glyph(font->face->glyph, &glyph); #endif /* USE_CACHING */ FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_pixels, &glyph_bbox); glyph_bbox.xMin += x >> 6; glyph_bbox.xMax += x >> 6; glyph_bbox.yMin += y >> 6; glyph_bbox.yMax += y >> 6; x += glyph->advance.x >> 10; y -= glyph->advance.y >> 10; if (glyph_bbox.xMin < bbox.xMin) bbox.xMin = glyph_bbox.xMin; if (glyph_bbox.yMin < bbox.yMin) bbox.yMin = glyph_bbox.yMin; if (glyph_bbox.xMax > bbox.xMax) bbox.xMax = glyph_bbox.xMax; if (glyph_bbox.yMax > bbox.yMax) bbox.yMax = glyph_bbox.yMax; p = g_utf8_next_char(p); FT_Done_Glyph(glyph); #if USE_CACHING FTC_Node_Unref(anode, manager); #endif } if (bbox.xMin > bbox.xMax) { bbox.xMin = 0; bbox.yMin = 0; bbox.xMax = 0; bbox.yMax = 0; } } ret[0].x = bbox.xMin; ret[0].y = -bbox.yMin; ret[1].x = bbox.xMin; ret[1].y = -bbox.yMax; ret[2].x = bbox.xMax; ret[2].y = -bbox.yMax; ret[3].x = bbox.xMax; ret[3].y = -bbox.yMin; if (dy != 0 || dx != 0x10000) { for (i = 0 ; i < 4 ; i++) { pt=ret[i]; ret[i].x=(pt.x*dx-pt.y*dy)/0x10000; ret[i].y=(pt.y*dx+pt.x*dy)/0x10000; } } } static struct font_freetype_text * font_freetype_text_new(char *text, struct font_freetype_font *font, int dx, int dy) { FT_Matrix matrix; FT_Vector pen; FT_UInt glyph_index; int y, n, len, w, h, pixmap_len; struct font_freetype_text *ret; struct font_freetype_glyph *curr; char *p = text; unsigned char *gl, *pm; FT_BitmapGlyph glyph_bitmap; FT_Glyph glyph; len = g_utf8_strlen(text, -1); ret = g_malloc(sizeof(*ret) + len * sizeof(struct text_glyph *)); ret->glyph_count = len; matrix.xx = dx; matrix.xy = dy; matrix.yx = -dy; matrix.yy = dx; pen.x = 0 * 64; pen.y = 0 * 64; #if !USE_CACHING FT_Set_Transform(font->face, &matrix, &pen); #endif #if USE_FRIBIDI // Need to use fribidi to handle the string properly char visual_text[len*4+1]; { FriBidiChar unicode_text[len+2]; FriBidiChar visual_unicode_text[len+2]; FriBidiStrIndex textlen = strlen(text); #ifdef FRIBIDIOLD FriBidiCharType base = FRIBIDI_TYPE_LTR; #else FriBidiParType base = FRIBIDI_PAR_LTR; #endif FriBidiStrIndex unicode_len = #ifdef FRIBIDIOLD fribidi_utf8_to_unicode(text, textlen, unicode_text); #else fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, text, textlen, unicode_text); #endif fribidi_log2vis(unicode_text, unicode_len, &base, visual_unicode_text, NULL, NULL, NULL); // TODO: check return value #ifdef FRIBIDIOLD fribidi_unicode_to_utf8(visual_unicode_text, unicode_len, visual_text); #else fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, visual_unicode_text, unicode_len, visual_text); #endif p = visual_text; } #endif /* USE_FRIBIDI */ for (n = 0; n < len; n++) { #if USE_CACHING FTC_Node anode=NULL; FT_Glyph cached_glyph; glyph_index = FTC_CMapCache_Lookup(charmap_cache, font->scaler.face_id, font->charmap_index, g_utf8_get_char(p)); #if HAVE_LOOKUP_SCALER FTC_ImageCache_LookupScaler(image_cache, &font->scaler, FT_LOAD_DEFAULT, glyph_index, &cached_glyph, &anode); #else FTC_ImageCache_Lookup(image_cache, &font->scaler, glyph_index, &cached_glyph, &anode); #endif FT_Glyph_Copy(cached_glyph, &glyph); FT_Glyph_Transform(glyph, &matrix, &pen); FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, NULL, TRUE); #else glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT); FT_Get_Glyph(font->face->glyph, &glyph); #endif FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, NULL, TRUE); glyph_bitmap = (FT_BitmapGlyph)glyph; w = glyph_bitmap->bitmap.width; h = glyph_bitmap->bitmap.rows; if (w && h) pixmap_len = (w + 2) * (h + 2); else pixmap_len = 0; curr = g_malloc0(sizeof(*curr) + pixmap_len); if (pixmap_len) { curr->w = w; curr->h = h; } curr->pixmap = (unsigned char *) (curr + 1); ret->glyph[n] = curr; curr->x = glyph_bitmap->left << 6; curr->y = -glyph_bitmap->top << 6; for (y = 0; y < h; y++) { gl = glyph_bitmap->bitmap.buffer + y * glyph_bitmap->bitmap.pitch; pm = curr->pixmap + y * w; memcpy(pm, gl, w); } curr->dx = glyph->advance.x >> 10; curr->dy = -glyph->advance.y >> 10; FT_Done_Glyph(glyph); #if USE_CACHING FTC_Node_Unref(anode, manager); #endif p = g_utf8_next_char(p); } ret->glyph_count = len; return ret; } /** * List of font families to use, in order of preference */ static char *fontfamilies[] = { "Liberation Sans", "Arial", "NcrBI4nh", "luximbi", "FreeSans", "DejaVu Sans", NULL, }; static void font_destroy(struct graphics_font_priv *font) { g_free(font); /* TODO: free font->face */ } static struct graphics_font_methods font_methods = { font_destroy }; static void font_freetype_text_destroy(struct font_freetype_text *text) { int i; struct font_freetype_glyph **gp; gp = text->glyph; i = text->glyph_count; while (i-- > 0) g_free(*gp++); g_free(text); } #if USE_CACHING static FT_Error face_requester( FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face* aface ) { FT_Error ret; char *fontfile,*fontindex; if (! face_id) return FT_Err_Invalid_Handle; fontfile=g_strdup((char *)face_id); dbg(1,"fontfile=%s\n", fontfile); fontindex=strrchr(fontfile,'/'); if (! fontindex) { g_free(fontfile); return FT_Err_Invalid_Handle; } *fontindex++='\0'; dbg(1,"new face %s %d\n", fontfile, atoi(fontindex)); ret = FT_New_Face( library, fontfile, atoi(fontindex), aface ); if(ret) { dbg(0,"Error while creating freetype face: %d\n", ret); return ret; } if((ret = FT_Select_Charmap(*aface, FT_ENCODING_UNICODE))) { dbg(0,"Error while creating freetype face: %d\n", ret); } return 0; } #endif /** * Load a new font using the fontconfig library. * First search for each of the font families and require and exact match on family * If no font found, let fontconfig pick the best match * @param graphics_priv FIXME * @param graphics_font_methods FIXME * @param fontfamily the preferred font family * @param size requested size of fonts * @param flags extra flags for the font (bold,etc) * @returns <> */ static struct font_freetype_font * font_freetype_font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *fontfamily, int size, int flags) { struct font_freetype_font *font = g_new(struct font_freetype_font, 1); int exact, found=0; char **family, **family_sav; #if USE_CACHING char *idstr; FT_Face face; #endif #ifndef HAVE_FONTCONFIG char *name; #endif *meth = font_methods; if (!library_init) { FT_Init_FreeType(&library); #if USE_CACHING FTC_Manager_New( library, 0, 0, 0, &face_requester, NULL, &manager); FTC_ImageCache_New( manager, &image_cache); FTC_CMapCache_New( manager, &charmap_cache); FTC_SBitCache_New( manager, &sbit_cache); #endif library_init = 1; } font->size=size; #ifdef HAVE_FONTCONFIG dbg(2, " about to search for fonts, preferred = %s\n", fontfamily); family = g_malloc(sizeof(fontfamilies) + sizeof(fontfamily)); if (fontfamily) { memcpy(family, &fontfamily, sizeof(fontfamily)); memcpy(family + 1, fontfamilies, sizeof(fontfamilies)); } else { memcpy(family, fontfamilies, sizeof(fontfamilies)); } family_sav=family; for (exact = 1; !found && exact >= 0; exact--) { family=family_sav; while (*family && !found) { dbg(2, "Looking for font family %s. exact=%d\n", *family, exact); FcPattern *required = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, *family, NULL); if (flags) FcPatternAddInteger(required, FC_WEIGHT, FC_WEIGHT_BOLD); FcConfigSubstitute(FcConfigGetCurrent(), required, FcMatchFont); FcDefaultSubstitute(required); FcResult result; FcPattern *matched = FcFontMatch(FcConfigGetCurrent(), required, &result); if (matched) { FcValue v1, v2; FcChar8 *fontfile; int fontindex; FcPatternGet(required, FC_FAMILY, 0, &v1); FcPatternGet(matched, FC_FAMILY, 0, &v2); FcResult r1 = FcPatternGetString(matched, FC_FILE, 0, &fontfile); FcResult r2 = FcPatternGetInteger(matched, FC_INDEX, 0, &fontindex); if ((r1 == FcResultMatch) && (r2 == FcResultMatch) && (FcValueEqual(v1, v2) || !exact)) { dbg(2, "About to load font from file %s index %d\n", fontfile, fontindex); #if USE_CACHING idstr=g_strdup_printf("%s/%d", fontfile, fontindex); font->scaler.face_id=(FTC_FaceID)atom(idstr); g_free(idstr); #if HAVE_LOOKUP_SCALER font->scaler.width=0; font->scaler.height=size; font->scaler.pixel=0; font->scaler.x_res=300; font->scaler.y_res=300; #else font->scaler.width=size/15; font->scaler.height=size/15; font->scaler.flags=FT_LOAD_DEFAULT; #endif FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; #else /* USE_CACHING */ FT_New_Face(library, (char *) fontfile, fontindex, &font->face); #endif /* USE_CACHING */ found = 1; } FcPatternDestroy(matched); } FcPatternDestroy(required); family++; } } g_free(family_sav); #else /* HAVE_FONTCONFIG */ #ifdef FREETYPE_FONTS { char *fonts[]={FREETYPE_FONTS}; name=g_strdup(fonts[flags ? 1:0]); } #else name=g_strdup_printf("%s/fonts/%s-%s.ttf",getenv("NAVIT_SHAREDIR"),"LiberationSans",flags ? "Bold":"Regular"); #endif #if USE_CACHING idstr=g_strdup_printf("%s/%d", name, 0); font->scaler.face_id=(FTC_FaceID)atom(idstr); g_free(idstr); FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; #if HAVE_LOOKUP_SCALER font->scaler.width=0; font->scaler.height=size; font->scaler.pixel=0; font->scaler.x_res=300; font->scaler.y_res=300; #else font->scaler.width=size/15; font->scaler.height=size/15; font->scaler.flags=FT_LOAD_DEFAULT; #endif found=1; FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; #else /* USE_CACHING */ if (!FT_New_Face(library, name, 0, &font->face)) found=1; #endif /* USE_CACHING */ g_free(name); #endif /* HAVE_FONTCONFIG */ if (!found) { dbg(0,"Failed to load font, no labelling\n"); g_free(font); return NULL; } #if !USE_CACHING FT_Set_Char_Size(font->face, 0, size, 300, 300); FT_Select_Charmap(font->face, FT_ENCODING_UNICODE); #endif return font; } static int font_freetype_glyph_get_shadow(struct font_freetype_glyph *g, unsigned char *data, int depth, int stride, struct color *foreground, struct color *background) { int mask0, mask1, mask2, x, y, w = g->w, h = g->h; unsigned int bg, fg; unsigned char *pm, *psp,*ps,*psn; switch (depth) { case 1: fg=0xff; bg=0x00; break; case 8: fg=foreground->a>>8; bg=background->a>>8; break; case 24: case 32: fg=((foreground->a>>8)<<24)| ((foreground->r>>8)<<16)| ((foreground->g>>8)<<8)| ((foreground->b>>8)<<0); bg=((background->a>>8)<<24)| ((background->r>>8)<<16)| ((background->g>>8)<<8)| ((background->b>>8)<<0); break; default: return 0; } for (y = 0; y < h+2; y++) { if (stride) { ps = data + stride * y; } else { unsigned char **dataptr=(unsigned char **)data; ps = dataptr[y]; } switch (depth) { case 1: memset(ps, bg, (w+9)/2); break; case 8: memset(ps, bg, w+2); break; case 24: for (x = 0 ; x < w+2 ; x++) { ps[x*3]=bg>>16; ps[x*3+1]=bg>>8; ps[x*3+2]=bg; } break; case 32: for (x = 0 ; x < w+2 ; x++) ((unsigned int *)ps)[x]=bg; break; } } for (y = 0; y < h; y++) { pm = g->pixmap + y * w; if (stride) { psp = data + stride * y; ps = psp + stride; psn = ps + stride; } else { unsigned char **dataptr=(unsigned char **)data; psp = dataptr[y]; ps = dataptr[y+1]; psn = dataptr[y+2]; } switch (depth) { case 1: mask0 = 0x4000; mask1 = 0xe000; mask2 = 0x4000; for (x = 0; x < w; x++) { if (*pm) { psp[0] |= (mask0 >> 8); if (mask0 & 0xff) psp[1] |= mask0; ps[0] |= (mask1 >> 8); if (mask1 & 0xff) ps[1] |= mask1; psn[0] |= (mask2 >> 8); if (mask2 & 0xff) psn[1] |= mask2; } mask0 >>= 1; mask1 >>= 1; mask2 >>= 1; if (! ((mask0 >> 8) | (mask1 >> 8) | (mask2 >> 8))) { mask0 <<= 8; mask1 <<= 8; mask2 <<= 8; psp++; ps++; psn++; } pm++; } break; case 8: for (x = 0; x < w; x++) { if (*pm) { psp[1] = fg; ps[0] = fg; ps[1] = fg; ps[2] = fg; psn[1] = fg; } psp++; ps++; psn++; pm++; } break; case 24: for (x = 0; x < w; x++) { if (*pm) { psp[3]=fg>>16; psp[4]=fg>>8; psp[5]=fg; ps[0]=fg>>16; ps[1]=fg>>8; ps[2]=fg; ps[3]=fg>>16; ps[4]=fg>>8; ps[5]=fg; ps[6]=fg>>16; ps[7]=fg>>8; ps[8]=fg; psn[3]=fg>>16; psn[4]=fg>>8; psn[5]=fg; } psp+=3; ps+=3; psn+=3; pm++; } break; case 32: for (x = 0; x < w; x++) { if (*pm) { ((unsigned int *)psp)[1]=fg; ((unsigned int *)ps)[0]=fg; ((unsigned int *)ps)[1]=fg; ((unsigned int *)ps)[2]=fg; ((unsigned int *)psn)[1]=fg; } psp+=4; ps+=4; psn+=4; pm++; } break; } } return 1; } static int font_freetype_glyph_get_glyph(struct font_freetype_glyph *g, unsigned char *data, int depth, int stride, struct color *fg, struct color *bg, struct color *transparent) { int x, y, w = g->w, h = g->h; unsigned int tr; unsigned char v,vi,*pm, *ps; switch (depth) { case 8: tr=transparent->a>>8; break; case 24: case 32: tr=((transparent->a>>8)<<24)| ((transparent->r>>8)<<16)| ((transparent->g>>8)<<8)| ((transparent->b>>8)<<0); break; default: return 0; } for (y = 0; y < h; y++) { pm = g->pixmap + y * w; if (stride) { ps = data + stride*y; } else { unsigned char **dataptr=(unsigned char **)data; ps = dataptr[y]; } switch (depth) { case 8: for (x = 0; x < w; x++) { v=*pm; if (v) *ps=fg->a; else *ps=tr; ps++; pm++; } break; case 24: for (x = 0; x < w; x++) { v=*pm; if (v) { vi=255-v; ps[0]=(((fg->r*v+bg->r*vi)/255)>>8); ps[1]=(((fg->g*v+bg->g*vi)/255)>>8); ps[2]=(((fg->b*v+bg->b*vi)/255)>>8); } else { ps[0]=tr >> 16; ps[1]=tr >> 8; ps[2]=tr; } ps+=3; pm++; } break; case 32: for (x = 0; x < w; x++) { v=*pm; if (v) { vi=255-v; ((unsigned int *)ps)[0]= ((((fg->a*v+bg->a*vi)/255)>>8)<<24)| ((((fg->r*v+bg->r*vi)/255)>>8)<<16)| ((((fg->g*v+bg->g*vi)/255)>>8)<<8)| ((((fg->b*v+bg->b*vi)/255)>>8)<<0); } else ((unsigned int *)ps)[0]=tr; ps+=4; pm++; } break; } } return 1; } static void font_freetype_destroy(void) { if (!library_deinit) { #ifdef HAVE_FONTCONFIG FcFini(); #endif #if USE_CACHING FTC_Manager_Done(manager); #endif FT_Done_FreeType(library); } library_deinit = 1; } static struct font_freetype_methods methods = { font_freetype_destroy, font_freetype_font_new, font_freetype_get_text_bbox, font_freetype_text_new, font_freetype_text_destroy, font_freetype_glyph_get_shadow, font_freetype_glyph_get_glyph, }; static struct font_priv * font_freetype_new(void *meth) { *((struct font_freetype_methods *) meth) = methods; return &dummy; } void plugin_init(void) { plugin_register_font_type("freetype", font_freetype_new); #ifdef HAVE_FONTCONFIG FcInit(); #endif } navit-0.5.0~svn5643+dfsg.1/navit/font/freetype/font_freetype.h000066400000000000000000000035671221777731700241470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct font_freetype_font; struct font_freetype_glyph; struct font_freetype_methods { void (*destroy)(void); struct font_freetype_font *(*font_new) (struct graphics_priv * gr, struct graphics_font_methods * meth, char *font, int size, int flags); void (*get_text_bbox) (struct graphics_priv * gr, struct font_freetype_font * font, char *text, int dx, int dy, struct point * ret, int estimate); struct font_freetype_text *(*text_new) (char *text, struct font_freetype_font * font, int dx, int dy); void (*text_destroy) (struct font_freetype_text * text); int (*get_shadow) (struct font_freetype_glyph * glyph, unsigned char *data, int depth, int stride, struct color *fg, struct color *tr); int (*get_glyph) (struct font_freetype_glyph * glyph, unsigned char *data, int depth, int stride, struct color * fg, struct color * bg, struct color *tr); }; struct font_freetype_glyph { int x, y, w, h, dx, dy; unsigned char *pixmap; }; struct font_freetype_text { int x1, y1; int x2, y2; int x3, y3; int x4, y4; int glyph_count; struct font_freetype_glyph *glyph[0]; }; navit-0.5.0~svn5643+dfsg.1/navit/fonts/000077500000000000000000000000001221777731700174525ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/fonts/CMakeLists.txt000066400000000000000000000007701221777731700222160ustar00rootroot00000000000000add_custom_target( fonts ALL DEPENDS ${NAVIT_FONTS} COMMAND ${CMAKE_COMMAND} -D GLOB_EXP="${CMAKE_CURRENT_SOURCE_DIR}/*.ttf" #${NAVIT_FONTS}" -D DST=${CMAKE_CURRENT_BINARY_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/copy_files.cmake ) FILE(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.ttf") install( FILES ${files} DESTINATION ${SHARE_DIR}/fonts PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) navit-0.5.0~svn5643+dfsg.1/navit/geom.c000066400000000000000000000276201221777731700174230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "geom.h" void geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse) { int i; if (!reverse) { memcpy(to, from, count*sizeof(struct coord)); return; } from+=count; for (i = 0 ; i < count ; i++) *to++=*--from; } /** * Get coordinates of polyline middle point. * @param in *p array of poly vertex coordinates * @param in count count of poly vertexes * @param out *c coordinates of middle point * @returns number of first vertex of segment containing middle point */ int geom_line_middle(struct coord *p, int count, struct coord *c) { double length=0,half=0,len=0; int i; if(count==1) { *c=*p; return 0; } for (i=0; i 0) { i--; half-=length; if (len) { c->x=(p[i].x*half+p[i+1].x*(len-half))/len; c->y=(p[i].y*half+p[i+1].y*(len-half))/len; } else *c=p[i]; } else *c=p[0]; return i; } void geom_coord_revert(struct coord *c, int count) { struct coord tmp; int i; for (i = 0 ; i < count/2 ; i++) { tmp=c[i]; c[i]=c[count-1-i]; c[count-1-i]=tmp; } } long long geom_poly_area(struct coord *c, int count) { long long area=0; int i,j=0; #if 0 fprintf(stderr,"count=%d\n",count); #endif for (i=0; ix=x0+sx/3/area; c->y=y0+sy/3/area; return 1; } return 0; } /** * Get coordinates of polyline point c most close to given point p. * @param in *pl array of polyline vertex coordinates * @param in count count of polyline vertexes * @param in *p point coordinates * @param out *c coordinates of polyline point most close to given point. * @returns first vertex number of polyline segment to which c belongs */ int geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c) { int i,vertex=0; long long x, y, xi, xj, yi, yj, u, d, dmin=0; if(count<2) { c->x=pl->x; c->y=pl->y; return 0; } for(i=0;ix-xi)*(xj-xi)+(p->y-yi)*(yj-yi))*1000/u; } if(u<0) u=0; else if (u>1000) u=1000; x=xi+u*(xj-xi)/1000; y=yi+u*(yj-yi)/1000; d=(p->x-x)*(p->x-x)+(p->y-y)*(p->y-y); if(i==0 || dx=x; c->y=y; vertex=i; } } return vertex; } /** * Check if point is inside polgone. * @param in *cp array of polygon vertex coordinates * @param in count count of polygon vertexes * @param in *c point coordinates * @returns 1 - inside, 0 - outside */ int geom_poly_point_inside(struct coord *cp, int count, struct coord *c) { int ret=0; struct coord *last=cp+count-1; while (cp < last) { if ((cp[0].y > c->y) != (cp[1].y > c->y) && c->x < ((long long)cp[1].x-cp[0].x)*(c->y-cp[0].y)/(cp[1].y-cp[0].y)+cp[0].x) { #if 0 fprintf(stderr," cross 0x%x,0x%x-0x%x,0x%x %dx%d",cp,cp[0].x,cp[0].y,cp[1].x,cp[1].y,cp[1].x-cp[0].x,c->y-cp[0].y); printf("type=selected_line\n"); coord_print(projection_mg, &cp[0], stdout); coord_print(projection_mg, &cp[1], stdout); #endif ret=!ret; } cp++; } return ret; } GList * geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third) { int count; struct geom_poly_segment *ret; struct coord *pos; if (!second) return NULL; ret=g_new(struct geom_poly_segment, 1); ret->type=second->type; count=(second->last-second->first)+1; if (first) count+=(first->last-first->first); if (third) count+=(third->last-third->first); #if 0 fprintf(stderr,"count=%d first=%p second=%p third=%p\n",count,first,second,third); if (first) fprintf(stderr,"first:0x%x,0x%x-0x%x,0x%x (%d)\n",first->first->x,first->first->y,first->last->x,first->last->y, first->last-first->first+1); if (second) fprintf(stderr,"second:0x%x,0x%x-0x%x,0x%x (%d)\n",second->first->x,second->first->y,second->last->x,second->last->y, second->last-second->first+1); if (third) fprintf(stderr,"third:0x%x,0x%x-0x%x,0x%x (%d)\n",third->first->x,third->first->y,third->last->x,third->last->y, third->last-third->first+1); #endif ret->first=g_new(struct coord, count); pos=ret->first; if (first) { count=(first->last-first->first)+1; geom_coord_copy(first->first, pos, count, coord_is_equal(*first->first, *second->first)); pos+=count-1; } count=(second->last-second->first)+1; geom_coord_copy(second->first, pos, count, 0); pos+=count; if (third) { pos--; count=(third->last-third->first)+1; geom_coord_copy(third->first, pos, count, coord_is_equal(*third->last, *second->last)); pos+=count; } ret->last=pos-1; #if 0 fprintf(stderr,"result:0x%x,0x%x-0x%x,0x%x (%d)\n",ret->first->x,ret->first->y,ret->last->x,ret->last->y, ret->last-ret->first+1); #endif list=g_list_prepend(list, ret); #if 0 fprintf(stderr,"List=%p\n",list); #endif return list; } void geom_poly_segment_destroy(struct geom_poly_segment *seg) { g_free(seg->first); g_free(seg); } GList * geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg) { if (seg) { list=g_list_remove(list, seg); geom_poly_segment_destroy(seg); } return list; } int geom_poly_segment_compatible(struct geom_poly_segment *s1, struct geom_poly_segment *s2, int dir) { int same=0,opposite=0; if (s1->type == geom_poly_segment_type_none || s2->type == geom_poly_segment_type_none) return 0; if (s1->type == s2->type) { same=1; if (s1->type == geom_poly_segment_type_way_inner || s1->type == geom_poly_segment_type_way_outer) { opposite=1; } } if (s1->type == geom_poly_segment_type_way_left_side && s2->type == geom_poly_segment_type_way_right_side) opposite=1; if (s1->type == geom_poly_segment_type_way_right_side && s2->type == geom_poly_segment_type_way_left_side) opposite=1; if (s1->type == geom_poly_segment_type_way_unknown || s2->type == geom_poly_segment_type_way_unknown) { same=1; opposite=1; } if (dir < 0) { if ((opposite && coord_is_equal(*s1->first, *s2->first)) || (same && coord_is_equal(*s1->first, *s2->last))) return 1; } else { if ((opposite && coord_is_equal(*s1->last, *s2->last)) || (same && coord_is_equal(*s1->last, *s2->first))) return 1; } return 0; } GList * geom_poly_segments_sort(GList *in, enum geom_poly_segment_type type) { GList *ret=NULL; while (in) { struct geom_poly_segment *seg=in->data; GList *tmp=ret; struct geom_poly_segment *merge_first=NULL,*merge_last=NULL; while (tmp) { struct geom_poly_segment *cseg=tmp->data; if (geom_poly_segment_compatible(seg, cseg, -1)) merge_first=cseg; if (geom_poly_segment_compatible(seg, cseg, 1)) merge_last=cseg; tmp=g_list_next(tmp); } if (merge_first == merge_last) merge_last=NULL; ret=geom_poly_segments_insert(ret, merge_first, seg, merge_last); ret=geom_poly_segments_remove(ret, merge_first); ret=geom_poly_segments_remove(ret, merge_last); in=g_list_next(in); } in=ret; while (in) { struct geom_poly_segment *seg=in->data; if (coord_is_equal(*seg->first, *seg->last)) { long long area=geom_poly_area(seg->first,seg->last-seg->first+1); if (type == geom_poly_segment_type_way_right_side && seg->type == geom_poly_segment_type_way_right_side) { seg->type=area > 0 ? geom_poly_segment_type_way_outer : geom_poly_segment_type_way_inner; } } in=g_list_next(in); } return ret; } int geom_poly_segments_point_inside(GList *in, struct coord *c) { int open_matches=0,closed_matches=0; #if 0 fprintf(stderr,"try 0x%x,0x%x:",c->x,c->y); #endif while (in) { struct geom_poly_segment *seg=in->data; if (geom_poly_point_inside(seg->first, seg->last-seg->first+1, c)) { #if 0 fprintf(stderr," inside"); #endif if (coord_is_equal(*seg->first,*seg->last)) closed_matches++; else open_matches++; } else { #if 0 fprintf(stderr," outside"); #endif } in=g_list_next(in); } #if 0 fprintf(stderr,"\n"); fprintf(stderr,"open_matches %d closed_matches %d\n",open_matches,closed_matches); #endif if (closed_matches) { if (closed_matches & 1) return 1; else return 0; } if (open_matches) { if (open_matches & 1) return -1; else return 0; } return 0; } static int clipcode(struct coord *p, struct rect *r) { int code=0; if (p->x < r->l.x) code=1; if (p->x > r->h.x) code=2; if (p->y < r->l.y) code |=4; if (p->y > r->h.y) code |=8; return code; } int geom_clip_line_code(struct coord *p1, struct coord *p2, struct rect *r) { int code1,code2,ret=1; long long dx,dy; code1=clipcode(p1, r); if (code1) ret |= 2; code2=clipcode(p2, r); if (code2) ret |= 4; dx=p2->x-p1->x; dy=p2->y-p1->y; while (code1 || code2) { if (code1 & code2) return 0; if (code1 & 1) { p1->y+=(r->l.x-p1->x)*dy/dx; p1->x=r->l.x; } else if (code1 & 2) { p1->y+=(r->h.x-p1->x)*dy/dx; p1->x=r->h.x; } else if (code1 & 4) { p1->x+=(r->l.y-p1->y)*dx/dy; p1->y=r->l.y; } else if (code1 & 8) { p1->x+=(r->h.y-p1->y)*dx/dy; p1->y=r->h.y; } code1=clipcode(p1, r); if (code1 & code2) return 0; if (code2 & 1) { p2->y+=(r->l.x-p2->x)*dy/dx; p2->x=r->l.x; } else if (code2 & 2) { p2->y+=(r->h.x-p2->x)*dy/dx; p2->x=r->h.x; } else if (code2 & 4) { p2->x+=(r->l.y-p2->y)*dx/dy; p2->y=r->l.y; } else if (code2 & 8) { p2->x+=(r->h.y-p2->y)*dx/dy; p2->y=r->h.y; } code2=clipcode(p2, r); } if (p1->x == p2->x && p1->y == p2->y) ret=0; return ret; } int geom_is_inside(struct coord *p, struct rect *r, int edge) { switch(edge) { case 0: return p->x >= r->l.x; case 1: return p->x <= r->h.x; case 2: return p->y >= r->l.y; case 3: return p->y <= r->h.y; default: return 0; } } void geom_poly_intersection(struct coord *p1, struct coord *p2, struct rect *r, int edge, struct coord *ret) { int dx=p2->x-p1->x; int dy=p2->y-p1->y; switch(edge) { case 0: ret->y=p1->y+(r->l.x-p1->x)*dy/dx; ret->x=r->l.x; break; case 1: ret->y=p1->y+(r->h.x-p1->x)*dy/dx; ret->x=r->h.x; break; case 2: ret->x=p1->x+(r->l.y-p1->y)*dx/dy; ret->y=r->l.y; break; case 3: ret->x=p1->x+(r->h.y-p1->y)*dx/dy; ret->y=r->h.y; break; } } void geom_init() { } navit-0.5.0~svn5643+dfsg.1/navit/geom.h000066400000000000000000000052251221777731700174250ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GEOM_H #define NAVIT_GEOM_H #ifdef __cplusplus extern "C" { #endif #include #include "config.h" #include "coord.h" #include "item.h" #include "attr.h" #define sq(x) ((double)(x)*(x)) struct rect {struct coord l,h;}; enum geom_poly_segment_type { geom_poly_segment_type_none, geom_poly_segment_type_way_inner, geom_poly_segment_type_way_outer, geom_poly_segment_type_way_left_side, geom_poly_segment_type_way_right_side, geom_poly_segment_type_way_unknown, }; struct geom_poly_segment { enum geom_poly_segment_type type; struct coord *first,*last; }; /* prototypes */ void geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse); void geom_coord_revert(struct coord *c, int count); int geom_line_middle(struct coord *p, int count, struct coord *c); long long geom_poly_area(struct coord *c, int count); int geom_poly_centroid(struct coord *c, int count, struct coord *r); int geom_poly_point_inside(struct coord *cp, int count, struct coord *c); int geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c); GList *geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third); void geom_poly_segment_destroy(struct geom_poly_segment *seg); GList *geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg); int geom_poly_segment_compatible(struct geom_poly_segment *s1, struct geom_poly_segment *s2, int dir); GList *geom_poly_segments_sort(GList *in, enum geom_poly_segment_type type); int geom_poly_segments_point_inside(GList *in, struct coord *c); int geom_clip_line_code(struct coord *p1, struct coord *p2, struct rect *r); int geom_is_inside(struct coord *p, struct rect *r, int edge); void geom_poly_intersection(struct coord *p1, struct coord *p2, struct rect *r, int edge, struct coord *ret); void geom_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/glib_slice.h000066400000000000000000000003361221777731700205700ustar00rootroot00000000000000#include #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 10 #define g_slice_alloc0 g_malloc0 #define g_slice_new0(x) g_new0(x,1) #define g_slice_free(x,y) g_free(y) #define g_slice_free1(x,y) g_free(y) #endif navit-0.5.0~svn5643+dfsg.1/navit/graphics.c000066400000000000000000002171741221777731700203010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ //############################################################################################################## //# //# File: graphics.c //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //# //############################################################################################################## #include #include #include #include #include "config.h" #include "debug.h" #include "string.h" #include "draw_info.h" #include "point.h" #include "graphics.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "coord.h" #include "transform.h" #include "plugin.h" #include "profile.h" #include "mapset.h" #include "layout.h" #include "route.h" #include "util.h" #include "callback.h" #include "file.h" #include "event.h" //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics { struct graphics* parent; struct graphics_priv *priv; struct graphics_methods meth; char *default_font; int font_len; struct graphics_font **font; struct graphics_gc *gc[3]; struct attr **attrs; struct callback_list *cbl; struct point_rect r; int gamma,brightness,contrast; int colormgmt; int font_size; GList *selection; int disabled; /* * Counter for z_order of displayitems; */ int current_z_order; GHashTable *image_cache_hash; }; struct display_context { struct graphics *gra; struct element *e; struct graphics_gc *gc; struct graphics_gc *gc_background; struct graphics_image *img; enum projection pro; int mindist; struct transformation *trans; enum item_type type; int maxlen; }; #define HASH_SIZE 1024 struct hash_entry { enum item_type type; struct displayitem *di; }; struct displaylist { int busy; int workload; struct callback *cb; struct layout *layout, *layout_hashed; struct display_context dc; int order, order_hashed, max_offset; struct mapset *ms; struct mapset_handle *msh; struct map *m; int conv; struct map_selection *sel; struct map_rect *mr; struct callback *idle_cb; struct event_idle *idle_ev; unsigned int seq; struct hash_entry hash_entries[HASH_SIZE]; }; struct displaylist_icon_cache { unsigned int seq; }; static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir); static void graphics_process_selection(struct graphics *gra, struct displaylist *dl); static void graphics_gc_init(struct graphics *this_); static void clear_hash(struct displaylist *dl) { int i; for (i = 0 ; i < HASH_SIZE ; i++) dl->hash_entries[i].type=type_none; } static struct hash_entry * get_hash_entry(struct displaylist *dl, enum item_type type) { int hashidx=(type*2654435761UL) & (HASH_SIZE-1); int offset=dl->max_offset; do { if (!dl->hash_entries[hashidx].type) return NULL; if (dl->hash_entries[hashidx].type == type) return &dl->hash_entries[hashidx]; hashidx=(hashidx+1)&(HASH_SIZE-1); } while (offset-- > 0); return NULL; } static struct hash_entry * set_hash_entry(struct displaylist *dl, enum item_type type) { int hashidx=(type*2654435761UL) & (HASH_SIZE-1); int offset=0; for (;;) { if (!dl->hash_entries[hashidx].type) { dl->hash_entries[hashidx].type=type; if (dl->max_offset < offset) dl->max_offset=offset; return &dl->hash_entries[hashidx]; } if (dl->hash_entries[hashidx].type == type) return &dl->hash_entries[hashidx]; hashidx=(hashidx+1)&(HASH_SIZE-1); offset++; } return NULL; } static int graphics_set_attr_do(struct graphics *gra, struct attr *attr) { switch (attr->type) { case attr_gamma: gra->gamma=attr->u.num; break; case attr_brightness: gra->brightness=attr->u.num; break; case attr_contrast: gra->contrast=attr->u.num; break; case attr_font_size: gra->font_size=attr->u.num; return 1; default: return 0; } gra->colormgmt=(gra->gamma != 65536 || gra->brightness != 0 || gra->contrast != 65536); graphics_gc_init(gra); return 1; } int graphics_set_attr(struct graphics *gra, struct attr *attr) { int ret=1; dbg(0,"enter\n"); if (gra->meth.set_attr) ret=gra->meth.set_attr(gra->priv, attr); if (!ret) ret=graphics_set_attr_do(gra, attr); return ret != 0; } void graphics_set_rect(struct graphics *gra, struct point_rect *pr) { gra->r=*pr; } /** * Creates a new graphics object * attr type required * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct graphics * graphics_new(struct attr *parent, struct attr **attrs) { struct graphics *this_; struct attr *type_attr; struct graphics_priv * (*graphicstype_new)(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl); if (! (type_attr=attr_search(attrs, NULL, attr_type))) { return NULL; } graphicstype_new=plugin_get_graphics_type(type_attr->u.str); if (! graphicstype_new) return NULL; this_=g_new0(struct graphics, 1); this_->cbl=callback_list_new(); this_->priv=(*graphicstype_new)(parent->u.navit, &this_->meth, attrs, this_->cbl); this_->attrs=attr_list_dup(attrs); this_->brightness=0; this_->contrast=65536; this_->gamma=65536; this_->font_size=20; this_->image_cache_hash = g_hash_table_new_full(g_str_hash, g_str_equal,g_free,g_free); while (*attrs) { graphics_set_attr_do(this_,*attrs); attrs++; } return this_; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct graphics * graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int alpha, int wraparound) { struct graphics *this_; struct point_rect pr; if (!parent->meth.overlay_new) return NULL; this_=g_new0(struct graphics, 1); this_->priv=parent->meth.overlay_new(parent->priv, &this_->meth, p, w, h, alpha, wraparound); this_->image_cache_hash = parent->image_cache_hash; this_->parent = parent; pr.lu.x=0; pr.lu.y=0; pr.rl.x=w; pr.rl.y=h; this_->font_size=20; graphics_set_rect(this_, &pr); if (!this_->priv) { g_free(this_); this_=NULL; } return this_; } /** * @brief Alters the size, position, alpha and wraparound for an overlay * * @param this_ The overlay's graphics struct * @param p The new position of the overlay * @param w The new width of the overlay * @param h The new height of the overlay * @param alpha The new alpha of the overlay * @param wraparound The new wraparound of the overlay */ void graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int alpha, int wraparound) { if (! this_->meth.overlay_resize) { return; } this_->meth.overlay_resize(this_->priv, p, w, h, alpha, wraparound); } static void graphics_gc_init(struct graphics *this_) { struct color background={ COLOR_BACKGROUND_ }; struct color black={ COLOR_BLACK_ }; struct color white={ COLOR_WHITE_ }; if (!this_->gc[0] || !this_->gc[1] || !this_->gc[2]) return; graphics_gc_set_background(this_->gc[0], &background ); graphics_gc_set_foreground(this_->gc[0], &background ); graphics_gc_set_background(this_->gc[1], &black ); graphics_gc_set_foreground(this_->gc[1], &white ); graphics_gc_set_background(this_->gc[2], &white ); graphics_gc_set_foreground(this_->gc[2], &black ); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_init(struct graphics *this_) { if (this_->gc[0]) return; this_->gc[0]=graphics_gc_new(this_); this_->gc[1]=graphics_gc_new(this_); this_->gc[2]=graphics_gc_new(this_); graphics_gc_init(this_); graphics_background_gc(this_, this_->gc[0]); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void * graphics_get_data(struct graphics *this_, const char *type) { return (this_->meth.get_data(this_->priv, type)); } void graphics_add_callback(struct graphics *this_, struct callback *cb) { callback_list_add(this_->cbl, cb); } void graphics_remove_callback(struct graphics *this_, struct callback *cb) { callback_list_remove(this_->cbl, cb); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_font * graphics_font_new(struct graphics *gra, int size, int flags) { struct graphics_font *this_; this_=g_new0(struct graphics_font,1); this_->priv=gra->meth.font_new(gra->priv, &this_->meth, gra->default_font, size, flags); return this_; } struct graphics_font * graphics_named_font_new(struct graphics *gra, char *font, int size, int flags) { struct graphics_font *this_; this_=g_new0(struct graphics_font,1); this_->priv=gra->meth.font_new(gra->priv, &this_->meth, font, size, flags); return this_; } void graphics_font_destroy(struct graphics_font *gra_font) { if(!gra_font) return; gra_font->meth.font_destroy(gra_font->priv); g_free(gra_font); } /** * Destroy graphics * Called when navit exits * @param gra The graphics instance * @returns nothing * @author David Tegze (02/2011) */ void graphics_free(struct graphics *gra) { if (!gra) return; /* If it's not an overlay, free the image cache. */ if(!gra->parent) { struct graphics_image *img; GList *ll, *l; /* We can't specify context (pointer to struct graphics) for g_hash_table_new to have it passed to free function so we have to free img->priv manually, the rest would be freed by g_hash_table_destroy. GHashTableIter isn't used because it broke n800 build at r5107. */ for(ll=l=g_hash_to_list(gra->image_cache_hash);l;l=g_list_next(l)) { img=l->data; if (img && gra->meth.image_free) gra->meth.image_free(gra->priv, img->priv); } g_list_free(ll); g_hash_table_destroy(gra->image_cache_hash); } attr_list_free(gra->attrs); graphics_gc_destroy(gra->gc[0]); graphics_gc_destroy(gra->gc[1]); graphics_gc_destroy(gra->gc[2]); g_free(gra->default_font); graphics_font_destroy_all(gra); g_free(gra->font); gra->meth.graphics_destroy(gra->priv); g_free(gra); } /** * Free all loaded fonts. * Used when switching layouts. * @param gra The graphics instance * @returns nothing * @author Sarah Nordstrom (05/2008) */ void graphics_font_destroy_all(struct graphics *gra) { int i; for(i = 0 ; i < gra->font_len; i++) { if(!gra->font[i]) continue; gra->font[i]->meth.font_destroy(gra->font[i]->priv); g_free(gra->font[i]); gra->font[i] = NULL; } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_gc * graphics_gc_new(struct graphics *gra) { struct graphics_gc *this_; this_=g_new0(struct graphics_gc,1); this_->priv=gra->meth.gc_new(gra->priv, &this_->meth); this_->gra=gra; return this_; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_destroy(struct graphics_gc *gc) { if (!gc) return; gc->meth.gc_destroy(gc->priv); g_free(gc); } static void graphics_convert_color(struct graphics *gra, struct color *in, struct color *out) { *out=*in; if (gra->brightness) { out->r+=gra->brightness; out->g+=gra->brightness; out->b+=gra->brightness; } if (gra->contrast != 65536) { out->r=out->r*gra->contrast/65536; out->g=out->g*gra->contrast/65536; out->b=out->b*gra->contrast/65536; } if (out->r < 0) out->r=0; if (out->r > 65535) out->r=65535; if (out->g < 0) out->g=0; if (out->g > 65535) out->g=65535; if (out->b < 0) out->b=0; if (out->b > 65535) out->b=65535; if (gra->gamma != 65536) { out->r=pow(out->r/65535.0,gra->gamma/65536.0)*65535.0; out->g=pow(out->g/65535.0,gra->gamma/65536.0)*65535.0; out->b=pow(out->b/65535.0,gra->gamma/65536.0)*65535.0; } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c) { struct color cn; if (gc->gra->colormgmt) { graphics_convert_color(gc->gra, c, &cn); c=&cn; } gc->meth.gc_set_foreground(gc->priv, c); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_background(struct graphics_gc *gc, struct color *c) { struct color cn; if (gc->gra->colormgmt) { graphics_convert_color(gc->gra, c, &cn); c=&cn; } gc->meth.gc_set_background(gc->priv, c); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_stipple(struct graphics_gc *gc, struct graphics_image *img) { gc->meth.gc_set_stipple(gc->priv, img ? img->priv : NULL); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_linewidth(struct graphics_gc *gc, int width) { gc->meth.gc_set_linewidth(gc->priv, width); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n) { if (gc->meth.gc_set_dashes) gc->meth.gc_set_dashes(gc->priv, width, offset, dash_list, n); } /** * Create a new image from file path scaled to w and h pixels * @param gra the graphics instance * @param path path of the image to load * @param w width to rescale to * @param h height to rescale to * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_image * graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h) { return graphics_image_new_scaled_rotated(gra, path, w, h, 0); } static void image_new_helper(struct graphics *gra, struct graphics_image *this_, char *path, char *name, int width, int height, int rotate, int zip) { int i; for (i = 1 ; i <= 6 ; i++) { char *new_name=NULL; switch (i) { case 1: /* The best variant both for cpu usage and quality would be prescaled png of a needed size */ if (width != -1 && height != -1) { new_name=g_strdup_printf("%s_%d_%d.png", name, width, height); } break; case 2: /* Try to load image by the exact name given by user. For example, if she wants to scale some prescaled png variant to a new size given as function params, or have default png image to be displayed unscaled. */ new_name=g_strdup(path); break; case 3: /* Next, try uncompressed and compressed svgs as they should give best quality but rendering might take more cpu resources when the image is displayed for the first time */ new_name=g_strdup_printf("%s.svg", name); break; case 4: new_name=g_strdup_printf("%s.svgz", name); break; case 5: /* Scaling the default png to the needed size may give some quality loss */ new_name=g_strdup_printf("%s.png", name); break; case 6: /* xpm format is used as a last resort, because its not widely supported and we are moving to svg and png formats */ new_name=g_strdup_printf("%s.xpm", name); break; } if (! new_name) continue; this_->width=width; this_->height=height; dbg(2,"Trying to load image '%s' for '%s' at %dx%d\n", new_name, path, width, height); if (zip) { unsigned char *start; int len; if (file_get_contents(new_name, &start, &len)) { struct graphics_image_buffer buffer={"buffer:",graphics_image_type_unknown}; buffer.start=start; buffer.len=len; this_->priv=gra->meth.image_new(gra->priv, &this_->meth, (char *)&buffer, &this_->width, &this_->height, &this_->hot, rotate); g_free(start); } } else { if (strcmp(new_name,"buffer:")) this_->priv=gra->meth.image_new(gra->priv, &this_->meth, new_name, &this_->width, &this_->height, &this_->hot, rotate); } if (this_->priv) { dbg(1,"Using image '%s' for '%s' at %dx%d\n", new_name, path, width, height); g_free(new_name); break; } g_free(new_name); } } /** * Create a new image from file path scaled to w and h pixels and possibly rotated * @param gra the graphics instance * @param path path of the image to load * @param w width to rescale to * @param h height to rescale to * @param rotate angle to rotate the image. Warning, graphics might only support 90 degree steps here * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate) { struct graphics_image *this_; char* hash_key = g_strdup_printf("%s*%d*%d*%d",path,w,h,rotate); if ( g_hash_table_lookup_extended( gra->image_cache_hash, hash_key, NULL, (gpointer)&this_) ) { g_free(hash_key); dbg(3,"Found cached image%sfor '%s'\n",this_?" ":" miss ",path); return this_; } this_=g_new0(struct graphics_image,1); this_->height=h; this_->width=w; if(!this_->priv) { char *ext; char *s, *name; int len=strlen(path); int i,k; int newwidth=-1, newheight=-1; ext=g_utf8_strrchr(path,-1,'.'); i=path-ext+len; /* Dont allow too long or too short file name extensions*/ if(ext && ((i>5) || (i<1))) ext=NULL; /* Search for _w_h name part, begin from char before extension if it exists */ if(ext) s=ext-1; else s=path+len; k=1; while(s>path && g_ascii_isdigit(*s)) { if(newheight<0) newheight=0; newheight+=(*s-'0')*k; k*=10; s--; } if(k>1 && s>path && *s=='_') { k=1; s--; while(s>path && g_ascii_isdigit(*s)) { if(newwidth<0) newwidth=0; newwidth+=(*s-'0')*k;; k*=10; s--; } } if(k==1 || s<=path || *s!='_') { newwidth=-1; newheight=-1; if(ext) s=ext; else s=path+len; } /* If exact h and w values were given as function parameters, they take precedence over values guessed from the image name */ if(w!=-1) newwidth=w; if(h!=-1) newheight=h; name=g_strndup(path,s-path); #if 0 if (!strstr(name,"test.zip")) #endif image_new_helper(gra, this_, path, name, newwidth, newheight, rotate, 0); if (!this_->priv && strstr(path, ".zip/")) image_new_helper(gra, this_, path, name, newwidth, newheight, rotate, 1); g_free(name); } if (! this_->priv) { dbg(0,"No image for '%s'\n", path); g_free(this_); this_=NULL; } g_hash_table_insert(gra->image_cache_hash, hash_key, (gpointer)this_ ); return this_; } /** * Create a new image from file path * @param gra the graphics instance * @param path path of the image to load * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_image * graphics_image_new(struct graphics *gra, char *path) { return graphics_image_new_scaled_rotated(gra, path, -1, -1, 0); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_image_free(struct graphics *gra, struct graphics_image *img) { /* Image is cached inside gra->image_cache_hash. So it would be freed only when graphics is destroyed => Do nothing here. */ } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_restore(struct graphics *this_, struct point *p, int w, int h) { this_->meth.draw_restore(this_->priv, p, w, h); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode) { this_->meth.draw_mode(this_->priv, mode); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count) { this_->meth.draw_lines(this_->priv, gc->priv, p, count); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r) { struct point *pnt=g_alloca(sizeof(struct point)*(r*4+64)); int i=0; if(this_->meth.draw_circle) this_->meth.draw_circle(this_->priv, gc->priv, p, r); else { draw_circle(p, r, 0, -1, 1026, pnt, &i, 1); pnt[i] = pnt[0]; i++; this_->meth.draw_lines(this_->priv, gc->priv, pnt, i); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h) { this_->meth.draw_rectangle(this_->priv, gc->priv, p, w, h); } void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill) { struct point *p=g_alloca(sizeof(struct point)*(r*4+32)); struct point pi0={plu->x+r,plu->y+r}; struct point pi1={plu->x+w-r,plu->y+r}; struct point pi2={plu->x+w-r,plu->y+h-r}; struct point pi3={plu->x+r,plu->y+h-r}; int i=0; draw_circle(&pi2, r*2, 0, -1, 258, p, &i, 1); draw_circle(&pi1, r*2, 0, 255, 258, p, &i, 1); draw_circle(&pi0, r*2, 0, 511, 258, p, &i, 1); draw_circle(&pi3, r*2, 0, 767, 258, p, &i, 1); p[i]=p[0]; i++; if (fill) this_->meth.draw_polygon(this_->priv, gc->priv, p, i); else this_->meth.draw_lines(this_->priv, gc->priv, p, i); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy) { this_->meth.draw_text(this_->priv, gc1->priv, gc2 ? gc2->priv : NULL, font->priv, text, p, dx, dy); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate) { this_->meth.get_text_bbox(this_->priv, font->priv, text, dx, dy, ret, estimate); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_overlay_disable(struct graphics *this_, int disable) { this_->disabled = disable; if (this_->meth.overlay_disable) this_->meth.overlay_disable(this_->priv, disable); } int graphics_is_disabled(struct graphics *this_) { return this_->disabled || (this_->parent && this_->parent->disabled); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img) { this_->meth.draw_image(this_->priv, gc->priv, p, img->priv); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## int graphics_draw_drag(struct graphics *this_, struct point *p) { if (!this_->meth.draw_drag) return 0; this_->meth.draw_drag(this_->priv, p); return 1; } void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc) { this_->meth.background_gc(this_->priv, gc ? gc->priv : NULL); } #include "attr.h" #include "popup.h" #include #if 0 //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void popup_view_html(struct popup_item *item, char *file) { char command[1024]; sprintf(command,"firefox %s", file); system(command); } struct transformatin *tg; enum projection pg; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void graphics_popup(struct display_list *list, struct popup_item **popup) { struct item *item; struct attr attr; struct map_rect *mr; struct coord c; struct popup_item *curr_item,*last=NULL; item=list->data; mr=map_rect_new(item->map, NULL, NULL, 0); printf("id hi=0x%x lo=0x%x\n", item->id_hi, item->id_lo); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if (item) { if (item_attr_get(item, attr_name, &attr)) { curr_item=popup_item_new_text(popup,attr.u.str,1); if (item_attr_get(item, attr_info_html, &attr)) { popup_item_new_func(&last,"HTML Info",1, popup_view_html, g_strdup(attr.u.str)); } if (item_attr_get(item, attr_price_html, &attr)) { popup_item_new_func(&last,"HTML Preis",2, popup_view_html, g_strdup(attr.u.str)); } curr_item->submenu=last; } } map_rect_destroy(mr); } #endif /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displayitem { struct displayitem *next; struct item item; char *label; int z_order; int count; struct coord c[0]; }; /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_free(struct displaylist *dl) { int i; for (i = 0 ; i < HASH_SIZE ; i++) { struct displayitem *di=dl->hash_entries[i].di; while (di) { struct displayitem *next=di->next; g_free(di); di=next; } dl->hash_entries[i].di=NULL; } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void display_add(struct hash_entry *entry, struct item *item, int count, struct coord *c, char **label, int label_count) { struct displayitem *di; int len,i; char *p; len=sizeof(*di)+count*sizeof(*c); if (label && label_count) { for (i = 0 ; i < label_count ; i++) { if (label[i]) len+=strlen(label[i])+1; else len++; } } p=g_malloc(len); di=(struct displayitem *)p; p+=sizeof(*di)+count*sizeof(*c); di->item=*item; di->z_order=0; if (label && label_count) { di->label=p; for (i = 0 ; i < label_count ; i++) { if (label[i]) { strcpy(p, label[i]); p+=strlen(label[i])+1; } else *p++='\0'; } } else di->label=NULL; di->count=count; memcpy(di->c, c, count*sizeof(*c)); di->next=entry->di; entry->di=di; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void label_line(struct graphics *gra, struct graphics_gc *fg, struct graphics_gc *bg, struct graphics_font *font, struct point *p, int count, char *label) { int i,x,y,tl,tlm,th,thm,tlsq,l; float lsq; double dx,dy; struct point p_t; struct point pb[5]; if (gra->meth.get_text_bbox) { gra->meth.get_text_bbox(gra->priv, font->priv, label, 0x10000, 0x0, pb, 1); tl=(pb[2].x-pb[0].x); th=(pb[0].y-pb[1].y); } else { tl=strlen(label)*4; th=8; } tlm=tl*32; thm=th*36; tlsq = tlm*tlm; for (i = 0 ; i < count-1 ; i++) { dx=p[i+1].x-p[i].x; dx*=32; dy=p[i+1].y-p[i].y; dy*=32; lsq = dx*dx+dy*dy; if (lsq > tlsq) { l=(int)sqrtf(lsq); x=p[i].x; y=p[i].y; if (dx < 0) { dx=-dx; dy=-dy; x=p[i+1].x; y=p[i+1].y; } x+=(l-tlm)*dx/l/64; y+=(l-tlm)*dy/l/64; x-=dy*thm/l/64; y+=dx*thm/l/64; p_t.x=x; p_t.y=y; #if 0 dbg(0,"display_text: '%s', %d, %d, %d, %d %d\n", label, x, y, dx*0x10000/l, dy*0x10000/l, l); #endif if (x < gra->r.rl.x && x + tl > gra->r.lu.x && y + tl > gra->r.lu.y && y - tl < gra->r.rl.y) gra->meth.draw_text(gra->priv, fg->priv, bg?bg->priv:NULL, font->priv, label, &p_t, dx*0x10000/l, dy*0x10000/l); } } } static void display_draw_arrow(struct point *p, int dx, int dy, int l, struct graphics_gc *gc, struct graphics *gra) { struct point pnt[3]; pnt[0]=pnt[1]=pnt[2]=*p; pnt[0].x+=-dx*l/65536+dy*l/65536; pnt[0].y+=-dy*l/65536-dx*l/65536; pnt[2].x+=-dx*l/65536-dy*l/65536; pnt[2].y+=-dy*l/65536+dx*l/65536; gra->meth.draw_lines(gra->priv, gc->priv, pnt, 3); } static void display_draw_arrows(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int count) { int i,dx,dy,l; struct point p; for (i = 0 ; i < count-1 ; i++) { dx=pnt[i+1].x-pnt[i].x; dy=pnt[i+1].y-pnt[i].y; l=sqrt(dx*dx+dy*dy); if (l) { dx=dx*65536/l; dy=dy*65536/l; p=pnt[i]; p.x+=dx*15/65536; p.y+=dy*15/65536; display_draw_arrow(&p, dx, dy, 10, gc, gra); p=pnt[i+1]; p.x-=dx*15/65536; p.y-=dy*15/65536; display_draw_arrow(&p, dx, dy, 10, gc, gra); } } } static int intersection(struct point * a1, int adx, int ady, struct point * b1, int bdx, int bdy, struct point * res) { int n, a, b; dbg(1,"%d,%d - %d,%d x %d,%d-%d,%d\n",a1->x,a1->y,a1->x+adx,a1->y+ady,b1->x,b1->y,b1->x+bdx,b1->y+bdy); n = bdy * adx - bdx * ady; a = bdx * (a1->y - b1->y) - bdy * (a1->x - b1->x); b = adx * (a1->y - b1->y) - ady * (a1->x - b1->x); dbg(1,"a %d b %d n %d\n",a,b,n); if (n < 0) { n = -n; a = -a; b = -b; } #if 0 if (a < 0 || b < 0) return 0; if (a > n || b > n) return 0; #endif if (n == 0) return 0; res->x = a1->x + a * adx / n; res->y = a1->y + a * ady / n; dbg(1,"%d,%d\n",res->x,res->y); return 1; } struct circle { short x,y,fowler; } circle64[]={ {0,128,0}, {13,127,13}, {25,126,25}, {37,122,38}, {49,118,53}, {60,113,67}, {71,106,85}, {81,99,104}, {91,91,128}, {99,81,152}, {106,71,171}, {113,60,189}, {118,49,203}, {122,37,218}, {126,25,231}, {127,13,243}, {128,0,256}, {127,-13,269}, {126,-25,281}, {122,-37,294}, {118,-49,309}, {113,-60,323}, {106,-71,341}, {99,-81,360}, {91,-91,384}, {81,-99,408}, {71,-106,427}, {60,-113,445}, {49,-118,459}, {37,-122,474}, {25,-126,487}, {13,-127,499}, {0,-128,512}, {-13,-127,525}, {-25,-126,537}, {-37,-122,550}, {-49,-118,565}, {-60,-113,579}, {-71,-106,597}, {-81,-99,616}, {-91,-91,640}, {-99,-81,664}, {-106,-71,683}, {-113,-60,701}, {-118,-49,715}, {-122,-37,730}, {-126,-25,743}, {-127,-13,755}, {-128,0,768}, {-127,13,781}, {-126,25,793}, {-122,37,806}, {-118,49,821}, {-113,60,835}, {-106,71,853}, {-99,81,872}, {-91,91,896}, {-81,99,920}, {-71,106,939}, {-60,113,957}, {-49,118,971}, {-37,122,986}, {-25,126,999}, {-13,127,1011}, }; static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir) { struct circle *c; #if 0 dbg(0,"diameter=%d start=%d len=%d pos=%d dir=%d\n", diameter, start, len, *pos, dir); #endif int count=64; int end=start+len; int i,step; c=circle64; if (diameter > 128) step=1; else if (diameter > 64) step=2; else if (diameter > 24) step=4; else if (diameter > 8) step=8; else step=16; if (len > 0) { while (start < 0) { start+=1024; end+=1024; } while (end > 0) { i=0; while (i < count && c[i].fowler <= start) i+=step; while (i < count && c[i].fowler < end) { if (1< *pos || 0x+((c[i].x*diameter+128)>>8); res[*pos].y=pnt->y+((c[i].y*diameter+128)>>8); (*pos)+=dir; } i+=step; } end-=1024; start-=1024; } } else { while (start > 1024) { start-=1024; end-=1024; } while (end < 1024) { i=count-1; while (i >= 0 && c[i].fowler >= start) i-=step; while (i >= 0 && c[i].fowler > end) { if (1< *pos || 0x+((c[i].x*diameter+128)>>8); res[*pos].y=pnt->y+((c[i].y*diameter+128)>>8); (*pos)+=dir; } i-=step; } start+=1024; end+=1024; } } } static int fowler(int dy, int dx) { int adx, ady; /* Absolute Values of Dx and Dy */ int code; /* Angular Region Classification Code */ adx = (dx < 0) ? -dx : dx; /* Compute the absolute values. */ ady = (dy < 0) ? -dy : dy; code = (adx < ady) ? 1 : 0; if (dx < 0) code += 2; if (dy < 0) code += 4; switch (code) { case 0: return (dx == 0) ? 0 : 128*ady / adx; /* [ 0, 45] */ case 1: return (256 - (128*adx / ady)); /* ( 45, 90] */ case 3: return (256 + (128*adx / ady)); /* ( 90,135) */ case 2: return (512 - (128*ady / adx)); /* [135,180] */ case 6: return (512 + (128*ady / adx)); /* (180,225] */ case 7: return (768 - (128*adx / ady)); /* (225,270) */ case 5: return (768 + (128*adx / ady)); /* [270,315) */ case 4: return (1024 - (128*ady / adx));/* [315,360) */ } return 0; } static int int_sqrt(unsigned int n) { unsigned int h, p= 0, q= 1, r= n; /* avoid q rollover */ if(n >= (1<<(sizeof(n)*8-2))) { q = 1<<(sizeof(n)*8-2); } else { while ( q <= n ) { q <<= 2; } q >>= 2; } while ( q != 0 ) { h = p + q; p >>= 1; if ( r >= h ) { p += q; r -= h; } q >>= 2; } return p; } #if 0 static void debug_line(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int dx, int dy) { struct point p[2]; p[0]=p[1]=*pnt; p[1].x+=dx; p[1].y+=dy; gra->meth.draw_lines(gra->priv, gc->priv, p, 2); } static void debug_point(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int s) { struct point p[4]; p[0]=p[1]=p[2]=*pnt; p[0].x-=s; p[0].y+=s; p[1].x+=s; p[1].y+=s; p[2].y-=s; p[3]=p[0]; gra->meth.draw_lines(gra->priv, gc->priv, p, 4); } #endif struct draw_polyline_shape { int wi; int step; int fow; int dx,dy; int dxw,dyw; int l,lscale; }; struct draw_polyline_context { int prec; int ppos,npos; struct point *res; struct draw_polyline_shape shape; struct draw_polyline_shape prev_shape; }; static void draw_shape_update(struct draw_polyline_shape *shape) { shape->dxw = -(shape->dx * shape->wi * shape->lscale) / shape->l; shape->dyw = (shape->dy * shape->wi * shape->lscale) / shape->l; } static void draw_shape(struct draw_polyline_context *ctx, struct point *pnt, int wi) { int dxs,dys,lscales; int lscale=16; int l; struct draw_polyline_shape *shape=&ctx->shape; struct draw_polyline_shape *prev=&ctx->prev_shape; #if 0 dbg(0,"enter %d,%d - %d,%d %d\n",pnt[0].x,pnt[0].y,pnt[1].x,pnt[1].y,wi); #endif *prev=*shape; if (prev->wi != wi && prev->l) { prev->wi=wi; draw_shape_update(prev); } shape->wi=wi; shape->dx = (pnt[1].x - pnt[0].x); shape->dy = (pnt[1].y - pnt[0].y); if (wi > 16) shape->step=4; else if (wi > 8) shape->step=8; else shape->step=16; #if 0 l = int_sqrt(dx * dx * lscale * lscale + dy * dy * lscale * lscale); #else dxs=shape->dx*shape->dx; dys=shape->dy*shape->dy; lscales=lscale*lscale; if (dxs + dys > lscales) l = int_sqrt(dxs+dys)*lscale; else l = int_sqrt((dxs+dys)*lscales); #endif shape->fow=fowler(-shape->dy, shape->dx); dbg(1,"fow=%d\n",shape->fow); if (! l) l=1; if (wi*lscale > 10000) lscale=10000/wi; dbg_assert(wi*lscale <= 10000); shape->l=l; shape->lscale=lscale; shape->wi=wi; draw_shape_update(shape); } static void draw_point(struct draw_polyline_shape *shape, struct point *src, struct point *dst, int pos) { if (pos) { dst->x=(src->x*2-shape->dyw)/2; dst->y=(src->y*2-shape->dxw)/2; } else { dst->x=(src->x*2+shape->dyw)/2; dst->y=(src->y*2+shape->dxw)/2; } } static void draw_begin(struct draw_polyline_context *ctx, struct point *p) { struct draw_polyline_shape *shape=&ctx->shape; int i; for (i = 0 ; i <= 32 ; i+=shape->step) { ctx->res[ctx->ppos].x=(p->x*256+(shape->dyw*circle64[i].y)+(shape->dxw*circle64[i].x))/256; ctx->res[ctx->ppos].y=(p->y*256+(shape->dxw*circle64[i].y)-(shape->dyw*circle64[i].x))/256; ctx->ppos++; } } static int draw_middle(struct draw_polyline_context *ctx, struct point *p) { int delta=ctx->prev_shape.fow-ctx->shape.fow; if (delta > 512) delta-=1024; if (delta < -512) delta+=1024; if (delta < 16 && delta > -16) { draw_point(&ctx->shape, p, &ctx->res[ctx->npos--], 0); draw_point(&ctx->shape, p, &ctx->res[ctx->ppos++], 1); return 1; } dbg(1,"delta %d\n",delta); if (delta > 0) { struct point pos,poso; draw_point(&ctx->shape, p, &pos, 1); draw_point(&ctx->prev_shape, p, &poso, 1); if (delta >= 256) return 0; if (intersection(&pos, ctx->shape.dx, ctx->shape.dy, &poso, ctx->prev_shape.dx, ctx->prev_shape.dy, &ctx->res[ctx->ppos])) { ctx->ppos++; draw_point(&ctx->prev_shape, p, &ctx->res[ctx->npos--], 0); draw_point(&ctx->shape, p, &ctx->res[ctx->npos--], 0); return 1; } } else { struct point neg,nego; draw_point(&ctx->shape, p, &neg, 0); draw_point(&ctx->prev_shape, p, &nego, 0); if (delta <= -256) return 0; if (intersection(&neg, ctx->shape.dx, ctx->shape.dy, &nego, ctx->prev_shape.dx, ctx->prev_shape.dy, &ctx->res[ctx->npos])) { ctx->npos--; draw_point(&ctx->prev_shape, p, &ctx->res[ctx->ppos++], 1); draw_point(&ctx->shape, p, &ctx->res[ctx->ppos++], 1); return 1; } } return 0; } static void draw_end(struct draw_polyline_context *ctx, struct point *p) { int i; struct draw_polyline_shape *shape=&ctx->prev_shape; for (i = 0 ; i <= 32 ; i+=shape->step) { ctx->res[ctx->npos].x=(p->x*256+(shape->dyw*circle64[i].y)-(shape->dxw*circle64[i].x))/256; ctx->res[ctx->npos].y=(p->y*256+(shape->dxw*circle64[i].y)+(shape->dyw*circle64[i].x))/256; ctx->npos--; } } static void draw_init_ctx(struct draw_polyline_context *ctx, int maxpoints) { ctx->prec=1; ctx->ppos=maxpoints/2; ctx->npos=maxpoints/2-1; } static void graphics_draw_polyline_as_polygon(struct graphics_priv *gra_priv, struct graphics_gc_priv *gc_priv, struct point *pnt, int count, int *width, void (*draw)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count)) { int maxpoints=200; struct draw_polyline_context ctx; int i=0; int max_circle_points=20; if (count < 2) return; #if 0 dbg(0,"count=%d\n",count); for (i = 0 ; i < count ; i++) dbg(0,"%d,%d width %d\n",pnt[i].x,pnt[i].y,width[i]); #endif ctx.shape.l=0; ctx.res=g_alloca(sizeof(struct point)*maxpoints); i=0; draw_init_ctx(&ctx, maxpoints); draw_shape(&ctx, pnt, *width++); draw_begin(&ctx,&pnt[0]); for (i = 1 ; i < count -1 ; i++) { draw_shape(&ctx, pnt+i, *width++); if (ctx.npos < max_circle_points || ctx.ppos >= maxpoints-max_circle_points || !draw_middle(&ctx,&pnt[i])) { draw_end(&ctx,&pnt[i]); ctx.res[ctx.npos]=ctx.res[ctx.ppos-1]; draw(gra_priv, gc_priv, ctx.res+ctx.npos, ctx.ppos-ctx.npos); draw_init_ctx(&ctx, maxpoints); draw_begin(&ctx,&pnt[i]); } } draw_shape(&ctx, &pnt[count-2], *width++); ctx.prev_shape=ctx.shape; draw_end(&ctx,&pnt[count-1]); ctx.res[ctx.npos]=ctx.res[ctx.ppos-1]; draw(gra_priv, gc_priv, ctx.res+ctx.npos, ctx.ppos-ctx.npos); } struct wpoint { int x,y,w; }; enum relative_pos { INSIDE = 0, LEFT_OF = 1, RIGHT_OF = 2, ABOVE = 4, BELOW = 8 }; static int relative_pos(struct wpoint *p, struct point_rect *r) { int relative_pos=INSIDE; if (p->x < r->lu.x) relative_pos=LEFT_OF; else if (p->x > r->rl.x) relative_pos=RIGHT_OF; if (p->y < r->lu.y) relative_pos |=ABOVE; else if (p->y > r->rl.y) relative_pos |=BELOW; return relative_pos; } static void clip_line_endoint_to_rect_edge(struct wpoint *p, int rel_pos, int dx, int dy, int dw, struct point_rect *clip_rect) { // We must cast to float to avoid integer // overflow (i.e. undefined behaviour) at high // zoom levels. if (rel_pos & LEFT_OF) { p->y+=(((float)clip_rect->lu.x)-p->x)*dy/dx; p->w+=(((float)clip_rect->lu.x)-p->x)*dw/dx; p->x=clip_rect->lu.x; } else if (rel_pos & RIGHT_OF) { p->y+=(((float)clip_rect->rl.x)-p->x)*dy/dx; p->w+=(((float)clip_rect->rl.x)-p->x)*dw/dx; p->x=clip_rect->rl.x; } else if (rel_pos & ABOVE) { p->x+=(((float)clip_rect->lu.y)-p->y)*dx/dy; p->w+=(((float)clip_rect->lu.y)-p->y)*dw/dy; p->y=clip_rect->lu.y; } else if (rel_pos & BELOW) { p->x+=(((float)clip_rect->rl.y)-p->y)*dx/dy; p->w+=(((float)clip_rect->rl.y)-p->y)*dw/dy; p->y=clip_rect->rl.y; } } enum clip_result { CLIPRES_INVISIBLE = 0, CLIPRES_VISIBLE = 1, CLIPRES_START_CLIPPED = 2, CLIPRES_END_CLIPPED = 4, }; static int clip_line(struct wpoint *p1, struct wpoint *p2, struct point_rect *clip_rect) { int rel_pos1,rel_pos2; int ret = CLIPRES_VISIBLE; int dx,dy,dw; rel_pos1=relative_pos(p1, clip_rect); if (rel_pos1!=INSIDE) ret |= CLIPRES_START_CLIPPED; rel_pos2=relative_pos(p2, clip_rect); if (rel_pos2!=INSIDE) ret |= CLIPRES_END_CLIPPED; dx=p2->x-p1->x; dy=p2->y-p1->y; dw=p2->w-p1->w; while ((rel_pos1!=INSIDE) || (rel_pos2!=INSIDE)) { if (rel_pos1 & rel_pos2) return CLIPRES_INVISIBLE; clip_line_endoint_to_rect_edge(p1, rel_pos1, dx, dy, dw, clip_rect); rel_pos1=relative_pos(p1, clip_rect); if (rel_pos1 & rel_pos2) return CLIPRES_INVISIBLE; clip_line_endoint_to_rect_edge(p2, rel_pos2, dx, dy, dw, clip_rect); rel_pos2=relative_pos(p2, clip_rect); } return ret; } static void graphics_draw_polyline_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pa, int count, int *width, int poly) { struct point *points_to_draw=g_alloca(sizeof(struct point)*(count+1)); int *w=g_alloca(sizeof(int)*(count+1)); struct wpoint segment_start,segment_end; int i,points_to_draw_cnt=0; int clip_result; int r_width, r_height; struct point_rect r=gra->r; r_width=r.rl.x-r.lu.x; r_height=r.rl.y-r.lu.y; // Expand clipping rect by 1/3 so wide, slanted lines do not // partially end before screen border. // Ideally we would expand by the line width here, but in 3D // mode the width is variable and needs clipping itself, so that // would get complicated. Anyway, 1/3 of screen size should be // enough... r.lu.x-=r_width/3; r.lu.y-=r_height/3; r.rl.x+=r_width/3; r.rl.y+=r_height/3; // Iterate over line segments, push them into points_to_draw // until we reach a completely invisible segment... for (i = 0 ; i < count ; i++) { if (i) { segment_start.x=pa[i-1].x; segment_start.y=pa[i-1].y; segment_start.w=width[(i-1)]; segment_end.x=pa[i].x; segment_end.y=pa[i].y; segment_end.w=width[i]; dbg(3, "Segment: [%d, %d] - [%d, %d]...\n", segment_start.x, segment_start.y, segment_end.x, segment_end.y); clip_result=clip_line(&segment_start, &segment_end, &r); if (clip_result != CLIPRES_INVISIBLE) { dbg(3, "....clipped to [%d, %d] - [%d, %d]\n", segment_start.x, segment_start.y, segment_end.x, segment_end.y); if ((i == 1) || (clip_result & CLIPRES_START_CLIPPED)) { points_to_draw[points_to_draw_cnt].x=segment_start.x; points_to_draw[points_to_draw_cnt].y=segment_start.y; w[points_to_draw_cnt]=segment_start.w; points_to_draw_cnt++; } points_to_draw[points_to_draw_cnt].x=segment_end.x; points_to_draw[points_to_draw_cnt].y=segment_end.y; w[points_to_draw_cnt]=segment_end.w; points_to_draw_cnt++; } if ((i == count-1) || (clip_result & CLIPRES_END_CLIPPED)) { // ... then draw the resulting polyline if (points_to_draw_cnt > 1) { if (poly) { graphics_draw_polyline_as_polygon(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt, w, gra->meth.draw_polygon); #if 0 gra->meth.draw_lines(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt); #endif } else gra->meth.draw_lines(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt); points_to_draw_cnt=0; } } } } } static int is_inside(struct point *p, struct point_rect *r, int edge) { switch(edge) { case 0: return p->x >= r->lu.x; case 1: return p->x <= r->rl.x; case 2: return p->y >= r->lu.y; case 3: return p->y <= r->rl.y; default: return 0; } } static void poly_intersection(struct point *p1, struct point *p2, struct point_rect *r, int edge, struct point *ret) { int dx=p2->x-p1->x; int dy=p2->y-p1->y; switch(edge) { case 0: ret->y=p1->y+((float)r->lu.x-p1->x)*dy/dx; ret->x=r->lu.x; break; case 1: ret->y=p1->y+((float)r->rl.x-p1->x)*dy/dx; ret->x=r->rl.x; break; case 2: ret->x=p1->x+((float)r->lu.y-p1->y)*dx/dy; ret->y=r->lu.y; break; case 3: ret->x=p1->x+((float)r->rl.y-p1->y)*dx/dy; ret->y=r->rl.y; break; } } static void graphics_draw_polygon_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pin, int count_in) { struct point_rect r=gra->r; struct point *pout,*p,*s,pi,*p1,*p2; int limit=10000; struct point *pa1=g_alloca(sizeof(struct point) * (count_in < limit ? count_in*8+1:0)); struct point *pa2=g_alloca(sizeof(struct point) * (count_in < limit ? count_in*8+1:0)); int count_out,edge=3; int i; #if 0 r.lu.x+=20; r.lu.y+=20; r.rl.x-=20; r.rl.y-=20; #endif if (count_in < limit) { p1=pa1; p2=pa2; } else { p1=g_new(struct point, count_in*8+1); p2=g_new(struct point, count_in*8+1); } pout=p1; for (edge = 0 ; edge < 4 ; edge++) { p=pin; s=pin+count_in-1; count_out=0; for (i = 0 ; i < count_in ; i++) { if (is_inside(p, &r, edge)) { if (! is_inside(s, &r, edge)) { poly_intersection(s,p,&r,edge,&pi); pout[count_out++]=pi; } pout[count_out++]=*p; } else { if (is_inside(s, &r, edge)) { poly_intersection(p,s,&r,edge,&pi); pout[count_out++]=pi; } } s=p; p++; } count_in=count_out; if (pin == p1) { pin=p2; pout=p1; } else { pin=p1; pout=p2; } } gra->meth.draw_polygon(gra->priv, gc->priv, pin, count_in); if (count_in >= limit) { g_free(p1); g_free(p2); } } static void display_context_free(struct display_context *dc) { if (dc->gc) graphics_gc_destroy(dc->gc); if (dc->gc_background) graphics_gc_destroy(dc->gc_background); if (dc->img) graphics_image_free(dc->gra, dc->img); dc->gc=NULL; dc->gc_background=NULL; dc->img=NULL; } static struct graphics_font * get_font(struct graphics *gra, int size) { if (size > 64) size=64; if (size >= gra->font_len) { gra->font=g_renew(struct graphics_font *, gra->font, size+1); while (gra->font_len <= size) gra->font[gra->font_len++]=NULL; } if (! gra->font[size]) gra->font[size]=graphics_font_new(gra, size*gra->font_size, 0); return gra->font[size]; } void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p) { struct graphics_font *font=get_font(this_, text_size); struct point bbox[4]; int i; graphics_get_text_bbox(this_, font, text, 0x10000, 0, bbox, 0); for (i = 0 ; i < 4 ; i++) { bbox[i].x+=p->x; bbox[i].y+=p->y; } graphics_draw_rectangle(this_, this_->gc[2], &bbox[1], bbox[2].x-bbox[0].x, bbox[0].y-bbox[1].y+5); graphics_draw_text(this_, this_->gc[1], this_->gc[2], font, text, p, 0x10000, 0); } char * graphics_icon_path(const char *icon) { static char *navit_sharedir; char *ret=NULL; struct file_wordexp *wordexp=NULL; dbg(1,"enter %s\n",icon); if (strchr(icon, '$')) { wordexp=file_wordexp_new(icon); if (file_wordexp_get_count(wordexp)) icon=file_wordexp_get_array(wordexp)[0]; } if (strchr(icon,'/')) ret=g_strdup(icon); else { #ifdef HAVE_API_ANDROID // get resources for the correct screen density // // this part not needed, android unpacks only the correct version into res/drawable dir! // dbg(1,"android icon_path %s\n",icon); // static char *android_density; // android_density = getenv("ANDROID_DENSITY"); // ret=g_strdup_printf("res/drawable-%s/%s",android_density ,icon); ret=g_strdup_printf("res/drawable/%s" ,icon); #else if (! navit_sharedir) navit_sharedir = getenv("NAVIT_SHAREDIR"); ret=g_strdup_printf("%s/xpm/%s", navit_sharedir, icon); #endif } if (wordexp) file_wordexp_destroy(wordexp); return ret; } static int limit_count(struct coord *c, int count) { int i; for (i = 1 ; i < count ; i++) { if (c[i].x == c[0].x && c[i].y == c[0].y) return i+1; } return count; } static void displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc) { int *width=g_alloca(sizeof(int)*dc->maxlen); struct point *pa=g_alloca(sizeof(struct point)*dc->maxlen); struct graphics *gra=dc->gra; struct graphics_gc *gc=dc->gc; struct element *e=dc->e; struct graphics_image *img=dc->img; struct point p; struct coord *c; char *path; while (di) { int i,count=di->count,mindist=dc->mindist; di->z_order=++(gra->current_z_order); if (! gc) { gc=graphics_gc_new(gra); graphics_gc_set_foreground(gc, &e->color); dc->gc=gc; } if (item_type_is_area(dc->type) && (dc->e->type == element_polyline || dc->e->type == element_text)) count=limit_count(di->c, count); if (dc->type == type_poly_water_tiled) mindist=0; c=di->c; #if 0 if (dc->e->type == element_polygon) { int max=1000; int offset=5600; c+=offset; count-=offset; if (count < 0) count=0; if (count > max) count=max; } #endif if (dc->e->type == element_polyline) count=transform(dc->trans, dc->pro, c, pa, count, mindist, e->u.polyline.width, width); else count=transform(dc->trans, dc->pro, c, pa, count, mindist, 0, NULL); switch (e->type) { case element_polygon: graphics_draw_polygon_clipped(gra, gc, pa, count); break; case element_polyline: { gc->meth.gc_set_linewidth(gc->priv, 1); if (e->u.polyline.width > 0 && e->u.polyline.dash_num > 0) graphics_gc_set_dashes(gc, e->u.polyline.width, e->u.polyline.offset, e->u.polyline.dash_table, e->u.polyline.dash_num); for (i = 0 ; i < count ; i++) { if (width[i] < 2) width[i]=2; } graphics_draw_polyline_clipped(gra, gc, pa, count, width, e->u.polyline.width > 1); } break; case element_circle: if (count) { if (e->u.circle.width > 1) gc->meth.gc_set_linewidth(gc->priv, e->u.polyline.width); graphics_draw_circle(gra, gc, pa, e->u.circle.radius); if (di->label && e->text_size) { struct graphics_font *font=get_font(gra, e->text_size); struct graphics_gc *gc_background=dc->gc_background; if (! gc_background && e->u.circle.background_color.a) { gc_background=graphics_gc_new(gra); graphics_gc_set_foreground(gc_background, &e->u.circle.background_color); dc->gc_background=gc_background; } p.x=pa[0].x+3; p.y=pa[0].y+10; if (font) gra->meth.draw_text(gra->priv, gc->priv, gc_background?gc_background->priv:NULL, font->priv, di->label, &p, 0x10000, 0); else dbg(0,"Failed to get font with size %d\n",e->text_size); } } break; case element_text: if (count && di->label) { struct graphics_font *font=get_font(gra, e->text_size); struct graphics_gc *gc_background=dc->gc_background; if (! gc_background && e->u.text.background_color.a) { gc_background=graphics_gc_new(gra); graphics_gc_set_foreground(gc_background, &e->u.text.background_color); dc->gc_background=gc_background; } if (font) label_line(gra, gc, gc_background, font, pa, count, di->label); else dbg(0,"Failed to get font with size %d\n",e->text_size); } break; case element_icon: if (count) { if (!img || item_is_custom_poi(di->item)) { if (item_is_custom_poi(di->item)) { char *icon; char *src; if (img) graphics_image_free(dc->gra, img); src=e->u.icon.src; if (!src || !src[0]) src="%s"; icon=g_strdup_printf(src,di->label+strlen(di->label)+1); path=graphics_icon_path(icon); g_free(icon); } else path=graphics_icon_path(e->u.icon.src); img=graphics_image_new_scaled_rotated(gra, path, e->u.icon.width, e->u.icon.height, e->u.icon.rotation); if (img) dc->img=img; else dbg(0,"failed to load icon '%s'\n", path); g_free(path); } if (img) { if (e->u.icon.x != -1 || e->u.icon.y != -1) { p.x=pa[0].x - e->u.icon.x; p.y=pa[0].y - e->u.icon.y; } else { p.x=pa[0].x - img->hot.x; p.y=pa[0].y - img->hot.y; } gra->meth.draw_image(gra->priv, gra->gc[0]->priv, &p, img->priv); } } break; case element_image: dbg(1,"image: '%s'\n", di->label); if (gra->meth.draw_image_warp) { img=graphics_image_new_scaled_rotated(gra, di->label, -1, -1, 0); if (img) gra->meth.draw_image_warp(gra->priv, gra->gc[0]->priv, pa, count, img->priv); } else dbg(0,"draw_image_warp not supported by graphics driver drawing '%s'\n", di->label); break; case element_arrows: display_draw_arrows(gra,gc,pa,count); break; default: dbg(0, "Unhandled element type %d\n", e->type); } di=di->next; } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_draw_elements(struct graphics *gra, struct displaylist *display_list, struct itemgra *itm) { struct element *e; GList *es,*types; struct display_context *dc=&display_list->dc; struct hash_entry *entry; es=itm->elements; while (es) { e=es->data; dc->e=e; types=itm->type; while (types) { dc->type=GPOINTER_TO_INT(types->data); entry=get_hash_entry(display_list, dc->type); if (entry && entry->di) { displayitem_draw(entry->di, NULL, dc); display_context_free(dc); } types=g_list_next(types); } es=g_list_next(es); } } void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label) { GList *es; struct display_context dc; int max_coord=32; char *buffer=g_alloca(sizeof(struct displayitem)+max_coord*sizeof(struct coord)); struct displayitem *di=(struct displayitem *)buffer; es=itm->elements; di->item.type=type_none; di->item.id_hi=0; di->item.id_lo=0; di->item.map=NULL; di->z_order=0; di->label=label; dc.gra=gra; dc.gc=NULL; dc.gc_background=NULL; dc.img=NULL; dc.pro=projection_screen; dc.mindist=0; dc.trans=t; dc.type=type_none; dc.maxlen=max_coord; while (es) { struct element *e=es->data; if (e->coord_count) { if (e->coord_count > max_coord) { dbg(0,"maximum number of coords reached: %d > %d\n",e->coord_count,max_coord); di->count=max_coord; } else di->count=e->coord_count; memcpy(di->c, e->coord, di->count*sizeof(struct coord)); } else { di->c[0].x=0; di->c[0].y=0; di->count=1; } dc.e=e; di->next=NULL; displayitem_draw(di, NULL, &dc); display_context_free(&dc); es=g_list_next(es); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_draw_layer(struct displaylist *display_list, struct graphics *gra, struct layer *lay, int order) { GList *itms; struct itemgra *itm; itms=lay->itemgras; while (itms) { itm=itms->data; if (order >= itm->order.min && order <= itm->order.max) xdisplay_draw_elements(gra, display_list, itm); itms=g_list_next(itms); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_draw(struct displaylist *display_list, struct graphics *gra, struct layout *l, int order) { GList *lays; struct layer *lay; gra->current_z_order=0; lays=l->layers; while (lays) { lay=lays->data; if (lay->active) { if (lay->ref) lay=lay->ref; xdisplay_draw_layer(display_list, gra, lay, order); } lays=g_list_next(lays); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ extern void *route_selection; static void displaylist_update_layers(struct displaylist *displaylist, GList *layers, int order) { while (layers) { struct layer *layer=layers->data; GList *itemgras; if (layer->ref) layer=layer->ref; itemgras=layer->itemgras; while (itemgras) { struct itemgra *itemgra=itemgras->data; GList *types=itemgra->type; if (itemgra->order.min <= order && itemgra->order.max >= order) { while (types) { enum item_type type=(enum item_type) types->data; set_hash_entry(displaylist, type); types=g_list_next(types); } } itemgras=g_list_next(itemgras); } layers=g_list_next(layers); } } static void displaylist_update_hash(struct displaylist *displaylist) { displaylist->max_offset=0; clear_hash(displaylist); displaylist_update_layers(displaylist, displaylist->layout->layers, displaylist->order); dbg(1,"max offset %d\n",displaylist->max_offset); } /** * @brief Returns selection structure based on displaylist transform, projection and order. * Use this function to get map selection if you are going to fetch complete item data from the map based on displayitem reference. * @param displaylist * @returns Pointer to selection structure */ struct map_selection *displaylist_get_selection(struct displaylist *displaylist) { return transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order); } /** * @brief Compare displayitems based on their zorder values. * Use with g_list_insert_sorted to sort less shaded items to be before more shaded ones in the result list. */ static int displaylist_cmp_zorder(const struct displayitem *a, const struct displayitem *b) { if(a->z_order>b->z_order) return -1; if(a->z_orderz_order) return 1; return 0; } /** * @brief Returns list of displayitems clicked at given coordinates. The deeper item is in current layout, the deeper it will be in the list. * @param displaylist * @param p clicked point * @param radius radius of clicked area * @returns GList of displayitems */ GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius) { GList *l=NULL; struct displayitem *di; struct displaylist_handle *dlh=graphics_displaylist_open(displaylist); while ((di=graphics_displaylist_next(dlh))) { if (di->z_order>0 && graphics_displayitem_within_dist(displaylist, di, p,radius)) l=g_list_insert_sorted(l,(gpointer) di, (GCompareFunc) displaylist_cmp_zorder); } graphics_displaylist_close(dlh); return l; } static void do_draw(struct displaylist *displaylist, int cancel, int flags) { struct item *item; int count,max=displaylist->dc.maxlen,workload=0; struct coord *ca=g_alloca(sizeof(struct coord)*max); struct attr attr,attr2; enum projection pro; if (displaylist->order != displaylist->order_hashed || displaylist->layout != displaylist->layout_hashed) { displaylist_update_hash(displaylist); displaylist->order_hashed=displaylist->order; displaylist->layout_hashed=displaylist->layout; } profile(0,NULL); pro=transform_get_projection(displaylist->dc.trans); while (!cancel) { if (!displaylist->msh) displaylist->msh=mapset_open(displaylist->ms); if (!displaylist->m) { displaylist->m=mapset_next(displaylist->msh, 1); if (!displaylist->m) { mapset_close(displaylist->msh); displaylist->msh=NULL; break; } displaylist->dc.pro=map_projection(displaylist->m); displaylist->conv=map_requires_conversion(displaylist->m); if (route_selection) displaylist->sel=route_selection; else displaylist->sel=displaylist_get_selection(displaylist); displaylist->mr=map_rect_new(displaylist->m, displaylist->sel); } if (displaylist->mr) { while ((item=map_rect_get_item(displaylist->mr))) { int label_count=0; char *labels[2]; struct hash_entry *entry; if (item == &busy_item) { if (displaylist->workload) return; else continue; } entry=get_hash_entry(displaylist, item->type); if (!entry) continue; count=item_coord_get_within_selection(item, ca, item->type < type_line ? 1: max, displaylist->sel); if (! count) continue; #if 0 dbg(0,"%s 0x%x 0x%x\n",item_to_name(item->type), item->id_hi, item->id_lo); #endif if (displaylist->dc.pro != pro) transform_from_to_count(ca, displaylist->dc.pro, ca, pro, count); if (count == max) { dbg(0,"point count overflow %d for %s "ITEM_ID_FMT"\n", count,item_to_name(item->type),ITEM_ID_ARGS(*item)); displaylist->dc.maxlen=max*2; } if (item_is_custom_poi(*item)) { if (item_attr_get(item, attr_icon_src, &attr2)) labels[1]=map_convert_string(displaylist->m, attr2.u.str); else labels[1]=NULL; label_count=2; } else { labels[1]=NULL; label_count=0; } if (item_attr_get(item, attr_label, &attr)) { labels[0]=attr.u.str; if (!label_count) label_count=2; } else labels[0]=NULL; if (displaylist->conv && label_count) { labels[0]=map_convert_string(displaylist->m, labels[0]); display_add(entry, item, count, ca, labels, label_count); map_convert_free(labels[0]); } else display_add(entry, item, count, ca, labels, label_count); if (labels[1]) map_convert_free(labels[1]); workload++; if (workload == displaylist->workload) return; } map_rect_destroy(displaylist->mr); } if (!route_selection) map_selection_destroy(displaylist->sel); displaylist->mr=NULL; displaylist->sel=NULL; displaylist->m=NULL; } profile(1,"process_selection\n"); if (displaylist->idle_ev) event_remove_idle(displaylist->idle_ev); displaylist->idle_ev=NULL; callback_destroy(displaylist->idle_cb); displaylist->idle_cb=NULL; displaylist->busy=0; graphics_process_selection(displaylist->dc.gra, displaylist); profile(1,"draw\n"); if (! cancel) graphics_displaylist_draw(displaylist->dc.gra, displaylist, displaylist->dc.trans, displaylist->layout, flags); map_rect_destroy(displaylist->mr); if (!route_selection) map_selection_destroy(displaylist->sel); mapset_close(displaylist->msh); displaylist->mr=NULL; displaylist->sel=NULL; displaylist->m=NULL; displaylist->msh=NULL; profile(1,"callback\n"); callback_call_1(displaylist->cb, cancel); profile(0,"end\n"); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags) { int order=transform_get_order(trans); if(displaylist->dc.trans && displaylist->dc.trans!=trans) transform_destroy(displaylist->dc.trans); if(displaylist->dc.trans!=trans) displaylist->dc.trans=transform_dup(trans); displaylist->dc.gra=gra; displaylist->dc.mindist=flags&512?15:2; // FIXME find a better place to set the background color if (l) { graphics_gc_set_background(gra->gc[0], &l->color); graphics_gc_set_foreground(gra->gc[0], &l->color); g_free(gra->default_font); gra->default_font = g_strdup(l->font); } graphics_background_gc(gra, gra->gc[0]); if (flags & 1) callback_list_call_attr_0(gra->cbl, attr_predraw); gra->meth.draw_mode(gra->priv, (flags & 8)?draw_mode_begin_clear:draw_mode_begin); if (!(flags & 2)) gra->meth.draw_rectangle(gra->priv, gra->gc[0]->priv, &gra->r.lu, gra->r.rl.x-gra->r.lu.x, gra->r.rl.y-gra->r.lu.y); if (l) { order+=l->order_delta; xdisplay_draw(displaylist, gra, l, order>0?order:0); } if (flags & 1) callback_list_call_attr_0(gra->cbl, attr_postdraw); if (!(flags & 4)) gra->meth.draw_mode(gra->priv, draw_mode_end); } static void graphics_load_mapset(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags) { int order=transform_get_order(trans); dbg(1,"enter"); if (displaylist->busy) { if (async == 1) return; do_draw(displaylist, 1, flags); } xdisplay_free(displaylist); dbg(1,"order=%d\n", order); displaylist->dc.gra=gra; displaylist->ms=mapset; if(displaylist->dc.trans && displaylist->dc.trans!=trans) transform_destroy(displaylist->dc.trans); if(displaylist->dc.trans!=trans) displaylist->dc.trans=transform_dup(trans); displaylist->workload=async ? 100 : 0; displaylist->cb=cb; displaylist->seq++; if (l) order+=l->order_delta; displaylist->order=order>0?order:0; displaylist->busy=1; displaylist->layout=l; if (async) { if (! displaylist->idle_cb) displaylist->idle_cb=callback_new_3(callback_cast(do_draw), displaylist, 0, flags); displaylist->idle_ev=event_add_idle(50, displaylist->idle_cb); } else do_draw(displaylist, 0, flags); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags) { graphics_load_mapset(gra, displaylist, mapset, trans, l, async, cb, flags); } int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist) { if (!displaylist->busy) return 0; do_draw(displaylist, 1, 0); return 1; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displaylist_handle { struct displaylist *dl; struct displayitem *di; int hashidx; }; /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displaylist_handle * graphics_displaylist_open(struct displaylist *displaylist) { struct displaylist_handle *ret; ret=g_new0(struct displaylist_handle, 1); ret->dl=displaylist; return ret; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displayitem * graphics_displaylist_next(struct displaylist_handle *dlh) { struct displayitem *ret; if (!dlh) return NULL; for (;;) { if (dlh->di) { ret=dlh->di; dlh->di=ret->next; break; } if (dlh->hashidx == HASH_SIZE) { ret=NULL; break; } if (dlh->dl->hash_entries[dlh->hashidx].type) dlh->di=dlh->dl->hash_entries[dlh->hashidx].di; dlh->hashidx++; } return ret; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_displaylist_close(struct displaylist_handle *dlh) { g_free(dlh); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displaylist * graphics_displaylist_new(void) { struct displaylist *ret=g_new0(struct displaylist, 1); ret->dc.maxlen=16384; return ret; } void graphics_displaylist_destroy(struct displaylist *displaylist) { if(displaylist->dc.trans) transform_destroy(displaylist->dc.trans); g_free(displaylist); } /** * Get the map item which given displayitem is based on. * NOTE: returned structure doesn't contain any attributes or coordinates. type, map, idhi and idlow seem to be the only useable members. * @param di pointer to displayitem structure * @returns Pointer to struct item * @author Martin Schaller (04/2008) */ struct item * graphics_displayitem_get_item(struct displayitem *di) { return &di->item; } /** * Get the number of this item as it was last displayed on the screen, dependent of current layout. Items with lower numbers * are shaded by items with higher ones when they overlap. Zero means item was not displayed at all. If the item is displayed twice, its topmost * occurence is used. * @param di pointer to displayitem structure * @returns z-order of current item. */ int graphics_displayitem_get_z_order(struct displayitem *di) { return di->z_order; } int graphics_displayitem_get_coord_count(struct displayitem *di) { return di->count; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ char * graphics_displayitem_get_label(struct displayitem *di) { return di->label; } int graphics_displayitem_get_displayed(struct displayitem *di) { return 1; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_point(struct point *p0, struct point *p1, int dist) { if (p0->x == 32767 || p0->y == 32767 || p1->x == 32767 || p1->y == 32767) return 0; if (p0->x == -32768 || p0->y == -32768 || p1->x == -32768 || p1->y == -32768) return 0; if ((p0->x-p1->x)*(p0->x-p1->x) + (p0->y-p1->y)*(p0->y-p1->y) <= dist*dist) { return 1; } return 0; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_line(struct point *p, struct point *line_p0, struct point *line_p1, int dist) { int vx,vy,wx,wy; int c1,c2; struct point line_p; if (line_p0->x < line_p1->x) { if (p->x < line_p0->x - dist) return 0; if (p->x > line_p1->x + dist) return 0; } else { if (p->x < line_p1->x - dist) return 0; if (p->x > line_p0->x + dist) return 0; } if (line_p0->y < line_p1->y) { if (p->y < line_p0->y - dist) return 0; if (p->y > line_p1->y + dist) return 0; } else { if (p->y < line_p1->y - dist) return 0; if (p->y > line_p0->y + dist) return 0; } vx=line_p1->x-line_p0->x; vy=line_p1->y-line_p0->y; wx=p->x-line_p0->x; wy=p->y-line_p0->y; c1=vx*wx+vy*wy; if ( c1 <= 0 ) return within_dist_point(p, line_p0, dist); c2=vx*vx+vy*vy; if ( c2 <= c1 ) return within_dist_point(p, line_p1, dist); line_p.x=line_p0->x+vx*c1/c2; line_p.y=line_p0->y+vy*c1/c2; return within_dist_point(p, &line_p, dist); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_polyline(struct point *p, struct point *line_pnt, int count, int dist, int close) { int i; for (i = 0 ; i < count-1 ; i++) { if (within_dist_line(p,line_pnt+i,line_pnt+i+1,dist)) { return 1; } } if (close) return (within_dist_line(p,line_pnt,line_pnt+count-1,dist)); return 0; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_polygon(struct point *p, struct point *poly_pnt, int count, int dist) { int i, j, c = 0; for (i = 0, j = count-1; i < count; j = i++) { if ((((poly_pnt[i].y <= p->y) && ( p->y < poly_pnt[j].y )) || ((poly_pnt[j].y <= p->y) && ( p->y < poly_pnt[i].y))) && (p->x < (poly_pnt[j].x - poly_pnt[i].x) * (p->y - poly_pnt[i].y) / (poly_pnt[j].y - poly_pnt[i].y) + poly_pnt[i].x)) c = !c; } if (! c) return within_dist_polyline(p, poly_pnt, count, dist, 1); return c; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist) { struct point *pa=g_alloca(sizeof(struct point)*displaylist->dc.maxlen); int count; count=transform(displaylist->dc.trans, displaylist->dc.pro, di->c, pa, di->count, 0, 0, NULL); if (di->item.type < type_line) { return within_dist_point(p, &pa[0], dist); } if (di->item.type < type_area) { return within_dist_polyline(p, pa, count, dist, 0); } return within_dist_polygon(p, pa, count, dist); } static void graphics_process_selection_item(struct displaylist *dl, struct item *item) { #if 0 /* FIXME */ struct displayitem di,*di_res; GHashTable *h; int count,max=dl->dc.maxlen; struct coord ca[max]; struct attr attr; struct map_rect *mr; di.item=*item; di.label=NULL; di.count=0; h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); if (h) { di_res=g_hash_table_lookup(h, &di); if (di_res) { di.item.type=(enum item_type)item->priv_data; display_add(dl, &di.item, di_res->count, di_res->c, NULL, 0); return; } } mr=map_rect_new(item->map, NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); count=item_coord_get(item, ca, item->type < type_line ? 1: max); if (!item_attr_get(item, attr_label, &attr)) attr.u.str=NULL; if (dl->conv && attr.u.str && attr.u.str[0]) { char *str=map_convert_string(item->map, attr.u.str); display_add(dl, item, count, ca, &str, 1); map_convert_free(str); } else display_add(dl, item, count, ca, &attr.u.str, 1); map_rect_destroy(mr); #endif } void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl) { struct item *item_dup=g_new(struct item, 1); *item_dup=*item; item_dup->priv_data=(void *)type; gra->selection=g_list_append(gra->selection, item_dup); if (dl) graphics_process_selection_item(dl, item_dup); } void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl) { GList *curr; int found; for (;;) { curr=gra->selection; found=0; while (curr) { struct item *sitem=curr->data; if (item_is_equal(*item,*sitem)) { #if 0 /* FIXME */ if (dl) { struct displayitem di; GHashTable *h; di.item=*sitem; di.label=NULL; di.count=0; di.item.type=type; h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); if (h) g_hash_table_remove(h, &di); } #endif g_free(sitem); gra->selection=g_list_remove(gra->selection, curr->data); found=1; break; } } if (!found) return; } } void graphics_clear_selection(struct graphics *gra, struct displaylist *dl) { while (gra->selection) { struct item *item=(struct item *)gra->selection->data; graphics_remove_selection(gra, item, (enum item_type)item->priv_data,dl); } } static void graphics_process_selection(struct graphics *gra, struct displaylist *dl) { GList *curr; curr=gra->selection; while (curr) { struct item *item=curr->data; graphics_process_selection_item(dl, item); curr=g_list_next(curr); } } navit-0.5.0~svn5643+dfsg.1/navit/graphics.h000066400000000000000000000247421221777731700203030ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GRAPHICS_H #define NAVIT_GRAPHICS_H #ifdef __cplusplus extern "C" { #endif struct attr; struct point; struct container; struct color; struct graphics; struct graphics_gc; struct graphics_font; struct graphics_image; struct transformation; struct display_list; struct mapset; enum draw_mode_num { draw_mode_begin, draw_mode_begin_clear, draw_mode_end, draw_mode_cursor, draw_mode_end_lazy }; struct graphics_priv; struct graphics_font_priv; struct graphics_image_priv; struct graphics_gc_priv; struct graphics_font_methods; struct graphics_gc_methods; struct graphics_image_methods; enum graphics_image_type { graphics_image_type_unknown=0, }; struct graphics_image_buffer { char magic[8]; /* buffer:\0 */ enum graphics_image_type type; void *start; int len; }; struct graphics_methods { void (*graphics_destroy)(struct graphics_priv *gr); void (*draw_mode)(struct graphics_priv *gr, enum draw_mode_num mode); void (*draw_lines)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count); void (*draw_polygon)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count); void (*draw_rectangle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h); void (*draw_circle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r); void (*draw_text)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy); void (*draw_image)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img); void (*draw_image_warp)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img); void (*draw_restore)(struct graphics_priv *gr, struct point *p, int w, int h); void (*draw_drag)(struct graphics_priv *gr, struct point *p); struct graphics_font_priv *(*font_new)(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags); struct graphics_gc_priv *(*gc_new)(struct graphics_priv *gr, struct graphics_gc_methods *meth); void (*background_gc)(struct graphics_priv *gr, struct graphics_gc_priv *gc); struct graphics_priv *(*overlay_new)(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); struct graphics_image_priv *(*image_new)(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation); void *(*get_data)(struct graphics_priv *gr, const char *type); void (*image_free)(struct graphics_priv *gr, struct graphics_image_priv *priv); void (*get_text_bbox)(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate); void (*overlay_disable)(struct graphics_priv *gr, int disable); void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound); int (*set_attr)(struct graphics_priv *gr, struct attr *attr); }; struct graphics_font_methods { void (*font_destroy)(struct graphics_font_priv *font); }; struct graphics_font { struct graphics_font_priv *priv; struct graphics_font_methods meth; }; struct graphics_gc_methods { void (*gc_destroy)(struct graphics_gc_priv *gc); void (*gc_set_linewidth)(struct graphics_gc_priv *gc, int width); void (*gc_set_dashes)(struct graphics_gc_priv *gc, int width, int offset, unsigned char dash_list[], int n); void (*gc_set_foreground)(struct graphics_gc_priv *gc, struct color *c); void (*gc_set_background)(struct graphics_gc_priv *gc, struct color *c); void (*gc_set_stipple)(struct graphics_gc_priv *gc, struct graphics_image_priv *img); }; struct graphics_gc { struct graphics_gc_priv *priv; struct graphics_gc_methods meth; struct graphics *gra; }; struct graphics_image_methods { void (*image_destroy)(struct graphics_image_priv *img); }; struct graphics_image { struct graphics_image_priv *priv; struct graphics_image_methods meth; int width; int height; struct point hot; }; struct graphics_data_image { void *data; int size; }; /* prototypes */ enum attr_type; enum draw_mode_num; enum item_type; struct attr; struct attr_iter; struct callback; struct color; struct displayitem; struct displaylist; struct displaylist_handle; struct graphics; struct graphics_font; struct graphics_gc; struct graphics_image; struct item; struct itemgra; struct layout; struct mapset; struct point; struct point_rect; struct transformation; int graphics_set_attr(struct graphics *gra, struct attr *attr); void graphics_set_rect(struct graphics *gra, struct point_rect *pr); struct graphics *graphics_new(struct attr *parent, struct attr **attrs); int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct graphics *graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int alpha, int wraparound); void graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int alpha, int wraparound); void graphics_init(struct graphics *this_); void *graphics_get_data(struct graphics *this_, const char *type); void graphics_add_callback(struct graphics *this_, struct callback *cb); void graphics_remove_callback(struct graphics *this_, struct callback *cb); struct graphics_font *graphics_font_new(struct graphics *gra, int size, int flags); struct graphics_font *graphics_named_font_new(struct graphics *gra, char *font, int size, int flags); void graphics_font_destroy(struct graphics_font *gra_font); void graphics_free(struct graphics *gra); void graphics_font_destroy_all(struct graphics *gra); struct graphics_gc *graphics_gc_new(struct graphics *gra); void graphics_gc_destroy(struct graphics_gc *gc); void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c); void graphics_gc_set_background(struct graphics_gc *gc, struct color *c); void graphics_gc_set_stipple(struct graphics_gc *gc, struct graphics_image *img); void graphics_gc_set_linewidth(struct graphics_gc *gc, int width); void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n); struct graphics_image *graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h); struct graphics_image *graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate); struct graphics_image *graphics_image_new(struct graphics *gra, char *path); void graphics_image_free(struct graphics *gra, struct graphics_image *img); void graphics_draw_restore(struct graphics *this_, struct point *p, int w, int h); void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode); void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count); void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r); void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h); void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill); void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy); void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate); void graphics_overlay_disable(struct graphics *this_, int disable); int graphics_is_disabled(struct graphics *this_); void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img); int graphics_draw_drag(struct graphics *this_, struct point *p); void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc); void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p); char *graphics_icon_path(const char *icon); void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label); void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags); void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags); int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist); struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist); struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh); void graphics_displaylist_close(struct displaylist_handle *dlh); struct displaylist *graphics_displaylist_new(void); void graphics_displaylist_destroy(struct displaylist *displaylist); struct map_selection *displaylist_get_selection(struct displaylist *displaylist); GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius); struct item *graphics_displayitem_get_item(struct displayitem *di); int graphics_displayitem_get_coord_count(struct displayitem *di); char *graphics_displayitem_get_label(struct displayitem *di); int graphics_displayitem_get_displayed(struct displayitem *di); int graphics_displayitem_get_z_order(struct displayitem *di); int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist); void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); void graphics_clear_selection(struct graphics *gra, struct displaylist *dl); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/graphics/000077500000000000000000000000001221777731700201215ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/CMakeLists.txt000066400000000000000000000004661221777731700226670ustar00rootroot00000000000000# Create a library called "Hello" which includes the source file "hello.cxx". # The extension is already found. Any number of sources could be listed here. add_subdirectory (ezxml) if (HAVE_API_WIN32_BASE) add_subdirectory (glib) add_subdirectory (win32) endif (HAVE_API_WIN32_BASE) add_subdirectory (zlib) navit-0.5.0~svn5643+dfsg.1/navit/graphics/Makefile.am000066400000000000000000000005551221777731700221620ustar00rootroot00000000000000SUBDIRS= if GRAPHICS_ANDROID SUBDIRS+=android endif if GRAPHICS_GTK_DRAWING_AREA SUBDIRS+=gtk_drawing_area endif if GRAPHICS_NULL SUBDIRS+=null endif if GRAPHICS_OPENGL SUBDIRS+=opengl endif if GRAPHICS_QT_QPAINTER SUBDIRS+=qt_qpainter endif if GRAPHICS_SDL SUBDIRS+=sdl endif if GRAPHICS_WIN32 SUBDIRS+=win32 endif if GRAPHICS_GD SUBDIRS+=gd endif navit-0.5.0~svn5643+dfsg.1/navit/graphics/android/000077500000000000000000000000001221777731700215415ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/android/CMakeLists.txt000066400000000000000000000000701221777731700242760ustar00rootroot00000000000000module_add_library(graphics_android graphics_android.c) navit-0.5.0~svn5643+dfsg.1/navit/graphics/android/Makefile.am000066400000000000000000000005511221777731700235760ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_android if PLUGINS modulegraphics_LTLIBRARIES = libgraphics_android.la else noinst_LTLIBRARIES = libgraphics_android.la endif libgraphics_android_la_SOURCES = graphics_android.c libgraphics_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/graphics/android/graphics_android.c000066400000000000000000000633441221777731700252170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #include "window.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "event.h" #include "debug.h" #include "callback.h" #include "android.h" int dummy; struct graphics_priv { jclass NavitGraphicsClass; jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera; jclass PaintClass; jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; jobject NavitGraphics; jobject Paint; jclass BitmapFactoryClass; jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; jclass BitmapClass; jmethodID Bitmap_getHeight, Bitmap_getWidth; jclass ContextClass; jmethodID Context_getResources; jclass ResourcesClass; jobject Resources; jmethodID Resources_getIdentifier; jobject packageName; struct callback_list *cbl; struct window win; }; struct graphics_font_priv { int size; }; struct graphics_gc_priv { struct graphics_priv *gra; int linewidth; enum draw_mode_num mode; int a,r,g,b; }; struct graphics_image_priv { jobject Bitmap; int width; int height; struct point hot; }; static GHashTable *image_cache_hash = NULL; static int find_class_global(char *name, jclass *ret) { *ret=(*jnienv)->FindClass(jnienv, name); if (! *ret) { dbg(0,"Failed to get Class %s\n",name); return 0; } *ret = (*jnienv)->NewGlobalRef(jnienv, *ret); return 1; } static int find_method(jclass class, char *name, char *args, jmethodID *ret) { *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); if (*ret == NULL) { dbg(0,"Failed to get Method %s with signature %s\n",name,args); return 0; } return 1; } static int find_static_method(jclass class, char *name, char *args, jmethodID *ret) { *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); if (*ret == NULL) { dbg(0,"Failed to get static Method %s with signature %s\n",name,args); return 0; } return 1; } static void graphics_destroy(struct graphics_priv *gr) { } static void font_destroy(struct graphics_font_priv *font) { g_free(font); } static struct graphics_font_methods font_methods = { font_destroy }; static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) { struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); *meth=font_methods; ret->size=size; return ret; } static void gc_destroy(struct graphics_gc_priv *gc) { g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->r = c->r >> 8; gc->g = c->g >> 8; gc->b = c->b >> 8; gc->a = c->a >> 8; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); *meth=gc_methods; ret->gra = gr; ret->a = ret->r = ret->g = ret->b = 255; ret->linewidth=1; return ret; } static void image_destroy(struct graphics_image_priv *img) { // unused? } static struct graphics_image_methods image_methods = { image_destroy }; static struct graphics_image_priv * image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { struct graphics_image_priv* ret = NULL; if ( !g_hash_table_lookup_extended( image_cache_hash, path, NULL, (gpointer)&ret) ) { ret=g_new0(struct graphics_image_priv, 1); jstring string; jclass localBitmap = NULL; int id; dbg(1,"enter %s\n",path); if (!strncmp(path,"res/drawable/",13)) { jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); char *path_noext=g_strdup(path+13); char *pos=strrchr(path_noext, '.'); if (pos) *pos='\0'; dbg(1,"path_noext=%s\n",path_noext); string = (*jnienv)->NewStringUTF(jnienv, path_noext); g_free(path_noext); id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, gra->packageName); dbg(1,"id=%d\n",id); if (id) localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); (*jnienv)->DeleteLocalRef(jnienv, a); } else { string = (*jnienv)->NewStringUTF(jnienv, path); localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); } dbg(1,"result=%p\n",localBitmap); if (localBitmap) { ret->Bitmap = (*jnienv)->NewGlobalRef(jnienv, localBitmap); (*jnienv)->DeleteLocalRef(jnienv, localBitmap); ret->width=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); ret->height=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); dbg(1,"w=%d h=%d for %s\n",ret->width,ret->height,path); ret->hot.x=ret->width/2; ret->hot.y=ret->height/2; } else { g_free(ret); ret=NULL; dbg(1,"Failed to open %s\n",path); } (*jnienv)->DeleteLocalRef(jnienv, string); g_hash_table_insert(image_cache_hash, g_strdup( path ), (gpointer)ret ); } if (ret) { *w=ret->width; *h=ret->height; if (hot) *hot=ret->hot; } return ret; } static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) { float wf = gc->linewidth; (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf); (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b); } static void draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) { jint pc[count*2]; int i; jintArray points; if (count <= 0) return; points = (*jnienv)->NewIntArray(jnienv,count*2); for (i = 0 ; i < count ; i++) { pc[i*2]=p[i].x; pc[i*2+1]=p[i].y; } initPaint(gra, gc); (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); (*jnienv)->DeleteLocalRef(jnienv, points); } static void draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) { jint pc[count*2]; int i; jintArray points; if (count <= 0) return; points = (*jnienv)->NewIntArray(jnienv,count*2); for (i = 0 ; i < count ; i++) { pc[i*2]=p[i].x; pc[i*2+1]=p[i].y; } initPaint(gra, gc); (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); (*jnienv)->DeleteLocalRef(jnienv, points); } static void draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h) { initPaint(gra, gc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h); } static void draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r) { initPaint(gra, gc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); } static void draw_text(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { dbg(1,"enter %s\n", text); initPaint(gra, fg); jstring string = (*jnienv)->NewStringUTF(jnienv, text); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy); (*jnienv)->DeleteLocalRef(jnienv, string); } static void draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { dbg(1,"enter %p\n",img); initPaint(gra, fg); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap); } static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { } static void draw_drag(struct graphics_priv *gra, struct point *p) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { } static void draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode); } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); static void * get_data(struct graphics_priv *this, const char *type) { if (strcmp(type,"window")) return NULL; return &this->win; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { } static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) { int len = g_utf8_strlen(text, -1); int xMin = 0; int yMin = 0; int yMax = 13*font->size/256; int xMax = 9*font->size*len/256; ret[0].x = xMin; ret[0].y = -yMin; ret[1].x = xMin; ret[1].y = -yMax; ret[2].x = xMax; ret[2].y = -yMax; ret[3].x = xMax; ret[3].y = -yMin; } static void overlay_disable(struct graphics_priv *gra, int disable) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); } static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound); } static int set_attr(struct graphics_priv *gra, struct attr *attr) { switch (attr->type) { case attr_use_camera: (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); return 1; default: return 0; } } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_restore, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, image_free, get_text_bbox, overlay_disable, overlay_resize, set_attr, }; static void resize_callback(struct graphics_priv *gra, int w, int h) { dbg(0,"w=%d h=%d ok\n",w,h); callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); } static void motion_callback(struct graphics_priv *gra, int x, int y) { struct point p; p.x=x; p.y=y; callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p); } static void keypress_callback(struct graphics_priv *gra, char *s) { dbg(0,"enter %s\n",s); callback_list_call_attr_1(gra->cbl, attr_keypress, s); } static void button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) { struct point p; p.x=x; p.y=y; callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p); } static int set_activity(jobject graphics) { jclass ActivityClass; jmethodID cid; ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity); dbg(0,"at 5\n"); if (ActivityClass == NULL) { dbg(0,"no activity class found\n"); return 0; } dbg(0,"at 6\n"); cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V"); if (cid == NULL) { dbg(0,"no setContentView method found\n"); return 0; } dbg(0,"at 7\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics); dbg(0,"at 8\n"); return 1; } static int graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera) { struct callback *cb; jmethodID cid, Context_getPackageName; dbg(0,"at 2 jnienv=%p\n",jnienv); if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) return 0; if (!find_method(ret->PaintClass, "", "(I)V", &ret->Paint_init)) return 0; if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) return 0; if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) return 0; if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) return 0; if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile)) return 0; if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) return 0; if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) return 0; if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) return 0; if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) return 0; if (!find_class_global("android/content/Context", &ret->ContextClass)) return 0; if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) return 0; ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); if (ret->Resources) ret->Resources = (*jnienv)->NewGlobalRef(jnienv, ret->Resources); if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) return 0; if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier)) return 0; if (!find_method(ret->ContextClass, "getPackageName", "()Ljava/lang/String;", &Context_getPackageName)) return 0; ret->packageName=(*jnienv)->CallObjectMethod(jnienv, android_activity, Context_getPackageName); ret->packageName=(*jnienv)->NewGlobalRef(jnienv, ret->packageName); if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass)) return 0; dbg(0,"at 3\n"); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "", "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;IIIIIII)V"); if (cid == NULL) { dbg(0,"no method found\n"); return 0; /* exception thrown */ } dbg(0,"at 4 android_activity=%p\n",android_activity); ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound, use_camera); dbg(0,"result=%p\n",ret->NavitGraphics); if (ret->NavitGraphics) ret->NavitGraphics = (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); /* Create a single global Paint, otherwise android will quickly run out * of global refs.*/ /* 0x101 = text kerning (default), antialiasing */ ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); dbg(0,"result=%p\n",ret->Paint); if (ret->Paint) ret->Paint = (*jnienv)->NewGlobalRef(jnienv, ret->Paint); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V"); if (cid == NULL) { dbg(0,"no SetResizeCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(resize_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V"); if (cid == NULL) { dbg(0,"no SetButtonCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(button_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V"); if (cid == NULL) { dbg(0,"no SetMotionCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(motion_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V"); if (cid == NULL) { dbg(0,"no SetKeypressCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(keypress_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", &ret->NavitGraphics_draw_circle)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;III)V", &ret->NavitGraphics_draw_text)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) return 0; if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) return 0; if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize)) return 0; if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) return 0; #if 0 set_activity(ret->NavitGraphics); #endif return 1; } static int graphics_android_fullscreen(struct window *win, int on) { return 1; } static jclass NavitClass; static jmethodID Navit_disableSuspend, Navit_exit; static void graphics_android_disable_suspend(struct window *win) { dbg(1,"enter\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); } static struct graphics_priv * graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *ret; struct attr *attr; int use_camera=0; if (!event_request_system("android","graphics_android")) return NULL; ret=g_new0(struct graphics_priv, 1); ret->cbl=cbl; *meth=graphics_methods; ret->win.priv=ret; ret->win.fullscreen=graphics_android_fullscreen; ret->win.disable_suspend=graphics_android_disable_suspend; if ((attr=attr_search(attrs, NULL, attr_use_camera))) { use_camera=attr->u.num; } image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) { dbg(0,"returning %p\n",ret); return ret; } else { g_free(ret); return NULL; } } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) { struct graphics_priv *ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; if (graphics_android_init(ret, gr, p, w, h, alpha, wraparound, 0)) { dbg(0,"returning %p\n",ret); return ret; } else { g_free(ret); return NULL; } } static void event_android_main_loop_run(void) { dbg(0,"enter\n"); } static void event_android_main_loop_quit(void) { dbg(0,"enter\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); } static jclass NavitTimeoutClass; static jmethodID NavitTimeout_init; static jmethodID NavitTimeout_remove; static jclass NavitIdleClass; static jmethodID NavitIdle_init; static jmethodID NavitIdle_remove; static jclass NavitWatchClass; static jmethodID NavitWatch_init; static jmethodID NavitWatch_remove; static void do_poll(JNIEnv *env, int fd, int cond) { struct pollfd pfd; pfd.fd=fd; dbg(1,"%p poll called for %d %d\n", fd, cond); switch ((enum event_watch_cond)cond) { case event_watch_cond_read: pfd.events=POLLIN; break; case event_watch_cond_write: pfd.events=POLLOUT; break; case event_watch_cond_except: pfd.events=POLLERR; break; default: pfd.events=0; } pfd.revents=0; poll(&pfd, 1, -1); } static struct event_watch * event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) { jobject ret; ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int)do_poll, (int) h, (int) cond, (int)cb); dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret); if (ret) ret = (*jnienv)->NewGlobalRef(jnienv, ret); return (struct event_watch *)ret; } static void event_android_remove_watch(struct event_watch *ev) { dbg(0,"enter %p\n",ev); if (ev) { jobject obj=(jobject )ev; (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); (*jnienv)->DeleteGlobalRef(jnienv, obj); } } struct event_timeout { void (*handle_timeout)(struct event_timeout *priv); jobject jni_timeout; int multi; struct callback *cb; }; static void event_android_remove_timeout(struct event_timeout *priv) { if (priv && priv->jni_timeout) { (*jnienv)->CallVoidMethod(jnienv, priv->jni_timeout, NavitTimeout_remove); (*jnienv)->DeleteGlobalRef(jnienv, priv->jni_timeout); priv->jni_timeout = NULL; } } static void event_android_handle_timeout(struct event_timeout *priv) { callback_call_0(priv->cb); if (!priv->multi) event_android_remove_timeout(priv); } static struct event_timeout * event_android_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout *ret = g_new0(struct event_timeout, 1); ret->cb = cb; ret->multi = multi; ret->handle_timeout = event_android_handle_timeout; ret->jni_timeout = (*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)ret); if (ret->jni_timeout) ret->jni_timeout = (*jnienv)->NewGlobalRef(jnienv, ret->jni_timeout); return ret; } static struct event_idle * event_android_add_idle(int priority, struct callback *cb) { #if 0 jobject ret; dbg(1,"enter\n"); ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); dbg(1,"result for %p=%p\n",cb,ret); if (ret) ret = (*jnienv)->NewGlobalRef(jnienv, ret); return (struct event_idle *)ret; #endif return (struct event_idle *)event_android_add_timeout(1, 1, cb); } static void event_android_remove_idle(struct event_idle *ev) { #if 0 dbg(1,"enter %p\n",ev); if (ev) { jobject obj=(jobject )ev; (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove); (*jnienv)->DeleteGlobalRef(jnienv, obj); } #endif event_android_remove_timeout((struct event_timeout *)ev); } static void event_android_call_callback(struct callback_list *cb) { dbg(0,"enter\n"); } static struct event_methods event_android_methods = { event_android_main_loop_run, event_android_main_loop_quit, event_android_add_watch, event_android_remove_watch, event_android_add_timeout, event_android_remove_timeout, event_android_add_idle, event_android_remove_idle, event_android_call_callback, }; static struct event_priv * event_android_new(struct event_methods *meth) { dbg(0,"enter\n"); if (!find_class_global("org/navitproject/navit/NavitTimeout", &NavitTimeoutClass)) return NULL; NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "", "(IZI)V"); if (NavitTimeout_init == NULL) return NULL; NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); if (NavitTimeout_remove == NULL) return NULL; #if 0 if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass)) return NULL; NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "", "(I)V"); if (NavitIdle_init == NULL) return NULL; NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); if (NavitIdle_remove == NULL) return NULL; #endif if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass)) return NULL; NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "", "(IIII)V"); if (NavitWatch_init == NULL) return NULL; NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); if (NavitWatch_remove == NULL) return NULL; if (!find_class_global("org/navitproject/navit/Navit", &NavitClass)) return NULL; Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); if (Navit_disableSuspend == NULL) return NULL; Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); if (Navit_exit == NULL) return NULL; dbg(0,"ok\n"); *meth=event_android_methods; return NULL; } void plugin_init(void) { dbg(0,"enter\n"); plugin_register_graphics_type("android", graphics_android_new); plugin_register_event_type("android", event_android_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/gd/000077500000000000000000000000001221777731700205135ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/gd/CMakeLists.txt000066400000000000000000000002041221777731700232470ustar00rootroot00000000000000include_directories(${GD_INCLUDE_DIR}) module_add_library(graphics_gd graphics_gd.c) target_link_libraries(graphics_gd ${GD_LIBS}) navit-0.5.0~svn5643+dfsg.1/navit/graphics/gd/Makefile.am000066400000000000000000000005321221777731700225470ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @GD_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gd libgraphics_gd_la_LDFLAGS = @GD_LIBS@ -module -avoid-version if PLUGINS modulegraphics_LTLIBRARIES = libgraphics_gd.la else noinst_LTLIBRARIES = libgraphics_gd.la endif libgraphics_gd_la_SOURCES = graphics_gd.c navit-0.5.0~svn5643+dfsg.1/navit/graphics/gd/graphics_gd.c000066400000000000000000000507651221777731700231460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "callback.h" #include "window.h" #include "navit.h" #include "debug.h" #include "navit/font/freetype/font_freetype.h" #ifdef HAVE_SHMEM #include #include #include #endif #ifdef HAVE_SOCKET #include #include #include #include #endif struct shmem_header { int flag; int w,h,bpp; }; #ifdef HAVE_XPM #define NAVIT_GD_XPM_TRANSPARENCY_HACK #endif static void emit_callback(struct graphics_priv *priv); static void image_setup(struct graphics_priv *gr); static struct shmem_header *shm_next(struct graphics_priv *gr); static void add_overlays(struct graphics_priv *overlay, gdImagePtr im); #ifdef NAVIT_GD_XPM_TRANSPARENCY_HACK #include BGD_DECLARE(gdImagePtr) gdImageCreateFromXpm (char *filename) { XpmInfo info; XpmImage image; int i, j, k, number; char buf[5]; gdImagePtr im = 0; int *pointer; int red = 0, green = 0, blue = 0, alpha = 0; int *colors; int ret; ret = XpmReadFileToXpmImage (filename, &image, &info); if (ret != XpmSuccess) return 0; if (!(im = gdImageCreate (image.width, image.height))) return 0; number = image.ncolors; if (overflow2(sizeof (int), number)) { return 0; } colors = (int *) gdMalloc (sizeof (int) * number); if (colors == NULL) return (0); for (i = 0; i < number; i++) { alpha = 0; switch (strlen (image.colorTable[i].c_color)) { case 4: if (!strcasecmp(image.colorTable[i].c_color,"none")) { red = 0; green = 0; blue = 0; alpha = 127; } else { buf[1] = '\0'; buf[0] = image.colorTable[i].c_color[1]; red = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[3]; green = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[5]; blue = strtol (buf, NULL, 16); } break; case 7: buf[2] = '\0'; buf[0] = image.colorTable[i].c_color[1]; buf[1] = image.colorTable[i].c_color[2]; red = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[3]; buf[1] = image.colorTable[i].c_color[4]; green = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[5]; buf[1] = image.colorTable[i].c_color[6]; blue = strtol (buf, NULL, 16); break; case 10: buf[3] = '\0'; buf[0] = image.colorTable[i].c_color[1]; buf[1] = image.colorTable[i].c_color[2]; buf[2] = image.colorTable[i].c_color[3]; red = strtol (buf, NULL, 16); red /= 64; buf[0] = image.colorTable[i].c_color[4]; buf[1] = image.colorTable[i].c_color[5]; buf[2] = image.colorTable[i].c_color[6]; green = strtol (buf, NULL, 16); green /= 64; buf[0] = image.colorTable[i].c_color[7]; buf[1] = image.colorTable[i].c_color[8]; buf[2] = image.colorTable[i].c_color[9]; blue = strtol (buf, NULL, 16); blue /= 64; break; case 13: buf[4] = '\0'; buf[0] = image.colorTable[i].c_color[1]; buf[1] = image.colorTable[i].c_color[2]; buf[2] = image.colorTable[i].c_color[3]; buf[3] = image.colorTable[i].c_color[4]; red = strtol (buf, NULL, 16); red /= 256; buf[0] = image.colorTable[i].c_color[5]; buf[1] = image.colorTable[i].c_color[6]; buf[2] = image.colorTable[i].c_color[7]; buf[3] = image.colorTable[i].c_color[8]; green = strtol (buf, NULL, 16); green /= 256; buf[0] = image.colorTable[i].c_color[9]; buf[1] = image.colorTable[i].c_color[10]; buf[2] = image.colorTable[i].c_color[11]; buf[3] = image.colorTable[i].c_color[12]; blue = strtol (buf, NULL, 16); blue /= 256; break; } colors[i] = gdImageColorResolveAlpha(im, red, green, blue, alpha); if (colors[i] == -1) fprintf (stderr, "ARRRGH\n"); } pointer = (int *) image.data; for (i = 0; i < image.height; i++) { for (j = 0; j < image.width; j++) { k = *pointer++; gdImageSetPixel (im, j, i, colors[k]); } } gdFree (colors); return (im); } #endif struct graphics_priv { gdImagePtr im; int w,h,flags,alpha,overlay,shmkey,shmsize,shmoffset; void *shm; struct shmem_header *shm_header; struct point p; struct callback *cb; struct callback_list *cbl; struct navit *nav; struct graphics_gc_priv *background; struct font_freetype_methods freetype_methods; struct window window; struct graphics_data_image image; struct graphics_priv *next,*overlays; GList *sockets; }; struct graphics_gc_priv { struct graphics_priv *gr; int color; int bgcolor; int width; struct color color2; unsigned char *dash_list; int dash_count; int dash_list_len; }; struct graphics_image_priv { gdImagePtr im; }; static void graphics_destroy(struct graphics_priv *gr) { gr->freetype_methods.destroy(); g_free(gr); } static void gc_destroy(struct graphics_gc_priv *gc) { if (gc->color != -1) gdImageColorDeallocate(gc->gr->im, gc->color); if (gc->bgcolor != -1) gdImageColorDeallocate(gc->gr->im, gc->bgcolor); g_free(gc->dash_list); g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->width=w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { int i,count=0; g_free(gc->dash_list); gc->dash_list=g_new(unsigned char, n); for (i = 0 ; i < n ; i++) { gc->dash_list[i]=dash_list[i]; count+=dash_list[i]; } gc->dash_list_len=n; gc->dash_count=count; } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->color2=*c; gc->color=gdImageColorAllocate(gc->gr->im, c->r>>8, c->g>>8, c->b>>8); } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { gc->bgcolor=gdImageColorAllocate(gc->gr->im, c->r>>8, c->g>>8, c->b>>8); } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); ret->gr=gr; ret->width=1; ret->color=-1; ret->bgcolor=-1; *meth=gc_methods; return ret; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) { FILE *file; struct graphics_image_priv *ret=NULL; gdImagePtr im=NULL; int len; if (! name) return NULL; len=strlen(name); if (len < 4) return NULL; file=fopen(name,"r"); if (file) { if (!strcmp(name+len-4,".png")) #ifdef HAVE_GRAPHICS_GD_PNG im=gdImageCreateFromPng(file); #else im=NULL; #endif else if (!strcmp(name+len-4,".xpm")) im=gdImageCreateFromXpm(name); else if (!strcmp(name+len-4,".gif")) { im=gdImageCreateFromGif(file); } fclose(file); } if (im) { ret=g_new0(struct graphics_image_priv, 1); ret->im=im; *w=im->sx; *h=im->sy; hot->x=im->sx/2; hot->y=im->sy/2; } return ret; } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int color[gc->dash_count],cc; int i,j,k=0; if (gc->dash_count) { cc=gc->color; for (i = 0 ; i < gc->dash_list_len ; i++) { for (j = 0 ; j < gc->dash_list[i] ; j++) { color[k++]=cc; } if (cc == gdTransparent) cc=gc->color; else cc=gdTransparent; } gdImageSetStyle(gr->im, color, gc->dash_count); } gdImageSetThickness(gr->im, gc->width); cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } #ifdef GD_NO_IMAGE_OPEN_POLYGON for (i = 0 ; i < count-1 ; i++) gdImageLine(gr->im, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->dash_count ? gdStyled : cc); #else gdImageOpenPolygon(gr->im, (gdPointPtr) p, count, gc->dash_count ? gdStyled : cc); #endif } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } gdImageFilledPolygon(gr->im, (gdPointPtr) p, count, cc); } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { int cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } gdImageFilledRectangle(gr->im, p->x, p->y, p->x+w, p->y+h, cc); } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { int cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } gdImageSetThickness(gr->im, gc->width); gdImageArc(gr->im, p->x, p->y, r, r, 0, 360, cc); } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { struct font_freetype_text *t; struct font_freetype_glyph *g, **gp; gdImagePtr im; int i,x,y,w,h; t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); struct color fgc,bgc,transparent = {0x0, 0x0, 0x0, 0x7f7f}; fgc=fg->color2; fgc.a=0; if (bg) { bgc=bg->color2; bgc.a=0; x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; while (i-- > 0) { g=*gp++; w=g->w; h=g->h; if (w && h) { im=gdImageCreateTrueColor(w+2, h+2); gr->freetype_methods.get_shadow(g,(unsigned char *)(im->tpixels),32,0,&bgc,&transparent); gdImageCopy(gr->im, im, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, 0, 0, w+2, h+2); gdImageDestroy(im); } x+=g->dx; y+=g->dy; } } else bgc=transparent; x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; while (i-- > 0) { g=*gp++; w=g->w; h=g->h; if (w && h) { im=gdImageCreateTrueColor(w, h); gr->freetype_methods.get_glyph(g,(unsigned char *)(im->tpixels),32,0,&fgc,&bgc,&transparent); gdImageCopy(gr->im, im, (x+g->x)>>6, (y+g->y)>>6, 0, 0, w, h); gdImageDestroy(im); } x+=g->dx; y+=g->dy; } gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { gdImageCopy(gr->im, img->im, p->x, p->y, 0, 0, img->im->sx, img->im->sy); } static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (p) gr->p=*p; else { gr->p.x=0; gr->p.y=0; } } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background=gc; } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { FILE *pngout; #if 0 if (mode == draw_mode_begin && gr->background) { gdImageFilledRectangle(gr->im, 0, 0, gr->w, gr->h, gr->background->color); } #endif if (mode == draw_mode_end && !gr->overlay) { add_overlays(gr->overlays, gr->im); if (!(gr->flags & 1)) { #ifdef HAVE_GRAPHICS_GD_PNG rename("test.png","test.png.old"); pngout=fopen("test.png", "wb"); gdImagePng(gr->im, pngout); fclose(pngout); #else rename("test.gd","test.gd.old"); pngout=fopen("test.gd", "wb"); gdImageGd(gr->im, pngout); fclose(pngout); #endif } if (gr->flags & 2) { struct shmem_header *next=shm_next(gr); gr->shm_header->flag=1; dbg(1,"next flag is %d\n",next->flag); if (!next->flag) { gr->shm_header=next; image_setup(gr); } } #ifdef HAVE_GRAPHICS_GD_PNG #ifdef HAVE_SOCKET if (gr->flags & 4) { int size, size_written; void *data=gdImagePngPtr(gr->im, &size); GList *sockets=gr->sockets; while (sockets) { int fd=socket(PF_INET, SOCK_STREAM, 0); if (fd < 0) { dbg(0,"socket failed\n"); } else { if (connect(fd, (struct sockaddr *)sockets->data, sizeof(struct sockaddr_in)) < 0) { dbg(0,"connect failed\n"); } else { size_written=write(fd, data, size); dbg(0,"size %d vs %d\n",size, size_written); if (shutdown(fd, SHUT_RDWR) < 0) dbg(0,"shutdown failed\n"); } close(fd); } sockets=g_list_next(sockets); } gdFree(data); } #endif #endif } } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha); static void add_overlays(struct graphics_priv *overlay, gdImagePtr im) { while (overlay) { if (overlay->background) { gdImagePtr res,src; int y,x; int bgcol=overlay->background->color; res=gdImageCreateTrueColor(overlay->w,overlay->h); src=gdImageCreateTrueColor(overlay->w,overlay->h); gdImageCopy(src, im, 0, 0, overlay->p.x, overlay->p.y, overlay->w, overlay->h); for (y = 0 ; y < overlay->h ; y++) { unsigned int *res_line=res->tpixels[y]; unsigned int *src_line=src->tpixels[y]; unsigned int *overlay_line=overlay->im->tpixels[y]; for (x = 0 ; x < overlay->w ; x++) { if (overlay_line[x] != bgcol) res_line[x]=overlay_line[x]; else res_line[x]=src_line[x]; } } gdImageCopy(im, res, overlay->p.x, overlay->p.y, 0, 0, overlay->w, overlay->h); gdImageDestroy(res); gdImageDestroy(src); } else gdImageCopy(im, overlay->im, overlay->p.x, overlay->p.y, 0, 0, overlay->w, overlay->h); overlay=overlay->next; } } static void * get_data(struct graphics_priv *this, char *type) { int b; struct point p; gdImagePtr im = this->im; dbg(1,"type=%s\n",type); if (!strcmp(type,"window")) return &this->window; if (!strcmp(type,"image_png")) { if (this->overlays) { struct graphics_priv *overlay=this->overlays; im=gdImageCreateTrueColor(this->w,this->h); gdImageCopy(im, this->im, 0, 0, 0, 0, this->w, this->h); add_overlays(overlay, im); } if (this->image.data) gdFree(this->image.data); #ifdef HAVE_GRAPHICS_GD_PNG this->image.data=gdImagePngPtr(im, &this->image.size); #else this->image.data=NULL; #endif if (this->overlays) gdImageDestroy(im); return &this->image; } if (sscanf(type,"click_%d_%d_%d",&p.x,&p.y,&b) == 3) { dbg(1,"click %d %d %d\n",p.x,p.y,b); callback_list_call_attr_3(this->cbl, attr_button, (void *)b, (void *)1, (void *)&p); } if (sscanf(type,"move_%d_%d",&p.x,&p.y) == 2) { dbg(1,"move %d %d\n",p.x,p.y); callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); } return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { gdImageDestroy(priv->im); g_free(priv); } static void overlay_disable(struct graphics_priv *gr, int disable) { dbg(0,"enter\n"); } static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound) { dbg(0,"enter\n"); } struct shmem_header * shm_next(struct graphics_priv *gr) { char *next=(char *)gr->shm_header+gr->shmoffset; if (next+gr->shmoffset > (char *)gr->shm+gr->shmsize) { dbg(1,"wraparound\n"); return gr->shm; } dbg(1,"next 0x%x (offset 0x%x)\n",next-(char *)gr->shm,gr->shmoffset); return (struct shmem_header *)next; } static void image_setup(struct graphics_priv *gr) { int i,*shm=(int *)(gr->shm_header+1); if (!gr->shmkey) return; for (i = 0 ; i < gr->h ; i++) gr->im->tpixels[i]=shm+gr->w*i; gr->shm_header->w=gr->w; gr->shm_header->h=gr->h; gr->shm_header->bpp=32; gr->shm_header->flag=0; } static void image_create(struct graphics_priv *gr) { dbg(0,"shmkey %d\n",gr->shmkey); #ifdef HAVE_SHMEM if (gr->shmkey) { int size=gr->h*gr->w*sizeof(int); int shmid=shmget(gr->shmkey, size, 0666); dbg(0,"shmid for key 0x%x is 0x%x\n",gr->shmkey, shmid); if (shmid < 0) dbg(0,"shmget\n"); gr->shm=shmat(shmid, NULL, 0); if (!gr->shm) dbg(0,"shmat\n"); gr->shm_header=gr->shm; gr->im=g_new0(gdImage,1); gr->im->tpixels=g_new(int *,gr->h); gr->im->sx=gr->w; gr->im->sy=gr->h; gr->im->transparent=-1; gr->im->trueColor=1; gr->im->alphaBlendingFlag=1; gr->im->thick=1; gr->im->cx2=gr->im->sx-1; gr->im->cy2=gr->im->sy-1; image_setup(gr); } else #endif gr->im=gdImageCreateTrueColor(gr->w,gr->h); } static void image_destroy(struct graphics_priv *gr) { #ifdef HAVE_SHMEM if (gr->shmkey) { shmdt(gr->shm); g_free(gr->im->tpixels); g_free(gr->im); } else #endif gdImageDestroy(gr->im); gr->im=NULL; } static int set_attr_do(struct graphics_priv *gr, struct attr *attr, int init) { char *s,*c,*n,*p; switch (attr->type) { case attr_w: if (gr->w != attr->u.num) { gr->w=attr->u.num; if (!init) { if (gr->im) image_destroy(gr); image_create(gr); emit_callback(gr); } } break; case attr_h: if (gr->h != attr->u.num) { gr->h=attr->u.num; if (!init) { if (gr->im) image_destroy(gr); image_create(gr); emit_callback(gr); } } break; case attr_flags: gr->flags=attr->u.num; break; case attr_shmkey: gr->shmkey=attr->u.num; break; case attr_shmsize: gr->shmsize=attr->u.num; break; case attr_shmoffset: gr->shmoffset=attr->u.num; break; #ifdef HAVE_SOCKET case attr_socket: g_list_foreach(gr->sockets, (GFunc)g_free, NULL); g_list_free(gr->sockets); gr->sockets=NULL; c=s=g_strdup(attr->u.str); dbg(0,"s=%s\n",s); while (c) { n=strchr(c,','); if (n) *n++='\0'; p=strchr(c,':'); if (p) { *p++='\0'; struct sockaddr_in *sin=g_new(struct sockaddr_in, 1); sin->sin_family=AF_INET; sin->sin_port=ntohs(atoi(p)); if (inet_aton(c, &sin->sin_addr)) { gr->sockets=g_list_append(gr->sockets, sin); } else { dbg(0,"error in %s\n",c); g_free(sin); } dbg(0,"host=%s port=%s\n",c,p); } else dbg(0,"error in format: %s\n",p); c=n; } g_free(s); #endif default: return 0; } return 1; } static int set_attr(struct graphics_priv *gr, struct attr *attr) { return set_attr_do(gr, attr, 0); } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_restore, draw_drag, NULL, gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, overlay_disable, overlay_resize, set_attr, }; static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha) { struct font_priv * (*font_freetype_new)(void *meth); struct graphics_priv *ret; dbg(1,"enter\n"); ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; font_freetype_new=plugin_get_font_type("freetype"); if (!font_freetype_new) return NULL; font_freetype_new(&ret->freetype_methods); ret->p=*p; ret->w=w; ret->h=h; ret->alpha=alpha; ret->overlay=1; ret->flags=1; ret->im=gdImageCreateTrueColor(ret->w,ret->h); ret->next=gr->overlays; gr->overlays=ret; return ret; } static void emit_callback(struct graphics_priv *priv) { callback_list_call_attr_2(priv->cbl, attr_resize, (void *)priv->w, (void *)priv->h); } static struct graphics_priv * graphics_gd_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct font_priv * (*font_freetype_new)(void *meth); struct graphics_priv *ret; event_request_system("glib","graphics_gd_new"); font_freetype_new=plugin_get_font_type("freetype"); if (!font_freetype_new) return NULL; *meth=graphics_methods; ret=g_new0(struct graphics_priv, 1); font_freetype_new(&ret->freetype_methods); meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; meth->get_text_bbox=ret->freetype_methods.get_text_bbox; ret->cb=callback_new_attr_1(callback_cast(emit_callback), attr_navit, ret); navit_add_callback(nav, ret->cb); ret->cbl=cbl; ret->nav=nav; ret->w=800; ret->h=600; while (*attrs) { set_attr_do(ret, *attrs, 1); attrs++; } if (!ret->im) image_create(ret); return ret; } void plugin_init(void) { plugin_register_graphics_type("gd", graphics_gd_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/gtk_drawing_area/000077500000000000000000000000001221777731700234115ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/gtk_drawing_area/CMakeLists.txt000066400000000000000000000002241221777731700261470ustar00rootroot00000000000000set(graphics_gtk_drawing_area_LIBS ${IMLIB2_LDFLAGS} ${GTK2_LIBRARIES}) module_add_library(graphics_gtk_drawing_area graphics_gtk_drawing_area.c) navit-0.5.0~svn5643+dfsg.1/navit/graphics/gtk_drawing_area/Makefile.am000066400000000000000000000005461221777731700254520ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @GTK2_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gtk_drawing_area modulegraphics_LTLIBRARIES = libgraphics_gtk_drawing_area.la libgraphics_gtk_drawing_area_la_SOURCES = graphics_gtk_drawing_area.c libgraphics_gtk_drawing_area_la_LDFLAGS = @GTK2_LIBS@ @IMLIB2_LIBS@ -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c000066400000000000000000001010001221777731700307150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define GDK_ENABLE_BROKEN #include "config.h" #include #include #include #include #include #include /* For WIN32 */ #if !defined(GDK_Book) || !defined(GDK_Calendar) #include #endif #ifdef HAVE_IMLIB2 #include #endif #ifndef _WIN32 #include #endif #include "event.h" #include "debug.h" #include "point.h" #include "graphics.h" #include "color.h" #include "item.h" #include "window.h" #include "callback.h" #include "keys.h" #include "plugin.h" #include "navit/font/freetype/font_freetype.h" #include "navit.h" #ifndef GDK_Book #define GDK_Book XF86XK_Book #endif #ifndef GDK_Calendar #define GDK_Calendar XF86XK_Calendar #endif struct graphics_priv { GdkEventButton button_event; int button_timeout; GtkWidget *widget; GtkWidget *win; struct window window; GdkDrawable *drawable; GdkDrawable *background; int background_ready; GdkColormap *colormap; struct point p; struct point pclean; int cleanup; int width; int height; int win_w; int win_h; int visible; int overlay_disabled; int overlay_autodisabled; int a; int wraparound; struct graphics_priv *parent; struct graphics_priv *overlays; struct graphics_priv *next; struct graphics_gc_priv *background_gc; enum draw_mode_num mode; struct callback_list *cbl; struct font_freetype_methods freetype_methods; struct navit *nav; int pid; struct timeval button_press[8]; struct timeval button_release[8]; int timeout; int delay; char *window_title; }; struct graphics_gc_priv { GdkGC *gc; GdkPixmap *pixmap; struct graphics_priv *gr; struct color c; }; struct graphics_image_priv { GdkPixbuf *pixbuf; int w; int h; #ifdef HAVE_IMLIB2 void *image; #endif }; static void graphics_destroy(struct graphics_priv *gr) { dbg(3,"enter parent %p\n",gr->parent); gr->freetype_methods.destroy(); if (!gr->parent) { dbg(3,"enter win %p\n",gr->win); if (gr->win) gtk_widget_destroy(gr->win); dbg(3,"widget %p\n",gr->widget); if (gr->widget) gtk_widget_destroy(gr->widget); g_free(gr->window_title); } g_free(gr); } static void gc_destroy(struct graphics_gc_priv *gc) { g_object_unref(gc->gc); g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gdk_gc_set_line_attributes(gc->gc, w, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { gdk_gc_set_dashes(gc->gc, offset, (gint8 *)dash_list, n); gdk_gc_set_line_attributes(gc->gc, w, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_ROUND); } static void gc_set_color(struct graphics_gc_priv *gc, struct color *c, int fg) { GdkColor gdkc; gdkc.pixel=0; gdkc.red=c->r; gdkc.green=c->g; gdkc.blue=c->b; gdk_colormap_alloc_color(gc->gr->colormap, &gdkc, FALSE, TRUE); gdk_colormap_query_color(gc->gr->colormap, gdkc.pixel, &gdkc); gc->c=*c; if (fg) { gdk_gc_set_foreground(gc->gc, &gdkc); } else gdk_gc_set_background(gc->gc, &gdkc); } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc_set_color(gc, c, 1); } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { gc_set_color(gc, c, 0); } static void gc_set_stipple(struct graphics_gc_priv *gc, struct graphics_image_priv *img) { char data[2]={0x2,0x1}; gdk_gc_set_fill(gc->gc, GDK_STIPPLED); gc->pixmap=gdk_bitmap_create_from_data(gc->gr->widget->window, data, 2, 2); gdk_gc_set_stipple(gc->gc, gc->pixmap); } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background, gc_set_stipple, }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *gc=g_new(struct graphics_gc_priv, 1); *meth=gc_methods; gc->gc=gdk_gc_new(gr->widget->window); gc->gr=gr; return gc; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) { GdkPixbuf *pixbuf; struct graphics_image_priv *ret; const char *option; if (!strcmp(name,"buffer:")) { struct graphics_image_buffer *buffer=(struct graphics_image_buffer *)name; GdkPixbufLoader *loader=gdk_pixbuf_loader_new(); if (!loader) return NULL; if (*w != -1 || *h != -1) gdk_pixbuf_loader_set_size(loader, *w, *h); gdk_pixbuf_loader_write(loader, buffer->start, buffer->len, NULL); gdk_pixbuf_loader_close(loader, NULL); pixbuf=gdk_pixbuf_loader_get_pixbuf(loader); g_object_ref(pixbuf); g_object_unref(loader); } else { if (*w == -1 && *h == -1) pixbuf=gdk_pixbuf_new_from_file(name, NULL); else pixbuf=gdk_pixbuf_new_from_file_at_size(name, *w, *h, NULL); } if (!pixbuf) return NULL; if (rotation) { GdkPixbuf *tmp; switch (rotation) { case 90: rotation=270; break; case 180: break; case 270: rotation=90; break; default: return NULL; } tmp=gdk_pixbuf_rotate_simple(pixbuf, rotation); if (!tmp) { g_object_unref(pixbuf); return NULL; } g_object_unref(pixbuf); pixbuf=tmp; } ret=g_new0(struct graphics_image_priv, 1); ret->pixbuf=pixbuf; ret->w=gdk_pixbuf_get_width(pixbuf); ret->h=gdk_pixbuf_get_height(pixbuf); *w=ret->w; *h=ret->h; if (hot) { option=gdk_pixbuf_get_option(pixbuf, "x_hot"); if (option) hot->x=atoi(option); else hot->x=ret->w/2-1; option=gdk_pixbuf_get_option(pixbuf, "y_hot"); if (option) hot->y=atoi(option); else hot->y=ret->h/2-1; } return ret; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { g_object_unref(priv->pixbuf); g_free(priv); } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if (gr->mode == draw_mode_begin || gr->mode == draw_mode_end) gdk_draw_lines(gr->drawable, gc->gc, (GdkPoint *)p, count); if (gr->mode == draw_mode_end || gr->mode == draw_mode_cursor) gdk_draw_lines(gr->widget->window, gc->gc, (GdkPoint *)p, count); } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if (gr->mode == draw_mode_begin || gr->mode == draw_mode_end) gdk_draw_polygon(gr->drawable, gc->gc, TRUE, (GdkPoint *)p, count); if (gr->mode == draw_mode_end || gr->mode == draw_mode_cursor) gdk_draw_polygon(gr->widget->window, gc->gc, TRUE, (GdkPoint *)p, count); } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { gdk_draw_rectangle(gr->drawable, gc->gc, TRUE, p->x, p->y, w, h); } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { if (gr->mode == draw_mode_begin || gr->mode == draw_mode_end) gdk_draw_arc(gr->drawable, gc->gc, FALSE, p->x-r/2, p->y-r/2, r, r, 0, 64*360); if (gr->mode == draw_mode_end || gr->mode == draw_mode_cursor) gdk_draw_arc(gr->widget->window, gc->gc, FALSE, p->x-r/2, p->y-r/2, r, r, 0, 64*360); } static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) { int i,x,y,stride; struct font_freetype_glyph *g, **gp; unsigned char *shadow,*glyph; struct color transparent={0x0,0x0,0x0,0x0}; struct color white={0xffff,0xffff,0xffff,0xffff}; gp=text->glyph; i=text->glyph_count; x=p->x << 6; y=p->y << 6; while (i-- > 0) { g=*gp++; if (g->w && g->h && bg ) { #if 1 stride=g->w+2; shadow=g_malloc(stride*(g->h+2)); if (gr->freetype_methods.get_shadow(g, shadow, 8, stride, &white, &transparent)) gdk_draw_gray_image(gr->drawable, bg->gc, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, g->w+2, g->h+2, GDK_RGB_DITHER_NONE, shadow, stride); g_free(shadow); if (color) { stride*=3; shadow=g_malloc(stride*(g->h+2)); gr->freetype_methods.get_shadow(g, shadow, 24, stride, &bg->c, &transparent); gdk_draw_rgb_image(gr->drawable, fg->gc, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, g->w+2, g->h+2, GDK_RGB_DITHER_NONE, shadow, stride); g_free(shadow); } #else GdkImage *image; stride=(g->w+9)/8; shadow=malloc(stride*(g->h+2)); gr->freetype_methods.get_shadow(g, shadow, 1, stride); image=gdk_image_new_bitmap(gdk_visual_get_system(),shadow,g->w+2, g->h+2); gdk_draw_image(gr->drawable, bg->gc, image, 0, 0, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, g->w+2, g->h+2); g_object_unref(image); #endif } x+=g->dx; y+=g->dy; } x=p->x << 6; y=p->y << 6; gp=text->glyph; i=text->glyph_count; while (i-- > 0) { g=*gp++; if (g->w && g->h) { if (color) { stride=g->w; if (bg) { glyph=g_malloc(stride*g->h); gr->freetype_methods.get_glyph(g, glyph, 8, stride, &fg->c, &bg->c, &transparent); gdk_draw_gray_image(gr->drawable, bg->gc, (x+g->x)>>6, (y+g->y)>>6, g->w, g->h, GDK_RGB_DITHER_NONE, glyph, g->w); g_free(glyph); } stride*=3; glyph=g_malloc(stride*g->h); gr->freetype_methods.get_glyph(g, glyph, 24, stride, &fg->c, bg?&bg->c:&transparent, &transparent); gdk_draw_rgb_image(gr->drawable, fg->gc, (x+g->x)>>6, (y+g->y)>>6, g->w, g->h, GDK_RGB_DITHER_NONE, glyph, stride); g_free(glyph); } else gdk_draw_gray_image(gr->drawable, fg->gc, (x+g->x)>>6, (y+g->y)>>6, g->w, g->h, GDK_RGB_DITHER_NONE, g->pixmap, g->w); } x+=g->dx; y+=g->dy; } } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { struct font_freetype_text *t; int color=0; if (! font) { dbg(0,"no font, returning\n"); return; } #if 0 /* Temporarily disabled because it destroys text rendering of overlays and in gui internal in some places */ /* This needs an improvement, no one checks if the strings are visible */ if (p->x > gr->width-50 || p->y > gr->height-50) { return; } if (p->x < -50 || p->y < -50) { return; } #endif if (bg) { if (COLOR_IS_BLACK(fg->c) && COLOR_IS_WHITE(bg->c)) { gdk_gc_set_function(fg->gc, GDK_AND_INVERT); gdk_gc_set_function(bg->gc, GDK_OR); } else if (COLOR_IS_WHITE(fg->c) && COLOR_IS_BLACK(bg->c)) { gdk_gc_set_function(fg->gc, GDK_OR); gdk_gc_set_function(bg->gc, GDK_AND_INVERT); } else { gdk_gc_set_function(fg->gc, GDK_OR); gdk_gc_set_function(bg->gc, GDK_AND_INVERT); color=1; } } else { gdk_gc_set_function(fg->gc, GDK_OR); color=1; } t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); display_text_draw(t, gr, fg, bg, color, p); gr->freetype_methods.text_destroy(t); gdk_gc_set_function(fg->gc, GDK_COPY); if (bg) gdk_gc_set_function(bg->gc, GDK_COPY); #if 0 { struct point pnt[5]; int i; gr->freetype_methods.get_text_bbox(gr, font, text, dx, dy, pnt, 1); for (i = 0 ; i < 4 ; i++) { pnt[i].x+=p->x; pnt[i].y+=p->y; } pnt[4]=pnt[0]; gdk_draw_lines(gr->drawable, fg->gc, (GdkPoint *)pnt, 5); } #endif } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { gdk_draw_pixbuf(gr->drawable, fg->gc, img->pixbuf, 0, 0, p->x, p->y, img->w, img->h, GDK_RGB_DITHER_NONE, 0, 0); } #ifdef HAVE_IMLIB2 static void draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img) { int w,h; static struct graphics_priv *imlib_gr; dbg(1,"draw_image_warp data=%p\n", img); if (imlib_gr != gr) { imlib_context_set_display(gdk_x11_drawable_get_xdisplay(gr->widget->window)); imlib_context_set_colormap(gdk_x11_colormap_get_xcolormap(gtk_widget_get_colormap(gr->widget))); imlib_context_set_visual(gdk_x11_visual_get_xvisual(gtk_widget_get_visual(gr->widget))); imlib_context_set_drawable(gdk_x11_drawable_get_xid(gr->drawable)); imlib_gr=gr; } w = img->w; h = img->h; if (!img->image) { int x,y; #if 0 if (!gdk_pixbuf_get_has_alpha(img->pixbuf)) { img->pixbuf=gdk_pixbuf_add_alpha(img->pixbuf, FALSE, 0, 0, 0); } #endif img->image=imlib_create_image(w, h); imlib_context_set_image(img->image); if (gdk_pixbuf_get_colorspace(img->pixbuf) != GDK_COLORSPACE_RGB || gdk_pixbuf_get_bits_per_sample(img->pixbuf) != 8) { dbg(0,"implement me\n"); } else if (gdk_pixbuf_get_has_alpha(img->pixbuf) && gdk_pixbuf_get_n_channels(img->pixbuf) == 4) { for (y=0 ; y < h ; y++) { unsigned int *dst=imlib_image_get_data()+y*w; unsigned char *src=gdk_pixbuf_get_pixels(img->pixbuf)+y*gdk_pixbuf_get_rowstride(img->pixbuf); for (x=0 ; x < w ; x++) { *dst++=0xff000000|(src[0] << 16)|(src[1] << 8)|src[2]; src+=4; } } } else if (!gdk_pixbuf_get_has_alpha(img->pixbuf) && gdk_pixbuf_get_n_channels(img->pixbuf) == 3) { for (y=0 ; y < h ; y++) { unsigned int *dst=imlib_image_get_data()+y*w; unsigned char *src=gdk_pixbuf_get_pixels(img->pixbuf)+y*gdk_pixbuf_get_rowstride(img->pixbuf); for (x=0 ; x < w ; x++) { *dst++=0xff000000|(src[0] << 16)|(src[1] << 8)|src[2]; src+=3; } } } else { dbg(0,"implement me\n"); } } else imlib_context_set_image(img->image); if (count == 3) { /* 0 1 2 */ imlib_render_image_on_drawable_skewed(0, 0, w, h, p[0].x, p[0].y, p[1].x-p[0].x, p[1].y-p[0].y, p[2].x-p[0].x, p[2].y-p[0].y); } if (count == 2) { /* 0 1 */ imlib_render_image_on_drawable_skewed(0, 0, w, h, p[0].x, p[0].y, p[1].x-p[0].x, 0, 0, p[1].y-p[0].y); } if (count == 1) { /* 0 */ imlib_render_image_on_drawable_skewed(0, 0, w, h, p[0].x-w/2, p[0].y-h/2, w, 0, 0, h); } } #endif static void overlay_rect(struct graphics_priv *parent, struct graphics_priv *overlay, int clean, GdkRectangle *r) { if (clean) { r->x=overlay->pclean.x; r->y=overlay->pclean.y; } else { r->x=overlay->p.x; r->y=overlay->p.y; } r->width=overlay->width; r->height=overlay->height; if (!overlay->wraparound) return; if (r->x < 0) r->x += parent->width; if (r->y < 0) r->y += parent->height; if (r->width < 0) r->width += parent->width; if (r->height < 0) r->height += parent->height; } static void overlay_draw(struct graphics_priv *parent, struct graphics_priv *overlay, GdkRectangle *re, GdkPixmap *pixmap, GdkGC *gc) { GdkPixbuf *pixbuf,*pixbuf2; guchar *pixels1, *pixels2, *p1, *p2, r=0, g=0, b=0, a=0; int x,y; int rowstride1,rowstride2; int n_channels1,n_channels2; GdkRectangle or,ir; struct graphics_gc_priv *bg=overlay->background_gc; if (bg) { r=bg->c.r>>8; g=bg->c.g>>8; b=bg->c.b>>8; a=bg->c.a>>8; } if (parent->overlay_disabled || overlay->overlay_disabled || overlay->overlay_autodisabled) return; dbg(1,"r->x=%d r->y=%d r->width=%d r->height=%d\n", re->x, re->y, re->width, re->height); overlay_rect(parent, overlay, 0, &or); dbg(1,"or.x=%d or.y=%d or.width=%d or.height=%d\n", or.x, or.y, or.width, or.height); if (! gdk_rectangle_intersect(re, &or, &ir)) return; or.x-=re->x; or.y-=re->y; pixbuf=gdk_pixbuf_get_from_drawable(NULL, overlay->drawable, NULL, 0, 0, 0, 0, or.width, or.height); pixbuf2=gdk_pixbuf_new(gdk_pixbuf_get_colorspace(pixbuf), TRUE, gdk_pixbuf_get_bits_per_sample(pixbuf), or.width, or.height); rowstride1 = gdk_pixbuf_get_rowstride (pixbuf); rowstride2 = gdk_pixbuf_get_rowstride (pixbuf2); pixels1=gdk_pixbuf_get_pixels (pixbuf); pixels2=gdk_pixbuf_get_pixels (pixbuf2); n_channels1 = gdk_pixbuf_get_n_channels (pixbuf); n_channels2 = gdk_pixbuf_get_n_channels (pixbuf2); for (y = 0 ; y < or.height ; y++) { for (x = 0 ; x < or.width ; x++) { p1 = pixels1 + y * rowstride1 + x * n_channels1; p2 = pixels2 + y * rowstride2 + x * n_channels2; p2[0]=p1[0]; p2[1]=p1[1]; p2[2]=p1[2]; if (bg && p1[0] == r && p1[1] == g && p1[2] == b) p2[3]=a; else p2[3]=overlay->a; } } gdk_draw_pixbuf(pixmap, gc, pixbuf2, 0, 0, or.x, or.y, or.width, or.height, GDK_RGB_DITHER_NONE, 0, 0); g_object_unref(pixbuf); g_object_unref(pixbuf2); } static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { GtkWidget *widget=gr->widget; gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], gr->drawable, p->x, p->y, p->x, p->y, w, h); } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (!gr->cleanup) { gr->pclean=gr->p; gr->cleanup=1; } if (p) gr->p=*p; else { gr->p.x=0; gr->p.y=0; } } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background_gc=gc; } static void gtk_drawing_area_draw(struct graphics_priv *gr, GdkRectangle *r) { GdkPixmap *pixmap; GtkWidget *widget=gr->widget; GdkGC *gc=widget->style->fg_gc[GTK_WIDGET_STATE(widget)]; struct graphics_priv *overlay; if (! gr->drawable) return; pixmap = gdk_pixmap_new(widget->window, r->width, r->height, -1); if ((gr->p.x || gr->p.y) && gr->background_gc) gdk_draw_rectangle(pixmap, gr->background_gc->gc, TRUE, 0, 0, r->width, r->height); gdk_draw_drawable(pixmap, gc, gr->drawable, r->x, r->y, gr->p.x, gr->p.y, r->width, r->height); overlay=gr->overlays; while (overlay) { overlay_draw(gr,overlay,r,pixmap,gc); overlay=overlay->next; } gdk_draw_drawable(widget->window, gc, pixmap, 0, 0, r->x, r->y, r->width, r->height); g_object_unref(pixmap); } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { GdkRectangle r; struct graphics_priv *overlay; #if 0 if (mode == draw_mode_begin) { if (! gr->parent && gr->background_gc) gdk_draw_rectangle(gr->drawable, gr->background_gc->gc, TRUE, 0, 0, gr->width, gr->height); } #endif if (mode == draw_mode_end && gr->mode != draw_mode_cursor) { if (gr->parent) { if (gr->cleanup) { overlay_rect(gr->parent, gr, 1, &r); gtk_drawing_area_draw(gr->parent, &r); gr->cleanup=0; } overlay_rect(gr->parent, gr, 0, &r); gtk_drawing_area_draw(gr->parent, &r); } else { r.x=0; r.y=0; r.width=gr->width; r.height=gr->height; gtk_drawing_area_draw(gr, &r); overlay=gr->overlays; while (overlay) { overlay->cleanup=0; overlay=overlay->next; } } } gr->mode=mode; } /* Events */ static gint configure(GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) { struct graphics_priv *gra=user_data; if (! gra->visible) return TRUE; if (gra->drawable != NULL) { g_object_unref(gra->drawable); } if(gra->background_ready && gra->background != NULL) { g_object_unref(gra->background); gra->background_ready = 0; } #ifndef _WIN32 dbg(1,"window=%lu\n", GDK_WINDOW_XID(widget->window)); #endif gra->width=widget->allocation.width; gra->height=widget->allocation.height; gra->drawable = gdk_pixmap_new(widget->window, gra->width, gra->height, -1); callback_list_call_attr_2(gra->cbl, attr_resize, GINT_TO_POINTER(gra->width), GINT_TO_POINTER(gra->height)); return TRUE; } static gint expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) { struct graphics_priv *gra=user_data; gra->visible=1; if (! gra->drawable) configure(widget, NULL, user_data); gtk_drawing_area_draw(gra, &event->area); #if 0 gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], gra->drawable, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); #endif return FALSE; } #if 0 static gint button_timeout(gpointer user_data) { #if 0 struct container *co=user_data; int x=co->gra->gra->button_event.x; int y=co->gra->gra->button_event.y; int button=co->gra->gra->button_event.button; co->gra->gra->button_timeout=0; popup(co, x, y, button); return FALSE; #endif } #endif static int tv_delta(struct timeval *old, struct timeval *new) { if (new->tv_sec-old->tv_sec >= INT_MAX/1000) return INT_MAX; return (new->tv_sec-old->tv_sec)*1000+(new->tv_usec-old->tv_usec)/1000; } static gint button_press(GtkWidget * widget, GdkEventButton * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); if (event->button < 8) { if (tv_delta(&this->button_press[event->button], &tv) < this->timeout) return FALSE; this->button_press[event->button]= tv; this->button_release[event->button].tv_sec=0; this->button_release[event->button].tv_usec=0; } p.x=event->x; p.y=event->y; callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(event->button), (void *)&p); return FALSE; } static gint button_release(GtkWidget * widget, GdkEventButton * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); if (event->button < 8) { if (tv_delta(&this->button_release[event->button], &tv) < this->timeout) return FALSE; this->button_release[event->button]= tv; this->button_press[event->button].tv_sec=0; this->button_press[event->button].tv_usec=0; } p.x=event->x; p.y=event->y; callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(event->button), (void *)&p); return FALSE; } static gint scroll(GtkWidget * widget, GdkEventScroll * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; int button; p.x=event->x; p.y=event->y; switch (event->direction) { case GDK_SCROLL_UP: button=4; break; case GDK_SCROLL_DOWN: button=5; break; default: button=-1; break; } if (button != -1) { callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(button), (void *)&p); callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(button), (void *)&p); } return FALSE; } static gint motion_notify(GtkWidget * widget, GdkEventMotion * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; p.x=event->x; p.y=event->y; callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); return FALSE; } /* * * * Exit navit (X pressed) * * @param widget active widget * * @param event the event (delete_event) * * @param user_data Pointer to private data structure * * @returns TRUE * */ static gint delete(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { struct graphics_priv *this=user_data; dbg(3,"enter this->win=%p\n",this->win); if (this->delay & 2) { if (this->win) this->win=NULL; } else { callback_list_call_attr_0(this->cbl, attr_window_closed); } return TRUE; } static gint keypress(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { struct graphics_priv *this=user_data; int len,ucode; char key[8]; ucode=gdk_keyval_to_unicode(event->keyval); len=g_unichar_to_utf8(ucode, key); key[len]='\0'; switch (event->keyval) { case GDK_Up: key[0]=NAVIT_KEY_UP; key[1]='\0'; break; case GDK_Down: key[0]=NAVIT_KEY_DOWN; key[1]='\0'; break; case GDK_Left: key[0]=NAVIT_KEY_LEFT; key[1]='\0'; break; case GDK_Right: key[0]=NAVIT_KEY_RIGHT; key[1]='\0'; break; case GDK_BackSpace: key[0]=NAVIT_KEY_BACKSPACE; key[1]='\0'; break; case GDK_Tab: key[0]='\t'; key[1]='\0'; break; case GDK_Delete: key[0]=NAVIT_KEY_DELETE; key[1]='\0'; break; case GDK_Escape: key[0]=NAVIT_KEY_BACK; key[1]='\0'; break; case GDK_Return: case GDK_KP_Enter: key[0]=NAVIT_KEY_RETURN; key[1]='\0'; break; case GDK_Book: #ifdef USE_HILDON case GDK_F7: #endif key[0]=NAVIT_KEY_ZOOM_IN; key[1]='\0'; break; case GDK_Calendar: #ifdef USE_HILDON case GDK_F8: #endif key[0]=NAVIT_KEY_ZOOM_OUT; key[1]='\0'; break; } if (key[0]) callback_list_call_attr_1(this->cbl, attr_keypress, (void *)key); else dbg(3,"keyval 0x%x\n", event->keyval); return FALSE; } static struct graphics_priv *graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth); static void overlay_disable(struct graphics_priv *gr, int disabled) { if (!gr->overlay_disabled != !disabled) { gr->overlay_disabled=disabled; if (gr->parent) { GdkRectangle r; overlay_rect(gr->parent, gr, 0, &r); gtk_drawing_area_draw(gr->parent, &r); } } } static void overlay_resize(struct graphics_priv *this, struct point *p, int w, int h, int alpha, int wraparound) { //do not dereference parent for non overlay osds if(!this->parent) { return; } int changed = 0; int w2,h2; if (w == 0) { w2 = 1; } else { w2 = w; } if (h == 0) { h2 = 1; } else { h2 = h; } this->p = *p; if (this->width != w2) { this->width = w2; changed = 1; } if (this->height != h2) { this->height = h2; changed = 1; } this->a = alpha >> 8; this->wraparound = wraparound; if (changed) { // Set the drawables to the right sizes g_object_unref(this->drawable); g_object_unref(this->background); this->drawable=gdk_pixmap_new(this->parent->widget->window, w2, h2, -1); this->background=gdk_pixmap_new(this->parent->widget->window, w2, h2, -1); if ((w == 0) || (h == 0)) { this->overlay_autodisabled = 1; } else { this->overlay_autodisabled = 0; } callback_list_call_attr_2(this->cbl, attr_resize, GINT_TO_POINTER(this->width), GINT_TO_POINTER(this->height)); } } static void get_data_window(struct graphics_priv *this, unsigned int xid) { if (!xid) this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); else this->win = gtk_plug_new(xid); if (!gtk_widget_get_parent(this->widget)) gtk_widget_ref(this->widget); gtk_window_set_default_size(GTK_WINDOW(this->win), this->win_w, this->win_h); dbg(1,"h= %i, w= %i\n",this->win_h, this->win_w); gtk_window_set_title(GTK_WINDOW(this->win), this->window_title); gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", this->window_title); gtk_widget_realize(this->win); if (gtk_widget_get_parent(this->widget)) gtk_widget_reparent(this->widget, this->win); else gtk_container_add(GTK_CONTAINER(this->win), this->widget); gtk_widget_show_all(this->win); GTK_WIDGET_SET_FLAGS (this->widget, GTK_CAN_FOCUS); gtk_widget_set_sensitive(this->widget, TRUE); gtk_widget_grab_focus(this->widget); g_signal_connect(G_OBJECT(this->widget), "key-press-event", G_CALLBACK(keypress), this); g_signal_connect(G_OBJECT(this->win), "delete_event", G_CALLBACK(delete), this); } static int set_attr(struct graphics_priv *gr, struct attr *attr) { dbg(3,"enter\n"); switch (attr->type) { case attr_windowid: get_data_window(gr, attr->u.num); return 1; default: return 0; } } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) { int w2,h2; struct graphics_priv *this=graphics_gtk_drawing_area_new_helper(meth); this->colormap=gr->colormap; this->widget=gr->widget; this->p=*p; this->width=w; this->height=h; this->parent=gr; /* If either height or width is 0, we set it to 1 to avoid warnings, and * disable the overlay. */ if (h == 0) { h2 = 1; } else { h2 = h; } if (w == 0) { w2 = 1; } else { w2 = w; } this->background=gdk_pixmap_new(gr->widget->window, w2, h2, -1); this->drawable=gdk_pixmap_new(gr->widget->window, w2, h2, -1); if ((w == 0) || (h == 0)) { this->overlay_autodisabled = 1; } else { this->overlay_autodisabled = 0; } this->next=gr->overlays; this->a=alpha >> 8; this->wraparound=wraparound; gr->overlays=this; return this; } static int gtk_argc; static char **gtk_argv={NULL}; static int graphics_gtk_drawing_area_fullscreen(struct window *w, int on) { struct graphics_priv *gr=w->priv; if (on) gtk_window_fullscreen(GTK_WINDOW(gr->win)); else gtk_window_unfullscreen(GTK_WINDOW(gr->win)); return 1; } static void graphics_gtk_drawing_area_disable_suspend(struct window *w) { struct graphics_priv *gr=w->priv; #ifndef _WIN32 if (gr->pid) kill(gr->pid, SIGWINCH); #else dbg(1, "failed to kill() under Windows\n"); #endif } static void * get_data(struct graphics_priv *this, char const *type) { FILE *f; if (!strcmp(type,"gtk_widget")) return this->widget; #ifndef _WIN32 if (!strcmp(type,"xwindow_id")) return (void *)GDK_WINDOW_XID(this->win ? this->win->window : this->widget->window); #endif if (!strcmp(type,"window")) { char *cp = getenv("NAVIT_XID"); unsigned xid = 0; if (cp) xid = strtol(cp, NULL, 0); if (!(this->delay & 1)) get_data_window(this, xid); this->window.fullscreen=graphics_gtk_drawing_area_fullscreen; this->window.disable_suspend=graphics_gtk_drawing_area_disable_suspend; this->window.priv=this; #if !defined(_WIN32) && !defined(__CEGCC__) f=popen("pidof /usr/bin/ipaq-sleep","r"); if (f) { fscanf(f,"%d",&this->pid); dbg(1,"ipaq_sleep pid=%d\n", this->pid); pclose(f); } #endif return &this->window; } return NULL; } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, #ifdef HAVE_IMLIB2 draw_image_warp, #else NULL, #endif draw_restore, draw_drag, NULL, /* font_new */ gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, /* get_text_bbox */ overlay_disable, overlay_resize, set_attr, }; static struct graphics_priv * graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth) { struct font_priv * (*font_freetype_new)(void *meth); font_freetype_new=plugin_get_font_type("freetype"); if (!font_freetype_new) return NULL; struct graphics_priv *this=g_new0(struct graphics_priv,1); font_freetype_new(&this->freetype_methods); *meth=graphics_methods; meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))this->freetype_methods.font_new; meth->get_text_bbox=(void(*)(struct graphics_priv*, struct graphics_font_priv *, char *, int, int, struct point *, int))this->freetype_methods.get_text_bbox; return this; } static struct graphics_priv * graphics_gtk_drawing_area_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { int i; GtkWidget *draw; struct attr *attr; if (! event_request_system("glib","graphics_gtk_drawing_area_new")) return NULL; draw=gtk_drawing_area_new(); struct graphics_priv *this=graphics_gtk_drawing_area_new_helper(meth); this->nav = nav; this->widget=draw; this->win_w=792; if ((attr=attr_search(attrs, NULL, attr_w))) this->win_w=attr->u.num; this->win_h=547; if ((attr=attr_search(attrs, NULL, attr_h))) this->win_h=attr->u.num; this->timeout=100; if ((attr=attr_search(attrs, NULL, attr_timeout))) this->timeout=attr->u.num; this->delay=0; if ((attr=attr_search(attrs, NULL, attr_delay))) this->delay=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_window_title))) this->window_title=g_strdup(attr->u.str); else this->window_title=g_strdup("Navit"); this->cbl=cbl; this->colormap=gdk_colormap_new(gdk_visual_get_system(),FALSE); gtk_widget_set_events(draw, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_KEY_PRESS_MASK); g_signal_connect(G_OBJECT(draw), "expose_event", G_CALLBACK(expose), this); g_signal_connect(G_OBJECT(draw), "configure_event", G_CALLBACK(configure), this); g_signal_connect(G_OBJECT(draw), "button_press_event", G_CALLBACK(button_press), this); g_signal_connect(G_OBJECT(draw), "button_release_event", G_CALLBACK(button_release), this); g_signal_connect(G_OBJECT(draw), "scroll_event", G_CALLBACK(scroll), this); g_signal_connect(G_OBJECT(draw), "motion_notify_event", G_CALLBACK(motion_notify), this); g_signal_connect(G_OBJECT(draw), "delete_event", G_CALLBACK(delete), nav); for (i = 0; i < 8; i++) { this->button_press[i].tv_sec = 0; this->button_press[i].tv_usec = 0; this->button_release[i].tv_sec = 0; this->button_release[i].tv_usec = 0; } return this; } void plugin_init(void) { gtk_init(>k_argc, >k_argv); gtk_set_locale(); #ifdef HAVE_API_WIN32 setlocale(LC_NUMERIC, "C"); /* WIN32 gtk resets LC_NUMERIC */ #endif plugin_register_graphics_type("gtk_drawing_area", graphics_gtk_drawing_area_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/gtk_gl_ext/000077500000000000000000000000001221777731700222505ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/gtk_gl_ext/graphics_gtk_gl_ext.c000066400000000000000000000172611221777731700264320ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "point.h" #include "graphics.h" #include "container.h" struct graphics_gra { GtkWidget *widget; int width; int height; int library_init; int visible; int buffer; }; struct graphics_font { }; struct graphics_gc { double fr,fg,fb; double br,bg,bb; double width; struct graphics_gra *gra; }; static struct graphics_font *font_new(struct graphics *gr, int size) { struct graphics_font *font=g_new(struct graphics_font, 1); return font; } static struct graphics_gc *gc_new(struct graphics *gr) { struct graphics_gc *gc=g_new(struct graphics_gc, 1); gc->fr=1; gc->fg=1; gc->fb=1; gc->br=0; gc->bg=0; gc->bb=0; gc->width=1; gc->gra=gr->gra; return gc; } static void gc_set_linewidth(struct graphics_gc *gc, int w) { gc->width=w; } static void gc_set_foreground(struct graphics_gc *gc, int r, int g, int b) { gc->fr=r/65535.0; gc->fg=g/65535.0; gc->fb=b/65535.0; } static void gc_set_background(struct graphics_gc *gc, int r, int g, int b) { gc->br=r/65535.0; gc->bg=g/65535.0; gc->bb=b/65535.0; } static void vertex(struct point *p) { double x,y; x=p->x; y=p->y; x/=792; y/=469; x-=0.5; y=0.5-y; glVertex3f(x,y,0); } static void draw_lines(struct graphics *gr, struct graphics_gc *gc, struct point *p, int count) { int i; glLineWidth(gc->width); glColor3f(gc->fr, gc->fg, gc->fb); glBegin(GL_LINE_STRIP); for (i=0 ; i < count ; i++) vertex(p++); glEnd(); } static void draw_polygon(struct graphics *gr, struct graphics_gc *gc, struct point *p, int count) { int i; double x,y; glColor3f(gc->fr, gc->fg, gc->fb); glBegin(GL_POLYGON); for (i=0 ; i < count ; i++) vertex(p++); glEnd(); } static void draw_circle(struct graphics *gr, struct graphics_gc *gc, struct point *p, int r) { } static void draw_text(struct graphics *gr, struct graphics_gc *fg, struct graphics_gc *bg, struct graphics_font *font, unsigned char *text, int x, int y, int dx, int dy) { } static void draw_begin(struct graphics *gr) { printf("draw_begin\n"); glClearColor(gr->gc[0]->br, gr->gc[0]->bg, gr->gc[0]->bb, 0); glNewList(1, GL_COMPILE); gr->gra->buffer=1; } static void draw_end(struct graphics *gr) { printf("draw_end\n"); glEndList(); gr->gra->buffer=0; } static void realize(GtkWidget * widget, gpointer data) { GdkGLContext *glcontext = gtk_widget_get_gl_context(widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget); GLUquadricObj *qobj; static GLfloat light_diffuse[] = { 1.0, 0.0, 0.0, 1.0 }; static GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; /*** OpenGL BEGIN ***/ if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) return; qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); #if 0 glNewList(1, GL_COMPILE); gluSphere(qobj, 1.0, 20, 20); glBegin(GL_LINE_STRIP); glVertex3f(0.0,0.1,0.0); glVertex3f(0.1,0.1,0.0); glVertex3f(0.1,0.2,0.0); glVertex3f(0.2,0.2,0.0); glEnd(); glEndList(); #endif #if 0 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); #endif glClearColor(1.0, 1.0, 1.0, 1.0); glClearDepth(1.0); glViewport(0, 0, widget->allocation.width, widget->allocation.height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(19.0, 1.0, 1.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, 0.0); gdk_gl_drawable_gl_end(gldrawable); /*** OpenGL END ***/ } static gboolean configure(GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) { GdkGLContext *glcontext = gtk_widget_get_gl_context(widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget); struct container *co=user_data; struct graphics_gra *gra=co->gra->gra; printf("configure %d %d\n",gra->width, gra->height); gra->width=widget->allocation.width; gra->height=widget->allocation.height; /*** OpenGL BEGIN ***/ if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) return FALSE; glViewport(0, 0, widget->allocation.width, widget->allocation.height); gdk_gl_drawable_gl_end(gldrawable); /*** OpenGL END ***/ if (gra->visible) graphics_resize(co, gra->width, gra->height); return TRUE; } static gboolean expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) { GdkGLContext *glcontext = gtk_widget_get_gl_context(widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget); struct container *co=user_data; struct graphics_gra *gra=co->gra->gra; printf("expose\n"); if (! gra->visible) { gra->visible=1; configure(widget, NULL, user_data); } /*** OpenGL BEGIN ***/ if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) return FALSE; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(1); if (gdk_gl_drawable_is_double_buffered(gldrawable)) gdk_gl_drawable_swap_buffers(gldrawable); else glFlush(); gdk_gl_drawable_gl_end(gldrawable); /*** OpenGL END ***/ return TRUE; } struct graphics * graphics_gtk_gl_area_new(struct container *co, GtkWidget **widget) { GdkGLConfig *glconfig; gint major, minor; GtkWidget *drawing_area; struct graphics *this=g_new0(struct graphics,1); this->draw_lines=draw_lines; this->draw_polygon=draw_polygon; this->draw_circle=draw_circle; this->draw_text=draw_text; #if 0 this->draw_begin=draw_begin; this->draw_end=draw_end; #endif this->gc_new=gc_new; this->gc_set_linewidth=gc_set_linewidth; this->gc_set_foreground=gc_set_foreground; this->gc_set_background=gc_set_background; this->font_new=font_new; this->gra=g_new0(struct graphics_gra, 1); /* * Init GtkGLExt. */ gtk_gl_init(NULL, NULL); /* * Query OpenGL extension version. */ gdk_gl_query_version(&major, &minor); g_print("OpenGL extension version - %d.%d\n", major, minor); /* * Configure OpenGL-capable visual. */ /* Try double-buffered visual */ glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); if (glconfig == NULL) { g_print("*** Cannot find the double-buffered visual.\n"); g_print("*** Trying single-buffered visual.\n"); /* Try single-buffered visual */ glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH); if (glconfig == NULL) { g_print ("*** No appropriate OpenGL-capable visual found.\n"); exit(1); } } drawing_area = gtk_drawing_area_new(); /* Set OpenGL-capability to the widget. */ gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); g_signal_connect_after(G_OBJECT(drawing_area), "realize", G_CALLBACK(realize), NULL); g_signal_connect(G_OBJECT(drawing_area), "configure_event", G_CALLBACK(configure), co); g_signal_connect(G_OBJECT(drawing_area), "expose_event", G_CALLBACK(expose), co); *widget=drawing_area; this->gra->widget=drawing_area; return this; } navit-0.5.0~svn5643+dfsg.1/navit/graphics/null/000077500000000000000000000000001221777731700210735ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/null/CMakeLists.txt000066400000000000000000000000621221777731700236310ustar00rootroot00000000000000module_add_library(graphics_null graphics_null.c) navit-0.5.0~svn5643+dfsg.1/navit/graphics/null/Makefile.am000066400000000000000000000005271221777731700231330ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_null if PLUGINS modulegraphics_LTLIBRARIES = libgraphics_null.la else noinst_LTLIBRARIES = libgraphics_null.la endif libgraphics_null_la_SOURCES = graphics_null.c libgraphics_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/graphics/null/graphics_null.c000066400000000000000000000173061221777731700241000ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include "item.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "event.h" #include "debug.h" #include "window.h" #include "callback.h" #if defined(WINDOWS) || defined(WIN32) || defined (HAVE_API_WIN32_CE) #include # define sleep(i) Sleep(i * 1000) #endif static struct callback_list* callbacks; static struct graphics_priv { int dummy; } graphics_priv; static struct graphics_font_priv { int dummy; } graphics_font_priv; static struct graphics_gc_priv { int dummy; } graphics_gc_priv; static struct graphics_image_priv { int dummy; } graphics_image_priv; static void graphics_destroy(struct graphics_priv *gr) { } static void font_destroy(struct graphics_font_priv *font) { } static struct graphics_font_methods font_methods = { font_destroy }; static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) { *meth=font_methods; return &graphics_font_priv; } static void gc_destroy(struct graphics_gc_priv *gc) { } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { *meth=gc_methods; return &graphics_gc_priv; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { return &graphics_image_priv; } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { } static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { } static void draw_drag(struct graphics_priv *gr, struct point *p) { } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); static void resize_callback(int w, int h) { callback_list_call_attr_2(callbacks, attr_resize, GINT_TO_POINTER(1), GINT_TO_POINTER(1)); } static int graphics_null_fullscreen(struct window *w, int on) { return 1; } static void graphics_null_disable_suspend(struct window *w) { } static void * get_data(struct graphics_priv *this, char const *type) { if (strcmp(type, "window") == 0) { struct window *win; win = g_new0(struct window, 1); win->priv = this; win->fullscreen = graphics_null_fullscreen; win->disable_suspend = graphics_null_disable_suspend; resize_callback(1,1); return win; } return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { } static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) { } static void overlay_disable(struct graphics_priv *gr, int disable) { } static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound) { } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_restore, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, image_free, get_text_bbox, overlay_disable, overlay_resize, }; static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) { *meth=graphics_methods; return &graphics_priv; } static struct graphics_priv * graphics_null_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct attr *event_loop_system = NULL; *meth=graphics_methods; event_loop_system = attr_search(attrs, NULL, attr_event_loop_system); if (event_loop_system && event_loop_system->u.str) { dbg(1, "event_system is %s\n", event_loop_system->u.str); if (!event_request_system(event_loop_system->u.str, "graphics_null")) return NULL; } else { if (!event_request_system("null", "graphics_null")) return NULL; } callbacks = cbl; resize_callback(1,1); return &graphics_priv; } static void event_null_main_loop_run(void) { dbg(0,"enter\n"); for (;;) sleep(1); } static void event_null_main_loop_quit(void) { dbg(0,"enter\n"); } static struct event_watch * event_null_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) { dbg(0,"enter\n"); return NULL; } static void event_null_remove_watch(struct event_watch *ev) { dbg(0,"enter\n"); } static struct event_timeout * event_null_add_timeout(int timeout, int multi, struct callback *cb) { dbg(0,"enter\n"); return NULL; } static void event_null_remove_timeout(struct event_timeout *to) { dbg(0,"enter\n"); } static struct event_idle * event_null_add_idle(int priority, struct callback *cb) { dbg(0,"enter\n"); return NULL; } static void event_null_remove_idle(struct event_idle *ev) { dbg(0,"enter\n"); } static void event_null_call_callback(struct callback_list *cb) { dbg(0,"enter\n"); } static struct event_methods event_null_methods = { event_null_main_loop_run, event_null_main_loop_quit, event_null_add_watch, event_null_remove_watch, event_null_add_timeout, event_null_remove_timeout, event_null_add_idle, event_null_remove_idle, event_null_call_callback, }; static struct event_priv * event_null_new(struct event_methods *meth) { *meth=event_null_methods; return NULL; } void plugin_init(void) { plugin_register_graphics_type("null", graphics_null_new); plugin_register_event_type("null", event_null_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/000077500000000000000000000000001221777731700214055ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/CMakeLists.txt000066400000000000000000000003531221777731700241460ustar00rootroot00000000000000set(graphics_opengl_SOURCES graphics_opengl.c) if (USE_OPENGLES) LIST(APPEND graphics_opengl_SOURCES graphics_opengl_x11.c graphics_opengl_egl.c) endif (USE_OPENGLES) module_add_library(graphics_opengl ${graphics_opengl_SOURCES}) navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/Makefile.am000066400000000000000000000005401221777731700234400ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @OPENGL_CFLAGS@ @GLC_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_opengl modulegraphics_LTLIBRARIES = libgraphics_opengl.la libgraphics_opengl_la_SOURCES = graphics_opengl.c libgraphics_opengl_la_LIBADD = @OPENGL_LIBS@ @GLC_LIBS@ libgraphics_opengl_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/graphics_opengl.c000066400000000000000000001230571221777731700247250ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define USE_FLOAT 0 #define REQUIRES_POWER_OF_2 0 #include #include #include #include #include #include "item.h" #include "attr.h" #include "config.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "event.h" #include "debug.h" #include "callback.h" #include "keys.h" #include "window.h" #include "navit/font/freetype/font_freetype.h" #include "graphics_opengl.h" #if defined(WINDOWS) || defined(WIN32) #define PIXEL_FORMAT GL_RGBA #include # define sleep(i) Sleep(i * 1000) #else #define PIXEL_FORMAT GL_BGRA #endif #if HAVE_FREEIMAGE #include #endif #ifdef USE_OPENGLES #ifdef USE_OPENGLES2 #include #include #undef USE_FLOAT #define USE_FLOAT 1 #else #include #include #endif #ifdef USE_GLUT_FOR_OPENGLES #define APIENTRY #define GLU_TESS_BEGIN 100100 #define GLU_TESS_VERTEX 100101 #define GLU_TESS_END 100102 #define GLU_TESS_COMBINE 100105 typedef struct GLUtesselator GLUtesselator; typedef double GLdouble; #endif #else #define glOrthof glOrtho #undef USE_FLOAT #define USE_FLOAT 1 #ifdef __APPLE__ #include #else #include /* glut.h includes gl.h and glu.h */ #endif #endif #if USE_FLOAT #define glF(x) x #define glD(x) x #define GL_F GL_FLOAT typedef GLfloat GLf; #else #define glF(x) ((GLfixed)((x)*(1<<16))) #define glD(x) glF(x) #define GL_F GL_FIXED typedef GLfixed GLf; #define glClearColor glClearColorx #define glTranslatef glTranslatex #define glRotatef glRotatex #define glMaterialfv glMaterialxv #define glMaterialf glMaterialx #define glOrthof glOrthox #define glScalef glScalex #define glColor4f glColor4x #endif #ifdef FREEGLUT #include #endif #define SCREEN_WIDTH 700 #define SCREEN_HEIGHT 700 //#define MIRRORED_VIEW 1 struct graphics_gc_priv { struct graphics_priv *gr; float fr, fg, fb, fa; float br, bg, bb, ba; int linewidth; unsigned char *dash_list; int dash_count; int dash_mask; } graphics_gc_priv; struct graphics_priv { int button_timeout; struct point p; int width; int height; int library_init; int visible; int overlay_enabled; int overlay_autodisabled; int wraparound; struct graphics_priv *parent; struct graphics_priv *overlays; struct graphics_priv *next; struct graphics_gc_priv *background_gc; enum draw_mode_num mode; void (*resize_callback) (void *data, int w, int h); void *resize_callback_data; void (*motion_callback) (void *data, struct point * p); void *motion_callback_data; void (*button_callback) (void *data, int press, int button, struct point * p); void *button_callback_data; #ifdef USE_OPENGLES GLuint program; GLint mvp_location, position_location, color_location, texture_position_location, use_texture_location, texture_location; #else GLuint DLid; #endif struct callback_list *cbl; struct font_freetype_methods freetype_methods; struct navit *nav; int timeout; int delay; struct window window; int dirty; //display needs to be redrawn (draw on root graphics or overlay is done) int force_redraw; //display needs to be redrawn (draw on root graphics or overlay is done) time_t last_refresh_time; //last display refresh time struct graphics_opengl_window_system *window_system; struct graphics_opengl_window_system_methods *window_system_methods; struct graphics_opengl_platform *platform; struct graphics_opengl_platform_methods *platform_methods; }; static struct graphics_priv *graphics_priv_root; struct graphics_image_priv { int w; int h; int hot_x; int hot_y; unsigned char *data; char *path; } graphics_image_priv; struct mouse_event_queue_element { int button; int state; int x; int y; }; static const int mouse_event_queue_size = 100; static int mouse_event_queue_begin_idx = 0; static int mouse_event_queue_end_idx = 0; static struct mouse_event_queue_element mouse_queue[100]; //hastable for uncompressed image data static GHashTable *hImageData; #ifdef USE_OPENGLES #else /* prototypes */ void APIENTRY tessBeginCB(GLenum which); void APIENTRY tessEndCB(void); void APIENTRY tessErrorCB(GLenum errorCode); void APIENTRY tessVertexCB(const GLvoid * data); void APIENTRY tessVertexCB2(const GLvoid * data); void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out); const char *getPrimitiveType(GLenum type); #endif static struct graphics_priv *graphics_opengl_new_helper(struct graphics_methods *meth); static void display(void); static void resize_callback(int w, int h); #ifdef USE_OPENGLES static void click_notify_do(struct graphics_priv *priv, int button, int state, int x, int y); #endif static void motion_notify_do(struct graphics_priv *priv, int x, int y); static void resize_callback_do(struct graphics_priv *priv, int w, int h); static void glut_close(void); #ifdef USE_OPENGLES2 const char vertex_src [] = " \ attribute vec2 position; \ attribute vec2 texture_position; \ uniform mat4 mvp; \ varying vec2 v_texture_position; \ \ void main() \ { \ v_texture_position=texture_position; \ gl_Position = mvp*vec4(position, 0.0, 1.0); \ } \ "; const char fragment_src [] = " \ uniform lowp vec4 avcolor; \ uniform sampler2D texture; \ uniform bool use_texture; \ varying vec2 v_texture_position; \ void main() \ { \ if (use_texture) { \ gl_FragColor = texture2D(texture, v_texture_position); \ } else { \ gl_FragColor = avcolor; \ } \ } \ "; #endif static void graphics_destroy(struct graphics_priv *gr) { /*FIXME graphics_destroy is never called */ /*TODO add destroy code for image cache(delete entries in hImageData) */ g_free(gr); gr = NULL; } static void gc_destroy(struct graphics_gc_priv *gc) { gc->gr->freetype_methods.destroy(); g_free(gc); gc = NULL; } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int width, int offset, unsigned char *dash_list, int n) { int i; const int cOpenglMaskBits = 16; gc->dash_count = n; if (1 == n) { gc->dash_mask = 0; for (i = 0; i < cOpenglMaskBits; ++i) { gc->dash_mask <<= 1; gc->dash_mask |= (i / n) % 2; } } else if (1 < n) { unsigned char *curr = dash_list; int cnt = 0; //dot counter int dcnt = 0; //dash element counter int sum_dash = 0; gc->dash_mask = 0; for (i = 0; i < n; ++i) { sum_dash += dash_list[i]; } //scale dashlist elements to max size if (sum_dash > cOpenglMaskBits) { int num_error[2] = { 0, 0 }; //count elements rounded to 0 for odd(drawn) and even(masked) for compensation double factor = (1.0 * cOpenglMaskBits) / sum_dash; for (i = 0; i < n; ++i) { //calculate dashlist max and largest common denomiator for scaling dash_list[i] *= factor; if (dash_list[i] == 0) { ++dash_list[i]; ++num_error[i % 2]; } else if (0 < num_error[i % 2] && 2 < dash_list[i]) { ++dash_list[i]; --num_error[i % 2]; } } } //calculate mask for (i = 0; i < cOpenglMaskBits; ++i) { gc->dash_mask <<= 1; gc->dash_mask |= 1 - dcnt % 2; ++cnt; if (cnt == *curr) { cnt = 0; ++curr; ++dcnt; if (dcnt == n) { curr = dash_list; } } } } } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->fr = c->r / 65535.0; gc->fg = c->g / 65535.0; gc->fb = c->b / 65535.0; gc->fa = c->a / 65535.0; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { gc->br = c->r / 65535.0; gc->bg = c->g / 65535.0; gc->bb = c->b / 65535.0; gc->ba = c->a / 65535.0; } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv * gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *gc = g_new0(struct graphics_gc_priv, 1); *meth = gc_methods; gc->gr = gr; gc->linewidth = 1; return gc; } static struct graphics_image_priv image_error; static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { #if HAVE_FREEIMAGE FIBITMAP *image; RGBQUAD aPixel; unsigned char *data; int width, height, i, j; struct graphics_image_priv *gi; //check if image already exists in hashmap struct graphics_image_priv *curr_elem = g_hash_table_lookup(hImageData, path); if (curr_elem == &image_error) { //found but couldn't be loaded return NULL; } else if (curr_elem) { //found and OK -> use hastable entry *w = curr_elem->w; *h = curr_elem->h; hot->x = curr_elem->w / 2 - 1; hot->y = curr_elem->h / 2 - 1; return curr_elem; } else { if (strlen(path) < 4) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } char *ext_str = path + strlen(path) - 3; if (strstr(ext_str, "png") || strstr(path, "PNG")) { if ((image = FreeImage_Load(FIF_PNG, path, 0)) == NULL) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } } else if (strstr(ext_str, "xpm") || strstr(path, "XPM")) { if ((image = FreeImage_Load(FIF_XPM, path, 0)) == NULL) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } } else if (strstr(ext_str, "svg") || strstr(path, "SVG")) { char path_new[256]; snprintf(path_new, strlen(path) - 3, "%s", path); strcat(path_new, "_48_48.png"); if ((image = FreeImage_Load(FIF_PNG, path_new, 0)) == NULL) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } } else { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } if (FreeImage_GetBPP(image) == 64) { FIBITMAP *image2; image2 = FreeImage_ConvertTo32Bits(image); FreeImage_Unload(image); image = image2; } #if FREEIMAGE_MAJOR_VERSION*100+FREEIMAGE_MINOR_VERSION >= 313 if (rotation) { FIBITMAP *image2; image2 = FreeImage_Rotate(image, rotation, NULL); image = image2; } #endif gi = g_new0(struct graphics_image_priv, 1); width = FreeImage_GetWidth(image); height = FreeImage_GetHeight(image); if ((*w != width || *h != height) && 0 < *w && 0 < *h) { FIBITMAP *image2; image2 = FreeImage_Rescale(image, *w, *h, FILTER_BOX); FreeImage_Unload(image); image = image2; width = *w; height = *h; } data = (unsigned char *) malloc(width * height * 4); RGBQUAD *palette = NULL; if (FreeImage_GetBPP(image) == 8) { palette = FreeImage_GetPalette(image); } for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { unsigned char idx; if (FreeImage_GetBPP(image) == 8) { FreeImage_GetPixelIndex(image, j, height - i - 1, &idx); data[4 * width * i + 4 * j + 0] = palette[idx].rgbRed; data[4 * width * i + 4 * j + 1] = palette[idx].rgbGreen; data[4 * width * i + 4 * j + 2] = palette[idx].rgbBlue; data[4 * width * i + 4 * j + 3] = 255; } else if (FreeImage_GetBPP(image) == 16 || FreeImage_GetBPP(image) == 24 || FreeImage_GetBPP(image) == 32) { FreeImage_GetPixelColor(image, j, height - i - 1, &aPixel); int transparent = (aPixel.rgbRed == 0 && aPixel.rgbBlue == 0 && aPixel.rgbGreen == 0); data[4 * width * i + 4 * j + 0] = transparent ? 0 : (aPixel. rgbRed); data[4 * width * i + 4 * j + 1] = (aPixel.rgbGreen); data[4 * width * i + 4 * j + 2] = transparent ? 0 : (aPixel. rgbBlue); data[4 * width * i + 4 * j + 3] = transparent ? 0 : 255; } } } FreeImage_Unload(image); *w = width; *h = height; gi->w = width; gi->h = height; gi->hot_x = width / 2 - 1; gi->hot_y = height / 2 - 1; hot->x = width / 2 - 1; hot->y = height / 2 - 1; gi->data = data; gi->path = path; //add to hashtable g_hash_table_insert(hImageData, g_strdup(path), gi); return gi; } #else dbg(0,"FreeImage not available - cannot load any images.\n", path); return NULL; #endif } static void set_color(struct graphics_priv *gr, struct graphics_gc_priv *gc) { #ifdef USE_OPENGLES2 GLfloat col[4]; col[0]=gc->fr; col[1]=gc->fg; col[2]=gc->fb; col[3]=1.0; glUniform4fv(gr->color_location, 1, col); #else glColor4f(glF(gc->fr), glF(gc->fg), glF(gc->fb), glF(gc->fa)); #endif } static void draw_array(struct graphics_priv *gr, struct point *p, int count, GLenum mode) { int i; #ifdef USE_OPENGLES GLf x[count*2]; #else glBegin(mode); #endif for (i = 0 ; i < count ; i++) { #ifdef USE_OPENGLES x[i*2]=glF(p[i].x); x[i*2+1]=glF(p[i].y); #else glVertex2f(p[i].x, p[i].y); #endif } #ifdef USE_OPENGLES #ifdef USE_OPENGLES2 glVertexAttribPointer (gr->position_location, 2, GL_FLOAT, 0, 0, x ); #else glVertexPointer(2, GL_F, 0, x); #endif glDrawArrays(mode, 0, count); #else glEnd(); #endif } static void draw_rectangle_do(struct graphics_priv *gr, struct point *p, int w, int h) { struct point pa[4]; pa[0]=pa[1]=pa[2]=pa[3]=*p; pa[0].x+=w; pa[1].x+=w; pa[1].y+=h; pa[3].y+=h; draw_array(gr, pa, 4, GL_TRIANGLE_STRIP); } #ifdef USE_OPENGLES static int next_power2(int x) { int r=1; while (r < x) r*=2; return r; } static void draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned char *data) { GLf x[8]; memset(x, 0, sizeof(x)); #if REQUIRES_POWER_OF_2 int w2=next_power2(w); int h2=next_power2(h); int y; if (w2 != w || h2 != h) { char *newpix=g_malloc0(w2*h2*4); for (y=0 ; y < h ; y++) memcpy(newpix+y*w2*4, data+y*w*4, w*4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, newpix); g_free(newpix); w=w2; h=h2; } else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); #else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); #endif x[0]+=glF(1); x[2]+=glF(1); x[3]+=glF(1); x[7]+=glF(1); #ifdef USE_OPENGLES2 glUniform1i(gr->use_texture_location, 1); glEnableVertexAttribArray(gr->texture_position_location); glVertexAttribPointer (gr->texture_position_location, 2, GL_FLOAT, 0, 0, x ); #else glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glTexCoordPointer(2, GL_F, 0, x); #endif glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); draw_rectangle_do(gr, p, w, h); #ifdef USE_OPENGLES2 glUniform1i(gr->use_texture_location, 0); glDisableVertexAttribArray(gr->texture_position_location); #else glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); #endif glDisable(GL_BLEND); } #endif static void get_overlay_pos(struct graphics_priv *gr, struct point *point_out) { if (gr->parent == NULL) { point_out->x = 0; point_out->y = 0; return; } point_out->x = gr->p.x; if (point_out->x < 0) { point_out->x += gr->parent->width; } point_out->y = gr->p.y; if (point_out->y < 0) { point_out->y += gr->parent->height; } } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } #if !defined(USE_OPENGLES) || defined(USE_OPENGLES2) glLineWidth(gc->linewidth); #endif set_color(gr, gc); graphics_priv_root->dirty = 1; #ifndef USE_OPENGLES if (!gr->parent && 0 < gc->dash_count) { glLineStipple(1, gc->dash_mask); glEnable(GL_LINE_STIPPLE); } #endif draw_array(gr, p, count, GL_LINE_STRIP); #ifndef USE_OPENGLES if (!gr->parent && 0 < gc->dash_count) { glDisable(GL_LINE_STIPPLE); } #endif } #if !defined(USE_OPENGLES) || defined(USE_GLUT_FOR_OPENGLES) static int tess_count; static struct point tess_array[512]; static GLenum tess_type; const char * getPrimitiveType(GLenum type) { char *ret = ""; switch (type) { case 0x0000: ret = "GL_POINTS"; break; case 0x0001: ret = "GL_LINES"; break; case 0x0002: ret = "GL_LINE_LOOP"; break; case 0x0003: ret = "GL_LINE_STRIP"; break; case 0x0004: ret = "GL_TRIANGLES"; break; case 0x0005: ret = "GL_TRIANGLE_STRIP"; break; case 0x0006: ret = "GL_TRIANGLE_FAN"; break; case 0x0007: ret = "GL_QUADS"; break; case 0x0008: ret = "GL_QUAD_STRIP"; break; case 0x0009: ret = "GL_POLYGON"; break; } return ret; } void APIENTRY tessBeginCB(GLenum which) { dbg(1, "glBegin( %s );\n", getPrimitiveType(which)); tess_type=which; tess_count=0; } void APIENTRY tessEndCB(void) { dbg(1, "glEnd();\n"); draw_array(graphics_priv_root, tess_array, tess_count, tess_type); } void APIENTRY tessVertexCB(const GLvoid * data) { // cast back to double type const GLdouble *ptr = (const GLdouble *) data; dbg(1, " glVertex3d();\n"); tess_array[tess_count].x=ptr[0]; tess_array[tess_count].y=ptr[1]; if (tess_count < 511) tess_count++; else dbg(0,"overflow\n"); } void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out) { GLdouble *nv = (GLdouble *) malloc(sizeof(GLdouble) * 3); nv[0] = c[0]; nv[1] = c[1]; nv[2] = c[2]; *out = nv; } #endif static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } set_color(gr, gc); graphics_priv_root->dirty = 1; #if defined(USE_OPENGLES) && !defined(USE_GLUT_FOR_OPENGLES) draw_array(gr, p, count, GL_LINE_STRIP); #else GLUtesselator *tess = gluNewTess(); // create a tessellator if (!tess) return; // failed to create tessellation object, return 0 GLdouble quad1[count][3]; int i; for (i = 0; i < count; i++) { quad1[i][0] = (GLdouble) (p[i].x); quad1[i][1] = (GLdouble) (p[i].y); quad1[i][2] = 0; } // register callback functions gluTessCallback(tess, GLU_TESS_BEGIN, (void (APIENTRY *)(void)) tessBeginCB); gluTessCallback(tess, GLU_TESS_END, (void (APIENTRY *)(void)) tessEndCB); // gluTessCallback(tess, GLU_TESS_ERROR, (void (*)(void))tessErrorCB); gluTessCallback(tess, GLU_TESS_VERTEX, (void (APIENTRY *)(void)) tessVertexCB); gluTessCallback(tess, GLU_TESS_COMBINE, (void (APIENTRY *)(void)) tessCombineCB); // tessellate and compile a concave quad into display list // gluTessVertex() takes 3 params: tess object, pointer to vertex coords, // and pointer to vertex data to be passed to vertex callback. // The second param is used only to perform tessellation, and the third // param is the actual vertex data to draw. It is usually same as the second // param, but It can be more than vertex coord, for example, color, normal // and UV coords which are needed for actual drawing. // Here, we are looking at only vertex coods, so the 2nd and 3rd params are // pointing same address. gluTessBeginPolygon(tess, 0); // with NULL data gluTessBeginContour(tess); for (i = 0; i < count; i++) { gluTessVertex(tess, quad1[i], quad1[i]); } gluTessEndContour(tess); gluTessEndPolygon(tess); gluDeleteTess(tess); // delete after tessellation #endif } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } set_color(gr, gc); draw_rectangle_do(gr, p, w, h); graphics_priv_root->dirty = 1; } static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) { int i, x, y, stride; struct font_freetype_glyph *g, **gp; unsigned char *shadow, *glyph; struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 }; struct color black = { fg->fr * 65535, fg->fg * 65535, fg->fb * 65535, fg->fa * 65535 }; struct color white = { 0xffff, 0xffff, 0xffff, 0xffff }; if (bg) { if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) { black.r = 65535; black.g = 65535; black.b = 65535; black.a = 65535; white.r = 0; white.g = 0; white.b = 0; white.a = 65535; } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) { white.r = 65535; white.g = 65535; white.b = 65535; white.a = 65535; black.r = 0; black.g = 0; black.b = 0; black.a = 65535; } else { white.r = bg->fr; white.g = bg->fg; white.b = bg->fb; white.a = bg->fa; } } else { white.r = 0; white.g = 0; white.b = 0; white.a = 0; } gp = text->glyph; i = text->glyph_count; x = p->x << 6; y = p->y << 6; while (i-- > 0) { g = *gp++; if (g->w && g->h && bg) { stride = (g->w + 2) * 4; if (color) { shadow = g_malloc(stride * (g->h + 2)); gr->freetype_methods.get_shadow(g, shadow, 32, stride, &white, &transparent); #ifdef USE_OPENGLES struct point p; p.x=((x + g->x) >> 6)-1; p.y=((y + g->y) >> 6)-1; draw_image_es(gr, &p, g->w+2, g->h+2, shadow); #else #ifdef MIRRORED_VIEW glPixelZoom(-1.0, -1.0); //mirrored mode #else glPixelZoom(1.0, -1.0); #endif glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6); glDrawPixels(g->w + 2, g->h + 2, PIXEL_FORMAT, GL_UNSIGNED_BYTE, shadow); #endif g_free(shadow); } } x += g->dx; y += g->dy; } x = p->x << 6; y = p->y << 6; gp = text->glyph; i = text->glyph_count; while (i-- > 0) { g = *gp++; if (g->w && g->h) { if (color) { stride = g->w; if (bg) { glyph = g_malloc(stride * g->h * 4); gr->freetype_methods.get_glyph(g, glyph, 32, stride * 4, &black, &white, &transparent); #ifdef USE_OPENGLES struct point p; p.x=(x + g->x) >> 6; p.y=(y + g->y) >> 6; draw_image_es(gr, &p, g->w, g->h, glyph); #else #ifdef MIRRORED_VIEW glPixelZoom(-1.0, -1.0); //mirrored mode #else glPixelZoom(1.0, -1.0); #endif glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6); glDrawPixels(g->w, g->h, PIXEL_FORMAT, GL_UNSIGNED_BYTE, glyph); #endif g_free(glyph); } stride *= 4; glyph = g_malloc(stride * g->h); gr->freetype_methods.get_glyph(g, glyph, 32, stride, &black, &white, &transparent); #ifdef USE_OPENGLES struct point p; p.x=(x + g->x) >> 6; p.y=(y + g->y) >> 6; draw_image_es(gr, &p, g->w, g->h, glyph); #else #ifdef MIRRORED_VIEW glPixelZoom(-1.0, -1.0); //mirrored mode #else glPixelZoom(1.0, -1.0); #endif glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6); glDrawPixels(g->w, g->h, PIXEL_FORMAT, GL_UNSIGNED_BYTE, glyph); #endif g_free(glyph); } } x += g->dx; y += g->dy; } } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } struct font_freetype_text *t; int color = 1; if (!font) { dbg(0, "no font, returning\n"); return; } graphics_priv_root->dirty = 1; t = gr->freetype_methods.text_new(text, (struct font_freetype_font *) font, dx, dy); struct point p_eff; p_eff.x = p->x; p_eff.y = p->y; display_text_draw(t, gr, fg, bg, color, &p_eff); gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { #ifdef USE_OPENGLES draw_image_es(gr, p, img->w, img->h, img->data); #else if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } if (!img || !img->data) { return; } graphics_priv_root->dirty = 1; struct point p_eff; p_eff.x = p->x + img->hot_x; p_eff.y = p->y + img->hot_y; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glRasterPos2d(p_eff.x - img->hot_x, p_eff.y - img->hot_y); glDrawPixels(img->w, img->h, GL_RGBA, GL_UNSIGNED_BYTE, img->data); #endif } static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (p) { gr->p.x = p->x; gr->p.y = p->y; } } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background_gc = gc; } static void handle_mouse_queue(void) { #ifdef USE_OPENGLES #else static int locked = 0; if (!locked) { locked = 1; } else { return; } if (mouse_event_queue_begin_idx < mouse_event_queue_end_idx) { if (mouse_queue[mouse_event_queue_begin_idx].button == GLUT_LEFT_BUTTON && mouse_queue[mouse_event_queue_begin_idx].state == GLUT_UP) { struct point p; p.x = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].x; p.y = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].y; graphics_priv_root->force_redraw = 1; callback_list_call_attr_3(graphics_priv_root->cbl, attr_button, (void *) 0, 1, (void *) &p); } else if (mouse_queue[mouse_event_queue_begin_idx]. button == GLUT_LEFT_BUTTON && mouse_queue[mouse_event_queue_begin_idx]. state == GLUT_DOWN) { struct point p; p.x = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].x; p.y = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].y; graphics_priv_root->force_redraw = 1; callback_list_call_attr_3(graphics_priv_root->cbl, attr_button, (void *) 1, 1, (void *) &p); } ++mouse_event_queue_begin_idx; } locked = 0; #endif } /*draws root graphics and its overlays*/ static int redraw_screen(struct graphics_priv *gr) { #ifdef USE_OPENGLES #else graphics_priv_root->dirty = 0; glCallList(gr->DLid); //display overlays display list struct graphics_priv *overlay; overlay = gr->overlays; while (gr->overlay_enabled && overlay) { if (overlay->overlay_enabled) { glPushMatrix(); struct point p_eff; get_overlay_pos(overlay, &p_eff); glTranslatef(p_eff.x, p_eff.y, 1); glCallList(overlay->DLid); glPopMatrix(); } overlay = overlay->next; } glutSwapBuffers(); #endif return TRUE; } #ifndef USE_OPENGLES /*filters call to redraw in overlay enabled(map) mode*/ static gboolean redraw_filter(gpointer data) { struct graphics_priv *gr = (struct graphics_priv*) data; if (gr->overlay_enabled && gr->dirty) { redraw_screen(gr); } return 0; } #endif static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { if (gr->parent) { //overlay #ifdef USE_OPENGLES #else if (mode == draw_mode_begin) { glNewList(gr->DLid, GL_COMPILE); } if (mode == draw_mode_end || mode == draw_mode_end_lazy) { glEndList(); } #endif } else { //root graphics if (mode == draw_mode_begin) { #ifdef USE_OPENGLES #else glNewList(gr->DLid, GL_COMPILE); #endif } if (mode == draw_mode_end) { #ifdef USE_OPENGLES gr->platform_methods->swap_buffers(gr->platform); #else glEndList(); gr->force_redraw = 1; if (!gr->overlay_enabled || gr->force_redraw) { redraw_screen(gr); } #endif } } gr->mode = mode; } static struct graphics_priv *overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); static int graphics_opengl_fullscreen(struct window *w, int on) { return 1; } static void graphics_opengl_disable_suspend(struct window *w) { } #ifdef USE_OPENGLES2 static GLuint load_shader(const char *shader_source, GLenum type) { GLuint shader = glCreateShader(type); glShaderSource(shader, 1, &shader_source, NULL); glCompileShader(shader); return shader; } #endif static void * get_data(struct graphics_priv *this, const char *type) { /*TODO initialize gtkglext context when type=="gtk_widget" */ if (!strcmp(type, "gtk_widget")) { fprintf(stderr, "Currently GTK gui is not yet supported with opengl graphics driver\n"); return NULL; } if (strcmp(type, "window") == 0) { struct window *win; #ifdef USE_OPENGLES GLuint vertexShader; GLuint fragmentShader; GLuint textures; GLfloat matrix[16]; int i; this->window_system=graphics_opengl_x11_new(NULL, this->width, this->height, 32, &this->window_system_methods); this->platform=graphics_opengl_egl_new(this->window_system_methods->get_display(this->window_system), this->window_system_methods->get_window(this->window_system), &this->platform_methods); this->window_system_methods->set_callbacks(this->window_system, this, resize_callback_do, click_notify_do, motion_notify_do, NULL); resize_callback(this->width,this->height); #if 0 glClearColor ( 0.4 , 0.4 , 0.4 , 1); #endif glClear ( GL_COLOR_BUFFER_BIT ); #ifdef USE_OPENGLES2 this->program=glCreateProgram(); vertexShader = load_shader(vertex_src, GL_VERTEX_SHADER); fragmentShader = load_shader(fragment_src, GL_FRAGMENT_SHADER); glAttachShader(this->program, vertexShader); glAttachShader(this->program, fragmentShader); glLinkProgram(this->program); glUseProgram(this->program); this->mvp_location=glGetUniformLocation(this->program, "mvp"); this->position_location=glGetAttribLocation(this->program, "position"); glEnableVertexAttribArray(this->position_location); this->texture_position_location=glGetAttribLocation(this->program, "texture_position"); this->color_location=glGetUniformLocation(this->program, "avcolor"); this->texture_location=glGetUniformLocation(this->program, "texture"); this->use_texture_location=glGetUniformLocation(this->program, "use_texture"); glUniform1i(this->use_texture_location, 0); glUniform1i(this->texture_location, 0); for (i = 0 ; i < 16 ; i++) matrix[i]=0.0; matrix[0]=2.0/this->width; matrix[5]=-2.0/this->height; matrix[10]=1; matrix[12]=-1; matrix[13]=1; matrix[15]=1; glUniformMatrix4fv(this->mvp_location, 1, GL_FALSE, matrix); #else glEnableClientState(GL_VERTEX_ARRAY); #endif glGenTextures(1, &textures); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #ifndef USE_OPENGLES2 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); #endif #endif win = g_new0(struct window, 1); win->priv = this; win->fullscreen = graphics_opengl_fullscreen; win->disable_suspend = graphics_opengl_disable_suspend; return win; } else { #ifdef USE_OPENGLES return NULL; #else return &this->DLid; #endif } } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { //TODO free image data in hashtable when graphics is destroyed //currently graphics destroy is not called !!! /* g_free(priv->data); priv->data = NULL; g_free(priv); priv = NULL; */ } static void overlay_disable(struct graphics_priv *gr, int disable) { gr->overlay_enabled = !disable; gr->force_redraw = 1; draw_mode(gr, draw_mode_end); } static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound) { int changed = 0; int w2, h2; if (w == 0) { w2 = 1; } else { w2 = w; } if (h == 0) { h2 = 1; } else { h2 = h; } gr->p = *p; if (gr->width != w2) { gr->width = w2; changed = 1; } if (gr->height != h2) { gr->height = h2; changed = 1; } gr->wraparound = wraparound; if (changed) { if ((w == 0) || (h == 0)) { gr->overlay_autodisabled = 1; } else { gr->overlay_autodisabled = 0; } callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->width), GINT_TO_POINTER(gr->height)); } } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, NULL, draw_text, draw_image, NULL, draw_restore, draw_drag, NULL, gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, overlay_disable, overlay_resize, }; static struct graphics_priv * graphics_opengl_new_helper(struct graphics_methods *meth) { struct font_priv *(*font_freetype_new) (void *meth); font_freetype_new = plugin_get_font_type("freetype"); if (!font_freetype_new) { return NULL; } struct graphics_priv *this = g_new0(struct graphics_priv, 1); font_freetype_new(&this->freetype_methods); *meth = graphics_methods; meth->font_new = (struct graphics_font_priv * (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int)) this->freetype_methods.font_new; meth->get_text_bbox = (void (*) (struct graphics_priv *, struct graphics_font_priv *, char *, int, int, struct point*, int)) this->freetype_methods.get_text_bbox; return this; } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) { struct graphics_priv *this = graphics_opengl_new_helper(meth); this->p = *p; this->width = w; this->height = h; this->parent = gr; if ((w == 0) || (h == 0)) { this->overlay_autodisabled = 1; } else { this->overlay_autodisabled = 0; } this->overlay_enabled = 1; this->overlay_autodisabled = 0; this->next = gr->overlays; gr->overlays = this; #ifdef USE_OPENGLES #else this->DLid = glGenLists(1); #endif return this; } #ifdef USE_OPENGLES static void click_notify_do(struct graphics_priv *priv, int button, int state, int x, int y) { struct point p={x,y}; dbg(0,"enter state %d button %d\n",state,button); callback_list_call_attr_3(priv->cbl, attr_button, (void *) state, (void *)button, (void *) &p); } #endif static void click_notify(int button, int state, int x, int y) { mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].button = button; mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].state = state; #ifdef MIRRORED_VIEW mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x = graphics_priv_root->width - x; #else mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x = x; #endif mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].y = y; ++mouse_event_queue_end_idx; } static void motion_notify_do(struct graphics_priv *priv, int x, int y) { struct point p; #ifdef MIRRORED_VIEW p.x = priv->width - x; #else p.x = x; #endif p.y = y; callback_list_call_attr_1(priv->cbl, attr_motion, (void *) &p); return; } static void motion_notify(int x, int y) { motion_notify_do(graphics_priv_root, x, y); } #ifndef USE_OPENGLES static gboolean graphics_opengl_idle(void *data) { static int opengl_init_ok = 0; if (!opengl_init_ok) { callback_list_call_attr_2(graphics_priv_root->cbl, attr_resize, GINT_TO_POINTER (graphics_priv_root->width), GINT_TO_POINTER (graphics_priv_root->height)); opengl_init_ok = 1; } else { #ifdef FREEGLUT glutMainLoopEvent(); #endif handle_mouse_queue(); } return TRUE; } #endif static void ProcessNormalKeys(unsigned char key_in, int x, int y) { int key = 0; char keybuf[2]; switch (key_in) { case 13: key = NAVIT_KEY_RETURN; break; default: key = key_in; break; } keybuf[0] = key; keybuf[1] = '\0'; graphics_priv_root->force_redraw = 1; callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, (void *) keybuf); } static void ProcessSpecialKeys(int key_in, int x, int y) { int key = 0; char keybuf[2]; switch (key_in) { case 102: key = NAVIT_KEY_RIGHT; break; case 100: key = NAVIT_KEY_LEFT; break; case 103: key = NAVIT_KEY_DOWN; break; case 101: key = NAVIT_KEY_UP; break; case 104: key = NAVIT_KEY_ZOOM_OUT; break; case 105: key = NAVIT_KEY_ZOOM_IN; break; default: break; } //switch graphics_priv_root->force_redraw = 1; keybuf[0] = key; keybuf[1] = '\0'; callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, (void *) keybuf); } static void resize_callback_do(struct graphics_priv *priv, int w, int h) { glViewport(0, 0, w, h); #ifndef USE_OPENGLES2 glMatrixMode(GL_PROJECTION); glLoadIdentity(); #ifdef MIRRORED_VIEW glOrthof(glF(w), glF(0), glF(h), glF(0), glF(1), glF(-1)); #else glOrthof(glF(0), glF(w), glF(h), glF(0), glF(1), glF(-1)); #endif #endif priv->width = w; priv->height = h; callback_list_call_attr_2(priv->cbl, attr_resize, GINT_TO_POINTER(w), GINT_TO_POINTER(h)); } static void resize_callback(int w, int h) { resize_callback_do(graphics_priv_root, w, h); } static void display(void) { graphics_priv_root->force_redraw = 1; redraw_screen(graphics_priv_root); resize_callback(graphics_priv_root->width, graphics_priv_root->height); } static void glut_close(void) { callback_list_call_attr_0(graphics_priv_root->cbl, attr_window_closed); } static struct graphics_priv * graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct attr *attr; if (!event_request_system("glib", "graphics_opengl_new")) return NULL; struct graphics_priv *this = graphics_opengl_new_helper(meth); graphics_priv_root = this; this->nav = nav; this->parent = NULL; this->overlay_enabled = 1; this->width = SCREEN_WIDTH; if ((attr = attr_search(attrs, NULL, attr_w))) this->width = attr->u.num; this->height = SCREEN_HEIGHT; if ((attr = attr_search(attrs, NULL, attr_h))) this->height = attr->u.num; this->timeout = 100; if ((attr = attr_search(attrs, NULL, attr_timeout))) this->timeout = attr->u.num; this->delay = 0; if ((attr = attr_search(attrs, NULL, attr_delay))) this->delay = attr->u.num; this->cbl = cbl; char *cmdline = ""; int argc = 0; #ifndef USE_OPENGLES glutInit(&argc, &cmdline); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(this->width, this->height); glutInitWindowPosition(0, 0); glutCreateWindow("Navit opengl window"); glutDisplayFunc(display); glutReshapeFunc(resize_callback); resize_callback(this->width, this->height); #endif graphics_priv_root->cbl = cbl; graphics_priv_root->width = this->width; graphics_priv_root->height = this->height; #ifndef USE_OPENGLES glutMotionFunc(motion_notify); glutPassiveMotionFunc(motion_notify); glutMouseFunc(click_notify); glutKeyboardFunc(ProcessNormalKeys); glutSpecialFunc(ProcessSpecialKeys); #ifdef FREEGLUT glutCloseFunc(glut_close); #endif this->DLid = glGenLists(1); g_timeout_add(G_PRIORITY_DEFAULT + 10, graphics_opengl_idle, NULL); /*this will only refresh screen in map(overlay enabled) mode */ g_timeout_add(G_PRIORITY_DEFAULT + 1000, redraw_filter, this); #endif //create hash table for uncompressed image data hImageData = g_hash_table_new(g_str_hash, g_str_equal); return this; } static void event_opengl_main_loop_run(void) { dbg(2, "enter\n"); } static void event_opengl_main_loop_quit(void) { dbg(0, "enter\n"); } static struct event_watch * event_opengl_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) { dbg(0, "enter\n"); return NULL; } static void event_opengl_remove_watch(struct event_watch *ev) { dbg(0, "enter\n"); } static struct event_timeout * event_opengl_add_timeout(int timeout, int multi, struct callback *cb) { dbg(0, "enter\n"); return NULL; } static void event_opengl_remove_timeout(struct event_timeout *to) { dbg(0, "enter\n"); } static struct event_idle * event_opengl_add_idle(int priority, struct callback *cb) { dbg(0, "enter\n"); return NULL; } static void event_opengl_remove_idle(struct event_idle *ev) { dbg(0, "enter\n"); } static void event_opengl_call_callback(struct callback_list *cb) { dbg(0, "enter\n"); } static struct event_methods event_opengl_methods = { event_opengl_main_loop_run, event_opengl_main_loop_quit, event_opengl_add_watch, event_opengl_remove_watch, event_opengl_add_timeout, event_opengl_remove_timeout, event_opengl_add_idle, event_opengl_remove_idle, event_opengl_call_callback, }; static struct event_priv * event_opengl_new(struct event_methods *meth) { *meth = event_opengl_methods; return NULL; } void plugin_init(void) { plugin_register_graphics_type("opengl", graphics_opengl_new); plugin_register_event_type("opengl", event_opengl_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/graphics_opengl.h000066400000000000000000000016031221777731700247220ustar00rootroot00000000000000struct graphics_opengl_window_system; struct graphics_opengl_platform; struct graphics_opengl_window_system_methods { void (*destroy)(struct graphics_opengl_window_system *); void *(*get_display)(struct graphics_opengl_window_system *); void *(*get_window)(struct graphics_opengl_window_system *); void (*set_callbacks)(struct graphics_opengl_window_system *, void *data, void *resize, void *button, void *motion, void *keypress); }; struct graphics_opengl_platform_methods { void (*destroy)(struct graphics_opengl_platform *); void (*swap_buffers)(struct graphics_opengl_platform *); }; struct graphics_opengl_window_system *graphics_opengl_x11_new(void *displayname, int w, int h, int depth, struct graphics_opengl_window_system_methods **methods); struct graphics_opengl_platform *graphics_opengl_egl_new(void *display, void *window, struct graphics_opengl_platform_methods **methods); navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/graphics_opengl_egl.c000066400000000000000000000046551221777731700255560ustar00rootroot00000000000000#include "config.h" #ifdef USE_OPENGLES2 #include #include #else #include #include #endif #include #include "graphics_opengl.h" #include "debug.h" struct graphics_opengl_platform { EGLSurface eglwindow; EGLDisplay egldisplay; EGLConfig config[1]; EGLContext context; }; static EGLint attributeList[] = { EGL_RED_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, #ifdef USE_OPENGLES2 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #endif EGL_NONE }; EGLint aEGLContextAttributes[] = { #ifdef USE_OPENGLES2 EGL_CONTEXT_CLIENT_VERSION, 2, #endif EGL_NONE }; static void graphics_opengl_egl_destroy(struct graphics_opengl_platform *egl) { g_free(egl); } static void graphics_opengl_egl_swap_buffers(struct graphics_opengl_platform *egl) { eglSwapBuffers(egl->egldisplay, egl->eglwindow); } struct graphics_opengl_platform_methods graphics_opengl_egl_methods = { graphics_opengl_egl_destroy, graphics_opengl_egl_swap_buffers, }; struct graphics_opengl_platform * graphics_opengl_egl_new(void *display, void *window, struct graphics_opengl_platform_methods **methods) { struct graphics_opengl_platform *ret=g_new0(struct graphics_opengl_platform,1); EGLint major,minor,nconfig; *methods=&graphics_opengl_egl_methods; ret->egldisplay = eglGetDisplay((EGLNativeDisplayType)display); if (!ret->egldisplay) { dbg(0, "can't get display\n"); goto error; } if (!eglInitialize(ret->egldisplay, &major, &minor)) { dbg(0, "eglInitialize failed\n"); goto error; } dbg(0,"eglInitialize ok with version %d.%d\n",major,minor); eglBindAPI(EGL_OPENGL_ES_API); if (!eglChooseConfig(ret->egldisplay, attributeList, ret->config, sizeof(ret->config)/sizeof(EGLConfig), &nconfig)) { dbg(0, "eglChooseConfig failed\n"); goto error; } if (nconfig != 1) { dbg(0, "unexpected number of configs %d\n",nconfig); goto error; } ret->eglwindow = eglCreateWindowSurface(ret->egldisplay, ret->config[0], (NativeWindowType) window, NULL); if (ret->eglwindow == EGL_NO_SURFACE) { dbg(0, "eglCreateWindowSurface failed"); goto error; } ret->context = eglCreateContext(ret->egldisplay, ret->config[0], EGL_NO_CONTEXT, aEGLContextAttributes); if (ret->context == EGL_NO_CONTEXT) { dbg(0, "eglCreateContext failed"); goto error; } eglMakeCurrent(ret->egldisplay, ret->eglwindow, ret->eglwindow, ret->context); return ret; error: graphics_opengl_egl_destroy(ret); return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/graphics/opengl/graphics_opengl_x11.c000066400000000000000000000103511221777731700254060ustar00rootroot00000000000000#include #include #include #include "debug.h" #include "event.h" #include "callback.h" #include "graphics_opengl.h" struct graphics_opengl_window_system { Display *display; int screen; Window window,root_window; XVisualInfo visual; Colormap colormap; struct callback *cb; struct event_watch *watch; void *data; void (*resize)(void *data, int w, int h); void (*button)(void *data, int button, int state, int x, int y); void (*motion)(void *data, int x, int y); void *keypress; }; static void graphics_opengl_x11_destroy(struct graphics_opengl_window_system *x11) { if (x11->watch) event_remove_watch(x11->watch); if (x11->cb) callback_destroy(x11->cb); if (x11->display) { if (x11->window) XDestroyWindow(x11->display, x11->window); if (x11->colormap) XFreeColormap(x11->display, x11->colormap); XCloseDisplay(x11->display); } g_free(x11); } static void * graphics_opengl_get_display(struct graphics_opengl_window_system *x11) { return x11->display; } static void * graphics_opengl_get_window(struct graphics_opengl_window_system *x11) { return (void *)x11->window; } static void graphics_opengl_set_callbacks(struct graphics_opengl_window_system *x11, void *data, void *resize, void *button, void *motion, void *keypress) { x11->data=data; x11->resize=resize; x11->button=button; x11->motion=motion; x11->keypress=keypress; } struct graphics_opengl_window_system_methods graphics_opengl_x11_methods = { graphics_opengl_x11_destroy, graphics_opengl_get_display, graphics_opengl_get_window, graphics_opengl_set_callbacks, }; static void graphics_opengl_x11_watch(struct graphics_opengl_window_system *x11) { XEvent event; while (XPending(x11->display)) { XNextEvent(x11->display, &event); switch(event.type) { case ButtonPress: if (x11->button) x11->button(x11->data,event.xbutton.button,1,event.xbutton.x,event.xbutton.y); break; case ButtonRelease: if (x11->button) x11->button(x11->data,event.xbutton.button,0,event.xbutton.x,event.xbutton.y); break; case ConfigureNotify: dbg(0,"ConfigureNotify\n"); break; case Expose: dbg(0,"Expose\n"); break; case KeyPress: dbg(0,"KeyPress\n"); break; case KeyRelease: dbg(0,"KeyRelease\n"); break; case MapNotify: dbg(0,"MapNotify\n"); break; case MotionNotify: if (x11->motion) x11->motion(x11->data,event.xmotion.x,event.xmotion.y); break; case ReparentNotify: dbg(0,"ReparentNotify\n"); break; default: dbg(0,"type %d\n",event.type); } } } struct graphics_opengl_window_system * graphics_opengl_x11_new(void *displayname, int w, int h, int depth, struct graphics_opengl_window_system_methods **methods) { struct graphics_opengl_window_system *ret=g_new0(struct graphics_opengl_window_system, 1); XSetWindowAttributes attributes; unsigned long valuemask; ret->cb=callback_new_1(callback_cast(graphics_opengl_x11_watch), ret); if (!event_request_system("glib", "graphics_opengl_x11_new")) goto error; *methods=&graphics_opengl_x11_methods; ret->display=XOpenDisplay(displayname); if (!ret->display) { dbg(0,"failed to open display\n"); goto error; } ret->watch=event_add_watch((void *)(long)ConnectionNumber(ret->display), event_watch_cond_read, ret->cb); ret->screen=XDefaultScreen(ret->display); ret->root_window=RootWindow(ret->display, ret->screen); if (!XMatchVisualInfo(ret->display, ret->screen, depth, TrueColor, &ret->visual)) { dbg(0,"failed to find visual\n"); goto error; } ret->colormap=XCreateColormap(ret->display, ret->root_window, ret->visual.visual, AllocNone); valuemask = /* CWBackPixel | */ CWBorderPixel | CWEventMask | CWColormap ; // | CWBackingStore; attributes.colormap = ret->colormap; attributes.border_pixel = 0; attributes.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonMotionMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask; attributes.backing_store = Always; ret->window=XCreateWindow(ret->display, RootWindow(ret->display, ret->screen), 0, 0, w, h, 0, ret->visual.depth, InputOutput, ret->visual.visual, valuemask, &attributes); XMapWindow(ret->display, ret->window); XFlush(ret->display); graphics_opengl_x11_watch(ret); return ret; error: graphics_opengl_x11_destroy(ret); return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/000077500000000000000000000000001221777731700224505ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/CMakeLists.txt000066400000000000000000000003701221777731700252100ustar00rootroot00000000000000module_add_library(graphics_qt_qpainter ${CMAKE_CURRENT_BINARY_DIR}/RenderArea.moc RenderArea.cpp graphics_qt_qpainter.cpp) QT4_GENERATE_MOC(RenderArea.h ${CMAKE_CURRENT_BINARY_DIR}/RenderArea.moc) include_directories(${CMAKE_CURRENT_BINARY_DIR}) navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/Makefile.am000066400000000000000000000012321221777731700245020ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @QT_GUI_CFLAGS@ @QT_SVG_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/graphics/qt_qpainter -DMODULE=graphics_qt_qpainter modulegraphics_LTLIBRARIES = libgraphics_qt_qpainter.la libgraphics_qt_qpainter_la_SOURCES = graphics_qt_qpainter.cpp graphics_qt_qpainter.h RenderArea.cpp RenderArea.h RenderArea.moc libgraphics_qt_qpainter_la_LDFLAGS = @QT_GUI_LIBS@ @QT_SVG_LIBS@ -module -avoid-version if GRAPHICS_QT_QPAINTER BUILT_SOURCES = RenderArea.moc RenderArea.moc: @MOC@ $(srcdir)/RenderArea.h >RenderArea.moc || touch RenderArea.moc distclean-local: $(RM) RenderArea.moc endif navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/RenderArea.cpp000066400000000000000000000235371221777731700251760ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "graphics_qt_qpainter.h" #include "RenderArea.h" #include "RenderArea.moc" #ifdef QT_QPAINTER_USE_EMBEDDING EmbeddedWidget::EmbeddedWidget(struct graphics_priv *priv, QWidget* child, QWidget *parent) : QX11EmbedWidget(parent) { this->gra=priv; #if QT_VERSION >= 0x040000 this->setWindowTitle(priv->window_title); #else this->setCaption(priv->window_title); #endif QStackedLayout* _outerLayout = new QStackedLayout(this); this->setLayout(_outerLayout); _outerLayout->addWidget(child); _outerLayout->setCurrentWidget(child); } void EmbeddedWidget::closeEvent(QCloseEvent* event) { gra->widget->processClose(); } #endif /* QT_QPAINTER_USE_EMBEDDING */ //############################################################################################################## //# Description: Constructor //# Comment: Using a QPixmap for rendering the graphics //# Authors: Martin Schaller (04/2008) //############################################################################################################## RenderArea::RenderArea(struct graphics_priv *priv, QT_QPAINTER_RENDERAREA_PARENT *parent, int w, int h, int overlay) : QT_QPAINTER_RENDERAREA_PARENT(parent) { pixmap = new QPixmap(w, h); #ifndef QT_QPAINTER_NO_WIDGET if (!overlay) { #if QT_VERSION >= 0x040700 grabGesture(Qt::PinchGesture); grabGesture(Qt::SwipeGesture); grabGesture(Qt::PanGesture); #endif #if QT_VERSION >= 0x040000 setWindowTitle(priv->window_title); #else setCaption(priv->window_title); #endif } #endif is_overlay=overlay; gra=priv; #if QT_QPAINTER_USE_EVENT_QT timer_type=g_hash_table_new(NULL, NULL); timer_callback=g_hash_table_new(NULL, NULL); watches=g_hash_table_new(NULL, NULL); #ifndef QT_QPAINTER_NO_WIDGET #if QT_VERSION >= 0x040000 setAttribute(Qt::WA_OpaquePaintEvent, true); #else setBackgroundMode(QWidget::NoBackground); #endif #endif #endif } //############################################################################################################## //# Description: QWidget:closeEvent //# Comment: Deletes navit object and stops event loop on graphics shutdown //############################################################################################################## void RenderArea::processClose() { callback_list_call_attr_0(this->cbl, attr_window_closed); } void RenderArea::closeEvent(QCloseEvent* event) { this->processClose(); } bool RenderArea::event(QEvent *event) { #if QT_VERSION >= 0x040700 if (event->type() == QEvent::Gesture) { dbg(0,"gesture\n"); return true; } #endif return QWidget::event(event); } //############################################################################################################## //# Description: QWidget:sizeHint //# Comment: This property holds the recommended size for the widget //# Authors: Martin Schaller (04/2008) //############################################################################################################## QSize RenderArea::sizeHint() const { return QSize(gra->w, gra->h); } //############################################################################################################## //# Description: QWidget:paintEvent //# Comment: A paint event is a request to repaint all or part of the widget. //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::paintEvent(QPaintEvent * event) { qt_qpainter_draw(gra, &event->rect(), 1); } void RenderArea::do_resize(QSize size) { if (pixmap->paintingActive()) { pixmap->paintEngine()->painter()->end(); } delete pixmap; pixmap=new QPixmap(size); pixmap->fill(); QPainter painter(pixmap); QBrush brush; painter.fillRect(0, 0, size.width(), size.height(), brush); dbg(0,"size %dx%d\n", size.width(), size.height()); dbg(0,"pixmap %p %dx%d\n", pixmap, pixmap->width(), pixmap->height()); callback_list_call_attr_2(this->cbl, attr_resize, (void *)size.width(), (void *)size.height()); } //############################################################################################################## //# Description: QWidget::resizeEvent() //# Comment: When resizeEvent() is called, the widget already has its new geometry. //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::resizeEvent(QResizeEvent * event) { if (!this->is_overlay) { RenderArea::do_resize(event->size()); } } //############################################################################################################## //# Description: Method to handle mouse clicks //# Comment: Delegate of QWidget::mousePressEvent and QWidget::mouseReleaseEvent (see below) //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::mouseEvent(int pressed, QMouseEvent *event) { struct point p; p.x=event->x(); p.y=event->y(); switch (event->button()) { case Qt::LeftButton: callback_list_call_attr_3(this->cbl, attr_button, (void *)pressed, (void *)1, (void *)&p); break; case Qt::MidButton: callback_list_call_attr_3(this->cbl, attr_button, (void *)pressed, (void *)2, (void *)&p); break; case Qt::RightButton: callback_list_call_attr_3(this->cbl, attr_button, (void *)pressed, (void *)3, (void *)&p); break; default: break; } } void RenderArea::mousePressEvent(QMouseEvent *event) { mouseEvent(1, event); } void RenderArea::mouseReleaseEvent(QMouseEvent *event) { mouseEvent(0, event); } //############################################################################################################## //# Description: QWidget::mouseMoveEvent //# Comment: If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed. //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::mouseMoveEvent(QMouseEvent *event) { struct point p; p.x=event->x(); p.y=event->y(); callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); } //############################################################################################################## //# Description: Qt Event :: Zoom in/out with the mouse's scrollwheel //# Comment: //# Authors: Stefan Klumpp (04/2008) //############################################################################################################## void RenderArea::wheelEvent(QWheelEvent *event) { struct point p; int button; p.x=event->x(); // xy-coordinates of the mouse pointer p.y=event->y(); if (event->delta() > 0) // wheel movement away from the person button=4; else if (event->delta() < 0) // wheel movement towards the person button=5; else button=-1; if (button != -1) { callback_list_call_attr_3(this->cbl, attr_button, (void *)1, (void *)button, (void *)&p); callback_list_call_attr_3(this->cbl, attr_button, (void *)0, (void *)button, (void *)&p); } event->accept(); } #define CASE(x) case x: void RenderArea::keyPressEvent(QKeyEvent *event) { QString str=event->text(); #if QT_VERSION < 0x040000 QCString cstr=str.utf8(); const char *text=cstr; #else const char *text=str.toUtf8().constData(); #endif dbg(0,"enter text='%s' 0x%x (%d) key=%d\n", text, text[0], strlen(text), event->key()); if (!text || !text[0] || text[0] == 0x7f) { dbg(0,"special key\n"); switch (event->key()) { case 4099: { char text_backspace[] = {NAVIT_KEY_BACKSPACE,'\0'}; text=text_backspace; } break; case 4101: #ifdef QT_QPAINTER_CUSTOM_RETURN QT_QPAINTER_CUSTOM_RETURN #endif { char text_return[] = {NAVIT_KEY_RETURN,'\0'}; text=text_return; } break; case 4114: #ifdef QT_QPAINTER_CUSTOM_LEFT QT_QPAINTER_CUSTOM_LEFT #endif { char text_left[] = {NAVIT_KEY_LEFT,'\0'}; text=text_left; } break; case 4115: #ifdef QT_QPAINTER_CUSTOM_UP QT_QPAINTER_CUSTOM_UP #endif { char text_up[] = {NAVIT_KEY_UP,'\0'}; text=text_up; } break; case 4116: #ifdef QT_QPAINTER_CUSTOM_RIGHT QT_QPAINTER_CUSTOM_RIGHT #endif { char text_right[] = {NAVIT_KEY_RIGHT,'\0'}; text=text_right; } break; case 4117: #ifdef QT_QPAINTER_CUSTOM_DOWN QT_QPAINTER_CUSTOM_DOWN #endif { char text_down[] = {NAVIT_KEY_DOWN,'\0'}; text=text_down; } break; } } callback_list_call_attr_1(this->cbl, attr_keypress, (void *)text); event->accept(); } void RenderArea::watchEvent(int fd) { #if QT_QPAINTER_USE_EVENT_QT struct event_watch *ev=(struct event_watch *)g_hash_table_lookup(watches, (void *)fd); dbg(1,"fd=%d ev=%p cb=%p\n", fd, ev, ev->cb); callback_call_0(ev->cb); #endif } #ifdef QT_QPAINTER_USE_EVENT_QT void RenderArea::timerEvent(QTimerEvent *event) { int id=event->timerId(); struct callback *cb=(struct callback *)g_hash_table_lookup(timer_callback, (void *)id); if (cb) callback_call_0(cb); if (!g_hash_table_lookup(timer_type, (void *)id)) event_qt_remove_timeout((struct event_timeout *)id); } #endif /* QT_QPAINTER_USE_EVENT_QT */ navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/RenderArea.h000066400000000000000000000042461221777731700246370ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __RENDERAREA_H #define __RENDERAREA_H #ifdef QT_QPAINTER_USE_EMBEDDING class EmbeddedWidget : public QX11EmbedWidget { struct graphics_priv *gra; public: EmbeddedWidget(struct graphics_priv *priv, QWidget* child, QWidget *parent = NULL); protected: void closeEvent(QCloseEvent *event); }; #endif class RenderArea : public QT_QPAINTER_RENDERAREA_PARENT { Q_OBJECT public: RenderArea(struct graphics_priv *priv, QT_QPAINTER_RENDERAREA_PARENT *parent = 0, int w=800, int h=800, int overlay=0); void do_resize(QSize size); QPixmap *pixmap; struct callback_list *cbl; struct graphics_priv *gra; #if QT_QPAINTER_USE_EVENT_QT GHashTable *timer_type; GHashTable *timer_callback; GHashTable *watches; #endif void processClose(); protected: int is_overlay; QSize sizeHint() const; void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); void mouseEvent(int pressed, QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); void keyPressEvent(QKeyEvent *event); void closeEvent(QCloseEvent *event); bool event(QEvent *event); #if QT_QPAINTER_USE_EVENT_QT void timerEvent(QTimerEvent *event); #endif protected slots: void watchEvent(int fd); }; #endif /* __RENDERAREA_H */ navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp000066400000000000000000000757361221777731700274050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ //############################################################################################################## //# //# File: graphics_qt_qpainter.cpp //# Description: Graphics interface for internal GUI using Qt (Trolltech.com) //# Comment: //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //# //############################################################################################################## #include "graphics_qt_qpainter.h" #include "RenderArea.h" //############################################################################################################## //# Description: RenderArea (QWidget) class for the main window (map, menu, ...) //# Comment: //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //############################################################################################################## static void overlay_rect(struct graphics_priv *parent, struct graphics_priv *overlay, int clean, QRect *r) { struct point p; int w,h; if (clean) { p=overlay->pclean; } else { p=overlay->p;; } w=overlay->widget->pixmap->width(); h=overlay->widget->pixmap->height(); if (overlay->wraparound) { if (p.x < 0) p.x+=parent->widget->pixmap->width(); if (p.y < 0) p.y+=parent->widget->pixmap->height(); if (w < 0) w += parent->widget->pixmap->width(); if (h < 0) h += parent->widget->pixmap->height(); } r->setRect(p.x, p.y, w, h); } void qt_qpainter_draw(struct graphics_priv *gr, const QRect *r, int paintev) { if (!paintev) { #ifndef QT_QPAINTER_NO_WIDGET dbg(1,"update %d,%d %d x %d\n", r->x(), r->y(), r->width(), r->height()); if (r->x() <= -r->width()) return; if (r->y() <= -r->height()) return; if (r->x() > gr->widget->pixmap->width()) return; if (r->y() > gr->widget->pixmap->height()) return; dbg(1,"update valid %d,%d %dx%d\n", r->x(), r->y(), r->width(), r->height()); gr->widget->update(*r); #endif return; } QPixmap pixmap(r->width(),r->height()); QPainter painter(&pixmap); struct graphics_priv *overlay=NULL; if (! gr->overlay_disable) overlay=gr->overlays; if ((gr->p.x || gr->p.y) && gr->background_gc) { painter.setPen(*gr->background_gc->pen); painter.fillRect(0, 0, gr->widget->pixmap->width(), gr->widget->pixmap->height(), *gr->background_gc->brush); } painter.drawPixmap(QPoint(gr->p.x,gr->p.y), *gr->widget->pixmap, *r); while (overlay) { QRect ovr; overlay_rect(gr, overlay, 0, &ovr); if (!overlay->overlay_disable && r->intersects(ovr)) { unsigned char *data; int i,size=ovr.width()*ovr.height(); #if QT_VERSION < 0x040000 QImage img=overlay->widget->pixmap->convertToImage(); img.setAlphaBuffer(1); #else QImage img=overlay->widget->pixmap->toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); #endif data=img.bits(); for (i = 0 ; i < size ; i++) { if (data[0] == overlay->rgba[0] && data[1] == overlay->rgba[1] && data[2] == overlay->rgba[2]) data[3]=overlay->rgba[3]; data+=4; } #if QT_VERSION < 0x040000 painter.drawImage(QPoint(ovr.x()-r->x(),ovr.y()-r->y()), img, 0); #else painter.drawImage(QPoint(ovr.x()-r->x(),ovr.y()-r->y()), img); #endif } overlay=overlay->next; } #ifndef QT_QPAINTER_NO_WIDGET QPainter painterw(gr->widget); painterw.drawPixmap(r->x(), r->y(), pixmap); #endif } //############################################################################################################## // General comments: // ----------------- // gr = graphics = draw area // gc = graphics context = pen to paint on the draw area //############################################################################################################## //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_font_priv { QFont *font; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_image_priv { QPixmap *pixmap; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void graphics_destroy(struct graphics_priv *gr) { #if QT_QPAINTER_USE_FREETYPE gr->freetype_methods.destroy(); #endif g_free(gr->window_title); g_free(gr); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void font_destroy(struct graphics_font_priv *font) { } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_font_methods font_methods = { font_destroy }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *fontfamily, int size, int flags) { struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); ret->font=new QFont("Arial",size/20); *meth=font_methods; return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_destroy(struct graphics_gc_priv *gc) { delete gc->pen; delete gc->brush; g_free(gc); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->pen->setWidth(w); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { #if QT_VERSION >= 0x040000 QColor col(c->r >> 8, c->g >> 8, c->b >> 8 /* , c->a >> 8 */); #else QColor col(c->r >> 8, c->g >> 8, c->b >> 8); #endif gc->pen->setColor(col); gc->brush->setColor(col); gc->c=*c; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { *meth=gc_methods; struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); ret->pen=new QPen(); ret->brush=new QBrush(Qt::SolidPattern); return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { struct graphics_image_priv *ret; QPixmap *cachedPixmap; QString key(path); ret=g_new0(struct graphics_image_priv, 1); cachedPixmap=QPixmapCache::find(key); if (!cachedPixmap) { #ifdef HAVE_QT_SVG if(key.endsWith(".svg", Qt::CaseInsensitive)) { QSvgRenderer renderer(key); if (!renderer.isValid()) { g_free(ret); return NULL; } ret->pixmap=new QPixmap(renderer.defaultSize()); ret->pixmap->fill(Qt::transparent); QPainter painter(ret->pixmap); renderer.render(&painter); } else { ret->pixmap=new QPixmap(path); } #else ret->pixmap=new QPixmap(path); #endif /* QT__VERSION */ if (ret->pixmap->isNull()) { g_free(ret); return NULL; } QPixmapCache::insert(key,QPixmap(*ret->pixmap)); } else { ret->pixmap=new QPixmap(*cachedPixmap); } *w=ret->pixmap->width(); *h=ret->pixmap->height(); if (hot) { hot->x=*w/2; hot->y=*h/2; } return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int i; #if QT_VERSION >= 0x040000 QPolygon polygon; #else QPointArray polygon; #endif for (i = 0 ; i < count ; i++) polygon.putPoints(i, 1, p[i].x, p[i].y); gr->painter->setPen(*gc->pen); gr->painter->drawPolyline(polygon); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int i; #if QT_VERSION >= 0x040000 QPolygon polygon; #else QPointArray polygon; #endif for (i = 0 ; i < count ; i++) polygon.putPoints(i, 1, p[i].x, p[i].y); gr->painter->setPen(*gc->pen); gr->painter->setBrush(*gc->brush); gr->painter->drawPolygon(polygon); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { dbg(1,"gr=%p gc=%p %d,%d,%d,%d\n", gr, gc, p->x, p->y, w, h); gr->painter->fillRect(p->x,p->y, w, h, *gc->brush); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { gr->painter->setPen(*gc->pen); gr->painter->drawArc(p->x-r/2, p->y-r/2, r, r, 0, 360*16); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { QPainter *painter=gr->painter; #if !QT_QPAINTER_USE_FREETYPE QString tmp=QString::fromUtf8(text); #ifndef QT_NO_TRANSFORMATIONS #if QT_VERSION >= 0x040000 QMatrix sav=gr->painter->worldMatrix(); QMatrix m(dx/65535.0,dy/65535.0,-dy/65535.0,dx/65535.0,p->x,p->y); painter->setWorldMatrix(m,TRUE); #else QWMatrix sav=gr->painter->worldMatrix(); QWMatrix m(dx/65535.0,dy/65535.0,-dy/65535.0,dx/65535.0,p->x,p->y); painter->setWorldMatrix(m,TRUE); #endif painter->setPen(*fg->pen); painter->setFont(*font->font); painter->drawText(0, 0, tmp); painter->setWorldMatrix(sav); #else painter->setPen(*fg->pen); painter->setFont(*font->font); painter->drawText(p->x, p->y, tmp); #endif #else struct font_freetype_text *t; struct font_freetype_glyph *g, **gp; struct color transparent = {0x0000, 0x0000, 0x0000, 0x0000}; struct color *fgc=&fg->c, *bgc=&bg->c; int i,x,y; if (! font) return; t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; if (bg) { while (i-- > 0) { g=*gp++; if (g->w && g->h) { unsigned char *data; #if QT_VERSION < 0x040000 QImage img(g->w+2, g->h+2, 32); img.setAlphaBuffer(1); data=img.bits(); gr->freetype_methods.get_shadow(g,(unsigned char *)(img.jumpTable()),32,0,bgc,&transparent); #else QImage img(g->w+2, g->h+2, QImage::Format_ARGB32_Premultiplied); data=img.bits(); gr->freetype_methods.get_shadow(g,(unsigned char *)data,32,img.bytesPerLine(),bgc,&transparent); #endif painter->drawImage(((x+g->x)>>6)-1, ((y+g->y)>>6)-1, img); } x+=g->dx; y+=g->dy; } } else bgc=&transparent; x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; while (i-- > 0) { g=*gp++; if (g->w && g->h) { unsigned char *data; #if QT_VERSION < 0x040000 QImage img(g->w, g->h, 32); img.setAlphaBuffer(1); data=img.bits(); gr->freetype_methods.get_glyph(g,(unsigned char *)(img.jumpTable()),32,0,fgc,bgc,&transparent); #else QImage img(g->w, g->h, QImage::Format_ARGB32_Premultiplied); data=img.bits(); gr->freetype_methods.get_glyph(g,(unsigned char *)data,32,img.bytesPerLine(),fgc,bgc,&transparent); #endif painter->drawImage((x+g->x)>>6, (y+g->y)>>6, img); } x+=g->dx; y+=g->dy; } gr->freetype_methods.text_destroy(t); #endif } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { gr->painter->drawPixmap(p->x, p->y, *img->pixmap); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (!gr->cleanup) { gr->pclean=gr->p; gr->cleanup=1; } if (p) gr->p=*p; else { gr->p.x=0; gr->p.y=0; } } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background_gc=gc; gr->rgba[2]=gc->c.r >> 8; gr->rgba[1]=gc->c.g >> 8; gr->rgba[0]=gc->c.b >> 8; gr->rgba[3]=gc->c.a >> 8; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { dbg(1,"mode for %p %d\n", gr, mode); QRect r; if (mode == draw_mode_begin) { #if QT_VERSION >= 0x040000 if (gr->widget->pixmap->paintingActive()) { gr->widget->pixmap->paintEngine()->painter()->end(); } #endif gr->painter->begin(gr->widget->pixmap); #if 0 gr->painter->fillRect(QRect(QPoint(0,0), gr->widget->size()), *gr->background_gc->brush); #endif } #if QT_VERSION < 0x040000 if (mode == draw_mode_cursor) { gr->painter->begin(gr->widget); } #endif if (mode == draw_mode_end) { #if 0 if (gr->mode == draw_mode_begin) { #endif gr->painter->end(); if (gr->parent) { if (gr->cleanup) { overlay_rect(gr->parent, gr, 1, &r); qt_qpainter_draw(gr->parent, &r, 0); gr->cleanup=0; } overlay_rect(gr->parent, gr, 0, &r); qt_qpainter_draw(gr->parent, &r, 0); } else { r.setRect(0, 0, gr->widget->pixmap->width(), gr->widget->pixmap->height()); qt_qpainter_draw(gr, &r, 0); } #if 0 } else { #if QT_VERSION < 0x040000 gr->painter->end(); #endif } #endif #if QT_VERSION >= 0x040000 if (!gr->parent) QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents|QEventLoop::ExcludeSocketNotifiers|QEventLoop::DeferredDeletion|QEventLoop::X11ExcludeTimers); #endif } #if QT_VERSION >= 0x040000 if (mode == draw_mode_end_lazy) { gr->painter->end(); } #endif gr->mode=mode; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha, int wraparound); static int argc=1; static char *argv[]={NULL,NULL,NULL}; static int fullscreen(struct window *win, int on) { #ifndef QT_QPAINTER_NO_WIDGET struct graphics_priv *this_=(struct graphics_priv *)win->priv; QWidget* _outerWidget; #ifdef QT_QPAINTER_USE_EMBEDDING _outerWidget=(QWidget*)this_->widget->parent(); #else _outerWidget=this_->widget; #endif /* QT_QPAINTER_USE_EMBEDDING */ if (on) _outerWidget->showFullScreen(); else _outerWidget->showMaximized(); #endif return 1; } static void disable_suspend(struct window *win) { #ifdef HAVE_QPE struct graphics_priv *this_=(struct graphics_priv *)win->priv; this_->app->setTempScreenSaverMode(QPEApplication::DisableLightOff); #endif } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void * get_data(struct graphics_priv *this_, const char *type) { struct window *win; QString xid; bool ok; if (!strcmp(type, "resize")) { dbg(0,"resize %d %d\n",this_->w,this_->h); QSize size(this_->w,this_->h); this_->widget->do_resize(size); } if (!strcmp(type, "qt_widget")) return this_->widget; if (!strcmp(type, "qt_pixmap")) return this_->widget->pixmap; if (!strcmp(type, "window")) { win=g_new(struct window, 1); #ifndef QT_QPAINTER_NO_WIDGET #ifdef QT_QPAINTER_USE_EMBEDDING EmbeddedWidget* _outerWidget=new EmbeddedWidget(this_,this_->widget,NULL); xid=getenv("NAVIT_XID"); if (xid.length()>0) { _outerWidget->embedInto(xid.toULong(&ok,0)); } _outerWidget->show(); #endif /* QT_QPAINTER_USE_EMBEDDING */ if (this_->w && this_->h) this_->widget->show(); else this_->widget->showMaximized(); #endif /* QT_QPAINTER_NO_WIDGET */ win->priv=this_; win->fullscreen=fullscreen; win->disable_suspend=disable_suspend; return win; } return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { delete priv->pixmap; g_free(priv); } static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) { QPainter *painter=gr->painter; QString tmp=QString::fromUtf8(text); painter->setFont(*font->font); QRect r=painter->boundingRect(0,0,gr->w,gr->h,0,tmp); ret[0].x=0; ret[0].y=-r.height(); ret[1].x=0; ret[1].y=0; ret[2].x=r.width(); ret[2].y=0; ret[3].x=r.width(); ret[3].y=-r.height(); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void overlay_disable(struct graphics_priv *gr, int disable) { gr->overlay_disable=disable; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static int set_attr(struct graphics_priv *gr, struct attr *attr) { switch (attr->type) { case attr_w: gr->w=attr->u.num; if (gr->w != 0 && gr->h != 0) { QSize size(gr->w,gr->h); gr->widget->do_resize(size); } break; case attr_h: gr->h=attr->u.num; if (gr->w != 0 && gr->h != 0) { QSize size(gr->w,gr->h); gr->widget->do_resize(size); } break; default: return 0; } return 1; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_restore, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, image_free, get_text_bbox, overlay_disable, NULL, set_attr, }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha,int wraparound) { *meth=graphics_methods; struct graphics_priv *ret=g_new0(struct graphics_priv, 1); #if QT_QPAINTER_USE_FREETYPE if (gr->font_freetype_new) { ret->font_freetype_new=gr->font_freetype_new; gr->font_freetype_new(&ret->freetype_methods); meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; meth->get_text_bbox=(void (*)(struct graphics_priv*, struct graphics_font_priv*, char*, int, int, struct point*, int))ret->freetype_methods.get_text_bbox; } #endif ret->widget= new RenderArea(ret,gr->widget,w,h,1); ret->wraparound=wraparound; ret->painter=new QPainter; ret->p=*p; ret->parent=gr; ret->next=gr->overlays; gr->overlays=ret; #ifndef QT_QPAINTER_NO_WIDGET ret->widget->hide(); #endif return ret; } #if QT_QPAINTER_USE_EVENT_QT static struct graphics_priv *event_gr; static void event_qt_main_loop_run(void) { event_gr->app->exec(); } static void event_qt_main_loop_quit(void) { dbg(0,"enter\n"); exit(0); } static struct event_watch * event_qt_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) { dbg(1,"enter fd=%d\n",(int)(long)fd); struct event_watch *ret=g_new0(struct event_watch, 1); ret->fd=fd; ret->cb=cb; g_hash_table_insert(event_gr->widget->watches, fd, ret); ret->sn=new QSocketNotifier((int)(long)fd, QSocketNotifier::Read, event_gr->widget); QObject::connect(ret->sn, SIGNAL(activated(int)), event_gr->widget, SLOT(watchEvent(int))); return ret; } static void event_qt_remove_watch(struct event_watch *ev) { g_hash_table_remove(event_gr->widget->watches, ev->fd); delete(ev->sn); g_free(ev); } static struct event_timeout * event_qt_add_timeout(int timeout, int multi, struct callback *cb) { int id; id=event_gr->widget->startTimer(timeout); g_hash_table_insert(event_gr->widget->timer_callback, (void *)id, cb); g_hash_table_insert(event_gr->widget->timer_type, (void *)id, (void *)!!multi); return (struct event_timeout *)id; } void event_qt_remove_timeout(struct event_timeout *ev) { event_gr->widget->killTimer((int)(long)ev); g_hash_table_remove(event_gr->widget->timer_callback, ev); g_hash_table_remove(event_gr->widget->timer_type, ev); } static struct event_idle * event_qt_add_idle(int priority, struct callback *cb) { dbg(0,"enter\n"); return (struct event_idle *)event_qt_add_timeout(0, 1, cb); } static void event_qt_remove_idle(struct event_idle *ev) { dbg(0,"enter\n"); event_qt_remove_timeout((struct event_timeout *) ev); } static void event_qt_call_callback(struct callback_list *cb) { dbg(0,"enter\n"); } static struct event_methods event_qt_methods = { event_qt_main_loop_run, event_qt_main_loop_quit, event_qt_add_watch, event_qt_remove_watch, event_qt_add_timeout, event_qt_remove_timeout, event_qt_add_idle, event_qt_remove_idle, event_qt_call_callback, }; struct event_priv { }; struct event_priv * event_qt_new(struct event_methods *meth) { dbg(0,"enter\n"); *meth=event_qt_methods; return NULL; } #endif //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_priv * graphics_qt_qpainter_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *ret; struct font_priv * (*font_freetype_new)(void *meth); struct attr *attr; dbg(0,"enter\n"); #if QT_QPAINTER_USE_EVENT_QT if (event_gr) return NULL; if (! event_request_system("qt","graphics_qt_qpainter_new")) return NULL; #endif #if QT_QPAINTER_USE_EVENT_GLIB if (! event_request_system("glib","graphics_qt_qpainter_new")) return NULL; #endif #if QT_QPAINTER_USE_FREETYPE font_freetype_new=(struct font_priv *(*)(void *))plugin_get_font_type("freetype"); if (!font_freetype_new) { dbg(0,"no freetype\n"); return NULL; } #endif ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; ret->nav=nav; #if QT_QPAINTER_USE_FREETYPE ret->font_freetype_new=font_freetype_new; font_freetype_new(&ret->freetype_methods); meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; meth->get_text_bbox=(void (*)(struct graphics_priv*, struct graphics_font_priv*, char*, int, int, struct point*, int))ret->freetype_methods.get_text_bbox; #endif #if QT_QPAINTER_USE_EMBEDDING && QT_VERSION >= 0x040500 if ((attr=attr_search(attrs, NULL, attr_gc_type))) QApplication::setGraphicsSystem(attr->u.str); else QApplication::setGraphicsSystem("raster"); #endif argv[0]=(char*)malloc(255); strcpy(argv[0], "navit"); if ((attr=attr_search(attrs, NULL, attr_flags))) ret->flags=attr->u.num; if (ret->flags & 1) { argv[1]=(char*)malloc(255); strcpy(argv[1], "-qws"); argc++; } #ifndef QT_QPAINTER_NO_APP #ifdef HAVE_QPE ret->app = new QPEApplication(argc, argv); #else ret->app = new QApplication(argc, argv); #endif #endif ret->widget= new RenderArea(ret); ret->widget->cbl=cbl; ret->painter = new QPainter; #if QT_QPAINTER_USE_EVENT_QT event_gr=ret; #endif ret->w=800; ret->h=600; if ((attr=attr_search(attrs, NULL, attr_w))) ret->w=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_h))) ret->h=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_window_title))) ret->window_title=g_strdup(attr->u.str); else ret->window_title=g_strdup("Navit"); dbg(0,"return\n"); return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## void plugin_init(void) { plugin_register_graphics_type("qt_qpainter", graphics_qt_qpainter_new); #if QT_QPAINTER_USE_EVENT_QT plugin_register_event_type("qt", event_qt_new); #endif } // *** EOF *** navit-0.5.0~svn5643+dfsg.1/navit/graphics/qt_qpainter/graphics_qt_qpainter.h000066400000000000000000000075731221777731700270440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __GRAPHICS_QT_QPAINTER_H #define __GRAPHICS_QT_QPAINTER_H #include #include #include #include "config.h" #include "navit/point.h" #include "navit/item.h" #include "navit/graphics.h" #include "navit/color.h" #include "navit/debug.h" #include "navit/plugin.h" #include "navit/callback.h" #include "navit/event.h" #include "navit/window.h" #include "navit/keys.h" #include "navit/navit.h" #include #ifndef QT_QPAINTER_USE_FREETYPE #define QT_QPAINTER_USE_FREETYPE 1 #endif #if QT_QPAINTER_USE_FREETYPE #include "navit/font/freetype/font_freetype.h" #endif #if QT_VERSION < 0x040000 #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_QPE #include #endif #ifndef QT_QPAINTER_USE_EVENT_QT #define QT_QPAINTER_USE_EVENT_QT 1 #endif #else #include #include #if QT_VERSION >= 0x040200 #include #include #endif #include #include #include #include #include #include #include #include #ifdef HAVE_QT_SVG #include #endif #ifndef QT_QPAINTER_USE_EVENT_GLIB #define QT_QPAINTER_USE_EVENT_GLIB 1 #endif #ifdef Q_WS_X11 #ifndef QT_QPAINTER_USE_EMBEDDING #define QT_QPAINTER_USE_EMBEDDING 1 #endif #endif #endif #if QT_QPAINTER_USE_EMBEDDING #include #endif #ifndef QT_QPAINTER_RENDERAREA_PARENT #define QT_QPAINTER_RENDERAREA_PARENT QWidget #endif class RenderArea; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_gc_priv { QPen *pen; QBrush *brush; struct color c; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_priv { #ifdef HAVE_QPE QPEApplication *app; #else QApplication *app; #endif RenderArea *widget; QPainter *painter; struct graphics_gc_priv *background_gc; unsigned char rgba[4]; enum draw_mode_num mode; struct graphics_priv *parent,*overlays,*next; struct point p,pclean; int cleanup; int overlay_disable; int wraparound; #if QT_QPAINTER_USE_FREETYPE struct font_priv * (*font_freetype_new)(void *meth); struct font_freetype_methods freetype_methods; #endif int w,h,flags; struct navit* nav; char *window_title; }; void qt_qpainter_draw(struct graphics_priv *gr, const QRect *r, int paintev); struct event_watch { QSocketNotifier *sn; struct callback *cb; void *fd; }; void event_qt_remove_timeout(struct event_timeout *ev); #endif /* __GRAPHICS_QT_QPAINTER_H */ navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/000077500000000000000000000000001221777731700207035ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/CMakeLists.txt000066400000000000000000000000731221777731700234430ustar00rootroot00000000000000module_add_library(graphics_sdl graphics_sdl.c raster.c) navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/Makefile.am000066400000000000000000000005711221777731700227420ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @FREETYPE2_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_sdl modulegraphics_LTLIBRARIES = libgraphics_sdl.la libgraphics_sdl_la_SOURCES = graphics_sdl.c raster.c raster.h libgraphics_sdl_la_LDFLAGS = @SDL_LIBS@ @SDL_IMAGE_LIBS@ @FREETYPE2_LIBS@ @LIBPDL_LIBS@ -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/event.c000066400000000000000000000224011221777731700221670ustar00rootroot00000000000000/* * event.c * * Created on: 01.05.2011 * Author: norad */ #include "webos/webos.h" struct event_timeout { SDL_TimerID id; int multi; struct callback *cb; }; struct idle_task { int priority; struct callback *cb; }; struct event_watch { struct pollfd *pfd; struct callback *cb; }; static void event_sdl_watch_thread(GPtrArray *); static void event_sdl_watch_startthread(GPtrArray *watch_list); static void event_sdl_watch_stopthread(void); static struct event_watch *event_sdl_add_watch(void *, enum event_watch_cond, struct callback *); static void event_sdl_remove_watch(struct event_watch *); static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); static void event_sdl_remove_timeout(struct event_timeout *); static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); # ifdef USE_WEBOS_ACCELEROMETER static unsigned int sdl_orientation_count = 2 ^ 16; static char sdl_next_orientation = WEBOS_ORIENTATION_PORTRAIT; static SDL_Joystick *accelerometer = NULL; static unsigned int orientation = WEBOS_ORIENTATION_PORTRAIT; static void sdl_accelerometer_handler(void* param) { struct graphics_priv *gr = (struct graphics_priv *) param; int xAxis = SDL_JoystickGetAxis(accelerometer, 0); int yAxis = SDL_JoystickGetAxis(accelerometer, 1); int zAxis = SDL_JoystickGetAxis(accelerometer, 2); unsigned char new_orientation; dbg(2, "x(%d) y(%d) z(%d) c(%d)\n", xAxis, yAxis, zAxis, sdl_orientation_count); if (zAxis > -30000) { if (xAxis < -15000 && yAxis > -5000 && yAxis < 5000) new_orientation = WEBOS_ORIENTATION_LANDSCAPE; else if (yAxis > 15000 && xAxis > -5000 && xAxis < 5000) new_orientation = WEBOS_ORIENTATION_PORTRAIT; else return; } else return; if (new_orientation == sdl_next_orientation) { if (sdl_orientation_count < 3) sdl_orientation_count++; } else { sdl_orientation_count = 0; sdl_next_orientation = new_orientation; return; } if (sdl_orientation_count == 3) { sdl_orientation_count++; if (new_orientation != orientation) { dbg(1, "x(%d) y(%d) z(%d) o(%d)\n", xAxis, yAxis, zAxis, new_orientation); orientation = new_orientation; SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_ROTATE; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } } } #endif /* ---------- SDL Eventhandling ---------- */ static Uint32 sdl_timer_callback(Uint32 interval, void* param) { struct event_timeout *timeout = (struct event_timeout*) param; dbg(1, "timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_TIMER; userevent.data1 = timeout->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); if (timeout->multi == 0) { g_free(timeout); timeout = NULL; return 0; // cancel timer } return interval; // reactivate timer } /* SDL Mainloop */ static void event_sdl_main_loop_run(void) { #ifdef USE_WEBOS_ACCELEROMETER struct callback* accel_cb = NULL; struct event_timeout* accel_to = NULL; if (PDL_GetPDKVersion() > 100) { accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr); accel_to = event_add_timeout(200, 1, accel_cb); } #endif graphics_sdl_idle(NULL); event_sdl_watch_stopthread(); #ifdef USE_WEBOS_ACCELEROMETER SDL_JoystickClose(accelerometer); if (PDL_GetPDKVersion() > 100) { event_remove_timeout(accel_to); callback_destroy(accel_cb); } #endif } static void event_sdl_main_loop_quit(void) { quit_event_loop = 1; } /* Watch */ static void event_sdl_watch_thread(GPtrArray *watch_list) { struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); struct event_watch *ew; int ret; int idx; for (idx = 0; idx < watch_list->len; idx++) { ew = g_ptr_array_index(watch_list, idx); g_memmove(&pfds[idx], ew->pfd, sizeof(struct pollfd)); } while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { for (idx = 0; idx < watch_list->len; idx++) { if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ ew = g_ptr_array_index(watch_list, idx); dbg(1, "watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_WATCH; userevent.data1 = ew->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } } } g_free(pfds); pthread_exit(0); } static void event_sdl_watch_startthread(GPtrArray *watch_list) { dbg(1, "enter\n"); if (sdl_watch_thread) event_sdl_watch_stopthread(); int ret; ret = pthread_create(&sdl_watch_thread, NULL, (void *) event_sdl_watch_thread, (void *) watch_list); dbg_assert(ret == 0); } static void event_sdl_watch_stopthread() { dbg(1, "enter\n"); if (sdl_watch_thread) { /* Notify the watch thread that the list of FDs will change */ pthread_kill(sdl_watch_thread, SIGUSR1); pthread_join(sdl_watch_thread, NULL); sdl_watch_thread = 0; } } static struct event_watch * event_sdl_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) { dbg(1, "fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); event_sdl_watch_stopthread(); if (!sdl_watch_list) sdl_watch_list = g_ptr_array_new(); struct event_watch *new_ew = g_new0 (struct event_watch, 1); struct pollfd *pfd = g_new0 (struct pollfd, 1); pfd->fd = (int) fd; /* Modify watchlist here */ switch (cond) { case event_watch_cond_read: pfd->events = POLLIN; break; case event_watch_cond_write: pfd->events = POLLOUT; break; case event_watch_cond_except: pfd->events = POLLERR | POLLHUP; break; } new_ew->pfd = (struct pollfd*) pfd; new_ew->cb = cb; g_ptr_array_add(sdl_watch_list, (gpointer) new_ew); event_sdl_watch_startthread(sdl_watch_list); return new_ew; } static void event_sdl_remove_watch(struct event_watch *ew) { dbg(1, "enter %p\n", ew); event_sdl_watch_stopthread(); g_ptr_array_remove(sdl_watch_list, ew); g_free(ew->pfd); g_free(ew); if (sdl_watch_list->len > 0) event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ static struct event_timeout * event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout * ret = g_new0(struct event_timeout, 1); if (!ret) return ret; dbg(1, "timer(%p) multi(%d) interval(%d) cb(%p) added\n", ret, multi, timeout, cb); ret->multi = multi; ret->cb = cb; ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); return ret; } static void event_sdl_remove_timeout(struct event_timeout *to) { dbg(2, "enter %p\n", to); if (to != NULL) { int ret = to->id ? SDL_RemoveTimer(to->id) : SDL_TRUE; if (ret == SDL_FALSE) { dbg(0, "SDL_RemoveTimer (%p) failed\n", to->id); } else { g_free(to); dbg(1, "timer(%p) removed\n", to); } } } /* Idle */ /* sort ptr_array by priority, increasing order */ static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { struct idle_task *a = (struct idle_task *) parama; struct idle_task *b = (struct idle_task *) paramb; if (a->priority < b->priority) return -1; if (a->priority > b->priority) return 1; return 0; } static struct event_idle * event_sdl_add_idle(int priority, struct callback *cb) { dbg(1, "add idle priority(%d) cb(%p)\n", priority, cb); struct idle_task *task = g_new0(struct idle_task, 1); task->priority = priority; task->cb = cb; g_ptr_array_add(idle_tasks, (gpointer) task); if (idle_tasks->len < 2) { SDL_Event event; SDL_UserEvent userevent; dbg(1, "poking eventloop because of new idle_events\n"); userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } else // more than one entry => sort the list g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); return (struct event_idle *) task; } static void event_sdl_remove_idle(struct event_idle *task) { dbg(1, "remove task(%p)\n", task); g_ptr_array_remove(idle_tasks, (gpointer) task); } /* callback */ static void event_sdl_call_callback(struct callback_list *cbl) { dbg(1, "call_callback cbl(%p)\n", cbl); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; userevent.data1 = cbl; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } static struct event_methods event_sdl_methods = { event_sdl_main_loop_run, event_sdl_main_loop_quit, event_sdl_add_watch, event_sdl_remove_watch, event_sdl_add_timeout, event_sdl_remove_timeout, event_sdl_add_idle, event_sdl_remove_idle, event_sdl_call_callback, }; static struct event_priv * event_sdl_new(struct event_methods* methods) { idle_tasks = g_ptr_array_new(); *methods = event_sdl_methods; return NULL; } /* ---------- SDL Eventhandling ---------- */ void sdl_event_init(void) { plugin_register_event_type("sdl", event_sdl_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/event_sdl.c000066400000000000000000000203351221777731700230350ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "event.h" #include "event_sdl.h" #include "graphics_sdl.h" #include "debug.h" #include "callback.h" #include "plugin.h" static pthread_t sdl_watch_thread = 0; static GPtrArray *sdl_watch_list = NULL; static void event_sdl_watch_startthread(GPtrArray *); static void event_sdl_watch_stopthread(void); static struct event_watch *event_sdl_add_watch(void *, enum event_watch_cond, struct callback *); static void event_sdl_remove_watch(struct event_watch *); static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); static void event_sdl_remove_timeout(struct event_timeout *); static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); static Uint32 sdl_timer_callback(Uint32 interval, void* param) { struct event_timeout *timeout=(struct event_timeout*)param; dbg(1,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_TIMER; userevent.data1 = timeout->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); if (timeout->multi == 0) { timeout->id = 0; return 0; // cancel timer } return interval; // reactivate timer } /* SDL Mainloop */ static void event_sdl_main_loop_run(void) { graphics_sdl_idle(NULL); event_sdl_watch_stopthread(); } static void event_sdl_main_loop_quit(void) { quit_event_loop = 1; } /* Watch */ void event_sdl_watch_thread (GPtrArray *watch_list) { struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); struct event_watch *ew; int ret; int idx; for (idx = 0; idx < watch_list->len; idx++ ) { ew = g_ptr_array_index (watch_list, idx); g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); } while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { for (idx = 0; idx < watch_list->len; idx++ ) { if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ ew = g_ptr_array_index (watch_list, idx); dbg(1,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_WATCH; userevent.data1 = ew->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } } } g_free(pfds); pthread_exit(0); } static void event_sdl_watch_startthread(GPtrArray *watch_list) { dbg(1,"enter\n"); if (sdl_watch_thread) event_sdl_watch_stopthread(); int ret; ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); dbg_assert (ret == 0); } static void event_sdl_watch_stopthread() { dbg(1,"enter\n"); if (sdl_watch_thread) { /* Notify the watch thread that the list of FDs will change */ pthread_kill(sdl_watch_thread, SIGUSR1); pthread_join(sdl_watch_thread, NULL); sdl_watch_thread = 0; } } static struct event_watch * event_sdl_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) { dbg(1,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); event_sdl_watch_stopthread(); if (!sdl_watch_list) sdl_watch_list = g_ptr_array_new(); struct event_watch *new_ew = g_new0 (struct event_watch, 1); struct pollfd *pfd = g_new0 (struct pollfd, 1); pfd->fd = (int) fd; /* Modify watchlist here */ switch (cond) { case event_watch_cond_read: pfd->events = POLLIN; break; case event_watch_cond_write: pfd->events = POLLOUT; break; case event_watch_cond_except: pfd->events = POLLERR|POLLHUP; break; } new_ew->pfd = (struct pollfd*) pfd; new_ew->cb = cb; g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); event_sdl_watch_startthread(sdl_watch_list); return new_ew; } static void event_sdl_remove_watch(struct event_watch *ew) { dbg(1,"enter %p\n",ew); event_sdl_watch_stopthread(); g_ptr_array_remove (sdl_watch_list, ew); g_free (ew->pfd); g_free (ew); if (sdl_watch_list->len > 0) event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ static struct event_timeout * event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout * ret = g_new0(struct event_timeout, 1); if(!ret) { dbg (0,"g_new0 failed\n"); return ret; } dbg(1,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb); ret->multi = multi; ret->cb = cb; ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); return ret; } static void event_sdl_remove_timeout(struct event_timeout *to) { dbg(2,"enter %p\n", to); if(to) { /* do not SDL_RemoveTimer if oneshot timer has already fired */ int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); if (ret == SDL_FALSE) dbg(0,"SDL_RemoveTimer (%p) failed\n", to->id); g_free(to); dbg(1,"timer(%p) removed\n", to); } } /* Idle */ /* sort ptr_array by priority, increasing order */ static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { struct idle_task *a = (struct idle_task *)parama; struct idle_task *b = (struct idle_task *)paramb; if (a->priority < b->priority) return -1; if (a->priority > b->priority) return 1; return 0; } static struct event_idle * event_sdl_add_idle(int priority, struct callback *cb) { dbg(1,"add idle priority(%d) cb(%p)\n", priority, cb); struct idle_task *task = g_new0(struct idle_task, 1); task->priority = priority; task->cb = cb; g_ptr_array_add(idle_tasks, (gpointer)task); if (idle_tasks->len < 2) { SDL_Event event; SDL_UserEvent userevent; dbg(1,"poking eventloop because of new idle_events\n"); userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } else // more than one entry => sort the list g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); return (struct event_idle *)task; } static void event_sdl_remove_idle(struct event_idle *task) { dbg(1,"remove task(%p)\n", task); g_ptr_array_remove(idle_tasks, (gpointer)task); } /* callback */ static void event_sdl_call_callback(struct callback_list *cbl) { dbg(1,"call_callback cbl(%p)\n",cbl); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; userevent.data1 = cbl; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } static struct event_methods event_sdl_methods = { event_sdl_main_loop_run, event_sdl_main_loop_quit, event_sdl_add_watch, event_sdl_remove_watch, event_sdl_add_timeout, event_sdl_remove_timeout, event_sdl_add_idle, event_sdl_remove_idle, event_sdl_call_callback, }; static struct event_priv * event_sdl_new(struct event_methods* methods) { idle_tasks = g_ptr_array_new(); *methods = event_sdl_methods; return NULL; } void event_sdl_register(void) { plugin_register_event_type("sdl", event_sdl_new); } navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/event_sdl.h000066400000000000000000000014741221777731700230450ustar00rootroot00000000000000 #ifndef __EVENT_SDL_H #define __EVENT_SDL_H #include #include "config.h" #include "callback.h" #include "event.h" #include "graphics_sdl.h" #ifdef USE_WEBOS # define SDL_USEREVENT_CODE_TIMER 0x1 # define SDL_USEREVENT_CODE_CALL_CALLBACK 0x2 # define SDL_USEREVENT_CODE_IDLE_EVENT 0x4 # define SDL_USEREVENT_CODE_WATCH 0x8 # ifdef USE_WEBOS_ACCELEROMETER # define SDL_USEREVENT_CODE_ROTATE 0xA # endif #endif struct event_timeout { SDL_TimerID id; int multi; struct callback *cb; }; struct idle_task { int priority; struct callback *cb; }; struct event_watch { struct pollfd *pfd; struct callback *cb; }; int quit_event_loop = 0; // quit the main event loop static GPtrArray *idle_tasks = NULL; void event_sdl_watch_thread (GPtrArray *); void event_sdl_register(void); #endif navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/graphics_sdl.c000066400000000000000000001673471221777731700235330ustar00rootroot00000000000000/* graphics_sdl.c -- barebones sdl graphics layer copyright (c) 2008 bryan rittmeyer license: GPLv2 TODO: - dashed lines - ifdef DEBUG -> dbg() - proper image transparency (libsdl-image xpm does not work) - valgrind revision history: 2008-06-01 initial 2008-06-15 SDL_DOUBLEBUF+SDL_Flip for linux fb. fix FT leaks. 2008-06-18 defer initial resize_callback 2008-06-21 linux touchscreen 2008-07-04 custom rastering */ #include #include #include #include #include "config.h" #include "debug.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "window.h" #include "navit.h" #include "keys.h" #include "item.h" #include "attr.h" #include "callback.h" #include "font/freetype/font_freetype.h" #include #include #ifdef USE_WEBOS # include "vehicle.h" # include # define USE_WEBOS_ACCELEROMETER #endif #define RASTER #undef SDL_SGE #undef SDL_GFX #undef ALPHA #undef LINUX_TOUCHSCREEN #ifdef USE_WEBOS #define DISPLAY_W 0 #define DISPLAY_H 0 #else #define DISPLAY_W 800 #define DISPLAY_H 600 #endif #undef DEBUG #undef PROFILE #define OVERLAY_MAX 32 #ifdef RASTER #include "raster.h" #endif #ifdef SDL_SGE #include #endif #ifdef SDL_GFX #include #endif #include #ifdef SDL_IMAGE #include #endif #ifdef LINUX_TOUCHSCREEN /* we use Linux evdev directly for the touchscreen. */ #include #include #include #include #endif #include #ifdef PROFILE #include #include #endif /* TODO: union overlay + non-overlay to reduce size */ struct graphics_priv; struct graphics_priv { SDL_Surface *screen; int aa; /* video modes */ uint32_t video_flags; int video_bpp; /* */ int overlay_mode; int overlay_x; int overlay_y; struct graphics_priv *overlay_parent; int overlay_idx; /* */ /*
*/ struct graphics_priv *overlay_array[OVERLAY_MAX]; int overlay_enable; enum draw_mode_num draw_mode; int resize_callback_initial; struct navit *nav; struct callback_list *cbl; #ifdef USE_WEBOS_ACCELEROMETER SDL_Joystick *accelerometer; char orientation; int real_w, real_h; #endif #ifdef LINUX_TOUCHSCREEN int ts_fd; int32_t ts_hit; uint32_t ts_x; uint32_t ts_y; #endif #ifdef PROFILE struct timeval draw_begin_tv; unsigned long draw_time_peak; #endif struct font_freetype_methods freetype_methods; /*
*/ }; static int dummy; #ifdef USE_WEBOS # define WEBOS_KEY_SHIFT 0x130 # define WEBOS_KEY_SYM 0x131 # define WEBOS_KEY_ORANGE 0x133 # define WEBOS_KEY_MOD_SHIFT 0x1 # define WEBOS_KEY_MOD_ORANGE 0x2 # define WEBOS_KEY_MOD_SYM 0x4 # define WEBOS_KEY_MOD_SHIFT_STICKY 0x11 # define WEBOS_KEY_MOD_ORANGE_STICKY 0x22 # define WEBOS_KEY_MOD_SYM_STICKY 0x44 # ifdef USE_WEBOS_ACCELEROMETER # define WEBOS_ORIENTATION_PORTRAIT 0x1 # define WEBOS_ORIENTATION_LANDSCAPE 0x2 # endif # define SDL_USEREVENT_CODE_TIMER 0x1 # define SDL_USEREVENT_CODE_CALL_CALLBACK 0x2 # define SDL_USEREVENT_CODE_IDLE_EVENT 0x4 # define SDL_USEREVENT_CODE_WATCH 0x8 # ifdef USE_WEBOS_ACCELEROMETER # define SDL_USEREVENT_CODE_ROTATE 0xA # endif struct event_timeout { SDL_TimerID id; int multi; struct callback *cb; }; struct idle_task { int priority; struct callback *cb; }; struct event_watch { struct pollfd *pfd; struct callback *cb; }; static struct graphics_priv* the_graphics = NULL; static int quit_event_loop = 0; // quit the main event loop static int the_graphics_count = 0; // count how many graphics objects are created static GPtrArray *idle_tasks = NULL; static pthread_t sdl_watch_thread = 0; static GPtrArray *sdl_watch_list = NULL; static void event_sdl_watch_thread (GPtrArray *); static void event_sdl_watch_startthread(GPtrArray *watch_list); static void event_sdl_watch_stopthread(void); static struct event_watch *event_sdl_add_watch(void *, enum event_watch_cond, struct callback *); static void event_sdl_remove_watch(struct event_watch *); static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); static void event_sdl_remove_timeout(struct event_timeout *); static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); # ifdef USE_WEBOS_ACCELEROMETER static unsigned int sdl_orientation_count = 2^16; static char sdl_next_orientation = 0; # endif #endif unsigned char *ft_buffer = NULL; unsigned int ft_buffer_size = 0; struct graphics_gc_priv { struct graphics_priv *gr; Uint8 fore_r; Uint8 fore_g; Uint8 fore_b; Uint8 fore_a; Uint8 back_r; Uint8 back_g; Uint8 back_b; Uint8 back_a; int linewidth; }; struct graphics_image_priv { SDL_Surface *img; }; #ifdef LINUX_TOUCHSCREEN static int input_ts_exit(struct graphics_priv *gr); #endif static void graphics_destroy(struct graphics_priv *gr) { dbg(0, "graphics_destroy %p %u\n", gr, gr->overlay_mode); if(gr->overlay_mode) { SDL_FreeSurface(gr->screen); gr->overlay_parent->overlay_array[gr->overlay_idx] = NULL; } else { g_free (ft_buffer); gr->freetype_methods.destroy(); #ifdef LINUX_TOUCHSCREEN input_ts_exit(gr); #endif #ifdef USE_WEBOS_ACCELEROMETER SDL_JoystickClose(gr->accelerometer); #endif #ifdef USE_WEBOS PDL_Quit(); #endif SDL_Quit(); } g_free(gr); } /* graphics_gc */ static void gc_destroy(struct graphics_gc_priv *gc) { g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { #ifdef DEBUG printf("gc_set_linewidth %p %d\n", gc, w); #endif gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { /* TODO */ } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { #ifdef DEBUG printf("gc_set_foreground: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b); #endif gc->fore_r = c->r/256; gc->fore_g = c->g/256; gc->fore_b = c->b/256; gc->fore_a = c->a/256; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { #ifdef DEBUG printf("gc_set_background: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b); #endif gc->back_r = c->r/256; gc->back_g = c->g/256; gc->back_b = c->b/256; gc->back_a = c->a/256; } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *gc=g_new0(struct graphics_gc_priv, 1); *meth=gc_methods; gc->gr=gr; gc->linewidth=1; /* upper layer should override anyway? */ return gc; } #if 0 /* unused by core? */ static void image_destroy(struct graphics_image_priv *gi) { #ifdef SDL_IMAGE SDL_FreeSurface(gi->img); g_free(gi); #endif } static struct graphics_image_methods gi_methods = { image_destroy }; #endif static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) { #ifdef SDL_IMAGE struct graphics_image_priv *gi; /* FIXME: meth is not used yet.. so gi leaks. at least xpm is small */ gi = g_new0(struct graphics_image_priv, 1); gi->img = IMG_Load(name); if(gi->img) { /* TBD: improves blit performance? */ #if !SDL_VERSION_ATLEAST(1,3,0) SDL_SetColorKey(gi->img, SDL_RLEACCEL, gi->img->format->colorkey); #endif *w=gi->img->w; *h=gi->img->h; hot->x=*w/2; hot->y=*h/2; } else { /* TODO: debug "colour parse errors" on xpm */ dbg(0,"image_new on '%s' failed: %s\n", name, IMG_GetError()); g_free(gi); gi = NULL; } return gi; #else return NULL; #endif } static void image_free(struct graphics_priv *gr, struct graphics_image_priv * gi) { #ifdef SDL_IMAGE SDL_FreeSurface(gi->img); g_free(gi); #endif } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } Sint16 *vx, *vy; Sint16 x, y; int i; vx = alloca(count * sizeof(Sint16)); vy = alloca(count * sizeof(Sint16)); for(i = 0; i < count; i++) { x = (Sint16)p[i].x; y = (Sint16)p[i].y; #if 0 if(x < 0) { x = 0; } if(y < 0) { y = 0; } #endif vx[i] = x; vy[i] = y; #ifdef DEBUG printf("draw_polygon: %p %i %d,%d\n", gc, i, p[i].x, p[i].y); #endif } #ifdef RASTER if(gr->aa) { raster_aapolygon(gr->screen, count, vx, vy, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } else { raster_polygon(gr->screen, count, vx, vy, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } #else # ifdef SDL_SGE # ifdef ALPHA sge_FilledPolygonAlpha(gr->screen, count, vx, vy, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b), gc->fore_a); # else # ifdef ANTI_ALIAS sge_AAFilledPolygon(gr->screen, count, vx, vy, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # else sge_FilledPolygon(gr->screen, count, vx, vy, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # endif # endif # else filledPolygonRGBA(gr->screen, vx, vy, count, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); # endif #endif } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } #ifdef DEBUG printf("draw_rectangle: %d %d %d %d r=%d g=%d b=%d a=%d\n", p->x, p->y, w, h, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); #endif if(w > gr->screen->w) { w = gr->screen->w; } if(h > gr->screen->h) { h = gr->screen->h; } #ifdef RASTER raster_rect(gr->screen, p->x, p->y, w, h, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); #else # ifdef SDL_SGE # ifdef ALPHA sge_FilledRectAlpha(gr->screen, p->x, p->y, p->x + w, p->y + h, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b), gc->fore_a); # else /* no AA -- should use poly instead for that */ sge_FilledRect(gr->screen, p->x, p->y, p->x + w, p->y + h, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # endif # else boxRGBA(gr->screen, p->x, p->y, p->x + w, p->y + h, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); # endif #endif } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } #if 0 if(gc->fore_a != 0xff) { dbg(0, "%d %d %d %u %u:%u:%u:%u\n", p->x, p->y, r, gc->linewidth, gc->fore_a, gc->fore_r, gc->fore_g, gc->fore_b); } #endif /* FIXME: does not quite match gtk */ /* hack for osd compass.. why is this needed!? */ if(gr->overlay_mode) { r = r / 2; } #ifdef RASTER if(gr->aa) { raster_aacircle(gr->screen, p->x, p->y, r, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } else { raster_circle(gr->screen, p->x, p->y, r, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } #else # ifdef SDL_SGE # ifdef ALPHA sge_FilledCircleAlpha(gr->screen, p->x, p->y, r, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b), gc->fore_a); # else # ifdef ANTI_ALIAS sge_AAFilledCircle(gr->screen, p->x, p->y, r, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # else sge_FilledCircle(gr->screen, p->x, p->y, r, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # endif # endif # else # ifdef ANTI_ALIAS aacircleRGBA(gr->screen, p->x, p->y, r, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); # else filledCircleRGBA(gr->screen, p->x, p->y, r, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); # endif # endif #endif } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } /* you might expect lines to be simpler than the other shapes. but, that would be wrong. 1 line can generate 1 polygon + 2 circles and even worse, we have to calculate their parameters! go dust off your trigonometry hat. */ #if 0 int i, l, x_inc, y_inc, lw; lw = gc->linewidth; for(i = 0; i < count-1; i++) { #ifdef DEBUG printf("draw_lines: %p %d %d,%d->%d,%d %d\n", gc, i, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->linewidth); #endif for(l = 0; l < lw; l++) { /* FIXME: center? */ #if 1 if(p[i].x != p[i+1].x) { x_inc = l - (lw/2); } else { x_inc = 0; } if(p[i].y != p[i+1].y) { y_inc = l - (lw/2); } else { y_inc = 0; } #else x_inc = 0; y_inc = 0; #endif #ifdef ANTI_ALIAS aalineRGBA(gr->screen, p[i].x + x_inc, p[i].y + y_inc, p[i+1].x + x_inc, p[i+1].y + y_inc, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); #else lineRGBA(gr->screen, p[i].x + x_inc, p[i].y + y_inc, p[i+1].x + x_inc, p[i+1].y + y_inc, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); #endif } } #else /* sort of based on graphics_opengl.c::draw_lines */ /* FIXME: should honor ./configure flag for no fp. this could be 100% integer code pretty easily, except that i am lazy */ struct point vert[4]; int lw = gc->linewidth; //int lw = 1; int i; for(i = 0; i < count-1; i++) { float dx=p[i+1].x-p[i].x; float dy=p[i+1].y-p[i].y; #if 0 float cx=(p[i+1].x+p[i].x)/2; float cy=(p[i+1].y+p[i].y)/2; #endif float angle; int x_lw_adj, y_lw_adj; if(lw == 1) { #ifdef RASTER if(gr->aa) { raster_aaline(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } else { raster_line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } #else # ifdef SDL_SGE # ifdef ALPHA sge_LineAlpha(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b), gc->fore_a); # else # ifdef ANTI_ALIAS sge_AALine(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # else sge_Line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGB(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b)); # endif # endif # else # ifdef ANTI_ALIAS aalineRGBA(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); # else lineRGBA(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); # endif # endif #endif } else { /* there is probably a much simpler way but this works ok */ /* FIXME: float + double mixture */ /* FIXME: lrint(round())? */ if(dy == 0.0) { angle = 0.0; x_lw_adj = 0; y_lw_adj = round((float)lw/2.0); } else if(dx == 0.0) { angle = 0.0; x_lw_adj = round((float)lw/2.0); y_lw_adj = 0; } else { angle = (M_PI/2.0) - atan(abs(dx)/abs(dy)); x_lw_adj = round(sin(angle)*(float)lw/2.0); y_lw_adj = round(cos(angle)*(float)lw/2.0); if((x_lw_adj < 0) || (y_lw_adj < 0)) { printf("i=%d\n", i); printf(" %d,%d->%d,%d\n", p[i].x, p[i].y, p[i+1].x, p[i+1].y); printf(" lw=%d angle=%f\n", lw, 180.0 * angle / M_PI); printf(" x_lw_adj=%d y_lw_adj=%d\n", x_lw_adj, y_lw_adj); } } if(p[i+1].x > p[i].x) { x_lw_adj = -x_lw_adj; } if(p[i+1].y > p[i].y) { y_lw_adj = -y_lw_adj; } #if 0 if(((y_lw_adj*y_lw_adj)+(x_lw_adj*x_lw_adj)) != (lw/2)*(lw/2)) { printf("i=%d\n", i); printf(" %d,%d->%d,%d\n", p[i].x, p[i].y, p[i+1].x, p[i+1].y); printf(" lw=%d angle=%f\n", lw, 180.0 * angle / M_PI); printf(" x_lw_adj=%d y_lw_adj=%d\n", x_lw_adj, y_lw_adj); } #endif /* FIXME: draw a circle/square if p[i]==p[i+1]? */ /* FIXME: clipping, check for neg values. hoping sdl-gfx does this */ vert[0].x = p[i].x + x_lw_adj; vert[0].y = p[i].y - y_lw_adj; vert[1].x = p[i].x - x_lw_adj; vert[1].y = p[i].y + y_lw_adj; vert[2].x = p[i+1].x - x_lw_adj; vert[2].y = p[i+1].y + y_lw_adj; vert[3].x = p[i+1].x + x_lw_adj; vert[3].y = p[i+1].y - y_lw_adj; draw_polygon(gr, gc, vert, 4); /* draw small circles at the ends. this looks better than nothing, and slightly * better than the triangle used by graphics_opengl, but is more expensive. * should have an ifdef/xml attr? */ /* FIXME: should just draw a half circle */ /* now some circular endcaps, if the width is over 2 */ if(lw > 2) { if(i == 0) { draw_circle(gr, gc, &p[i], lw/2); } /* we truncate on the divide on purpose, so we don't go outside the line */ draw_circle(gr, gc, &p[i+1], lw/2); } } } #endif } static void set_pixel(SDL_Surface *surface, int x, int y, Uint8 r2, Uint8 g2, Uint8 b2, Uint8 a2) { if(x<0 || y<0 || x>=surface->w || y>=surface->h) { return; } void *target_pixel = ((Uint8*)surface->pixels + y * surface->pitch + x * surface->format->BytesPerPixel); Uint8 r1,g1,b1,a1; switch(surface->format->BytesPerPixel) { case 2: { SDL_GetRGBA(*(Uint16 *)target_pixel, surface->format, &r1, &g1, &b1, &a1); *(Uint16 *)target_pixel = SDL_MapRGBA(surface->format, (r1*(0xff-a2)/0xff) + (r2*a2/0xff), (g1*(0xff-a2)/0xff) + (g2*a2/0xff), (b1*(0xff-a2)/0xff) + (b2*a2/0xff), a2 + a1*(0xff-a2)/0xff ); break; } case 4: { SDL_GetRGBA(*(Uint32 *)target_pixel, surface->format, &r1, &g1, &b1, &a1); *(Uint32 *)target_pixel = SDL_MapRGBA(surface->format, (r1*(0xff-a2)/0xff) + (r2*a2/0xff), (g1*(0xff-a2)/0xff) + (g2*a2/0xff), (b1*(0xff-a2)/0xff) + (b2*a2/0xff), a2 + a1*(0xff-a2)/0xff ); break; } } } static void resize_ft_buffer (unsigned int new_size) { if (new_size > ft_buffer_size) { g_free (ft_buffer); ft_buffer = g_malloc (new_size); dbg(1, "old_size(%u) new_size(%u) ft_buffer(%p)\n", ft_buffer_size, new_size, ft_buffer); ft_buffer_size = new_size; } } static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) { int i, x, y, stride; struct font_freetype_glyph *g, **gp; struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 }; struct color black = { fg->fore_r * 255, fg->fore_g * 255, fg->fore_b * 255, fg->fore_a * 255 }; struct color white = { 0xffff, 0xffff, 0xffff, 0xffff }; if (bg) { if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) { black.r = 65535; black.g = 65535; black.b = 65535; black.a = 65535; white.r = 0; white.g = 0; white.b = 0; white.a = 65535; } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) { white.r = 65535; white.g = 65535; white.b = 65535; white.a = 65535; black.r = 0; black.g = 0; black.b = 0; black.a = 65535; } else { white.r = bg->fore_r * 255; white.g = bg->fore_g * 255; white.b = bg->fore_b * 255; white.a = bg->fore_a * 255; } } else { white.r = 0; white.g = 0; white.b = 0; white.a = 0; } gp = text->glyph; i = text->glyph_count; x = p->x << 6; y = p->y << 6; while (i-- > 0) { g = *gp++; if (g->w && g->h && bg) { stride = (g->w + 2) * 4; if (color) { resize_ft_buffer(stride * (g->h + 2)); gr->freetype_methods.get_shadow(g, ft_buffer, 32, stride, &white, &transparent); SDL_Surface *glyph_surface = SDL_CreateRGBSurfaceFrom(ft_buffer, g->w + 2, g->h + 2, 32, stride, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); if (glyph_surface) { SDL_Rect r; r.x = (x + g->x) >> 6; r.y = (y + g->y) >> 6; r.w = g->w + 2; r.h = g->h + 2; SDL_BlitSurface(glyph_surface, NULL, gr->screen, &r); SDL_FreeSurface(glyph_surface); } } } x += g->dx; y += g->dy; } gp = text->glyph; i = text->glyph_count; x = p->x << 6; y = p->y << 6; while (i-- > 0) { g = *gp++; if (g->w && g->h) { if (color) { stride = g->w; if (bg) { resize_ft_buffer(stride * g->h * 4); gr->freetype_methods.get_glyph(g, ft_buffer, 32, stride * 4, &black, &white, &transparent); SDL_Surface *glyph_surface = SDL_CreateRGBSurfaceFrom(ft_buffer, g->w, g->h, 32, stride * 4, 0x000000ff,0x0000ff00, 0x00ff0000,0xff000000); if (glyph_surface) { SDL_Rect r; r.x = (x + g->x) >> 6; r.y = (y + g->y) >> 6; r.w = g->w; r.h = g->h; SDL_BlitSurface(glyph_surface, NULL, gr->screen,&r); SDL_FreeSurface(glyph_surface); } } stride *= 4; resize_ft_buffer(stride * g->h); gr->freetype_methods.get_glyph(g, ft_buffer, 32, stride, &black, &white, &transparent); int ii, jj; unsigned char* pGlyph = ft_buffer; for (jj = 0; jj < g->h; ++jj) { for (ii = 0; ii < g->w; ++ii) { if(*(pGlyph+3) > 0) { set_pixel(gr->screen, ii+((x + g->x) >> 6), jj+((y + g->y) >> 6), *(pGlyph+2), // Pixels are in BGRA format *(pGlyph+1), *(pGlyph+0), *(pGlyph+3) ); } pGlyph += 4; } } } } x += g->dx; y += g->dy; } } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable)) { return; } struct font_freetype_text *t; int color = 1; if (!font) { dbg(0, "no font, returning\n"); return; } t = gr->freetype_methods.text_new(text, (struct font_freetype_font *) font, dx, dy); struct point p_eff; p_eff.x = p->x; p_eff.y = p->y; display_text_draw(t, gr, fg, bg, color, &p_eff); gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } #ifdef SDL_IMAGE SDL_Rect r; r.x = p->x; r.y = p->y; r.w = img->img->w; r.h = img->img->h; SDL_BlitSurface(img->img, NULL, gr->screen, &r); #endif } static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) { #ifdef DEBUG printf("draw_restore\n"); #endif } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { #ifdef DEBUG printf("background_gc\n"); #endif } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { #ifdef PROFILE struct timeval now; unsigned long elapsed; #endif struct graphics_priv *ov; SDL_Rect rect; int i; if(gr->overlay_mode) { /* will be drawn below */ } else { #ifdef DEBUG printf("draw_mode: %d\n", mode); #endif #ifdef PROFILE if(mode == draw_mode_begin) { gettimeofday(&gr->draw_begin_tv, NULL); } #endif if(mode == draw_mode_end) { if((gr->draw_mode == draw_mode_begin) && gr->overlay_enable) { for(i = 0; i < OVERLAY_MAX; i++) { ov = gr->overlay_array[i]; if(ov && ov->overlay_enable) { rect.x = ov->overlay_x; if(rect.x<0) rect.x += gr->screen->w; rect.y = ov->overlay_y; if(rect.y<0) rect.y += gr->screen->h; rect.w = ov->screen->w; rect.h = ov->screen->h; SDL_BlitSurface(ov->screen, NULL, gr->screen, &rect); } } } SDL_Flip(gr->screen); #ifdef PROFILE gettimeofday(&now, NULL); elapsed = 1000000 * (now.tv_sec - gr->draw_begin_tv.tv_sec); elapsed += (now.tv_usec - gr->draw_begin_tv.tv_usec); if(elapsed >= gr->draw_time_peak) { dbg(0, "draw elapsed %u usec\n", elapsed); gr->draw_time_peak = elapsed; } #endif } gr->draw_mode = mode; } } static void overlay_disable(struct graphics_priv *gr, int disable) { gr->overlay_enable = !disable; struct graphics_priv *curr_gr = gr; if(gr->overlay_parent) { curr_gr = gr->overlay_parent; } draw_mode(curr_gr,draw_mode_end); } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); static int window_fullscreen(struct window *win, int on) { struct graphics_priv *gr=(struct graphics_priv *)win->priv; /* Update video flags */ if(on) { gr->video_flags |= SDL_FULLSCREEN; } else { gr->video_flags &= ~SDL_FULLSCREEN; } /* Update video mode */ gr->screen = SDL_SetVideoMode(gr->screen->w, gr->screen->h, gr->video_bpp, gr->video_flags); if(gr->screen == NULL) { navit_destroy(gr->nav); } else { callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); } return 1; } static void * get_data(struct graphics_priv *this, char const *type) { if(strcmp(type, "window") == 0) { struct window *win; win=g_new(struct window, 1); win->priv=this; win->fullscreen=window_fullscreen; win->disable_suspend=NULL; return win; } else { return &dummy; } } static void draw_drag(struct graphics_priv *gr, struct point *p) { if(p) { gr->overlay_x = p->x; gr->overlay_y = p->y; } } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, NULL /* draw_circle */, draw_text, draw_image, NULL, /*draw_image_warp */ draw_restore, draw_drag, NULL, /* font_new */ gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, /* get_text_bbox */ overlay_disable, NULL, /* overlay_resize */ NULL, /* set_attr */ }; static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha, int wraparound) { struct graphics_priv *ov; Uint32 rmask, gmask, bmask, amask; int i; for(i = 0; i < OVERLAY_MAX; i++) { if(gr->overlay_array[i] == NULL) { break; } } if(i == OVERLAY_MAX) { dbg(0, "too many overlays! increase OVERLAY_MAX\n"); return NULL; } dbg(1, "overlay_new %d %d %d %u %u (%x, %x, %x ,%x, %d)\n", i, p->x, p->y, w, h, gr->screen->format->Rmask, gr->screen->format->Gmask, gr->screen->format->Bmask, gr->screen->format->Amask, gr->screen->format->BitsPerPixel ); ov = g_new0(struct graphics_priv, 1); switch(gr->screen->format->BitsPerPixel) { case 8: rmask = 0xc0; gmask = 0x30; bmask = 0x0c; amask = 0x03; break; case 16: rmask = 0xf000; gmask = 0x0f00; bmask = 0x00f0; amask = 0x000f; break; case 32: rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; break; default: rmask = gr->screen->format->Rmask; gmask = gr->screen->format->Gmask; bmask = gr->screen->format->Bmask; amask = gr->screen->format->Amask; } ov->screen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, gr->screen->format->BitsPerPixel, rmask, gmask, bmask, amask); ov->overlay_mode = 1; ov->overlay_enable = 1; ov->overlay_x = p->x; ov->overlay_y = p->y; ov->overlay_parent = gr; ov->overlay_idx = i; gr->overlay_array[i] = ov; struct font_priv *(*font_freetype_new) (void *meth); font_freetype_new = plugin_get_font_type ("freetype"); if (!font_freetype_new) { return NULL; } font_freetype_new (&ov->freetype_methods); *meth=graphics_methods; meth->font_new = (struct graphics_font_priv * (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int)) ov->freetype_methods.font_new; meth->get_text_bbox = (void *)ov->freetype_methods.get_text_bbox; return ov; } #ifdef LINUX_TOUCHSCREEN #define EVFN "/dev/input/eventX" static int input_ts_init(struct graphics_priv *gr) { struct input_id ii; char fn[32]; #if 0 char name[64]; #endif int n, fd, ret; gr->ts_fd = -1; gr->ts_hit = -1; gr->ts_x = 0; gr->ts_y = 0; strcpy(fn, EVFN); n = 0; while(1) { fn[sizeof(EVFN)-2] = '0' + n; fd = open(fn, O_RDONLY); if(fd >= 0) { #if 0 ret = ioctl(fd, EVIOCGNAME(64), (void *)name); if(ret > 0) { printf("input_ts: %s\n", name); } #endif ret = ioctl(fd, EVIOCGID, (void *)&ii); if(ret == 0) { #if 1 printf("bustype %04x vendor %04x product %04x version %04x\n", ii.bustype, ii.vendor, ii.product, ii.version); #endif if((ii.bustype == BUS_USB) && (ii.vendor == 0x0eef) && (ii.product == 0x0001)) { ret = fcntl(fd, F_SETFL, O_NONBLOCK); if(ret == 0) { gr->ts_fd = fd; } else { close(fd); } break; } } close(fd); } n = n + 1; /* FIXME: should check all 32 minors */ if(n == 10) { /* not found */ ret = -1; break; } } return ret; } /* returns 0-based display coordinate for the given ts coord */ static void input_ts_map(int *disp_x, int *disp_y, uint32_t ts_x, uint32_t ts_y) { /* Dynamix 7" (eGalax TS) top left = 1986,103 top right = 61,114 bot left = 1986,1897 bot right = 63,1872 calibrate your TS using input_event_dump and touching all four corners. use the most extreme values. */ #define INPUT_TS_LEFT 1978 #define INPUT_TS_RIGHT 48 #define INPUT_TS_TOP 115 #define INPUT_TS_BOT 1870 /* clamp first */ if(ts_x > INPUT_TS_LEFT) { ts_x = INPUT_TS_LEFT; } if(ts_x < INPUT_TS_RIGHT) { ts_x = INPUT_TS_RIGHT; } ts_x = ts_x - INPUT_TS_RIGHT; *disp_x = ((DISPLAY_W-1) * ts_x) / (INPUT_TS_LEFT - INPUT_TS_RIGHT); *disp_x = (DISPLAY_W-1) - *disp_x; if(ts_y > INPUT_TS_BOT) { ts_y = INPUT_TS_BOT; } if(ts_y < INPUT_TS_TOP) { ts_y = INPUT_TS_TOP; } ts_y = ts_y - INPUT_TS_TOP; *disp_y = ((DISPLAY_H-1) * ts_y) / (INPUT_TS_BOT - INPUT_TS_TOP); /* *disp_y = (DISPLAY_H-1) - *disp_y; */ } #if 0 static void input_event_dump(struct input_event *ie) { printf("input_event:\n" "\ttv_sec\t%u\n" "\ttv_usec\t%lu\n" "\ttype\t%u\n" "\tcode\t%u\n" "\tvalue\t%d\n", (unsigned int)ie->time.tv_sec, ie->time.tv_usec, ie->type, ie->code, ie->value); } #endif static int input_ts_exit(struct graphics_priv *gr) { close(gr->ts_fd); gr->ts_fd = -1; return 0; } #endif #ifdef USE_WEBOS_ACCELEROMETER static void sdl_accelerometer_handler(void* param) { struct graphics_priv *gr = (struct graphics_priv *)param; int xAxis = SDL_JoystickGetAxis(gr->accelerometer, 0); int yAxis = SDL_JoystickGetAxis(gr->accelerometer, 1); int zAxis = SDL_JoystickGetAxis(gr->accelerometer, 2); unsigned char new_orientation; dbg(2,"x(%d) y(%d) z(%d) c(%d)\n",xAxis, yAxis, zAxis, sdl_orientation_count); if (zAxis > -30000) { if (xAxis < -15000 && yAxis > -5000 && yAxis < 5000) new_orientation = WEBOS_ORIENTATION_LANDSCAPE; else if (yAxis > 15000 && xAxis > -5000 && xAxis < 5000) new_orientation = WEBOS_ORIENTATION_PORTRAIT; else return; } else return; if (new_orientation == sdl_next_orientation) { if (sdl_orientation_count < 3) sdl_orientation_count++; } else { sdl_orientation_count = 0; sdl_next_orientation = new_orientation; return; } if (sdl_orientation_count == 3 || sdl_next_orientation == 0) { sdl_orientation_count++; if (new_orientation != gr->orientation) { dbg(1,"x(%d) y(%d) z(%d) o(%d)\n",xAxis, yAxis, zAxis, new_orientation); gr->orientation = new_orientation; SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_ROTATE; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } } } #endif static gboolean graphics_sdl_idle(void *data) { struct graphics_priv *gr = (struct graphics_priv *)data; struct point p; SDL_Event ev; #ifdef LINUX_TOUCHSCREEN struct input_event ie; ssize_t ss; #endif int ret; char key_mod = 0; char keybuf[8]; #ifdef USE_WEBOS if(data==NULL) { if(the_graphics!=NULL) { gr = the_graphics; } else { dbg(0,"graphics_idle: graphics not set!\n"); return FALSE; } } #endif /* generate the initial resize callback, so the gui knows W/H its unsafe to do this directly inside register_resize_callback; graphics_gtk does it during Configure, but SDL does not have an equivalent event, so we use our own flag */ if(gr->resize_callback_initial != 0) { callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); gr->resize_callback_initial = 0; } #ifdef LINUX_TOUCHSCREEN if(gr->ts_fd >= 0) { ss = read(gr->ts_fd, (void *)&ie, sizeof(ie)); if(ss == sizeof(ie)) { /* we (usually) get three events on a touchscreen hit: 1: type =EV_KEY code =330 [BTN_TOUCH] value=1 2: type =EV_ABS code =0 [X] value=X pos 3: type =EV_ABS code =1 [Y] value=Y pos 4: type =EV_SYN once hit, if the contact point changes, we'll get more EV_ABS (for 1 or both axes), followed by an EV_SYN. and, on a lift: 5: type =EV_KEY code =330 [BTN_TOUCH] value=0 6: type =EV_SYN */ switch(ie.type) { case EV_KEY: { if(ie.code == BTN_TOUCH) { gr->ts_hit = ie.value; } break; } case EV_ABS: { if(ie.code == 0) { gr->ts_x = ie.value; } else if(ie.code == 1) { gr->ts_y = ie.value; } break; } case EV_SYN: { input_ts_map(&p.x, &p.y, gr->ts_x, gr->ts_y); /* always send MOUSE_MOTION (first) */ callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p); if(gr->ts_hit > 0) { callback_list_call_attr_3(gr->cbl, attr_button, (void *)1, (void *)SDL_BUTTON_LEFT, (void *)&p); } else if(gr->ts_hit == 0) { callback_list_call_attr_3(gr->cbl, attr_button, (void *)0, (void *)SDL_BUTTON_LEFT, (void *)&p); } /* reset ts_hit */ gr->ts_hit = -1; break; } default: { break; } } } } #endif #ifdef USE_WEBOS_ACCELEROMETER struct callback* accel_cb = NULL; struct event_timeout* accel_to = NULL; if (PDL_GetPDKVersion() > 100) { accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr); accel_to = event_add_timeout(200, 1, accel_cb); } #endif #ifdef USE_WEBOS unsigned int idle_tasks_idx=0; unsigned int idle_tasks_cur_priority=0; struct idle_task *task; while(!quit_event_loop) #else while(1) #endif { #ifdef USE_WEBOS ret = 0; if(idle_tasks->len > 0) { while (!(ret = SDL_PollEvent(&ev)) && idle_tasks->len > 0) { if (idle_tasks_idx >= idle_tasks->len) idle_tasks_idx = 0; dbg(3,"idle_tasks_idx(%d)\n",idle_tasks_idx); task = (struct idle_task *)g_ptr_array_index(idle_tasks,idle_tasks_idx); if (idle_tasks_idx == 0) // only execute tasks with lowest priority value idle_tasks_cur_priority = task->priority; if (task->priority > idle_tasks_cur_priority) idle_tasks_idx = 0; else { callback_call_0(task->cb); idle_tasks_idx++; } } } if (!ret) // If we get here there are no idle_tasks and we have no events pending ret = SDL_WaitEvent(&ev); #else ret = SDL_PollEvent(&ev); #endif if(ret == 0) { break; } #ifdef USE_WEBOS dbg(5,"SDL_Event %d\n", ev.type); #endif switch(ev.type) { case SDL_MOUSEMOTION: { p.x = ev.motion.x; p.y = ev.motion.y; callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p); break; } case SDL_KEYDOWN: { memset(keybuf, 0, sizeof(keybuf)); switch(ev.key.keysym.sym) { case SDLK_LEFT: { keybuf[0] = NAVIT_KEY_LEFT; break; } case SDLK_RIGHT: { keybuf[0] = NAVIT_KEY_RIGHT; break; } case SDLK_BACKSPACE: { keybuf[0] = NAVIT_KEY_BACKSPACE; break; } case SDLK_RETURN: { keybuf[0] = NAVIT_KEY_RETURN; break; } case SDLK_DOWN: { keybuf[0] = NAVIT_KEY_DOWN; break; } case SDLK_PAGEUP: { keybuf[0] = NAVIT_KEY_ZOOM_OUT; break; } case SDLK_UP: { keybuf[0] = NAVIT_KEY_UP; break; } case SDLK_PAGEDOWN: { keybuf[0] = NAVIT_KEY_ZOOM_IN; break; } #ifdef USE_WEBOS case WEBOS_KEY_SHIFT: { if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) == WEBOS_KEY_MOD_SHIFT_STICKY) key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY); else if ((key_mod & WEBOS_KEY_MOD_SHIFT) == WEBOS_KEY_MOD_SHIFT) key_mod |= WEBOS_KEY_MOD_SHIFT_STICKY; else key_mod |= WEBOS_KEY_MOD_SHIFT; break; } case WEBOS_KEY_ORANGE: { if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) == WEBOS_KEY_MOD_ORANGE_STICKY) key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY); else if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) key_mod |= WEBOS_KEY_MOD_ORANGE_STICKY; else key_mod |= WEBOS_KEY_MOD_ORANGE; break; } case WEBOS_KEY_SYM: { /* Toggle the on-screen keyboard */ //callback_list_call_attr_1(gr->cbl, attr_keyboard_toggle); // Not implemented yet break; } case PDLK_GESTURE_BACK: { keybuf[0] = NAVIT_KEY_BACK; break; } case PDLK_GESTURE_FORWARD: case PDLK_GESTURE_AREA: { break; } #endif default: { #ifdef USE_WEBOS if (ev.key.keysym.unicode < 0x80 && ev.key.keysym.unicode > 0) { keybuf[0] = (char)ev.key.keysym.unicode; if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) { switch(keybuf[0]) { case 'e': keybuf[0] = '1'; break; case 'r': keybuf[0] = '2'; break; case 't': keybuf[0] = '3'; break; case 'd': keybuf[0] = '4'; break; case 'f': keybuf[0] = '5'; break; case 'g': keybuf[0] = '6'; break; case 'x': keybuf[0] = '7'; break; case 'c': keybuf[0] = '8'; break; case 'v': keybuf[0] = '9'; break; case '@': keybuf[0] = '0'; break; case ',': keybuf[0] = '-'; break; case 'u': strncpy(keybuf, "ü", sizeof(keybuf)); break; case 'a': strncpy(keybuf, "ä", sizeof(keybuf)); break; case 'o': strncpy(keybuf, "ö", sizeof(keybuf)); break; case 's': strncpy(keybuf, "ß", sizeof(keybuf)); break; } } if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) != WEBOS_KEY_MOD_SHIFT_STICKY) key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY); if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) != WEBOS_KEY_MOD_ORANGE_STICKY) key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY); } else { dbg(0,"Unknown key sym: %x\n", ev.key.keysym.sym); } #else /* return unicode chars when they can be converted to ascii */ keybuf[0] = ev.key.keysym.unicode<=127 ? ev.key.keysym.unicode : 0; #endif break; } } dbg(2,"key mod: 0x%x\n", key_mod); if (keybuf[0]) { callback_list_call_attr_1(gr->cbl, attr_keypress, (void *)keybuf); } break; } case SDL_KEYUP: { break; } case SDL_MOUSEBUTTONDOWN: { #ifdef DEBUG printf("SDL_MOUSEBUTTONDOWN %d %d %d %d %d\n", ev.button.which, ev.button.button, ev.button.state, ev.button.x, ev.button.y); #endif p.x = ev.button.x; p.y = ev.button.y; callback_list_call_attr_3(gr->cbl, attr_button, (void *)1, (void *)(int)ev.button.button, (void *)&p); break; } case SDL_MOUSEBUTTONUP: { #ifdef DEBUG printf("SDL_MOUSEBUTTONUP %d %d %d %d %d\n", ev.button.which, ev.button.button, ev.button.state, ev.button.x, ev.button.y); #endif p.x = ev.button.x; p.y = ev.button.y; callback_list_call_attr_3(gr->cbl, attr_button, (void *)0, (void *)(int)ev.button.button, (void *)&p); break; } case SDL_QUIT: { #ifdef USE_WEBOS quit_event_loop = 1; navit_destroy(gr->nav); #endif break; } case SDL_VIDEORESIZE: { gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, gr->video_bpp, gr->video_flags); if(gr->screen == NULL) { navit_destroy(gr->nav); } else { callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); } break; } #ifdef USE_WEBOS case SDL_USEREVENT: { SDL_UserEvent userevent = ev.user; dbg(9,"received SDL_USEREVENT type(%x) code(%x)\n",userevent.type,userevent.code); if (userevent.type != SDL_USEREVENT) break; if (userevent.code == PDL_GPS_UPDATE) { struct attr vehicle_attr; struct vehicle *v; navit_get_attr(gr->nav, attr_vehicle, &vehicle_attr, NULL); v = vehicle_attr.u.vehicle; if (v) { struct attr attr; attr.type = attr_pdl_gps_update; attr.u.data = userevent.data1; vehicle_set_attr(v, &attr); } } else if(userevent.code == SDL_USEREVENT_CODE_TIMER) { struct callback *cb = (struct callback *)userevent.data1; dbg(1, "SDL_USEREVENT timer received cb(%p)\n", cb); callback_call_0(cb); } else if(userevent.code == SDL_USEREVENT_CODE_WATCH) { struct callback *cb = (struct callback *)userevent.data1; dbg(1, "SDL_USEREVENT watch received cb(%p)\n", cb); callback_call_0(cb); } else if(userevent.code == SDL_USEREVENT_CODE_CALL_CALLBACK) { struct callback_list *cbl = (struct callback_list *)userevent.data1; dbg(1, "SDL_USEREVENT call_callback received cbl(%p)\n", cbl); callback_list_call_0(cbl); } else if(userevent.code == SDL_USEREVENT_CODE_IDLE_EVENT) { dbg(1, "SDL_USEREVENT idle_event received\n"); } #ifdef USE_WEBOS_ACCELEROMETER else if(userevent.code == SDL_USEREVENT_CODE_ROTATE) { dbg(1, "SDL_USEREVENT rotate received\n"); switch(gr->orientation) { case WEBOS_ORIENTATION_PORTRAIT: gr->screen = SDL_SetVideoMode(gr->real_w, gr->real_h, gr->video_bpp, gr->video_flags); PDL_SetOrientation(PDL_ORIENTATION_0); break; case WEBOS_ORIENTATION_LANDSCAPE: gr->screen = SDL_SetVideoMode(gr->real_h, gr->real_w, gr->video_bpp, gr->video_flags); PDL_SetOrientation(PDL_ORIENTATION_270); break; } if(gr->screen == NULL) { navit_destroy(gr->nav); } else { callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); } } #endif else dbg(1, "unknown SDL_USEREVENT\n"); break; } #endif default: { #ifdef DEBUG printf("SDL_Event %d\n", ev.type); #endif break; } } } #ifdef USE_WEBOS event_sdl_watch_stopthread(); #endif #ifdef USE_WEBOS_ACCELEROMETER if (PDL_GetPDKVersion() > 100) { event_remove_timeout(accel_to); callback_destroy(accel_cb); } #endif return TRUE; } static struct graphics_priv * graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *this=g_new0(struct graphics_priv, 1); struct font_priv *(*font_freetype_new) (void *meth); struct attr *attr; int ret; int w=DISPLAY_W,h=DISPLAY_H; this->nav = nav; this->cbl = cbl; /* initialize fonts */ font_freetype_new = plugin_get_font_type("freetype"); if (!font_freetype_new) { g_free(this); return NULL; } font_freetype_new(&this->freetype_methods); *meth = graphics_methods; meth->font_new = (struct graphics_font_priv * (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int)) this->freetype_methods.font_new; meth->get_text_bbox = (void*) this->freetype_methods.get_text_bbox; dbg(1,"Calling SDL_Init\n"); #ifdef USE_WEBOS # ifdef USE_WEBOS_ACCELEROMETER ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_JOYSTICK); # else ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); # endif #else ret = SDL_Init(SDL_INIT_VIDEO); #endif if(ret < 0) { dbg(0,"SDL_Init failed %d\n", ret); this->freetype_methods.destroy(); g_free(this); return NULL; } #ifdef USE_WEBOS dbg(1,"Calling PDL_Init(0)\n"); ret = PDL_Init(0); if(ret < 0) { dbg(0,"PDL_Init failed %d\n", ret); this->freetype_methods.destroy(); g_free(this); return NULL; } if (! event_request_system("sdl","graphics_sdl_new")) { #else if (! event_request_system("glib","graphics_sdl_new")) { #endif dbg(0,"event_request_system failed"); this->freetype_methods.destroy(); g_free(this); return NULL; } #ifdef USE_WEBOS this->video_bpp = 0; this->video_flags = SDL_SWSURFACE | SDL_ANYFORMAT | SDL_RESIZABLE; #else this->video_bpp = 16; this->video_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE; #endif if ((attr=attr_search(attrs, NULL, attr_w))) w=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_h))) h=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_bpp))) this->video_bpp=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_flags))) { if (attr->u.num & 1) this->video_flags = SDL_SWSURFACE; } if ((attr=attr_search(attrs, NULL, attr_frame))) { if(!attr->u.num) this->video_flags |= SDL_NOFRAME; } this->screen = SDL_SetVideoMode(w, h, this->video_bpp, this->video_flags); if(this->screen == NULL) { dbg(0,"SDL_SetVideoMode failed\n"); this->freetype_methods.destroy(); g_free(this); #ifdef USE_WEBOS PDL_Quit(); #endif SDL_Quit(); return NULL; } /* Use screen size instead of requested */ w = this->screen->w; h = this->screen->h; dbg(0, "using screen %ix%i@%i\n", this->screen->w, this->screen->h, this->screen->format->BytesPerPixel * 8); #ifdef USE_WEBOS_ACCELEROMETER if ( w > h ) { this->orientation = WEBOS_ORIENTATION_LANDSCAPE; this->real_w = h; this->real_h = w; } else { this->orientation = WEBOS_ORIENTATION_PORTRAIT; this->real_w = w; this->real_h = h; } this->accelerometer = SDL_JoystickOpen(0); #endif SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); #ifdef USE_WEBOS PDL_SetOrientation(PDL_ORIENTATION_0); #endif SDL_EnableUNICODE(1); SDL_WM_SetCaption("navit", NULL); #ifdef LINUX_TOUCHSCREEN input_ts_init(this); if(this->ts_fd >= 0) { /* mouse cursor does not always display correctly in Linux FB. anyway, it is unnecessary w/ a touch screen */ SDL_ShowCursor(0); } #endif #ifdef SDL_SGE sge_Update_OFF(); sge_Lock_ON(); #endif #ifdef USE_WEBOS if(the_graphics!=NULL) { dbg(0,"graphics_sdl_new: graphics struct already set: %d!\n", the_graphics_count); } the_graphics = this; the_graphics_count++; #else g_timeout_add(G_PRIORITY_DEFAULT+10, graphics_sdl_idle, this); #endif this->overlay_enable = 1; this->aa = 1; if((attr=attr_search(attrs, NULL, attr_antialias))) this->aa = attr->u.num; this->resize_callback_initial=1; return this; } #ifdef USE_WEBOS /* ---------- SDL Eventhandling ---------- */ static Uint32 sdl_timer_callback(Uint32 interval, void* param) { struct event_timeout *timeout=(struct event_timeout*)param; dbg(1,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_TIMER; userevent.data1 = timeout->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); if (timeout->multi == 0) { timeout->id = 0; return 0; // cancel timer } return interval; // reactivate timer } /* SDL Mainloop */ static void event_sdl_main_loop_run(void) { PDL_ScreenTimeoutEnable(PDL_FALSE); graphics_sdl_idle(NULL); PDL_ScreenTimeoutEnable(PDL_TRUE); } static void event_sdl_main_loop_quit(void) { quit_event_loop = 1; } /* Watch */ static void event_sdl_watch_thread (GPtrArray *watch_list) { struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); struct event_watch *ew; int ret; int idx; for (idx = 0; idx < watch_list->len; idx++ ) { ew = g_ptr_array_index (watch_list, idx); g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); } while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { for (idx = 0; idx < watch_list->len; idx++ ) { if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ ew = g_ptr_array_index (watch_list, idx); dbg(1,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_WATCH; userevent.data1 = ew->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } } } g_free(pfds); pthread_exit(0); } static void event_sdl_watch_startthread(GPtrArray *watch_list) { dbg(1,"enter\n"); if (sdl_watch_thread) event_sdl_watch_stopthread(); int ret; ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); dbg_assert (ret == 0); } static void event_sdl_watch_stopthread() { dbg(1,"enter\n"); if (sdl_watch_thread) { /* Notify the watch thread that the list of FDs will change */ pthread_kill(sdl_watch_thread, SIGUSR1); pthread_join(sdl_watch_thread, NULL); sdl_watch_thread = 0; } } static struct event_watch * event_sdl_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) { dbg(1,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); event_sdl_watch_stopthread(); if (!sdl_watch_list) sdl_watch_list = g_ptr_array_new(); struct event_watch *new_ew = g_new0 (struct event_watch, 1); struct pollfd *pfd = g_new0 (struct pollfd, 1); pfd->fd = (int) fd; /* Modify watchlist here */ switch (cond) { case event_watch_cond_read: pfd->events = POLLIN; break; case event_watch_cond_write: pfd->events = POLLOUT; break; case event_watch_cond_except: pfd->events = POLLERR|POLLHUP; break; } new_ew->pfd = (struct pollfd*) pfd; new_ew->cb = cb; g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); event_sdl_watch_startthread(sdl_watch_list); return new_ew; } static void event_sdl_remove_watch(struct event_watch *ew) { dbg(1,"enter %p\n",ew); event_sdl_watch_stopthread(); g_ptr_array_remove (sdl_watch_list, ew); g_free (ew->pfd); g_free (ew); if (sdl_watch_list->len > 0) event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ static struct event_timeout * event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout * ret = g_new0(struct event_timeout, 1); if(!ret) { dbg (0,"g_new0 failed\n"); return ret; } dbg(1,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb); ret->multi = multi; ret->cb = cb; ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); return ret; } static void event_sdl_remove_timeout(struct event_timeout *to) { dbg(2,"enter %p\n", to); if(to) { /* do not SDL_RemoveTimer if oneshot timer has already fired */ int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); if (ret == SDL_FALSE) dbg(0,"SDL_RemoveTimer (%p) failed\n", to->id); g_free(to); dbg(1,"timer(%p) removed\n", to); } } /* Idle */ /* sort ptr_array by priority, increasing order */ static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { struct idle_task *a = (struct idle_task *)parama; struct idle_task *b = (struct idle_task *)paramb; if (a->priority < b->priority) return -1; if (a->priority > b->priority) return 1; return 0; } static struct event_idle * event_sdl_add_idle(int priority, struct callback *cb) { dbg(1,"add idle priority(%d) cb(%p)\n", priority, cb); struct idle_task *task = g_new0(struct idle_task, 1); task->priority = priority; task->cb = cb; g_ptr_array_add(idle_tasks, (gpointer)task); if (idle_tasks->len < 2) { SDL_Event event; SDL_UserEvent userevent; dbg(1,"poking eventloop because of new idle_events\n"); userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } else // more than one entry => sort the list g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); return (struct event_idle *)task; } static void event_sdl_remove_idle(struct event_idle *task) { dbg(1,"remove task(%p)\n", task); g_ptr_array_remove(idle_tasks, (gpointer)task); } /* callback */ static void event_sdl_call_callback(struct callback_list *cbl) { dbg(1,"call_callback cbl(%p)\n",cbl); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; userevent.data1 = cbl; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } static struct event_methods event_sdl_methods = { event_sdl_main_loop_run, event_sdl_main_loop_quit, event_sdl_add_watch, event_sdl_remove_watch, event_sdl_add_timeout, event_sdl_remove_timeout, event_sdl_add_idle, event_sdl_remove_idle, event_sdl_call_callback, }; static struct event_priv * event_sdl_new(struct event_methods* methods) { idle_tasks = g_ptr_array_new(); *methods = event_sdl_methods; return NULL; } /* ---------- SDL Eventhandling ---------- */ #endif void plugin_init(void) { #ifdef USE_WEBOS plugin_register_event_type("sdl", event_sdl_new); #endif plugin_register_graphics_type("sdl", graphics_sdl_new); } // vim: sw=4 ts=8 navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/graphics_sdl.h000066400000000000000000000002551221777731700235200ustar00rootroot00000000000000 #ifndef __GRAPHICS_SDL_H #define __GRAPHICS_SDL_H #include #ifdef USE_WEBOS # define USE_WEBOS_ACCELEROMETER #endif gboolean graphics_sdl_idle(void *); #endif navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/raster.c000066400000000000000000001246211221777731700223550ustar00rootroot00000000000000/* raster.c -- line/rect/circle/poly rasterization copyright (c) 2008 bryan rittmeyer license: LGPLv2 based on SDL_gfx (c) A. Schiffler and SGE (c)1999-2003 Anders Lindström + added filled anti-aliased polygons + fixed some bugs and improved performance revision history 2008-07-05 initial 2008-07-06 aacircle */ #include #include "raster.h" #undef DEBUG #undef PARANOID /* raster_rect */ static inline void raster_rect_inline(SDL_Surface *dst, int16_t x1, int16_t y1, int16_t w, int16_t h, uint32_t color) { /* sge */ SDL_Rect rect; #if 1 if((w <= 0) || (h <= 0)) { return; } #if 0 if(x1 < 0) { if((x1 + w) < 0) { return; } else { w = w + x1; x1 = 0; } } if(y1 < 0) { if((y1 + h) < 0) { return; } else { h = h + y1; y1 = 0; } } if(x1 + w >= dst->w) { w = dst->w - x1; } if(y1 + h >= dst->h) { h = dst->h - y1; } #endif rect.x = x1; rect.y = y1; rect.w = w; rect.h = h; /* will clip internally */ SDL_FillRect(dst, &rect, color); #else x2 = x1 + w; y2 = y1 + h; /* * Order coordinates to ensure that * x1<=x2 and y1<=y2 */ if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; } if (y1 > y2) { tmp = y1; y1 = y2; y2 = tmp; } /* * Get clipping boundary and * check visibility */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* Clip all points */ if (x1right) { x1=right; } if (x2right) { x2=right; } if (y1bottom) { y1=bottom; } if (y2bottom) { y2=bottom; } #if 0 /* * Test for special cases of straight line or single point */ if (x1 == x2) { if (y1 == y2) { return (pixelColor(dst, x1, y1, color)); } else { return (vlineColor(dst, x1, y1, y2, color)); } } if (y1 == y2) { return (hlineColor(dst, x1, x2, y1, color)); } #endif /* * Calculate width&height */ w = x2 - x1; h = y2 - y1; /* * No alpha-blending required */ #if 0 /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } #endif /* * Lock surface */ SDL_LockSurface(dst); /* * More variable setup */ dx = w; dy = h; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; pixellast = pixel + pixx * dx + pixy * dy; dx++; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: for (; pixel <= pixellast; pixel += pixy) { memset(pixel, (Uint8) color, dx); } break; case 2: pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { *(Uint16*) pixel = color; pixel += pixx; } } break; case 3: pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } pixel += pixx; } } break; default: /* case 4 */ pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { *(Uint32 *) pixel = color; pixel += pixx; } } break; } /* * Unlock surface */ SDL_UnlockSurface(dst); #endif } void raster_rect(SDL_Surface *s, int16_t x, int16_t y, int16_t w, int16_t h, uint32_t col) { raster_rect_inline(s, x, y, w, h, col); } #define raster_rect_inline raster_rect /* raster :: pixel */ #define MODIFIED_ALPHA_PIXEL_ROUTINE #define clip_xmin(surface) surface->clip_rect.x #define clip_xmax(surface) surface->clip_rect.x+surface->clip_rect.w-1 #define clip_ymin(surface) surface->clip_rect.y #define clip_ymax(surface) surface->clip_rect.y+surface->clip_rect.h-1 static void raster_PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { if(x>=clip_xmin(surface) && x<=clip_xmax(surface) && y>=clip_ymin(surface) && y<=clip_ymax(surface)){ switch (surface->format->BytesPerPixel) { case 1: { /* Assuming 8-bpp */ *((Uint8 *)surface->pixels + y*surface->pitch + x) = color; } break; case 2: { /* Probably 15-bpp or 16-bpp */ *((Uint16 *)surface->pixels + y*surface->pitch/2 + x) = color; } break; case 3: { /* Slow 24-bpp mode, usually not used */ Uint8 *pix = (Uint8 *)surface->pixels + y * surface->pitch + x*3; /* Gack - slow, but endian correct */ *(pix+surface->format->Rshift/8) = color>>surface->format->Rshift; *(pix+surface->format->Gshift/8) = color>>surface->format->Gshift; *(pix+surface->format->Bshift/8) = color>>surface->format->Bshift; *(pix+surface->format->Ashift/8) = color>>surface->format->Ashift; } break; case 4: { /* Probably 32-bpp */ *((Uint32 *)surface->pixels + y*surface->pitch/4 + x) = color; } break; } } } /* PutPixel routine with alpha blending, input color in destination format */ /* New, faster routine - default blending pixel */ static void raster_PutPixelAlpha(SDL_Surface * surface, Sint16 x, Sint16 y, Uint32 color, Uint8 alpha) { /* sdl-gfx */ Uint32 Rmask = surface->format->Rmask, Gmask = surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; Uint32 R = 0, G = 0, B = 0, A = 0; if (x >= clip_xmin(surface) && x <= clip_xmax(surface) && y >= clip_ymin(surface) && y <= clip_ymax(surface)) { switch (surface->format->BytesPerPixel) { case 1:{ /* Assuming 8-bpp */ if (alpha == 255) { *((Uint8 *) surface->pixels + y * surface->pitch + x) = color; } else { Uint8 *pixel = (Uint8 *) surface->pixels + y * surface->pitch + x; Uint8 dR = surface->format->palette->colors[*pixel].r; Uint8 dG = surface->format->palette->colors[*pixel].g; Uint8 dB = surface->format->palette->colors[*pixel].b; Uint8 sR = surface->format->palette->colors[color].r; Uint8 sG = surface->format->palette->colors[color].g; Uint8 sB = surface->format->palette->colors[color].b; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); *pixel = SDL_MapRGB(surface->format, dR, dG, dB); } } break; case 2:{ /* Probably 15-bpp or 16-bpp */ if (alpha == 255) { *((Uint16 *) surface->pixels + y * surface->pitch / 2 + x) = color; } else { Uint16 *pixel = (Uint16 *) surface->pixels + y * surface->pitch / 2 + x; Uint32 dc = *pixel; R = ((dc & Rmask) + (((color & Rmask) - (dc & Rmask)) * alpha >> 8)) & Rmask; G = ((dc & Gmask) + (((color & Gmask) - (dc & Gmask)) * alpha >> 8)) & Gmask; B = ((dc & Bmask) + (((color & Bmask) - (dc & Bmask)) * alpha >> 8)) & Bmask; if (Amask) A = ((dc & Amask) + (((color & Amask) - (dc & Amask)) * alpha >> 8)) & Amask; *pixel = R | G | B | A; } } break; case 3:{ /* Slow 24-bpp mode, usually not used */ Uint8 *pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; Uint8 rshift8 = surface->format->Rshift / 8; Uint8 gshift8 = surface->format->Gshift / 8; Uint8 bshift8 = surface->format->Bshift / 8; Uint8 ashift8 = surface->format->Ashift / 8; if (alpha == 255) { *(pix + rshift8) = color >> surface->format->Rshift; *(pix + gshift8) = color >> surface->format->Gshift; *(pix + bshift8) = color >> surface->format->Bshift; *(pix + ashift8) = color >> surface->format->Ashift; } else { Uint8 dR, dG, dB, dA = 0; Uint8 sR, sG, sB, sA = 0; pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; dR = *((pix) + rshift8); dG = *((pix) + gshift8); dB = *((pix) + bshift8); dA = *((pix) + ashift8); sR = (color >> surface->format->Rshift) & 0xff; sG = (color >> surface->format->Gshift) & 0xff; sB = (color >> surface->format->Bshift) & 0xff; sA = (color >> surface->format->Ashift) & 0xff; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); dA = dA + ((sA - dA) * alpha >> 8); *((pix) + rshift8) = dR; *((pix) + gshift8) = dG; *((pix) + bshift8) = dB; *((pix) + ashift8) = dA; } } break; #ifdef ORIGINAL_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ if (alpha == 255) { *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; } else { Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; Uint32 dc = *pixel; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; R = ((dc & Rmask) + (((((color & Rmask) - (dc & Rmask)) >> Rshift) * alpha >> 8) << Rshift)) & Rmask; G = ((dc & Gmask) + (((((color & Gmask) - (dc & Gmask)) >> Gshift) * alpha >> 8) << Gshift)) & Gmask; B = ((dc & Bmask) + (((((color & Bmask) - (dc & Bmask)) >> Bshift) * alpha >> 8) << Bshift)) & Bmask; if (Amask) A = ((dc & Amask) + (((((color & Amask) - (dc & Amask)) >> Ashift) * alpha >> 8) << Ashift)) & Amask; *pixel = R | G | B | A; } } break; #endif #ifdef MODIFIED_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ if (alpha == 255) { *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; } else { Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; Uint32 dc = *pixel; Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask); Uint32 surfaceAlpha, preMultR, preMultG, preMultB; Uint32 aTmp; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; preMultR = (alpha * (dR>>Rshift)); preMultG = (alpha * (dG>>Gshift)); preMultB = (alpha * (dB>>Bshift)); surfaceAlpha = ((dc & Amask) >> Ashift); aTmp = (255 - alpha); if ((A = 255 - ((aTmp * (255 - surfaceAlpha)) >> 8 ))) { aTmp *= surfaceAlpha; R = (preMultR + ((aTmp * ((dc & Rmask) >> Rshift)) >> 8)) / A << Rshift & Rmask; G = (preMultG + ((aTmp * ((dc & Gmask) >> Gshift)) >> 8)) / A << Gshift & Gmask; B = (preMultB + ((aTmp * ((dc & Bmask) >> Bshift)) >> 8)) / A << Bshift & Bmask; } *pixel = R | G | B | (A << Ashift & Amask); } } break; #endif } } } /* FIXME: eliminate these 2 functions */ static int raster_pixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { int result = 0; #if 0 /* * Setup color */ alpha = color & 0x000000ff; mcolor = SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); #endif /* * Draw */ raster_PutPixel(dst, x, y, color); return (result); } /* Pixel - using alpha weight on color for AA-drawing - no locking */ static int raster_pixelColorWeightNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) { #if 0 Uint32 a; /* * Get alpha */ a = (color & (Uint32) 0x000000ff); /* * Modify Alpha by weight */ a = ((a * weight) >> 8); #endif raster_PutPixelAlpha(dst, x, y, color, weight); return 0; } /* raster :: line */ static inline void raster_hline(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) { #if 1 SDL_Rect l; /* sge */ if(x1>x2){Sint16 tmp=x1; x1=x2; x2=tmp;} l.x=x1; l.y=y; l.w=x2-x1+1; l.h=1; SDL_FillRect(dst, &l, color); #else /* sdl_gfx */ Sint16 left, right, top, bottom; Uint8 *pixel, *pixellast; int dx; int pixx, pixy; Sint16 w; Sint16 xtmp; int result = -1; #if 0 int i; union { double d; uint16_t col[4]; } doub; for(i = 0; i < 4; i++) { doub.col[i] = color; } #endif /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap x1, x2 if required to ensure x1<=x2 */ if (x1 > x2) { xtmp = x1; x1 = x2; x2 = xtmp; } /* * Get clipping boundary and * check visibility of hline */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; if ((ybottom)) { return (0); } /* * Clip x */ if (x1 < left) { x1 = left; } if (x2 > right) { x2 = right; } /* * Calculate width */ w = x2 - x1; #if 0 printf("raster_hline %d %d %d %d\n", x1, x2, y, w); #endif /* * Lock surface */ if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } /* * More variable setup */ dx = w; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: memset(pixel, color, dx); break; case 2: pixellast = pixel + dx + dx; #if 0 for (; (pixel+3) <= pixellast; pixel += 4*pixx) { *(double *)pixel = doub.d; } #endif for (; pixel <= pixellast; pixel += pixx) { *(Uint16 *) pixel = color; } break; case 3: pixellast = pixel + dx + dx + dx; for (; pixel <= pixellast; pixel += pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } } break; default: /* case 4 */ dx = dx + dx; pixellast = pixel + dx + dx; for (; pixel <= pixellast; pixel += pixx) { *(Uint32 *) pixel = color; } break; } /* * Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } /* * Set result code */ result = 0; return (result); #endif } static void raster_vline(SDL_Surface *dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) { SDL_Rect l; if(y1>y2){Sint16 tmp=y1; y1=y2; y2=tmp;} l.x=x; l.y=y1; l.w=1; l.h=y2-y1+1; SDL_FillRect(dst, &l, color); } /* raster_line */ #define CLIP_LEFT_EDGE 0x1 #define CLIP_RIGHT_EDGE 0x2 #define CLIP_BOTTOM_EDGE 0x4 #define CLIP_TOP_EDGE 0x8 #define CLIP_INSIDE(a) (!a) #define CLIP_REJECT(a,b) (a&b) #define CLIP_ACCEPT(a,b) (!(a|b)) static int clipEncode(Sint16 x, Sint16 y, Sint16 left, Sint16 top, Sint16 right, Sint16 bottom) { int code = 0; if (x < left) { code |= CLIP_LEFT_EDGE; } else if (x > right) { code |= CLIP_RIGHT_EDGE; } if (y < top) { code |= CLIP_TOP_EDGE; } else if (y > bottom) { code |= CLIP_BOTTOM_EDGE; } return code; } static int clipLine(SDL_Surface * dst, Sint16 * x1, Sint16 * y1, Sint16 * x2, Sint16 * y2) { Sint16 left, right, top, bottom; int code1, code2; int draw = 0; Sint16 swaptmp; float m; /* * Get clipping boundary */ left = dst->clip_rect.x; right = dst->clip_rect.x + dst->clip_rect.w - 1; top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; while (1) { code1 = clipEncode(*x1, *y1, left, top, right, bottom); code2 = clipEncode(*x2, *y2, left, top, right, bottom); if (CLIP_ACCEPT(code1, code2)) { draw = 1; break; } else if (CLIP_REJECT(code1, code2)) break; else { if (CLIP_INSIDE(code1)) { swaptmp = *x2; *x2 = *x1; *x1 = swaptmp; swaptmp = *y2; *y2 = *y1; *y1 = swaptmp; swaptmp = code2; code2 = code1; code1 = swaptmp; } if (*x2 != *x1) { m = (*y2 - *y1) / (float) (*x2 - *x1); } else { m = 1.0f; } if (code1 & CLIP_LEFT_EDGE) { *y1 += (Sint16) ((left - *x1) * m); *x1 = left; } else if (code1 & CLIP_RIGHT_EDGE) { *y1 += (Sint16) ((right - *x1) * m); *x1 = right; } else if (code1 & CLIP_BOTTOM_EDGE) { if (*x2 != *x1) { *x1 += (Sint16) ((bottom - *y1) / m); } *y1 = bottom; } else if (code1 & CLIP_TOP_EDGE) { if (*x2 != *x1) { *x1 += (Sint16) ((top - *y1) / m); } *y1 = top; } } } return draw; } void raster_line(SDL_Surface *dst, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t color) { /* sdl-gfx */ int pixx, pixy; int x, y; int dx, dy; int sx, sy; int swaptmp; void *pixel; /* * Clip line and test if we have to draw */ if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { return; } /* * Test for special cases of straight lines or single point */ if (x1 == x2) { if (y1 < y2) { raster_vline(dst, x1, y1, y2, color); return; } else if (y1 > y2) { raster_vline(dst, x1, y2, y1, color); return; } else { raster_PutPixel(dst, x1, y1, color); return; } } if (y1 == y2) { if (x1 < x2) { raster_hline(dst, x1, x2, y1, color); return; } else if (x1 > x2) { raster_hline(dst, x2, x1, y1, color); return; } } /* * Variable setup */ dx = x2 - x1; dy = y2 - y1; sx = (dx >= 0) ? 1 : -1; sy = (dy >= 0) ? 1 : -1; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return; } } /* * No alpha blending - use fast pixel routines */ #if 0 /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } #endif /* * More variable setup */ dx = sx * dx + 1; dy = sy * dy + 1; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; pixx *= sx; pixy *= sy; if (dx < dy) { swaptmp = dx; dx = dy; dy = swaptmp; swaptmp = pixx; pixx = pixy; pixy = swaptmp; } /* * Draw */ x = 0; y = 0; switch (dst->format->BytesPerPixel) { case 1: for (; x < dx; x++, pixel=(Uint8 *)+pixx) { *(Uint8 *)pixel = color; y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; case 2: for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { *(Uint16 *) pixel = color; y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; case 3: for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { *(Uint8 *)pixel = (color >> 16) & 0xff; *((Uint8 *)pixel+1) = (color >> 8) & 0xff; *((Uint8 *)pixel+2) = color & 0xff; } else { *(Uint8 *)pixel = color & 0xff; *((Uint8 *)pixel+1) = (color >> 8) & 0xff; *((Uint8 *)pixel+2) = (color >> 16) & 0xff; } y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; default: /* case 4 */ for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { *(Uint32 *) pixel = color; y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return; } #define AAlevels 256 #define AAbits 8 static void raster_aalineColorInt(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, int draw_endpoint) { Sint32 xx0, yy0, xx1, yy1; Uint32 intshift, erracc, erradj; Uint32 erracctmp, wgt; int dx, dy, tmp, xdir, y0p1, x0pxdir; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Clip line and test if we have to draw */ if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { return; } /* * Keep on working with 32bit numbers */ xx0 = x1; yy0 = y1; xx1 = x2; yy1 = y2; /* * Reorder points if required */ if (yy0 > yy1) { tmp = yy0; yy0 = yy1; yy1 = tmp; tmp = xx0; xx0 = xx1; xx1 = tmp; } /* * Calculate distance */ dx = xx1 - xx0; dy = yy1 - yy0; /* * Adjust for negative dx and set xdir */ if (dx >= 0) { xdir = 1; } else { xdir = -1; dx = (-dx); } /* * Check for special cases */ if (dx == 0) { /* * Vertical line */ raster_vline(dst, x1, y1, y2, color); return; } else if (dy == 0) { /* * Horizontal line */ raster_hline(dst, x1, x2, y1, color); return; } else if (dx == dy) { /* * Diagonal line */ raster_line(dst, x1, y1, x2, y2, color); return; } /* * Zero accumulator */ erracc = 0; /* * # of bits by which to shift erracc to get intensity level */ intshift = 32 - AAbits; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return; } } /* * Draw the initial pixel in the foreground color */ raster_pixelColorNolock(dst, x1, y1, color); /* * x-major or y-major? */ if (dy > dx) { /* * y-major. Calculate 16-bit fixed point fractional part of a pixel that * X advances every time Y advances 1 pixel, truncating the result so that * we won't overrun the endpoint along the X axis */ /* * Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; */ erradj = ((dx << 16) / dy) << 16; /* * draw all pixels other than the first and last */ x0pxdir = xx0 + xdir; while (--dy) { erracctmp = erracc; erracc += erradj; if (erracc <= erracctmp) { /* * rollover in error accumulator, x coord advances */ xx0 = x0pxdir; x0pxdir += xdir; } yy0++; /* y-major so always advance Y */ /* * the AAbits most significant bits of erracc give us the intensity * weighting for this pixel, and the complement of the weighting for * the paired pixel. */ wgt = (erracc >> intshift) & 255; raster_pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); raster_pixelColorWeightNolock (dst, x0pxdir, yy0, color, wgt); } } else { /* * x-major line. Calculate 16-bit fixed-point fractional part of a pixel * that Y advances each time X advances 1 pixel, truncating the result so * that we won't overrun the endpoint along the X axis. */ /* * Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; */ erradj = ((dy << 16) / dx) << 16; /* * draw all pixels other than the first and last */ y0p1 = yy0 + 1; while (--dx) { erracctmp = erracc; erracc += erradj; if (erracc <= erracctmp) { /* * Accumulator turned over, advance y */ yy0 = y0p1; y0p1++; } xx0 += xdir; /* x-major so always advance X */ /* * the AAbits most significant bits of erracc give us the intensity * weighting for this pixel, and the complement of the weighting for * the paired pixel. */ wgt = (erracc >> intshift) & 255; raster_pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); raster_pixelColorWeightNolock (dst, xx0, y0p1, color, wgt); } } /* * Do we have to draw the endpoint */ if (draw_endpoint) { /* * Draw final pixel, always exactly intersected by the line and doesn't * need to be weighted. */ raster_pixelColorNolock (dst, x2, y2, color); } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } } void raster_aaline(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col) { raster_aalineColorInt(s, x1, y1, x2, y2, col, 1); } /* raster :: circle */ void raster_circle(SDL_Surface *dst, int16_t x, int16_t y, int16_t r, uint32_t color) { /* sdl-gfx */ Sint16 left, right, top, bottom; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Sanity check radius */ if (r < 0) { return; } /* * Special case for r=0 - draw a point */ if (r == 0) { return (raster_PutPixel(dst, x, y, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return; } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return; } /* * Draw */ do { xpcx = x + cx; xmcx = x - cx; xpcy = x + cy; xmcy = x - cy; if (ocy != cy) { if (cy > 0) { ypcy = y + cy; ymcy = y - cy; raster_hline(dst, xmcx, xpcx, ypcy, color); raster_hline(dst, xmcx, xpcx, ymcy, color); // raster_rect_inline(dst, xmcx, ypcy, 2*cx, 1, color); // raster_rect_inline(dst, xmcx, ymcy, 2*cx, 1, color); } else { raster_hline(dst, xmcx, xpcx, y, color); // raster_rect_inline(dst, xmcx, y, 2*cx, 1, color); } ocy = cy; } if (ocx != cx) { if (cx != cy) { if (cx > 0) { ypcx = y + cx; ymcx = y - cx; raster_hline(dst, xmcy, xpcy, ymcx, color); raster_hline(dst, xmcy, xpcy, ypcx, color); //raster_rect_inline(dst, xmcy, ymcx, 2*cy, 1, color); //raster_rect_inline(dst, xmcy, ypcx, 2*cy, 1, color); } else { raster_hline(dst, xmcy, xpcy, y, color); //raster_rect_inline(dst, xmcy, y, 2*cy, 1, color); } } ocx = cx; } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); } /* FIXME: convert to fixed pt */ static void raster_AAFilledEllipse(SDL_Surface *surface, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color) { /* sge */ /* Sanity check */ if (rx < 1) rx = 1; if (ry < 1) ry = 1; int a2 = rx * rx; int b2 = ry * ry; int ds = 2 * a2; int dt = 2 * b2; int dxt = (int)(a2 / sqrt(a2 + b2)); int t = 0; int s = -2 * a2 * ry; int d = 0; Sint16 x = xc; Sint16 y = yc - ry; Sint16 xs, ys, dyt; float cp, is, ip, imax = 1.0; /* Lock surface */ if ( SDL_MUSTLOCK(surface) ) if ( SDL_LockSurface(surface) < 0 ) return; /* "End points" */ raster_PutPixel(surface, x, y, color); raster_PutPixel(surface, 2*xc-x, y, color); raster_PutPixel(surface, x, 2*yc-y, color); raster_PutPixel(surface, 2*xc-x, 2*yc-y, color); /* unlock surface */ if (SDL_MUSTLOCK(surface) ) SDL_UnlockSurface(surface); raster_vline(surface, x, y+1, 2*yc-y-1, color); int i; for (i = 1; i <= dxt; i++) { x--; d += t - b2; if (d >= 0) ys = y - 1; else if ((d - s - a2) > 0) { if ((2 * d - s - a2) >= 0) ys = y + 1; else { ys = y; y++; d -= s + a2; s += ds; } } else { y++; ys = y + 1; d -= s + a2; s += ds; } t -= dt; /* Calculate alpha */ cp = (float) abs(d) / abs(s); is = cp * imax; ip = imax - is; /* Lock surface */ if ( SDL_MUSTLOCK(surface) ) if ( SDL_LockSurface(surface) < 0 ) return; /* Upper half */ raster_PutPixelAlpha(surface, x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, x, ys, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-x, ys, color, (Uint8)(is*255)); /* Lower half */ raster_PutPixelAlpha(surface, x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, x, 2*yc-ys, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-ys, color, (Uint8)(is*255)); /* unlock surface */ if (SDL_MUSTLOCK(surface) ) SDL_UnlockSurface(surface); /* Fill */ raster_vline(surface, x, y+1, 2*yc-y-1, color); raster_vline(surface, 2*xc-x, y+1, 2*yc-y-1, color); raster_vline(surface, x, ys+1, 2*yc-ys-1, color); raster_vline(surface, 2*xc-x, ys+1, 2*yc-ys-1, color); } dyt = abs(y - yc); for (i = 1; i <= dyt; i++) { y++; d -= s + a2; if (d <= 0) xs = x + 1; else if ((d + t - b2) < 0) { if ((2 * d + t - b2) <= 0) xs = x - 1; else { xs = x; x--; d += t - b2; t -= dt; } } else { x--; xs = x - 1; d += t - b2; t -= dt; } s += ds; /* Calculate alpha */ cp = (float) abs(d) / abs(t); is = cp * imax; ip = imax - is; /* Lock surface */ if ( SDL_MUSTLOCK(surface) ) if ( SDL_LockSurface(surface) < 0 ) return; /* Upper half */ raster_PutPixelAlpha(surface, x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, xs, y, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-xs, y, color, (Uint8)(is*255)); /* Lower half*/ raster_PutPixelAlpha(surface, x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, xs, 2*yc-y, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-xs, 2*yc-y, color, (Uint8)(is*255)); /* unlock surface */ if (SDL_MUSTLOCK(surface) ) SDL_UnlockSurface(surface); /* Fill */ raster_hline(surface, x+1, 2*xc-x-1, y, color); raster_hline(surface, xs+1, 2*xc-xs-1, y, color); raster_hline(surface, x+1, 2*xc-x-1, 2*yc-y, color); raster_hline(surface, xs+1, 2*xc-xs-1, 2*yc-y, color); } } void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col) { raster_AAFilledEllipse(s, x, y, r, r, col); } #if 0 void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col) { /* sdl-gfx */ Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Sanity check radius */ if (r < 0) { return; } #if 0 /* * Special case for r=0 - draw a point */ if (r == 0) { return (pixelColor(dst, x, y, color)); } #endif /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return; } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return; } /* * Draw */ result = 0; do { xpcx = x + cx; xmcx = x - cx; xpcy = x + cy; xmcy = x - cy; if (ocy != cy) { if (cy > 0) { ypcy = y + cy; ymcy = y - cy; raster_hlineColor(dst, xmcx, xpcx, ypcy, color); raster_hlineColor(dst, xmcx, xpcx, ymcy, color); // raster_rect_inline(dst, xmcx, ypcy, 2*cx, 1, color); // raster_rect_inline(dst, xmcx, ymcy, 2*cx, 1, color); } else { raster_hlineColor(dst, xmcx, xpcx, y, color); // raster_rect_inline(dst, xmcx, y, 2*cx, 1, color); } ocy = cy; } if (ocx != cx) { if (cx != cy) { if (cx > 0) { ypcx = y + cx; ymcx = y - cx; raster_hlineColor(dst, xmcy, xpcy, ymcx, color); raster_hlineColor(dst, xmcy, xpcy, ypcx, color); //raster_rect_inline(dst, xmcy, ymcx, 2*cy, 1, color); //raster_rect_inline(dst, xmcy, ypcx, 2*cy, 1, color); } else { raster_hlineColor(dst, xmcy, xpcy, y, color); //raster_rect_inline(dst, xmcy, y, 2*cy, 1, color); } } ocx = cx; } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); #if 0 /* sge */ Sint16 cx = 0; Sint16 cy = r; int draw=1; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; #ifdef DEBUG printf("raster_circle %d %d %d\n", x, y, r); #endif if(r < 0) { return; } do { if(draw) { raster_rect_inline(s, x-cx, y+cy, 2*cx, 1, col); raster_rect_inline(s, x-cx, y-cy, 2*cx, 1, col); draw=0; } if(cx!=cy) { if(cx) { raster_rect_inline(s, x-cy, y-cx, 2*cy, 1, col); raster_rect_inline(s, x-cy, y+cx, 2*cy, 1, col); } else { raster_rect_inline(s, x-cy, y, 2*cy, 1, col); } } if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; draw=1; } cx++; } while(cx <= cy); #endif } #endif /* raster :: poly */ /* ---- Filled Polygon */ /* Helper qsort callback for polygon drawing */ static int gfxPrimitivesCompareInt(const void *a, const void *b) { return (*(const int *) a) - (*(const int *) b); } /* Global vertex array to use if optional parameters are not given in polygon calls. */ static int *gfxPrimitivesPolyIntsGlobal = NULL; static int gfxPrimitivesPolyAllocatedGlobal = 0; /* (Note: The last two parameters are optional; but required for multithreaded operation.) */ static inline int raster_filledPolygonColorMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color, int **polyInts, int *polyAllocated) { /* sdl-gfx */ int result; int i; int y, xa, xb; int miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *gfxPrimitivesPolyInts = NULL; int gfxPrimitivesPolyAllocated = 0; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check number of edges */ if (n < 3) { return -1; } /* * Map polygon cache */ if ((polyInts==NULL) || (polyAllocated==NULL)) { /* Use global cache */ gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; } else { /* Use local cache */ gfxPrimitivesPolyInts = *polyInts; gfxPrimitivesPolyAllocated = *polyAllocated; } /* * Allocate temp array, only grow array */ if (!gfxPrimitivesPolyAllocated) { gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } else { if (gfxPrimitivesPolyAllocated < n) { gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } } /* * Check temp array */ if (gfxPrimitivesPolyInts==NULL) { gfxPrimitivesPolyAllocated = 0; } /* * Update cache variables */ if ((polyInts==NULL) || (polyAllocated==NULL)) { gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; } else { *polyInts = gfxPrimitivesPolyInts; *polyAllocated = gfxPrimitivesPolyAllocated; } /* * Check temp array again */ if (gfxPrimitivesPolyInts==NULL) { return(-1); } /* * Determine Y maxima */ miny = vy[0]; maxy = vy[0]; for (i = 1; (i < n); i++) { if (vy[i] < miny) { miny = vy[i]; } else if (vy[i] > maxy) { maxy = vy[i]; } } /* * Draw, scanning y */ result = 0; for (y = miny; (y <= maxy); y++) { ints = 0; for (i = 0; (i < n); i++) { if (!i) { ind1 = n - 1; ind2 = 0; } else { ind1 = i - 1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); } } qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); for (i = 0; (i < ints); i += 2) { xa = gfxPrimitivesPolyInts[i] + 1; xa = (xa >> 16) + ((xa & 32768) >> 15); xb = gfxPrimitivesPolyInts[i+1] - 1; xb = (xb >> 16) + ((xb & 32768) >> 15); raster_hline(dst, xa, xb, y, color); // raster_rect_inline(dst, xa, y, xb - xa, 1, color); } } return (result); } void raster_polygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col) { raster_filledPolygonColorMT(s, vx, vy, n, col, NULL, NULL); } void raster_aapolygon(SDL_Surface *dst, int16_t n, int16_t *vx, int16_t *vy, uint32_t color) { /* sdl-gfx + sge w/ rphlx changes: basically, draw aaline border, then fill. the output is not perfect yet but usually looks better than aliasing */ int i; int y, xa, xb; int miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *gfxPrimitivesPolyInts = NULL; int gfxPrimitivesPolyAllocated = 0; const Sint16 *px1, *py1, *px2, *py2; int **polyInts; int *polyAllocated; polyInts = NULL; polyAllocated = NULL; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Sanity check number of edges */ if (n < 3) { return; } /* * Pointer setup */ px1 = px2 = vx; py1 = py2 = vy; px2++; py2++; /* * Draw */ for (i = 1; i < n; i++) { raster_aalineColorInt(dst, *px1, *py1, *px2, *py2, color, 0); px1 = px2; py1 = py2; px2++; py2++; } raster_aalineColorInt(dst, *px1, *py1, *vx, *vy, color, 0); /* * Map polygon cache */ if ((polyInts==NULL) || (polyAllocated==NULL)) { /* Use global cache */ gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; } else { /* Use local cache */ gfxPrimitivesPolyInts = *polyInts; gfxPrimitivesPolyAllocated = *polyAllocated; } /* * Allocate temp array, only grow array */ if (!gfxPrimitivesPolyAllocated) { gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } else { if (gfxPrimitivesPolyAllocated < n) { gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } } /* * Check temp array */ if (gfxPrimitivesPolyInts==NULL) { gfxPrimitivesPolyAllocated = 0; } /* * Update cache variables */ if ((polyInts==NULL) || (polyAllocated==NULL)) { gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; } else { *polyInts = gfxPrimitivesPolyInts; *polyAllocated = gfxPrimitivesPolyAllocated; } /* * Check temp array again */ if (gfxPrimitivesPolyInts==NULL) { return; } /* * Determine Y maxima */ miny = vy[0]; maxy = vy[0]; for (i = 1; (i < n); i++) { if (vy[i] < miny) { miny = vy[i]; } else if (vy[i] > maxy) { maxy = vy[i]; } } /* * Draw, scanning y */ for (y = miny; (y <= maxy); y++) { ints = 0; for (i = 0; (i < n); i++) { if (!i) { ind1 = n - 1; ind2 = 0; } else { ind1 = i - 1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); } } qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); // o = p = -1; for (i = 0; (i < ints); i +=2) { #if 0 xa = gfxPrimitivesPolyInts[i] + 1; xa = (xa >> 16) + ((xa & 32768) >> 15); xb = gfxPrimitivesPolyInts[i+1] - 1; xb = (xb >> 16) + ((xb & 32768) >> 15); #else xa = (gfxPrimitivesPolyInts[i] >> 16); xb = (gfxPrimitivesPolyInts[i+1] >> 16); #endif #if 0 if(o < 0) { o = xa+1; } else if(p < 0) { p = xa; } if( (o >= 0) && (p >= 0)) { if(p-o < 0) { o = p = -1; continue; } raster_hlineColor(dst, o, p, y, color); o = p = -1; } #else raster_hline(dst, xa+1, xb, y, color); #endif // raster_rect_inline(dst, xa, y, xb - xa, 1, color); } } } navit-0.5.0~svn5643+dfsg.1/navit/graphics/sdl/raster.h000066400000000000000000000015531221777731700223600ustar00rootroot00000000000000/* raster.h -- line/rect/circle/poly rasterization copyright (c) 2008 bryan rittmeyer license: LGPLv2 */ #ifndef __RASTER_H #define __RASTER_H #include #include void raster_rect(SDL_Surface *s, int16_t x, int16_t y, int16_t w, int16_t h, uint32_t col); void raster_line(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col); void raster_circle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col); void raster_polygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col); void raster_aaline(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col); void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col); void raster_aapolygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col); #endif /* __RASTER_H */ navit-0.5.0~svn5643+dfsg.1/navit/gtkext.h000066400000000000000000000015671221777731700200110ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GTKEXT_H #define NAVIT_GTKEXT_H void gdk_gc_set_fill_rule(GdkGC *gc, GdkFillRule fill_rule); #endif navit-0.5.0~svn5643+dfsg.1/navit/gui.c000066400000000000000000000103071221777731700172520ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "callback.h" #include "gui.h" #include "menu.h" #include "data_window.h" #include "item.h" #include "plugin.h" struct gui { struct gui_methods meth; struct gui_priv *priv; struct attr **attrs; struct attr parent; }; struct gui * gui_new(struct attr *parent, struct attr **attrs) { struct gui *this_; struct attr *type_attr; struct gui_priv *(*guitype_new)(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui); struct attr cbl; if (! (type_attr=attr_search(attrs, NULL, attr_type))) { return NULL; } guitype_new=plugin_get_gui_type(type_attr->u.str); if (! guitype_new) return NULL; this_=g_new0(struct gui, 1); this_->attrs=attr_list_dup(attrs); cbl.type=attr_callback_list; cbl.u.callback_list=callback_list_new(); this_->attrs=attr_generic_add_attr(this_->attrs, &cbl); this_->priv=guitype_new(parent->u.navit, &this_->meth, this_->attrs, this_); this_->parent=*parent; return this_; } int gui_get_attr(struct gui *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret; if (this_->meth.get_attr) { ret=this_->meth.get_attr(this_->priv, type, attr); if (ret) return ret; } if (type == this_->parent.type) { *attr=this_->parent; return 1; } return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int gui_set_attr(struct gui *this_, struct attr *attr) { int ret=1; if (this_->meth.set_attr) ret=this_->meth.set_attr(this_->priv, attr); if (ret == 1) this_->attrs=attr_generic_set_attr(this_->attrs, attr); return ret != 0; } int gui_add_attr(struct gui *this_, struct attr *attr) { int ret=0; if (this_->meth.add_attr) ret=this_->meth.add_attr(this_->priv, attr); return ret; } struct menu * gui_menubar_new(struct gui *gui) { struct menu *this_; if (! gui->meth.menubar_new) return NULL; this_=g_new0(struct menu, 1); this_->priv=gui->meth.menubar_new(gui->priv, &this_->meth); if (! this_->priv) { g_free(this_); return NULL; } return this_; } struct menu * gui_popup_new(struct gui *gui) { struct menu *this_; if (!gui || ! gui->meth.popup_new) return NULL; this_=g_new0(struct menu, 1); this_->priv=gui->meth.popup_new(gui->priv, &this_->meth); if (! this_->priv) { g_free(this_); return NULL; } return this_; } struct datawindow * gui_datawindow_new(struct gui *gui, const char *name, struct callback *click, struct callback *close) { struct datawindow *this_; if (! gui->meth.datawindow_new) return NULL; this_=g_new0(struct datawindow, 1); this_->priv=gui->meth.datawindow_new(gui->priv, name, click, close, &this_->meth); if (! this_->priv) { g_free(this_); return NULL; } return this_; } int gui_add_bookmark(struct gui *gui, struct pcoord *c, char *description) { int ret; dbg(2,"enter\n"); if (! gui->meth.add_bookmark) return 0; ret=gui->meth.add_bookmark(gui->priv, c, description); dbg(2,"ret=%d\n", ret); return ret; } int gui_set_graphics(struct gui *this_, struct graphics *gra) { if (! this_->meth.set_graphics) return 1; return this_->meth.set_graphics(this_->priv, gra); } void gui_disable_suspend(struct gui *this_) { if (this_->meth.disable_suspend) this_->meth.disable_suspend(this_->priv); } int gui_has_main_loop(struct gui *this_) { if (! this_->meth.run_main_loop) return 0; return 1; } int gui_run_main_loop(struct gui *this_) { if (! gui_has_main_loop(this_)) return 1; return this_->meth.run_main_loop(this_->priv); } navit-0.5.0~svn5643+dfsg.1/navit/gui.h000066400000000000000000000053261221777731700172640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GUI_H #define NAVIT_GUI_H #ifdef __cplusplus extern "C" { #endif struct navit; struct gui_priv; struct menu_methods; struct datawindow_methods; struct callback; struct graphics; struct coord; struct pcoord; struct gui_methods { struct menu_priv *(*menubar_new)(struct gui_priv *priv, struct menu_methods *meth); struct menu_priv *(*popup_new)(struct gui_priv *priv, struct menu_methods *meth); int (*set_graphics)(struct gui_priv *priv, struct graphics *gra); int (*run_main_loop)(struct gui_priv *priv); struct datawindow_priv *(*datawindow_new)(struct gui_priv *priv, const char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth); int (*add_bookmark)(struct gui_priv *priv, struct pcoord *c, char *description); void (*disable_suspend)(struct gui_priv *priv); int (*get_attr)(struct gui_priv *priv, enum attr_type type, struct attr *attr); int (*add_attr)(struct gui_priv *priv, struct attr *attr); int (*set_attr)(struct gui_priv *priv, struct attr *attr); }; /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct callback; struct datawindow; struct graphics; struct gui; struct menu; struct pcoord; struct gui *gui_new(struct attr *parent, struct attr **attrs); int gui_get_attr(struct gui *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int gui_set_attr(struct gui *this_, struct attr *attr); int gui_add_attr(struct gui *this_, struct attr *attr); struct menu *gui_menubar_new(struct gui *gui); struct menu *gui_popup_new(struct gui *gui); struct datawindow *gui_datawindow_new(struct gui *gui, const char *name, struct callback *click, struct callback *close); int gui_add_bookmark(struct gui *gui, struct pcoord *c, char *description); int gui_set_graphics(struct gui *this_, struct graphics *gra); void gui_disable_suspend(struct gui *this_); int gui_has_main_loop(struct gui *this_); int gui_run_main_loop(struct gui *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/gui/000077500000000000000000000000001221777731700171055ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/gui/Makefile.am000066400000000000000000000002361221777731700211420ustar00rootroot00000000000000SUBDIRS= if GUI_INTERNAL SUBDIRS += internal endif if GUI_GTK SUBDIRS += gtk endif if GUI_WIN32 SUBDIRS += win32 endif if GUI_QML SUBDIRS += qml endifnavit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/000077500000000000000000000000001221777731700176725ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/CMakeLists.txt000066400000000000000000000001571221777731700224350ustar00rootroot00000000000000module_add_library(gui_gtk datawindow.c destination.c gui_gtk_statusbar.c gui_gtk_action.c gui_gtk_window.c) navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/Makefile.am000066400000000000000000000005601221777731700217270ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = -I$(top_srcdir)/navit @NAVIT_CFLAGS@ @HILDON_CFLAGS@ @GTK2_CFLAGS@ -DMODULE=gui_gtk modulegui_LTLIBRARIES = libgui_gtk.la libgui_gtk_la_SOURCES = datawindow.c destination.c gui_gtk_statusbar.c gui_gtk_action.c gui_gtk_window.c gui_gtk.h libgui_gtk_la_LIBADD = @GTK2_LIBS@ libgui_gtk_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/datawindow.c000066400000000000000000000141761221777731700222100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "debug.h" #include "callback.h" #include "param.h" #include "data_window.h" #include "gui_gtk.h" struct datawindow_priv { GtkWidget *window; GtkWidget *scrolled_window; GtkWidget *treeview; GtkWidget *button; GtkListStore *liststore; GtkTreeModel *sortmodel; struct callback *click, *close; struct gui_priv *gui; }; static GValue value; static void select_row(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, struct datawindow_priv *win) { char *cols[20]; GtkTreeIter iter; GtkTreeModel *model; int i; dbg(0,"win=%p\n", win); model=gtk_tree_view_get_model(tree); gtk_tree_model_get_iter(model, &iter, path); for (i=0;iclick, cols); } static void gui_gtk_datawindow_add(struct datawindow_priv *win, struct param_list *param, int count) { int i; GtkCellRenderer *cell; GtkTreeIter iter; GType types[count]; if (! win->treeview) { win->treeview=gtk_tree_view_new(); gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), NULL); gtk_container_add(GTK_CONTAINER(win->scrolled_window), win->treeview); gtk_widget_show_all(GTK_WIDGET(win->window)); gtk_widget_grab_focus(GTK_WIDGET(win->treeview)); /* add column names to treeview */ for(i=0;itreeview),-1,param[i].name, cell,"text",i, NULL); } } #if 0 g_signal_connect(G_OBJECT(win->treeview), "click-column", G_CALLBACK(click_column), NULL); #endif g_signal_connect(G_OBJECT(win->treeview), "row-activated", G_CALLBACK(select_row), win); } /* find data storage and create a new one if none is there */ if (gtk_tree_view_get_model(GTK_TREE_VIEW (win->treeview)) == NULL) { for(i=0;iliststore=gtk_list_store_newv(count,types); if (! strcmp(param[0].name, "Distance")) { win->sortmodel=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(win->liststore)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (win->sortmodel), 0, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), GTK_TREE_MODEL(win->sortmodel)); } else gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), GTK_TREE_MODEL(win->liststore)); } gtk_list_store_append(win->liststore,&iter); /* add data to data storage */ for(i=0;iliststore,&iter,i,atoi(param[i].value),-1); } else { gtk_list_store_set(win->liststore,&iter,i,param[i].value,-1); } } } static void gui_gtk_datawindow_mode(struct datawindow_priv *win, int start) { if (start) { if (win && win->treeview) { gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), NULL); } } } static gboolean gui_gtk_datawindow_delete(GtkWidget *widget, GdkEvent *event, struct datawindow_priv *win) { callback_call_0(win->close); if (win->button) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(win->button), FALSE); } return FALSE; } void gui_gtk_datawindow_destroy(struct datawindow_priv *win) { if ((!win->gui) || (!win->gui->datawindow)) { return; } gui_gtk_datawindow_delete(NULL, NULL, win); gtk_widget_destroy(win->window); win->gui->datawindow = NULL; return; } void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn) { this_->button = btn; } static gboolean keypress(GtkWidget *widget, GdkEventKey *event, struct datawindow_priv *win) { if (event->type != GDK_KEY_PRESS) return FALSE; if (event->keyval == GDK_Cancel) { gui_gtk_datawindow_delete(widget, (GdkEvent *)event, win); gtk_widget_destroy(win->window); } return FALSE; } static struct datawindow_methods gui_gtk_datawindow_meth = { gui_gtk_datawindow_destroy, gui_gtk_datawindow_add, gui_gtk_datawindow_mode, }; struct datawindow_priv * gui_gtk_datawindow_new(struct gui_priv *gui, const char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth) { struct datawindow_priv *win; if (!gui) return NULL; *meth=gui_gtk_datawindow_meth; win=g_new0(struct datawindow_priv, 1); win->window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(win->window), 320, 200); gtk_window_set_title(GTK_WINDOW(win->window), name); gtk_window_set_wmclass (GTK_WINDOW (win->window), "navit", "Navit"); win->scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (win->scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(win->window), win->scrolled_window); g_signal_connect(G_OBJECT(win->window), "key-press-event", G_CALLBACK(keypress), win); win->treeview=NULL; win->click=click; win->close=close; gtk_window_set_transient_for(GTK_WINDOW((GtkWidget *)(win->window)), GTK_WINDOW(gui->win)); g_signal_connect(G_OBJECT(win->window), "delete-event", G_CALLBACK(gui_gtk_datawindow_delete), win); gtk_widget_show_all(win->window); win->gui = gui; gui->datawindow = win; return win; } navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/destination.c000066400000000000000000000440521221777731700223640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "debug.h" #include "destination.h" #include "navit.h" #include "item.h" #include "coord.h" #include "track.h" #include "country.h" #include "search.h" #include "projection.h" #include "navit_nls.h" #include "bookmarks.h" #define COL_COUNT 8 static struct search_param { struct navit *nav; struct mapset *ms; struct search_list *sl; struct attr attr; int partial; GtkWidget *entry_country, *entry_postal, *entry_city, *entry_district; GtkWidget *entry_street, *entry_number; GtkWidget *listbox; GtkWidget *treeview; GtkListStore *liststore; GtkTreeModel *liststore2; } search_param; static void button_map(GtkWidget *widget, struct search_param *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; struct pcoord *c=NULL; GtkTreeIter iter; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(search->liststore2, &iter, path)) return; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); if (c) { navit_set_center(search->nav, c, 1); } } static char *description(struct search_param *search, GtkTreeIter *iter) { char *desc,*car,*postal,*town,*street; char empty='\0'; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 0, &car, -1); gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 1, &postal, -1); gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 2, &town, -1); gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 4, &street, -1); /* protect against nulls */ if (car==0) car=∅ if (postal==0) postal=∅ if (town==0) town=∅ if (street==0) street=∅ if (search->attr.type == attr_town_name) desc=g_strdup_printf("%s-%s %s", car, postal, town); else desc=g_strdup_printf("%s-%s %s, %s", car, postal, town, street); return desc; } static void button_destination(GtkWidget *widget, struct search_param *search) { struct pcoord *c=NULL; GtkTreeIter iter; char *desc; if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (search->liststore2), &iter)) return; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); if (c) { desc=description(search, &iter); navit_set_destination(search->nav, c, desc, 1); g_free(desc); } } static void button_bookmark(GtkWidget *widget, struct search_param *search) { struct pcoord *c=NULL; GtkTreeIter iter; char *desc; struct attr attr; if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (search->liststore2), &iter)) return; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); if (c) { navit_get_attr(search->nav, attr_bookmarks, &attr, NULL); desc=description(search, &iter); bookmarks_add_bookmark(attr.u.bookmarks, c, desc); g_free(desc); } } char **columns_text[] = { (char *[]){_n("Car"),_n("Iso2"),_n("Iso3"),_n("Country"),NULL}, (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),NULL}, (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),_n("Street"),NULL}, (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),_n("Street"),_n("Number"),NULL}, }; static void set_columns(struct search_param *param, int mode) { GList *columns_list,*columns; char **column_text=columns_text[mode]; int i=0; columns_list=gtk_tree_view_get_columns(GTK_TREE_VIEW(param->treeview)); columns=columns_list; while (columns) { gtk_tree_view_remove_column(GTK_TREE_VIEW(param->treeview), columns->data); columns=g_list_next(columns); } g_list_free(columns_list); while (*column_text) { GtkCellRenderer *cell=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (param->treeview),-1, navit_nls_gettext(*column_text), cell, "text", i, NULL); i++; column_text++; } } static void row_activated(GtkWidget *widget, GtkTreePath *p1, GtkTreeViewColumn *c, struct search_param *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; GtkWidget *entry_widget; char *str; int column; dbg(0,"enter\n"); gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(search->liststore2, &iter, path)) return; switch(search->attr.type) { case attr_country_all: entry_widget=search->entry_country; column=3; break; case attr_town_name: entry_widget=search->entry_city; column=2; break; case attr_street_name: entry_widget=search->entry_street; column=4; break; default: dbg(0,"Unknown mode\n"); return; } gtk_tree_model_get(search->liststore2, &iter, column, &str, -1); dbg(0,"str=%s\n", str); search->partial=0; gtk_entry_set_text(GTK_ENTRY(entry_widget), str); } static void tree_view_button_release(GtkWidget *widget, GdkEventButton *event, struct search_param *search) { GtkTreePath *path; GtkTreeViewColumn *column; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &column); gtk_tree_view_row_activated(GTK_TREE_VIEW(search->treeview), path, column); } static void next_focus(struct search_param *search, GtkWidget *widget) { if (widget == search->entry_country) gtk_widget_grab_focus(search->entry_city); if (widget == search->entry_city) gtk_widget_grab_focus(search->entry_street); if (widget == search->entry_street) gtk_widget_grab_focus(search->entry_number); } static void changed(GtkWidget *widget, struct search_param *search) { struct search_list_result *res; GtkTreeIter iter; search->attr.u.str=(char *)gtk_entry_get_text(GTK_ENTRY(widget)); printf("changed %s partial %d\n", search->attr.u.str, search->partial); if (widget == search->entry_country) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING); dbg(0,"country\n"); search->attr.type=attr_country_all; set_columns(search, 0); } if (widget == search->entry_postal) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 1, GTK_SORT_ASCENDING); dbg(0,"postal\n"); search->attr.type=attr_town_postal; if (strlen(search->attr.u.str) < 2) return; set_columns(search, 1); } if (widget == search->entry_city) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 2, GTK_SORT_ASCENDING); dbg(0,"town\n"); search->attr.type=attr_town_name; if (strlen(search->attr.u.str) < 3) return; set_columns(search, 1); } if (widget == search->entry_street) { dbg(0,"street\n"); search->attr.type=attr_street_name; // Searching for a street by just its first letter generates too many hits to be useful, // plus it causes the GUI to become unresponsive because the search is single-threaded. // So we only start searching once we have two letters. if (strlen(search->attr.u.str) < 2) return; set_columns(search, 2); } search_list_search(search->sl, &search->attr, search->partial); gtk_list_store_clear(search->liststore); while((res=search_list_get_result(search->sl))) { gtk_list_store_append(search->liststore,&iter); gtk_list_store_set(search->liststore,&iter,COL_COUNT,res->c,-1); if (widget == search->entry_country) { if (res->country) { gtk_list_store_set(search->liststore,&iter,0,res->country->car,-1); gtk_list_store_set(search->liststore,&iter,1,res->country->iso3,-1); gtk_list_store_set(search->liststore,&iter,2,res->country->iso2,-1); gtk_list_store_set(search->liststore,&iter,3,res->country->name,-1); } } else { if (res->country) gtk_list_store_set(search->liststore,&iter,0,res->country->car,-1); else gtk_list_store_set(search->liststore,&iter,0,"",-1); if (res->town) { gtk_list_store_set(search->liststore,&iter,1,res->town->common.postal,-1); gtk_list_store_set(search->liststore,&iter,2,res->town->common.town_name,-1); gtk_list_store_set(search->liststore,&iter,3,res->town->common.district_name,-1); } else { gtk_list_store_set(search->liststore,&iter,1,"",-1); gtk_list_store_set(search->liststore,&iter,2,"",-1); gtk_list_store_set(search->liststore,&iter,3,"",-1); } if (res->street) gtk_list_store_set(search->liststore,&iter,4,res->street->name,-1); else gtk_list_store_set(search->liststore,&iter,4,"",-1); } } if(! search->partial) { if( widget == search->entry_country ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); } if( widget == search->entry_city ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), TRUE); } if( widget == search->entry_street ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), TRUE); } } else { if( widget == search->entry_country ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); } if( widget == search->entry_city ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); } if( widget == search->entry_street ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); } } if (! search->partial) next_focus(search, widget); search->partial=1; } /* borrowed from gpe-login */ #define MAX_ARGS 8 static void parse_xkbd_args (const char *cmd, char **argv) { const char *p = cmd; char buf[strlen (cmd) + 1], *bufp = buf; int nargs = 0; int escape = 0, squote = 0, dquote = 0; while (*p) { if (escape) { *bufp++ = *p; escape = 0; } else { switch (*p) { case '\\': escape = 1; break; case '"': if (squote) *bufp++ = *p; else dquote = !dquote; break; case '\'': if (dquote) *bufp++ = *p; else squote = !squote; break; case ' ': if (!squote && !dquote) { *bufp = 0; if (nargs < MAX_ARGS) argv[nargs++] = strdup (buf); bufp = buf; break; } default: *bufp++ = *p; break; } } p++; } if (bufp != buf) { *bufp = 0; if (nargs < MAX_ARGS) argv[nargs++] = strdup (buf); } argv[nargs] = NULL; } int kbd_pid; static int spawn_xkbd (char *xkbd_path, char *xkbd_str) { #ifdef _WIN32 // AF FIXME for WIN32 #ifndef F_SETFD #define F_SETFD 2 #endif #else char *xkbd_args[MAX_ARGS + 1]; int fd[2]; char buf[256]; char c; int a = 0; size_t n; pipe (fd); kbd_pid = fork (); if (kbd_pid == 0) { close (fd[0]); if (dup2 (fd[1], 1) < 0) perror ("dup2"); close (fd[1]); if (fcntl (1, F_SETFD, 0)) perror ("fcntl"); xkbd_args[0] = (char *)xkbd_path; xkbd_args[1] = "-xid"; if (xkbd_str) parse_xkbd_args (xkbd_str, xkbd_args + 2); else xkbd_args[2] = NULL; execvp (xkbd_path, xkbd_args); perror (xkbd_path); _exit (1); } close (fd[1]); do { n = read (fd[0], &c, 1); if (n) { buf[a++] = c; } } while (n && (c != 10) && (a < (sizeof (buf) - 1))); if (a) { buf[a] = 0; return atoi (buf); } #endif return 0; } int destination_address(struct navit *nav) { GtkWidget *window2, *keyboard, *vbox, *table; GtkWidget *label_country; GtkWidget *label_postal, *label_city, *label_district; GtkWidget *label_street, *label_number; GtkWidget *button1,*button2,*button3; int i; struct search_param *search=&search_param; struct attr search_attr, country_name, *country_attr; struct tracking *tracking; struct country_search *cs; struct item *item; search->nav=nav; search->ms=navit_get_mapset(nav); search->sl=search_list_new(search->ms); window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window2),_("Enter Destination")); gtk_window_set_wmclass (GTK_WINDOW (window2), "navit", "Navit"); gtk_window_set_default_size (GTK_WINDOW (window2),0,300); vbox = gtk_vbox_new(FALSE, 0); table = gtk_table_new(3, 8, FALSE); search->entry_country = gtk_entry_new(); label_country = gtk_label_new(_("Country")); search->entry_postal = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_postal), FALSE); label_postal = gtk_label_new(_("Zip Code")); search->entry_city = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), FALSE); label_city = gtk_label_new(_("City")); search->entry_district = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_district), FALSE); label_district = gtk_label_new(_("District/Township")); search->entry_street = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); label_street = gtk_label_new(_("Street")); search->entry_number = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); label_number = gtk_label_new(_("Number")); search->treeview=gtk_tree_view_new(); search->listbox = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (search->listbox), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), NULL); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(search->listbox),search->treeview); { GType types[COL_COUNT+1]; for(i=0;iliststore=gtk_list_store_newv(COL_COUNT+1,types); search->liststore2=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(search->liststore)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), GTK_TREE_MODEL(search->liststore2)); } button1 = gtk_button_new_with_label(_("Map")); button2 = gtk_button_new_with_label(_("Bookmark")); button3 = gtk_button_new_with_label(_("Destination")); gtk_table_attach(GTK_TABLE(table), label_country, 0, 1, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_postal, 1, 2, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_city, 2, 3, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_country, 0, 1, 1, 2, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_postal, 1, 2, 1, 2, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_city, 2, 3, 1, 2, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_district, 0, 1, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_street, 1, 2, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_number, 2, 3, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_district, 0, 1, 3, 4, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_street, 1, 2, 3, 4, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_number, 2, 3, 3, 4, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->listbox, 0, 3, 4, 5, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); gtk_table_attach(GTK_TABLE(table), button1, 0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), button2, 1, 2, 5, 6, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), button3, 2, 3, 5, 6, GTK_FILL, GTK_FILL, 0, 0); g_signal_connect(G_OBJECT(search->entry_country), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_postal), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_city), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_district), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_street), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_number), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button_map), search); g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button_bookmark), search); g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(button_destination), search); g_signal_connect(G_OBJECT(search->treeview), "button-release-event", G_CALLBACK(tree_view_button_release), search); g_signal_connect(G_OBJECT(search->treeview), "row_activated", G_CALLBACK(row_activated), search); gtk_widget_grab_focus(search->entry_city); gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); keyboard=gtk_socket_new(); gtk_box_pack_end(GTK_BOX(vbox), keyboard, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(window2), vbox); #if 0 g_signal_connect(G_OBJECT(listbox), "select-row", G_CALLBACK(select_row), NULL); #endif gtk_widget_show_all(window2); #ifndef _WIN32 gtk_socket_steal(GTK_SOCKET(keyboard), spawn_xkbd("xkbd","-geometry 200x100")); #endif country_attr=country_default(); tracking=navit_get_tracking(nav); if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) country_attr=&search_attr; if (country_attr) { cs=country_search_new(country_attr, 0); item=country_search_get_item(cs); if (item && item_attr_get(item, attr_country_name, &country_name)) gtk_entry_set_text(GTK_ENTRY(search->entry_country), country_name.u.str); country_search_destroy(cs); } else { dbg(0,"warning: no default country found\n"); } search->partial=1; return 0; } navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/gui_gtk.h000066400000000000000000000041201221777731700214710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "coord.h" struct menu_methods; struct datawindow_methods; struct navit; struct callback; struct statusbar_priv; struct gui_priv { struct navit *nav; GtkWidget *win; GtkWidget *dialog_win; GtkWidget *dialog_entry; struct pcoord dialog_coord; GtkWidget *vbox; GtkWidget *menubar; GtkActionGroup *base_group; GtkActionGroup *debug_group; GtkActionGroup *dyn_group; GtkUIManager *ui_manager; GSList *layout_group; GSList *projection_group; GSList *vehicle_group; GList *dest_menuitems; GList *bookmarks_menuitems; GList *vehicle_menuitems; GtkUIManager *menu_manager; // old struct statusbar_priv *statusbar; int menubar_enable; int toolbar_enable; int statusbar_enable; int dyn_counter; struct datawindow_priv *datawindow; }; void gui_gtk_ui_init(struct gui_priv *this); struct menu_priv *gui_gtk_menubar_new(struct gui_priv *gui, struct menu_methods *meth); struct statusbar_priv *gui_gtk_statusbar_new(struct gui_priv *gui); struct menu_priv *gui_gtk_popup_new(struct gui_priv *gui, struct menu_methods *meth); struct datawindow_priv *gui_gtk_datawindow_new(struct gui_priv *gui, const char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth); void gui_gtk_datawindow_destroy(struct datawindow_priv *win); void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn); navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/gui_gtk_action.c000066400000000000000000000455131221777731700230340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "navit.h" #include "gui_gtk.h" #ifdef __APPLE__ #include "navit/menu.h" #else #include "menu.h" #endif #include "coord.h" #include "item.h" #include "attr.h" #include "callback.h" #include "debug.h" #include "destination.h" #include "navit_nls.h" struct menu_priv { char *path; GtkAction *action; struct gui_priv *gui; enum menu_type type; struct callback *cb; struct menu_priv *child; struct menu_priv *sibling; gulong handler_id; guint merge_id; GtkWidget *widget; }; /* Create callbacks that implement our Actions */ static void zoom_in_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_zoom_in(gui->nav, 2, NULL); } static void zoom_out_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_zoom_out(gui->nav, 2, NULL); } static void refresh_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_draw(gui->nav); } // Forward declarations, these should not be visible outside the GUI, so // they are not in the header files, but here void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn); void gui_gtk_datawindow_destroy(struct datawindow_priv *win); static void roadbook_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { if (! gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) { gui_gtk_datawindow_destroy(gui->datawindow); } else { navit_window_roadbook_new(gui->nav); if (gui->datawindow) { gui_gtk_datawindow_set_button(gui->datawindow, w); } } } static void autozoom_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr autozoom_attr; autozoom_attr.type = attr_autozoom_active; if (! gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) { autozoom_attr.u.num = 0; } else { autozoom_attr.u.num = 1; } navit_set_attr(gui->nav, &autozoom_attr); } static void cursor_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr attr; attr.type=attr_cursor; attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); if(!navit_set_attr(gui->nav, &attr)) { dbg(0, "Failed to set attr_cursor\n"); } } static void tracking_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr attr; attr.type=attr_tracking; attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); if(!navit_set_attr(gui->nav, &attr)) { dbg(0, "Failed to set attr_tracking\n"); } } static void orient_north_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr attr; attr.type=attr_orientation; attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)) ? 0:-1; if(!navit_set_attr(gui->nav, &attr)) { dbg(0, "Failed to set attr_orientation\n"); } } static void window_fullscreen_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { if(gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) gtk_window_fullscreen(GTK_WINDOW(gui->win)); else gtk_window_unfullscreen(GTK_WINDOW(gui->win)); } #include #include "point.h" #include "transform.h" static void info_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { char buffer[512]; int mw,mh; struct coord lt, rb; struct point p; struct transformation *t; t=navit_get_trans(gui->nav); transform_get_size(t, &mw, &mh); p.x=0; p.y=0; transform_reverse(t, &p, <); p.x=mw; p.y=mh; transform_reverse(t, &p, &rb); sprintf(buffer,"./info.sh %d,%d 0x%x,0x%x 0x%x,0x%x", mw, mh, lt.x, lt.y, rb.x, rb.y); system(buffer); } static void route_clear_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_set_destination(gui->nav, NULL, NULL, 0); } static void destination_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { destination_address(gui->nav); } static void quit_action (GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_destroy(gui->nav); exit(0); } static GtkActionEntry entries[] = { /* TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). */ { "DisplayMenuAction", NULL, _n("_Display") }, { "RouteMenuAction", NULL, _n("_Route") }, { "FormerDestinationMenuAction", NULL, _n("_Former Destinations") }, { "BookmarkMenuAction", NULL, _n("_Bookmarks") }, { "MapMenuAction", NULL, _n("_Map") }, { "LayoutMenuAction", NULL, _n("_Layout") }, { "ProjectionMenuAction", NULL, _n("_Projection") }, { "VehicleMenuAction", NULL, _n("_Vehicle") }, { "ZoomOutAction", GTK_STOCK_ZOOM_OUT, _n("Zoom_Out"), "minus", _n("Decrease zoom level"), G_CALLBACK(zoom_out_action) }, { "ZoomInAction", GTK_STOCK_ZOOM_IN, _n("Zoom_In"), "plus", _n("Increase zoom level"), G_CALLBACK(zoom_in_action) }, { "RefreshAction", GTK_STOCK_REFRESH, _n("_Recalculate"), "R", _n("Redraw map"), G_CALLBACK(refresh_action) }, #ifdef GTK_STOCK_INFO { "InfoAction", GTK_STOCK_INFO, _n("_Info"), NULL, NULL, G_CALLBACK(info_action) }, #else { "InfoAction", NULL, _n("_Info"), NULL, NULL, G_CALLBACK(info_action) }, #endif /*GTK_STOCK_INFO*/ { "DestinationAction", "flag_icon", _n("Set _destination"), "D", _n("Opens address search dialog"), G_CALLBACK(destination_action) }, { "RouteClearAction", NULL, _n("_Stop Navigation"), "S", NULL, G_CALLBACK(route_clear_action) }, { "Test", NULL, _n("Test"), NULL, NULL, G_CALLBACK(destination_action) }, { "QuitAction", GTK_STOCK_QUIT, _n("_Quit"), "Q",_n("Quit the application"), G_CALLBACK (quit_action) } }; static guint n_entries = G_N_ELEMENTS (entries); static GtkToggleActionEntry toggleentries[] = { { "CursorAction", "cursor_icon",_n("Show position _cursor"), NULL, NULL, G_CALLBACK(cursor_action),TRUE }, { "TrackingAction", NULL ,_n("_Lock on Road"), NULL, NULL, G_CALLBACK(tracking_action),TRUE }, { "OrientationAction", "orientation_icon", _n("_Keep orientation to the North"), NULL, _n("Switches map orientation to the north or the vehicle"), G_CALLBACK(orient_north_action),FALSE }, { "RoadbookAction", GTK_STOCK_JUSTIFY_FILL, _n("_Roadbook"), "B", _n("Show/hide route description"), G_CALLBACK(roadbook_action), FALSE }, { "AutozoomAction", GTK_STOCK_ZOOM_FIT, _n("_Autozoom"), "A", _n("Enable/disable automatic zoom level changing"), G_CALLBACK(autozoom_action), FALSE }, #ifdef GTK_STOCK_FULLSCREEN { "FullscreenAction",GTK_STOCK_FULLSCREEN, _n("_Fullscreen"), "F", NULL, G_CALLBACK(window_fullscreen_action), FALSE } #else { "FullscreenAction", NULL, _n("_Fullscreen"), "F", NULL, G_CALLBACK(window_fullscreen_action), FALSE } #endif /*GTK_STOCK_FULLSCREEN*/ }; static guint n_toggleentries = G_N_ELEMENTS (toggleentries); static GtkActionEntry debug_entries[] = { { "DataMenuAction", NULL, _n("Data") }, }; static guint n_debug_entries = G_N_ELEMENTS (debug_entries); static const char * cursor_xpm[] = { "22 22 2 1", " c None", ". c #0000FF", " ", " ", " ", " .. ", " .. .. ", " .. .. ", " . . ", " . . ", " . ... . ", " . ... . . ", " . ... . . ", " . .. . . ", " . . . ", " . . . ", " . . . ", " . . . ", " .. .. ", " .. .. ", " .. ", " ", " ", " "}; static const char * north_xpm[] = { "22 22 2 1", " c None", ". c #000000", " ", " ", " . ", " ... ", " . . . ", " . . . ", " . ", " .... . .... ", " .... . .... ", " .... . .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. . .... ", " .... . .... ", " .... . .... ", " . ", " . ", " . ", " ", " "}; static const char * flag_xpm[] = { "22 22 2 1", " c None", "+ c #000000", "+++++++ ", "+ +++++++++ ", "+ +++ +++++++++ ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ + ", "+ ++++++ +++ + ", "+ +++ ++++++ + ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++++++++ +++ + ", "+ +++++++++ + ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; static struct { gchar *stockid; const char **icon_xpm; } stock_icons[] = { {"cursor_icon", cursor_xpm }, {"orientation_icon", north_xpm }, {"flag_icon", flag_xpm } }; static gint n_stock_icons = G_N_ELEMENTS (stock_icons); static void register_my_stock_icons (void) { GtkIconFactory *icon_factory; GtkIconSet *icon_set; GdkPixbuf *pixbuf; gint i; icon_factory = gtk_icon_factory_new (); for (i = 0; i < n_stock_icons; i++) { pixbuf = gdk_pixbuf_new_from_xpm_data(stock_icons[i].icon_xpm); icon_set = gtk_icon_set_new_from_pixbuf (pixbuf); g_object_unref(pixbuf); gtk_icon_factory_add (icon_factory, stock_icons[i].stockid, icon_set); gtk_icon_set_unref (icon_set); } gtk_icon_factory_add_default(icon_factory); g_object_unref(icon_factory); } static char layout[] = "\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "; static void activate(void *dummy, struct menu_priv *menu) { if (menu->cb) callback_call_0(menu->cb); } static struct menu_methods menu_methods; static struct menu_priv * add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb) { struct menu_priv *ret; char *dynname; ret=g_new0(struct menu_priv, 1); *meth=menu_methods; if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Route")) { dynname=g_strdup("Route"); } else if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Data")) { dynname=g_strdup("Data"); } else { dynname=g_strdup_printf("%d", menu->gui->dyn_counter++); if (type == menu_type_toggle) ret->action=GTK_ACTION(gtk_toggle_action_new(dynname, name, NULL, NULL)); else ret->action=gtk_action_new(dynname, name, NULL, NULL); if (cb) ret->handler_id=g_signal_connect(ret->action, "activate", G_CALLBACK(activate), ret); gtk_action_group_add_action(menu->gui->dyn_group, ret->action); ret->merge_id=gtk_ui_manager_new_merge_id(menu->gui->ui_manager); gtk_ui_manager_add_ui( menu->gui->ui_manager, ret->merge_id, menu->path, dynname, dynname, type == menu_type_submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); } ret->gui=menu->gui; ret->path=g_strdup_printf("%s/%s", menu->path, dynname); ret->type=type; ret->cb=cb; ret->sibling=menu->child; menu->child=ret; g_free(dynname); return ret; } static void remove_menu(struct menu_priv *item, int recursive) { if (recursive) { struct menu_priv *next,*child=item->child; while (child) { next=child->sibling; remove_menu(child, recursive); child=next; } } if (item->action) { gtk_ui_manager_remove_ui(item->gui->ui_manager, item->merge_id); gtk_action_group_remove_action(item->gui->dyn_group, item->action); #if 0 if (item->callback) g_signal_handler_disconnect(item->action, item->handler_id); #endif g_object_unref(item->action); } g_free(item->path); g_free(item); } static void set_toggle(struct menu_priv *menu, int active) { gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(menu->action), active); } static int get_toggle(struct menu_priv *menu) { return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(menu->action)); } static struct menu_methods menu_methods = { #if 1 add_menu, set_toggle, get_toggle, #else NULL, NULL, NULL #endif }; static void popup_deactivate(GtkWidget *widget, struct menu_priv *menu) { g_signal_handler_disconnect(widget, menu->handler_id); remove_menu(menu, 1); } static void popup_activate(struct menu_priv *menu) { #ifdef _WIN32 menu->widget=gtk_ui_manager_get_widget(menu->gui->ui_manager, menu->path ); #endif gtk_menu_popup(GTK_MENU(menu->widget), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ()); menu->handler_id=g_signal_connect(menu->widget, "selection-done", G_CALLBACK(popup_deactivate), menu); } void gui_gtk_ui_init(struct gui_priv *this) { GError *error = NULL; struct attr attr; GtkToggleAction *toggle_action; this->base_group = gtk_action_group_new ("BaseActions"); this->debug_group = gtk_action_group_new ("DebugActions"); this->dyn_group = gtk_action_group_new ("DynamicActions"); register_my_stock_icons(); this->ui_manager = gtk_ui_manager_new (); gtk_action_group_set_translation_domain(this->base_group,"navit"); gtk_action_group_set_translation_domain(this->debug_group,"navit"); gtk_action_group_set_translation_domain(this->dyn_group,"navit"); gtk_action_group_add_actions (this->base_group, entries, n_entries, this); gtk_action_group_add_toggle_actions (this->base_group, toggleentries, n_toggleentries, this); gtk_ui_manager_insert_action_group (this->ui_manager, this->base_group, 0); gtk_action_group_add_actions (this->debug_group, debug_entries, n_debug_entries, this); gtk_ui_manager_insert_action_group (this->ui_manager, this->debug_group, 0); gtk_ui_manager_add_ui_from_string (this->ui_manager, layout, strlen(layout), &error); gtk_ui_manager_insert_action_group (this->ui_manager, this->dyn_group, 0); if (error) { g_message ("building menus failed: %s", error->message); g_error_free (error); } if (navit_get_attr(this->nav, attr_cursor, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "CursorAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } if (navit_get_attr(this->nav, attr_orientation, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "OrientationAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num != -1); } if (navit_get_attr(this->nav, attr_tracking, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "TrackingAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "RoadbookAction")); gtk_toggle_action_set_active(toggle_action, 0); if (navit_get_attr(this->nav, attr_autozoom_active, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "AutozoomAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } } static struct menu_priv * gui_gtk_ui_new (struct gui_priv *this, struct menu_methods *meth, char *path, int popup, GtkWidget **widget_ret) { struct menu_priv *ret; GtkWidget *widget; *meth=menu_methods; ret=g_new0(struct menu_priv, 1); ret->path=g_strdup(path); ret->gui=this; widget=gtk_ui_manager_get_widget(this->ui_manager, path); GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); if (widget_ret) *widget_ret=widget; if (! popup) { gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); } else { ret->widget=widget; meth->popup=popup_activate; } return ret; } #if 0 struct menu_priv * gui_gtk_menubar_new(struct gui_priv *this, struct menu_methods *meth) { return gui_gtk_ui_new(this, meth, "/ui/MenuBar", 0, &this->menubar); } #endif struct menu_priv * gui_gtk_popup_new(struct gui_priv *this, struct menu_methods *meth) { return gui_gtk_ui_new(this, meth, "/ui/PopUp", 1, NULL); } navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/gui_gtk_statusbar.c000066400000000000000000000126401221777731700235620ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "item.h" #include "coord.h" #include "debug.h" #include "vehicle.h" #include "callback.h" #include "route.h" #include "transform.h" #include "navit.h" #include "map.h" #include "navigation.h" #include "gui_gtk.h" #include "navit_nls.h" struct statusbar_priv { struct gui_priv *gui; GtkWidget *hbox; char gps_text[128]; GtkWidget *gps; char route_text[128]; GtkWidget *route; struct callback *vehicle_cb; }; #if 0 static void statusbar_destroy(struct statusbar_priv *this) { g_free(this); } static void statusbar_gps_update(struct statusbar_priv *this, int sats, int qual, double lng, double lat, double height, double direction, double speed) { char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; char *dir; int dir_idx; char pos_text[36]; coord_format(lat,lng,DEGREES_MINUTES_SECONDS,pos_text,sizeof(pos_text)); dir=dirs[dir_idx]; sprintf(this->gps_text, "GPS %02d/%02d %s %4.0fm %3.0f°%-2s %3.0fkm/h", sats, qual, pos_text, height, direction, dir, speed); gtk_label_set_text(GTK_LABEL(this->gps), this->gps_text); } #endif static const char *status_fix2str(int type) { switch(type) { case 0: return _("No"); case 1: return _("2D"); case 3: return _("3D"); default: return _("OT"); } } static void statusbar_route_update(struct statusbar_priv *this, struct navit *navit, struct vehicle *v) { struct navigation *nav=NULL; struct map *map=NULL; struct map_rect *mr=NULL; struct item *item=NULL; struct attr attr; double route_len=0; time_t eta; struct tm *eta_tm=NULL; char buffer[128]; double lng, lat, direction=0, height=0, speed=0, hdop=0; int sats=0, qual=0; int status=0; const char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; const char *dir; int dir_idx; if (navit) nav=navit_get_navigation(navit); if (nav) map=navigation_get_map(nav); if (map) mr=map_rect_new(map, NULL); if (mr) item=map_rect_get_item(mr); if (item) { if (item_attr_get(item, attr_destination_length, &attr)) route_len=attr.u.num; if (item_attr_get(item, attr_destination_time, &attr)) { eta=time(NULL)+attr.u.num/10; eta_tm=localtime(&eta); } } if (mr) map_rect_destroy(mr); sprintf(buffer,_("Route %4.0fkm %02d:%02d ETA" ),route_len/1000, eta_tm ? eta_tm->tm_hour : 0 , eta_tm ? eta_tm->tm_min : 0); if (strcmp(buffer, this->route_text)) { strcpy(this->route_text, buffer); gtk_label_set_text(GTK_LABEL(this->route), this->route_text); } if (!vehicle_get_attr(v, attr_position_coord_geo, &attr, NULL)) return; lng=attr.u.coord_geo->lng; lat=attr.u.coord_geo->lat; if (vehicle_get_attr(v, attr_position_fix_type, &attr, NULL)) status=attr.u.num; if (vehicle_get_attr(v, attr_position_direction, &attr, NULL)) direction=*(attr.u.numd); direction=fmod(direction,360); if (direction < 0) direction+=360; dir_idx=(direction+22.5)/45; dir=dirs[dir_idx]; if (vehicle_get_attr(v, attr_position_height, &attr, NULL)) height=*(attr.u.numd); if (vehicle_get_attr(v, attr_position_hdop, &attr, NULL)) hdop=*(attr.u.numd); if (vehicle_get_attr(v, attr_position_speed, &attr, NULL)) speed=*(attr.u.numd); if (vehicle_get_attr(v, attr_position_sats_used, &attr, NULL)) sats=attr.u.num; if (vehicle_get_attr(v, attr_position_qual, &attr, NULL)) qual=attr.u.num; coord_format(lat,lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); sprintf(this->gps_text,"GPS:%s %02d/%02d HD:%02.2f %s %4.0fm %3.0f°%-2s %3.0fkm/h", status_fix2str(status), sats, qual, hdop, buffer, height, direction, dir, speed); gtk_label_set_text(GTK_LABEL(this->gps), this->gps_text); } struct statusbar_priv * gui_gtk_statusbar_new(struct gui_priv *gui) { struct statusbar_priv *this=g_new0(struct statusbar_priv, 1); this->gui=gui; this->hbox=gtk_hbox_new(FALSE, 1); this->gps=gtk_label_new( "GPS 00/0 0000.0000N 00000.0000E 0000m 000°NO 000km/h" ); gtk_label_set_justify(GTK_LABEL(this->gps), GTK_JUSTIFY_LEFT); this->route=gtk_label_new( _( "Route 0000km 0+00:00 ETA" ) ); gtk_label_set_justify(GTK_LABEL(this->route), GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(this->hbox), this->gps, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(this->hbox), gtk_vseparator_new(), TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(this->hbox), this->route, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (this->hbox, GTK_CAN_FOCUS); gtk_box_pack_end(GTK_BOX(gui->vbox), this->hbox, FALSE, FALSE, 0); gtk_widget_show_all(this->hbox); /* add a callback for position updates */ this->vehicle_cb=callback_new_attr_1(callback_cast(statusbar_route_update), attr_position_coord_geo, this); navit_add_callback(gui->nav, this->vehicle_cb); return this; } navit-0.5.0~svn5643+dfsg.1/navit/gui/gtk/gui_gtk_window.c000066400000000000000000000570101221777731700230610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #if !defined(GDK_Book) || !defined(GDK_Calendar) #include #endif #include #include "config.h" #include "item.h" #include "xmlconfig.h" #include "navit.h" #include "debug.h" #include "gui.h" #include "coord.h" #include "point.h" #include "plugin.h" #include "graphics.h" #include "gui_gtk.h" #include "transform.h" #include "config.h" #include "callback.h" #include "layout.h" #include "vehicle.h" #include "map.h" #include "coord.h" #include "event.h" #include "bookmarks.h" #include "route.h" #include "navit_nls.h" #ifdef USE_HILDON #include "hildon/hildon-defines.h" #define KEY_ZOOM_IN HILDON_HARDKEY_INCREASE #define KEY_ZOOM_OUT HILDON_HARDKEY_DECREASE #define KEY_UP HILDON_HARDKEY_UP #define KEY_DOWN HILDON_HARDKEY_DOWN #define KEY_LEFT HILDON_HARDKEY_LEFT #define KEY_RIGHT HILDON_HARDKEY_RIGHT #else #ifndef GDK_Book #define GDK_Book XF86XK_Book #endif #ifndef GDK_Calendar #define GDK_Calendar XF86XK_Calendar #endif #define KEY_ZOOM_IN GDK_Book #define KEY_ZOOM_OUT GDK_Calendar #define KEY_UP GDK_Up #define KEY_DOWN GDK_Down #define KEY_LEFT GDK_Left #define KEY_RIGHT GDK_Right #endif static gboolean keypress(GtkWidget *widget, GdkEventKey *event, struct gui_priv *this) { int w,h; struct transformation *t; #ifdef USE_HILDON GtkToggleAction *action; gboolean *fullscreen; #endif /*HILDON*/ struct point p; if (event->type != GDK_KEY_PRESS) return FALSE; dbg(1,"keypress 0x%x\n", event->keyval); transform_get_size(navit_get_trans(this->nav), &w, &h); switch (event->keyval) { case GDK_KP_Enter: gtk_menu_shell_select_first(GTK_MENU_SHELL(this->menubar), TRUE); break; case KEY_UP: p.x=w/2; p.y=0; navit_set_center_screen(this->nav, &p, 1); break; case KEY_DOWN: p.x=w/2; p.y=h; navit_set_center_screen(this->nav, &p, 1); break; case KEY_LEFT: p.x=0; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case KEY_RIGHT: p.x=w; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case KEY_ZOOM_IN: navit_zoom_in(this->nav, 2, NULL); break; case KEY_ZOOM_OUT: navit_zoom_out(this->nav, 2, NULL); break; case 'a': t=navit_get_trans(this->nav); transform_set_yaw(t, (transform_get_yaw(t)+15)%360); navit_draw(this->nav); break; case 'd': t=navit_get_trans(this->nav); transform_set_yaw(t, (transform_get_yaw(t)-15)%360); navit_draw(this->nav); break; case 'w': t=navit_get_trans(this->nav); transform_set_pitch(t, (transform_get_pitch(t)+5)%360); navit_draw(this->nav); break; case 'x': t=navit_get_trans(this->nav); transform_set_pitch(t, (transform_get_pitch(t)-5)%360); navit_draw(this->nav); break; case 'r': t=navit_get_trans(this->nav); transform_set_distance(t, (transform_get_distance(t)-5)); navit_draw(this->nav); break; case 'f': t=navit_get_trans(this->nav); transform_set_distance(t, (transform_get_distance(t)+5)); navit_draw(this->nav); break; case 'z': t=navit_get_trans(this->nav); transform_set_hog(t, (transform_get_hog(t)+1)); navit_draw(this->nav); break; case 'h': t=navit_get_trans(this->nav); transform_set_hog(t, (transform_get_hog(t)-1)); navit_draw(this->nav); break; case 't': { struct coord *p; struct pcoord pc; t=navit_get_trans(this->nav); p=transform_center(t); pc.pro=projection_mg; p->y+=50*cos(transform_get_yaw(t)*M_PI/180); p->x+=50*sin(transform_get_yaw(t)*M_PI/180); pc.x=p->x; pc.y=p->y; navit_set_center(this->nav, &pc, 1); } break; case 'g': { struct coord *p; struct pcoord pc; t=navit_get_trans(this->nav); p=transform_center(t); pc.pro=projection_mg; p->y-=50*cos(transform_get_yaw(t)*M_PI/180); p->x-=50*sin(transform_get_yaw(t)*M_PI/180); pc.x=p->x; pc.y=p->y; navit_set_center(this->nav, &pc, 1); } break; #ifdef USE_HILDON case HILDON_HARDKEY_FULLSCREEN: action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (this->base_group, "FullscreenAction")); if ( gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))) { fullscreen = 0; } else { fullscreen = 1; } gtk_toggle_action_set_active (action, fullscreen); break; #endif /*HILDON*/ default: return FALSE; } return TRUE; } static int gui_gtk_set_graphics(struct gui_priv *this, struct graphics *gra) { GtkWidget *graphics; graphics=graphics_get_data(gra, "gtk_widget"); if (! graphics) return 1; GTK_WIDGET_SET_FLAGS (graphics, GTK_CAN_FOCUS); gtk_widget_set_sensitive(graphics, TRUE); g_signal_connect(G_OBJECT(graphics), "key-press-event", G_CALLBACK(keypress), this); gtk_box_pack_end(GTK_BOX(this->vbox), graphics, TRUE, TRUE, 0); gtk_widget_show_all(graphics); gtk_widget_grab_focus(graphics); return 0; } static void gui_gtk_route_callback(struct gui_priv *gui) { struct attr route_attr; GtkAction *roadbookAction=gtk_ui_manager_get_action (gui->ui_manager,"/ui/ToolBar/ToolItems/Roadbook"); if (roadbookAction) { if (navit_get_attr(gui->nav,attr_route,&route_attr,NULL)) { struct attr route_status_attr; if (route_get_attr(route_attr.u.route, attr_route_status,&route_status_attr,NULL) ) { if (route_status_attr.u.num>2) { gtk_action_set_sensitive(roadbookAction,1); } else { gtk_action_set_sensitive(roadbookAction,0); } } } } } static void gui_gtk_add_bookmark_do(struct gui_priv *gui) { struct attr attr; navit_get_attr(gui->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, &gui->dialog_coord, gtk_entry_get_text(GTK_ENTRY(gui->dialog_entry))); gtk_widget_destroy(gui->dialog_win); } static int gui_gtk_add_bookmark(struct gui_priv *gui, struct pcoord *c, char *description) { GtkWidget *button_ok,*button_cancel,*label,*vbox,*hbox; gui->dialog_coord=*c; gui->dialog_win=gtk_window_new(GTK_WINDOW_TOPLEVEL); vbox=gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (gui->dialog_win), vbox); gtk_window_set_title(GTK_WINDOW(gui->dialog_win),_("Add Bookmark")); gtk_window_set_wmclass (GTK_WINDOW (gui->dialog_win), "navit", "Navit"); gtk_window_set_transient_for(GTK_WINDOW(gui->dialog_win), GTK_WINDOW(gui->win)); gtk_window_set_modal(GTK_WINDOW(gui->dialog_win), TRUE); label=gtk_label_new(_("Name")); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); gui->dialog_entry=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(gui->dialog_entry), description); gtk_box_pack_start(GTK_BOX(vbox), gui->dialog_entry, TRUE, TRUE, 0); hbox=gtk_hbox_new(FALSE, 0); button_ok = gtk_button_new_from_stock (GTK_STOCK_OK); gtk_box_pack_start(GTK_BOX(hbox), button_ok, TRUE, TRUE, 10); button_cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL); gtk_box_pack_start(GTK_BOX(hbox), button_cancel, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 10); gtk_widget_show_all(gui->dialog_win); GTK_WIDGET_SET_FLAGS (button_ok, GTK_CAN_DEFAULT); gtk_widget_grab_default(button_ok); g_signal_connect_swapped (G_OBJECT (button_cancel), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (gui->dialog_win)); g_signal_connect_swapped (G_OBJECT (gui->dialog_entry), "activate", G_CALLBACK (gui_gtk_add_bookmark_do), gui); g_signal_connect_swapped(G_OBJECT (button_ok), "clicked", G_CALLBACK (gui_gtk_add_bookmark_do), gui); return 1; } struct gui_methods gui_gtk_methods = { NULL, gui_gtk_popup_new, gui_gtk_set_graphics, NULL, gui_gtk_datawindow_new, gui_gtk_add_bookmark, }; static gboolean gui_gtk_delete(GtkWidget *widget, GdkEvent *event, struct navit *nav) { /* FIXME remove attr_navit callback */ navit_destroy(nav); exit(0); return TRUE; } static void gui_gtk_toggle_init(struct gui_priv *this) { struct attr attr; GtkToggleAction *toggle_action; if (navit_get_attr(this->nav, attr_cursor, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "CursorAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } else { dbg(1, "Unable to locate CursorAction\n"); } if (navit_get_attr(this->nav, attr_orientation, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "OrientationAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num != -1); } else { dbg(0, "Unable to locate OrientationAction\n"); } if (navit_get_attr(this->nav, attr_tracking, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "TrackingAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } else { dbg(0, "Unable to locate TrackingAction\n"); } } struct action_cb_data { struct gui_priv *gui; struct attr attr; }; static void gui_gtk_action_activate(GtkAction *action, struct action_cb_data *data) { if(data->attr.type == attr_destination) { char * label; g_object_get(G_OBJECT(action), "label", &label,NULL); navit_set_destination(data->gui->nav, data->attr.u.pcoord, label, 1); g_free(label); } } struct gui_menu_info { guint merge_id; GtkAction *action; }; static void gui_gtk_del_menu(struct gui_priv *this, struct gui_menu_info *meninfo) { gtk_action_group_remove_action(this->dyn_group, meninfo->action); gtk_ui_manager_remove_ui(this->ui_manager, meninfo->merge_id); } static struct gui_menu_info gui_gtk_add_menu(struct gui_priv *this, char *name, char *label, char *path, int submenu, struct action_cb_data *data) { struct gui_menu_info meninfo; GtkAction *action; guint merge_id; action=gtk_action_new(name, label, NULL, NULL); meninfo.action = action; if (data) g_signal_connect(action, "activate", G_CALLBACK(gui_gtk_action_activate), data); gtk_action_group_add_action(this->dyn_group, action); merge_id =gtk_ui_manager_new_merge_id(this->ui_manager); meninfo.merge_id = merge_id; gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); return meninfo; } static void gui_gtk_action_toggled(GtkToggleAction *action, struct action_cb_data *data) { struct attr active; active.type=attr_active; active.u.num=gtk_toggle_action_get_active(action); map_set_attr(data->attr.u.map, &active); navit_draw(data->gui->nav); } static void gui_gtk_add_toggle_menu(struct gui_priv *this, char *name, char *label, char *path, struct action_cb_data *data, gboolean active) { GtkToggleAction *toggle_action; guint merge_id; toggle_action=gtk_toggle_action_new(name, label, NULL, NULL); gtk_toggle_action_set_active(toggle_action, active); g_signal_connect(GTK_ACTION(toggle_action), "toggled", G_CALLBACK(gui_gtk_action_toggled), data); gtk_action_group_add_action(this->dyn_group, GTK_ACTION(toggle_action)); merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); } static void gui_gtk_action_changed(GtkRadioAction *action, GtkRadioAction *current, struct action_cb_data *data) { if (action == current) { navit_set_attr(data->gui->nav, &data->attr); } } static struct gui_menu_info gui_gtk_add_radio_menu(struct gui_priv *this, char *name, char *label, char *path, struct action_cb_data *data, GSList **g) { struct gui_menu_info meninfo; GtkRadioAction *radio_action; guint merge_id; radio_action=gtk_radio_action_new(name, label, NULL, NULL, 0); meninfo.action = (GtkAction *)radio_action; gtk_radio_action_set_group(radio_action, *g); *g=gtk_radio_action_get_group(radio_action); g_signal_connect(GTK_ACTION(radio_action), "changed", G_CALLBACK(gui_gtk_action_changed), data); gtk_action_group_add_action(this->dyn_group, GTK_ACTION(radio_action)); merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); meninfo.merge_id = merge_id; gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); return meninfo; } static void gui_gtk_layouts_init(struct gui_priv *this) { struct attr_iter *iter; struct attr attr; struct action_cb_data *data; int count=0; char *name; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_layout, &attr, iter)) { name=g_strdup_printf("Layout %d", count++); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_layout; data->attr.u.layout=attr.u.layout; gui_gtk_add_radio_menu(this, name, attr.u.layout->name, "/ui/MenuBar/Map/Layout/LayoutMenuAdditions", data, &this->layout_group); g_free(name); } navit_attr_iter_destroy(iter); } static void gui_gtk_projections_init(struct gui_priv *this) { struct action_cb_data *data; data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_projection; data->attr.u.projection=projection_mg; gui_gtk_add_radio_menu(this, "Projection mg", "Map & Guide", "/ui/MenuBar/Map/Projection/ProjectionMenuAdditions", data, &this->projection_group); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_projection; data->attr.u.projection=projection_garmin; gui_gtk_add_radio_menu(this, "Projection garmin", "Garmin", "/ui/MenuBar/Map/Projection/ProjectionMenuAdditions", data, &this->projection_group); } static void gui_gtk_vehicles_update(struct gui_priv *this) { struct attr_iter *iter; struct attr attr,vattr; struct action_cb_data *data; int count=0; char *name; GList *curr; struct gui_menu_info *meninfo; dbg(1,"enter\n"); curr = g_list_first(this->vehicle_menuitems); while (curr) { gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); g_free((struct gui_menu_info *)curr->data); curr = g_list_next(curr); }; g_list_free(this->vehicle_menuitems); this->vehicle_menuitems = NULL; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_vehicle, &attr, iter)) { vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); name=g_strdup_printf("Vehicle %d", count++); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_vehicle; data->attr.u.vehicle=attr.u.vehicle; meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_radio_menu(this, name, vattr.u.str, "/ui/MenuBar/Map/Vehicle/VehicleMenuAdditions", data, &this->vehicle_group); this->vehicle_menuitems = g_list_prepend(this->vehicle_menuitems, meninfo); g_free(name); } navit_attr_iter_destroy(iter); } static void gui_gtk_vehicles_init(struct gui_priv *this) { navit_add_callback(this->nav, callback_new_attr_1(callback_cast(gui_gtk_vehicles_update), attr_vehicle, this)); gui_gtk_vehicles_update(this); } static void gui_gtk_maps_init(struct gui_priv *this) { struct attr_iter *iter; struct attr attr,active,type,data; struct action_cb_data *cb_data; int count=0; char *name, *label; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_map, &attr, iter)) { name=g_strdup_printf("Map %d", count++); if (! map_get_attr(attr.u.map, attr_type, &type, NULL)) type.u.str=""; if (! map_get_attr(attr.u.map, attr_data, &data, NULL)) data.u.str=""; label=g_strdup_printf("%s:%s", type.u.str, data.u.str); cb_data=g_new(struct action_cb_data, 1); cb_data->gui=this; cb_data->attr.type=attr_map; cb_data->attr.u.map=attr.u.map; if (! map_get_attr(attr.u.map, attr_active, &active, NULL)) active.u.num=1; gui_gtk_add_toggle_menu(this, name, label, "/ui/MenuBar/Map/MapMenuAdditions", cb_data, active.u.num); g_free(name); g_free(label); } navit_attr_iter_destroy(iter); } static void gui_gtk_destinations_update(struct gui_priv *this) { GList *curr; struct attr attr; struct action_cb_data *data; struct map_rect *mr=NULL; struct item *item; struct gui_menu_info *meninfo; struct coord c; int count=0; char *name, *label; curr = g_list_first(this->dest_menuitems); while (curr) { gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); g_free((struct gui_menu_info *)curr->data); curr = g_list_next(curr); }; g_list_free(this->dest_menuitems); this->dest_menuitems = NULL; if(navit_get_attr(this->nav, attr_former_destination_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { while ((item=map_rect_get_item(mr))) { if (item->type != type_former_destination) continue; name=g_strdup_printf("Destination %d", count++); item_attr_get(item, attr_label, &attr); label=attr.u.str; item_coord_get(item, &c, 1); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_destination; data->attr.u.pcoord=g_new(struct pcoord, 1); data->attr.u.pcoord->pro=projection_mg; data->attr.u.pcoord->x=c.x; data->attr.u.pcoord->y=c.y; meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_menu(this, name, label, "/ui/MenuBar/Route/FormerDestinations/FormerDestinationMenuAdditions",0,data); this->dest_menuitems = g_list_prepend(this->dest_menuitems, meninfo); g_free(name); } map_rect_destroy(mr); } } static void gui_gtk_destinations_init(struct gui_priv *this) { navit_add_callback(this->nav, callback_new_attr_1(callback_cast(gui_gtk_destinations_update), attr_destination, this)); gui_gtk_destinations_update(this); } static void gui_gtk_bookmarks_update(struct gui_priv *this) { GList *curr; struct attr attr; struct action_cb_data *data; struct map_rect *mr=NULL; struct gui_menu_info *meninfo; struct item *item; struct coord c; int count=0; char *parent, *name, *label, *label_full, *menu_label, *tmp_parent, *s; GHashTable *hash; curr = g_list_first(this->bookmarks_menuitems); while (curr) { gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); g_free((struct gui_menu_info *)curr->data); curr = g_list_next(curr); }; g_list_free(this->bookmarks_menuitems); this->bookmarks_menuitems = NULL; if(navit_get_attr(this->nav, attr_bookmark_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); while ((item=map_rect_get_item(mr))) { if (item->type != type_bookmark) continue; item_attr_get(item, attr_label, &attr); label_full=attr.u.str; item_coord_get(item, &c, 1); menu_label=g_malloc(strlen(label_full)+1); label=label_full; parent=g_strdup("/ui/MenuBar/Route/Bookmarks/BookmarkMenuAdditions"); while ((s=strchr(label, '/'))) { strcpy(menu_label, label_full); menu_label[s-label_full]='\0'; if ((tmp_parent=g_hash_table_lookup(hash, menu_label))) { tmp_parent=g_strdup(tmp_parent); } else { name=g_strdup_printf("Bookmark %d", count++); meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_menu(this, name, menu_label+(label-label_full),parent,1,NULL); this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); tmp_parent=g_strdup_printf("%s/%s", parent, name); g_hash_table_insert(hash, g_strdup(menu_label), g_strdup(tmp_parent)); g_free(name); } g_free(parent); parent=tmp_parent; label=s+1; } g_free(menu_label); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_destination; data->attr.u.pcoord=g_new(struct pcoord, 1); data->attr.u.pcoord->pro=projection_mg; data->attr.u.pcoord->x=c.x; data->attr.u.pcoord->y=c.y; name=g_strdup_printf("Bookmark %d", count++); meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_menu(this, name, label, parent,0,data); this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); g_free(name); g_free(parent); } g_hash_table_destroy(hash); } } static void gui_gtk_bookmarks_init(struct gui_priv *this) { struct attr attr; navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_callback(attr.u.bookmarks, callback_new_attr_1(callback_cast(gui_gtk_bookmarks_update), attr_bookmark_map, this)); gui_gtk_bookmarks_update(this); } static void gui_gtk_init(struct gui_priv *this, struct navit *nav) { struct attr route_attr; gui_gtk_toggle_init(this); gui_gtk_layouts_init(this); gui_gtk_projections_init(this); gui_gtk_vehicles_init(this); gui_gtk_maps_init(this); gui_gtk_destinations_init(this); gui_gtk_bookmarks_init(this); if (navit_get_attr(nav,attr_route,&route_attr,NULL)) { struct attr callback; callback.type=attr_callback; callback.u.callback=callback_new_attr_1(callback_cast(gui_gtk_route_callback), attr_route_status, this); route_add_attr(route_attr.u.route, &callback); } gui_gtk_route_callback(this); //Set initial state } static struct gui_priv * gui_gtk_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) { struct gui_priv *this; int w=792, h=547; char *cp = getenv("NAVIT_XID"); unsigned xid = 0; struct attr *attr; GtkWidget *widget; int fullscreen = 0; if (! event_request_system("glib","gui_gtk_new")) return NULL; if (cp) { xid = strtol(cp, NULL, 0); } this=g_new0(struct gui_priv, 1); this->nav=nav; attr = attr_search(attrs, NULL, attr_menubar); if (attr) { this->menubar_enable=attr->u.num; } else { this->menubar_enable=1; } attr=attr_search(attrs, NULL, attr_toolbar); if (attr) { this->toolbar_enable=attr->u.num; } else { this->toolbar_enable=1; } attr=attr_search(attrs, NULL, attr_statusbar); if (attr) { this->statusbar_enable=attr->u.num; } else { this->statusbar_enable=1; } *meth=gui_gtk_methods; if (!xid) this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); else this->win = gtk_plug_new(xid); g_signal_connect(G_OBJECT(this->win), "delete-event", G_CALLBACK(gui_gtk_delete), nav); this->vbox = gtk_vbox_new(FALSE, 0); gtk_window_set_default_size(GTK_WINDOW(this->win), w, h); gtk_window_set_title(GTK_WINDOW(this->win), "Navit"); gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", "Navit"); gtk_widget_realize(this->win); gui_gtk_ui_init(this); if (this->menubar_enable) { widget=gtk_ui_manager_get_widget(this->ui_manager, "/ui/MenuBar"); GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); this->menubar=widget; } if (this->toolbar_enable) { widget=gtk_ui_manager_get_widget(this->ui_manager, "/ui/ToolBar"); GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); } if (this->statusbar_enable) { this->statusbar=gui_gtk_statusbar_new(this); } gtk_window_add_accel_group (GTK_WINDOW (this->win), gtk_ui_manager_get_accel_group(this->ui_manager)); gtk_container_add(GTK_CONTAINER(this->win), this->vbox); gtk_widget_show_all(this->win); navit_add_callback(nav, callback_new_attr_1(callback_cast(gui_gtk_init), attr_navit, this)); if ((attr=attr_search(attrs, NULL, attr_fullscreen))) fullscreen=attr->u.num; if (fullscreen) { GtkToggleAction *action; action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (this->base_group, "FullscreenAction")); gtk_toggle_action_set_active (action, fullscreen); } return this; } static int gtk_argc; static char **gtk_argv={NULL}; void plugin_init(void) { gtk_init(>k_argc, >k_argv); gtk_set_locale(); #ifdef HAVE_API_WIN32 setlocale(LC_NUMERIC,"C"); #endif plugin_register_gui_type("gtk", gui_gtk_new); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/000077500000000000000000000000001221777731700207215ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/CMakeLists.txt000066400000000000000000000003651221777731700234650ustar00rootroot00000000000000module_add_library(gui_internal gui_internal.c gui_internal_bookmark.c gui_internal_command.c gui_internal_gesture.c gui_internal_html.c gui_internal_menu.c gui_internal_poi.c gui_internal_search.c gui_internal_widget.c gui_internal_keyboard.c) navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/Makefile.am000066400000000000000000000015041221777731700227550ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ -DMODULE=gui_internal if PLUGINS modulegui_LTLIBRARIES = libgui_internal.la else noinst_LTLIBRARIES = libgui_internal.la endif libgui_internal_la_SOURCES = gui_internal_bookmark.c gui_internal.c gui_internal_command.c gui_internal_gesture.c gui_internal_html.c gui_internal_keyboard.c gui_internal_menu.c gui_internal_poi.c gui_internal_search.c gui_internal_widget.c gui_internal_bookmark.h gui_internal_command.h gui_internal_gesture.h gui_internal.h gui_internal_html.h gui_internal_keyboard.h gui_internal_menu.h gui_internal_poi.h gui_internal_priv.h gui_internal_search.h gui_internal_widget.h libgui_internal_la_LIBADD = libgui_internal_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal.c000066400000000000000000002755511221777731700235640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ //############################################################################################################## //# //# File: gui_internal.c //# Description: New "internal" GUI for use with any graphics library //# Comment: Trying to make a touchscreen friendly GUI //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //# //############################################################################################################## #include #include #include #include #include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "item.h" #include "xmlconfig.h" #include "file.h" #include "navit.h" #include "navit_nls.h" #include "gui.h" #include "coord.h" #include "point.h" #include "plugin.h" #include "graphics.h" #include "transform.h" #include "color.h" #include "map.h" #include "callback.h" #include "vehicle.h" #include "vehicleprofile.h" #include "window.h" #include "config_.h" #include "keys.h" #include "mapset.h" #include "route.h" #include "navit/search.h" #include "track.h" #include "country.h" #include "config.h" #include "event.h" #include "navit_nls.h" #include "navigation.h" #include "gui_internal.h" #include "command.h" #include "util.h" #include "bookmarks.h" #include "linguistics.h" #include "debug.h" #include "fib.h" #include "types.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_bookmark.h" #include "gui_internal_menu.h" #include "gui_internal_search.h" #include "gui_internal_gesture.h" #include "gui_internal_poi.h" #include "gui_internal_command.h" /** * Indexes into the config_profiles array. */ const int LARGE_PROFILE=0; const int MEDIUM_PROFILE=1; const int SMALL_PROFILE=2; /** * The default config profiles. * * [0] => LARGE_PROFILE (screens 640 in one dimension) * [1] => MEDIUM PROFILE (screens larger than 320 in one dimension * [2] => Small profile (default) */ static struct gui_config_settings config_profiles[]={ {545,32,48,96,10} , {300,32,48,64,3} ,{200,16,32,48,2} }; static void gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void *data); static int gui_internal_is_active_vehicle(struct gui_priv *this, struct vehicle *vehicle); /* * * Display image scaled to specific size * * searches for scaleable and pre-scaled image * * @param this Our gui context * * @param name image name * * @param w desired width of image * * @param h desired height of image * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found * */ static struct graphics_image * image_new_scaled(struct gui_priv *this, const char *name, int w, int h) { struct graphics_image *ret=NULL; char *full_path=NULL; full_path=graphics_icon_path(name); ret=graphics_image_new_scaled(this->gra, full_path, w, h); dbg(1,"Trying to load image '%s' (w=%d, h=%d): %s\n", name, w, h, ret ? "OK" : "NOT FOUND"); g_free(full_path); if (!ret) { dbg(0,"Failed to load image for '%s' (w=%d, h=%d)\n", name, w, h); full_path=graphics_icon_path("unknown"); ret=graphics_image_new_scaled(this->gra, full_path, w, h); g_free(full_path); } return ret; } #if 0 static struct graphics_image * image_new_o(struct gui_priv *this, char *name) { return image_new_scaled(this, name, -1, -1); } #endif /* * * Display image scaled to xs (extra small) size * * This image size can be too small to click it on some devices. * * @param this Our gui context * * @param name image name * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found * */ struct graphics_image * image_new_xs(struct gui_priv *this, const char *name) { return image_new_scaled(this, name, this->icon_xs, this->icon_xs); } /* * * Display image scaled to s (small) size * * @param this Our gui context * * @param name image name * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found * */ struct graphics_image * image_new_s(struct gui_priv *this, const char *name) { return image_new_scaled(this, name, this->icon_s, this->icon_s); } /* * * Display image scaled to l (large) size * * @param this Our gui context * * @param name image name * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found * */ struct graphics_image * image_new_l(struct gui_priv *this, const char *name) { return image_new_scaled(this, name, this->icon_l, this->icon_l); } static int gui_internal_button_attr_update(struct gui_priv *this, struct widget *w) { struct widget *wi; int is_on=0; struct attr curr; GList *l; if (w->get_attr(w->instance, w->on.type, &curr, NULL)) is_on=curr.u.data == w->on.u.data; else is_on=w->deflt; if (is_on != w->is_on) { if (w->redraw) this->redraw=1; w->is_on=is_on; l=g_list_first(w->children); if (l) { wi=l->data; if (wi->img) graphics_image_free(this->gra, wi->img); wi->img=image_new_xs(this, is_on ? "gui_active" : "gui_inactive"); } if (w->is_on && w->off.type == attr_none) w->state &= ~STATE_SENSITIVE; else w->state |= STATE_SENSITIVE; return 1; } return 0; } static void gui_internal_button_attr_callback(struct gui_priv *this, struct widget *w) { if (gui_internal_button_attr_update(this, w)) gui_internal_widget_render(this, w); } static void gui_internal_button_attr_pressed(struct gui_priv *this, struct widget *w, void *data) { if (w->is_on) w->set_attr(w->instance, &w->off); else w->set_attr(w->instance, &w->on); gui_internal_button_attr_update(this, w); } struct widget * gui_internal_button_navit_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct attr *on, struct attr *off) { struct graphics_image *image=NULL; struct widget *ret; if (!on && !off) return NULL; image=image_new_xs(this, "gui_inactive"); ret=gui_internal_button_new_with_callback(this, text, image, flags, gui_internal_button_attr_pressed, NULL); if (on) ret->on=*on; if (off) ret->off=*off; ret->get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr; ret->set_attr=(int (*)(void *, struct attr *))navit_set_attr; ret->remove_cb=(void (*)(void *, struct callback *))navit_remove_callback; ret->instance=this->nav; ret->cb=callback_new_attr_2(callback_cast(gui_internal_button_attr_callback), on?on->type:off->type, this, ret); navit_add_callback(this->nav, ret->cb); gui_internal_button_attr_update(this, ret); return ret; } struct widget * gui_internal_button_map_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct map *map, struct attr *on, struct attr *off, int deflt) { struct graphics_image *image=NULL; struct widget *ret; image=image_new_xs(this, "gui_inactive"); if (!on && !off) return NULL; ret=gui_internal_button_new_with_callback(this, text, image, flags, gui_internal_button_attr_pressed, NULL); if (on) ret->on=*on; if (off) ret->off=*off; ret->deflt=deflt; ret->get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr; ret->set_attr=(int (*)(void *, struct attr *))map_set_attr; ret->remove_cb=(void (*)(void *, struct callback *))map_remove_callback; ret->instance=map; ret->redraw=1; ret->cb=callback_new_attr_2(callback_cast(gui_internal_button_attr_callback), on?on->type:off->type, this, ret); map_add_callback(map, ret->cb); gui_internal_button_attr_update(this, ret); return ret; } /* * @brief Calculate movement vector and timing of the gesture. * @param in this gui context * @param in msec time in milliseconds to find gesture within * @param out p0 pointer to the point object, where gesture starting point coordinates should be placed. Can be NULL. * @param out dx pointer to variable to store horizontal movement of the gesture. * @param out dy pointer to variable to store vertical movement of the gesture. * @returns amount of time the actual movement took. */ static void gui_internal_motion_cb(struct gui_priv *this) { this->motion_timeout_event=NULL; gui_internal_gesture_ring_add(this, &(this->current)); /* Check for scrollable table below the highligted item if there's a movement with the button pressed */ if (this->pressed && this->highlighted) { struct widget *wt=NULL; struct widget *wr=NULL; int dx,dy; /* Guard against accidental scrolling when user is likely going to swipe */ gui_internal_gesture_get_vector(this, 1000, NULL, &dx, &dy); if(abs(dx)>abs(dy) || abs(dy)icon_s) return; if(this->highlighted) for(wr=this->highlighted;wr && wr->type!=widget_table_row;wr=wr->parent); if(wr) wt=wr->parent; if(wt && wt->type==widget_table && (wt->state & STATE_SCROLLABLE)) { struct table_data *td=wt->data; GList *top=NULL; GList *btm=NULL; GList *ttop, *tbtm; if(!wr || !wr->h) return; if(this->current.y < wr->p.y && wr!=td->top_row->data ) { int n=(wr->p.y-this->current.y)/wr->h+1; btm=td->bottom_row; top=td->top_row; while(n-->0 && (tbtm=gui_internal_widget_table_next_row(btm))!=NULL && (ttop=gui_internal_widget_table_next_row(top))!=NULL) { top=ttop; btm=tbtm; if(top->data==wr) break; } this->pressed=2; } else if (this->current.y > wr->p.y + wr->h ) { int y=wt->p.y+wt->h-wr->h; int n; if(td->scroll_buttons.button_box && td->scroll_buttons.button_box->p.y!=0) y=td->scroll_buttons.button_box->p.y - td->scroll_buttons.button_box->h; if(y>this->current.y) y=this->current.y; n=(y - wr->p.y )/wr->h; btm=td->bottom_row; top=td->top_row; while(n-->0 && (ttop=gui_internal_widget_table_prev_row(top))!=NULL && (tbtm=gui_internal_widget_table_prev_row(btm))!=NULL) { btm=tbtm; top=ttop; if(btm->data==wr) break; } this->pressed=2; } if( top && btm && (td->top_row!=top || td->bottom_row!=btm) ) { gui_internal_table_hide_rows(wt->data); td->top_row=top; td->bottom_row=btm; graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_widget_render(this,wt); graphics_draw_mode(this->gra, draw_mode_end); } return; } } /* Else, just move highlight after pointer if there's nothing to scroll */ gui_internal_highlight(this); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_call_highlighted(struct gui_priv *this) { if (! this->highlighted || ! this->highlighted->func) return; this->highlighted->reason=gui_internal_reason_click; this->highlighted->func(this, this->highlighted, this->highlighted->data); } void gui_internal_say(struct gui_priv *this, struct widget *w, int questionmark) { char *text=w->speech; if (! this->speech) return; if (!text) text=w->text; if (!text) text=w->name; if (text) { text=g_strdup_printf("%s%c", text, questionmark ? '?':'\0'); navit_say(this->nav, text); g_free(text); } } void gui_internal_back(struct gui_priv *this, struct widget *w, void *data) { gui_internal_prune_menu_count(this, 1, 1); } void gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_prune_menu(this, wm->data); } void gui_internal_cmd_main_menu(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=this->root.children->data; if (w && w->menu_data && w->menu_data->href && !strcmp(w->menu_data->href,"#Main Menu")) gui_internal_prune_menu(this, w); else gui_internal_html_main_menu(this); } struct widget * gui_internal_time_help(struct gui_priv *this) { struct widget *w,*wc,*wcn; char timestr[64]; struct tm *tm; time_t timep; w=gui_internal_box_new(this, gravity_right_center|orientation_horizontal|flags_fill); w->bl=this->spacing; w->spx=this->spacing; w->spx=10; w->bl=10; w->br=10; w->bt=6; w->bb=6; if (this->flags & 64) { wc=gui_internal_box_new(this, gravity_right_top|orientation_vertical|flags_fill); wc->bl=10; wc->br=20; wc->bt=6; wc->bb=6; timep=time(NULL); tm=localtime(&timep); strftime(timestr, 64, "%H:%M %d.%m.%Y", tm); wcn=gui_internal_label_new(this, timestr); gui_internal_widget_append(wc, wcn); gui_internal_widget_append(w, wc); } if (this->flags & 128) { wcn=gui_internal_button_new_with_callback(this, _("Help"), image_new_l(this, "gui_help"), gravity_center|orientation_vertical|flags_fill, NULL, NULL); gui_internal_widget_append(w, wcn); } return w; } /** * Applys the configuration values to this based on the settings * specified in the configuration file (this->config) and * the most approriate default profile based on screen resolution. * * This function should be run after this->root is setup and could * be rerun after the window is resized. * * @authors Steve Singer (09/2008) */ void gui_internal_apply_config(struct gui_priv *this) { struct gui_config_settings * current_config=0; dbg(1,"w=%d h=%d\n", this->root.w, this->root.h); /** * Select default values from profile based on the screen. */ if((this->root.w > 320 || this->root.h > 320) && this->root.w > 240 && this->root.h > 240) { if((this->root.w > 640 || this->root.h > 640) && this->root.w > 480 && this->root.h > 480 ) { current_config = &config_profiles[LARGE_PROFILE]; } else { current_config = &config_profiles[MEDIUM_PROFILE]; } } else { current_config = &config_profiles[SMALL_PROFILE]; } /** * Apply override values from config file */ if(this->config.font_size == -1 ) { this->font_size = current_config->font_size; } else { this->font_size = this->config.font_size; } if(this->config.icon_xs == -1 ) { this->icon_xs = current_config->icon_xs; } else { this->icon_xs = this->config.icon_xs; } if(this->config.icon_s == -1 ) { this->icon_s = current_config->icon_s; } else { this->icon_s = this->config.icon_s; } if(this->config.icon_l == -1 ) { this->icon_l = current_config->icon_l; } else { this->icon_l = this->config.icon_l; } if(this->config.spacing == -1 ) { this->spacing = current_config->spacing; } else { this->spacing = current_config->spacing; } if (!this->fonts[0]) { this->fonts[0]=graphics_font_new(this->gra,this->font_size,1); this->fonts[1]=graphics_font_new(this->gra,this->font_size*66/100,1); this->fonts[2]=graphics_font_new(this->gra,this->font_size*50/100,1); } } static void gui_internal_cmd_set_destination(struct gui_priv *this, struct widget *wm, void *data) { char *name=data; dbg(2,"c=%d:0x%x,0x%x\n", wm->c.pro, wm->c.x, wm->c.y); navit_set_destination(this->nav, &wm->c, name, 1); if (this->flags & 512) { struct attr follow; follow.type=attr_follow; follow.u.num=180; navit_set_attr(this->nav, &this->osd_configuration); navit_set_attr(this->nav, &follow); navit_zoom_to_route(this->nav, 0); } gui_internal_prune_menu(this, NULL); } static void gui_internal_cmd_insert_destination_do(struct gui_priv *this, struct widget *wm, void *data) { char *name=data; int dstcount=navit_get_destination_count(this->nav)+1; int pos,i; struct pcoord *dst=g_alloca(dstcount*sizeof(struct pcoord)); dstcount=navit_get_destinations(this->nav,dst,dstcount); pos=dstcount-wm->datai; if(pos<0) pos=0; for(i=dstcount;i>pos;i--) dst[i]=dst[i-1]; dst[pos]=wm->c; navit_add_destination_description(this->nav,&wm->c,(char*)data); navit_set_destinations(this->nav,dst,dstcount+1,name,1); gui_internal_prune_menu(this, NULL); } /* * @brief Display waypoint list to the user and let she choose one for the action specified as cmd parameter. * Widget passed as wm parameter of the called cmd function will have item set to user choosen waypoint item. Its datai will be set * to zero-based choosen waypoint number, counting from the route end. Coordinates to wm->c will be copied from wm_->c if wm_ is not null. Otherwise, * waypoint coordinates will be copied to wm->c. * @param in this gui context * @param title Menu title * @param hint Text to dispaly above the waypoint list describing the action to be performed, can be NULL * @param wm The called widget pointer. Can be NULL. * @param cmd Function to call on item selection * @param data data argument to be passed to the cmd function * @returns nothing */ void gui_internal_select_waypoint(struct gui_priv *this, const char *title, const char *hint, struct widget *wm_, void(*cmd)(struct gui_priv *priv, struct widget *widget, void *data),void *data) { struct widget *wb,*w,*wtable,*row,*wc; struct map *map; struct map_rect *mr; struct item *item; char *label,*text; int i; int dstcount=navit_get_destination_count(this->nav)+1; map=route_get_map(navit_get_route(this->nav)); if(!map) return; mr = map_rect_new(map, NULL); if(!mr) return; wb=gui_internal_menu(this, title); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); if(hint) gui_internal_widget_append(w, gui_internal_label_new(this, hint)); wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(w,wtable); i=0; while((item = map_rect_get_item(mr))!=NULL) { struct attr attr; if(item->type!=type_waypoint && item->type!=type_route_end) continue; if (item_attr_get(item, attr_label, &attr)) { label=map_convert_string(item->map, attr.u.str); text=g_strdup_printf(_("Waypoint %s"), label); map_convert_free(label); } else continue; gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_button_new_with_callback(this, text, image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, cmd, data)); wc->item=*item; if(wm_) wc->c=wm_->c; else { struct coord c; item_coord_get(item,&c,1); wc->c.x=c.x; wc->c.y=c.y; wc->c.pro=map_projection(item->map); } i++; wc->datai=dstcount-i; g_free(text); } map_rect_destroy(mr); gui_internal_menu_render(this); } static void gui_internal_cmd_insert_destination(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_select_waypoint(this, data, _("Select waypoint to insert the new one before"), wm, gui_internal_cmd_insert_destination_do, data); } static void gui_internal_cmd_set_position(struct gui_priv *this, struct widget *wm, void *data) { struct attr v; if(data) { v.type=attr_vehicle; v.u.vehicle=NULL; navit_set_attr(this->nav, &v); } navit_set_position(this->nav, &wm->c); gui_internal_prune_menu(this, NULL); } /** * @brief Generic notification function for Editable widgets to call Another widget notification function when Enter is pressed in editable field. * The Editable widget should have data member pointing to the Another widget. */ void gui_internal_call_linked_on_finish(struct gui_priv *this, struct widget *wm, void *data) { if (wm->reason==gui_internal_reason_keypress_finish && data) { struct widget *w=data; if(w->func) w->func(this, w, w->data); } } struct widget * gui_internal_keyboard(struct gui_priv *this, int mode); static void gui_internal_cmd_delete_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_delete_bookmark(mattr.u.bookmarks,wm->text); l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } /* * Get a utf-8 string, return the same prepared for case insensetive search. Result shoud be g_free()d after use. */ char * removecase(char *s) { char *r; r=linguistics_casefold(s); return r; } static void gui_internal_cmd_view_on_map(struct gui_priv *this, struct widget *wm, void *data) { if (wm->item.type != type_none) { enum item_type type; if (wm->item.type < type_line) type=type_selected_point; else if (wm->item.type < type_area) type=type_selected_point; else type=type_selected_area; graphics_clear_selection(this->gra, NULL); graphics_add_selection(this->gra, &wm->item, type, NULL); } navit_set_center(this->nav, &wm->c, 1); gui_internal_prune_menu(this, NULL); } static void gui_internal_cmd_view_attribute_details(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb; struct map_rect *mr; struct item *item; struct attr attr; char *text,*url; int i; text=g_strdup_printf("Attribute %s",wm->name); wb=gui_internal_menu(this, text); g_free(text); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); for (i = 0 ; i < wm->datai ; i++) { item_attr_get(item, attr_any, &attr); } if (item_attr_get(item, attr_any, &attr)) { url=NULL; switch (attr.type) { case attr_osm_nodeid: url=g_strdup_printf("http://www.openstreetmap.org/browse/node/"LONGLONG_FMT"\n",*attr.u.num64); break; case attr_osm_wayid: url=g_strdup_printf("http://www.openstreetmap.org/browse/way/"LONGLONG_FMT"\n",*attr.u.num64); break; case attr_osm_relationid: url=g_strdup_printf("http://www.openstreetmap.org/browse/relation/"LONGLONG_FMT"\n",*attr.u.num64); break; default: break; } if (url) { gui_internal_widget_append(w, wb=gui_internal_button_new_with_callback(this, _("View in Browser"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_in_browser, NULL)); wb->name=url; } } map_rect_destroy(mr); gui_internal_menu_render(this); } static void gui_internal_cmd_view_attributes(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb; struct map_rect *mr; struct item *item; struct attr attr; char *text; int count=0; dbg(2,"item=%p 0x%x 0x%x\n", wm->item.map,wm->item.id_hi, wm->item.id_lo); wb=gui_internal_menu(this, "Attributes"); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); dbg(2,"item=%p\n", item); if (item) { text=g_strdup_printf("%s:%s", _("Item type"), item_to_name(item->type)); gui_internal_widget_append(w, wb=gui_internal_button_new(this, text, NULL, gravity_left_center|orientation_horizontal|flags_fill)); wb->name=g_strdup(text); wb->item=wm->item; g_free(text); while(item_attr_get(item, attr_any, &attr)) { char *attrtxt; text=g_strdup_printf("%s:%s", attr_to_name(attr.type), attrtxt=attr_to_text(&attr, wm->item.map, 1)); g_free(attrtxt); gui_internal_widget_append(w, wb=gui_internal_button_new_with_callback(this, text, NULL, gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_attribute_details, NULL)); wb->name=g_strdup(text); wb->item=wm->item; wb->datai=count++; g_free(text); } text=g_strdup_printf("%s:0x%x,0x%x", "ID", item->id_hi, item->id_lo); gui_internal_widget_append(w, wb=gui_internal_button_new(this, text, NULL, gravity_left_center|orientation_horizontal|flags_fill)); wb->name=text; wb->item=wm->item; } map_rect_destroy(mr); gui_internal_menu_render(this); } static void gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void *data) { struct map_rect *mr; struct item *item; struct attr attr; char *cmd=NULL; if (!wm->name) { dbg(2,"item=%p 0x%x 0x%x\n", wm->item.map,wm->item.id_hi, wm->item.id_lo); mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); dbg(2,"item=%p\n", item); if (item) { while(item_attr_get(item, attr_url_local, &attr)) { if (! cmd) cmd=g_strdup_printf("navit-browser.sh '%s' &",attr.u.str); } } map_rect_destroy(mr); } else { cmd=g_strdup_printf("navit-browser.sh '%s' &",wm->name); } if (cmd) { #ifdef HAVE_SYSTEM system(cmd); #else dbg(0,"Error: External commands were disabled during compilation, cannot call '%s'.\n",cmd); #endif g_free(cmd); } } /* * @brief Event to transfer search results to a map. * * @param this The graphics context. * @param wm called widget. * @param data event data (pointer to the table widget containing results, or NULL if results map is only have to be cleaned). */ static void gui_internal_cmd_results_to_map(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w; struct mapset *ms; struct map *map; struct map_rect *mr; struct item *item; GList *l; struct coord_rect r; struct attr a; int count; ms=navit_get_mapset(this->nav); if(!ms) return; map=mapset_get_map_by_name(ms, "search_results"); if(!map) { struct attr *attrs[10], attrmap; enum attr_type types[]={attr_position_longitude,attr_position_latitude,attr_label,attr_none}; int i; attrs[0]=g_new0(struct attr,1); attrs[0]->type=attr_type; attrs[0]->u.str="csv"; attrs[1]=g_new0(struct attr,1); attrs[1]->type=attr_name; attrs[1]->u.str="search_results"; attrs[2]=g_new0(struct attr,1); attrs[2]->type=attr_charset; attrs[2]->u.str="utf-8"; attrs[3]=g_new0(struct attr,1); attrs[3]->type=attr_item_type; attrs[3]->u.num=type_found_item; attrs[4]=g_new0(struct attr,1); attrs[4]->type=attr_attr_types; attrs[4]->u.attr_types=types; attrs[5]=NULL; attrmap.type=attr_map; map=attrmap.u.map=map_new(NULL,attrs); if(map) mapset_add_attr(ms,&attrmap); for(i=0;attrs[i];i++) g_free(attrs[i]); } if(!map) return; mr = map_rect_new(map, NULL); if(!mr) return; /* Clean the map */ while((item = map_rect_get_item(mr))!=NULL) { item_type_set(item,type_none); } this->results_map_population=0; /* Find the table to pupulate the map */ for(w=data; w && w->type!=widget_table;w=w->parent); if(!w) { map_rect_destroy(mr); dbg(1,"Can't find the results table - only map clean up is done.\n"); return; } /* Populate the map with search results*/ for(l=w->children, count=0;l;l=g_list_next(l)) { struct widget *wr=l->data; if(wr->type==widget_table_row) { struct widget *wi=wr->children->data; struct item* it; if(wi->name==NULL) continue; dbg(2,"%s\n",wi->name); it=map_rect_create_item(mr,type_found_item); if(it) { struct coord c; struct attr a; c.x=wi->c.x; c.y=wi->c.y; item_coord_set(it, &c, 1, change_mode_modify); a.type=attr_label; a.u.str=wi->name; item_attr_set(it, &a, change_mode_modify); if(!count++) r.lu=r.rl=c; else coord_rect_extend(&r,&c); } } } map_rect_destroy(mr); if(!count) return; a.type=attr_orientation; a.u.num=0; navit_set_attr(this->nav,&a); navit_zoom_to_rect(this->nav,&r); gui_internal_prune_menu(this, NULL); this->results_map_population=count; } /* * @brief Event to remove search results from the a map. * * @param this The graphics context. * @param wm called widget. * @param data event data */ static void gui_internal_cmd_results_map_clean(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_cmd_results_to_map(this,wm,NULL); gui_internal_prune_menu(this, NULL); navit_draw(this->nav); } static void gui_internal_cmd_delete_waypoint(struct gui_priv *this, struct widget *wm, void *data) { int dstcount=navit_get_destination_count(this->nav); int i; struct map_rect *mr; struct item *item; struct pcoord *dst=g_alloca(dstcount*sizeof(struct pcoord)); dstcount=navit_get_destinations(this->nav,dst,dstcount); mr=map_rect_new(wm->item.map, NULL); i=0; while((item=map_rect_get_item(mr))!=NULL) { struct coord c; if(item->type!=type_waypoint && item->type!=type_route_end) continue; if(item_is_equal_id(*item,wm->item)) continue; item_coord_get_pro(item,&c,1,projection_mg); dst[i].x=c.x; dst[i].y=c.y; dst[i].pro=projection_mg; i++; } map_rect_destroy(mr); navit_set_destinations(this->nav,dst,i,NULL,1); gui_internal_prune_menu(this, NULL); } /* meaning of the bits in "flags": * 1: "Streets" * 2: "House numbers" * 4: "View in Browser", "View Attributes" * 8: "Set as dest." * 16: "Set as pos." * 32: "Add as bookm." * 64: "POIs" * 128: "View on Map" * 256: POIs around this point, "Drop search results from the map" * 512: "Cut/Copy... bookmark" * 1024: "Jump to attributes of top item within this->radius pixels of this point (implies flags|=256)" * 2048: "Show search results on the map" * TODO define constants for these values */ void gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, const char *name, int flags) { struct widget *wb,*w,*wtable,*row,*wc,*wbc,*wclosest=NULL; struct coord_geo g; struct pcoord pc; struct coord c; char *coord; if (pc_in) { pc=*pc_in; c.x=pc.x; c.y=pc.y; dbg(2,"x=0x%x y=0x%x\n", c.x, c.y); transform_to_geo(pc.pro, &c, &g); } else if (g_in) { struct attr attr; if (!navit_get_attr(this->nav, attr_projection, &attr, NULL)) return; g=*g_in; pc.pro=attr.u.projection; transform_from_geo(pc.pro, &g, &c); pc.x=c.x; pc.y=c.y; } else return; wb=gui_internal_menu(this, name); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); coord=gui_internal_coordinates(&pc, ' '); gui_internal_widget_append(w, gui_internal_label_new(this, coord)); g_free(coord); wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(w,wtable); if ((flags & 1) && wm) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_button_new_with_callback(this, _("Streets"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_search_street_in_town, wm)); wc->item=wm->item; wc->selection_id=wm->selection_id; } if ((flags & 2) && wm) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_button_new_with_callback(this, _("House numbers"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_search_house_number_in_street, wm)); wc->item=wm->item; wc->selection_id=wm->selection_id; } if ((flags & 4) && wm) { struct map_rect *mr; struct item *item; struct attr attr; mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); if (item) { if (item_attr_get(item, attr_description, &attr)) gui_internal_widget_append(w, gui_internal_label_new(this, attr.u.str)); if (item_attr_get(item, attr_url_local, &attr)) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wb=gui_internal_button_new_with_callback(this, _("View in Browser"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_in_browser, NULL)); wb->item=wm->item; } gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wb=gui_internal_button_new_with_callback(this, _("View Attributes"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_attributes, NULL)); wb->item=wm->item; } map_rect_destroy(mr); } if (flags & 8) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Set as destination"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_destination, g_strdup(name))); wbc->data_free=g_free_func; wbc->c=pc; if(navit_get_destination_count(this->nav)>=1) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Visit before..."), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_insert_destination, g_strdup(name))); wbc->data_free=g_free_func; wbc->c=pc; } } if (flags & 16) { const char *text; struct attr vehicle, source; int deactivate=0; if (navit_get_attr(this->nav, attr_vehicle, &vehicle, NULL) && vehicle.u.vehicle && !(vehicle_get_attr(vehicle.u.vehicle, attr_source, &source, NULL) && source.u.str && !strcmp("demo://",source.u.str))) deactivate=1; text=deactivate? _("Set as position (and deactivate vehicle)") : _("Set as position"); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, text, image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_position, (void*)(long)deactivate)); wbc->c=pc; } if (flags & 32) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Add as bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_add_bookmark2, g_strdup(name))); wbc->data_free=g_free_func; wbc->c=pc; } #ifndef _MSC_VER //POIs are not operational under MSVC yet if (flags & 64) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("POIs"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_pois, NULL)); wbc->c=pc; } #endif /* _MSC_VER */ #if 0 gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new(this, "Add to tour", image_new_o(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill)); #endif if (flags & 128) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("View on map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_on_map, NULL)); wbc->c=pc; if ((flags & 4) && wm) wbc->item=wm->item; else wbc->item.type=type_none; } if(flags & 256 && this->results_map_population) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Remove search results from the map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_results_map_clean, NULL)); wbc->data=wm; } if(flags & 2048) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Show results on the map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_results_to_map, NULL)); wbc->data=wm; } if ((flags & 256) || (flags & 1024)) { struct displaylist_handle *dlh; struct displaylist *display; struct attr attr; struct point p; struct transformation *trans; char *text, *label; struct map_selection *sel; GList *l, *ll; c.x=pc.x; c.y=pc.y; trans=navit_get_trans(this->nav); transform(trans,pc.pro,&c,&p,1,0,0,0); display=navit_get_displaylist(this->nav); dlh=graphics_displaylist_open(display); sel=displaylist_get_selection(display); l=displaylist_get_clicked_list(display, &p, this->radius); for(ll=l;ll;ll=g_list_next(ll)) { struct displayitem *di; struct item *item; struct map_rect *mr; struct item *itemo; di=(struct displayitem*)ll->data; item=graphics_displayitem_get_item(di); mr=map_rect_new(item->map, sel); itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if(!itemo) { map_rect_destroy(mr); continue; } if (item_attr_get(itemo, attr_label, &attr)) { label=map_convert_string(itemo->map, attr.u.str); text=g_strdup(label); map_convert_free(label); } else text=g_strdup(item_to_name(item->type)); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_cmd_pois_item(this, NULL, itemo, NULL, NULL, -1, text)); wc->c=pc; g_free(wc->name); wc->name=g_strdup(text); wc->item=*itemo; g_free(text); map_rect_destroy(mr); if(!wclosest) wclosest=wc; } g_list_free(l); map_selection_destroy(sel); graphics_displaylist_close(dlh); } if (flags & 512) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Cut Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_cut_bookmark, NULL)); wbc->text=g_strdup(wm->text); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Copy Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_copy_bookmark, NULL)); wbc->text=g_strdup(wm->text); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Rename Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_rename_bookmark, NULL)); wbc->text=g_strdup(wm->text); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Paste Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_paste_bookmark, NULL)); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Delete Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_delete_bookmark, NULL)); wbc->text=g_strdup(wm->text); } if (wm && (wm->item.type==type_waypoint || wm->item.type==type_route_end)) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Delete waypoint"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_delete_waypoint, NULL)); wbc->item=wm->item; } gui_internal_menu_render(this); if((flags & 1024) && wclosest) gui_internal_cmd_view_attributes(this,wclosest,wclosest->data); } /* wm->data: 0 Nothing special 1 Map Point 2 Item 3 Town 4 County 5 Street 6 House number 7 Bookmark 8 Former destination 9 Item from the POI list */ void gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) { int flags; if(!data) data=wm->data; switch ((long) data) { case 0: flags=8|16|32|64|128|256; break; case 1: flags=8|16|32|64|256; break; case 2: flags=4|8|16|32|64|128; break; case 3: flags=1|4|8|16|32|64|128|2048; flags &= this->flags_town; break; case 4: gui_internal_search_town_in_country(this, wm); return; case 5: flags=2|8|16|32|64|128|2048; flags &= this->flags_street; break; case 6: flags=8|16|32|64|128|2048; flags &= this->flags_house_number; break; case 7: flags=8|16|64|128|512; break; case 8: flags=8|16|32|64|128; break; case 9: flags=4|8|16|32|64|128|2048; break; default: return; } switch (flags) { case 2: gui_internal_search_house_number_in_street(this, wm, NULL); return; case 8: gui_internal_cmd_set_destination(this, wm, NULL); return; } gui_internal_cmd_position_do(this, &wm->c, NULL, wm, wm->name ? wm->name : wm->text, flags); } /** * The "Bookmarks" section of the OSD * */ void gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data) { struct attr attr,mattr; struct item *item; char *label_full,*prefix=0; int plen=0,hassub,found=0; struct widget *wb,*w,*wbm; struct coord c; struct widget *tbl, *row; if (data) prefix=g_strdup(data); else { if (wm && wm->prefix) prefix=g_strdup(wm->prefix); } if ( prefix ) plen=strlen(prefix); gui_internal_prune_menu_count(this, 1, 0); wb=gui_internal_menu(this, _("Bookmarks")); wb->background=this->background; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); //w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { if (!plen) { bookmarks_move_root(mattr.u.bookmarks); } else { if (!strcmp(prefix,"..")) { bookmarks_move_up(mattr.u.bookmarks); g_free(prefix); prefix=g_strdup(bookmarks_item_cwd(mattr.u.bookmarks)); if (prefix) { plen=strlen(prefix); } else { plen=0; } } else { bookmarks_move_down(mattr.u.bookmarks,prefix); } // "Back" button, when inside a bookmark folder if (plen) { wbm=gui_internal_button_new_with_callback(this, "..", image_new_xs(this, "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_bookmarks, NULL); wbm->prefix=g_strdup(".."); gui_internal_widget_append(w, wbm); // load bookmark folder as Waypoints, if any if (bookmarks_get_bookmark_count(mattr.u.bookmarks) > 0){ wbm=gui_internal_button_new_with_callback(this, _("Bookmarks as waypoints"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_load_bookmarks_as_waypoints, NULL); wbm->prefix=g_strdup(prefix); gui_internal_widget_append(w, wbm); } // save Waypoints in bookmark folder, if route exists if (navit_get_destination_count(this->nav) > 0){ if (bookmarks_get_bookmark_count(mattr.u.bookmarks)==0){ wbm=gui_internal_button_new_with_callback(this, _("Save waypoints"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_replace_bookmarks_from_waypoints, NULL); }else{ wbm=gui_internal_button_new_with_callback(this, _("Replace with waypoints"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_replace_bookmarks_from_waypoints, NULL); } wbm->prefix=g_strdup(prefix); gui_internal_widget_append(w, wbm); } // delete empty folder if (bookmarks_get_bookmark_count(mattr.u.bookmarks)==0){ gui_internal_widget_append(w, wbm=gui_internal_button_new_with_callback(this, _("Delete Folder"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_delete_bookmark_folder, NULL)); wbm->prefix=g_strdup(prefix); } } } // Adds the Bookmark folders wbm=gui_internal_button_new_with_callback(this, _("Add Bookmark folder"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_add_bookmark_folder2, NULL); gui_internal_widget_append(w, wbm); // Pastes the Bookmark wbm=gui_internal_button_new_with_callback(this, _("Paste bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_paste_bookmark, NULL); gui_internal_widget_append(w, wbm); bookmarks_item_rewind(mattr.u.bookmarks); tbl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(w,tbl); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { if (!item_attr_get(item, attr_label, &attr)) continue; label_full=attr.u.str; dbg(2,"full_labled: %s\n",label_full); // hassub == 1 if the item type is a sub-folder if (item->type == type_bookmark_folder) { hassub=1; } else { hassub=0; } row=gui_internal_widget_table_row_new(this,gravity_left| flags_fill| orientation_horizontal); gui_internal_widget_append(tbl, row); wbm=gui_internal_button_new_with_callback(this, label_full, image_new_xs(this, hassub ? "gui_inactive" : "gui_active" ), gravity_left_center|orientation_horizontal|flags_fill, hassub ? gui_internal_cmd_bookmarks : gui_internal_cmd_position, NULL); gui_internal_widget_append(row,wbm); if (item_coord_get(item, &c, 1)) { wbm->c.x=c.x; wbm->c.y=c.y; wbm->c.pro=bookmarks_get_projection(mattr.u.bookmarks); wbm->name=g_strdup_printf(_("Bookmark %s"),label_full); wbm->text=g_strdup(label_full); if (!hassub) { wbm->data=(void*)7;//Mark us as a bookmark } wbm->prefix=g_strdup(label_full); } else { gui_internal_widget_destroy(this, row); } } } g_free(prefix); if (found) gui_internal_check_exit(this); else gui_internal_menu_render(this); } static void gui_internal_keynav_highlight_next(struct gui_priv *this, int dx, int dy); void gui_internal_keypress_do(struct gui_priv *this, char *key) { struct widget *wi,*menu,*search_list; int len=0; char *text=NULL; menu=g_list_last(this->root.children)->data; wi=gui_internal_find_widget(menu, NULL, STATE_EDIT); if (wi) { /* select first item of the searchlist */ if (*key == NAVIT_KEY_RETURN) { search_list=gui_internal_menu_data(this)->search_list; if(search_list) { GList *l=gui_internal_widget_table_top_row(this, search_list); if (l && l->data) { struct widget *w=l->data; this->current.x=w->p.x+w->w/2; this->current.y=w->p.y+w->h/2; gui_internal_highlight(this); } } else { wi->reason=gui_internal_reason_keypress_finish; wi->func(this, wi, wi->data); } return; } else if (*key == NAVIT_KEY_BACKSPACE) { dbg(1,"backspace\n"); if (wi->text && wi->text[0]) { len=g_utf8_prev_char(wi->text+strlen(wi->text))-wi->text; wi->text[len]=' '; text=g_strdup_printf("%s ", wi->text); } } else { if (wi->state & STATE_CLEAR) { dbg(2,"wi->state=0x%x\n", wi->state); g_free(wi->text); wi->text=NULL; wi->state &= ~STATE_CLEAR; dbg(2,"wi->state=0x%x\n", wi->state); } text=g_strdup_printf("%s%s", wi->text ? wi->text : "", key); } g_free(wi->text); wi->text=text; if (*key == NAVIT_KEY_BACKSPACE && wi->text) { gui_internal_widget_render(this, wi); wi->text[len]='\0'; } if (wi->func) { wi->reason=gui_internal_reason_keypress; wi->func(this, wi, wi->data); } gui_internal_widget_render(this, wi); } } char * gui_internal_cmd_match_expand(char *pattern, struct attr **in) { char p,*ret=g_strdup(pattern),*r=ret,*a; int len; while ((p=*pattern++)) { switch (p) { case '*': *r='\0'; a=attr_to_text(*in++,NULL,0); len=strlen(ret)+strlen(a)+strlen(pattern)+1; r=g_malloc(len); strcpy(r, ret); strcat(r, a); g_free(ret); g_free(a); ret=r; r=ret+strlen(ret); break; case '\\': p=*pattern++; default: *r++=p; } } *r++='\0'; return ret; } static int gui_internal_match(const char *pattern, const char *string) { char p,s; while ((p=*pattern++)) { switch (p) { case '*': while ((s=*string)) { if (gui_internal_match(pattern,string)) return 1; string++; } break; case '\\': p=*pattern++; default: if (*string++ != p) return 0; } } return 1; } int gui_internal_set(char *remove, char *add) { char *gui_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal.txt", NULL); char *gui_file_new=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal_new.txt", NULL); FILE *fo=fopen(gui_file_new,"w"); FILE *fi=fopen(gui_file,"r"); char *line=NULL; int ret; size_t size=0; if (fi != NULL){ while (getline(&line,&size,fi) > 0) { int len=strlen(line); if (len > 0 && line[len-1] == '\n') line[len-1]='\0'; dbg(1,"line=%s\n",line); if (!gui_internal_match(remove, line)) fprintf(fo,"%s\n",line); } if (line) free(line); fclose(fi); } if (add) fprintf(fo,"%s;\n",add); fclose(fo); ret=(rename(gui_file_new, gui_file)==0); g_free(gui_file_new); g_free(gui_file); return ret; } static void gui_internal_window_closed(struct gui_priv *this) { gui_internal_cmd2_quit(this, NULL, NULL, NULL, NULL); } static void gui_internal_cmd_map_download_do(struct gui_priv *this, struct widget *wm, void *data) { char *text=g_strdup_printf(_("Download %s"),wm->name); struct widget *w, *wb; struct map *map=data; double bllon,bllat,trlon,trlat; wb=gui_internal_menu(this, text); g_free(text); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if (sscanf(wm->prefix,"%lf,%lf,%lf,%lf",&bllon,&bllat,&trlon,&trlat) == 4) { struct coord_geo g; struct map_selection sel; struct map_rect *mr; struct item *item; sel.next=NULL; sel.order=255; g.lng=bllon; g.lat=trlat; transform_from_geo(projection_mg, &g, &sel.u.c_rect.lu); g.lng=trlon; g.lat=bllat; transform_from_geo(projection_mg, &g, &sel.u.c_rect.rl); sel.range.min=type_none; sel.range.max=type_last; mr=map_rect_new(map, &sel); while ((item=map_rect_get_item(mr))) { dbg(2,"item\n"); } map_rect_destroy(mr); } dbg(2,"bbox=%s\n",wm->prefix); gui_internal_menu_render(this); } void gui_internal_cmd_map_download(struct gui_priv *this, struct widget *wm, void *data) { struct attr on, off, download_enabled, download_disabled; struct widget *w,*wb,*wma; struct map *map=data; FILE *f; char *search,buffer[256]; int found,sp_match=0; dbg(1,"wm=%p prefix=%s\n",wm,wm->prefix); search=wm->prefix; if (search) { found=0; while(search[sp_match] == ' ') sp_match++; sp_match++; } else { found=1; } on.type=off.type=attr_active; on.u.num=1; off.u.num=0; wb=gui_internal_menu(this, wm->name?wm->name:_("Map Download")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if (!search) { wma=gui_internal_button_map_attr_new(this, _("Active"), gravity_left_center|orientation_horizontal|flags_fill, map, &on, &off, 1); gui_internal_widget_append(w, wma); } download_enabled.type=download_disabled.type=attr_update; download_enabled.u.num=1; download_disabled.u.num=0; wma=gui_internal_button_map_attr_new(this , _("Download Enabled") , gravity_left_center|orientation_horizontal|flags_fill , map , &download_enabled , &download_disabled , 0); gui_internal_widget_append(w, wma); f=fopen("maps/areas.tsv","r"); while (f && fgets(buffer, sizeof(buffer), f)) { char *nl,*description,*description_size,*bbox,*size=NULL; int sp=0; if ((nl=strchr(buffer,'\n'))) *nl='\0'; if ((nl=strchr(buffer,'\r'))) *nl='\0'; while(buffer[sp] == ' ') sp++; if ((bbox=strchr(buffer,'\t'))) *bbox++='\0'; if (bbox && (size=strchr(bbox,'\t'))) *size++='\0'; if (search && !strcmp(buffer, search)) { wma=gui_internal_button_new_with_callback(this, _("Download completely"), NULL, gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download_do, map); wma->name=g_strdup(buffer+sp); wma->prefix=g_strdup(bbox); gui_internal_widget_append(w, wma); found=1; } else if (sp < sp_match) found=0; if (sp == sp_match && found && buffer[sp]) { description=g_strdup(buffer+sp); if (size) description_size=g_strdup_printf("%s (%s)",description,size); else description_size=g_strdup(description); wma=gui_internal_button_new_with_callback(this, description_size, NULL, gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download, map); g_free(description_size); wma->prefix=g_strdup(buffer); wma->name=description; gui_internal_widget_append(w, wma); } } gui_internal_menu_render(this); } static void gui_internal_cmd_set_active_vehicle(struct gui_priv *this, struct widget *wm, void *data) { struct attr vehicle = {attr_vehicle,{wm->data}}; navit_set_attr(this->nav, &vehicle); } static void gui_internal_cmd_show_satellite_status(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*row; struct attr attr,sat_attr; struct vehicle *v=wm->data; char *str; int i; enum attr_type types[]={attr_sat_prn, attr_sat_elevation, attr_sat_azimuth, attr_sat_snr}; wb=gui_internal_menu(this, _("Show Satellite Status")); gui_internal_menu_data(this)->redisplay=gui_internal_cmd_show_satellite_status; gui_internal_menu_data(this)->redisplay_widget=wm; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); w = gui_internal_widget_table_new(this,gravity_center | orientation_vertical | flags_expand | flags_fill, 0); row = gui_internal_widget_table_row_new(this,gravity_left_top); gui_internal_widget_append(row, gui_internal_label_new(this, " PRN ")); gui_internal_widget_append(row, gui_internal_label_new(this, _(" Elevation "))); gui_internal_widget_append(row, gui_internal_label_new(this, _(" Azimuth "))); gui_internal_widget_append(row, gui_internal_label_new(this, " SNR ")); gui_internal_widget_append(w,row); while (vehicle_get_attr(v, attr_position_sat_item, &attr, NULL)) { row = gui_internal_widget_table_row_new(this,gravity_left_top); for (i = 0 ; i < sizeof(types)/sizeof(enum attr_type) ; i++) { if (item_attr_get(attr.u.item, types[i], &sat_attr)) str=g_strdup_printf("%ld", sat_attr.u.num); else str=g_strdup(""); gui_internal_widget_append(row, gui_internal_label_new(this, str)); g_free(str); } gui_internal_widget_append(w,row); } gui_internal_widget_append(wb, w); gui_internal_menu_render(this); } static void gui_internal_cmd_show_nmea_data(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb; struct attr attr; struct vehicle *v=wm->data; wb=gui_internal_menu(this, _("Show NMEA Data")); gui_internal_menu_data(this)->redisplay=gui_internal_cmd_show_nmea_data; gui_internal_menu_data(this)->redisplay_widget=wm; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); if (vehicle_get_attr(v, attr_position_nmea, &attr, NULL)) gui_internal_widget_append(w, gui_internal_text_new(this, attr.u.str, gravity_left_center|orientation_vertical)); gui_internal_menu_render(this); } /** * A container to hold the selected vehicle and the desired profile in * one data item. */ struct vehicle_and_profilename { struct vehicle *vehicle; char *profilename; }; /** * Figures out whether the given vehicle is the active vehicle. * * @return true if the vehicle is active, false otherwise. */ static int gui_internal_is_active_vehicle(struct gui_priv *this, struct vehicle *vehicle) { struct attr active_vehicle; if (!navit_get_attr(this->nav, attr_vehicle, &active_vehicle, NULL)) active_vehicle.u.vehicle=NULL; return active_vehicle.u.vehicle == vehicle; } static void save_vehicle_xml(struct vehicle *v) { struct attr attr; struct attr_iter *iter=vehicle_attr_iter_new(); int childs=0; printf("\n"); printf("\n"); } else printf(" />\n"); vehicle_attr_iter_destroy(iter); } /** * Reacts to a button press that changes a vehicle's active profile. * * @see gui_internal_add_vehicle_profile */ static void gui_internal_cmd_set_active_profile(struct gui_priv *this, struct widget *wm, void *data) { struct vehicle_and_profilename *vapn = data; struct vehicle *v = vapn->vehicle; char *profilename = vapn->profilename; struct attr vehicle_name_attr; char *vehicle_name = NULL; struct attr profilename_attr; // Get the vehicle name vehicle_get_attr(v, attr_name, &vehicle_name_attr, NULL); vehicle_name = vehicle_name_attr.u.str; dbg(1, "Changing vehicle %s to profile %s\n", vehicle_name, profilename); // Change the profile name profilename_attr.type = attr_profilename; profilename_attr.u.str = profilename; if(!vehicle_set_attr(v, &profilename_attr)) { dbg(0, "Unable to set the vehicle's profile name\n"); } // Notify Navit that the routing should be re-done if this is the // active vehicle. if (gui_internal_is_active_vehicle(this, v)) { struct attr vehicle; vehicle.type=attr_vehicle; vehicle.u.vehicle=v; navit_set_attr(this->nav, &vehicle); } save_vehicle_xml(v); gui_internal_prune_menu_count(this, 1, 0); gui_internal_menu_vehicle_settings(this, v, vehicle_name); } /** * Adds the vehicle profile to the GUI, allowing the user to pick a * profile for the currently selected vehicle. */ static void gui_internal_add_vehicle_profile(struct gui_priv *this, struct widget *parent, struct vehicle *v, struct vehicleprofile *profile) { // Just here to show up in the translation file, nice and close to // where the translations are actually used. struct attr profile_attr; struct attr *attr = NULL; char *name = NULL; char *active_profile = NULL; char *label = NULL; int active; struct vehicle_and_profilename *context = NULL; #ifdef ONLY_FOR_TRANSLATION char *translations[] = {_n("car"), _n("bike"), _n("pedestrian")}; #endif // Figure out the profile name attr = attr_search(profile->attrs, NULL, attr_name); if (!attr) { dbg(0, "Adding vehicle profile failed. attr==NULL"); return; } name = attr->u.str; // Determine whether the profile is the active one if (vehicle_get_attr(v, attr_profilename, &profile_attr, NULL)) active_profile = profile_attr.u.str; active = active_profile != NULL && !strcmp(name, active_profile); dbg(1, "Adding vehicle profile %s, active=%s/%i\n", name, active_profile, active); // Build a translatable label. if(active) { label = g_strdup_printf(_("Current profile: %s"), _(name)); } else { label = g_strdup_printf(_("Change profile to: %s"), _(name)); } // Create the context object (the vehicle and the desired profile) context = g_new0(struct vehicle_and_profilename, 1); context->vehicle = v; context->profilename = name; // Add the button gui_internal_widget_append(parent, gui_internal_button_new_with_callback( this, label, image_new_xs(this, active ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_active_profile, context)); free(label); } void gui_internal_menu_vehicle_settings(struct gui_priv *this, struct vehicle *v, char *name) { struct widget *w,*wb,*row; struct attr attr; struct vehicleprofile *profile = NULL; GList *profiles; wb=gui_internal_menu(this, name); w=gui_internal_widget_table_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill,1); gui_internal_widget_append(wb, w); // Add the "Set as active" button if this isn't the active // vehicle. if (!gui_internal_is_active_vehicle(this, v)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new_with_callback(this, _("Set as active"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_active_vehicle, v)); } if (vehicle_get_attr(v, attr_position_sat_item, &attr, NULL)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new_with_callback(this, _("Show Satellite status"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_show_satellite_status, v)); } if (vehicle_get_attr(v, attr_position_nmea, &attr, NULL)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new_with_callback(this, _("Show NMEA data"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_show_nmea_data, v)); } // Add all the possible vehicle profiles to the menu profiles = navit_get_vehicleprofiles(this->nav); while(profiles) { profile = (struct vehicleprofile *)profiles->data; gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_add_vehicle_profile(this, row, v, profile); profiles = g_list_next(profiles); } callback_list_call_attr_2(this->cbl, attr_vehicle, w, v); gui_internal_menu_render(this); } void gui_internal_cmd_vehicle_settings(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_menu_vehicle_settings(this, wm->data, wm->text); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_motion(void *data, struct point *p) { struct gui_priv *this=data; if (!this->root.children) { navit_handle_motion(this->nav, p); return; } if (!this->pressed) return; this->current=*p; if(!this->motion_timeout_callback) this->motion_timeout_callback=callback_new_1(callback_cast(gui_internal_motion_cb), this); if(!this->motion_timeout_event) this->motion_timeout_event=event_add_timeout(30,0, this->motion_timeout_callback); } void gui_internal_evaluate(struct gui_priv *this, const char *command) { if (command) command_evaluate(&this->self, command); } void gui_internal_enter(struct gui_priv *this, int ignore) { struct graphics *gra=this->gra; if (ignore != -1) this->ignore_button=ignore; navit_block(this->nav, 1); graphics_overlay_disable(gra, 1); this->root.p.x=0; this->root.p.y=0; this->root.background=this->background; } void gui_internal_leave(struct gui_priv *this) { graphics_draw_mode(this->gra, draw_mode_end); } void gui_internal_set_click_coord(struct gui_priv *this, struct point *p) { struct coord c; struct coord_geo g; struct attr attr; struct transformation *trans; attr_free(this->click_coord_geo); this->click_coord_geo=NULL; if (p) { trans=navit_get_trans(this->nav); transform_reverse(trans, p, &c); dbg(1,"x=0x%x y=0x%x\n", c.x, c.y); this->clickp.pro=transform_get_projection(trans); this->clickp.x=c.x; this->clickp.y=c.y; transform_to_geo(this->clickp.pro, &c, &g); attr.u.coord_geo=&g; attr.type=attr_click_coord_geo; this->click_coord_geo=attr_dup(&attr); } } static void gui_internal_set_position_coord(struct gui_priv *this) { struct transformation *trans; struct attr attr,attrp; struct coord c; attr_free(this->position_coord_geo); this->position_coord_geo=NULL; if (navit_get_attr(this->nav, attr_vehicle, &attr, NULL) && attr.u.vehicle && vehicle_get_attr(attr.u.vehicle, attr_position_coord_geo, &attrp, NULL)) { trans=navit_get_trans(this->nav); this->position_coord_geo=attr_dup(&attrp); this->vehiclep.pro=transform_get_projection(trans); transform_from_geo(this->vehiclep.pro, attrp.u.coord_geo, &c); this->vehiclep.x=c.x; this->vehiclep.y=c.y; } } void gui_internal_enter_setup(struct gui_priv *this) { if (!this->mouse_button_clicked_on_map) gui_internal_set_position_coord(this); } void gui_internal_cmd_menu(struct gui_priv *this, int ignore, char *href) { dbg(1,"enter\n"); gui_internal_enter(this, ignore); gui_internal_enter_setup(this); // draw menu if (href) gui_internal_html_load_href(this, href, 0); else gui_internal_html_main_menu(this); } static void gui_internal_cmd_log_do(struct gui_priv *this, struct widget *widget) { if (widget->text && strlen(widget->text)) { if (this->position_coord_geo) navit_textfile_debug_log_at(this->nav, &this->vehiclep, "type=log_entry label=\"%s\"",widget->text); else navit_textfile_debug_log(this->nav, "type=log_entry label=\"%s\"",widget->text); } g_free(widget->text); widget->text=NULL; gui_internal_prune_menu(this, NULL); gui_internal_check_exit(this); } void gui_internal_cmd_log_clicked(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_cmd_log_do(this, widget->data); } void gui_internal_check_exit(struct gui_priv *this) { struct graphics *gra=this->gra; if (! this->root.children) { gui_internal_search_idle_end(this); gui_internal_search_list_destroy(this); graphics_overlay_disable(gra, 0); if (!navit_block(this->nav, 0)) { if (this->redraw) navit_draw(this->nav); else navit_draw_displaylist(this->nav); } } } static int gui_internal_get_attr(struct gui_priv *this, enum attr_type type, struct attr *attr) { switch (type) { case attr_active: attr->u.num=this->root.children != NULL; break; case attr_click_coord_geo: if (!this->click_coord_geo) return 0; *attr=*this->click_coord_geo; break; case attr_position_coord_geo: if (!this->position_coord_geo) return 0; *attr=*this->position_coord_geo; break; case attr_pitch: attr->u.num=this->pitch; break; case attr_button: attr->u.num=this->mouse_button_clicked_on_map; break; case attr_navit: attr->u.navit=this->nav; break; default: return 0; } attr->type=type; return 1; } static int gui_internal_add_attr(struct gui_priv *this, struct attr *attr) { switch (attr->type) { case attr_xml_text: g_free(this->html_text); this->html_text=g_strdup(attr->u.str); return 1; default: return 0; } } static int gui_internal_set_attr(struct gui_priv *this, struct attr *attr) { switch (attr->type) { case attr_fullscreen: if ((this->fullscreen > 0) != (attr->u.num > 0)) { graphics_draw_mode(this->gra, draw_mode_end); this->win->fullscreen(this->win, attr->u.num > 0); graphics_draw_mode(this->gra, draw_mode_begin); } this->fullscreen=attr->u.num; return 1; case attr_menu_on_map_click: this->menu_on_map_click=attr->u.num; return 1; case attr_on_map_click: g_free(this->on_map_click); this->on_map_click=g_strdup(attr->u.str); return 1; default: dbg(2,"%s\n",attr_to_name(attr->type)); return 1; } } static void gui_internal_dbus_signal(struct gui_priv *this, struct point *p) { struct displaylist_handle *dlh; struct displaylist *display; struct displayitem *di; struct attr cb,**attr_list=NULL; int valid=0; display=navit_get_displaylist(this->nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { struct item *item=graphics_displayitem_get_item(di); if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && graphics_displayitem_within_dist(display, di, p, this->radius)) { struct map_rect *mr=map_rect_new(item->map, NULL); struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); struct attr attr; if (itemo && item_attr_get(itemo, attr_data, &attr)) attr_list=attr_generic_add_attr(attr_list, &attr); map_rect_destroy(mr); } } graphics_displaylist_close(dlh); if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); attr_list_free(attr_list); } //############################################################################################################## //# Description: Convert one geo coordinate in human readable form to double value. //# Comment: //# Authors: Martin Bruns (05/2012), mdankov //############################################################################################################## static int gui_internal_coordinate_parse(char *s, char plus, char minus, double *x) { int sign=0; char *degree, *minute, *second; double tmp; if(!s) return 0; if (strchr(s, minus)!=NULL) sign=-1; else if (strchr(s, plus)!=NULL) sign=1; if(!sign) return 0; /* Can't just use strtok here because ° is multibyte sequence in utf8 */ degree=s; minute=strstr(s,"°"); if(minute) { *minute=0; minute+=strlen("°"); } sscanf(degree, "%lf", x); if(strchr(degree, plus) || strchr(degree, minus)) { dbg(3,"degree %c/%c found\n",plus,minus); } else {/* DEGREES_MINUTES */ if(!minute) return 0; minute = strtok(minute,"'"); sscanf(minute, "%lf", &tmp); *x+=tmp/60; if(strchr(minute, plus) || strchr(minute, minus)) { dbg(3,"minute %c/%c found\n",plus,minus); } else { /* DEGREES_MINUTES_SECONDS */ second=strtok(NULL,""); if(!second) return 0; sscanf(second, "%lf", &tmp); *x+=tmp/3600; } } *x *= sign; return 1; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Bruns (05/2012) //############################################################################################################## static void gui_internal_cmd_enter_coord_do(struct gui_priv *this, struct widget *widget) { char *lat, *lng; char *widgettext; double latitude, longitude; dbg(1,"text entered:%s\n", widget->text); /* possible entry can be identical to coord_format output but only space between lat and lng is allowed */ widgettext=g_ascii_strup(widget->text,-1); lat=strtok(widgettext," "); lng=strtok(NULL,""); if(!lat || !lng){ g_free(widgettext); return; } if( gui_internal_coordinate_parse(lat, 'N', 'S', &latitude) && gui_internal_coordinate_parse(lng, 'E', 'W', &longitude) ) { g_free(widgettext); widgettext=g_strdup_printf("%lf %lf", longitude, latitude); pcoord_parse(widgettext, projection_mg, &widget->c ); } else if(!pcoord_parse(widget->text, projection_mg, &widget->c )) { g_free(widgettext); return; } g_free(widgettext); gui_internal_cmd_position(this, widget, (void*)8); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Bruns (05/2012) //############################################################################################################## void gui_internal_cmd_enter_coord_clicked(struct gui_priv *this, struct widget *widget, void *data) { dbg(1,"entered\n"); gui_internal_cmd_enter_coord_do(this, widget->data); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Bruns (05/2012) //############################################################################################################## //############################################################################################################## //# Description: Function to handle mouse clicks and scroll wheel movement //# Comment: //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //############################################################################################################## static void gui_internal_button(void *data, int pressed, int button, struct point *p) { struct gui_priv *this=data; struct graphics *gra=this->gra; dbg(1,"enter %d %d\n", pressed, button); // if still on the map (not in the menu, yet): dbg(1,"children=%p ignore_button=%d\n",this->root.children,this->ignore_button); if (!this->root.children || this->ignore_button) { this->ignore_button=0; // check whether the position of the mouse changed during press/release OR if it is the scrollwheel if (!navit_handle_button(this->nav, pressed, button, p, NULL)) { dbg(1,"navit has handled button\n"); return; } dbg(1,"menu_on_map_click=%d\n",this->menu_on_map_click); if (button != 1) return; if (this->on_map_click || this->menu_on_map_click) { this->mouse_button_clicked_on_map=1; gui_internal_set_click_coord(this, p); gui_internal_set_position_coord(this); if (this->on_map_click) command_evaluate(&this->self, this->on_map_click); else gui_internal_cmd_menu(this, 0, NULL); this->mouse_button_clicked_on_map=0; } else if (this->signal_on_map_click) { gui_internal_dbus_signal(this, p); return; } return; } /* * If already in the menu: */ if (pressed) { this->pressed=1; this->current=*p; gui_internal_gesture_ring_clear(this); gui_internal_gesture_ring_add(this, p); gui_internal_highlight(this); } else { int dx,dy; gui_internal_gesture_ring_add(this, p); gui_internal_gesture_get_vector(this, 300, NULL, &dx, &dy); this->current.x=-1; this->current.y=-1; graphics_draw_mode(gra, draw_mode_begin); if(!gui_internal_gesture_do(this) && this->pressed!=2 && abs(dx)icon_s && abs(dy)icon_s) gui_internal_call_highlighted(this); this->pressed=0; if (!event_main_loop_has_quit()) { gui_internal_highlight(this); graphics_draw_mode(gra, draw_mode_end); gui_internal_check_exit(this); } } } static void gui_internal_setup(struct gui_priv *this) { struct color cbh={0x9fff,0x9fff,0x9fff,0xffff}; struct color cf={0xbfff,0xbfff,0xbfff,0xffff}; struct graphics *gra=this->gra; unsigned char *buffer; char *gui_file; int size; if (this->background) return; this->background=graphics_gc_new(gra); this->background2=graphics_gc_new(gra); this->highlight_background=graphics_gc_new(gra); graphics_gc_set_foreground(this->highlight_background, &cbh); this->foreground=graphics_gc_new(gra); graphics_gc_set_foreground(this->foreground, &cf); this->text_background=graphics_gc_new(gra); this->text_foreground=graphics_gc_new(gra); graphics_gc_set_foreground(this->background, &this->background_color); graphics_gc_set_foreground(this->background2, &this->background2_color); graphics_gc_set_foreground(this->text_background, &this->text_background_color); graphics_gc_set_foreground(this->text_foreground, &this->text_foreground_color); gui_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal.txt", NULL); if (file_get_contents(gui_file,&buffer,&size)) { char *command=g_malloc(size+1); strncpy(command,(const char *)buffer,size); command[size]=0; command_evaluate(&this->self, command); g_free(command); g_free(buffer); } g_free(gui_file); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_resize(void *data, int w, int h) { struct gui_priv *this=data; int changed=0; gui_internal_setup(this); if (this->root.w != w || this->root.h != h) { this->root.w=w; this->root.h=h; changed=1; } dbg(1,"w=%d h=%d children=%p\n", w, h, this->root.children); navit_handle_resize(this->nav, w, h); if (this->root.children) { if (changed) { gui_internal_html_main_menu(this); } else { gui_internal_menu_render(this); } } } static void gui_internal_keynav_point(struct widget *w, int dx, int dy, struct point *p) { p->x=w->p.x+w->w/2; p->y=w->p.y+w->h/2; if (dx < 0) p->x=w->p.x; if (dx > 0) p->x=w->p.x+w->w; if (dy < 0) p->y=w->p.y; if (dy > 0) p->y=w->p.y+w->h; } static void gui_internal_keynav_find_closest(struct widget *wi, struct point *p, int dx, int dy, int *distance, struct widget **result) { GList *l=wi->children; // Skip hidden elements if (wi->p.x==0 && wi->p.y==0 && wi->w==0 && wi->h==0) return; if ((wi->state & STATE_SENSITIVE) ) { int dist1,dist2; struct point wp; gui_internal_keynav_point(wi, -dx, -dy, &wp); if (dx) { dist1=(wp.x-p->x)*dx; dist2=wp.y-p->y; } else if (dy) { dist1=(wp.y-p->y)*dy; dist2=wp.x-p->x; } else { dist2=wp.x-p->x; dist1=wp.y-p->y; if (dist1 < 0) dist1=-dist1; } dbg(1,"checking %d,%d %d %d against %d,%d-%d,%d result %d,%d\n", p->x, p->y, dx, dy, wi->p.x, wi->p.y, wi->p.x+wi->w, wi->p.y+wi->h, dist1, dist2); if (dist1 >= 0) { if (dist2 < 0) dist1-=dist2; else dist1+=dist2; if (dist1 < *distance) { *result=wi; *distance=dist1; } } } while (l) { struct widget *child=l->data; gui_internal_keynav_find_closest(child, p, dx, dy, distance, result); l=g_list_next(l); } } static void gui_internal_keynav_highlight_next(struct gui_priv *this, int dx, int dy) { struct widget *result,*menu=g_list_last(this->root.children)->data; struct point p; int distance; if (this->highlighted && this->highlighted_menu == g_list_last(this->root.children)->data) gui_internal_keynav_point(this->highlighted, dx, dy, &p); else { p.x=0; p.y=0; distance=INT_MAX; result=NULL; gui_internal_keynav_find_closest(menu, &p, 0, 0, &distance, &result); if (result) { gui_internal_keynav_point(result, dx, dy, &p); dbg(1,"result origin=%p p=%d,%d\n", result, p.x, p.y); } } result=NULL; distance=INT_MAX; gui_internal_keynav_find_closest(menu, &p, dx, dy, &distance, &result); dbg(1,"result=%p\n", result); if (! result) { if (dx < 0) p.x=this->root.w; if (dx > 0) p.x=0; if (dy < 0) p.y=this->root.h; if (dy > 0) p.y=0; result=NULL; distance=INT_MAX; gui_internal_keynav_find_closest(menu, &p, dx, dy, &distance, &result); dbg(1,"wraparound result=%p\n", result); } gui_internal_highlight_do(this, result); if (result) gui_internal_say(this, result, 1); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_keypress(void *data, char *key) { struct gui_priv *this=data; int w,h; struct point p; if (!this->root.children) { transform_get_size(navit_get_trans(this->nav), &w, &h); switch (*key) { case NAVIT_KEY_UP: p.x=w/2; p.y=0; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_DOWN: p.x=w/2; p.y=h; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_LEFT: p.x=0; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_RIGHT: p.x=w; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_ZOOM_IN: navit_zoom_in(this->nav, 2, NULL); break; case NAVIT_KEY_ZOOM_OUT: navit_zoom_out(this->nav, 2, NULL); break; case NAVIT_KEY_RETURN: case NAVIT_KEY_MENU: gui_internal_set_click_coord(this, NULL); gui_internal_cmd_menu(this, 0, NULL); break; } return; } graphics_draw_mode(this->gra, draw_mode_begin); switch (*key) { case NAVIT_KEY_LEFT: gui_internal_keynav_highlight_next(this,-1,0); break; case NAVIT_KEY_RIGHT: gui_internal_keynav_highlight_next(this,1,0); break; case NAVIT_KEY_UP: gui_internal_keynav_highlight_next(this,0,-1); break; case NAVIT_KEY_DOWN: gui_internal_keynav_highlight_next(this,0,1); break; case NAVIT_KEY_BACK: if (g_list_length(this->root.children) > 1) gui_internal_back(this, NULL, NULL); else gui_internal_prune_menu(this, NULL); break; case NAVIT_KEY_RETURN: if (this->highlighted && this->highlighted_menu == g_list_last(this->root.children)->data) gui_internal_call_highlighted(this); else gui_internal_keypress_do(this, key); break; default: gui_internal_keypress_do(this, key); } if (!event_main_loop_has_quit()) { graphics_draw_mode(this->gra, draw_mode_end); gui_internal_check_exit(this); } } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static int gui_internal_set_graphics(struct gui_priv *this, struct graphics *gra) { struct window *win; struct transformation *trans=navit_get_trans(this->nav); win=graphics_get_data(gra, "window"); if (! win) return 1; navit_ignore_graphics_events(this->nav, 1); this->gra=gra; this->win=win; navit_ignore_graphics_events(this->nav, 1); transform_get_size(trans, &this->root.w, &this->root.h); this->resize_cb=callback_new_attr_1(callback_cast(gui_internal_resize), attr_resize, this); graphics_add_callback(gra, this->resize_cb); this->button_cb=callback_new_attr_1(callback_cast(gui_internal_button), attr_button, this); graphics_add_callback(gra, this->button_cb); this->motion_cb=callback_new_attr_1(callback_cast(gui_internal_motion), attr_motion, this); graphics_add_callback(gra, this->motion_cb); this->keypress_cb=callback_new_attr_1(callback_cast(gui_internal_keypress), attr_keypress, this); graphics_add_callback(gra, this->keypress_cb); this->window_closed_cb=callback_new_attr_1(callback_cast(gui_internal_window_closed), attr_window_closed, this); graphics_add_callback(gra, this->window_closed_cb); // set fullscreen if needed if (this->fullscreen) this->win->fullscreen(this->win, this->fullscreen != 0); /* Was resize callback already issued? */ if (navit_get_ready(this->nav) & 2) gui_internal_setup(this); return 0; } static void gui_internal_disable_suspend(struct gui_priv *this) { if (this->win->disable_suspend) this->win->disable_suspend(this->win); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct gui_methods gui_internal_methods = { NULL, NULL, gui_internal_set_graphics, NULL, NULL, NULL, gui_internal_disable_suspend, gui_internal_get_attr, gui_internal_add_attr, gui_internal_set_attr, }; static void gui_internal_add_callback(struct gui_priv *priv, struct callback *cb) { callback_list_add(priv->cbl, cb); } static void gui_internal_remove_callback(struct gui_priv *priv, struct callback *cb) { callback_list_remove(priv->cbl, cb); } static struct gui_internal_methods gui_internal_methods_ext = { gui_internal_add_callback, gui_internal_remove_callback, gui_internal_menu_render, image_new_xs, image_new_l, }; static enum flags gui_internal_get_flags(struct widget *widget) { return widget->flags; } static void gui_internal_set_flags(struct widget *widget, enum flags flags) { widget->flags=flags; } static int gui_internal_get_state(struct widget *widget) { return widget->state; } static void gui_internal_set_state(struct widget *widget, int state) { widget->state=state; } static void gui_internal_set_func(struct widget *widget, void (*func)(struct gui_priv *priv, struct widget *widget, void *data)) { widget->func=func; } static void gui_internal_set_data(struct widget *widget, void *data) { widget->data=data; } static void gui_internal_set_default_background(struct gui_priv *this, struct widget *widget) { widget->background=this->background; } static struct gui_internal_widget_methods gui_internal_widget_methods = { gui_internal_widget_append, gui_internal_button_new, gui_internal_button_new_with_callback, gui_internal_box_new, gui_internal_label_new, gui_internal_image_new, gui_internal_keyboard, gui_internal_menu, gui_internal_get_flags, gui_internal_set_flags, gui_internal_get_state, gui_internal_set_state, gui_internal_set_func, gui_internal_set_data, gui_internal_set_default_background, }; /** * @brief Displays Route information */ int line_intersection(struct coord* a1, struct coord *a2, struct coord * b1, struct coord *b2, struct coord *res) { int n, a, b; int adx=a2->x-a1->x; int ady=a2->y-a1->y; int bdx=b2->x-b1->x; int bdy=b2->y-b1->y; n = bdy * adx - bdx * ady; a = bdx * (a1->y - b1->y) - bdy * (a1->x - b1->x); b = adx * (a1->y - b1->y) - ady * (a1->x - b1->x); if (n < 0) { n = -n; a = -a; b = -b; } if (a < 0 || b < 0) return 0; if (a > n || b > n) return 0; if (n == 0) { dbg(2,"a=%d b=%d n=%d\n", a, b, n); dbg(2,"a1=0x%x,0x%x ad %d,%d\n", a1->x, a1->y, adx, ady); dbg(2,"b1=0x%x,0x%x bd %d,%d\n", b1->x, b1->y, bdx, bdy); dbg_assert(n != 0); } res->x = a1->x + a * adx / n; res->y = a1->y + a * ady / n; return 1; } struct heightline * item_get_heightline(struct item *item) { struct heightline *ret=NULL; struct street_data *sd; struct attr attr; int i,height; if (item_attr_get(item, attr_label, &attr)) { height=atoi(attr.u.str); sd=street_get_data(item); if (sd && sd->count > 1) { ret=g_malloc(sizeof(struct heightline)+sd->count*sizeof(struct coord)); ret->bbox.lu=sd->c[0]; ret->bbox.rl=sd->c[0]; ret->count=sd->count; ret->height=height; for (i = 0 ; i < sd->count ; i++) { ret->c[i]=sd->c[i]; coord_rect_extend(&ret->bbox, sd->c+i); } } street_data_free(sd); } return ret; } /** * @brief Displays Route Height Profile * * @li The name of the active vehicle * @param wm The button that was pressed. * @param v Unused */ /** * @brief Called when the route is updated. */ void gui_internal_route_update(struct gui_priv * this, struct navit * navit, struct vehicle *v) { if(this->route_data.route_showing) { gui_internal_populate_route_table(this,navit); graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } } /** * @brief Called when the route screen is closed (deallocated). * * The main purpose of this function is to remove the widgets from * references route_data because those widgets are about to be freed. */ void gui_internal_route_screen_free(struct gui_priv * this_,struct widget * w) { if(this_) { this_->route_data.route_showing=0; this_->route_data.route_table=NULL; g_free(w); } } /** * @brief Populates the route table with route information * * @param this The gui context * @param navit The navit object */ void gui_internal_populate_route_table(struct gui_priv * this, struct navit * navit) { struct map * map=NULL; struct map_rect * mr=NULL; struct navigation * nav = NULL; struct item * item =NULL; struct attr attr,route; struct widget * label = NULL; struct widget * row = NULL; struct coord c; nav = navit_get_navigation(navit); if(!nav) { return; } map = navigation_get_map(nav); if(map) mr = map_rect_new(map,NULL); if(mr) { GList *toprow; struct item topitem={0}; toprow=gui_internal_widget_table_top_row(this, this->route_data.route_table); if(toprow && toprow->data) topitem=((struct widget*)toprow->data)->item; gui_internal_widget_table_clear(this,this->route_data.route_table); if (navit_get_attr(navit, attr_route, &route, NULL)) { struct attr destination_length, destination_time; char *length=NULL,*time=NULL,*length_time; if (route_get_attr(route.u.route, attr_destination_length, &destination_length, NULL)) length=attr_to_text_ext(&destination_length, NULL, attr_format_with_units, attr_format_default, NULL); if (route_get_attr(route.u.route, attr_destination_time, &destination_time, NULL)) time=attr_to_text_ext(&destination_time, NULL, attr_format_with_units, attr_format_default, NULL); row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); gui_internal_widget_append(this->route_data.route_table,row); length_time=g_strdup_printf("%s %s",length,time); label = gui_internal_label_new(this,length_time); g_free(length_time); g_free(length); g_free(time); gui_internal_widget_append(row,label); } while((item = map_rect_get_item(mr))) { if(item_attr_get(item,attr_navigation_long,&attr)) { row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); gui_internal_widget_append(this->route_data.route_table,row); label = gui_internal_label_new(this,attr.u.str); gui_internal_widget_append(row,label); label->item=*item; row->item=*item; item_coord_get(item, &c, 1); label->c.x=c.x; label->c.y=c.y; label->c.pro=map_projection(map); label->func=gui_internal_cmd_position; label->state|=STATE_SENSITIVE; label->data=(void*)2; if(toprow && item->id_hi==topitem.id_hi && item->id_lo==topitem.id_lo && item->map==topitem.map) gui_internal_widget_table_set_top_row(this, this->route_data.route_table, row); } } map_rect_destroy(mr); } } /* * Command interface wrapper for commands which can be used both from gui html and to enter internal gui (for example, from osd or dbus). * Set first command argument to integer 1, if this command was called by mouse click from oustside of gui (default). Set it to 0 * if command is called by some other means (dbus signal, for example). If first argument is non integer, it's passed on * to actual handler. * */ //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) { struct color color_white={0xffff,0xffff,0xffff,0xffff}; struct color color_black={0x0,0x0,0x0,0xffff}; struct color back2_color={0x4141,0x4141,0x4141,0xffff}; struct gui_priv *this; struct attr *attr; *meth=gui_internal_methods; this=g_new0(struct gui_priv, 1); this->nav=nav; this->self.type=attr_gui; this->self.u.gui=gui; if ((attr=attr_search(attrs, NULL, attr_menu_on_map_click))) this->menu_on_map_click=attr->u.num; else this->menu_on_map_click=1; if ((attr=attr_search(attrs, NULL, attr_on_map_click))) this->on_map_click=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_signal_on_map_click))) this->signal_on_map_click=attr->u.num; gui_internal_command_init(this, attrs); if( (attr=attr_search(attrs,NULL,attr_font_size))) { this->config.font_size=attr->u.num; } else { this->config.font_size=-1; } if( (attr=attr_search(attrs,NULL,attr_icon_xs))) { this->config.icon_xs=attr->u.num; } else { this->config.icon_xs=-1; } if( (attr=attr_search(attrs,NULL,attr_icon_l))) { this->config.icon_l=attr->u.num; } else { this->config.icon_l=-1; } if( (attr=attr_search(attrs,NULL,attr_icon_s))) { this->config.icon_s=attr->u.num; } else { this->config.icon_s=-1; } if( (attr=attr_search(attrs,NULL,attr_spacing))) { this->config.spacing=attr->u.num; } else { this->config.spacing=-1; } if( (attr=attr_search(attrs,NULL,attr_gui_speech))) { this->speech=attr->u.num; } if( (attr=attr_search(attrs,NULL,attr_keyboard))) this->keyboard=attr->u.num; else this->keyboard=1; if( (attr=attr_search(attrs,NULL,attr_fullscreen))) this->fullscreen=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_flags))) this->flags=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_background_color))) this->background_color=*attr->u.color; else this->background_color=color_black; if( (attr=attr_search(attrs,NULL,attr_background_color2))) this->background2_color=*attr->u.color; else this->background2_color=back2_color; if( (attr=attr_search(attrs,NULL,attr_text_color))) this->text_foreground_color=*attr->u.color; else this->text_foreground_color=color_white; this->text_background_color=color_black; if( (attr=attr_search(attrs,NULL,attr_columns))) this->cols=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_osd_configuration))) this->osd_configuration=*attr; if( (attr=attr_search(attrs,NULL,attr_pitch))) this->pitch=attr->u.num; else this->pitch=20; if( (attr=attr_search(attrs,NULL,attr_flags_town))) this->flags_town=attr->u.num; else this->flags_town=-1; if( (attr=attr_search(attrs,NULL,attr_flags_street))) this->flags_street=attr->u.num; else this->flags_street=-1; if( (attr=attr_search(attrs,NULL,attr_flags_house_number))) this->flags_house_number=attr->u.num; else this->flags_house_number=-1; if( (attr=attr_search(attrs,NULL,attr_radius))) this->radius=attr->u.num; else this->radius=10; this->data.priv=this; this->data.gui=&gui_internal_methods_ext; this->data.widget=&gui_internal_widget_methods; this->cbl=callback_list_new(); return this; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## void plugin_init(void) { plugin_register_gui_type("internal", gui_internal_new); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal.h000066400000000000000000000057411221777731700235610ustar00rootroot00000000000000struct widget; // defined in gui_internal.c struct graphics_image; struct gui_priv; #define STATE_VISIBLE 1 #define STATE_SELECTED 2 #define STATE_HIGHLIGHTED 4 #define STATE_SENSITIVE 8 #define STATE_EDIT 16 #define STATE_CLEAR 32 #define STATE_EDITABLE 64 #define STATE_SCROLLABLE 128 #define STATE_OFFSCREEN 256 #define GESTURE_RINGSIZE 100 enum widget_type { widget_box=1, widget_button, widget_label, widget_image, widget_table, widget_table_row }; enum flags { gravity_none=0x00, gravity_left=1, gravity_xcenter=2, gravity_right=4, gravity_top=8, gravity_ycenter=16, gravity_bottom=32, gravity_left_top=gravity_left|gravity_top, gravity_top_center=gravity_xcenter|gravity_top, gravity_right_top=gravity_right|gravity_top, gravity_left_center=gravity_left|gravity_ycenter, gravity_center=gravity_xcenter|gravity_ycenter, gravity_right_center=gravity_right|gravity_ycenter, gravity_left_bottom=gravity_left|gravity_bottom, gravity_bottom_center=gravity_xcenter|gravity_bottom, gravity_right_bottom=gravity_right|gravity_bottom, flags_expand=0x100, flags_fill=0x200, flags_swap=0x400, flags_scrollx=0x800, flags_scrolly=0x1000, orientation_horizontal=0x10000, orientation_vertical=0x20000, orientation_horizontal_vertical=0x40000, }; struct gui_internal_methods { void (*add_callback)(struct gui_priv *priv, struct callback *cb); void (*remove_callback)(struct gui_priv *priv, struct callback *cb); void (*menu_render)(struct gui_priv *this); struct graphics_image * (*image_new_xs)(struct gui_priv *this, const char *name); struct graphics_image * (*image_new_l)(struct gui_priv *this, const char *name); }; struct gui_internal_widget_methods { void (*append)(struct widget *parent, struct widget *child); struct widget * (*button_new)(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags); struct widget * (*button_new_with_callback)(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); struct widget * (*box_new)(struct gui_priv *this, enum flags flags); struct widget * (*label_new)(struct gui_priv *this, const char *text); struct widget * (*image_new)(struct gui_priv *this, struct graphics_image *image); struct widget * (*keyboard)(struct gui_priv *this, int mode); struct widget * (*menu)(struct gui_priv *this, const char *label); enum flags (*get_flags)(struct widget *widget); void (*set_flags)(struct widget *widget, enum flags flags); int (*get_state)(struct widget *widget); void (*set_state)(struct widget *widget, int state); void (*set_func)(struct widget *widget, void (*func)(struct gui_priv *priv, struct widget *widget, void *data)); void (*set_data)(struct widget *widget, void *data); void (*set_default_background)(struct gui_priv *this, struct widget *widget); }; struct gui_internal_data { struct gui_priv *priv; struct gui_internal_methods *gui; struct gui_internal_widget_methods *widget; }; navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_bookmark.c000066400000000000000000000235221221777731700254360ustar00rootroot00000000000000#include #include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "bookmarks.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_bookmark.h" static void gui_internal_cmd_add_bookmark_do(struct gui_priv *this, struct widget *widget) { GList *l; struct attr attr; dbg(1,"text='%s'\n", widget->text); if (widget->text && strlen(widget->text)){ navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, &widget->c, widget->text); } g_free(widget->text); widget->text=NULL; l=g_list_previous(g_list_last(this->root.children)); gui_internal_prune_menu(this, l->data); } static void gui_internal_cmd_add_bookmark_folder_do(struct gui_priv *this, struct widget *widget) { GList *l; struct attr attr; dbg(1,"text='%s'\n", widget->text); if (widget->text && strlen(widget->text)){ navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, NULL, widget->text); } g_free(widget->text); widget->text=NULL; l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } static void gui_internal_cmd_add_bookmark_clicked(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_cmd_add_bookmark_do(this, widget->data); } static void gui_internal_cmd_add_bookmark_folder_clicked(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_cmd_add_bookmark_folder_do(this, widget->data); } static void gui_internal_cmd_rename_bookmark_clicked(struct gui_priv *this, struct widget *widget,void *data) { struct widget *w=(struct widget*)widget->data; GList *l; struct attr attr; dbg(1,"text='%s'\n", w->text); if (w->text && strlen(w->text)){ navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_rename_bookmark(attr.u.bookmarks, w->name, w->text); } g_free(w->text); g_free(w->name); w->text=NULL; w->name=NULL; l=g_list_previous(g_list_previous(g_list_previous(g_list_last(this->root.children)))); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*wk,*wl,*we,*wnext; char *name=data; wb=gui_internal_menu(this,_("Add Bookmark")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; wk->c=wm->c; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_add_bookmark_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,2+gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); } void gui_internal_cmd_add_bookmark_folder2(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*wk,*wl,*we,*wnext; char *name=data; wb=gui_internal_menu(this,_("Add Bookmark folder")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; wk->c=wm->c; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_add_bookmark_folder_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,2+gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); } void gui_internal_cmd_rename_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*wk,*wl,*we,*wnext; char *name=wm->text; wb=gui_internal_menu(this,_("Rename")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; wk->c=wm->c; wk->name=g_strdup(name); gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_rename_bookmark_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,2+gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); } void gui_internal_cmd_cut_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_cut_bookmark(mattr.u.bookmarks,wm->text); l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_copy_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_copy_bookmark(mattr.u.bookmarks,wm->text); l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_paste_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_paste_bookmark(mattr.u.bookmarks); l=g_list_previous(g_list_last(this->root.children)); if(l) gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_delete_bookmark_folder(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_up(mattr.u.bookmarks); bookmarks_delete_bookmark(mattr.u.bookmarks,wm->prefix); l=g_list_first(this->root.children); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_load_bookmarks_as_waypoints(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { struct attr attr; struct item *item; struct coord c; struct pcoord *pc; enum projection pro=bookmarks_get_projection(mattr.u.bookmarks); int i, bm_count; navit_set_destination(this->nav, NULL, NULL, 0); bm_count=bookmarks_get_bookmark_count(mattr.u.bookmarks); pc=g_alloca(bm_count*sizeof(struct pcoord)); bookmarks_item_rewind(mattr.u.bookmarks); i=0; while ((item=bookmarks_get_item(mattr.u.bookmarks))) { if (!item_attr_get(item, attr_label, &attr)) continue; if (item->type == type_bookmark) { if (item_coord_get(item, &c, 1)) { pc[i].x=c.x; pc[i].y=c.y; pc[i].pro=pro; navit_add_destination_description(this->nav,&pc[i],attr.u.str); i++; } } } bm_count=i; if (bm_count>0){ navit_set_destinations(this->nav, pc, bm_count, wm->prefix, 1); if (this->flags & 512) { struct attr follow; follow.type=attr_follow; follow.u.num=180; navit_set_attr(this->nav, &this->osd_configuration); navit_set_attr(this->nav, &follow); navit_zoom_to_route(this->nav, 0); } } } gui_internal_prune_menu(this, NULL); } void gui_internal_cmd_replace_bookmarks_from_waypoints(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { struct attr attr; char *desc=NULL; struct pcoord *pc; int i, bm_count; if (bookmarks_get_bookmark_count(mattr.u.bookmarks)>0){ struct item *item; bookmarks_item_rewind(mattr.u.bookmarks); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { if (!item_attr_get(item, attr_label, &attr)) continue; if (item->type == type_bookmark) bookmarks_delete_bookmark(mattr.u.bookmarks, attr.u.str); bookmarks_move_down(mattr.u.bookmarks,wm->prefix); } } bookmarks_item_rewind(mattr.u.bookmarks); bm_count=navit_get_destination_count(this->nav); pc=g_alloca(bm_count*sizeof(struct pcoord)); navit_get_destinations(this->nav, pc, bm_count); for (i=0; inav, i); desc=g_strdup_printf("%s WP%d", tmp, i+1); g_free(tmp); navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, &pc[i], desc); bookmarks_move_down(mattr.u.bookmarks,wm->prefix); g_free(desc); } } gui_internal_prune_menu(this, NULL); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_bookmark.h000066400000000000000000000016571221777731700254500ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct widget; void gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_add_bookmark_folder2(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_rename_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_cut_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_copy_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_paste_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_delete_bookmark_folder(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_load_bookmarks_as_waypoints(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_replace_bookmarks_from_waypoints(struct gui_priv *this, struct widget *wm, void *data); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_command.c000066400000000000000000001134451221777731700252530ustar00rootroot00000000000000#include #include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "command.h" #include "attr.h" #include "xmlconfig.h" #include "event.h" #include "config_.h" #include "map.h" #include "mapset.h" #include "transform.h" #include "search.h" #include "route.h" #include "vehicle.h" #include "vehicleprofile.h" #include "layout.h" #include "util.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_search.h" #include "gui_internal_poi.h" #include "gui_internal_command.h" extern char *version; static char * coordinates_geo(const struct coord_geo *gc, char sep) { char latc='N',lngc='E'; int lat_deg,lat_min,lat_sec; int lng_deg,lng_min,lng_sec; struct coord_geo g=*gc; if (g.lat < 0) { g.lat=-g.lat; latc='S'; } if (g.lng < 0) { g.lng=-g.lng; lngc='W'; } lat_sec=fmod(g.lat*3600+0.5,60); lat_min=fmod(g.lat*60-lat_sec/60.0+0.5,60); lat_deg=g.lat-lat_min/60.0-lat_sec/3600.0+0.5; lng_sec=fmod(g.lng*3600+0.5,60); lng_min=fmod(g.lng*60-lng_sec/60.0+0.5,60); lng_deg=g.lng-lng_min/60.0-lng_sec/3600.0+0.5;; return g_strdup_printf("%d°%d'%d\" %c%c%d°%d'%d\" %c",lat_deg,lat_min,lat_sec,latc,sep,lng_deg,lng_min,lng_sec,lngc); } char * gui_internal_coordinates(struct pcoord *pc, char sep) { struct coord_geo g; struct coord c; c.x=pc->x; c.y=pc->y; transform_to_geo(pc->pro, &c, &g); return coordinates_geo(&g, sep); } enum escape_mode { escape_mode_none=0, escape_mode_string=1, escape_mode_quote=2, escape_mode_html=4, escape_mode_html_quote=8, escape_mode_html_apos=16, }; /* todo &=&, < = < */ static char * gui_internal_escape(enum escape_mode mode, char *in) { int len=mode & escape_mode_string ? 3:1; char *dst,*out,*src=in; char *quot="""; char *apos="'"; while (*src) { if ((*src == '"' || *src == '\\') && (mode & (escape_mode_string | escape_mode_quote))) len++; if (*src == '"' && mode == escape_mode_html_quote) len+=strlen(quot); else if (*src == '\'' && mode == escape_mode_html_apos) len+=strlen(apos); else len++; src++; } src=in; out=dst=g_malloc(len); if (mode & escape_mode_string) *dst++='"'; while (*src) { if ((*src == '"' || *src == '\\') && (mode & (escape_mode_string | escape_mode_quote))) *dst++='\\'; if (*src == '"' && mode == escape_mode_html_quote) { strcpy(dst,quot); src++; dst+=strlen(quot); } else if (*src == '\'' && mode == escape_mode_html_apos) { strcpy(dst,apos); src++; dst+=strlen(apos); } else *dst++=*src++; } if (mode & escape_mode_string) *dst++='"'; *dst++='\0'; return out; } static void gui_internal_cmd_escape(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr escaped; if (!in || !in[0]) { dbg(0,"first parameter missing or wrong type\n"); return; } if (!out) { dbg(0,"output missing\n"); return; } if (ATTR_IS_STRING(in[0]->type)) { escaped.type=in[0]->type; escaped.u.str=gui_internal_escape(escape_mode_string,in[0]->u.str); } else if (ATTR_IS_INT(in[0]->type)) { escaped.type=attr_type_string_begin; escaped.u.str=g_strdup_printf("%ld",in[0]->u.num); } else { dbg(0,"first parameter wrong type\n"); return; } dbg(1,"in %s result %s\n",in[0]->u.str,escaped.u.str); *out=attr_generic_add_attr(*out, attr_dup(&escaped)); g_free(escaped.u.str); } static void gui_internal_cmd2_about(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *menu,*wb,*w; char *text; graphics_draw_mode(this->gra, draw_mode_begin); menu=gui_internal_menu(this, _("About Navit")); menu->spx=this->spacing*10; wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand); gui_internal_widget_append(menu, wb); //Icon gui_internal_widget_append(wb, w=gui_internal_image_new(this, image_new_xs(this, "navit"))); w->flags=gravity_top_center|orientation_horizontal|flags_fill; //app name text=g_strdup_printf("%s",PACKAGE_NAME); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_top_center|orientation_horizontal|flags_expand; g_free(text); //Version text=g_strdup_printf("%s",version); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_top_center|orientation_horizontal|flags_expand; g_free(text); //Site text=g_strdup_printf("http://www.navit-project.org/"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_top_center|orientation_horizontal|flags_expand; g_free(text); //Authors text=g_strdup_printf("%s:",_("By")); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Martin Schaller"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Michael Farmbauer"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Alexander Atanasov"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Pierre Grandin"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); //Contributors text=g_strdup_printf("%s",_("And all the Navit Team")); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("%s",_("members and contributors.")); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } static void gui_internal_cmd2_waypoints(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { gui_internal_select_waypoint(this, _("Waypoints"), NULL, NULL, gui_internal_cmd_position, (void*)2); } static void gui_internal_cmd_enter_coord(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *w, *wb, *wk, *wr, *we, *wnext, *row; wb=gui_internal_menu(this, _("Enter Coordinates")); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wr); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, we); /* w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we);*/ gui_internal_widget_append(we, wk=gui_internal_label_new(this, _("Longitude Latitude"))); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_enter_coord_clicked; wnext->data=wk; wk->data=wnext; row=gui_internal_text_new(this, _("Enter coordinates, for example:"), gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); row=gui_internal_text_new(this, "52.5219N 19.4127E", gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); row=gui_internal_text_new(this, "52°31.3167N 19°24.7667E", gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); row=gui_internal_text_new(this, "52°31'19N 19°24'46E", gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,56)); gui_internal_menu_render(this); } static void gui_internal_cmd2_town(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (this->sl) search_list_select(this->sl, attr_country_all, 0, 0); gui_internal_search(this,_("Town"),"Town",1); } static void gui_internal_cmd2_setting_vehicle(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr,attr2,vattr; struct widget *w,*wb,*wl; struct attr_iter *iter; struct attr active_vehicle; iter=navit_attr_iter_new(); if (navit_get_attr(this->nav, attr_vehicle, &attr, iter) && !navit_get_attr(this->nav, attr_vehicle, &attr2, iter)) { vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); navit_attr_iter_destroy(iter); gui_internal_menu_vehicle_settings(this, attr.u.vehicle, vattr.u.str); return; } navit_attr_iter_destroy(iter); wb=gui_internal_menu(this, _("Vehicle")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if (!navit_get_attr(this->nav, attr_vehicle, &active_vehicle, NULL)) active_vehicle.u.vehicle=NULL; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_vehicle, &attr, iter)) { vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); wl=gui_internal_button_new_with_callback(this, vattr.u.str, image_new_xs(this, attr.u.vehicle == active_vehicle.u.vehicle ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_vehicle_settings, attr.u.vehicle); wl->text=g_strdup(vattr.u.str); gui_internal_widget_append(w, wl); } navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } static void gui_internal_cmd2_setting_rules(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *wb,*w; struct attr on,off; wb=gui_internal_menu(this, _("Rules")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); on.u.num=1; off.u.num=0; on.type=off.type=attr_tracking; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Lock on road"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); on.u.num=0; off.u.num=-1; on.type=off.type=attr_orientation; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Northing"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); on.u.num=1; off.u.num=0; on.type=off.type=attr_follow_cursor; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Map follows Vehicle"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); on.u.num=1; off.u.num=0; on.type=off.type=attr_waypoints_flag; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Plan with Waypoints"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); gui_internal_menu_render(this); } static void gui_internal_cmd2_setting_maps(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr, on, off, description, type, data, url, active; struct widget *w,*wb,*row,*wma; char *label; struct attr_iter *iter; wb=gui_internal_menu(this, _("Maps")); //w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); //w->spy=this->spacing*3; w = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(wb, w); iter=navit_attr_iter_new(); on.type=off.type=attr_active; on.u.num=1; off.u.num=0; while(navit_get_attr(this->nav, attr_map, &attr, iter)) { if (map_get_attr(attr.u.map, attr_description, &description, NULL)) { label=g_strdup(description.u.str); } else { if (!map_get_attr(attr.u.map, attr_type, &type, NULL)) type.u.str=""; if (!map_get_attr(attr.u.map, attr_data, &data, NULL)) data.u.str=""; label=g_strdup_printf("%s:%s", type.u.str, data.u.str); } if (map_get_attr(attr.u.map, attr_url, &url, NULL)) { if (!map_get_attr(attr.u.map, attr_active, &active, NULL)) active.u.num=1; wma=gui_internal_button_new_with_callback(this, label, image_new_xs(this, active.u.num ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download, attr.u.map); } else { wma=gui_internal_button_map_attr_new(this, label, gravity_left_center|orientation_horizontal|flags_fill, attr.u.map, &on, &off, 1); } gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wma); g_free(label); } navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } static void gui_internal_cmd2_setting_layout(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; struct widget *w,*wb,*wl,*row; struct attr_iter *iter; wb=gui_internal_menu(this, _("Layout")); w=gui_internal_widget_table_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill,1); gui_internal_widget_append(wb, w); iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_layout, &attr, iter)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); wl=gui_internal_button_navit_attr_new(this, attr.u.layout->name, gravity_left_center|orientation_horizontal|flags_fill, &attr, NULL); gui_internal_widget_append(row, wl); } navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } static void gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget * menu, *box; struct map * map=NULL; struct map_rect * mr=NULL; struct route * route; struct item * item =NULL; struct mapset *ms; struct mapset_handle *msh; int x,i,first=1,dist=0; struct coord c,last,res; struct coord_rect rbbox,dbbox; struct map_selection sel; struct heightline *heightline,*heightlines=NULL; struct diagram_point *min,*diagram_point,*diagram_points=NULL; sel.next=NULL; sel.order=18; sel.range.min=type_height_line_1; sel.range.max=type_height_line_3; menu=gui_internal_menu(this,_("Height Profile")); box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); gui_internal_widget_append(menu, box); route = navit_get_route(this->nav); if (route) map = route_get_map(route); if(map) mr = map_rect_new(map,NULL); if(mr) { while((item = map_rect_get_item(mr))) { while (item_coord_get(item, &c, 1)) { if (first) { first=0; sel.u.c_rect.lu=c; sel.u.c_rect.rl=c; } else coord_rect_extend(&sel.u.c_rect, &c); } } map_rect_destroy(mr); ms=navit_get_mapset(this->nav); if (!first && ms) { msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { mr=map_rect_new(map, &sel); if (mr) { while((item = map_rect_get_item(mr))) { if (item->type >= sel.range.min && item->type <= sel.range.max) { heightline=item_get_heightline(item); if (heightline) { heightline->next=heightlines; heightlines=heightline; } } } map_rect_destroy(mr); } } mapset_close(msh); } } map=NULL; mr=NULL; if (route) map = route_get_map(route); if(map) mr = map_rect_new(map,NULL); if(mr && heightlines) { while((item = map_rect_get_item(mr))) { first=1; while (item_coord_get(item, &c, 1)) { if (first) first=0; else { heightline=heightlines; rbbox.lu=last; rbbox.rl=last; coord_rect_extend(&rbbox, &c); while (heightline) { if (coord_rect_overlap(&rbbox, &heightline->bbox)) { for (i = 0 ; i < heightline->count - 1; i++) { if (heightline->c[i].x != heightline->c[i+1].x || heightline->c[i].y != heightline->c[i+1].y) { if (line_intersection(heightline->c+i, heightline->c+i+1, &last, &c, &res)) { diagram_point=g_new(struct diagram_point, 1); diagram_point->c.x=dist+transform_distance(projection_mg, &last, &res); diagram_point->c.y=heightline->height; diagram_point->next=diagram_points; diagram_points=diagram_point; dbg(2,"%d %d\n", diagram_point->c.x, diagram_point->c.y); } } } } heightline=heightline->next; } dist+=transform_distance(projection_mg, &last, &c); } last=c; } } } if(mr) map_rect_destroy(mr); gui_internal_menu_render(this); if(!diagram_points) return; first=1; diagram_point=diagram_points; while (diagram_point) { if (first) { dbbox.lu=diagram_point->c; dbbox.rl=diagram_point->c; first=0; } else coord_rect_extend(&dbbox, &diagram_point->c); diagram_point=diagram_point->next; } dbg(2,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); if (dbbox.rl.x > dbbox.lu.x && dbbox.lu.x*100/(dbbox.rl.x-dbbox.lu.x) <= 25) dbbox.lu.x=0; if (dbbox.lu.y > dbbox.rl.y && dbbox.rl.y*100/(dbbox.lu.y-dbbox.rl.y) <= 25) dbbox.rl.y=0; dbg(2,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); x=dbbox.lu.x; first=1; for (;;) { struct point p[2]; min=NULL; diagram_point=diagram_points; while (diagram_point) { if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) min=diagram_point; diagram_point=diagram_point->next; } if (! min) break; p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; p[1].y=(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y+5; dbg(2,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); graphics_draw_circle(this->gra, this->foreground, &p[1], 2); if (first) first=0; else graphics_draw_lines(this->gra, this->foreground, p, 2); p[0]=p[1]; x=min->c.x+1; } } static void gui_internal_cmd2_route_description(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget * menu; struct widget * box; if(! this->vehicle_cb) { /** * Register the callback on vehicle updates. */ this->vehicle_cb = callback_new_attr_1(callback_cast(gui_internal_route_update), attr_position_coord_geo,this); navit_add_callback(this->nav,this->vehicle_cb); } this->route_data.route_table = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); menu=gui_internal_menu(this,_("Route Description")); menu->wfree=gui_internal_route_screen_free; this->route_data.route_showing=1; this->route_data.route_table->spx = this->spacing; box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); gui_internal_widget_append(box,this->route_data.route_table); box->w=menu->w; box->spx = this->spacing; this->route_data.route_table->w=box->w; gui_internal_widget_append(menu,box); gui_internal_populate_route_table(this,this->nav); gui_internal_menu_render(this); } static void gui_internal_cmd2_pois(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *w; struct poi_param *param; struct attr pro; struct coord c; dbg(1,"enter\n"); if (!in || !in[0]) return; if (!ATTR_IS_COORD_GEO(in[0]->type)) return; if (!navit_get_attr(this->nav, attr_projection, &pro, NULL)) return; w=g_new0(struct widget,1); param=g_new0(struct poi_param,1); if (in[1] && ATTR_IS_STRING(in[1]->type)) { gui_internal_poi_param_set_filter(param, in[1]->u.str); if (in[2] && ATTR_IS_INT(in[2]->type)) param->isAddressFilter=in[2]->u.num; } transform_from_geo(pro.u.projection,in[0]->u.coord_geo,&c); w->c.x=c.x; w->c.y=c.y; w->c.pro=pro.u.projection; gui_internal_cmd_pois(this, w, param); g_free(w); gui_internal_poi_param_free(param); } static void gui_internal_cmd2_locale(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *menu,*wb,*w; char *text; graphics_draw_mode(this->gra, draw_mode_begin); menu=gui_internal_menu(this, _("Show Locale")); menu->spx=this->spacing*10; wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(menu, wb); text=g_strdup_printf("LANG=%1$s (1=%3$s 2=%2$s)",getenv("LANG"),"2","1"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_left_center|orientation_horizontal|flags_fill; g_free(text); #ifdef HAVE_API_WIN32_BASE { char country[32],lang[32]; #ifdef HAVE_API_WIN32_CE wchar_t wcountry[32],wlang[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, wlang, sizeof(wlang)); WideCharToMultiByte(CP_ACP,0,wlang,-1,lang,sizeof(lang),NULL,NULL); #else GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, lang, sizeof(lang)); #endif text=g_strdup_printf("LOCALE_SABBREVLANGNAME=%s",lang); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_left_center|orientation_horizontal|flags_fill; g_free(text); #ifdef HAVE_API_WIN32_CE GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, wcountry, sizeof(wcountry)); WideCharToMultiByte(CP_ACP,0,wcountry,-1,country,sizeof(country),NULL,NULL); #else GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, country, sizeof(country)); #endif text=g_strdup_printf("LOCALE_SABBREVCTRYNAME=%s",country); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_left_center|orientation_horizontal|flags_fill; g_free(text); } #endif gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } static void gui_internal_cmd_formerdests(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *wb,*w,*wbm,*tbl=NULL; struct map *formerdests; struct map_rect *mr_formerdests; struct item *item; struct attr attr; char *label_full; enum projection projection; if(!navit_get_attr(this->nav, attr_former_destination_map, &attr, NULL)) return; formerdests=attr.u.map; if(!formerdests) return; mr_formerdests=map_rect_new(formerdests, NULL); if(!mr_formerdests) return; projection = map_projection(formerdests); gui_internal_prune_menu_count(this, 1, 0); wb=gui_internal_menu(this, _("Former Destinations")); wb->background=this->background; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*2; gui_internal_widget_append(wb, w); while ((item=map_rect_get_item(mr_formerdests))) { struct coord c; struct widget *row; if (item->type!=type_former_destination) continue; if (!item_attr_get(item, attr_label, &attr)) continue; if(!tbl) { tbl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand | orientation_vertical,1); gui_internal_widget_append(w,tbl); } row=gui_internal_widget_table_row_new(this,gravity_left| flags_fill| orientation_vertical); gui_internal_widget_prepend(tbl, row); label_full=attr.u.str; wbm=gui_internal_button_new_with_callback(this, label_full, image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_position, NULL); gui_internal_widget_append(row,wbm); if (item_coord_get(item, &c, 1)) { wbm->c.x=c.x; wbm->c.y=c.y; wbm->c.pro=projection; wbm->name=g_strdup(label_full); wbm->text=g_strdup(label_full); wbm->data=(void*)8; //Mark us as a former destination wbm->prefix=g_strdup(label_full); } } if (!tbl){ wbm=gui_internal_text_new(this, _("- No former destinations available -"), gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, wbm); } gui_internal_menu_render(this); map_rect_destroy(mr_formerdests); } static void gui_internal_cmd2_bookmarks(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=NULL; if (in && in[0] && ATTR_IS_STRING(in[0]->type)) { str=in[0]->u.str; } gui_internal_cmd_bookmarks(this, NULL, str); } static void gui_internal_cmd2_abort_navigation(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { navit_set_destination(this->nav, NULL, NULL, 0); } static void gui_internal_cmd2_back(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_back(this, NULL, NULL); graphics_draw_mode(this->gra, draw_mode_end); gui_internal_check_exit(this); } static void gui_internal_cmd2_back_to_map(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { gui_internal_prune_menu(this, NULL); } static void gui_internal_get_data(struct gui_priv *priv, char *command, struct attr **in, struct attr ***out) { struct attr private_data = { attr_private_data, {(void *)&priv->data}}; if (out) *out=attr_generic_add_attr(*out, &private_data); } static void gui_internal_cmd_log(struct gui_priv *this) { struct widget *w,*wb,*wk,*wl,*we,*wnext; gui_internal_enter(this, 1); gui_internal_set_click_coord(this, NULL); gui_internal_enter_setup(this); wb=gui_internal_menu(this, "Log Message"); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, _("Message"))); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_log_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,2+gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); gui_internal_leave(this); } static void gui_internal_cmd_menu2(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *href=NULL; int i=0, ignore=0, replace=0; if (in && in[i] && ATTR_IS_INT(in[i]->type)) ignore=in[i++]->u.num; if (in && in[i] && ATTR_IS_STRING(in[i]->type)) { href=in[i++]->u.str; if (in[i] && ATTR_IS_INT(in[i]->type)) replace=in[i++]->u.num; } if (this->root.children) { if (!href) return; gui_internal_html_load_href(this, href, replace); return; } gui_internal_cmd_menu(this, ignore, href); } static void gui_internal_cmd2_position(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { const char *name=_("Position"); int flags=-1; dbg(1,"enter\n"); if (!in || !in[0]) return; if (!ATTR_IS_COORD_GEO(in[0]->type)) return; if (in[1] && ATTR_IS_STRING(in[1]->type)) { name=in[1]->u.str; if (in[2] && ATTR_IS_INT(in[2]->type)) flags=in[2]->u.num; } dbg(1,"flags=0x%x\n",flags); gui_internal_cmd_position_do(this, NULL, in[0]->u.coord_geo, NULL, name, flags); } static void gui_internal_cmd_redraw_map(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { this->redraw=1; } static void gui_internal_cmd2_refresh(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *href=g_strdup(this->href); gui_internal_html_load_href(this, href, 1); g_free(href); } static void gui_internal_cmd2_set(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *pattern,*command=NULL; if (!in || !in[0] || !ATTR_IS_STRING(in[0]->type)) { dbg(0,"first parameter missing or wrong type\n"); return; } pattern=in[0]->u.str; dbg(1,"pattern %s\n",pattern); if (in[1]) { command=gui_internal_cmd_match_expand(pattern, in+1); dbg(1,"expand %s\n",command); gui_internal_set(pattern, command); command_evaluate(&this->self, command); g_free(command); } else { gui_internal_set(pattern, NULL); } } void gui_internal_cmd2_quit(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr navit; gui_internal_prune_menu(this, NULL); navit.type=attr_navit; navit.u.navit=this->nav; config_remove_attr(config, &navit); event_main_loop_quit(); } static char * gui_internal_append_attr(char *str, enum escape_mode mode, char *pre, struct attr *attr, char *post) { char *astr=NULL; if (ATTR_IS_STRING(attr->type)) astr=gui_internal_escape(mode, attr->u.str); else if (ATTR_IS_COORD_GEO(attr->type)) { char *str2=coordinates_geo(attr->u.coord_geo, '\n'); astr=gui_internal_escape(mode, str2); g_free(str2); } else if (ATTR_IS_INT(attr->type)) astr=g_strdup_printf("%ld",attr->u.num); else astr=g_strdup_printf("Unsupported type %s",attr_to_name(attr->type)); str=g_strconcat_printf(str,"%s%s%s",pre,astr,post); g_free(astr); return str; } static void gui_internal_cmd_write(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=NULL; dbg(1,"enter %s %p %p %p\n",function,in,out,valid); if (!in) return; while (*in) { str=gui_internal_append_attr(str, escape_mode_none, "", *in, ""); in++; } if (str) { str=g_strdup_printf("%s\n",str); #if 0 dbg(0,"%s\n",str); #endif gui_internal_html_parse_text(this, str); } g_free(str); } static void gui_internal_onclick(struct attr ***in, char **onclick, char *set) { struct attr **i=*in; char *c,*str=NULL,*args=NULL,*sep=""; if (!*i || !ATTR_IS_STRING((*i)->type) || !(*i)->u.str) goto error; str=g_strdup((*i)->u.str); i++; c=str; while (*c) { if (c[0] == '%' && c[1] == '{') { char format[4],*end=strchr(c+2,'}'),*replacement=NULL,*new_str; int is_arg; if (!end) { dbg(0,"Missing closing brace in format string %s\n",c); goto error; } if (end-c > sizeof(format)) { dbg(0,"Invalid format string %s\n",c); goto error; } strncpy(format, c+2, end-c-2); format[end-c-2]='\0'; is_arg=end[1] == '*'; c[0]='\0'; if (!strcmp(format,"d")) { replacement=gui_internal_append_attr(NULL, escape_mode_string, "", *i++, ""); if (is_arg) { args=g_strconcat_printf(args, "%s%s", args ? "," : "", replacement); g_free(replacement); replacement=g_strdup(""); } } if (!strcmp(format,"se")) { replacement=gui_internal_append_attr(NULL, escape_mode_string, "", *i++, ""); if (is_arg) { char *arg=gui_internal_escape(escape_mode_string, replacement); args=g_strconcat_printf(args, "%s%s", args ? "," : "", arg); g_free(replacement); g_free(arg); replacement=g_strdup(""); } } if (!replacement) { dbg(0,"Unsupported format string %s\n",format); goto error; } new_str=g_strconcat(str, replacement, end+1, NULL); c=new_str+strlen(str)+strlen(replacement); g_free(str); g_free(replacement); str=new_str; } c++; } *in=i; if (*onclick && strlen(*onclick)) sep=";"; if (str && strlen(str)) { char *old=*onclick; if (set) { char *setstr=gui_internal_escape(escape_mode_string,str); char *argssep=""; if (args && strlen(args)) argssep=","; *onclick=g_strconcat(old,sep,set,"(",setstr,argssep,args,")",NULL); } else { *onclick=g_strconcat(old,sep,str,NULL); } g_free(old); } error: g_free(str); g_free(args); return; } static void gui_internal_cmd_img(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=g_strdup("type)) { if ((*in)->u.str && strlen((*in)->u.str)) str=gui_internal_append_attr(str, escape_mode_string|escape_mode_html, " class=", *in, ""); in++; } else { dbg(0,"argument error: class argument not string\n"); goto error; } if (ATTR_IS_STRING((*in)->type) && (*in)->u.str) { if ((*in)->u.str && strlen((*in)->u.str)) { str=gui_internal_append_attr(str, escape_mode_string|escape_mode_html, " src=", *in, ""); } in++; } else { dbg(0,"argument error: image argument not string\n"); goto error; } if (ATTR_IS_STRING((*in)->type) && (*in)->u.str) { if ((*in)->u.str && strlen((*in)->u.str)) { suffix=gui_internal_append_attr(NULL, escape_mode_html, ">", *in, ""); } else { suffix=g_strdup("/>"); } in++; } else { dbg(0,"argument error: text argument not string\n"); goto error; } gui_internal_onclick(&in,&onclick,NULL); gui_internal_onclick(&in,&onclick,"set"); gui_internal_onclick(&in,&onclick,NULL); if (strlen(onclick)) { char *tmp=gui_internal_escape(escape_mode_html_apos, onclick); str=g_strconcat_printf(str," onclick='%s'",tmp); g_free(tmp); } g_free(onclick); html=g_strdup_printf("%s%s\n",str,suffix); dbg(1,"return %s",html); gui_internal_html_parse_text(this, html); g_free(html); error: g_free(suffix); g_free(str); return; } static void gui_internal_cmd_debug(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str; dbg(0,"begin\n"); if (in) { while (*in) { str=attr_to_text(*in, NULL, 0); dbg(0,"%s:%s\n",attr_to_name((*in)->type),str); in++; g_free(str); } } dbg(0,"done\n"); } static void gui_internal_cmd2(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { int entering=0; int ignore=1; if (in && in[0] && ATTR_IS_INT(in[0]->type)) { ignore=in[0]->u.num; in++; } if(!this->root.children) { entering=1; gui_internal_apply_config(this); gui_internal_enter(this, ignore); gui_internal_enter_setup(this); } if(!strcmp(function, "bookmarks")) gui_internal_cmd2_bookmarks(this, function, in, out, valid); else if(!strcmp(function, "formerdests")) gui_internal_cmd_formerdests(this, function, in, out, valid); else if(!strcmp(function, "locale")) gui_internal_cmd2_locale(this, function, in, out, valid); else if(!strcmp(function, "position")) gui_internal_cmd2_position(this, function, in, out, valid); else if(!strcmp(function, "pois")) gui_internal_cmd2_pois(this, function, in, out, valid); else if(!strcmp(function, "route_description")) gui_internal_cmd2_route_description(this, function, in, out, valid); else if(!strcmp(function, "route_height_profile")) gui_internal_cmd2_route_height_profile(this, function, in, out, valid); else if(!strcmp(function, "setting_layout")) gui_internal_cmd2_setting_layout(this, function, in, out, valid); else if(!strcmp(function, "setting_maps")) gui_internal_cmd2_setting_maps(this, function, in, out, valid); else if(!strcmp(function, "setting_rules")) gui_internal_cmd2_setting_rules(this, function, in, out, valid); else if(!strcmp(function, "setting_vehicle")) gui_internal_cmd2_setting_vehicle(this, function, in, out, valid); else if(!strcmp(function, "town")) gui_internal_cmd2_town(this, function, in, out, valid); else if(!strcmp(function, "enter_coord")) gui_internal_cmd_enter_coord(this, function, in, out, valid); else if(!strcmp(function, "waypoints")) gui_internal_cmd2_waypoints(this, function, in, out, valid); else if(!strcmp(function, "about")) gui_internal_cmd2_about(this, function, in, out, valid); if(entering) graphics_draw_mode(this->gra, draw_mode_end); } static struct command_table commands[] = { {"E",command_cast(gui_internal_cmd_escape)}, {"abort_navigation",command_cast(gui_internal_cmd2_abort_navigation)}, {"back",command_cast(gui_internal_cmd2_back)}, {"back_to_map",command_cast(gui_internal_cmd2_back_to_map)}, {"bookmarks",command_cast(gui_internal_cmd2)}, {"debug",command_cast(gui_internal_cmd_debug)}, {"formerdests",command_cast(gui_internal_cmd2)}, {"get_data",command_cast(gui_internal_get_data)}, {"img",command_cast(gui_internal_cmd_img)}, {"locale",command_cast(gui_internal_cmd2)}, {"log",command_cast(gui_internal_cmd_log)}, {"menu",command_cast(gui_internal_cmd_menu2)}, {"position",command_cast(gui_internal_cmd2_position)}, {"pois",command_cast(gui_internal_cmd2)}, {"redraw_map",command_cast(gui_internal_cmd_redraw_map)}, {"refresh",command_cast(gui_internal_cmd2_refresh)}, {"route_description",command_cast(gui_internal_cmd2)}, {"route_height_profile",command_cast(gui_internal_cmd2)}, {"set",command_cast(gui_internal_cmd2_set)}, {"setting_layout",command_cast(gui_internal_cmd2)}, {"setting_maps",command_cast(gui_internal_cmd2)}, {"setting_rules",command_cast(gui_internal_cmd2)}, {"setting_vehicle",command_cast(gui_internal_cmd2)}, {"town",command_cast(gui_internal_cmd2)}, {"enter_coord",command_cast(gui_internal_cmd2)}, {"quit",command_cast(gui_internal_cmd2_quit)}, {"waypoints",command_cast(gui_internal_cmd2)}, {"write",command_cast(gui_internal_cmd_write)}, {"about",command_cast(gui_internal_cmd2)}, }; void gui_internal_command_init(struct gui_priv *this, struct attr **attrs) { struct attr *attr; if ((attr=attr_search(attrs, NULL, attr_callback_list))) { command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this); } } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_command.h000066400000000000000000000005251221777731700252520ustar00rootroot00000000000000/* prototypes */ struct attr; struct gui_priv; struct pcoord; char *gui_internal_coordinates(struct pcoord *pc, char sep); void gui_internal_cmd2_quit(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid); void gui_internal_command_init(struct gui_priv *this, struct attr **attrs); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_gesture.c000066400000000000000000000063701221777731700253110ustar00rootroot00000000000000#include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "types.h" #include "navit_nls.h" #include "event.h" #include "search.h" #include "country.h" #include "track.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_gesture.h" void gui_internal_gesture_ring_clear(struct gui_priv *this) { this->gesture_ring_last=this->gesture_ring_first=0; }; static struct gesture_elem * gui_internal_gesture_ring_get(struct gui_priv *this, int i) { int n=(this->gesture_ring_last-i+GESTURE_RINGSIZE)%GESTURE_RINGSIZE; if(n==this->gesture_ring_first) return NULL; return this->gesture_ring+n; }; void gui_internal_gesture_ring_add(struct gui_priv *this, struct point *p) { long long msec; #ifndef HAVE_API_WIN32_CE struct timeval tv; gettimeofday(&tv,NULL); msec=((long long)tv.tv_sec)*1000+tv.tv_usec/1000; #else msec=GetTickCount(); #endif this->gesture_ring_last++; this->gesture_ring_last%=GESTURE_RINGSIZE; if(this->gesture_ring_last==this->gesture_ring_first) { this->gesture_ring_first++; this->gesture_ring_first%=GESTURE_RINGSIZE; } this->gesture_ring[this->gesture_ring_last].p=*p; this->gesture_ring[this->gesture_ring_last].msec=msec; dbg(2,"msec="LONGLONG_FMT" x=%d y=%d\n",msec,p->x,p->y); }; int gui_internal_gesture_get_vector(struct gui_priv *this, long long msec, struct point *p0, int *dx, int *dy) { struct gesture_elem *g; int x,y,dt; int i; dt=0; if(dx) *dx=0; if(dy) *dy=0; if(p0) { p0->x=-1; p0->y=-1; } g=gui_internal_gesture_ring_get(this,0); if(!g) return 0; x=g->p.x; y=g->p.y; if(p0) { *p0=g->p; } msec=g->msec; dbg(2,LONGLONG_FMT" %d %d\n",g->msec, g->p.x, g->p.y); for(i=1;(g=gui_internal_gesture_ring_get(this,i))!=NULL;i++) { if( msec-g->msec > 1000 ) break; dt=msec-g->msec; if(dx) *dx=x-g->p.x; if(dy) *dy=y-g->p.y; if(p0) { *p0=g->p; } dbg(2,LONGLONG_FMT" %d %d\n",g->msec, g->p.x, g->p.y); } return dt; } int gui_internal_gesture_do(struct gui_priv *this) { int dt; int dx,dy; dt=gui_internal_gesture_get_vector(this, 1000, NULL, &dx, &dy); if( abs(dx) > this->icon_s*3 && abs(dy) < this->icon_s ) { struct widget *wt; dbg(1,"horizontal dx=%d dy=%d\n",dx,dy); /* Prevent swiping if widget was scrolled beforehand */ if(this->pressed==2) return 0; for(wt=this->highlighted;wt && wt->type!=widget_table;wt=wt->parent); if(!wt || wt->type!=widget_table || !wt->data) return 0; if(this->highlighted) { this->highlighted->state &= ~STATE_HIGHLIGHTED; this->highlighted=NULL; } if(dx<0) gui_internal_table_button_next(this,NULL,wt); else gui_internal_table_button_prev(this,NULL,wt); return 1; } else if( abs(dy) > this->icon_s*3 && abs(dx) < this->icon_s ) { dbg(1,"vertical dx=%d dy=%d\n",dx,dy); } else if (dt>300 && abs(dx) icon_s && abs(dy) icon_s ) { dbg(1,"longtap dx=%d dy=%d\n",dx,dy); } else { dbg(1,"none dx=%d dy=%d\n",dx,dy); } return 0; }; navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_gesture.h000066400000000000000000000005651221777731700253160ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct point; void gui_internal_gesture_ring_clear(struct gui_priv *this); void gui_internal_gesture_ring_add(struct gui_priv *this, struct point *p); int gui_internal_gesture_get_vector(struct gui_priv *this, long long msec, struct point *p0, int *dx, int *dy); int gui_internal_gesture_do(struct gui_priv *this); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_html.c000066400000000000000000000334011221777731700245720ustar00rootroot00000000000000#include #include #include #include "callback.h" #include "debug.h" #include "coord.h" #include "point.h" #include "color.h" #include "graphics.h" #include "xmlconfig.h" #include "navit_nls.h" #include "gui.h" #include "command.h" struct gui_priv; #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_keyboard.h" #include "gui_internal_menu.h" struct form { char *onsubmit; }; struct html_tag_map { char *tag_name; enum html_tag tag; } html_tag_map[] = { {"a",html_tag_a}, {"h1",html_tag_h1}, {"html",html_tag_html}, {"img",html_tag_img}, {"script",html_tag_script}, {"form",html_tag_form}, {"input",html_tag_input}, {"div",html_tag_div}, }; static const char * find_attr(const char **names, const char **values, const char *name) { while (*names) { if (!g_ascii_strcasecmp(*names, name)) return *values; names+=XML_ATTR_DISTANCE; values+=XML_ATTR_DISTANCE; } return NULL; } static char * find_attr_dup(const char **names, const char **values, const char *name) { return g_strdup(find_attr(names, values, name)); } void gui_internal_html_main_menu(struct gui_priv *this) { gui_internal_prune_menu(this, NULL); gui_internal_html_load_href(this, "#Main Menu", 0); } static void gui_internal_html_command(struct gui_priv *this, struct widget *w, void *data) { gui_internal_evaluate(this,w->command); } static void gui_internal_html_submit_set(struct gui_priv *this, struct widget *w, struct form *form) { GList *l; if (w->form == form && w->name) { struct attr *attr=attr_new_from_text(w->name, w->text?w->text:""); if (attr) gui_set_attr(this->self.u.gui, attr); attr_free(attr); } l=w->children; while (l) { w=l->data; gui_internal_html_submit_set(this, w, form); l=g_list_next(l); } } static void gui_internal_html_submit(struct gui_priv *this, struct widget *w, void *data) { struct widget *menu; GList *l; dbg(1,"enter form %p %s\n",w->form,w->form->onsubmit); l=g_list_last(this->root.children); menu=l->data; graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_highlight_do(this, NULL); gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); gui_internal_html_submit_set(this, menu, w->form); gui_internal_evaluate(this,w->form->onsubmit); } void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace) { if (replace) gui_internal_prune_menu_count(this, 1, 0); if (href && href[0] == '#') { dbg(1,"href=%s\n",href); g_free(this->href); this->href=g_strdup(href); gui_internal_html_menu(this, this->html_text, href+1); } } void gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data) { gui_internal_html_load_href(this, w->command, 0); } struct div_flags_map { char *attr; char *val; enum flags flags; } div_flags_map[] = { {"gravity","none",gravity_none}, {"gravity","left",gravity_left}, {"gravity","xcenter",gravity_xcenter}, {"gravity","right",gravity_right}, {"gravity","top",gravity_top}, {"gravity","ycenter",gravity_ycenter}, {"gravity","bottom",gravity_bottom}, {"gravity","left_top",gravity_left_top}, {"gravity","top_center",gravity_top_center}, {"gravity","right_top",gravity_right_top}, {"gravity","left_center",gravity_left_center}, {"gravity","center",gravity_center}, {"gravity","right_center",gravity_right_center}, {"gravity","left_bottom",gravity_left_bottom}, {"gravity","bottom_center",gravity_bottom_center}, {"gravity","right_bottom",gravity_right_bottom}, {"expand","1",flags_expand}, {"fill","1",flags_fill}, {"orientation","horizontal",orientation_horizontal}, {"orientation","vertical",orientation_vertical}, {"orientation","horizontal_vertical",orientation_horizontal_vertical}, }; static enum flags div_flag(const char **names, const char **values, char *name) { int i; enum flags ret=0; const char *value=find_attr(names, values, name); if (!value) return ret; for (i = 0 ; i < sizeof(div_flags_map)/sizeof(struct div_flags_map); i++) { if (!strcmp(div_flags_map[i].attr,name) && !strcmp(div_flags_map[i].val,value)) ret|=div_flags_map[i].flags; } return ret; } static enum flags div_flags(const char **names, const char **values) { enum flags flags; flags = div_flag(names, values, "gravity"); flags |= div_flag(names, values, "orientation"); flags |= div_flag(names, values, "expand"); flags |= div_flag(names, values, "fill"); return flags; } static struct widget * html_image(struct gui_priv *this, const char **names, const char **values) { const char *src, *size; struct graphics_image *img=NULL; src=find_attr(names, values, "src"); if (!src) return NULL; size=find_attr(names, values, "size"); if (!size) { const char *class=find_attr(names, values, "class"); if (class && !strcasecmp(class,"centry")) size="xs"; else size="l"; } if (!strcmp(size,"l")) img=image_new_l(this, src); else if (!strcmp(size,"s")) img=image_new_s(this, src); else if (!strcmp(size,"xs")) img=image_new_xs(this, src); if (!img) return NULL; return gui_internal_image_new(this, img); } static void gui_internal_html_start(xml_context *dummy, const char *tag_name, const char **names, const char **values, void *data, GError **error) { struct gui_priv *this=data; int i; enum html_tag tag=html_tag_none; struct html *html=&this->html[this->html_depth]; const char *cond, *type, *font_size; if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) return; html->skip=0; html->command=NULL; html->name=NULL; html->href=NULL; html->refresh_cond=NULL; html->w=NULL; html->container=NULL; html->font_size=0; cond=find_attr(names, values, "cond"); if (cond && !this->html_skip) { if (!command_evaluate_to_boolean(&this->self, cond, NULL)) html->skip=1; } for (i=0 ; i < sizeof(html_tag_map)/sizeof(struct html_tag_map); i++) { if (!g_ascii_strcasecmp(html_tag_map[i].tag_name, tag_name)) { tag=html_tag_map[i].tag; break; } } html->tag=tag; html->class=find_attr_dup(names, values, "class"); if (!this->html_skip && !html->skip) { switch (tag) { case html_tag_a: html->name=find_attr_dup(names, values, "name"); if (html->name) { html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; if (!html->skip) this->html_anchor_found=1; } html->command=find_attr_dup(names, values, "onclick"); html->href=find_attr_dup(names, values, "href"); html->refresh_cond=find_attr_dup(names, values, "refresh_cond"); break; case html_tag_img: html->command=find_attr_dup(names, values, "onclick"); html->w=html_image(this, names, values); break; case html_tag_form: this->form=g_new0(struct form, 1); this->form->onsubmit=find_attr_dup(names, values, "onsubmit"); break; case html_tag_input: type=find_attr_dup(names, values, "type"); if (!type) break; if (!strcmp(type,"image")) { html->w=html_image(this, names, values); if (html->w) { html->w->state|=STATE_SENSITIVE; html->w->func=gui_internal_html_submit; } } if (!strcmp(type,"text") || !strcmp(type,"password")) { const char *value=find_attr(names, values, "value"); html->w=gui_internal_label_new(this, value); html->w->background=this->background; html->w->flags |= div_flags(names, values); html->w->state|=STATE_EDITABLE; if (!this->editable) { this->editable=html->w; html->w->state|=STATE_EDIT; } this->keyboard_required=1; if (!strcmp(type,"password")) html->w->flags2 |= 1; } if (html->w) { html->w->form=this->form; html->w->name=find_attr_dup(names, values, "name"); } break; case html_tag_div: html->w=gui_internal_box_new(this, div_flags(names, values)); font_size=find_attr(names, values, "font"); if (font_size) html->font_size=atoi(font_size); html->container=this->html_container; this->html_container=html->w; break; default: break; } } this->html_skip+=html->skip; this->html_depth++; } static void gui_internal_html_end(xml_context *dummy, const char *tag_name, void *data, GError **error) { struct gui_priv *this=data; struct html *html; struct html *parent=NULL; if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) return; this->html_depth--; html=&this->html[this->html_depth]; if (this->html_depth > 0) parent=&this->html[this->html_depth-1]; if (!this->html_skip) { if (html->command && html->w) { html->w->state |= STATE_SENSITIVE; html->w->command=html->command; html->w->func=gui_internal_html_command; html->command=NULL; } if (parent && (parent->href || parent->command) && html->w) { html->w->state |= STATE_SENSITIVE; if (parent->command) { html->w->command=g_strdup(parent->command); html->w->func=gui_internal_html_command; } else { html->w->command=g_strdup(parent->href); html->w->func=gui_internal_html_href; } } switch (html->tag) { case html_tag_div: this->html_container=html->container; case html_tag_img: case html_tag_input: gui_internal_widget_append(this->html_container, html->w); break; case html_tag_form: this->form=NULL; break; default: break; } } this->html_skip-=html->skip; g_free(html->command); g_free(html->name); g_free(html->href); g_free(html->class); g_free(html->refresh_cond); } static void gui_internal_refresh_callback_called(struct gui_priv *this, struct menu_data *menu_data) { if (gui_internal_menu_data(this) == menu_data) { char *href=g_strdup(menu_data->href); gui_internal_html_load_href(this, href, 1); g_free(href); } } static void gui_internal_set_refresh_callback(struct gui_priv *this, char *cond) { dbg(2,"cond=%s\n",cond); if (cond) { enum attr_type type; struct object_func *func; struct menu_data *menu_data=gui_internal_menu_data(this); dbg(2,"navit=%p\n",this->nav); type=command_evaluate_to_attr(&this->self, cond, NULL, &menu_data->refresh_callback_obj); if (type == attr_none) { dbg(0,"can't get type of '%s'\n",cond); return; } func=object_func_lookup(menu_data->refresh_callback_obj.type); if (!func) dbg(0,"'%s' has no functions\n",cond); if (func && !func->add_attr) dbg(0,"'%s' has no add_attr function\n",cond); if (!func || !func->add_attr) return; menu_data->refresh_callback.type=attr_callback; menu_data->refresh_callback.u.callback=callback_new_attr_2(callback_cast(gui_internal_refresh_callback_called),type,this,menu_data); func->add_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); } } static void gui_internal_html_text(xml_context *dummy, const char *text, gsize len, void *data, GError **error) { struct gui_priv *this=data; struct widget *w; int depth=this->html_depth-1; struct html *html=&this->html[depth]; gchar *text_stripped; if (this->html_skip) return; while (isspace(text[0])) { text++; len--; } while (len > 0 && isspace(text[len-1])) len--; text_stripped = g_strndup(text, len); if (html->tag == html_tag_html && depth > 2) { if (this->html[depth-1].tag == html_tag_script) { html=&this->html[depth-2]; } } switch (html->tag) { case html_tag_a: if (html->name && len) { if (html->class && !strcasecmp(html->class,"clist")) this->html_container=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill /* |flags_scrolly */); else this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); gui_internal_menu_data(this)->href=g_strdup(this->href); gui_internal_set_refresh_callback(this, html->refresh_cond); this->html_container->spx=this->spacing*10; } break; case html_tag_h1: if (!this->html_container) { this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); this->html_container->spx=this->spacing*10; } break; case html_tag_img: if (len) { if (html->class && !strcasecmp(html->class, "centry")) w=gui_internal_box_new(this, gravity_left_top|orientation_horizontal|flags_fill); else w=gui_internal_box_new(this, gravity_center|orientation_vertical); gui_internal_widget_append(w, html->w); gui_internal_widget_append(w, gui_internal_text_new(this, _(text_stripped), gravity_left_top|orientation_vertical|flags_fill)); html->w=w; } break; case html_tag_div: if (len) { gui_internal_widget_append(html->w, gui_internal_text_font_new(this, _(text_stripped), html->font_size, gravity_center|orientation_vertical)); } break; case html_tag_script: dbg(1,"execute %s\n",text_stripped); gui_internal_evaluate(this,text_stripped); break; default: break; } g_free(text_stripped); } void gui_internal_html_parse_text(struct gui_priv *this, char *doc) { xml_parse_text(doc, this, gui_internal_html_start, gui_internal_html_end, gui_internal_html_text); } void gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor) { char *doc=g_strdup(document); graphics_draw_mode(this->gra, draw_mode_begin); this->html_container=NULL; this->html_depth=0; this->html_anchor=anchor; this->html_anchor_found=0; this->form=NULL; this->keyboard_required=0; this->editable=NULL; callback_list_call_attr_2(this->cbl,attr_gui,anchor,&doc); gui_internal_html_parse_text(this, doc); g_free(doc); if (this->keyboard_required && this->keyboard) { this->html_container->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; gui_internal_widget_append(this->html_container, gui_internal_keyboard(this,2+gui_internal_keyboard_init_mode(getenv("LANG")))); } gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_html.h000066400000000000000000000005721221777731700246020ustar00rootroot00000000000000void gui_internal_html_main_menu(struct gui_priv *this); void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace); void gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data); void gui_internal_html_parse_text(struct gui_priv *this, char *doc); void gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor); navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_keyboard.c000066400000000000000000000264131221777731700254330ustar00rootroot00000000000000#include #include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" static void gui_internal_cmd_keypress(struct gui_priv *this, struct widget *wm, void *data) { struct menu_data *md; gui_internal_keypress_do(this, (char *) wm->data); md=gui_internal_menu_data(this); // Switch to lowercase after the first key is pressed if (md->keyboard_mode == 2) // Latin gui_internal_keyboard_do(this, md->keyboard, 10); if (md->keyboard_mode == 26) // Umlaut gui_internal_keyboard_do(this, md->keyboard, 34); if (md->keyboard_mode == 42) // Russian/Ukrainian/Belorussian gui_internal_keyboard_do(this, md->keyboard, 50); } static struct widget * gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, int font, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w, int h) { struct widget *wk; gui_internal_widget_append(wkbd, wk=gui_internal_button_font_new_with_callback(this, text, font, NULL, gravity_center|orientation_vertical, func, data)); wk->data_free=data_free; wk->background=this->background; wk->bl=0; wk->br=0; wk->bt=0; wk->bb=0; wk->w=w; wk->h=h; return wk; } static struct widget * gui_internal_keyboard_key(struct gui_priv *this, struct widget *wkbd, char *text, char *key, int w, int h) { return gui_internal_keyboard_key_data(this, wkbd, text, 0, gui_internal_cmd_keypress, g_strdup(key), g_free_func,w,h); } static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data); // A list of availiable keyboard modes. struct gui_internal_keyb_mode { char title[16]; // Label to be displayed on keys that switch to it int font; // Font size of label int case_mode; // Mode to switch to when case CHANGE() key is pressed. int umlaut_mode; // Mode to switch to when UMLAUT() key is pressed. } gui_internal_keyb_modes[]= { /* 0*/ {"ABC", 2, 8, 24}, /* 8*/ {"abc", 2, 0, 32}, /*16*/ {"123", 2, 0, 24}, /*24*/ {"ÄÖÜ", 2, 40, 0}, /*32*/ {"äöü", 2, 32, 8}, /*40*/ {"АБВ", 2, 48, 0}, /*48*/ {"абв", 2, 40, 8}, /*56*/ {"DEG", 2, 2, 2} }; // Some macros that make the keyboard layout easier to visualise in // the source code. The macros are #undef'd after this function. #define KEY(x) gui_internal_keyboard_key(this, wkbd, (x), (x), max_w, max_h) #define SPACER() gui_internal_keyboard_key_data(this, wkbd, "", 0, NULL, NULL, NULL,max_w,max_h) #define MODE(x) gui_internal_keyboard_key_data(this, wkbd, \ gui_internal_keyb_modes[(x)/8].title, \ gui_internal_keyb_modes[(x)/8].font, \ gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h) \ -> datai=(mode&7)+((x)&~7) #define SWCASE() MODE(gui_internal_keyb_modes[mode/8].case_mode) #define UMLAUT() MODE(gui_internal_keyb_modes[mode/8].umlaut_mode) struct widget * gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) { struct widget *wkbd,*wk; struct menu_data *md=gui_internal_menu_data(this); int i, max_w=this->root.w, max_h=this->root.h; int render=0; char *space="_"; char *backspace="←"; char *hide="▼"; char *unhide="▲"; if (wkbdb) { this->current.x=-1; this->current.y=-1; gui_internal_highlight(this); if (md->keyboard_mode >= 1024) render=2; else render=1; gui_internal_widget_children_destroy(this, wkbdb); } else wkbdb=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); md->keyboard=wkbdb; md->keyboard_mode=mode; wkbd=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); wkbd->background=this->background; wkbd->cols=8; wkbd->spx=0; wkbd->spy=0; max_w=max_w/8; max_h=max_h/8; // Allows 3 results in the list when searching for Towns wkbd->p.y=max_h*2; if(mode>=40&&mode<56) { // Russian/Ukrainian/Belarussian layout needs more space... max_h=max_h*4/5; max_w=max_w*8/9; wkbd->cols=9; } if (mode >= 0 && mode < 8) { for (i = 0 ; i < 26 ; i++) { char text[]={'A'+i,'\0'}; KEY(text); } gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); if (mode == 0) { KEY("-"); KEY("'"); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; } else { wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; SWCASE(); MODE(16); } UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 8 && mode < 16) { for (i = 0 ; i < 26 ; i++) { char text[]={'a'+i,'\0'}; KEY(text); } gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); if (mode == 8) { KEY("-"); KEY("'"); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; } else { wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; SWCASE(); MODE(16); } UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 16 && mode < 24) { for (i = 0 ; i < 10 ; i++) { char text[]={'0'+i,'\0'}; KEY(text); } /* ("8") ("9")*/KEY("."); KEY("°"); KEY("'"); KEY("\"");KEY("-"); KEY("+"); KEY("*"); KEY("/"); KEY("("); KEY(")"); KEY("="); KEY("?"); KEY(":"); SPACER(); if (mode == 16) { SPACER(); KEY("-"); KEY("'"); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; SPACER(); SPACER(); } else { SPACER(); MODE(40); MODE(48); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; MODE(0); MODE(8); } UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 24 && mode < 32) { KEY("Ä"); KEY("Ë"); KEY("Ï"); KEY("Ö"); KEY("Ü"); KEY("Æ"); KEY("Ø"); KEY("Å"); KEY("Á"); KEY("É"); KEY("Í"); KEY("Ó"); KEY("Ú"); KEY("Š"); KEY("Č"); KEY("Ž"); KEY("À"); KEY("È"); KEY("Ì"); KEY("Ò"); KEY("Ù"); KEY("Ś"); KEY("Ć"); KEY("Ź"); KEY("Â"); KEY("Ê"); KEY("Î"); KEY("Ô"); KEY("Û"); SPACER(); UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 32 && mode < 40) { KEY("ä"); KEY("ë"); KEY("ï"); KEY("ö"); KEY("ü"); KEY("æ"); KEY("ø"); KEY("å"); KEY("á"); KEY("é"); KEY("í"); KEY("ó"); KEY("ú"); KEY("š"); KEY("č"); KEY("ž"); KEY("à"); KEY("è"); KEY("ì"); KEY("ò"); KEY("ù"); KEY("ś"); KEY("ć"); KEY("ź"); KEY("â"); KEY("ê"); KEY("î"); KEY("ô"); KEY("û"); KEY("ß"); UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 40 && mode < 48) { KEY("А"); KEY("Б"); KEY("В"); KEY("Г"); KEY("Д"); KEY("Е"); KEY("Ж"); KEY("З"); KEY("И"); KEY("Й"); KEY("К"); KEY("Л"); KEY("М"); KEY("Н"); KEY("О"); KEY("П"); KEY("Р"); KEY("С"); KEY("Т"); KEY("У"); KEY("Ф"); KEY("Х"); KEY("Ц"); KEY("Ч"); KEY("Ш"); KEY("Щ"); KEY("Ъ"); KEY("Ы"); KEY("Ь"); KEY("Э"); KEY("Ю"); KEY("Я"); KEY("Ё"); KEY("І"); KEY("Ї"); KEY("Ў"); SPACER(); SPACER(); SPACER(); gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; SWCASE(); MODE(16); SPACER(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 48 && mode < 56) { KEY("а"); KEY("б"); KEY("в"); KEY("г"); KEY("д"); KEY("е"); KEY("ж"); KEY("з"); KEY("и"); KEY("й"); KEY("к"); KEY("л"); KEY("м"); KEY("н"); KEY("о"); KEY("п"); KEY("р"); KEY("с"); KEY("т"); KEY("у"); KEY("ф"); KEY("х"); KEY("ц"); KEY("ч"); KEY("ш"); KEY("щ"); KEY("ъ"); KEY("ы"); KEY("ь"); KEY("э"); KEY("ю"); KEY("я"); KEY("ё"); KEY("і"); KEY("ї"); KEY("ў"); SPACER(); SPACER(); SPACER(); gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; SWCASE(); MODE(16); SPACER(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if(md->search_list && md->search_list->type==widget_table) { struct table_data *td=(struct table_data*)(md->search_list->data); td->scroll_buttons.button_box_hide=mode<1024; } if (mode >= 56 && mode < 64) { /* special case for coordinates input screen (enter_coord) */ KEY("0"); KEY("1"); KEY("2"); KEY("3"); KEY("4"); SPACER(); KEY("N"); KEY("S"); KEY("5"); KEY("6"); KEY("7"); KEY("8"); KEY("9"); SPACER(); KEY("E"); KEY("W"); KEY("°"); KEY("."); KEY("'"); gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); SPACER(); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+1024; SPACER(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 1024) { char *text=NULL; int font=0; struct widget *wkl; mode -= 1024; text=gui_internal_keyb_modes[mode/8].title; font=gui_internal_keyb_modes[mode/8].font; wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill); wk->func=gui_internal_keyboard_change; wk->data=wkbdb; wk->background=this->background; wk->bl=0; wk->br=0; wk->bt=0; wk->bb=0; wk->w=max_w; wk->h=max_h; wk->datai=mode; wk->state |= STATE_SENSITIVE; gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide)); wkl->background=NULL; gui_internal_widget_append(wk, wkl=gui_internal_label_font_new(this, text, font)); wkl->background=NULL; gui_internal_widget_append(wkbd, wk); if (render) render=2; } gui_internal_widget_append(wkbdb, wkbd); if (render == 1) { gui_internal_widget_pack(this, wkbdb); gui_internal_widget_render(this, wkbdb); } else if (render == 2) { gui_internal_menu_reset_pack(this); gui_internal_menu_render(this); } return wkbdb; } #undef KEY #undef SPACER #undef SWCASE #undef UMLAUT #undef MODE struct widget * gui_internal_keyboard(struct gui_priv *this, int mode) { if (! this->keyboard) return NULL; return gui_internal_keyboard_do(this, NULL, mode); } static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data) { gui_internal_keyboard_do(this, key->data, key->datai); } int gui_internal_keyboard_init_mode(char *lang) { int ret=0; /* Converting to upper case here is required for Android */ lang=g_ascii_strup(lang,-1); /* * Set cyrillic keyboard for countries using Cyrillic alphabet */ if (strstr(lang,"RU")) ret = 40; if (strstr(lang,"UA")) ret = 40; if (strstr(lang,"BY")) ret = 40; if (strstr(lang,"RS")) ret = 40; if (strstr(lang,"BG")) ret = 40; if (strstr(lang,"MK")) ret = 40; if (strstr(lang,"KZ")) ret = 40; if (strstr(lang,"KG")) ret = 40; if (strstr(lang,"TJ")) ret = 40; if (strstr(lang,"MN")) ret = 40; g_free(lang); return ret; } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_keyboard.h000066400000000000000000000004411221777731700254310ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct widget; struct widget *gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode); struct widget *gui_internal_keyboard(struct gui_priv *this, int mode); int gui_internal_keyboard_init_mode(char *lang); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_menu.c000066400000000000000000000216271221777731700246010ustar00rootroot00000000000000#include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "xmlconfig.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_search.h" #include "gui_internal_menu.h" extern char *version; static void gui_internal_menu_destroy(struct gui_priv *this, struct widget *w) { struct menu_data *menu_data=w->menu_data; if (menu_data) { if (menu_data->refresh_callback_obj.type) { struct object_func *func; func=object_func_lookup(menu_data->refresh_callback_obj.type); if (func && func->remove_attr) func->remove_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); } if (menu_data->refresh_callback.u.callback) callback_destroy(menu_data->refresh_callback.u.callback); g_free(menu_data->href); g_free(menu_data); } gui_internal_widget_destroy(this, w); this->root.children=g_list_remove(this->root.children, w); } static void gui_internal_prune_menu_do(struct gui_priv *this, struct widget *w, int render) { GList *l; struct widget *wr,*wd; gui_internal_search_idle_end(this); while ((l = g_list_last(this->root.children))) { wd=l->data; if (wd == w) { void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); if (!render) return; gui_internal_say(this, w, 0); redisplay=w->menu_data->redisplay; wr=w->menu_data->redisplay_widget; if (!w->menu_data->redisplay && !w->menu_data->href) { gui_internal_widget_render(this, w); return; } if (redisplay) { gui_internal_menu_destroy(this, w); redisplay(this, wr, wr->data); } else { char *href=g_strdup(w->menu_data->href); gui_internal_menu_destroy(this, w); gui_internal_html_load_href(this, href, 0); g_free(href); } return; } gui_internal_menu_destroy(this, wd); } } void gui_internal_prune_menu(struct gui_priv *this, struct widget *w) { gui_internal_prune_menu_do(this, w, 1); } void gui_internal_prune_menu_count(struct gui_priv *this, int count, int render) { GList *l=g_list_last(this->root.children); struct widget *w=NULL; while (l && count-- > 0) l=g_list_previous(l); if (l) { w=l->data; gui_internal_prune_menu_do(this, w, render); } } struct widget * gui_internal_menu(struct gui_priv *this, const char *label) { struct widget *menu,*w,*w1,*topbox; gui_internal_search_idle_end(this); topbox=gui_internal_box_new_with_label(this, 0, label); topbox->w=this->root.w; topbox->h=this->root.h; gui_internal_widget_append(&this->root, topbox); menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); menu->w=this->root.w; menu->h=this->root.h; menu->background=this->background; gui_internal_apply_config(this); topbox->menu_data=g_new0(struct menu_data, 1); gui_internal_widget_append(topbox, menu); w=gui_internal_top_bar(this); gui_internal_widget_append(menu, w); w=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); w->spx=4*this->spacing; w->w=menu->w; gui_internal_widget_append(menu, w); if (this->flags & 16 && !(this->flags & 1024)) { struct widget *wlb,*wb,*wm=w; wm->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; w=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_expand|flags_fill); dbg(2,"topbox->menu_data=%p\n", topbox->menu_data); gui_internal_widget_append(wm, w); wb=gui_internal_box_new(this, gravity_right_center|orientation_horizontal|flags_fill); wb->bl=6; wb->br=6; wb->bb=6; wb->bt=6; wb->spx=6; topbox->menu_data->button_bar=wb; gui_internal_widget_append(wm, wb); wlb=gui_internal_button_label(this,_("Back"),1); wlb->func=gui_internal_back; wlb->state |= STATE_SENSITIVE; } if (this->flags & 192) { menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); menu->w=this->root.w; menu->h=this->root.h; w1=gui_internal_time_help(this); gui_internal_widget_append(menu, w1); w1=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); gui_internal_widget_append(menu, w1); gui_internal_widget_append(topbox, menu); menu->background=NULL; } gui_internal_widget_pack(this, topbox); gui_internal_widget_reset_pack(this, topbox); topbox->w=this->root.w; topbox->h=this->root.h; menu->w=this->root.w; menu->h=this->root.h; return w; } struct menu_data * gui_internal_menu_data(struct gui_priv *this) { GList *l; struct widget *menu; l=g_list_last(this->root.children); menu=l->data; return menu->menu_data; } void gui_internal_menu_reset_pack(struct gui_priv *this) { GList *l; struct widget *top_box; l=g_list_last(this->root.children); top_box=l->data; gui_internal_widget_reset_pack(this, top_box); } void gui_internal_menu_render(struct gui_priv *this) { GList *l; struct widget *menu; l=g_list_last(this->root.children); menu=l->data; gui_internal_say(this, menu, 0); gui_internal_widget_pack(this, menu); gui_internal_widget_render(this, menu); } struct widget * gui_internal_top_bar(struct gui_priv *this) { struct widget *w,*wm,*wh,*wc,*wcn; int dots_len, sep_len; GList *res=NULL,*l; int width,width_used=0,use_sep=0,incomplete=0; struct graphics_gc *foreground=(this->flags & 256 ? this->background : this->text_foreground); /* flags 1:Don't expand bar to screen width 2:Don't show Map Icon 4:Don't show Home Icon 8:Show only current menu 16:Don't use menu titles as button 32:Show navit version 64:Show time 128:Show help 256:Use background for menu headline 512:Set osd_configuration and zoom to route when setting position 1024:Don't show back button 2048:No highlighting of keyboard */ w=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|(this->flags & 1 ? 0:flags_fill)); w->bl=this->spacing; w->spx=this->spacing; w->background=this->background2; if ((this->flags & 6) == 6) { w->bl=10; w->br=10; w->bt=6; w->bb=6; } width=this->root.w-w->bl; if (! (this->flags & 2)) { wm=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, "gui_map"), gravity_center|orientation_vertical, gui_internal_cmd_return, NULL); wm->speech=g_strdup(_("Back to map")); gui_internal_widget_pack(this, wm); gui_internal_widget_append(w, wm); width-=wm->w; } if (! (this->flags & 4)) { wh=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, "gui_home"), gravity_center|orientation_vertical, gui_internal_cmd_main_menu, NULL); wh->speech=g_strdup(_("Main Menu")); gui_internal_widget_pack(this, wh); gui_internal_widget_append(w, wh); width-=wh->w; } if (!(this->flags & 6)) width-=w->spx; l=g_list_last(this->root.children); wcn=gui_internal_label_new(this,".. »"); wcn->foreground=foreground; dots_len=wcn->w; gui_internal_widget_destroy(this, wcn); wcn=gui_internal_label_new(this,"»"); wcn->foreground=foreground; sep_len=wcn->w; gui_internal_widget_destroy(this, wcn); while (l) { if (g_list_previous(l) || !g_list_next(l)) { wc=l->data; wcn=gui_internal_label_new(this, wc->text); wcn->foreground=foreground; if (g_list_next(l)) use_sep=1; else use_sep=0; dbg(1,"%d (%s) + %d + %d + %d > %d\n", wcn->w, wc->text, width_used, w->spx, use_sep ? sep_len : 0, width); if (wcn->w + width_used + w->spx + (use_sep ? sep_len : 0) + (g_list_previous(l) ? dots_len : 0) > width) { incomplete=1; gui_internal_widget_destroy(this, wcn); break; } if (use_sep) { struct widget *wct=gui_internal_label_new(this, "»"); wct->foreground=foreground; res=g_list_prepend(res, wct); width_used+=sep_len+w->spx; } width_used+=wcn->w; if (!(this->flags & 16)) { wcn->func=gui_internal_cmd_return; wcn->data=wc; wcn->state |= STATE_SENSITIVE; } res=g_list_prepend(res, wcn); if (this->flags & 8) break; } l=g_list_previous(l); } if (incomplete) { if (! res) { wcn=gui_internal_label_new_abbrev(this, wc->text, width-width_used-w->spx-dots_len); wcn->foreground=foreground; wcn->func=gui_internal_cmd_return; wcn->data=wc; wcn->state |= STATE_SENSITIVE; res=g_list_prepend(res, wcn); l=g_list_previous(l); wc=l?l->data:NULL; } if(wc) { wcn=gui_internal_label_new(this, ".. »"); wcn->foreground=foreground; wcn->func=gui_internal_cmd_return; wcn->data=wc; wcn->state |= STATE_SENSITIVE; res=g_list_prepend(res, wcn); } } l=res; while (l) { gui_internal_widget_append(w, l->data); l=g_list_next(l); } if (this->flags & 32) { char *version_text=g_strdup_printf("Navit %s",version); wcn=gui_internal_label_new(this, version_text); g_free(version_text); wcn->flags=gravity_right_center|flags_expand; gui_internal_widget_append(w, wcn); } #if 0 if (dots) gui_internal_widget_destroy(this, dots); #endif return w; } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_menu.h000066400000000000000000000010551221777731700245770ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct menu_data; struct widget; void gui_internal_prune_menu(struct gui_priv *this, struct widget *w); void gui_internal_prune_menu_count(struct gui_priv *this, int count, int render); struct widget *gui_internal_menu(struct gui_priv *this, const char *label); struct menu_data *gui_internal_menu_data(struct gui_priv *this); void gui_internal_menu_reset_pack(struct gui_priv *this); void gui_internal_menu_render(struct gui_priv *this); struct widget *gui_internal_top_bar(struct gui_priv *this); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_poi.c000066400000000000000000000574061221777731700244300ustar00rootroot00000000000000#include #include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "layout.h" #include "route.h" #include "transform.h" #include "linguistics.h" #include "fib.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_poi.h" struct item_data { int dist; char *label; struct item item; struct coord c; }; struct selector { char *icon; char *name; enum item_type *types; }; static enum item_type selectors_BankTypes[]={type_poi_bank,type_poi_bank, type_poi_atm,type_poi_atm, type_none}; static enum item_type selectors_FuelTypes[]={type_poi_fuel,type_poi_fuel,type_none}; static enum item_type selectors_HotelTypes[]={type_poi_hotel,type_poi_camp_rv,type_poi_camping,type_poi_camping, type_poi_resort,type_poi_resort,type_poi_motel,type_poi_hostel,type_none}; static enum item_type selectors_RestaurantTypes[]={type_poi_bar,type_poi_picnic,type_poi_burgerking,type_poi_fastfood, type_poi_restaurant,type_poi_restaurant,type_poi_cafe,type_poi_cafe,type_poi_pub,type_poi_pub,type_none}; static enum item_type selectors_ShoppingTypes[]={type_poi_mall,type_poi_mall,type_poi_shop_grocery,type_poi_shop_grocery, type_poi_shopping,type_poi_shopping,type_poi_shop_butcher,type_poi_shop_baker,type_poi_shop_fruit, type_poi_shop_fruit,type_poi_shop_beverages,type_poi_shop_beverages,type_none}; static enum item_type selectors_ServiceTypes[]={type_poi_marina,type_poi_marina,type_poi_hospital,type_poi_hospital, type_poi_public_utilities,type_poi_public_utilities,type_poi_police,type_poi_autoservice,type_poi_information, type_poi_information,type_poi_pharmacy,type_poi_pharmacy,type_poi_personal_service,type_poi_repair_service, type_poi_restroom,type_poi_restroom,type_none}; static enum item_type selectors_ParkingTypes[]={type_poi_car_parking,type_poi_car_parking,type_none}; static enum item_type selectors_LandFeaturesTypes[]={type_poi_land_feature,type_poi_rock,type_poi_dam,type_poi_dam, type_poi_peak,type_poi_peak,type_none}; static enum item_type selectors_OtherTypes[]={type_point_unspecified,type_poi_land_feature-1,type_poi_rock+1,type_poi_fuel-1, type_poi_marina+1,type_poi_shopping-1,type_poi_shopping+1,type_poi_car_parking-1,type_poi_car_parking+1, type_poi_bar-1,type_poi_bank+1,type_poi_dam-1,type_poi_dam+1,type_poi_information-1,type_poi_information+1, type_poi_mall-1,type_poi_mall+1,type_poi_personal_service-1,type_poi_pharmacy+1,type_poi_repair_service-1, type_poi_repair_service+1,type_poi_restaurant-1,type_poi_restaurant+1,type_poi_restroom-1,type_poi_restroom+1, type_poi_shop_grocery-1,type_poi_shop_grocery+1,type_poi_peak-1,type_poi_peak+1,type_poi_motel-1,type_poi_hostel+1, type_poi_shop_butcher-1,type_poi_shop_baker+1,type_poi_shop_fruit-1,type_poi_shop_fruit+1,type_poi_shop_beverages-1, type_poi_shop_beverages+1,type_poi_pub-1,type_poi_atm+1,type_line-1,type_none}; /*static enum item_type selectors_UnknownTypes[]={type_point_unkn,type_point_unkn,type_none};*/ struct selector selectors[]={ {"bank","Bank",selectors_BankTypes}, {"fuel","Fuel",selectors_FuelTypes}, {"hotel","Hotel",selectors_HotelTypes}, {"restaurant","Restaurant",selectors_RestaurantTypes}, {"shopping","Shopping",selectors_ShoppingTypes}, {"hospital","Service",selectors_ServiceTypes}, {"parking","Parking",selectors_ParkingTypes}, {"peak","Land Features",selectors_LandFeaturesTypes}, {"unknown","Other",selectors_OtherTypes}, /* {"unknown","Unknown",selectors_UnknownTypes},*/ }; /** * @brief Get icon for given POI type. * * @param this pointer to gui context * @param type POI type * @return Pointer to graphics_image object, or NULL if no picture available. */ static struct graphics_image * gui_internal_poi_icon(struct gui_priv *this, struct item *item) { struct attr layout; struct attr icon_src; GList *layer; navit_get_attr(this->nav, attr_layout, &layout, NULL); layer=layout.u.layout->layers; while(layer) { GList *itemgra=((struct layer *)layer->data)->itemgras; while(itemgra) { GList *types=((struct itemgra *)itemgra->data)->type; while(types) { if((long)types->data==item->type) { GList *element=((struct itemgra *)itemgra->data)->elements; while(element) { struct element * el=element->data; if(el->type==element_icon) { char *src; char *icon; struct graphics_image *img; if(item_is_custom_poi(*item)) { struct map_rect *mr=map_rect_new(item->map, NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if(item_attr_get(item, attr_icon_src, &icon_src)) { src=el->u.icon.src; if(!src || !src[0]) src="%s"; icon=g_strdup_printf(src,icon_src.u.str); } else { icon=g_strdup(el->u.icon.src); } } else { icon=g_strdup(el->u.icon.src); } char *dot=g_strrstr(icon,"."); dbg(2,"%s %s\n", item_to_name(item->type),icon); if(dot) *dot=0; img=image_new_xs(this,icon); g_free(icon); if(img) return img; } element=g_list_next(element); } } types=g_list_next(types); } itemgra=g_list_next(itemgra); } layer=g_list_next(layer); } return NULL; } static void get_direction(char *buffer, int angle, int mode) { angle=angle%360; switch (mode) { case 0: sprintf(buffer,"%d",angle); break; case 1: if (angle < 69 || angle > 291) *buffer++='N'; if (angle > 111 && angle < 249) *buffer++='S'; if (angle > 22 && angle < 158) *buffer++='E'; if (angle > 202 && angle < 338) *buffer++='W'; *buffer++='\0'; break; case 2: angle=(angle+15)/30; if (! angle) angle=12; sprintf(buffer,"%d H", angle); break; } } /** * @brief Free poi_param structure. * * @param p reference to the object to be freed. */ void gui_internal_poi_param_free(void *p) { if(((struct poi_param *)p)->filterstr) g_free(((struct poi_param *)p)->filterstr); if(((struct poi_param *)p)->filter) g_list_free(((struct poi_param *)p)->filter); g_free(p); }; /** * @brief Clone poi_param structure. * * @param p reference to the object to be cloned. * @return Cloned object reference. */ static struct poi_param * gui_internal_poi_param_clone(struct poi_param *p) { struct poi_param *r=g_new(struct poi_param,1); GList *l=p->filter; memcpy(r,p,sizeof(struct poi_param)); r->filter=NULL; r->filterstr=NULL; if(p->filterstr) { char *last=g_list_last(l)->data; int len=(last - p->filterstr) + strlen(last)+1; r->filterstr=g_memdup(p->filterstr,len); } while(l) { r->filter=g_list_append(r->filter, r->filterstr + ((char*)(l->data) - p->filterstr) ); l=g_list_next(l); } return r; }; /** * @brief Set POIs filter data in poi_param structure. * @param param poi_param structure with unset filter data. * @param text filter text. */ void gui_internal_poi_param_set_filter(struct poi_param *param, char *text) { char *s1, *s2; param->filterstr=removecase(text); s1=param->filterstr; do { s2=g_utf8_strchr(s1,-1,' '); if(s2) *s2++=0; param->filter=g_list_append(param->filter,s1); if(s2) { while(*s2==' ') s2++; } s1=s2; } while(s2 && *s2); } static struct widget * gui_internal_cmd_pois_selector(struct gui_priv *this, struct pcoord *c, int pagenb) { struct widget *wl,*wb; int nitems,nrows; int i; //wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal_vertical|flags_fill); wl->background=this->background; wl->w=this->root.w; wl->cols=this->root.w/this->icon_s; nitems=sizeof(selectors)/sizeof(struct selector); nrows=nitems/wl->cols + (nitems%wl->cols>0); wl->h=this->icon_l*nrows; for (i = 0 ; i < nitems ; i++) { struct poi_param *p=g_new0(struct poi_param,1); p->sel = 1; p->selnb = i; p->pagenb = pagenb; p->dist = 0; p->filter=NULL; p->filterstr=NULL; gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, selectors[i].icon), gravity_left_center|orientation_vertical, gui_internal_cmd_pois, p)); wb->c=*c; wb->data_free=gui_internal_poi_param_free; wb->bt=10; } gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, "gui_search"), gravity_left_center|orientation_vertical, gui_internal_cmd_pois_filter, NULL)); wb->c=*c; wb->bt=10; gui_internal_widget_pack(this,wl); return wl; } /** * @brief Widget to display POI item. * * @param this pointer to gui context * @param center reference to the standing point where angle to be counted from * @param item POI item reference * @param c POI coordinates * @param dist precomputed distance to POI (or -1 if it's not to be displayed) * @param name POI name * @return Pointer to new widget. */ static void format_dist(int dist, char *distbuf) { if (dist > 10000) sprintf(distbuf,"%d ", dist/1000); else if (dist>0) sprintf(distbuf,"%d.%d ", dist/1000, (dist%1000)/100); } struct widget * gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, struct route *route, int dist, char* name) { char distbuf[32]=""; char dirbuf[32]=""; char routedistbuf[32]=""; char *type; struct widget *wl; char *text; struct graphics_image *icon; format_dist(dist,distbuf); if(c) { int len; get_direction(dirbuf, transform_get_angle_delta(center, c, 0), 1); len=strlen(dirbuf); dirbuf[len]=' '; dirbuf[len+1]=0; if (route) { route_get_distances(route, c, 1, &dist); if (dist != INT_MAX) format_dist(dist, routedistbuf); } } type=item_to_name(item->type); icon=gui_internal_poi_icon(this,item); if(!icon) { icon=image_new_xs(this,"gui_inactive"); text=g_strdup_printf("%s%s%s%s %s", distbuf, dirbuf, routedistbuf, type, name); } else if(strlen(name)>0) text=g_strdup_printf("%s%s%s%s", distbuf, dirbuf, routedistbuf, name); else text=g_strdup_printf("%s%s%s%s", distbuf, dirbuf, routedistbuf, type); wl=gui_internal_button_new_with_callback(this, text, icon, gravity_left_center|orientation_horizontal|flags_fill, NULL, NULL); wl->datai=dist; g_free(text); if (name[0]) { wl->name=g_strdup_printf("%s %s",type,name); } else { wl->name=g_strdup(type); } wl->func=gui_internal_cmd_position; wl->data=(void *)9; wl->item=*item; wl->state|= STATE_SENSITIVE; return wl; } /** * @brief Get string representation of item address suitable for doing search and for display in POI list. * * @param item reference to item. * @return Pointer to string representation of address. To be g_free()d after use. */ char * gui_internal_compose_item_address_string(struct item *item) { char *s=g_strdup(""); struct attr attr; if(item_attr_get(item, attr_house_number, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_street_name, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_street_name_systematic, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_district_name, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_town_name, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_county_name, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_country_name, &attr)) s=g_strjoin(" ",s,attr.u.str,NULL); if(item_attr_get(item, attr_address, &attr)) s=g_strjoin(" ",s,"|",attr.u.str,NULL); return s; } static int gui_internal_cmd_pois_item_selected(struct poi_param *param, struct item *item) { enum item_type *types; struct selector *sel = param->sel? &selectors[param->selnb]: NULL; enum item_type type=item->type; struct attr attr; int match=0; if (type >= type_line && param->filter==NULL) return 0; if (! sel || !sel->types) { match=1; } else { types=sel->types; while (*types != type_none) { if (item->type >= types[0] && item->type <= types[1]) { return 1; } types+=2; } } if (param->filter) { char *long_name, *s; GList *f; int i; if (param->isAddressFilter) { s=gui_internal_compose_item_address_string(item); } else if (item_attr_get(item, attr_label, &attr)) { s=g_strdup_printf("%s %s", item_to_name(item->type), attr.u.str); } else { s=g_strdup(item_to_name(item->type)); } long_name=removecase(s); g_free(s); match=0; for(i=0;i<3 && !match;i++) { char *long_name_exp=linguistics_expand_special(long_name, i); for(s=long_name_exp,f=param->filter;f && s;f=g_list_next(f)) { s=strstr(s,f->data); if(!s) { break; } s=g_utf8_strchr(s,-1,' '); } g_free(long_name_exp); if(!f) match=1; } g_free(long_name); } return match; } /** * @brief Event handler for POIs list "more" element. * * @param this The graphics context. * @param wm called widget. * @param data event data. */ static void gui_internal_cmd_pois_more(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=g_new0(struct widget,1); w->data=wm->data; w->c=wm->c; w->w=wm->w; wm->data_free=NULL; gui_internal_back(this, NULL, NULL); gui_internal_cmd_pois(this, w, w->data); free(w); } /** * @brief Event to apply POIs text filter. * * @param this The graphics context. * @param wm called widget. * @param data event data (pointer to editor widget containg filter text). */ static void gui_internal_cmd_pois_filter_do(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=data; struct poi_param *param; if(!w->text) return; if(w->data) { param=gui_internal_poi_param_clone(w->data); param->pagenb=0; } else { param=g_new0(struct poi_param,1); } param->isAddressFilter=strcmp(wm->name,"AddressFilter")==0; gui_internal_poi_param_set_filter(param, w->text); gui_internal_cmd_pois(this,w,param); gui_internal_poi_param_free(param); } /** * @brief POIs filter dialog. * Event to handle '\r' '\n' keys pressed. * */ static void gui_internal_cmd_pois_filter_changed(struct gui_priv *this, struct widget *wm, void *data) { if (wm->text && wm->reason==gui_internal_reason_keypress_finish) { gui_internal_cmd_pois_filter_do(this, wm, wm); } } /** * @brief POIs filter dialog. * * @param this The graphics context. * @param wm called widget. * @param data event data. */ void gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data) { struct widget *wb, *w, *wr, *wk, *we; int keyboard_mode; keyboard_mode=2+gui_internal_keyboard_init_mode(getenv("LANG")); wb=gui_internal_menu(this,"Filter"); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wr); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); wk->state |= STATE_EDIT|STATE_EDITABLE; wk->func=gui_internal_cmd_pois_filter_changed; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->name=g_strdup("POIsFilter"); wk->c=wm->c; gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_cmd_pois_filter_do; wb->name=g_strdup("NameFilter"); wb->data=wk; gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "post"))); wb->state |= STATE_SENSITIVE; wb->name=g_strdup("AddressFilter"); wb->func = gui_internal_cmd_pois_filter_do; wb->data=wk; if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,keyboard_mode)); gui_internal_menu_render(this); } /** * @brief Do POI search specified by poi_param and display POIs found * * @param this The graphics context. * @param wm called widget. * @param data event data, reference to poi_param or NULL. */ void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data) { struct map_selection *sel,*selm; struct coord c,center; struct mapset_handle *h; struct map *m; struct map_rect *mr; struct item *item; struct widget *wi,*w,*w2,*wb, *wtable, *row; enum projection pro=wm->c.pro; struct poi_param *param; int param_free=0; int idist,dist; struct selector *isel; int pagenb; int prevdist; // Starting value and increment of count of items to be extracted const int pagesize = 50; int maxitem, it = 0, i; struct item_data *items; struct fibheap* fh = fh_makekeyheap(); int cnt = 0; struct table_data *td; struct widget *wl,*wt; char buffer[32]; struct poi_param *paramnew; struct attr route; if(data) { param = data; } else { param = g_new0(struct poi_param,1); param_free=1; } if (navit_get_attr(this->nav, attr_route, &route, NULL)) { struct attr route_status; if (!route_get_attr(route.u.route, attr_route_status, &route_status, NULL) || (route_status.u.num != route_status_path_done_new && route_status.u.num != route_status_path_done_incremental)) route.u.route=NULL; } else route.u.route=NULL; dist=10000*(param->dist+1); isel = param->sel? &selectors[param->selnb]: NULL; pagenb = param->pagenb; prevdist=param->dist*10000; maxitem = pagesize*(pagenb+1); items= g_new0( struct item_data, maxitem); dbg(2, "Params: sel = %i, selnb = %i, pagenb = %i, dist = %i, filterstr = %s, isAddressFilter= %d\n", param->sel, param->selnb, param->pagenb, param->dist, param->filterstr, param->isAddressFilter); wb=gui_internal_menu(this, isel ? isel->name : _("POIs")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); if (!isel && !param->filter) gui_internal_widget_append(w, gui_internal_cmd_pois_selector(this,&wm->c,pagenb)); w2=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, w2); sel=map_selection_rect_new(&wm->c,dist*transform_scale(abs(wm->c.y)+dist*1.5),18); center.x=wm->c.x; center.y=wm->c.y; h=mapset_open(navit_get_mapset(this->nav)); while ((m=mapset_next(h, 1))) { selm=map_selection_dup_pro(sel, pro, map_projection(m)); mr=map_rect_new(m, selm); dbg(2,"mr=%p\n", mr); if (mr) { while ((item=map_rect_get_item(mr))) { if (gui_internal_cmd_pois_item_selected(param, item) && item_coord_get_pro(item, &c, 1, pro) && coord_rect_contains(&sel->u.c_rect, &c) && (idist=transform_distance(pro, ¢er, &c)) < dist) { struct item_data *data; struct attr attr; char *label; item_attr_rewind(item); if (item->type==type_house_number) { label=gui_internal_compose_item_address_string(item); } else if (item_attr_get(item, attr_label, &attr)) { label=g_strdup(attr.u.str); // Buildings which label is equal to addr:housenumber value // are duplicated by item_house_number. Don't include such // buildings into the list. This is true for OSM maps created with // maptool patched with #859 latest patch. // FIXME: For non-OSM maps, we probably would better don't skip these items. if(item->type==type_poly_building && item_attr_get(item, attr_house_number, &attr) ) { if(strcmp(label,attr.u.str)==0) { g_free(label); continue; } } } else { label=g_strdup(""); } if(it>=maxitem) { data = fh_extractmin(fh); g_free(data->label); data->label=NULL; } else { data = &items[it++]; } data->label=label; data->item = *item; data->c = c; data->dist = idist; // Key expression is a workaround to fight // probable heap collisions when two objects // are at the same distance. But it destroys // right order of POIs 2048 km away from cener // and if table grows more than 1024 rows. fh_insertkey(fh, -((idist<<10) + cnt++), data); if (it == maxitem) dist = (-fh_minkey(fh))>>10; } } map_rect_destroy(mr); } map_selection_destroy(selm); } map_selection_destroy(sel); mapset_close(h); wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); td=wtable->data; gui_internal_widget_append(w2,wtable); // Move items from heap to the table for(i=0;;i++) { int key = fh_minkey(fh); struct item_data *data = fh_extractmin(fh); if (data == NULL) { dbg(2, "Empty heap: maxitem = %i, it = %i, dist = %i\n", maxitem, it, dist); break; } dbg(2, "dist1: %i, dist2: %i\n", data->dist, (-key)>>10); if(i==(it-pagesize*pagenb) && data->dist>prevdist) prevdist=data->dist; wi=gui_internal_cmd_pois_item(this, ¢er, &data->item, &data->c, route.u.route, data->dist, data->label); wi->c.x=data->c.x; wi->c.y=data->c.y; wi->c.pro=pro; wi->background=this->background; row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); gui_internal_widget_append(row,wi); row->datai=data->dist; gui_internal_widget_prepend(wtable,row); g_free(data->label); } fh_deleteheap(fh); free(items); // Add an entry for more POI row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); row->datai=100000000; // Really far away for Earth, but won't work for bigger planets. gui_internal_widget_append(wtable,row); wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(row,wl); if (it == maxitem) { paramnew=gui_internal_poi_param_clone(param); paramnew->pagenb++; paramnew->count=it; snprintf(buffer, sizeof(buffer), "Get more (up to %d items)...", (paramnew->pagenb+1)*pagesize); wt=gui_internal_label_new(this, buffer); gui_internal_widget_append(wl, wt); wt->func=gui_internal_cmd_pois_more; wt->data=paramnew; wt->data_free=gui_internal_poi_param_free; wt->state |= STATE_SENSITIVE; wt->c = wm->c; } else { static int dist[]={1,5,10,0}; wt=gui_internal_label_new(this, "Set distance to"); gui_internal_widget_append(wl, wt); for(i=0;dist[i];i++) { paramnew=gui_internal_poi_param_clone(param); paramnew->dist+=dist[i]; paramnew->count=it; snprintf(buffer, sizeof(buffer), " %i ", 10*(paramnew->dist+1)); wt=gui_internal_label_new(this, buffer); gui_internal_widget_append(wl, wt); wt->func=gui_internal_cmd_pois_more; wt->data=paramnew; wt->data_free=gui_internal_poi_param_free; wt->state |= STATE_SENSITIVE; wt->c = wm->c; } wt=gui_internal_label_new(this, "km."); gui_internal_widget_append(wl, wt); } // Rendering now is needed to have table_data->bottomrow filled in. gui_internal_menu_render(this); td=wtable->data; if(td->bottom_row!=NULL) { #if 0 while(((struct widget*)td->bottom_row->data)->datai<=prevdist && (td->next_button->state & STATE_SENSITIVE)) { gui_internal_table_button_next(this, td->next_button, NULL); } #else int firstrow=g_list_index(wtable->children, td->top_row->data); while(firstrow>=0) { int currow=g_list_index(wtable->children, td->bottom_row->data) - firstrow; if(currow<0) { dbg(0,"Can't find bottom row in children list. Stop paging.\n"); break; } if(currow>=param->count) break; if(!(td->scroll_buttons.next_button->state & STATE_SENSITIVE)) { dbg(0,"Reached last page but item %i not found. Stop paging.\n",param->count); break; } gui_internal_table_button_next(this, td->scroll_buttons.next_button, NULL); } #endif } gui_internal_menu_render(this); if(param_free) g_free(param); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_poi.h000066400000000000000000000030001221777731700244120ustar00rootroot00000000000000 /** * POI search/filtering parameters. * */ struct poi_param { /** * =1 if selnb is defined, 0 otherwize. */ unsigned char sel; /** * Index to struct selector selectors[], shows what type of POIs is defined. */ unsigned char selnb; /** * Page number to display. */ unsigned char pagenb; /** * Radius (number of 10-kilometer intervals) to search for POIs. */ unsigned char dist; /** * Should filter phrase be compared to postal address of the POI. * =1 - address filter, =0 - name filter */ unsigned char isAddressFilter; /** * Filter string, casefold()ed and divided into substrings at the spaces, which are replaced by ASCII 0*. */ char *filterstr; /** * list of pointers to individual substrings of filterstr. */ GList *filter; /** * Number of POIs in this list */ int count; }; /* prototypes */ struct coord; struct gui_priv; struct item; struct poi_param; struct widget; void gui_internal_poi_param_free(void *p); void gui_internal_poi_param_set_filter(struct poi_param *param, char *text); struct widget *gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, struct route *route, int dist, char *name); char *gui_internal_compose_item_address_string(struct item *item); void gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_priv.h000066400000000000000000000174401221777731700246200ustar00rootroot00000000000000/** * @brief A structure to store configuration values. * * This structure stores configuration values for how gui elements in the internal GUI * should be drawn. */ struct gui_config_settings { /** * The base size (in fractions of a point) to use for text. */ int font_size; /** * The size (in pixels) that xs style icons should be scaled to. * This icon size is typically used in various lists and should be set to value which allows a list row to be easily cliked or dragged. */ int icon_xs; /** * The size (in pixels) that s style icons (small) should be scaled to, used for the menu top row icons */ int icon_s; /** * The size (in pixels) that l style icons should be scaled to, used for icons defined in the menu html */ int icon_l; /** * The default amount of spacing (in pixels) to place between GUI elements. */ int spacing; }; struct route_data { struct widget * route_table; int route_showing; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct gui_priv { struct navit *nav; struct attr self; struct window *win; struct graphics *gra; struct graphics_gc *background; struct graphics_gc *background2; struct graphics_gc *highlight_background; struct graphics_gc *foreground; struct graphics_gc *text_foreground; struct graphics_gc *text_background; struct color background_color, background2_color, text_foreground_color, text_background_color; int spacing; int font_size; int fullscreen; struct graphics_font *fonts[3]; /** * The size (in pixels) that xs style icons should be scaled to. * This icon size can be too small to click it on some devices. */ int icon_xs; /** * The size (in pixels) that s style icons (small) should be scaled to */ int icon_s; /** * The size (in pixels) that l style icons should be scaled to */ int icon_l; int pressed; struct widget *widgets; int widgets_count; int redraw; struct widget root; struct widget *highlighted,*editable; struct widget *highlighted_menu; struct pcoord clickp, vehiclep; struct attr *click_coord_geo, *position_coord_geo; struct search_list *sl; int ignore_button; int menu_on_map_click; char *on_map_click; int signal_on_map_click; char *country_iso2; int speech; int keyboard; int keyboard_required; /** * The setting information read from the configuration file. * values of -1 indicate no value was specified in the config file. */ struct gui_config_settings config; struct event_idle *idle; struct callback *motion_cb,*button_cb,*resize_cb,*keypress_cb,*window_closed_cb,*idle_cb, *motion_timeout_callback; struct event_timeout *motion_timeout_event; struct point current; struct callback * vehicle_cb; /** * Stores information about the route. */ struct route_data route_data; struct gui_internal_data data; struct callback_list *cbl; int flags; int cols; struct attr osd_configuration; int pitch; int flags_town,flags_street,flags_house_number; int radius; int mouse_button_clicked_on_map; /* html */ char *html_text; int html_depth; struct widget *html_container; int html_skip; char *html_anchor; char *href; int html_anchor_found; struct form *form; struct html { int skip; enum html_tag { html_tag_none, html_tag_a, html_tag_h1, html_tag_html, html_tag_img, html_tag_script, html_tag_form, html_tag_input, html_tag_div, } tag; char *command; char *name; char *href; char *refresh_cond; char *class; int font_size; struct widget *w; struct widget *container; } html[10]; /* gestures */ struct gesture_elem { long long msec; struct point p; } gesture_ring[GESTURE_RINGSIZE]; int gesture_ring_last, gesture_ring_first; int results_map_population; }; struct menu_data { struct widget *search_list; struct widget *keyboard; struct widget *button_bar; struct widget *menu; int keyboard_mode; void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); struct widget *redisplay_widget; char *href; struct attr refresh_callback_obj,refresh_callback; }; struct heightline { struct heightline *next; int height; struct coord_rect bbox; int count; struct coord c[0]; }; struct diagram_point { struct diagram_point *next; struct coord c; }; /* prototypes */ enum flags; struct attr; struct coord; struct coord_geo; struct graphics_image; struct gui_priv; struct heightline; struct item; struct map; struct navit; struct pcoord; struct point; struct vehicle; struct widget; struct graphics_image *image_new_xs(struct gui_priv *this, const char *name); struct graphics_image *image_new_s(struct gui_priv *this, const char *name); struct graphics_image *image_new_l(struct gui_priv *this, const char *name); struct widget *gui_internal_button_navit_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct attr *on, struct attr *off); struct widget *gui_internal_button_map_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct map *map, struct attr *on, struct attr *off, int deflt); void gui_internal_say(struct gui_priv *this, struct widget *w, int questionmark); void gui_internal_back(struct gui_priv *this, struct widget *w, void *data); void gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_main_menu(struct gui_priv *this, struct widget *wm, void *data); struct widget *gui_internal_time_help(struct gui_priv *this); void gui_internal_apply_config(struct gui_priv *this); void gui_internal_select_waypoint(struct gui_priv *this, const char *title, const char *hint, struct widget *wm_, void (*cmd)(struct gui_priv *priv, struct widget *widget, void *data), void *data); void gui_internal_call_linked_on_finish(struct gui_priv *this, struct widget *wm, void *data); char *removecase(char *s); void gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, const char *name, int flags); void gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_keypress_do(struct gui_priv *this, char *key); char *gui_internal_cmd_match_expand(char *pattern, struct attr **in); int gui_internal_set(char *remove, char *add); void gui_internal_cmd_map_download(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_menu_vehicle_settings(struct gui_priv *this, struct vehicle *v, char *name); void gui_internal_cmd_vehicle_settings(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_evaluate(struct gui_priv *this, const char *command); void gui_internal_enter(struct gui_priv *this, int ignore); void gui_internal_leave(struct gui_priv *this); void gui_internal_set_click_coord(struct gui_priv *this, struct point *p); void gui_internal_enter_setup(struct gui_priv *this); void gui_internal_cmd_menu(struct gui_priv *this, int ignore, char *href); void gui_internal_cmd_log_clicked(struct gui_priv *this, struct widget *widget, void *data); void gui_internal_check_exit(struct gui_priv *this); void gui_internal_cmd_enter_coord_clicked(struct gui_priv *this, struct widget *widget, void *data); int line_intersection(struct coord *a1, struct coord *a2, struct coord *b1, struct coord *b2, struct coord *res); struct heightline *item_get_heightline(struct item *item); void gui_internal_route_update(struct gui_priv *this, struct navit *navit, struct vehicle *v); void gui_internal_route_screen_free(struct gui_priv *this_, struct widget *w); void gui_internal_populate_route_table(struct gui_priv *this, struct navit *navit); void plugin_init(void); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_search.c000066400000000000000000000421611221777731700250760ustar00rootroot00000000000000#include #include #include "config.h" #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "event.h" #include "search.h" #include "country.h" #include "track.h" #include "linguistics.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_search.h" static void gui_internal_search_country(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_prune_menu_count(this, 1, 0); gui_internal_search(this,_("Country"),"Country",0); } static void gui_internal_search_town(struct gui_priv *this, struct widget *wm, void *data) { if (this->sl) search_list_select(this->sl, attr_country_all, 0, 0); g_free(this->country_iso2); this->country_iso2=NULL; gui_internal_search(this,_("Town"),"Town",0); } static void gui_internal_search_street(struct gui_priv *this, struct widget *widget, void *data) { search_list_select(this->sl, attr_town_or_district_name, 0, 0); gui_internal_search(this,_("Street"),"Street",0); } static void gui_internal_search_house_number(struct gui_priv *this, struct widget *widget, void *data) { search_list_select(this->sl, attr_street_name, 0, 0); gui_internal_search(this,_("House number"),"House number",0); } void gui_internal_search_idle_end(struct gui_priv *this) { if (this->idle) { event_remove_idle(this->idle); this->idle=NULL; } if (this->idle_cb) { callback_destroy(this->idle_cb); this->idle_cb=NULL; } } static int gui_internal_search_cmp(gconstpointer _a, gconstpointer _b) { struct widget *a=(struct widget *)_a, *b=(struct widget *)_b; char *sa,*sb; int r; if(!b) if((!a || a->type!=widget_table_row || !a->text) && (!b || b->type!=widget_table_row || !b->text)) return 0; if(!a || a->type!=widget_table_row || !a->text) return -1; if(!b || b->type!=widget_table_row || !b->text) return 1; r=a->datai-b->datai; if(r<0) return -1; if(r>0) return 1; sa=removecase(a->text); sb=removecase(b->text); r=strcmp(sa,sb); dbg(1,"%s %s %d\n",sa,sb,r); g_free(sa); g_free(sb); return r; } static char * postal_str(struct search_list_result *res, int level) { char *ret=NULL; if (res->town->common.postal) ret=res->town->common.postal; if (res->town->common.postal_mask) ret=res->town->common.postal_mask; if (level == 1) return ret; if (res->street->common.postal) ret=res->street->common.postal; if (res->street->common.postal_mask) ret=res->street->common.postal_mask; if (level == 2) return ret; if (res->house_number->common.postal) ret=res->house_number->common.postal; if (res->house_number->common.postal_mask) ret=res->house_number->common.postal_mask; return ret; } static char * get_string_from_attr_list(struct attr **attrs, enum attr_type type, char *dflt) { struct attr attr; if(attr_generic_get_attr(attrs,NULL,type,&attr,NULL)) return attr.u.str; else return dflt; } static char * district_str(struct search_list_result *res, int level, enum attr_type district, char *dflt) { char *ret=dflt; ret=get_string_from_attr_list(res->town->common.attrs, district, ret); if (level == 1) return ret; ret=get_string_from_attr_list(res->street->common.attrs, district, ret); if (level == 2) return ret; ret=get_string_from_attr_list(res->house_number->common.attrs, district, ret); return ret; } static char * town_str(struct search_list_result *res, int level, int flags) { char *town=district_str(res, level,attr_town_name,""); char *district=district_str(res, level,attr_district_name,NULL); char *postal=postal_str(res, level); char *postal_sep=" "; char *district_begin=" ("; char *district_end=")"; char *county_sep = ", Co. "; char *county = res->town->common.county_name; if (!postal) postal_sep=postal=""; if (!district || (flags & 1)) district_begin=district_end=district=""; if (!county) county_sep=county=""; if(level==1 ) { if(flags & 2) { int n=0; char *s[10]={NULL}; s[n]=district_str(res, level, attr_state_name, NULL); if(s[n]) n++; s[n]=district_str(res, level, attr_county_name, NULL); if(s[n]) n++; s[n]=district_str(res, level, attr_municipality_name, NULL); if(s[n]) n++; return g_strjoinv(", ",s); } county=county_sep=""; } return g_strdup_printf("%s%s%s%s%s%s%s%s", postal, postal_sep, town, district_begin, district, district_end, county_sep, county); } static void gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) { char *text=NULL,*text2=NULL,*name=NULL, *wcname=NULL; struct search_list_result *res; struct widget *wc; struct item *item=NULL; GList *l; static char possible_keys[256]=""; struct widget *wi=NULL; struct widget *wr, *wb; res=search_list_get_result(this->sl); if (res) { gchar* trunk_name = NULL; struct widget *menu=g_list_last(this->root.children)->data; wi=gui_internal_find_widget(menu, NULL, STATE_EDIT); if (wi) { if (! strcmp(wm_name,"Town")) trunk_name = g_strrstr(res->town->common.town_name, wi->text); if (! strcmp(wm_name,"Street")) { name=res->street->name; if (name) trunk_name = g_strrstr(name, wi->text); else trunk_name = NULL; } if (trunk_name) { char next_char = trunk_name[strlen(wi->text)]; int i; int len = strlen(possible_keys); for(i = 0; (itext)]; possible_keys[len+1]='\0'; } dbg(1,"%s %s possible_keys:%s \n", wi->text, res->town->common.town_name, possible_keys); } } else { dbg(0, "Unable to find widget"); } } if (! res) { struct menu_data *md; gui_internal_search_idle_end(this); md=gui_internal_menu_data(this); if (md && md->keyboard && !(this->flags & 2048)) { GList *lk=md->keyboard->children; graphics_draw_mode(this->gra, draw_mode_begin); while (lk) { struct widget *child=lk->data; GList *lk2=child->children; while (lk2) { struct widget *child_=lk2->data; lk2=g_list_next(lk2); if (child_->data && strcmp("\b", child_->data)) { // FIXME don't disable special keys if (strlen(possible_keys) == 0) child_->state|= STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SENSITIVE|STATE_CLEAR ; else if (g_strrstr(possible_keys, child_->data)!=NULL ) { child_->state|= STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SENSITIVE|STATE_CLEAR ; } else { child_->state&= ~(STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SELECTED) ; } gui_internal_widget_render(this,child_); } } lk=g_list_next(lk); } gui_internal_widget_render(this,md->keyboard); graphics_draw_mode(this->gra, draw_mode_end); } possible_keys[0]='\0'; return; } if (! strcmp(wm_name,"Country")) { name=res->country->name; item=&res->country->common.item; text=g_strdup_printf("%s", res->country->name); } if (! strcmp(wm_name,"Town")) { item=&res->town->common.item; name=res->town->common.town_name; text=town_str(res, 1, 0); text2=town_str(res, 1, 2); } if (! strcmp(wm_name,"Street")) { name=res->street->name; item=&res->street->common.item; text=g_strdup(res->street->name); text2=town_str(res, 2, 1); } if (! strcmp(wm_name,"House number")) { name=res->house_number->house_number; text=g_strdup_printf("%s, %s", name, res->street->name); text2=town_str(res, 3, 0); wcname=g_strdup(text); } if(!wcname) wcname=g_strdup(name); dbg(1,"res->country->flag=%s\n", res->country->flag); wr=gui_internal_widget_table_row_new(this, gravity_left|orientation_horizontal|flags_fill); if (!text2) wr->text=g_strdup(text); else wr->text=g_strdup_printf("%s %s",name,text2); if (! strcmp(wm_name,"House number") && !res->street->name) { wr->datai=2048; } else if(name) { int i; char *folded_name=linguistics_casefold(name); char *folded_query=linguistics_casefold(wi->text); wr->datai=1024; for(i=0;wi && i<3 ;i++) { char *exp=linguistics_expand_special(folded_name,i); char *p; if(!exp) continue; if(!strcmp(exp,folded_query)) { dbg(1,"exact match for the whole string %s\n", exp); wr->datai=0; g_free(exp); break; } if((p=strstr(exp,folded_query))!=NULL) { p+=strlen(folded_query); if(!*p||strchr(LINGUISTICS_WORD_SEPARATORS_ASCII,*p)) { dbg(1,"exact matching word found inside string %s\n",exp); wr->datai=512; } } g_free(exp); } g_free(folded_name); g_free(folded_query); } gui_internal_widget_insert_sorted(search_list, wr, gui_internal_search_cmp); if(text2) { wc=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, wc); gui_internal_widget_append(wc, gui_internal_image_new(this, image_new_xs(this, res->country->flag))); wb=gui_internal_box_new(this, gravity_left_center|orientation_vertical|flags_fill); gui_internal_widget_append(wc, wb); gui_internal_widget_append(wb, gui_internal_label_new(this, text)); gui_internal_widget_append(wb, gui_internal_label_font_new(this, text2, 1)); wc->func=gui_internal_cmd_position; wc->data=param; wc->state |= STATE_SENSITIVE; wc->speech=g_strdup(text); } else { gui_internal_widget_append(wr, wc=gui_internal_button_new_with_callback(this, text, image_new_xs(this, res->country->flag), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_position, param)); } wc->name=wcname; if (res->c) wc->c=*res->c; wc->selection_id=res->id; if (item) wc->item=*item; gui_internal_widget_pack(this, search_list); l=g_list_last(this->root.children); graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_widget_render(this, l->data); graphics_draw_mode(this->gra, draw_mode_end); g_free(text); g_free(text2); } static void gui_internal_search_idle_start(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) { this->idle_cb=callback_new_4(callback_cast(gui_internal_search_idle), this, wm_name, search_list, param); this->idle=event_add_idle(50,this->idle_cb); callback_call_0(this->idle_cb); } static void gui_internal_search_changed(struct gui_priv *this, struct widget *wm, void *data) { GList *l; struct widget *search_list=gui_internal_menu_data(this)->search_list; void *param=(void *)3; int minlen=1; gui_internal_widget_table_clear(this, search_list); if (! strcmp(wm->name,"Country")) param=(void *)4; if (! strcmp(wm->name,"Street")) param=(void *)5; if (! strcmp(wm->name,"House number")) param=(void *)6; dbg(1,"%s now '%s'\n", wm->name, wm->text); gui_internal_search_idle_end(this); if (wm->text && g_utf8_strlen(wm->text, -1) >= minlen) { struct attr search_attr; dbg(1,"process\n"); if (! strcmp(wm->name,"Country")) search_attr.type=attr_country_all; if (! strcmp(wm->name,"Town")) search_attr.type=attr_town_or_district_name; if (! strcmp(wm->name,"Street")) search_attr.type=attr_street_name; if (! strcmp(wm->name,"House number")) search_attr.type=attr_house_number; search_attr.u.str=wm->text; search_list_search(this->sl, &search_attr, 1); gui_internal_search_idle_start(this, wm->name, search_list, param); } l=g_list_last(this->root.children); gui_internal_widget_render(this, l->data); } static void gui_internal_search_list_set_default_country(struct gui_priv *this) { struct attr search_attr, country_name, country_iso2, *country_attr; struct item *item; struct country_search *cs; struct tracking *tracking; struct search_list_result *res; country_attr=country_default(); tracking=navit_get_tracking(this->nav); if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) country_attr=&search_attr; if (country_attr) { cs=country_search_new(country_attr, 0); item=country_search_get_item(cs); if (item && item_attr_get(item, attr_country_name, &country_name)) { search_attr.type=attr_country_all; dbg(1,"country %s\n", country_name.u.str); search_attr.u.str=country_name.u.str; search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); if(this->country_iso2) { g_free(this->country_iso2); this->country_iso2=NULL; } if (item_attr_get(item, attr_country_iso2, &country_iso2)) this->country_iso2=g_strdup(country_iso2.u.str); } country_search_destroy(cs); } else { dbg(0,"warning: no default country found\n"); if (this->country_iso2) { dbg(0,"attempting to use country '%s'\n",this->country_iso2); search_attr.type=attr_country_iso2; search_attr.u.str=this->country_iso2; search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); } } } static void gui_internal_search_list_new(struct gui_priv *this) { struct mapset *ms=navit_get_mapset(this->nav); if (! this->sl) { this->sl=search_list_new(ms); gui_internal_search_list_set_default_country(this); } } void gui_internal_search_list_destroy(struct gui_priv *this) { if (this->sl) { search_list_destroy(this->sl); this->sl=NULL; } } void gui_internal_search(struct gui_priv *this, const char *what, const char *type, int flags) { struct widget *wb,*wk,*w,*wr,*we,*wl,*wnext=NULL; char *country; int keyboard_mode; gui_internal_search_list_new(this); keyboard_mode=2+gui_internal_keyboard_init_mode(this->country_iso2?this->country_iso2:getenv("LANG")); wb=gui_internal_menu(this, what); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wr); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, we); if (!strcmp(type,"Country")) { wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_town")); wnext->func=gui_internal_search_town; } else if (!strcmp(type,"Town")) { if (this->country_iso2) { #if HAVE_API_ANDROID char country_iso2[strlen(this->country_iso2)+1]; strtolower(country_iso2, this->country_iso2); country=g_strdup_printf("country_%s", country_iso2); #else country=g_strdup_printf("country_%s", this->country_iso2); #endif } else country=g_strdup("gui_select_country"); gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, country))); wb->state |= STATE_SENSITIVE; if (flags) wb->func = gui_internal_search_country; else wb->func = gui_internal_back; wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_street")); wnext->func=gui_internal_search_street; g_free(country); } else if (!strcmp(type,"Street")) { gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_town"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_back; wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_house_number")); wnext->func=gui_internal_search_house_number; } else if (!strcmp(type,"House number")) { gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_street"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_back; keyboard_mode=18; } gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); if (wnext) { gui_internal_widget_append(we, wnext); wnext->state |= STATE_SENSITIVE; } wl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1);//gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wr, wl); gui_internal_menu_data(this)->search_list=wl; wk->state |= STATE_EDIT|STATE_EDITABLE; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_search_changed; wk->name=g_strdup(type); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this,keyboard_mode)); gui_internal_menu_render(this); } void gui_internal_search_house_number_in_street(struct gui_priv *this, struct widget *widget, void *data) { dbg(2,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_street_name, 0, 0); search_list_select(this->sl, attr_street_name, widget->selection_id, 1); gui_internal_search(this,_("House number"),"House number",0); } void gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data) { dbg(2,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_town_or_district_name, 0, 0); search_list_select(this->sl, attr_town_or_district_name, widget->selection_id, 1); gui_internal_search(this,_("Street"),"Street",0); } void gui_internal_search_town_in_country(struct gui_priv *this, struct widget *widget) { struct search_list_common *slc; dbg(2,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_country_all, 0, 0); slc=search_list_select(this->sl, attr_country_all, widget->selection_id, 1); if (slc) { g_free(this->country_iso2); this->country_iso2=g_strdup(((struct search_list_country *)slc)->iso2); } gui_internal_search(this,widget->name,"Town",0); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_search.h000066400000000000000000000011071221777731700250760ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct widget; void gui_internal_search_idle_end(struct gui_priv *this); void gui_internal_search_list_destroy(struct gui_priv *this); void gui_internal_search(struct gui_priv *this, const char *what, const char *type, int flags); void gui_internal_search_house_number_in_street(struct gui_priv *this, struct widget *widget, void *data); void gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data); void gui_internal_search_town_in_country(struct gui_priv *this, struct widget *widget); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_widget.c000066400000000000000000001055661221777731700251250ustar00rootroot00000000000000#include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit_nls.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_menu.h" static void gui_internal_scroll_buttons_init(struct gui_priv *this, struct widget *widget, struct scroll_buttons *sb); static void gui_internal_background_render(struct gui_priv *this, struct widget *w) { struct point pnt=w->p; if (w->state & STATE_HIGHLIGHTED) graphics_draw_rectangle(this->gra, this->highlight_background, &pnt, w->w, w->h); else { if (w->background) graphics_draw_rectangle(this->gra, w->background, &pnt, w->w, w->h); } } struct widget * gui_internal_label_font_new(struct gui_priv *this, const char *text, int font) { struct point p[4]; int w=0; int h=0; struct widget *widget=g_new0(struct widget, 1); widget->type=widget_label; widget->font_idx=font; if (text) { widget->text=g_strdup(text); graphics_get_text_bbox(this->gra, this->fonts[font], widget->text, 0x10000, 0x0, p, 0); w=p[2].x-p[0].x; h=p[0].y-p[2].y; } widget->h=h+this->spacing; widget->texth=h; widget->w=w+this->spacing; widget->textw=w; widget->flags=gravity_center; widget->foreground=this->text_foreground; widget->text_background=this->text_background; return widget; } struct widget * gui_internal_label_new(struct gui_priv *this, const char *text) { return gui_internal_label_font_new(this, text, 0); } struct widget * gui_internal_label_new_abbrev(struct gui_priv *this, const char *text, int maxwidth) { struct widget *ret=NULL; char *tmp=g_malloc(strlen(text)+3); const char *p; p=text+strlen(text); while ((p=g_utf8_find_prev_char(text, p)) >= text) { int i=p-text; strcpy(tmp, text); strcpy(tmp+i,".."); ret=gui_internal_label_new(this, tmp); if (ret->w < maxwidth) break; gui_internal_widget_destroy(this, ret); ret=NULL; } if(!ret) ret=gui_internal_label_new(this, ""); g_free(tmp); return ret; } struct widget * gui_internal_image_new(struct gui_priv *this, struct graphics_image *image) { struct widget *widget=g_new0(struct widget, 1); widget->type=widget_image; widget->img=image; if (image) { widget->w=image->width; widget->h=image->height; } return widget; } static void gui_internal_image_render(struct gui_priv *this, struct widget *w) { struct point pnt; gui_internal_background_render(this, w); if (w->img) { pnt=w->p; pnt.x+=w->w/2-w->img->hot.x; pnt.y+=w->h/2-w->img->hot.y; graphics_draw_image(this->gra, this->foreground, &pnt, w->img); } } static void gui_internal_label_render(struct gui_priv *this, struct widget *w) { struct point pnt=w->p; gui_internal_background_render(this, w); if (w->state & STATE_EDIT) graphics_draw_rectangle(this->gra, this->highlight_background, &pnt, w->w, w->h); if (w->text) { char *text; char *startext=(char*)g_alloca(strlen(w->text)+1); text=w->text; if (w->flags2 & 1) { int i; for (i = 0 ; i < strlen(text); i++) startext[i]='*'; startext[i]='\0'; text=startext; } if (w->flags & gravity_right) { pnt.y+=w->h-this->spacing; pnt.x+=w->w-w->textw-this->spacing; graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], text, &pnt, 0x10000, 0x0); } else { pnt.y+=w->h-this->spacing; graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], text, &pnt, 0x10000, 0x0); } } } /** * @brief A text box is a widget that renders a text string containing newlines. * The string will be broken up into label widgets at each newline with a vertical layout. * */ struct widget * gui_internal_text_font_new(struct gui_priv *this, const char *text, int font, enum flags flags) { char *s=g_strdup(text),*s2,*tok; struct widget *ret=gui_internal_box_new(this, flags); s2=s; while ((tok=strtok(s2,"\n"))) { gui_internal_widget_append(ret, gui_internal_label_font_new(this, tok, font)); s2=NULL; } gui_internal_widget_pack(this,ret); g_free(s); return ret; } struct widget * gui_internal_text_new(struct gui_priv *this, const char *text, enum flags flags) { return gui_internal_text_font_new(this, text, 0, flags); } struct widget * gui_internal_button_font_new_with_callback(struct gui_priv *this, const char *text, int font, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) { struct widget *ret=NULL; ret=gui_internal_box_new(this, flags); if (ret) { if (image && !(flags & flags_swap)) gui_internal_widget_append(ret, gui_internal_image_new(this, image)); if (text) gui_internal_widget_append(ret, gui_internal_text_font_new(this, text, font, gravity_center|orientation_vertical)); if (image && (flags & flags_swap)) gui_internal_widget_append(ret, gui_internal_image_new(this, image)); ret->func=func; ret->data=data; if (func) { ret->state |= STATE_SENSITIVE; ret->speech=g_strdup(text); } } return ret; } struct widget * gui_internal_button_new_with_callback(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) { return gui_internal_button_font_new_with_callback(this, text, 0, image, flags, func, data); } struct widget * gui_internal_button_new(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags) { return gui_internal_button_new_with_callback(this, text, image, flags, NULL, NULL); } struct widget * gui_internal_find_widget(struct widget *wi, struct point *p, int flags) { struct widget *ret,*child; GList *l=wi->children; if (p) { if (wi->p.x > p->x ) return NULL; if (wi->p.y > p->y ) return NULL; if ( wi->p.x + wi->w < p->x) return NULL; if ( wi->p.y + wi->h < p->y) return NULL; } if (wi->state & flags) return wi; while (l) { child=l->data; ret=gui_internal_find_widget(child, p, flags); if (ret) { return ret; } l=g_list_next(l); } return NULL; } void gui_internal_highlight_do(struct gui_priv *this, struct widget *found) { if (found == this->highlighted) return; graphics_draw_mode(this->gra, draw_mode_begin); if (this->highlighted) { this->highlighted->state &= ~STATE_HIGHLIGHTED; if (this->root.children && this->highlighted_menu == g_list_last(this->root.children)->data) gui_internal_widget_render(this, this->highlighted); this->highlighted=NULL; this->highlighted_menu=NULL; } if (found) { this->highlighted=found; this->highlighted_menu=g_list_last(this->root.children)->data; this->highlighted->state |= STATE_HIGHLIGHTED; gui_internal_widget_render(this, this->highlighted); dbg(1,"%d,%d %dx%d\n", found->p.x, found->p.y, found->w, found->h); } graphics_draw_mode(this->gra, draw_mode_end); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## void gui_internal_highlight(struct gui_priv *this) { struct widget *menu,*found=NULL; if (this->current.x > -1 && this->current.y > -1) { menu=g_list_last(this->root.children)->data; found=gui_internal_find_widget(menu, &this->current, STATE_SENSITIVE); if (!found) { found=gui_internal_find_widget(menu, &this->current, STATE_EDITABLE); if (found) { if (this->editable && this->editable != found) { this->editable->state &= ~ STATE_EDIT; gui_internal_widget_render(this, this->editable); } found->state |= STATE_EDIT; gui_internal_widget_render(this, found); this->editable=found; found=NULL; } } } gui_internal_highlight_do(this, found); this->motion_timeout_event=NULL; } struct widget * gui_internal_box_new_with_label(struct gui_priv *this, enum flags flags, const char *label) { struct widget *widget=g_new0(struct widget, 1); if (label) widget->text=g_strdup(label); widget->type=widget_box; widget->flags=flags; return widget; } struct widget * gui_internal_box_new(struct gui_priv *this, enum flags flags) { return gui_internal_box_new_with_label(this, flags, NULL); } static void gui_internal_box_render(struct gui_priv *this, struct widget *w) { struct widget *wc; GList *l; gui_internal_background_render(this, w); #if 0 w->border=1; w->foreground=this->foreground; #endif #if 1 if (w->foreground && w->border) { struct point pnt[5]; pnt[0]=w->p; pnt[1].x=pnt[0].x+w->w; pnt[1].y=pnt[0].y; pnt[2].x=pnt[0].x+w->w; pnt[2].y=pnt[0].y+w->h; pnt[3].x=pnt[0].x; pnt[3].y=pnt[0].y+w->h; pnt[4]=pnt[0]; graphics_gc_set_linewidth(w->foreground, w->border ? w->border : 1); graphics_draw_lines(this->gra, w->foreground, pnt, 5); graphics_gc_set_linewidth(w->foreground, 1); } #endif l=w->children; while (l) { wc=l->data; if (!(wc->state & STATE_OFFSCREEN)) gui_internal_widget_render(this, wc); l=g_list_next(l); } if (w->scroll_buttons) gui_internal_widget_render(this, w->scroll_buttons->button_box); } /** * @brief Compute the size and location for the widget. * * */ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) { struct widget *wc; int x0,x=0,y=0,width=0,height=0,owidth=0,oheight=0,expand=0,expandd=1,count=0,rows=0,cols=w->cols ? w->cols : 0; int hb=w->scroll_buttons?w->scroll_buttons->button_box->h:0; GList *l; int orientation=w->flags & 0xffff0000; if (!cols) cols=this->cols; if (!cols) { if ( this->root.w > this->root.h ) cols=3; else cols=2; width=0; height=0; } /** * count the number of children */ l=w->children; while (l) { count++; l=g_list_next(l); } if (orientation == orientation_horizontal_vertical && count <= cols) orientation=orientation_horizontal; switch (orientation) { case orientation_horizontal: /** * For horizontal orientation: * pack each child and find the largest height and * compute the total width. x spacing (spx) is considered * * If any children want to be expanded * we keep track of this */ l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); if (height < wc->h) height=wc->h; width+=wc->w; if (wc->flags & flags_expand) expand+=wc->w ? wc->w : 1; l=g_list_next(l); if (l) width+=w->spx; } owidth=width; if (expand && w->w) { expandd=w->w-width+expand; owidth=w->w; } else expandd=expand=1; break; case orientation_vertical: /** * For vertical layouts: * We pack each child and compute the largest width and * the total height. y spacing (spy) is considered * * If the expand flag is set then teh expansion amount * is computed. */ l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); if (width < wc->w) width=wc->w; height+=wc->h; if (wc->flags & flags_expand) expand+=wc->h ? wc->h : 1; l=g_list_next(l); if (l) height+=w->spy; } oheight=height; if (expand && w->h) { expandd=w->h-hb-height+expand; oheight=w->h-hb; } else expandd=expand=1; break; case orientation_horizontal_vertical: /** * For horizontal_vertical orientation * pack the children. * Compute the largest height and largest width. * Layout the widgets based on having the * number of columns specified by (cols) */ count=0; l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); if (height < wc->h) height=wc->h; if (width < wc->w) width=wc->w; l=g_list_next(l); count++; } if (count < cols) cols=count; rows=(count+cols-1)/cols; width*=cols; height*=rows; width+=w->spx*(cols-1); height+=w->spy*(rows-1); owidth=width; oheight=height; expandd=expand=1; break; default: /** * No orientation was specified. * width and height are both 0. * The width & height of this widget * will be used. */ if(!w->w && !w->h) dbg(0,"Warning width and height of a widget are 0"); break; } if (! w->w && ! w->h) { w->w=w->bl+w->br+width; w->h=w->bt+w->bb+height+hb; w->packed=1; } #if 0 if (expand < 100) expand=100; #endif /** * At this stage the width and height of this * widget has been computed. * We now make a second pass assigning heights, * widths and coordinates to each child widget. */ if (w->flags & gravity_left) x=w->p.x+w->bl; if (w->flags & gravity_xcenter) x=w->p.x+w->w/2-owidth/2; if (w->flags & gravity_right) x=w->p.x+w->w-w->br-owidth; if (w->flags & gravity_top) y=w->p.y+w->bt; if (w->flags & gravity_ycenter) y=w->p.y+(w->h-hb)/2-oheight/2; if (w->flags & gravity_bottom) y=w->p.y+(w->h-hb)-w->bb-oheight; l=w->children; switch (orientation) { case orientation_horizontal: l=w->children; while (l) { wc=l->data; wc->p.x=x; if (wc->flags & flags_fill) wc->h=w->h-hb; if (wc->flags & flags_expand) { if (! wc->w) wc->w=1; wc->w=wc->w*expandd/expand; } if (w->flags & gravity_top) wc->p.y=y; if (w->flags & gravity_ycenter) wc->p.y=y-wc->h/2; if (w->flags & gravity_bottom) wc->p.y=y-wc->h; x+=wc->w+w->spx; l=g_list_next(l); } break; case orientation_vertical: l=w->children; while (l) { wc=l->data; wc->p.y=y; if (wc->flags & flags_fill) wc->w=w->w; if (wc->flags & flags_expand) { if (! wc->h) wc->h=1; wc->h=wc->h*expandd/expand; } if (w->flags & gravity_left) wc->p.x=x; if (w->flags & gravity_xcenter) wc->p.x=x-wc->w/2; if (w->flags & gravity_right) wc->p.x=x-wc->w; #if 0 if (w->flags & flags_scrolly) dbg(0,"%d - %d vs %d - %d\n",y,y+wc->h,w->p.y,w->p.y+w->h-hb); if (y+wc->h > w->p.y+w->h-hb || y+wc->h < w->p.y) wc->state |= STATE_OFFSCREEN; else wc->state &= ~STATE_OFFSCREEN; #endif y+=wc->h+w->spy; l=g_list_next(l); } break; case orientation_horizontal_vertical: l=w->children; x0=x; count=0; width/=cols; height/=rows; while (l) { wc=l->data; wc->p.x=x; wc->p.y=y; if (wc->flags & flags_fill) { wc->w=width; wc->h=height; } if (w->flags & gravity_left) wc->p.x=x; if (w->flags & gravity_xcenter) wc->p.x=x+(width-wc->w)/2; if (w->flags & gravity_right) wc->p.x=x+width-wc->w; if (w->flags & gravity_top) wc->p.y=y; if (w->flags & gravity_ycenter) wc->p.y=y+(height-wc->h)/2; if (w->flags & gravity_bottom) wc->p.y=y-height-wc->h; x+=width; if (++count == cols) { count=0; x=x0; y+=height; } l=g_list_next(l); } break; default: break; } if ((w->flags & flags_scrolly) && y > w->h+w->p.y && !w->scroll_buttons) { w->scroll_buttons=g_new0(struct scroll_buttons, 1); gui_internal_scroll_buttons_init(this, w, w->scroll_buttons); w->scroll_buttons->button_box->w=w->w; w->scroll_buttons->button_box->p.x=w->p.x; w->scroll_buttons->button_box->p.y=w->p.y+w->h-w->scroll_buttons->button_box->h; gui_internal_widget_pack(this, w->scroll_buttons->button_box); dbg(0,"needs buttons %d vs %d\n",y,w->h); gui_internal_box_pack(this, w); return; } /** * Call pack again on each child, * the child has now had its size and coordinates * set so they can repack their children. */ l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); l=g_list_next(l); } } void gui_internal_widget_reset_pack(struct gui_priv *this, struct widget *w) { struct widget *wc; GList *l; l=w->children; while (l) { wc=l->data; gui_internal_widget_reset_pack(this, wc); l=g_list_next(l); } if (w->packed) { w->w=0; w->h=0; } } void gui_internal_widget_append(struct widget *parent, struct widget *child) { if (! child) return; if (! child->background) child->background=parent->background; parent->children=g_list_append(parent->children, child); child->parent=parent; } void gui_internal_widget_prepend(struct widget *parent, struct widget *child) { if (! child->background) child->background=parent->background; parent->children=g_list_prepend(parent->children, child); child->parent=parent; } void gui_internal_widget_insert_sorted(struct widget *parent, struct widget *child, GCompareFunc func) { if (! child->background) child->background=parent->background; parent->children=g_list_insert_sorted(parent->children, child, func); child->parent=parent; } void gui_internal_widget_children_destroy(struct gui_priv *this, struct widget *w) { GList *l; struct widget *wc; l=w->children; while (l) { wc=l->data; gui_internal_widget_destroy(this, wc); l=g_list_next(l); } g_list_free(w->children); w->children=NULL; } void gui_internal_widget_destroy(struct gui_priv *this, struct widget *w) { gui_internal_widget_children_destroy(this, w); g_free(w->command); g_free(w->speech); g_free(w->text); if (w->img) graphics_image_free(this->gra, w->img); if (w->prefix) g_free(w->prefix); if (w->name) g_free(w->name); if (w->data_free) w->data_free(w->data); if (w->cb && w->remove_cb) w->remove_cb(w->instance, w->cb); if (w==this->highlighted) this->highlighted=NULL; if(w->wfree) w->wfree(this,w); else g_free(w); } void gui_internal_widget_render(struct gui_priv *this, struct widget *w) { if(w->p.x > this->root.w || w->p.y > this->root.h) return; switch (w->type) { case widget_box: gui_internal_box_render(this, w); break; case widget_label: gui_internal_label_render(this, w); break; case widget_image: gui_internal_image_render(this, w); break; case widget_table: gui_internal_table_render(this,w); break; default: break; } } void gui_internal_widget_pack(struct gui_priv *this, struct widget *w) { switch (w->type) { case widget_box: gui_internal_box_pack(this, w); break; case widget_table: gui_internal_table_pack(this,w); default: break; } } struct widget * gui_internal_button_label(struct gui_priv *this, const char *label, int mode) { struct widget *wl,*wlb; struct widget *wb=gui_internal_menu_data(this)->button_bar; wlb=gui_internal_box_new(this, gravity_right_center|orientation_vertical); wl=gui_internal_label_new(this, label); wlb->border=1; wlb->foreground=this->text_foreground; wlb->bl=20; wlb->br=20; wlb->bb=6; wlb->bt=6; gui_internal_widget_append(wlb, wl); if (mode == 1) gui_internal_widget_prepend(wb, wlb); if (mode == -1) gui_internal_widget_append(wb, wlb); return wlb; } static void gui_internal_scroll_buttons_init(struct gui_priv *this, struct widget *widget, struct scroll_buttons *sb) { sb->next_button = gui_internal_button_new_with_callback(this, _("Next"), image_new_xs(this, "gui_arrow_right"), gravity_center|orientation_horizontal|flags_swap, gui_internal_table_button_next, widget); sb->prev_button = gui_internal_button_new_with_callback(this, _("Prev"), image_new_xs(this, "gui_arrow_left"), gravity_center|orientation_horizontal, gui_internal_table_button_prev, widget); sb->button_box=gui_internal_box_new(this, gravity_center|orientation_horizontal); gui_internal_widget_append(sb->button_box, sb->prev_button); gui_internal_widget_append(sb->button_box, sb->next_button); sb->button_box->bl=this->spacing; gui_internal_widget_pack(this,sb->button_box); } /** * @brief Creates a new table widget. * * Creates and returns a new table widget. This function will * setup next/previous buttons as children. * * @param this The graphics context. * @param flags widget sizing flags. * @returns The newly created widget */ struct widget * gui_internal_widget_table_new(struct gui_priv * this, enum flags flags, int buttons) { struct widget * widget = g_new0(struct widget,1); struct table_data * data = NULL; widget->type=widget_table; widget->flags=flags; widget->state=STATE_SCROLLABLE; widget->data=g_new0(struct table_data,1); widget->data_free=gui_internal_table_data_free; // We have to set background here explicitly // because it will be used by inner elements created later in this // function (navigation buttons). Else that elements won't have // any background. widget->background=this->background; data = (struct table_data*)widget->data; if (buttons) { gui_internal_scroll_buttons_init(this, widget, &data->scroll_buttons); gui_internal_widget_append(widget, data->scroll_buttons.button_box); } return widget; } /** * @brief Clears all the rows from the table. * This function removes all rows from a table. * New rows can later be added to the table. */ void gui_internal_widget_table_clear(struct gui_priv * this,struct widget * table) { GList * iter; struct table_data * table_data = (struct table_data* ) table->data; iter = table->children; while(iter ) { if(iter->data != table_data->scroll_buttons.button_box) { struct widget * child = (struct widget*)iter->data; gui_internal_widget_destroy(this,child); if(table->children == iter) { table->children = g_list_remove(iter,iter->data); iter=table->children; } else iter = g_list_remove(iter,iter->data); } else { iter = g_list_next(iter); } } table_data->top_row=NULL; table_data->bottom_row=NULL; } /** * @brief Move GList pointer to the next table row, skipping other table children (button box, for example). * @param row GList pointer into the children list * @returns GList pointer to the next row in the children list, or NULL if there are no any rows left. */ GList * gui_internal_widget_table_next_row(GList * row) { while((row=g_list_next(row))!=NULL) { if(row->data && ((struct widget *)(row->data))->type == widget_table_row) break; } return row; } /** * @brief Move GList pointer to the previous table row, skipping other table children (button box, for example). * @param row GList pointer into the children list * @returns GList pointer to the previous row in the children list, or NULL if there are no any rows left. */ GList * gui_internal_widget_table_prev_row(GList * row) { while((row=g_list_previous(row))!=NULL) { if(row->data && ((struct widget *)(row->data))->type == widget_table_row) break; } return row; } /** * @brief Move GList pointer to the first table row, skipping other table children (button box, for example). * @param row GList pointer into the children list * @returns GList pointer to the first row in the children list, or NULL if table is empty. */ GList * gui_internal_widget_table_first_row(GList * row) { if(!row) return NULL; if(row->data && ((struct widget *)(row->data))->type == widget_table_row) return row; return gui_internal_widget_table_next_row(row); } /** * @brief Get GList pointer to the table row drawn on the top of the screen. * @returns GList pointer to the top row in the children list, or NULL. */ GList * gui_internal_widget_table_top_row(struct gui_priv *this, struct widget * table) { if(table && table->type==widget_table) { struct table_data *d=table->data; return gui_internal_widget_table_first_row(d->top_row); } return NULL; } /** * @brief Set internal top row pointer of the table to point to a given row widget. * @returns GList pointer to the top row in the children list of the table. */ GList * gui_internal_widget_table_set_top_row(struct gui_priv *this, struct widget * table, struct widget *row) { if(table && table->type==widget_table) { struct table_data *d=table->data; d->top_row=table->children; while(d->top_row && d->top_row->data!=row) d->top_row=g_list_next(d->top_row); if(!d->top_row) d->top_row=gui_internal_widget_table_first_row(table->children); return d->top_row; } return NULL; } /** * Creates a new table_row widget. * @param this The graphics context * @param flags Sizing flags for the row * @returns The new table_row widget. */ struct widget * gui_internal_widget_table_row_new(struct gui_priv * this, enum flags flags) { struct widget * widget = g_new0(struct widget,1); widget->type=widget_table_row; widget->flags=flags; return widget; } /** * @brief Computes the column dimensions for the table. * * @param w The table widget to compute dimensions for. * * This function examines all of the rows and columns for the table w * and returns a list (GList) of table_column_desc elements that * describe each column of the table. * * The caller is responsible for freeing the returned list. */ static GList * gui_internal_compute_table_dimensions(struct gui_priv * this,struct widget * w) { GList * column_desc = NULL; GList * current_desc=NULL; GList * cur_row = w->children; struct widget * cur_row_widget=NULL; GList * cur_column=NULL; struct widget * cell_w=NULL; struct table_column_desc * current_cell=NULL; struct table_data * table_data=NULL; int height=0; int width=0; int total_width=0; int column_count=0; /** * Scroll through the the table and * 1. Compute the maximum width + height of each column across all rows. */ table_data = (struct table_data*) w->data; for(cur_row=w->children; cur_row ; cur_row = g_list_next(cur_row) ) { cur_row_widget = (struct widget*) cur_row->data; current_desc = column_desc; if(cur_row_widget == table_data->scroll_buttons.button_box) { continue; } column_count=0; for(cur_column = cur_row_widget->children; cur_column; cur_column=g_list_next(cur_column)) { cell_w = (struct widget*) cur_column->data; gui_internal_widget_pack(this,cell_w); if(current_desc == 0) { current_cell = g_new0(struct table_column_desc,1); column_desc = g_list_append(column_desc,current_cell); current_desc = g_list_last(column_desc); current_cell->height=cell_w->h; current_cell->width=cell_w->w; total_width+=cell_w->w; } else { current_cell = current_desc->data; height = cell_w->h; width = cell_w->w; if(current_cell->height < height ) { current_cell->height = height; } if(current_cell->width < width) { total_width += (width-current_cell->width); current_cell->width = width; } current_desc = g_list_next(current_desc); } column_count++; }/* column loop */ } /*row loop */ /** * If the width of all columns is less than the width off * the table expand each cell proportionally. * */ if(total_width+(this->spacing*column_count) < w->w ) { for(current_desc=column_desc; current_desc; current_desc=g_list_next(current_desc)) { current_cell = (struct table_column_desc*) current_desc->data; current_cell->width= ( (current_cell->width+this->spacing)/(float)total_width) * w->w ; } } return column_desc; } /** * @brief Computes the height and width for the table. * * The height and widht are computed to display all cells in the table * at the requested height/width. * * @param this The graphics context * @param w The widget to pack. * */ void gui_internal_table_pack(struct gui_priv * this, struct widget * w) { int height=0; int width=0; int count=0; GList * column_data = gui_internal_compute_table_dimensions(this,w); GList * current=0; struct table_column_desc * cell_desc=0; struct table_data * table_data = (struct table_data*)w->data; for(current = column_data; current; current=g_list_next(current)) { if(table_data->scroll_buttons.button_box == current->data ) { continue; } cell_desc = (struct table_column_desc *) current->data; width = width + cell_desc->width + this->spacing; if(height < cell_desc->height) { height = cell_desc->height ; } } for(current=w->children; current; current=g_list_next(current)) { if(current->data!= table_data->scroll_buttons.button_box) { count++; } } w->w = width; if(w->w + w->c.x > this->root.w) { w->w = this->root.w - w->c.x; } if(w->h + w->c.y > this->root.h ) { /** * Do not allow the widget to exceed the screen. * */ w->h = this->root.h- w->c.y - height; } if (table_data->scroll_buttons.button_box) { gui_internal_widget_pack(this,table_data->scroll_buttons.button_box); } /** * Deallocate column descriptions. */ g_list_foreach(column_data,(GFunc)g_free,NULL); g_list_free(column_data); } /** * @brief Invalidates coordinates for previosly rendered table widget rows. * * @param table_data Data from the table object. */ void gui_internal_table_hide_rows(struct table_data * table_data) { GList*cur_row; for(cur_row=table_data->top_row; cur_row ; cur_row = g_list_next(cur_row)) { struct widget * cur_row_widget = (struct widget*)cur_row->data; if (cur_row_widget->type!=widget_table_row) continue; cur_row_widget->p.x=0; cur_row_widget->p.y=0; cur_row_widget->w=0; cur_row_widget->h=0; if(cur_row==table_data->bottom_row) break; } } /** * @brief Renders a table widget. * * @param this The graphics context * @param w The table widget to render. */ void gui_internal_table_render(struct gui_priv * this, struct widget * w) { int x; int y; GList * column_desc=NULL; GList * cur_row = NULL; GList * current_desc=NULL; struct table_data * table_data = (struct table_data*)w->data; int is_skipped=0; int is_first_page=1; struct table_column_desc * dim=NULL; dbg_assert(table_data); column_desc = gui_internal_compute_table_dimensions(this,w); if(!column_desc) return; y=w->p.y; gui_internal_table_hide_rows(table_data); /** * Skip rows that are on previous pages. */ cur_row = w->children; if(table_data->top_row && table_data->top_row != w->children && !table_data->scroll_buttons.button_box_hide) { cur_row = table_data->top_row; is_first_page=0; } else { table_data->top_row=NULL; } /** * Loop through each row. Drawing each cell with the proper sizes, * at the proper positions. */ for(table_data->top_row=cur_row; cur_row; cur_row = g_list_next(cur_row)) { int max_height=0, bbox_height=0; struct widget * cur_row_widget; GList * cur_column=NULL; current_desc = column_desc; cur_row_widget = (struct widget*)cur_row->data; x =w->p.x+this->spacing; if(cur_row_widget == table_data->scroll_buttons.button_box ) { continue; } dim = (struct table_column_desc*)current_desc->data; if (table_data->scroll_buttons.button_box && !table_data->scroll_buttons.button_box_hide) bbox_height=table_data->scroll_buttons.button_box->h; if( y + dim->height + bbox_height + this->spacing >= w->p.y + w->h ) { /* * No more drawing space left. */ is_skipped=1; break; } for(cur_column = cur_row_widget->children; cur_column; cur_column=g_list_next(cur_column)) { struct widget * cur_widget = (struct widget*) cur_column->data; dim = (struct table_column_desc*)current_desc->data; cur_widget->p.x=x; cur_widget->w=dim->width; cur_widget->p.y=y; cur_widget->h=dim->height; x=x+cur_widget->w; max_height = dim->height; /* We pack the widget before rendering to ensure that the x and y * coordinates get pushed down. */ gui_internal_widget_pack(this,cur_widget); gui_internal_widget_render(this,cur_widget); if(dim->height > max_height) { max_height = dim->height; } } /* Row object should have its coordinates in actual * state to be able to pass mouse clicks to Column objects */ cur_row_widget->p.x=w->p.x; cur_row_widget->w=w->w; cur_row_widget->p.y=y; cur_row_widget->h=max_height; y = y + max_height; table_data->bottom_row=cur_row; current_desc = g_list_next(current_desc); } if(table_data->scroll_buttons.button_box && (is_skipped || !is_first_page) && !table_data->scroll_buttons.button_box_hide ) { table_data->scroll_buttons.button_box->p.y =w->p.y+w->h-table_data->scroll_buttons.button_box->h - this->spacing; if(table_data->scroll_buttons.button_box->p.y < y ) { table_data->scroll_buttons.button_box->p.y=y; } table_data->scroll_buttons.button_box->p.x = w->p.x; table_data->scroll_buttons.button_box->w = w->w; // table_data->button_box->h = w->h - y; // table_data->next_button->h=table_data->button_box->h; // table_data->prev_button->h=table_data->button_box->h; // table_data->next_button->c.y=table_data->button_box->c.y; // table_data->prev_button->c.y=table_data->button_box->c.y; gui_internal_widget_pack(this,table_data->scroll_buttons.button_box); if(table_data->scroll_buttons.next_button->p.y > w->p.y + w->h + table_data->scroll_buttons.next_button->h) { table_data->scroll_buttons.button_box->p.y = w->p.y + w->h - table_data->scroll_buttons.button_box->h; } if(is_skipped) { table_data->scroll_buttons.next_button->state|= STATE_SENSITIVE; } else { table_data->scroll_buttons.next_button->state&= ~STATE_SENSITIVE; } if(table_data->top_row != w->children) { table_data->scroll_buttons.prev_button->state|= STATE_SENSITIVE; } else { table_data->scroll_buttons.prev_button->state&= ~STATE_SENSITIVE; } gui_internal_widget_render(this,table_data->scroll_buttons.button_box); } /** * Deallocate column descriptions. */ g_list_foreach(column_desc,(GFunc)g_free,NULL); g_list_free(column_desc); } /** * @brief handles the 'next page' table event. * A callback function that is invoked when the 'next page' button is pressed * to advance the contents of a table widget. * * @param this The graphics context. * @param wm The button widget that was pressed. */ void gui_internal_table_button_next(struct gui_priv * this, struct widget * wm, void *data) { struct widget * table_widget=NULL; struct table_data * table_data = NULL; if(wm) table_widget = (struct widget * ) wm->data; else table_widget = data; if(table_widget && table_widget->type==widget_table) table_data = (struct table_data*) table_widget->data; if(table_data) { GList *l=g_list_next(table_data->bottom_row); if(l) { gui_internal_table_hide_rows(table_data); table_data->top_row=l; } } if(wm) wm->state&= ~STATE_HIGHLIGHTED; gui_internal_menu_render(this); } /** * @brief handles the 'previous page' table event. * A callback function that is invoked when the 'previous page' button is pressed * to go back in the contents of a table widget. * * @param this The graphics context. * @param wm The button widget that was pressed. */ void gui_internal_table_button_prev(struct gui_priv * this, struct widget * wm, void *data) { struct widget * table_widget = NULL; struct table_data * table_data = NULL; if(wm) table_widget=(struct widget * ) wm->data; else table_widget=(struct widget * ) data; if(table_widget && table_widget->type==widget_table) table_data = (struct table_data*) table_widget->data; if(table_data) { int bottomy=table_widget->p.y+table_widget->h; int n; GList *top=table_data->top_row; struct widget *w=(struct widget*)top->data; if(table_data->scroll_buttons.button_box->p.y!=0) { bottomy=table_data->scroll_buttons.button_box->p.y; } n=(bottomy-w->p.y)/w->h; while(n-- > 0 && (top=g_list_previous(top))!=NULL); gui_internal_table_hide_rows(table_data); table_data->top_row=top; } if(wm) wm->state&= ~STATE_HIGHLIGHTED; gui_internal_menu_render(this); } /** * @brief deallocates a table_data structure. * */ void gui_internal_table_data_free(void * p) { /** * @note button_box and its children (next_button,prev_button) * have their memory managed by the table itself. */ g_free(p); } navit-0.5.0~svn5643+dfsg.1/navit/gui/internal/gui_internal_widget.h000066400000000000000000000160201221777731700251140ustar00rootroot00000000000000enum gui_internal_reason { gui_internal_reason_click=1, gui_internal_reason_keypress, gui_internal_reason_keypress_finish }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct widget { enum widget_type type; struct graphics_gc *background,*text_background; struct graphics_gc *foreground_frame; struct graphics_gc *foreground; char *text; struct graphics_image *img; /** * A function to be invoked on actions. * @li widget The widget that is receiving the button press. * */ void (*func)(struct gui_priv *priv, struct widget *widget, void *data); enum gui_internal_reason reason; int datai; void *data; /** * @brief A function to deallocate data */ void (*data_free)(void *data); /** * @brief a function that will be called as the widget is being destroyed. * This function can act as a destructor for the widget. It allows for * on deallocation actions to be specified on a per widget basis. * This function will call g_free on the widget (if required). */ void (*wfree) (struct gui_priv *this_, struct widget * w); char *prefix; char *name; char *speech; char *command; struct pcoord c; struct item item; int selection_id; int state; struct point p; int wmin,hmin; int w,h; int textw,texth; int font_idx; int bl,br,bt,bb,spx,spy; int border; int packed; /** * The number of widgets to layout horizontally when doing * a orientation_horizontal_vertical layout */ int cols; enum flags flags; int flags2; void *instance; int (*set_attr)(void *, struct attr *); int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *); void (*remove_cb)(void *, struct callback *cb); struct callback *cb; struct attr on; struct attr off; int deflt; int is_on; int redraw; struct menu_data *menu_data; struct form *form; GList *children; struct widget *parent; struct scroll_buttons *scroll_buttons; }; struct scroll_buttons { /** * Button box should not be displayed if button_box_hide is not zero. */ int button_box_hide; /** * A container box that is the child of the table widget that contains+groups * the next and previous button. */ struct widget * button_box; /** * A button widget to handle 'next page' requests */ struct widget * next_button; /** * A button widget to handle 'previous page' requests. */ struct widget * prev_button; /** * a pointer to the gui context. * This is needed by the free function to destory the buttons. */ struct gui_priv * this; }; /** * @brief A structure to store information about a table. * * The table_data widget stores pointers to extra information needed by the * table widget. * * The table_data structure needs to be freed with data_free along with the widget. * */ struct table_data { /** * A GList pointer into a widget->children list that indicates the row * currently being rendered at the top of the table. */ GList * top_row; /** * A Glist pointer into a widget->children list that indicates the row * currently being rendered at the bottom of the table. */ GList * bottom_row; struct scroll_buttons scroll_buttons; }; /** * A data structure that holds information about a column that makes up a table. * * */ struct table_column_desc { /** * The computed height of a cell in the table. */ int height; /** * The computed width of a cell in the table. */ int width; }; /* prototypes */ enum flags; struct graphics_image; struct gui_priv; struct point; struct table_data; struct widget; struct widget *gui_internal_label_font_new(struct gui_priv *this, const char *text, int font); struct widget *gui_internal_label_new(struct gui_priv *this, const char *text); struct widget *gui_internal_label_new_abbrev(struct gui_priv *this, const char *text, int maxwidth); struct widget *gui_internal_image_new(struct gui_priv *this, struct graphics_image *image); struct widget *gui_internal_text_font_new(struct gui_priv *this, const char *text, int font, enum flags flags); struct widget *gui_internal_text_new(struct gui_priv *this, const char *text, enum flags flags); struct widget *gui_internal_button_font_new_with_callback(struct gui_priv *this, const char *text, int font, struct graphics_image *image, enum flags flags, void (*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); struct widget *gui_internal_button_new_with_callback(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags, void (*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); struct widget *gui_internal_button_new(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags); struct widget *gui_internal_find_widget(struct widget *wi, struct point *p, int flags); void gui_internal_highlight_do(struct gui_priv *this, struct widget *found); void gui_internal_highlight(struct gui_priv *this); struct widget *gui_internal_box_new_with_label(struct gui_priv *this, enum flags flags, const char *label); struct widget *gui_internal_box_new(struct gui_priv *this, enum flags flags); void gui_internal_widget_reset_pack(struct gui_priv *this, struct widget *w); void gui_internal_widget_append(struct widget *parent, struct widget *child); void gui_internal_widget_prepend(struct widget *parent, struct widget *child); void gui_internal_widget_insert_sorted(struct widget *parent, struct widget *child, GCompareFunc func); void gui_internal_widget_children_destroy(struct gui_priv *this, struct widget *w); void gui_internal_widget_destroy(struct gui_priv *this, struct widget *w); void gui_internal_widget_render(struct gui_priv *this, struct widget *w); void gui_internal_widget_pack(struct gui_priv *this, struct widget *w); struct widget *gui_internal_button_label(struct gui_priv *this, const char *label, int mode); struct widget *gui_internal_widget_table_new(struct gui_priv *this, enum flags flags, int buttons); void gui_internal_widget_table_clear(struct gui_priv *this, struct widget *table); GList *gui_internal_widget_table_next_row(GList *row); GList *gui_internal_widget_table_prev_row(GList *row); GList *gui_internal_widget_table_first_row(GList *row); GList *gui_internal_widget_table_top_row(struct gui_priv *this, struct widget *table); GList *gui_internal_widget_table_set_top_row(struct gui_priv *this, struct widget * table, struct widget *row); struct widget *gui_internal_widget_table_row_new(struct gui_priv *this, enum flags flags); void gui_internal_table_pack(struct gui_priv *this, struct widget *w); void gui_internal_table_hide_rows(struct table_data *table_data); void gui_internal_table_render(struct gui_priv *this, struct widget *w); void gui_internal_table_button_next(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_table_button_prev(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_table_data_free(void *p); /* end of prototypes */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/000077500000000000000000000000001221777731700176765ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/CMakeLists.txt000066400000000000000000000023031221777731700224340ustar00rootroot00000000000000file(COPY "skins" DESTINATION ".") add_definitions( -DMODULE=gui_qml ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) QT4_GENERATE_MOC(proxy.h ${CMAKE_CURRENT_BINARY_DIR}/proxy.moc) QT4_GENERATE_MOC(ngqpoint.h ${CMAKE_CURRENT_BINARY_DIR}/ngqpoint.moc) QT4_GENERATE_MOC(searchProxy.h ${CMAKE_CURRENT_BINARY_DIR}/searchProxy.moc) QT4_GENERATE_MOC(bookmarksProxy.h ${CMAKE_CURRENT_BINARY_DIR}/bookmarksProxy.moc) QT4_GENERATE_MOC(vehicleProxy.h ${CMAKE_CURRENT_BINARY_DIR}/vehicleProxy.moc) QT4_GENERATE_MOC(navitProxy.h ${CMAKE_CURRENT_BINARY_DIR}/navitProxy.moc) QT4_GENERATE_MOC(guiProxy.h ${CMAKE_CURRENT_BINARY_DIR}/guiProxy.moc) QT4_GENERATE_MOC(routeProxy.h ${CMAKE_CURRENT_BINARY_DIR}/routeProxy.moc) QT4_GENERATE_MOC(gui_qml.cpp ${CMAKE_CURRENT_BINARY_DIR}/gui_qml.moc) module_add_library(gui_qml gui_qml.cpp ${CMAKE_CURRENT_BINARY_DIR}/proxy.moc ${CMAKE_CURRENT_BINARY_DIR}/ngqpoint.moc ${CMAKE_CURRENT_BINARY_DIR}/searchProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/bookmarksProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/vehicleProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/navitProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/guiProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/routeProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/gui_qml.moc ) navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/Makefile.am000066400000000000000000000015251221777731700217350ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @QT_DECLARATIVE_CFLAGS@ @QT_GUI_CFLAGS@ @QT_XML_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=gui_qml modulegui_LTLIBRARIES = libgui_qml.la libgui_qml_la_SOURCES = proxy.moc proxy.h ngqpoint.moc ngqpoint.h searchProxy.moc routeProxy.h searchProxy.h bookmarksProxy.moc bookmarksProxy.h vehicleProxy.moc vehicleProxy.h navitProxy.moc navitProxy.h guiProxy.moc guiProxy.h gui_qml.moc gui_qml.cpp libgui_qml_la_LDFLAGS = @QT_DECLARATIVE_LIBS@ @QT_GUI_LIBS@ @QT_XML_LIBS@ -module -avoid-version BUILT_SOURCES = gui_qml.moc proxy.moc ngqpoint.moc routeProxy.moc searchProxy.moc bookmarksProxy.moc vehicleProxy.moc navitProxy.moc guiProxy.moc %.moc: %.h @MOC@ $(srcdir)/$< > $@ || touch $@ %.moc: %.cpp @MOC@ $(srcdir)/$< > $@ || touch $@ distclean-local: -$(RM) *.moc SUBDIRS=skins navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/bookmarksProxy.h000066400000000000000000000133011221777731700230770ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_BOOKMARKSPROXY_H #define NAVIT_GUI_QML_BOOKMARKSPROXY_H class NGQProxyBookmarks : public NGQProxy { Q_OBJECT; public: NGQProxyBookmarks(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; public slots: void moveRoot() { struct attr mattr; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_root(mattr.u.bookmarks); } void moveUp() { struct attr mattr; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_up(mattr.u.bookmarks); } void moveDown(QString path) { struct attr mattr; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_down(mattr.u.bookmarks,path.toLocal8Bit().constData()); } QString getBookmarks() { struct attr attr,mattr; struct item* item; struct coord c; QDomDocument retDoc("bookmarks"); QDomElement entries; entries=retDoc.createElement("bookmarks"); retDoc.appendChild(entries); navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); if (bookmarks_item_cwd(mattr.u.bookmarks)) { QDomElement entry=retDoc.createElement("bookmark"); entry.appendChild(this->_fieldValueHelper(retDoc,"label","..")); entry.appendChild(this->_fieldValueHelper(retDoc,"path","..")); entry.appendChild(this->_fieldValueHelper(retDoc,"type",QString(item_to_name(type_bookmark_folder)))); entry.appendChild(this->_fieldValueHelper(retDoc,"distance","")); entry.appendChild(this->_fieldValueHelper(retDoc,"direction","")); entry.appendChild(this->_fieldValueHelper(retDoc,"coords",QString("%1 %2").arg(0).arg(0))); entries.appendChild(entry); } bookmarks_item_rewind(mattr.u.bookmarks); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { QString label; QString path; if (item->type != type_bookmark && item->type != type_bookmark_folder) continue; if (!item_attr_get(item, attr_label, &attr)) continue; label=QString::fromLocal8Bit(attr.u.str); if (!item_attr_get(item, attr_path, &attr)) { path=""; } path=QString::fromLocal8Bit(attr.u.str); item_coord_get(item, &c, 1); QDomElement entry=retDoc.createElement("bookmark"); entry.appendChild(this->_fieldValueHelper(retDoc,"label",label)); entry.appendChild(this->_fieldValueHelper(retDoc,"path",path)); entry.appendChild(this->_fieldValueHelper(retDoc,"type",QString(item_to_name(item->type)))); //entry.appendChild(this->_fieldValueHelper(retDoc,"distance",QString::number(idist/1000))); entry.appendChild(this->_fieldValueHelper(retDoc,"distance","100500")); //entry.appendChild(this->_fieldValueHelper(retDoc,"direction",dirbuf)); entry.appendChild(this->_fieldValueHelper(retDoc,"direction","nahut")); entry.appendChild(this->_fieldValueHelper(retDoc,"coords",QString("%1 %2").arg(c.x).arg(c.y))); entries.appendChild(entry); } dbg(2,"%s\n",retDoc.toString().toLocal8Bit().constData()); return retDoc.toString(); } QString AddFolder(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_add_bookmark(attr.u.bookmarks, NULL, description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString AddBookmark(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_add_bookmark(attr.u.bookmarks, this->object->currentPoint->pc(), description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString Cut(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_cut_bookmark(attr.u.bookmarks, description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString Copy(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_copy_bookmark(attr.u.bookmarks, description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString Paste() { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_paste_bookmark(attr.u.bookmarks) ) { return "Failed!"; } else { return "Success"; } } QString Delete(QString bookmark) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_delete_bookmark(attr.u.bookmarks, bookmark.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } void setPoint(QString bookmark) { struct attr attr, mattr; struct item* item; struct coord c; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_item_rewind(mattr.u.bookmarks); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { QString label; if (item->type != type_bookmark) continue; if (!item_attr_get(item, attr_label, &attr)) continue; label=QString::fromLocal8Bit(attr.u.str); dbg(0,"Bookmark is %s\n",bookmark.toStdString().c_str()); if (label.compare(bookmark)) continue; item_coord_get(item, &c, 1); if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint=new NGQPoint(this->object,&c,bookmark,Bookmark,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } return; } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return 0; } int setAttrFunc(struct attr* attr) {return 0; } struct attr_iter* getIterFunc() { return NULL; }; void dropIterFunc(struct attr_iter* iter) { return; }; private: }; #include "bookmarksProxy.moc" #endif /* NAVIT_GUI_QML_BOOKMARKSPROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/guiProxy.h000066400000000000000000000110021221777731700216670ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_GUIPROXY_H #define NAVIT_GUI_QML_GUIPROXY_H class NGQProxyGui : public NGQProxy { Q_OBJECT; Q_PROPERTY(QString iconPath READ iconPath CONSTANT); Q_PROPERTY(QString commandFunction READ commandFunction CONSTANT); Q_PROPERTY(QString localeName READ localeName CONSTANT); Q_PROPERTY(QString langName READ langName CONSTANT); Q_PROPERTY(QString ctryName READ ctryName CONSTANT); Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthSignal STORED false); Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightSignal STORED false); private: QStringList returnPath; public: NGQProxyGui(struct gui_priv* this_,QObject *parent) : NGQProxy(this_, parent) { this->source=QString(""); } void setNewPoint(struct point* p,NGQPointTypes type) { if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint = new NGQPoint(this->object,p,type,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } void setNewPoint(struct coord* c,NGQPointTypes type) { if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint = new NGQPoint(this->object,c,type,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } void setNewPoint(struct pcoord* pc,NGQPointTypes type) { if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint = new NGQPoint(this->object,pc,type,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } void processCommand(QString function) { //QDeclarativeExpression commandJS(this->object->guiWidget->rootContext(),QString(),qobject_cast(this->object->guiWidget->rootObject())); //commandJS.setSourceLocation("command.js",0); //this->function=function; //commandJS.eval(qobject_cast(this->object->guiWidget->rootObject())); } signals: void widthSignal(int); void heightSignal(int); public slots: void pushPage(QString page) { returnPath.push_front(page); } QString popPage() { if (!returnPath.empty()) { if (returnPath.length()>1) { returnPath.pop_front(); } return returnPath.first(); } return QString(); } int lengthPage() { return returnPath.length(); } void backToMap() { if (this->object->graphicsWidget) { this->object->graphicsWidget->setFocus(Qt::ActiveWindowFocusReason); this->object->switcherWidget->setCurrentWidget(this->object->graphicsWidget); this->object->graphicsWidget->show(); } } void switchToMenu(struct point* p) { if (!this->object->lazy) { this->returnPath.clear(); this->object->guiWidget->setSource(QUrl::fromLocalFile(QString(this->object->source)+"/"+this->object->skin+"/main.qml")); } this->setNewPoint(p,MapPoint); this->object->guiWidget->setFocus(Qt::ActiveWindowFocusReason); this->object->switcherWidget->setCurrentWidget(this->object->guiWidget); } //Properties QString iconPath() { return QString(this->object->icon_src); } int width() { return this->object->w; } void setWidth(int w) { this->object->w=w; this->widthSignal(w); } int height() { return this->object->h; } void setHeight(int h) { this->object->h=h; this->heightSignal(h); } QString commandFunction() { return this->function; } //Locale properties QString localeName() { return QString()+"LANG="+getenv("LANG"); } QString langName() { #ifdef HAVE_API_WIN32_BASE char str[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, str, sizeof(str)); return QString()+"LOCALE_SABBREVLANGNAME="+str; #else return QString(); #endif } QString ctryName() { #ifdef HAVE_API_WIN32_BASE char str[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, str, sizeof(str)); return QString()+"LOCALE_SABBREVCTRYNAME="+str; #else return QString(); #endif } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return gui_get_attr(this->object->gui, type, attr, iter); } int setAttrFunc(struct attr* attr) {return gui_set_attr(this->object->gui,attr); } private: QString source; QString function; }; void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type) { this_->guiProxy->setNewPoint(c,type); } void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type) { this_->guiProxy->setNewPoint(pc,type); } #include "guiProxy.moc" #endif /* NAVIT_GUI_QML_GUIPROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/gui_qml.cpp000066400000000000000000000317061221777731700220460ustar00rootroot00000000000000#include #include #include #include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #include "plugin.h" #include "item.h" #include "attr.h" #include "xmlconfig.h" #include "color.h" #include "gui.h" #include "callback.h" #include "debug.h" #include "navit.h" #include "point.h" #include "graphics.h" #include "event.h" #include "map.h" #include "coord.h" #include "vehicle.h" #include "coord.h" #include "transform.h" #include "mapset.h" #include "route.h" #include "country.h" #include "track.h" #include "search.h" #include "bookmarks.h" #include "command.h" #include "keys.h" #include "layout.h" struct gui_priv { struct navit *nav; struct gui *gui; struct attr self; struct vehicle* currVehicle; //configuration items int fullscreen; int menu_on_map_click; int signal_on_map_click; int w; int h; char *source; char *skin; char* icon_src; int radius; int pitch; int lazy; //When TRUE - menu state will not be changed during map/menu switches, FALSE - menu will be always reset to main.qml //Interface stuff struct callback_list *cbl; QCoreApplication *app; struct window *win; struct graphics *gra; QWidget *mainWindow; QWidget *graphicsWidget; QDeclarativeView *guiWidget; QDeclarativeView *prevGuiWidget; QStackedLayout *switcherWidget; struct callback *button_cb; struct callback *motion_cb; struct callback *resize_cb; struct callback *keypress_cb; struct callback *window_closed_cb; //Proxy objects class NGQProxyGui* guiProxy; class NGQProxyNavit* navitProxy; class NGQProxyVehicle* vehicleProxy; class NGQProxySearch* searchProxy; class NGQProxyBookmarks* bookmarksProxy; class NGQProxyRoute* routeProxy; class NGQPoint* currentPoint; }; #include "proxy.h" #include "ngqpoint.h" #include "searchProxy.h" #include "routeProxy.h" #include "bookmarksProxy.h" #include "vehicleProxy.h" #include "navitProxy.h" #include "guiProxy.h" //Main window class for resizeEvent handling #ifdef Q_WS_X11 #include class NGQMainWindow : public QX11EmbedWidget { #else class NGQMainWindow : public QWidget { #endif /* Q_WS_X11 */ public: #ifdef Q_WS_X11 NGQMainWindow(struct gui_priv* this_,QWidget *parent) : QX11EmbedWidget(parent) { #else NGQMainWindow(struct gui_priv* this_,QWidget *parent) : QWidget(parent) { #endif /* Q_WS_X11 */ this->object=this_; } protected: void resizeEvent(QResizeEvent *) { this->object->w=this->width(); this->object->h=this->height(); //YES, i KNOW about signal/slot thing this->object->guiProxy->setWidth(this->width()); this->object->guiProxy->setHeight(this->height()); } void closeEvent(QCloseEvent* event) { this->object->graphicsWidget->close(); } private: struct gui_priv* object; }; //Meta object #include "gui_qml.moc" static void gui_qml_dbus_signal(struct gui_priv *this_, struct point *p) { struct displaylist_handle *dlh; struct displaylist *display; struct displayitem *di; display=navit_get_displaylist(this_->nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { struct item *item=graphics_displayitem_get_item(di); if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && graphics_displayitem_within_dist(display, di, p, 10)) { struct map_rect *mr=map_rect_new(item->map, NULL); struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); struct attr attr; if (item_attr_get(itemo, attr_data, &attr)) { struct attr cb,*attr_list[2]; int valid=0; attr.type=attr_data; attr_list[0]=&attr; attr_list[1]=NULL; if (navit_get_attr(this_->nav, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); } map_rect_destroy(mr); } } graphics_displaylist_close(dlh); } static void gui_qml_button(void *data, int pressed, int button, struct point *p) { struct gui_priv *this_=(struct gui_priv*)data; // check whether the position of the mouse changed during press/release OR if it is the scrollwheel if (!navit_handle_button(this_->nav, pressed, button, p, NULL)) { dbg(1,"navit has handled button\n"); return; } dbg(1,"enter %d %d\n", pressed, button); if (this_->signal_on_map_click) { gui_qml_dbus_signal(this_, p); return; } if ( button == 1 && this_->menu_on_map_click ) { this_->guiProxy->switchToMenu(p); } } static void gui_qml_motion(void *data, struct point *p) { struct gui_priv *this_=(struct gui_priv*)data; navit_handle_motion(this_->nav, p); return; } static void gui_qml_resize(void *data, int w, int h) { struct gui_priv *this_=(struct gui_priv*)data; navit_handle_resize(this_->nav, w, h); } static void gui_qml_keypress(void *data, char *key) { struct gui_priv *this_=(struct gui_priv*) data; int w,h; struct point p; transform_get_size(navit_get_trans(this_->nav), &w, &h); switch (*key) { case NAVIT_KEY_UP: p.x=w/2; p.y=0; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_DOWN: p.x=w/2; p.y=h; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_LEFT: p.x=0; p.y=h/2; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_RIGHT: p.x=w; p.y=h/2; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_ZOOM_IN: navit_zoom_in(this_->nav, 2, NULL); break; case NAVIT_KEY_ZOOM_OUT: navit_zoom_out(this_->nav, 2, NULL); break; case NAVIT_KEY_RETURN: case NAVIT_KEY_MENU: p.x=w/2; p.y=h/2; this_->guiProxy->switchToMenu(&p); break; } return; } static void gui_qml_window_closed(struct gui_priv *data) { struct gui_priv *this_=(struct gui_priv*) data; this_->navitProxy->quit(); } //GUI interface calls static int argc=1; static char *argv[]={(char *)"navit",NULL}; static int gui_qml_set_graphics(struct gui_priv *this_, struct graphics *gra) { QString xid; NGQMainWindow* _mainWindow; bool ok; this_->gra=gra; //Check if we are already in Qt environment if (QApplication::instance()==NULL) { //Not yet this_->app=new QApplication(argc,argv); } else { this_->app=QApplication::instance(); } //Link graphics events this_->button_cb=callback_new_attr_1(callback_cast(gui_qml_button), attr_button, this_); graphics_add_callback(gra, this_->button_cb); this_->motion_cb=callback_new_attr_1(callback_cast(gui_qml_motion), attr_motion, this_); graphics_add_callback(gra, this_->motion_cb); this_->resize_cb=callback_new_attr_1(callback_cast(gui_qml_resize), attr_resize, this_); graphics_add_callback(gra, this_->resize_cb); this_->keypress_cb=callback_new_attr_1(callback_cast(gui_qml_keypress), attr_keypress, this_); graphics_add_callback(gra, this_->keypress_cb); this_->window_closed_cb=callback_new_attr_1(callback_cast(gui_qml_window_closed), attr_window_closed, this_); graphics_add_callback(gra, this_->window_closed_cb); //Create main window this_->switcherWidget = new QStackedLayout(); _mainWindow = new NGQMainWindow(this_, NULL); #ifdef Q_WS_X11 xid=getenv("NAVIT_XID"); if (xid.length()>0) { _mainWindow->embedInto(xid.toULong(&ok,0)); }else{ dbg(0, "\nFATAL: Environment variable NAVIT_XID not set.\n" " Please set NAVIT_XID to the window ID of the window to embed into.\n"); exit(1); } #endif /* Q_WS_X11 */ this_->mainWindow=_mainWindow; if ( this_->w && this_->h ) { this_->mainWindow->resize(this_->w,this_->h); } if ( this_->fullscreen ) { this_->mainWindow->showFullScreen(); } this_->mainWindow->setLayout(this_->switcherWidget); //Create proxy object and bind them to gui widget this_->guiProxy = new NGQProxyGui(this_,this_->mainWindow); this_->navitProxy = new NGQProxyNavit(this_,this_->mainWindow); this_->vehicleProxy = new NGQProxyVehicle(this_,this_->mainWindow); this_->searchProxy = new NGQProxySearch(this_,this_->mainWindow); this_->bookmarksProxy = new NGQProxyBookmarks(this_,this_->mainWindow); this_->routeProxy = new NGQProxyRoute(this_,this_->mainWindow); //Check, if we have compatible graphics this_->graphicsWidget = (QWidget*)graphics_get_data(gra,"qt_widget"); if (this_->graphicsWidget == NULL ) { this_->graphicsWidget = new QLabel(QString("Sorry, current graphics type is incompatible with this gui.")); } this_->switcherWidget->addWidget(this_->graphicsWidget); //Instantiate qml components this_->guiWidget = new QDeclarativeView(NULL); this_->guiWidget->setResizeMode(QDeclarativeView::SizeRootObjectToView); this_->guiWidget->rootContext()->setContextProperty("gui",this_->guiProxy); this_->guiWidget->rootContext()->setContextProperty("navit",this_->navitProxy); this_->guiWidget->rootContext()->setContextProperty("vehicle",this_->vehicleProxy); this_->guiWidget->rootContext()->setContextProperty("search",this_->searchProxy); this_->guiWidget->rootContext()->setContextProperty("bookmarks",this_->bookmarksProxy); this_->guiWidget->rootContext()->setContextProperty("route",this_->routeProxy); this_->guiWidget->rootContext()->setContextProperty("point",this_->currentPoint); QString mainQml = QString(this_->source)+"/"+this_->skin+"/main.qml"; if (!QFile(mainQml).exists()){ dbg(0, "FATAL: QML file %s not found. Navit is not installed correctly.\n", mainQml.toAscii().constData()); exit(1); } this_->guiWidget->setSource(QUrl::fromLocalFile(mainQml)); this_->switcherWidget->addWidget(this_->guiWidget); //Switch to graphics navit_draw(this_->nav); this_->switcherWidget->setCurrentWidget(this_->graphicsWidget); this_->mainWindow->show(); return 0; } static int gui_qml_get_attr(struct gui_priv *this_, enum attr_type type, struct attr *attr) { switch (type) { case attr_fullscreen: attr->u.num=this_->fullscreen; break; case attr_skin: attr->u.str=this_->skin; break; case attr_pitch: attr->u.num=this_->pitch; break; case attr_radius: attr->u.num=this_->radius; break; default: return 0; } attr->type=type; return 1; } static int gui_qml_set_attr(struct gui_priv *this_, struct attr *attr) { switch (attr->type) { case attr_fullscreen: if (!(this_->fullscreen) && (attr->u.num)) { this_->mainWindow->showFullScreen(); } if ((this_->fullscreen) && !(attr->u.num)) { this_->mainWindow->showNormal(); } this_->fullscreen=attr->u.num; return 1; case attr_pitch: this_->pitch=attr->u.num; return 1; case attr_radius: this_->radius=attr->u.num; return 1; default: dbg(0,"unknown attr: %s\n",attr_to_name(attr->type)); return 1; } } struct gui_methods gui_qml_methods = { NULL, NULL, gui_qml_set_graphics, NULL, NULL, NULL, NULL, gui_qml_get_attr, NULL, gui_qml_set_attr, }; static void gui_qml_command(struct gui_priv *this_, char *function, struct attr **in, struct attr ***out, int *valid) { this_->guiProxy->processCommand(function); } static struct command_table commands[] = { {"*",command_cast(gui_qml_command)}, }; static struct gui_priv * gui_qml_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) { struct gui_priv *this_; struct attr *attr; *meth=gui_qml_methods; this_=g_new0(struct gui_priv, 1); this_->nav=nav; this_->gui=gui; this_->self.type=attr_gui; this_->self.u.gui=gui; navit_ignore_graphics_events(this_->nav, 1); this_->fullscreen = 0; //NO by default if( (attr=attr_search(attrs,NULL,attr_fullscreen))) this_->fullscreen=attr->u.num; this_->menu_on_map_click = 1; //YES by default; if( (attr=attr_search(attrs,NULL,attr_menu_on_map_click))) this_->menu_on_map_click=attr->u.num; this_->signal_on_map_click = 0; //YES by default; if( (attr=attr_search(attrs,NULL,attr_signal_on_map_click))) this_->signal_on_map_click=attr->u.num; this_->radius = 10; //Default value if( (attr=attr_search(attrs,NULL,attr_radius))) this_->radius=attr->u.num; this_->pitch = 20; //Default value if( (attr=attr_search(attrs,NULL,attr_pitch))) this_->pitch=attr->u.num; this_->lazy = 1; //YES by default if( (attr=attr_search(attrs,NULL,attr_lazy))) this_->lazy=attr->u.num; this_->w=800; //Default value if( (attr=attr_search(attrs,NULL,attr_width))) this_->w=attr->u.num; this_->h=600; //Default value if( (attr=attr_search(attrs,NULL,attr_height))) this_->h=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_source))) this_->source=attr->u.str; if( (attr=attr_search(attrs,NULL,attr_skin))) this_->skin=attr->u.str; if( (attr=attr_search(attrs,NULL,attr_icon_src))) this_->icon_src=attr->u.str; if ( this_->source==NULL ) { this_->source=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"),"/gui/qml/skins",NULL); } if ( this_->skin==NULL ) { this_->skin=g_strdup("navit"); } if ( this_->icon_src==NULL ) { this_->icon_src=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"),"/xpm/",NULL); } if ((attr=attr_search(attrs, NULL, attr_callback_list))) { command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this_); } this_->cbl=callback_list_new(); return this_; } void plugin_init(void) { plugin_register_gui_type("qml",gui_qml_new); } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/navitProxy.h000066400000000000000000000111641221777731700222350ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_NAVIT_H #define NAVIT_GUI_QML_NAVIT_H void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type); class NGQProxyNavit : public NGQProxy { Q_OBJECT; public: NGQProxyNavit(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; public slots: void quit() { struct attr navit; navit.type=attr_navit; navit.u.navit=this->object->nav; navit_destroy(navit.u.navit); event_main_loop_quit(); } void setObjectByName(const QString& attr_name,const QString& attr_value) { if (attr_name=="layout") { navit_set_layout_by_name(this->object->nav,attr_value.toStdString().c_str()); } if (attr_name=="vehicle") { navit_set_vehicle_by_name(this->object->nav,attr_value.toStdString().c_str()); } return; } QString getAttrList(const QString &attr_name) { struct attr attr; struct attr_iter *iter; int counter=0; QString currentValue; QDomDocument retDoc; QDomElement entries; entries=retDoc.createElement("attributes"); retDoc.appendChild(entries); //Find current value getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, NULL) ; if (attr.type==attr_layout) { currentValue=attr.u.layout->name; } //Fill da list iter=getIterFunc(); if (iter == NULL) { return QString(); } while (getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, iter) ) { QStandardItem* curItem=new QStandardItem(); //Listed attributes are usualy have very complex structure if (attr.type==attr_layout) { curItem->setData(QVariant(counter),NGQStandardItemModel::ItemId); curItem->setData(QVariant(attr.u.layout->name),NGQStandardItemModel::ItemName); curItem->setData(QVariant(attr.u.layout->name),NGQStandardItemModel::ItemValue); if (currentValue==attr.u.layout->name) { this->_itemId=counter; } } if (attr.type==attr_vehicle) { QStandardItem* curItem=new QStandardItem(); QDomElement entry=retDoc.createElement("vehicle"); entries.appendChild(entry); this->object->currVehicle=attr.u.vehicle; curItem->setData(QVariant(this->object->vehicleProxy->getAttr("name")),NGQStandardItemModel::ItemName); entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString(this->object->vehicleProxy->getAttr("name")))); //Detecting current vehicle struct attr vehicle_attr; navit_get_attr(this->object->nav, attr_vehicle, &vehicle_attr, NULL); if (vehicle_attr.u.vehicle==attr.u.vehicle) { this->_itemId=counter; } } counter++; } dropIterFunc(iter); dbg(0,QString::number(_itemId).toStdString().c_str()); return retDoc.toString(); } QString getDestination() { struct attr attr; struct coord c; if (getAttrFunc(attr_destination, &attr, NULL) ) { c.x=attr.u.pcoord->x; c.y=attr.u.pcoord->y; __setNewPoint(this->object,&c,Destination); return this->object->currentPoint->pointName(); } return QString(); } void setDestination() { navit_set_destination(this->object->nav,this->object->currentPoint->pc(),this->object->currentPoint->coordString().toStdString().c_str(),1); } void stopNavigation() { navit_set_destination(this->object->nav,NULL,NULL,0); } QString getPosition() { struct attr attr; struct pcoord pc; struct coord c; struct transformation *trans; trans=navit_get_trans(this->object->nav); getAttrFunc(attr_vehicle, &attr, NULL); this->object->currVehicle=attr.u.vehicle; if (vehicle_get_attr(this->object->currVehicle, attr_position_coord_geo, &attr, NULL)) { pc.pro=transform_get_projection(trans); transform_from_geo(pc.pro, attr.u.coord_geo, &c); __setNewPoint(this->object,&c,Position); return this->object->currentPoint->pointName(); } return QString(); } void setPosition() { navit_set_position(this->object->nav,this->object->currentPoint->pc()); } void setCenter() { navit_set_center(this->object->nav,this->object->currentPoint->pc(),1); } void command(QString command) { struct attr navit; navit.type=attr_navit; navit.u.navit=this->object->nav; command_evaluate(&navit,command.toLocal8Bit().constData()); } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return navit_get_attr(this->object->nav, type, attr, iter); } int setAttrFunc(struct attr* attr) {return navit_set_attr(this->object->nav,attr); } struct attr_iter* getIterFunc() { return navit_attr_iter_new(); }; void dropIterFunc(struct attr_iter* iter) { navit_attr_iter_destroy(iter); }; private: }; #include "navitProxy.moc" #endif /* NAVIT_GUI_QML_NAVITPROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/ngqpoint.h000066400000000000000000000422201221777731700217060ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_POINT_H #define NAVIT_GUI_QML_POINT_H static void get_direction(char *buffer, int angle, int mode) { angle=angle%360; switch (mode) { case 0: sprintf(buffer,"%d",angle); break; case 1: if (angle < 69 || angle > 291) *buffer++='N'; if (angle > 111 && angle < 249) *buffer++='S'; if (angle > 22 && angle < 158) *buffer++='E'; if (angle > 202 && angle < 338) *buffer++='W'; *buffer++='\0'; break; case 2: angle=(angle+15)/30; if (! angle) angle=12; sprintf(buffer,"%d H", angle); break; } } enum NGQPointTypes {MapPoint,Bookmark,Position,Destination,PointOfInterest}; class NGQPoint : public QObject { Q_OBJECT; Q_PROPERTY(QString coordString READ coordString CONSTANT); Q_PROPERTY(QString pointName READ pointName CONSTANT); Q_PROPERTY(QString pointType READ pointType CONSTANT); Q_PROPERTY(QUrl pointUrl READ pointUrl CONSTANT); public: NGQPoint(struct gui_priv* this_,struct point* p,NGQPointTypes type=MapPoint,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; transform_reverse(navit_get_trans(this->object->nav), p, &co); transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); c.pro = transform_get_projection(navit_get_trans(this->object->nav)); c.x = co.x; c.y = co.y; this->p.x=p->x; this->p.y=p->y; this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } NGQPoint(struct gui_priv* this_,struct coord* c,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; this->co.x=c->x; this->co.y=c->y; transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); this->c.x = c->x; this->c.y = c->y; this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } NGQPoint(struct gui_priv* this_,struct pcoord* pc,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; this->c.pro = pc->pro; this->c.x = pc->x; this->c.y = pc->y; this->co.x=pc->x; this->co.y=pc->y; transform_to_geo(this->c.pro, &co, &g); this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } NGQPoint(struct gui_priv* this_,struct coord* c,QString name,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; this->co.x=c->x; this->co.y=c->y; transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); this->c.x = c->x; this->c.y = c->y; this->type=type; this->name=name; this->coord=this->_coordString(); } struct pcoord* pc() { return &c; } public slots: void setNewPoint(QString coord,NGQPointTypes type=PointOfInterest) { this->item.map=0; QStringList coordSplit=coord.split(" ",QString::SkipEmptyParts); this->co.x=coordSplit[0].toInt(); this->co.y=coordSplit[1].toInt(); transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); this->c.x = coordSplit[0].toInt(); this->c.y = coordSplit[1].toInt(); this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } QString pointName() { return this->name; } QString coordString() { return this->coord; } QString pointType() { switch(this->type) { case MapPoint: return QString("MapPoint"); case Bookmark: return QString("Bookmark"); case Position: return QString("Position"); case Destination: return QString("Destination"); case PointOfInterest: return QString("PointOfInterest"); } return QString(""); } QUrl pointUrl() { return this->url; } QString getInformation() { struct map_rect *mr; struct item* item; struct attr attr; QDomDocument retDoc; QDomElement entries; entries=retDoc.createElement("point"); retDoc.appendChild(entries); if (this->type!=Bookmark and this->item.map) { mr=map_rect_new(this->item.map, NULL); item = map_rect_get_item_byid(mr, this->item.id_hi, this->item.id_lo); if (item) { while(item_attr_get(item, attr_any, &attr)) { entries.appendChild(this->_fieldValueHelper(retDoc,QString::fromLocal8Bit(attr_to_name(attr.type)), QString::fromLocal8Bit(attr_to_text(&attr,this->item.map, 1)))); } } map_rect_destroy(mr); } return retDoc.toString(); } QString getPOI(const QString &attr_name) { struct attr attr; struct item* item; struct mapset_handle *h; struct map_selection *sel,*selm; struct map_rect *mr; struct map *m; int idist,dist; struct coord center; QDomDocument retDoc(attr_name); QDomElement entries; char dirbuf[32]; if (!gui_get_attr(this->object->gui,attr_radius,&attr,NULL)) { return QString(); } dist=attr.u.num*1000; sel=map_selection_rect_new(&this->c, dist, 18); center.x=this->c.x; center.y=this->c.y; h=mapset_open(navit_get_mapset(this->object->nav)); entries=retDoc.createElement(attr_name); retDoc.appendChild(entries); while ((m=mapset_next(h, 1))) { selm=map_selection_dup_pro(sel, this->c.pro, map_projection(m)); mr=map_rect_new(m, selm); if (mr) { while ((item=map_rect_get_item(mr))) { struct coord c; if ( item_coord_get_pro(item, &c, 1, this->c.pro) && coord_rect_contains(&sel->u.c_rect, &c) && (idist=transform_distance(this->c.pro, ¢er, &c)) < dist && item->typetype)).startsWith(QString("poi_"))) { rs=QString::fromLocal8Bit(item_to_name(item->type)); rs=rs.remove(QString("poi_")); rs+=QString(" ")+QString::fromLocal8Bit(label); } else if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) { rs=QString::fromLocal8Bit(item_to_name(item->type)); rs=rs.remove(QString("poly_")); rs+=QString(" ")+QString::fromLocal8Bit(label); } else if (QString(item_to_name(item->type)).startsWith(QString("street_"))) { rs="Street "; rs+=QString::fromLocal8Bit(label); } map_convert_free(label); } else rs=item_to_name(item->type); get_direction(dirbuf, transform_get_angle_delta(¢er, &c, 0), 1); if (rs.length()>0) { QDomElement entry=retDoc.createElement("point"); QDomElement nameTag=retDoc.createElement("name"); QDomElement typeTag=retDoc.createElement("type"); QDomElement distTag=retDoc.createElement("distance"); QDomElement directTag=retDoc.createElement("direction"); QDomElement coordsTag=retDoc.createElement("coords"); QDomText nameT=retDoc.createTextNode(rs); QDomText typeT=retDoc.createTextNode(QString(item_to_name(item->type))); QDomText distT=retDoc.createTextNode(QString::number(idist/1000)); QDomText directT=retDoc.createTextNode(dirbuf); QDomText coordsT=retDoc.createTextNode(QString("%1 %2").arg(c.x).arg(c.y)); nameTag.appendChild(nameT); typeTag.appendChild(typeT); distTag.appendChild(distT); directTag.appendChild(directT); coordsTag.appendChild(coordsT); entry.appendChild(nameTag); entry.appendChild(typeTag); entry.appendChild(distTag); entry.appendChild(directTag); entry.appendChild(coordsTag); entries.appendChild(entry); } } } } map_selection_destroy(selm); } map_selection_destroy(sel); mapset_close(h); dbg(2,"%s\n",retDoc.toString().toLocal8Bit().constData()); return retDoc.toString(); } protected: QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) { QDomElement fieldTag=doc.createElement(field); QDomText valueText=doc.createTextNode(value); fieldTag.appendChild(valueText); return fieldTag; } QString _coordString() { char latc='N',lngc='E'; int lat_deg,lat_min,lat_sec; int lng_deg,lng_min,lng_sec; struct coord_geo g=this->g; if (g.lat < 0) { g.lat=-g.lat; latc='S'; } if (g.lng < 0) { g.lng=-g.lng; lngc='W'; } lat_deg=g.lat; lat_min=fmod(g.lat*60,60); lat_sec=fmod(g.lat*3600,60); lng_deg=g.lng; lng_min=fmod(g.lng*60,60); lng_sec=fmod(g.lng*3600,60); return QString(QString::fromLocal8Bit("%1°%2'%3\" %4%5%6°%7'%8\" %9")).arg(lat_deg).arg(lat_min).arg(lat_sec).arg(latc).arg(' ').arg(lng_deg).arg(lng_min).arg(lng_sec).arg(lngc); } QString _coordName() { int dist=10; struct mapset *ms; struct mapset_handle *h; struct map_rect *mr; struct map *m; struct item *item; struct street_data *data; struct map_selection sel; struct transformation *trans; enum projection pro; struct attr attr; char *label; QString ret; trans=navit_get_trans(this->object->nav); pro=transform_get_projection(trans); transform_from_geo(pro, &g, &co); ms=navit_get_mapset(this->object->nav); sel.next=NULL; sel.u.c_rect.lu.x=c.x-dist; sel.u.c_rect.lu.y=c.y+dist; sel.u.c_rect.rl.x=c.x+dist; sel.u.c_rect.rl.y=c.y-dist; sel.order=18; sel.range=item_range_all; h=mapset_open(ms); while ((m=mapset_next(h,1))) { mr=map_rect_new(m, &sel); if (! mr) continue; while ((item=map_rect_get_item(mr))) { data=street_get_data(item); if (transform_within_dist_item(&co, item->type, data->c, data->count, dist)) { if (item_attr_get(item, attr_label, &attr)) { label=map_convert_string(m, attr.u.str); this->item=*item; this->_setUrl(item); if (QString(item_to_name(item->type)).startsWith(QString("poi_"))) { ret=QString::fromLocal8Bit(item_to_name(item->type)); ret=ret.remove(QString("poi_")); ret+=QString(" ")+QString::fromLocal8Bit(label); } if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) { ret=QString::fromLocal8Bit(item_to_name(item->type)); ret=ret.remove(QString("poly_")); ret+=QString(" ")+QString::fromLocal8Bit(label); } if (QString(item_to_name(item->type)).startsWith(QString("street_"))) { ret="Street "; ret+=QString::fromLocal8Bit(label); } map_convert_free(label); street_data_free(data); map_rect_destroy(mr); mapset_close(h); return ret; } else this->item=*item; this->_setUrl(item); ret=item_to_name(item->type); } street_data_free(data); } map_rect_destroy(mr); } mapset_close(h); return ret; } void _setUrl(struct item *item) { struct attr attr; if (item_attr_get(item,attr_osm_nodeid,&attr)) { url.setUrl(QString("http://www.openstreetmap.org/browse/node/%1").arg(*attr.u.num64)); } else if (item_attr_get(item,attr_osm_wayid,&attr)) { url.setUrl(QString("http://www.openstreetmap.org/browse/way/%1").arg(*attr.u.num64)); } else if (item_attr_get(item,attr_osm_relationid,&attr)) { url.setUrl(QString("http://www.openstreetmap.org/browse/relation/%1").arg(*attr.u.num64)); } else { url.clear(); } } private: struct gui_priv* object; NGQPointTypes type; struct coord_geo g; struct coord co; struct pcoord c; struct point p; struct item item; QString name; QString coord; QUrl url; }; #include "ngqpoint.moc" #endif /* NAVIT_GUI_QML_POINT_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/proxy.h000066400000000000000000000057031221777731700212350ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_PROXY_H #define NAVIT_GUI_QML_PROXY_H class NGQStandardItemModel : public QStandardItemModel { public: NGQStandardItemModel(QObject* parent) : QStandardItemModel(parent) { //Populate role list roleNames.insert(NGQStandardItemModel::ItemId, "itemId"); roleNames.insert(NGQStandardItemModel::ItemName, "itemName"); roleNames.insert(NGQStandardItemModel::ItemIcon, "itemIcon"); roleNames.insert(NGQStandardItemModel::ItemPath, "itemPath"); roleNames.insert(NGQStandardItemModel::ItemValue, "itemValue"); this->setRoleNames(roleNames); } enum listRoles {ItemId=Qt::UserRole+1,ItemName=Qt::UserRole+2,ItemIcon=Qt::UserRole+3,ItemPath=Qt::UserRole+4,ItemValue=Qt::UserRole+5}; private: QHash roleNames; }; class NGQProxy : public QObject { Q_OBJECT; Q_PROPERTY(int itemId READ itemId NOTIFY itemIdSignal); public: NGQProxy(struct gui_priv* this_,QObject *parent) : QObject(parent) { this->object=this_; } signals: void itemIdSignal(int itemId); public slots: //Attribute read/write QString getAttr(const QString &attr_name) { QString ret; struct attr attr; getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, NULL); if (ATTR_IS_INT(attr.type)) { ret.setNum(attr.u.num); } if (ATTR_IS_DOUBLE(attr.type)) { ret.setNum(*attr.u.numd); } if (ATTR_IS_STRING(attr.type)) { ret=attr.u.str; } if (attr.type==attr_layout) { ret=attr.u.layout->name; } return ret; } void setAttr(const QString &attr_name, const QString &attr_string) { struct attr attr_value; double *helper; dbg(1,"Setting %s to %s\n",attr_name.toStdString().c_str(),attr_string.toStdString().c_str()); getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr_value, NULL); if (ATTR_IS_INT(attr_value.type)) { //Special handling for "true"/"false" if (attr_string=="true") { attr_value.u.num=1; } else if (attr_string=="false") { attr_value.u.num=0; } else { attr_value.u.num=attr_string.toInt(); } } if (ATTR_IS_DOUBLE(attr_value.type)) { helper = g_new0(double,1); *helper=attr_string.toDouble(); attr_value.u.numd=helper; } if (ATTR_IS_STRING(attr_value.type)) { attr_value.u.str=(char*)attr_string.toStdString().c_str(); } setAttrFunc(&attr_value); return; } int itemId() { return _itemId; } protected: struct gui_priv* object; int _itemId; virtual int setAttrFunc(struct attr *attr)=0; virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter)=0; virtual struct attr_iter* getIterFunc() { return NULL; }; virtual void dropIterFunc(struct attr_iter*) { return; }; QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) { QDomElement fieldTag=doc.createElement(field); QDomText valueText=doc.createTextNode(value); fieldTag.appendChild(valueText); return fieldTag; } }; #include "proxy.moc" #endif /* NAVIT_GUI_QML_PROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/routeProxy.h000066400000000000000000000042031221777731700222460ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_ROUTEPROXY_H #define NAVIT_GUI_QML_ROUTEPROXY_H class NGQProxyRoute : public NGQProxy { Q_OBJECT; public: NGQProxyRoute(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) { }; public slots: void addDestination() { int counter=0; QList destinations=this->_routeDestinations(); struct pcoord *coords=(struct pcoord*)malloc(sizeof(struct pcoord)*(destinations.size()+1)); //Additional destination included for (QList::const_iterator iter=destinations.begin();iter!=destinations.end();iter++) { coords[counter]=*(iter->u.pcoord); counter++; } //Add new one coords[counter]=*(this->object->currentPoint->pc()); //Propagate to route engine route_set_destinations(navit_get_route(this->object->nav),coords,counter+1,1); } QString getDestinations() { QList destinations=this->_routeDestinations(); for (QList::const_iterator iter=destinations.begin();iter!=destinations.end();iter++) { NGQPoint helperPoint(this->object,iter->u.pcoord,MapPoint); dbg(0,"Added destination %s\n",helperPoint.coordString().toLocal8Bit().constData()); } //dbg(0,QString::number(_itemId).toStdString().c_str()); //return retDoc.toString(); return QString(); } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) {return route_get_attr(navit_get_route(this->object->nav), type, attr, iter); } int setAttrFunc(struct attr* attr) {return route_set_attr(navit_get_route(this->object->nav),attr); } struct attr_iter* getIterFunc() { return route_attr_iter_new(); }; void dropIterFunc(struct attr_iter* iter) { route_attr_iter_destroy(iter); }; QList _routeDestinations() { QList ret; struct attr attr; struct attr_iter *iter; //Fill da list iter=getIterFunc(); if (iter == NULL) { return ret; } while (getAttrFunc(attr_destination, &attr, iter) ) { struct attr c_attr=attr; ret.push_front(c_attr); //List is reversed in route engine } dropIterFunc(iter); return ret; } }; #include "routeProxy.moc" #endif /* NAVIT_GUI_QML_ROUTEPROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/searchProxy.h000066400000000000000000000162421221777731700223630ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_SEARCHPROXY_H #define NAVIT_GUI_QML_SEARCHPROXY_H void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type); class NGQProxySearch : public NGQProxy { Q_OBJECT; Q_PROPERTY(QString countryName READ countryName WRITE setCountryName NOTIFY countryNameSignal); Q_PROPERTY(QString countryISO2 READ countryISO2 WRITE setCountryISO2 NOTIFY countryISO2Signal); Q_PROPERTY(QString townName READ townName WRITE setTownName NOTIFY townNameSignal); Q_PROPERTY(QString streetName READ streetName WRITE setStreetName NOTIFY streetNameSignal); Q_PROPERTY(QString searchContext READ searchContext WRITE setSearchContext); public: NGQProxySearch(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) { struct attr search_attr, country_name, country_iso2, *country_attr; struct item *item; struct country_search *cs; struct tracking *tracking; struct search_list_result *res; this->sl=search_list_new(navit_get_mapset(this->object->nav)); this->search_context="country"; country_attr=country_default(); tracking=navit_get_tracking(this->object->nav); if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) country_attr=&search_attr; if (country_attr) { cs=country_search_new(country_attr, 0); item=country_search_get_item(cs); if (item && item_attr_get(item, attr_country_name, &country_name)) { search_attr.type=attr_country_all; dbg(0,"country %s\n", country_name.u.str); this->country_name=QString::fromLocal8Bit(country_name.u.str); search_attr.u.str=country_name.u.str; search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); if (item_attr_get(item, attr_country_iso2, &country_iso2)) { this->country_iso2=QString::fromLocal8Bit(country_iso2.u.str); } } country_search_destroy(cs); } else { dbg(0,"warning: no default country found\n"); if (!this->country_iso2.isEmpty()) { dbg(0,"attempting to use country '%s'\n",this->country_iso2.toStdString().c_str()); search_attr.type=attr_country_iso2; search_attr.u.str=(char*)this->country_iso2.toStdString().c_str(); search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); } } } ~NGQProxySearch() { search_list_destroy(this->sl); } signals: void countryNameSignal(QString); void countryISO2Signal(QString); void townNameSignal(QString); void streetNameSignal(QString); public slots: void setPointToResult() { struct attr attr; struct search_list_result *res; if (this->street_name.length()>0) { attr.type=attr_street_name; attr.u.str=this->street_name.toLocal8Bit().data(); } else if (this->town_name.length()>0) { attr.type=attr_town_or_district_name; attr.u.str=this->town_name.toLocal8Bit().data(); } else if (this->country_name.length()>0) { attr.type=attr_country_name; attr.u.str=this->country_name.toLocal8Bit().data(); } search_list_search(this->sl,&attr,0); if ((res=search_list_get_result(this->sl))) { __setNewPoint(this->object,res->c,PointOfInterest); } return; } QString searchXml() { NGQStandardItemModel* ret=new NGQStandardItemModel(this); struct attr attr; struct search_list_result *res; int counter=0; QDomDocument retDoc; QDomElement entries; entries=retDoc.createElement("search"); retDoc.appendChild(entries); if (this->search_context=="country") { attr.type=attr_country_name; attr.u.str=this->country_name.toLocal8Bit().data(); } if (this->search_context=="town") { if (this->town_name.length()<3) { return retDoc.toString(); } attr.type=attr_town_or_district_name; attr.u.str=this->town_name.toLocal8Bit().data(); } if (this->search_context=="street") { attr.type=attr_street_name; attr.u.str=this->street_name.toLocal8Bit().data(); } search_list_search(this->sl,&attr,1); while ((res=search_list_get_result(this->sl))) { QStandardItem* curItem=new QStandardItem(); QDomElement entry=retDoc.createElement("item"); entries.appendChild(entry); //Result processing depends on search type if (this->search_context=="country") { entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->country->name))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("icon"), QString("country_%1%2").arg(res->country->iso2).arg(".svgz"))); } if (this->search_context=="town") { entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); if (res->town->common.town_name) { entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->town->common.town_name))); } if (res->town->common.district_name) { entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->town->common.district_name))); } } if (this->search_context=="street") { entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->street->name))); } counter++; ret->appendRow(curItem); } return retDoc.toString(); } QString countryName() { return this->country_name; } void setCountryName(QString countryName) { this->country_name=countryName; struct attr attr; struct search_list_result *res; //We need to update ISO2 attr.type=attr_country_name; attr.u.str=countryName.toLocal8Bit().data(); search_list_search(this->sl,&attr,0); while ((res=search_list_get_result(this->sl))) { this->setCountryISO2(QString::fromLocal8Bit(res->country->iso2)); } //...and current town this->town_name=""; this->street_name=""; countryNameSignal(countryName); } QString countryISO2() { return this->country_iso2; } void setCountryISO2(QString countryISO2) { this->country_iso2=countryISO2; countryISO2Signal(countryISO2); } QString townName() { return this->town_name; } void setTownName(QString townName) { struct attr attr; this->town_name=townName; //Specialize search attr.type=attr_town_or_district_name; attr.u.str=townName.toLocal8Bit().data(); search_list_search(this->sl,&attr,0); //...and street this->street_name=""; townNameSignal(townName); } QString streetName() { return this->street_name; } void setStreetName(QString streetName) { struct attr attr; this->street_name=streetName; //Specialize search attr.type=attr_street_name; attr.u.str=streetName.toLocal8Bit().data(); search_list_search(this->sl,&attr,0); streetNameSignal(streetName); } QString searchContext() { return this->search_context; } void setSearchContext(QString searchContext) { this->search_context=searchContext; } protected: virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter) { return 0; } virtual int setAttrFunc(struct attr *attr) { return 0; } private: struct search_list *sl; QString search_context; QString country_iso2,country_name,town_name,street_name; }; #include "searchProxy.moc" #endif /* NAVIT_GUI_QML_SEARCHPROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/000077500000000000000000000000001221777731700210255ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/Makefile.am000066400000000000000000000000151221777731700230550ustar00rootroot00000000000000SUBDIRS=navitnavit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/000077500000000000000000000000001221777731700221465ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/ButtonIcon.qml000066400000000000000000000024021221777731700247430ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: container signal clicked property string text: "Button" property string icon: "Icon.png" color: "black"; smooth: true; opacity: 0.75 width: imgItem.width+20; height: txtItem.height + 6 + imgItem.height; transformOrigin: Rectangle.Center; MouseArea { id: mr; anchors.fill: parent; onClicked: container.clicked() } Image { id: imgItem; source: gui.iconPath+container.icon; anchors.top: container.top; anchors.horizontalCenter: container.horizontalCenter; width: gui.height/4; height: gui.height/4 } Text { id: txtItem; text: container.text; anchors.top: imgItem.bottom; anchors.horizontalCenter: container.horizontalCenter; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } states: [ State { name: "Pressed"; when: mr.pressed == true PropertyChanges { target: container; scale: 2.0 } PropertyChanges { target: container; opacity: 1 } } ] transitions: Transition { NumberAnimation { properties: "scale"; easing.type: "OutExpo"; duration: 200 } NumberAnimation { properties: "opacity"; easing.type: "InQuad"; duration: 200 } } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/Cellar.qml000066400000000000000000000017761221777731700240760ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { function onStartup(currentPage) { btnBack.opacity=0; btnQuit.opacity=0; if ( gui.lengthPage() > 1 ) { btnBack.opacity=1; } if ( gui.lengthPage() == 1 && currentPage == "PageMain.qml" ) { btnQuit.opacity=1; } } ButtonIcon { id: btnMap; icon: "gui_map.svg"; text:"Map"; onClicked: gui.backToMap(); anchors.left: parent.left; anchors.leftMargin: 3 anchors.bottom: parent.bottom; anchors.bottomMargin: 3 } ButtonIcon { id: btnBack; icon: "gui_arrow_left.svg"; text: "Back"; onClicked: Navit.back(); anchors.right: parent.right; anchors.leftMargin: 3 anchors.bottom: parent.bottom; anchors.bottomMargin: 3 opacity: 0; } ButtonIcon { id: btnQuit; icon: "gui_quit.svg"; text: "Quit"; onClicked: navit.quit() anchors.right: parent.right; anchors.leftMargin: 3 anchors.bottom: parent.bottom; anchors.bottomMargin: 3 opacity: 0; } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/CommonHighlight.qml000066400000000000000000000001301221777731700257330ustar00rootroot00000000000000import Qt 4.7 Component { Rectangle { color: "lightsteelblue" radius: 5 } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/ListSelector.qml000066400000000000000000000024721221777731700253020ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: listselector width: parent.width; height: parent.height color: "Black" property string text: "ListSelector" property string value: "" property int itemId: 0 property bool showScroller: false signal changed function startup() { if (listselector.showScroller == true) { listScroller.opacity=0.5; } } Component.onCompleted: startup(); Text { id: labelTxt; text: listselector.text; color: "White"; font.pointSize: 22; anchors.horizontalCenter: list.horizontalCenter anchors.verticalCenter: listselector.top } ListView { id: list; width: listselector.width*0.8; height: listselector.height anchors.top: labelTxt.bottom; anchors.left: listselector.left model: listModel delegate: listDelegate highlight: listHighlight clip: true highlightFollowsCurrentItem: true keyNavigationWraps: true Component.onCompleted: { list.currentIndex=listselector.itemId; } } Rectangle { id: listScroller opacity: 0; anchors.left: list.right; anchors.leftMargin: 4; width: 6 y: (list.visibleArea.yPosition * list.height)+(list.visibleArea.heightRatio * list.height/4) height: list.visibleArea.heightRatio * list.height } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/Makefile.am000066400000000000000000000011041221777731700241760ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc SKIN = navit qmldir=$(skinsdir)/$(SKIN) qml_DATA = ButtonIcon.qml ToggleSwitch.qml ToggleButton.qml ListSelector.qml Slider.qml CommonHighlight.qml Cellar.qml main.qml PageMain.qml PageNavigate.qml PageAbout.qml PageBookmarksAdd.qml PageBookmarks.qml PageRoute.qml PageSearch.qml PageSearchSelector.qml PageSettingsDisplay.qml PageSettingsLocale.qml PageSettings.qml PageSettingsRules.qml PageSettingsTools.qml PageSettingsVehicle.qml PagePoi.qml PagePointInfo.qml qml_DATA += background.svg knob.svg qml_DATA += command.js pagenavigation.js navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageAbout.qml000066400000000000000000000025141221777731700245320ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: navitText; anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: urlText.top; text: "Navit"; color: "White"; font.pointSize: gui.height/32 } Text { id: urlText; anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; text: "http://www.navit-project.org/"; color: "White"; font.pointSize: gui.height/32 } Text { id: authorsText; anchors.horizontalCenter: parent.horizontalCenter; anchors.top: urlText.bottom; text: "By: Martin Schaller, Michael Farmbauer, Alexander Atanasov, Pierre Grandin"; color: "White"; font.pointSize: gui.height/32 } Text { id: contributorsText; anchors.horizontalCenter: parent.horizontalCenter; anchors.top: authorsText.bottom; text: "and all the Navit Team members and contributors"; color: "White"; font.pointSize: gui.height/32 } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageBookmarks.qml000066400000000000000000000107761221777731700254210ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function bookmarkReload() { listModel.xml=bookmarks.getBookmarks(); listModel.query="/bookmarks/bookmark"; listModel.reload(); } function bookmarkClick(itemName,itemType,itemCoord) { if (itemType=="bookmark_folder") { if ( itemName==".." ) { bookmarks.moveUp(); } else { bookmarks.moveDown(itemName); } bookmarkReload(); } else { bookmarks.setPoint(itemName); pageLoader.source="PageNavigate.qml"; } } function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } ButtonIcon { id: folderBtn; text: "New folder"; icon: "gui_active.svg"; onClicked: folderDialog.opacity=1 anchors.top: parent.top; anchors.topMargin: page.height/16; anchors.left: parent.left; anchors.leftMargin: page.width/16 } ButtonIcon { id: pasteBtn; text: "Paste"; icon: "gui_active.svg"; onClicked: { bookmarks.Paste(); bookmarkReload(); } anchors.top: parent.top; anchors.topMargin: page.height/16; anchors.left: folderBtn.right; anchors.leftMargin: page.width/16 } XmlListModel { id: listModel xml: bookmarks.getBookmarks("bookmarks") query: "/bookmarks/bookmark" XmlRole { name: "itemName"; query: "label/string()" } XmlRole { name: "itemType"; query: "type/string()" } XmlRole { name: "itemDistance"; query: "distance/string()" } XmlRole { name: "itemDirection"; query: "direction/string()" } XmlRole { name: "itemValue"; query: "coords/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Text { id: txtItem; text: itemName; color: {itemType== "bookmark" ? "White" : "Yellow"} font.bold: {itemType!= "bookmark" } width: list.width-imgDelete.width MouseArea { id:delegateMouse anchors.fill: parent onClicked: bookmarkClick(itemName,itemType,itemValue); } } Image { id: imgCut; source: gui.iconPath+"zoom_out.svg"; anchors.right: imgCopy.left;anchors.rightMargin: 5; width: 20; height: 20; MouseArea { id:delegateMouseCut anchors.fill: parent onClicked: { bookmarks.Cut(itemName); bookmarkReload(); } } } Image { id: imgCopy; source: gui.iconPath+"zoom_in.svg"; anchors.right: imgDelete.left;anchors.rightMargin: 5; width: 20; height: 20; MouseArea { id:delegateMouseCopy anchors.fill: parent onClicked: { bookmarks.Copy(itemName); bookmarkReload(); } } } Image { id: imgDelete; source: gui.iconPath+"gui_inactive.svg"; anchors.right: wrapper.right;anchors.rightMargin: 5; width: 20; height: 20; MouseArea { id:delegateMouseDelete anchors.fill: parent onClicked: { bookmarks.Delete(itemName); bookmarkReload(); } } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: "" anchors.top: pasteBtn.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height*0.25 } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } Rectangle { id: folderDialog opacity:0 anchors.horizontalCenter: page.horizontalCenter; anchors.verticalCenter: page.verticalCenter; width: page.width; height:page.height/3 color: "Grey"; TextInput{ id: folderTxt; text: "Enter folder name here..." anchors.top: parent.top;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false } ButtonIcon { id: btnOk; text: "Add"; icon: "gui_active.svg"; onClicked: { bookmarks.AddFolder(folderTxt.text); bookmarkReload(); folderDialog.opacity=0 } anchors.top: folderTxt.bottom;anchors.topMargin: 5;anchors.right:parent.horizontalCenter;anchors.rightMargin:10 } ButtonIcon { id: btnCancel; text: "Cancel"; icon: "gui_inactive.svg"; onClicked: folderDialog.opacity=0; anchors.top: folderTxt.bottom;anchors.topMargin: 5;anchors.left:parent.horizontalCenter;anchors.leftMargin:10 } } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageBookmarksAdd.qml000066400000000000000000000041011221777731700260130ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 Timer { id: backTimer interval: 2000; onTriggered: Navit.back(); } function add(description) { resultTxt.text=bookmarks.AddBookmark(description); btnOk.opacity=0; btnCancel.opacity=0; resultTxt.opacity=1; backTimer.start() } function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: infoTxt; text: point.coordString; color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.horizontalCenter:parent.horizontalCenter } Text { id: nameTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:infoTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } TextInput{ id: searchTxt; text: "Enter bookmark name..." anchors.top: nameTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false } ButtonIcon { id: btnOk; text: "Add"; icon: "gui_active.svg"; onClicked: add(searchTxt.text) anchors.top: searchTxt.bottom;anchors.topMargin: 5;anchors.right:parent.horizontalCenter;anchors.rightMargin:10 } ButtonIcon { id: btnCancel; text: "Cancel"; icon: "gui_inactive.svg"; onClicked: gui.backToPrevPage(); anchors.top: searchTxt.bottom;anchors.topMargin: 5;anchors.left:parent.horizontalCenter;anchors.leftMargin:10 } Text { id: resultTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:btnCancel.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter opacity: 0 } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageMain.qml000066400000000000000000000016771221777731700243550ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: main.width; height: main.height color: "Black" Grid { columns: 2; rows: 2 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: page.top;anchors.topMargin:page.height/10 spacing: parent.height/6 ButtonIcon { id: btnDestination; text: "Drive to\npoint on map"; icon: "gui_active.svg"; onClicked: { route.addDestination(); gui.backToMap() } } ButtonIcon { id: btnNavigate; text: "Navigate\nto . . ."; icon: "cursor.svg"; onClicked: Navit.load("PageNavigate.qml"); } ButtonIcon { id: btnRoute; text: "Route\ninformation"; icon: "nav_destination_wh.svg"; onClicked: Navit.load("PageRoute.qml"); } ButtonIcon { id: btnSettings; text: "Settings"; icon: "gui_settings.svg"; onClicked: Navit.load("PageSettings.qml"); } } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageNavigate.qml000066400000000000000000000062031221777731700252150ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { if (point.pointType!="Bookmark") { btnAddBookmark.opacity=1; } if (point.pointType!="MapPoint") { btnView.opacity=1; } if (point.pointType!="Position") { btnPosition.opacity=1; } if (point.pointType!="Destination") { btnDestination.opacity=1; } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: infoTxt; text: point.coordString; color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.horizontalCenter:parent.horizontalCenter } Text { id: nameTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:infoTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } ButtonIcon { id: btnView; text: "View on map"; icon: "gui_maps.svg"; onClicked: { navit.setCenter(); gui.backToMap(); } opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:page.left;anchors.leftMargin: gui.height/6 } ButtonIcon { id: btnPosition; text: "Set as\nposition"; icon: "gui_active.svg"; onClicked: { navit.setPosition(); gui.backToMap() } opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:btnView.right;anchors.leftMargin: gui.height/6 } ButtonIcon { id: btnDestination; text: "Set as\ndestination"; icon: "gui_active.svg"; onClicked: { route.addDestination(); gui.backToMap() } opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:btnPosition.right;anchors.leftMargin: gui.height/6 } ButtonIcon { id: btnAddBookmark; text: "Add as\na bookmark"; icon: "gui_active.svg"; onClicked: Navit.load("PageBookmarksAdd.qml"); opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:btnDestination.right;anchors.leftMargin: gui.height/6 } Grid { columns: 4;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: btnDestination.bottom;anchors.topMargin:gui.height/32 spacing: gui.height/6 ButtonIcon { id: btnBookmarks; text: "Bookmarks"; icon: "gui_bookmark.svg"; onClicked: {bookmarks.moveRoot(); Navit.load("PageBookmarks.qml"); } } ButtonIcon { id: btnPOI; text: "Nearest\nPOIs"; icon: "attraction.svg"; onClicked: Navit.load("PagePoi.qml"); } ButtonIcon { id: btnSearch; text: "Address\nSearch"; icon: "gui_town.svg"; onClicked: Navit.load("PageSearch.qml"); } ButtonIcon { id: btnInfo; text: "Point\ninformation"; icon: "gui_menu.svg"; onClicked: Navit.load("PagePointInfo.qml"); } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PagePoi.qml000066400000000000000000000124561221777731700242150ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page property string poiFilter: "" width: gui.width; height: gui.height color: "Black" opacity: 0 function calculateFilter() { page.poiFilter='/points/point[type="point_begin" or '; if (bankBtn.state=="on") { page.poiFilter+='type="poi_bank" or '; } if (fuelBtn.state=="on") { page.poiFilter+='type="poi_fuel" or '; page.poiFilter+='type="poi_autoservice" or '; page.poiFilter+='type="poi_repair_service" or '; } if (hotelBtn.state=="on") { page.poiFilter+='type="poi_hotel" or '; page.poiFilter+='type="poi_camp_rv" or '; page.poiFilter+='type="poi_camping" or '; page.poiFilter+='type="poi_resort" or '; page.poiFilter+='type="poi_motel" or '; page.poiFilter+='type="poi_hostel" or '; } if (foodBtn.state=="on") { page.poiFilter+='type="poi_bar" or '; page.poiFilter+='type="poi_picnic" or '; page.poiFilter+='type="poi_burgerking" or '; page.poiFilter+='type="poi_fastfood" or '; page.poiFilter+='type="poi_restaurant" or '; } if (shopBtn.state=="on") { page.poiFilter+='type="poi_shop_grocery" or '; page.poiFilter+='type="poi_mall" or '; } if (serviceBtn.state=="on") { page.poiFilter+='type="poi_marina" or '; page.poiFilter+='type="poi_hospital" or '; page.poiFilter+='type="poi_public_utilities" or '; page.poiFilter+='type="poi_police" or '; page.poiFilter+='type="poi_information" or '; page.poiFilter+='type="poi_personal_service" or '; page.poiFilter+='type="poi_restroom" or '; } if (parkingBtn.state=="on") { page.poiFilter+='type="poi_car_parking" or '; } if (landBtn.state=="on") { page.poiFilter+='type="poi_land_feature" or '; page.poiFilter+='type="poi_rock" or '; page.poiFilter+='type="poi_dam" or '; } page.poiFilter+='type="point_end"]'; listModel.query=page.poiFilter; listModel.reload(); } function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: labelTxt; text: "Points of interest"; color: "White"; font.pointSize: 14; anchors.horizontalCenter: page.horizontalCenter anchors.top: page.top } VisualItemModel { id: selectorsModel ToggleButton { id: bankBtn; text: "Bank"; icon: "bank.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: fuelBtn; text: "Fuel"; icon: "fuel.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: hotelBtn; text: "Hotel"; icon: "bar.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: foodBtn; text: "Food"; icon: "fastfood.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: shopBtn; text: "Shop"; icon: "shopping.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: serviceBtn; text: "Service"; icon: "hospital.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: parkingBtn; text: "Parking"; icon: "police.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: landBtn; text: "Land features"; icon: "peak.svg";stOn: "true"; onChanged: calculateFilter(); } } ListView { id: selectorsList; model: selectorsModel focus: true; clip: true; orientation: Qt.Horizontal anchors.horizontalCenter: page.horizontalCenter; anchors.top: labelTxt.bottom width: page.width; height: bankBtn.height*2 } Slider { id: distanceSlider; minValue: 1; maxValue: 250; value: gui.getAttr("radius"); text: "Distance"; onChanged: { gui.setAttr("radius",distanceSlider.value); listModel.xml=point.getPOI("points"); listModel.reload(); } anchors.top: selectorsList.bottom; anchors.horizontalCenter: page.horizontalCenter; } XmlListModel { id: listModel xml: point.getPOI("points") query: "/points/point" XmlRole { name: "itemName"; query: "name/string()" } XmlRole { name: "itemType"; query: "type/string()" } XmlRole { name: "itemDistance"; query: "distance/string()" } XmlRole { name: "itemDirection"; query: "direction/string()" } XmlRole { name: "itemValue"; query: "coords/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Column { x: 5; y: 5 Text { id: txtItemName; text: itemName; color: "White" } Text { id: txtItemDist; text: itemDistance; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemName.right;anchors.top: txtItemName.top } Text { id: txtItemDirect; text: itemDirection; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemDist.right;anchors.top: txtItemDist.top } } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { point.setNewPoint(itemValue); gui.returnSource="/main.qml"; Navit.load("PageNavigate.qml"); } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: "" anchors.top: distanceSlider.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height*0.25 } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PagePointInfo.qml000066400000000000000000000043751221777731700253740ustar00rootroot00000000000000import Qt 4.7 import org.webkit 1.0 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: infoTxt; text: point.coordString; color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.horizontalCenter:parent.horizontalCenter } Text { id: nameTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:infoTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } Text { id: typeTxt; text: point.pointType; color: "White"; font.pointSize: gui.height/20; anchors.top:nameTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } Text { id: urlTxt; text: point.pointUrl; color: "Blue"; font.pointSize: gui.height/20;font.underline: true; anchors.top:typeTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } XmlListModel { id: listModel xml: point.getInformation(); query: "/point/element()" XmlRole { name: "itemType"; query: "name()" } XmlRole { name: "itemAttribute"; query: "string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Column { x: 5; y: 5 Text { id: txtItemType; text: itemType; color: "White"; font.bold: true; } Text { id: txtItemAttribute; text: itemAttribute; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemType.right;anchors.top: txtItemType.top } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: "Attributes"; anchors.top: urlTxt.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height*0.25 } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageRoute.qml000066400000000000000000000063311221777731700245570ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; if (navit.getPosition().length>0) { btnPoi.opacity=0.8; } if (navit.getDestination().length>0 && navit.getPosition().length>0) { btnRouteView.opacity=0.8; btnRouteBook.opacity=0.8; btnRouteHeight.opacity=0.8; } route.getDestinations(); } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: statusTxt; text: route.getAttr("route_status"); color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.left:parent.left;anchors.topMargin: gui.height/20;anchors.leftMargin: gui.height/20; } Text { id: timeLabel; text: "Time to drive route: "; color: "White"; font.pointSize: gui.height/20; anchors.top:statusTxt.top;anchors.left:statusTxt.right;anchors.leftMargin: gui.height/20; } Text { id: timeTxt; text: route.getAttr("destination_time"); color: "White"; font.pointSize: gui.height/20; anchors.top:timeLabel.top;anchors.left:timeLabel.right;anchors.leftMargin: gui.height/20; } Text { id: lengthLabel; text: "Route length: "; color: "White"; font.pointSize: gui.height/20; anchors.top:timeTxt.top;anchors.left:timeTxt.right;anchors.leftMargin: gui.height/20; } Text { id: lengthTxt; text: route.getAttr("destination_length"); color: "White"; font.pointSize: gui.height/20; anchors.top:lengthLabel.top;anchors.left:lengthLabel.right;anchors.leftMargin: gui.height/20; } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnRouteView; text: "View route"; icon: "gui_town.svg"; onClicked: { navit.command("zoom_to_route()"), gui.backToMap(); } opacity: 0; } ButtonIcon { id: btnRouteBook; text: "Roadbook"; icon: "gui_log.svg"; onClicked: console.log("Implement me!"); opacity: 0; } ButtonIcon { id: btnRouteHeight; text: "Height profile"; icon: "peak.svg"; onClicked: console.log("Implement me!"); opacity: 0; } } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnView; text: "View position\non map"; icon: "gui_maps.svg"; onClicked: { navit.getPosition();navit.setCenter();gui.backToMap(); } } ButtonIcon { id: btnPoi; text: "POIs near\nPosition"; icon: "attraction.svg"; onClicked: Navit.load("PagePoi.qml"); opacity: 0; } ButtonIcon { id: btnStop; text: "Stop"; icon: "gui_stop.svg"; onClicked: { navit.stopNavigation(); Navit.back(); } opacity: 0; } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSearch.qml000066400000000000000000000056541221777731700246750ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { if ( search.countryName.length>0 ) { gridCity.opacity = 1; } if ( search.townName.length>0 ) { gridStreet.opacity = 1; } if ( search.streetName.length>0 ) { gridAddress.opacity = 0; //Disabled ,because housenamuber search is broken } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 2;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16; spacing: gui.width/12 Grid { columns: 1;rows: 2; id: gridCountry; Text { id: txtItemCountry; text: "Country"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnCountry; text: search.countryName; icon: "country_"+search.countryISO2+".svgz"; onClicked: { search.searchContext="country"; Navit.load("PageSearchSelector.qml"); } } } Grid { columns: 1; rows: 2; id: gridCity opacity: 0; Text { id: txtItemCity; text: "Town"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnCity; text: search.townName; icon: "gui_bookmark.svg"; onClicked: { search.searchContext="town"; Navit.load("PageSearchSelector.qml"); } } } } Grid { columns: 2;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16; spacing: gui.width/12 Grid { columns: 1; rows: 2; id: gridStreet opacity: 0; Text { id: txtItemStreet; text: "Street"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnStreet; text: search.streetName; icon: "gui_town.svg"; onClicked: { search.searchContext="street"; Navit.load("PageSearchSelector.qml"); } } } Grid { columns: 1; rows: 2; id: gridAddress; opacity: 0; Text { id: txtItemAddress; text: "Address"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnAddress; text: "Address"; icon: "attraction.svg"; onClicked: console.log("Implement me!"); } } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSearchSelector.qml000066400000000000000000000067641221777731700264010ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function setSearchResult(listValue) { if (search.searchContext=="country") { search.countryName=listValue; Navit.back; } if (search.searchContext=="town") { search.townName=listValue; Navit.back(); } if (search.searchContext=="street") { search.streetName=listValue; search.setPointToResult(); Navit.returnSource="main.qml"; Navit.load("PageNavigate.qml"); } } function pageOpen() { if (search.searchContext=="country") { searchTxt.text=search.countryName; countryBinding.when=true; } if (search.searchContext=="town") { searchTxt.text=search.townName; townBinding.when=true; } if (search.searchContext=="street") { searchTxt.text=search.streetName; streetBinding.when=true; } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } TextInput{ id: searchTxt; anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false; cursorVisible: true; } Binding {id: countryBinding; target: search; property: "countryName"; value: searchTxt.text; when: false} Binding {id: townBinding; target: search; property: "townName"; value: searchTxt.text; when: false} Binding {id: streetBinding; target: search; property: "streetName"; value: searchTxt.text; when: false} Connections { target: search; onCountryNameSignal: {listModel.xml=search.searchXml(); listModel.query="/search/item"; listModel.reload(); } } Connections { target: search; onTownNameSignal: {listModel.xml=search.searchXml(); listModel.query="/search/item"; listModel.reload(); } } Connections { target: search; onStreetNameSignal: {listModel.xml=search.searchXml(); listModel.query="/search/item"; listModel.reload(); } } XmlListModel { id: listModel xml: search.searchXml(); query: "/search/item" XmlRole { name: "itemId"; query: "id/string()" } XmlRole { name: "itemName"; query: "name/string()" } XmlRole { name: "itemIcon"; query: "icon/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Image { id: imgIcon; source: gui.iconPath+itemIcon width: 20; height: 20; } Text { id: txtItemName; text: itemName; color: "White"; anchors.left: imgIcon.right;anchors.leftMargin: 5 width: list.width-imgIcon.width } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { setSearchResult(itemName); } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: search.searchContext; onChanged: setSearchResult() anchors.top: searchTxt.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height/2-cellar.height } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSettings.qml000066400000000000000000000034061221777731700252610ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnDisplay; text: "Display"; icon: "gui_display.svg"; onClicked: Navit.load("PageSettingsDisplay.qml"); } ButtonIcon { id: btnMap; text: "Map"; icon: "gui_maps.svg"; onClicked: console.log("Implement me!"); } ButtonIcon { id: btnVehicle; text: "Vehicle"; icon: "gui_vehicle.svg"; onClicked: Navit.load("PageSettingsVehicle.qml"); } } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnRules; text: "Rules"; icon: "gui_rules.svg"; onClicked: Navit.load("PageSettingsRules.qml"); } ButtonIcon { id: btnTools; text: "Tools"; icon: "gui_tools.svg"; onClicked: Navit.load("PageSettingsTools.qml"); } ButtonIcon { id: btnAbout; text: "About"; icon: "gui_about.svg"; onClicked: Navit.load("PageAbout.qml"); } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSettingsDisplay.qml000066400000000000000000000054521221777731700266120ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function setTripleD(flag) { if ( flag=="true" ) { navit.setAttr("pitch",gui.getAttr("pitch")); pitchSlider.value = navit.getAttr("pitch"); pitchSlider.startup(); pitchSlider.opacity = 1 } else { navit.setAttr("pitch","0"); pitchSlider.opacity = 0 } } function isTripleD() { if ( navit.getAttr("pitch") == "0" ) return "0"; else return "1"; } function pageOpen() { if ( isTripleD() == "1" ) { pitchSlider.opacity = 1 } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Column { x: 5; y: 5 Text { id: txtItemName; text: itemName; color: "White" } Text { id: txtItemDist; text: itemDistance; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemName.right;anchors.top: txtItemName.top } Text { id: txtItemDirect; text: itemDirection; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemDist.right;anchors.top: txtItemDist.top } } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { list.currentIndex=itemId; listselector.value=itemValue; listselector.changed() } } } } CommonHighlight { id: listHighlight} ListSelector { id:layoutList; text: "Current layout"; itemId: navit.getAttrList("layout"); onChanged: navit.setObjectByName("layout",layoutList.value) anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width/2; height: page.height*0.25 } Grid { columns: 1; rows: 3 anchors.right: parent.right anchors.top: parent.top; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 spacing: gui.width/12 ToggleSwitch { id: fullscreenSw; stOn: gui.getAttr("fullscreen"); text: "Fullscreen"; onChanged: gui.setAttr("fullscreen",fullscreenSw.stOn) } ToggleSwitch { id: tripledSw; stOn: page.isTripleD(); text: "2D/3D"; onChanged: setTripleD(tripledSw.stOn) } Slider { id: pitchSlider; minValue: 5; maxValue: 90; value: navit.getAttr("pitch"); text: "Pitch"; onChanged: { navit.setAttr("pitch",pitchSlider.value); gui.setAttr("pitch",pitchSlider.value) } opacity: 0 } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSettingsLocale.qml000066400000000000000000000016551221777731700264050ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 1;rows: 3 anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; Text { id: lang; text: gui.localeName; color: "White";font.pointSize: gui.height/24 } Text { id: langname; text: gui.langName; color: "White";font.pointSize: gui.height/24 } Text { id: ctryname; text: gui.ctryName; color: "White";font.pointSize: gui.height/24 } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSettingsRules.qml000066400000000000000000000027521221777731700262770ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } VisualItemModel { id: selectorsModel ToggleSwitch { id: trackingSw; stOn: navit.getAttr("tracking"); text: "Lock on road"; onChanged: navit.setAttr("tracking",trackingSw.stOn) } ToggleSwitch { id: orientationSw; stOn: navit.getAttr("orientation"); text: "Northing"; onChanged: navit.setAttr("orientation",orientationSw.stOn) } ToggleSwitch { id: followcursorSw; stOn: navit.getAttr("follow_cursor"); text: "Map follows Vehicle"; onChanged: navit.setAttr("follow_cursor",followcursorSw.stOn) } ToggleSwitch { id: autozoomSw; stOn: navit.getAttr("autozoom_active"); text: "Auto zoom"; onChanged: navit.setAttr("autozoom_active",autozoomSw.stOn) } } ListView { id: selectorsList; model: selectorsModel focus: true; clip: true; orientation: Qt.Vertical anchors.verticalCenter: parent.verticalCenter; anchors.horizontalCenter: parent.horizontalCenter; width: trackingSw.width*1.5; height: trackingSw.height*4 } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSettingsTools.qml000066400000000000000000000014701221777731700263010ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 1;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; ButtonIcon { id: btnDisplay; text: "Locale"; icon: "gui_actions.svg"; onClicked: Navit.load("PageSettingsLocale.qml"); } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/PageSettingsVehicle.qml000066400000000000000000000035051221777731700265610ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } XmlListModel { id: listModel xml: navit.getAttrList("vehicle"); query: "/attributes/vehicle" XmlRole { name: "itemId"; query: "id/string()" } XmlRole { name: "itemName"; query: "name/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: txtItemName.height Column { x: 5; y: 5 Text { id: txtItemName; text: itemName; color: "White"; font.pointSize: 42 } } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { list.currentIndex=itemId; listselector.value=itemName; listselector.changed() } } } } CommonHighlight { id: listHighlight} ListSelector { id:vehicleList; text: "Current vehicle profile"; itemId: navit.itemId; onChanged: {navit.setObjectByName("vehicle",vehicleList.value) } anchors.top: parent.top; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 anchors.left: parent.left; width: page.width/2;height: page.height/2 } ButtonIcon { id: btnVehicle; text: navit.getAttr("vehicle"); icon: "gui_vehicle.svg"; onClicked: Navit.load("PageSettingsVehicleOptions.qml"); anchors.verticalCenter: vehicleList.verticalCenter; anchors.leftMargin: gui.width/32 anchors.left: vehicleList.right; } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/Slider.qml000066400000000000000000000042431221777731700241060ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: slider width: background.width + label.width + gui.width/24; height: label.height color: "Black" property int minValue: 0 property int value: 50 property int maxValue: 100 property string text: "Slider" signal changed function toSlider(inputVal) { return 2+(((inputVal-minValue)/(maxValue-minValue))*(background.width-knob.width-2)); } function fromSlider(inputVal) { return minValue+(((inputVal-2)/(background.width-knob.width-2))*(maxValue-minValue)); } function startup () { if ( slider.value < slider.minValue ) { slider.value = slider.minValue; } if ( slider.value > slider.maxValue ) { slider.value = slider.maxValue; } knob.x = toSlider(slider.value); } Component.onCompleted: startup(); Rectangle { id: background x: 20; width: gui.width/5; height: gui.height/24 gradient: Gradient { GradientStop { position: 0.0; color: "steelblue" } GradientStop { position: 1.0; color: "lightsteelblue" } } MouseArea { anchors.fill: parent onReleased: { knob.x=mouse.x-15; slider.value=Math.round(fromSlider(knob.x)); slider.changed(); } } radius: 8; opacity: 0.7 Rectangle { id: knob x: 2; y: 2; width: gui.width/26; height: gui.height/35 radius: 6 gradient: Gradient { GradientStop { position: 0.0; color: "lightgray" } GradientStop { position: 1.0; color: "gray" } } MouseArea { anchors.fill: parent drag.target: parent; drag.axis: "XAxis"; drag.minimumX: 2; drag.maximumX: background.width-knob.width onPositionChanged: slider.value=Math.round(fromSlider(knob.x)) onReleased: slider.changed() } } Text { id: valueTxt; text: slider.value; color: "White"; font.pointSize: gui.height/32; anchors.horizontalCenter: knob.horizontalCenter; anchors.verticalCenter: knob.verticalCenter } } Text { id: label; text: slider.text; color: "White"; font.pointSize: gui.height/24; anchors.left: background.right; anchors.leftMargin: gui.width/24; anchors.verticalCenter: background.verticalCenter } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/ToggleButton.qml000066400000000000000000000040761221777731700253050ustar00rootroot00000000000000import Qt 4.7 Item { id: togglebutton width: imgItem.width + txtItem.width + gui.width/24; height: imgItem.height property string stOn: "false" property string text: "Toggle button" property string icon: "Icon.png" signal changed function toggle() { if (togglebutton.state == "on") togglebutton.state = "off"; else togglebutton.state = "on"; } function startup () { if (togglebutton.stOn == "1" ) togglebutton.stOn = "true"; else if (togglebutton.stOn == "0" ) togglebutton.stOn = "false"; if (togglebutton.stOn == "true") togglebutton.state = "on"; else togglebutton.state = "off"; } Component.onCompleted: startup(); MouseArea { id: mr; anchors.fill: parent; onReleased: toggle() } Image { id: imgItem; source: gui.iconPath+togglebutton.icon; anchors.top: togglebutton.top; anchors.horizontalCenter: togglebutton.horizontalCenter; width: gui.height/32; height: gui.height/32 } Text { id: txtItem; text: togglebutton.text; anchors.top: imgItem.bottom; anchors.horizontalCenter: togglebutton.horizontalCenter; color: "White"; font.pointSize: gui.height/64; horizontalAlignment: Qt.AlignHCenter } states: [ State { name: "on" PropertyChanges { target: imgItem; opacity: 1 } PropertyChanges { target: txtItem; opacity: 1 } PropertyChanges { target: togglebutton; stOn: "true" } StateChangeScript { script: togglebutton.changed(); } }, State { name: "off" PropertyChanges { target: imgItem; opacity: 0.3 } PropertyChanges { target: txtItem; opacity: 0.3 } PropertyChanges { target: togglebutton; stOn: "false" } StateChangeScript { script: togglebutton.changed(); } } ] transitions: Transition { NumberAnimation { properties: "scale"; easing.type: "OutExpo"; duration: 200 } NumberAnimation { properties: "opacity"; easing.type: "InQuad"; duration: 200 } } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/ToggleSwitch.qml000066400000000000000000000041271221777731700252700ustar00rootroot00000000000000import Qt 4.7 Item { id: toggleswitch width: background.width + label.width + gui.width/24; height: background.height property string stOn: "false" property string text: "Toggle switch" signal changed function toggle() { if (toggleswitch.state == "on") toggleswitch.state = "off"; else toggleswitch.state = "on"; } function startup () { if (toggleswitch.stOn == "1" ) toggleswitch.stOn = "true"; else if (toggleswitch.stOn == "0" ) toggleswitch.stOn = "false"; if (toggleswitch.stOn == "true") toggleswitch.state = "on"; else toggleswitch.state = "off"; } Component.onCompleted: startup(); Text { id: label; text: toggleswitch.text; color: "White"; font.pointSize: gui.height/20; anchors.left: background.right; anchors.leftMargin: gui.width/24; anchors.verticalCenter: background.verticalCenter } Image { id: background; source: "background.svg" MouseArea { anchors.fill: parent; onClicked: toggle() } height: gui.height/6; width: height*2.4; } Image { id: knob; source: "knob.svg"; x: 1; y: 2 height: gui.height/6; width: gui.height/6; MouseArea { anchors.fill: parent drag.target: knob; drag.axis: "XAxis"; drag.minimumX: 1; drag.maximumX: background.width-knob.width hoverEnabled: false; onReleased: toggle() } } states: [ State { name: "on" PropertyChanges { target: knob; x: background.width-knob.width } PropertyChanges { target: toggleswitch; stOn: "true" } StateChangeScript { script: toggleswitch.changed(); } }, State { name: "off" PropertyChanges { target: knob; x: 1 } PropertyChanges { target: toggleswitch; stOn: "false" } StateChangeScript { script: toggleswitch.changed(); } } ] transitions: Transition { NumberAnimation { properties: "x"; easing.type: "InOutQuad"; duration: 200 } } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/background.svg000066400000000000000000000027661221777731700250210ustar00rootroot00000000000000 ]> navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/command.js000066400000000000000000000006361221777731700241270ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: page function pageOpen(command) { if ( command=="menu") { gui.returnSource=""; Loader {source: "main.qml"}; } if (command=="quit") { navit.quit(); } } Component.onCompleted: pageOpen(gui.commandFunction); Text { id: myText; anchors.centerIn: parent; text: "Hi, i'm Navit!"; color: "Black"; font.pointSize: gui.height/32 } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/knob.svg000066400000000000000000000425531221777731700236310ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/main.qml000066400000000000000000000013421221777731700236050ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: main property variant returnPath:[ "test" ] width: gui.width; height: gui.height color: "Black" function pageOpen() { Navit.load("PageMain.qml"); } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Loader { id: pageLoader; width: gui.width; height: gui.height-cellar.height; anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; } Cellar {id: cellar;anchors.bottom: main.bottom; anchors.horizontalCenter: main.horizontalCenter; width: main.width } } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/skins/navit/pagenavigation.js000066400000000000000000000004061221777731700255000ustar00rootroot00000000000000var returnPath=new Array(); function load(page) { gui.pushPage(page); pageLoader.source=page; cellar.onStartup(page); } function back() { var page=gui.popPage(); console.log(page); pageLoader.source=page; cellar.onStartup(page); } navit-0.5.0~svn5643+dfsg.1/navit/gui/qml/vehicleProxy.h000066400000000000000000000013511221777731700225300ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_VEHICLEPROXY_H #define NAVIT_GUI_QML_VEHICLEPROXY_H class NGQProxyVehicle : public NGQProxy { Q_OBJECT; public: NGQProxyVehicle(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; public slots: protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return vehicle_get_attr(this->object->currVehicle, type, attr, iter); } int setAttrFunc(struct attr* attr) {return vehicle_set_attr(this->object->currVehicle,attr); } struct attr_iter* getIterFunc() { return vehicle_attr_iter_new(); }; void dropIterFunc(struct attr_iter* iter) { vehicle_attr_iter_destroy(iter); }; private: }; #include "vehicleProxy.moc" #endif /* NAVIT_GUI_QML_VEHICLEPROXY_H */ navit-0.5.0~svn5643+dfsg.1/navit/item.c000066400000000000000000000230711221777731700174260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "coord.h" #include "debug.h" #include "item.h" #include "map.h" #include "transform.h" struct item_name { enum item_type item; char *name; }; struct item_range item_range_all = { type_none, type_last }; struct default_flags { enum item_type type; int flags; }; struct item busy_item; struct default_flags default_flags2[]={ {type_street_nopass, AF_PBH}, {type_street_0, AF_ALL}, {type_street_1_city, AF_ALL}, {type_street_2_city, AF_ALL}, {type_street_3_city, AF_ALL}, {type_street_4_city, AF_ALL}, {type_highway_city, AF_MOTORIZED_FAST}, {type_street_1_land, AF_ALL}, {type_street_2_land, AF_ALL}, {type_street_3_land, AF_ALL}, {type_street_4_land, AF_ALL}, {type_street_n_lanes, AF_MOTORIZED_FAST}, {type_highway_land, AF_MOTORIZED_FAST}, {type_ramp, AF_MOTORIZED_FAST}, {type_roundabout, AF_ALL}, {type_ferry, AF_ALL}, {type_cycleway, AF_PBH}, {type_track_paved, AF_ALL}, {type_track_gravelled, AF_ALL}, {type_track_unpaved, AF_ALL}, {type_track_ground, AF_ALL}, {type_track_grass, AF_ALL}, {type_footway, AF_PBH}, {type_living_street, AF_ALL}, {type_street_service, AF_ALL}, {type_street_parking_lane, AF_ALL}, {type_bridleway, AF_PBH}, {type_path, AF_PBH}, {type_steps, AF_PBH}, {type_street_pedestrian, AF_PBH}, {type_hiking_mountain, AF_PEDESTRIAN}, {type_hiking_mountain_demanding, AF_PEDESTRIAN}, {type_hiking, AF_PEDESTRIAN}, {type_hiking_alpine, AF_PEDESTRIAN}, {type_hiking_alpine_demanding, AF_PEDESTRIAN}, {type_hiking_alpine_difficult, AF_PEDESTRIAN}, }; struct item_name item_names[]={ #define ITEM2(x,y) ITEM(y) #define ITEM(x) { type_##x, #x }, #include "item_def.h" #undef ITEM2 #undef ITEM }; static GHashTable *default_flags_hash; static GHashTable *item_hash; void item_create_hash(void) { int i; item_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { g_hash_table_insert(item_hash, item_names[i].name, GINT_TO_POINTER(item_names[i].item)); } } void item_destroy_hash(void) { g_hash_table_destroy(item_hash); item_hash=NULL; } int * item_get_default_flags(enum item_type type) { if (!default_flags_hash) { int i; default_flags_hash=g_hash_table_new(NULL, NULL); for (i = 0 ; i < sizeof(default_flags2)/sizeof(struct default_flags); i++) { g_hash_table_insert(default_flags_hash, (void *)(long)default_flags2[i].type, &default_flags2[i].flags); } } return g_hash_table_lookup(default_flags_hash, (void *)(long)type); } void item_cleanup(void) { if (default_flags_hash) g_hash_table_destroy(default_flags_hash); } void item_coord_rewind(struct item *it) { it->meth->item_coord_rewind(it->priv_data); } int item_coord_get(struct item *it, struct coord *c, int count) { return it->meth->item_coord_get(it->priv_data, c, count); } int item_coord_set(struct item *it, struct coord *c, int count, enum change_mode mode) { if (!it->meth->item_coord_set) return 0; return it->meth->item_coord_set(it->priv_data, c, count, mode); } int item_coord_get_within_selection(struct item *it, struct coord *c, int count, struct map_selection *sel) { int i,ret=it->meth->item_coord_get(it->priv_data, c, count); struct coord_rect r; struct map_selection *curr; if (ret <= 0 || !sel) return ret; r.lu=c[0]; r.rl=c[0]; for (i = 1 ; i < ret ; i++) { if (r.lu.x > c[i].x) r.lu.x=c[i].x; if (r.rl.x < c[i].x) r.rl.x=c[i].x; if (r.rl.y > c[i].y) r.rl.y=c[i].y; if (r.lu.y < c[i].y) r.lu.y=c[i].y; } curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; if (r.lu.x <= sr->rl.x && r.rl.x >= sr->lu.x && r.lu.y >= sr->rl.y && r.rl.y <= sr->lu.y) return ret; curr=curr->next; } return 0; } int item_coord_get_pro(struct item *it, struct coord *c, int count, enum projection to) { int ret=item_coord_get(it, c, count); int i; enum projection from=map_projection(it->map); if (from != to) for (i = 0 ; i < count ; i++) transform_from_to(c+i, from, c+i, to); return ret; } int item_coord_is_node(struct item *it) { if (it->meth->item_coord_is_node) return it->meth->item_coord_is_node(it->priv_data); return 0; } void item_attr_rewind(struct item *it) { it->meth->item_attr_rewind(it->priv_data); } int item_attr_get(struct item *it, enum attr_type attr_type, struct attr *attr) { return it->meth->item_attr_get(it->priv_data, attr_type, attr); } int item_attr_set(struct item *it, struct attr *attr, enum change_mode mode) { if (!it->meth->item_attr_set) return 0; return it->meth->item_attr_set(it->priv_data, attr, mode); } /** * @brief Set map item type. * * @param it reference to the item. * @param type New type for the item. Setting it to type_none is expected to delete item from the map. * @return Non-zero if this action is supported by the map and type is set successfully, 0 on error. */ int item_type_set(struct item *it, enum item_type type) { if (!it->meth->item_type_set) return 0; return it->meth->item_type_set(it->priv_data, type); } struct item * item_new(char *type, int zoom) { struct item * it; it = g_new0(struct item, 1); /* FIXME evaluate arguments */ return it; } enum item_type item_from_name(const char *name) { int i; if (item_hash) return GPOINTER_TO_INT(g_hash_table_lookup(item_hash, name)); for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { if (! strcmp(item_names[i].name, name)) return item_names[i].item; } return type_none; } char * item_to_name(enum item_type item) { int i; for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { if (item_names[i].item == item) return item_names[i].name; } return NULL; } struct item_hash { GHashTable *h; }; static guint item_hash_hash(gconstpointer key) { const struct item *itm=key; gconstpointer hashkey=(gconstpointer)GINT_TO_POINTER(itm->id_hi^itm->id_lo^(GPOINTER_TO_INT(itm->map))); return g_direct_hash(hashkey); } static gboolean item_hash_equal(gconstpointer a, gconstpointer b) { const struct item *itm_a=a; const struct item *itm_b=b; if (item_is_equal(*itm_a, *itm_b)) return TRUE; return FALSE; } unsigned int item_id_hash(const void *key) { const struct item_id *id=key; return id->id_hi^id->id_lo; } int item_id_equal(const void *a, const void *b) { const struct item_id *id_a=a; const struct item_id *id_b=b; return (id_a->id_hi == id_b->id_hi && id_a->id_lo == id_b->id_lo); } /** * @brief Derive item id_lo and id_hi from pointer, considering pointer could be 32 or 64 bit wide but both ids are 32 bit. * * @param it reference to the item. * @param id pointer to derive item id from. * @return Nothing. */ void item_id_from_ptr(struct item *item, void *id) { #if !defined(__LP64__) && !defined(__LLP64__) && !defined(WIN64) item->id_lo=(int) id; item->id_hi=0; #else # ifndef _MSC_VER item->id_lo=((long long)id)&0xFFFFFFFFll; # else item->id_lo=((long long)id)&0xFFFFFFFFi64; # endif item->id_hi=((long long)id)>>32; #endif } struct item_hash * item_hash_new(void) { struct item_hash *ret=g_new(struct item_hash, 1); ret->h=g_hash_table_new_full(item_hash_hash, item_hash_equal, g_free, NULL); return ret; } void item_hash_insert(struct item_hash *h, struct item *item, void *val) { struct item *hitem=g_new(struct item, 1); *hitem=*item; dbg(2,"inserting (0x%x,0x%x) into %p\n", item->id_hi, item->id_lo, h->h); g_hash_table_insert(h->h, hitem, val); } int item_hash_remove(struct item_hash *h, struct item *item) { int ret; dbg(2,"removing (0x%x,0x%x) from %p\n", item->id_hi, item->id_lo, h->h); ret=g_hash_table_remove(h->h, item); dbg(2,"ret=%d\n", ret); return ret; } void * item_hash_lookup(struct item_hash *h, struct item *item) { return g_hash_table_lookup(h->h, item); } void item_hash_destroy(struct item_hash *h) { g_hash_table_destroy(h->h); g_free(h); } int item_range_intersects_range(struct item_range *range1, struct item_range *range2) { if (range1->max < range2->min) return 0; if (range1->min > range2->max) return 0; return 1; } int item_range_contains_item(struct item_range *range, enum item_type type) { if (type >= range->min && type <= range->max) return 1; return 0; } void item_dump_attr(struct item *item, struct map *map, FILE *out) { struct attr attr; fprintf(out,"type=%s", item_to_name(item->type)); while (item_attr_get(item, attr_any, &attr)) fprintf(out," %s='%s'", attr_to_name(attr.type), attr_to_text(&attr, map, 1)); } void item_dump_filedesc(struct item *item, struct map *map, FILE *out) { int i,count,max=16384; struct coord *ca=g_alloca(sizeof(struct coord)*max); count=item_coord_get(item, ca, item->type < type_line ? 1: max); if (item->type < type_line) fprintf(out,"mg:0x%x 0x%x ", ca[0].x, ca[0].y); item_dump_attr(item, map, out); fprintf(out,"\n"); if (item->type >= type_line) for (i = 0 ; i < count ; i++) fprintf(out,"mg:0x%x 0x%x\n", ca[i].x, ca[i].y); } navit-0.5.0~svn5643+dfsg.1/navit/item.h000066400000000000000000000124761221777731700174420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_ITEM_H #define NAVIT_ITEM_H #ifdef __cplusplus extern "C" { #endif #include enum item_type { #define ITEM2(x,y) type_##y=x, #define ITEM(x) type_##x, #include "item_def.h" #undef ITEM2 #undef ITEM }; #define route_item_first type_street_0 #define route_item_last type_path extern int default_flags[]; #include "attr.h" /* NOTE: we treat districts as towns for now, since a) navit does not implement district search yet b) OSM "place=suburb" maps to type_district in maptool. with the OSM USA maps, there are many "suburbs" that users will consider towns (not districts/counties); we want navit's town search to find them */ #define item_type_is_area(type) ((type) >= type_area) #define item_is_town(item) ((item).type >= type_town_label && (item).type <= type_district_label_1e7) #define item_is_district(item) ((item).type >= type_district_label && (item).type <= type_district_label_1e7) #define item_is_poly_place(item) ((item).type >= type_poly_place1 && (item).type <= type_poly_place6) #define item_is_point(item) ((item).type < type_line) #define item_is_custom_poi(item) ((item).type >= type_poi_custom0 && (item).type < type_line) #define item_is_street(item) (((item).type >= type_street_0 && (item).type < type_street_1_land) \ || (item).type == type_street_pedestrian \ || (item).type == type_living_street \ || (item).type == type_footway) #define item_is_equal_id(a,b) ((a).id_hi == (b).id_hi && (a).id_lo == (b).id_lo) #define item_is_equal(a,b) (item_is_equal_id(a,b) && (a).map == (b).map) struct coord; enum change_mode { change_mode_delete, change_mode_modify, change_mode_append, change_mode_prepend, }; struct item_methods { void (*item_coord_rewind)(void *priv_data); int (*item_coord_get)(void *priv_data, struct coord *c, int count); void (*item_attr_rewind)(void *priv_data); int (*item_attr_get)(void *priv_data, enum attr_type attr_type, struct attr *attr); int (*item_coord_is_node)(void *priv_data); int (*item_attr_set)(void *priv_data, struct attr *attr, enum change_mode mode); int (*item_coord_set)(void *priv_data, struct coord *c, int count, enum change_mode mode); int (*item_type_set)(void *priv_data, enum item_type type); }; struct item_id { int id_hi; int id_lo; }; #define ITEM_ID_FMT "(0x%x,0x%x)" #define ITEM_ID_ARGS(x) (x).id_hi,(x).id_lo struct item { enum item_type type; int id_hi; int id_lo; struct map *map; struct item_methods *meth; void *priv_data; }; extern struct item_range { enum item_type min,max; } item_range_all; extern struct item busy_item; /* prototypes */ enum attr_type; enum change_mode; enum item_type; enum projection; struct attr; struct coord; struct item; struct item_hash; struct item_range; struct map; struct map_selection; void item_create_hash(void); void item_destroy_hash(void); int *item_get_default_flags(enum item_type type); void item_coord_rewind(struct item *it); int item_coord_get(struct item *it, struct coord *c, int count); int item_coord_set(struct item *it, struct coord *c, int count, enum change_mode mode); int item_coord_get_within_selection(struct item *it, struct coord *c, int count, struct map_selection *sel); int item_coord_get_pro(struct item *it, struct coord *c, int count, enum projection to); int item_coord_is_node(struct item *it); void item_attr_rewind(struct item *it); int item_attr_get(struct item *it, enum attr_type attr_type, struct attr *attr); int item_attr_set(struct item *it, struct attr *attr, enum change_mode mode); int item_type_set(struct item *it, enum item_type type); struct item *item_new(char *type, int zoom); enum item_type item_from_name(const char *name); char *item_to_name(enum item_type item); unsigned int item_id_hash(const void *key); int item_id_equal(const void *a, const void *b); void item_id_from_ptr(struct item *item, void *id); struct item_hash *item_hash_new(void); void item_hash_insert(struct item_hash *h, struct item *item, void *val); int item_hash_remove(struct item_hash *h, struct item *item); void *item_hash_lookup(struct item_hash *h, struct item *item); void item_hash_destroy(struct item_hash *h); int item_range_intersects_range(struct item_range *range1, struct item_range *range2); int item_range_contains_item(struct item_range *range, enum item_type type); void item_dump_attr(struct item *item, struct map *map, FILE *out); void item_dump_filedesc(struct item *item, struct map *map, FILE *out); void item_cleanup(void); /* end of prototypes */ #ifdef __cplusplus } /* __cplusplus */ #endif /* NAVIT_ITEM_H */ #endif navit-0.5.0~svn5643+dfsg.1/navit/item_def.h000066400000000000000000000313661221777731700202570ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* This file is generated from http://wiki.navit-project.org/index.php/Item_def.h, do not edit it, edit the wiki page instead */ ITEM2(0x00000000,none) ITEM2(0x00000001,point_unspecified) ITEM(town_streets) ITEM(street_name) ITEM(street_name_numbers) ITEM(street_number) ITEM(position_sat) /* Point */ ITEM2(0x00010000,town_label) ITEM2(0x00010001,town_label_0e0) ITEM2(0x00010002,town_label_1e0) ITEM2(0x00010003,town_label_2e0) ITEM2(0x00010004,town_label_5e0) ITEM2(0x00010005,town_label_1e1) ITEM2(0x00010006,town_label_2e1) ITEM2(0x00010007,town_label_5e1) ITEM2(0x00010008,town_label_1e2) ITEM2(0x00010009,town_label_2e2) ITEM2(0x0001000a,town_label_5e2) ITEM2(0x0001000b,town_label_1e3) ITEM2(0x0001000c,town_label_2e3) ITEM2(0x0001000d,town_label_5e3) ITEM2(0x0001000e,town_label_1e4) ITEM2(0x0001000f,town_label_2e4) ITEM2(0x00010010,town_label_5e4) ITEM2(0x00010011,town_label_1e5) ITEM2(0x00010012,town_label_2e5) ITEM2(0x00010013,town_label_5e5) ITEM2(0x00010014,town_label_1e6) ITEM2(0x00010015,town_label_2e6) ITEM2(0x00010016,town_label_5e6) ITEM2(0x00010017,town_label_1e7) ITEM2(0x00010100,district_label) ITEM2(0x00010101,district_label_0e0) ITEM2(0x00010102,district_label_1e0) ITEM2(0x00010103,district_label_2e0) ITEM2(0x00010104,district_label_5e0) ITEM2(0x00010105,district_label_1e1) ITEM2(0x00010106,district_label_2e1) ITEM2(0x00010107,district_label_5e1) ITEM2(0x00010108,district_label_1e2) ITEM2(0x00010109,district_label_2e2) ITEM2(0x0001010a,district_label_5e2) ITEM2(0x0001010b,district_label_1e3) ITEM2(0x0001010c,district_label_2e3) ITEM2(0x0001010d,district_label_5e3) ITEM2(0x0001010e,district_label_1e4) ITEM2(0x0001010f,district_label_2e4) ITEM2(0x00010110,district_label_5e4) ITEM2(0x00010111,district_label_1e5) ITEM2(0x00010112,district_label_2e5) ITEM2(0x00010113,district_label_5e5) ITEM2(0x00010114,district_label_1e6) ITEM2(0x00010115,district_label_2e6) ITEM2(0x00010116,district_label_5e6) ITEM2(0x00010117,district_label_1e7) ITEM(country_label) ITEM(town_ghost) ITEM(highway_exit_label) ITEM(port_label) ITEM(label_unkn) ITEM(highway_exit) ITEM(poi_lake) ITEM(poi_island) ITEM(poi) ITEM(waypoint) ITEM(trackpoint) ITEM(bookmark) ITEM(former_destination) ITEM(poi_land_feature) ITEM(poi_cape) ITEM(poi_rock) ITEM(poi_airport) ITEM(poi_toll_booth) ITEM(poi_fuel) ITEM(poi_hotel) ITEM(poi_camp_rv) ITEM(poi_marina) ITEM(poi_attraction) ITEM(poi_museum_history) ITEM(poi_shopping) ITEM(poi_car_dealer_parts) ITEM(poi_car_parking) ITEM(poi_wreck) ITEM(poi_building) ITEM(poi_bridge) ITEM(poi_park) ITEM(poi_water_feature) ITEM(poi_bar) ITEM(poi_picnic) ITEM(poi_hospital) ITEM(poi_camping) ITEM(poi_public_utilities) ITEM(poi_burgerking) ITEM(poi_kfc) ITEM(poi_mcdonalds) ITEM(poi_wienerwald) ITEM(poi_dining) ITEM(poi_fastfood) ITEM(poi_police) ITEM(poi_auto_club) ITEM(poi_autoservice) ITEM(poi_bank) ITEM(poi_bay) ITEM(poi_bend) ITEM(poi_boat_ramp) ITEM(poi_border_station) ITEM(poi_bowling) ITEM(poi_bus_station) ITEM(poi_bus_stop) ITEM(poi_business_service) ITEM(poi_car_rent) ITEM(poi_car_wash) ITEM(poi_casino) ITEM(poi_cemetery) ITEM(poi_church) ITEM(poi_cinema) ITEM(poi_civil_removeme) ITEM(poi_communication) ITEM(poi_concert) ITEM(poi_cove) ITEM(poi_crossing) ITEM(poi_dam) ITEM(poi_danger_area) ITEM(poi_danger_sea_wreck) ITEM(poi_daymark) ITEM(poi_diving) ITEM(poi_drinking_water) ITEM(poi_emergency) ITEM(poi_fair) ITEM(poi_firebrigade) ITEM(poi_fish) ITEM(poi_forbidden_area) ITEM(poi_shop_gps) ITEM(poi_golf) ITEM(poi_government_building) ITEM(poi_height) ITEM(poi_heliport) ITEM(poi_hotspring) ITEM(poi_icesport) ITEM(poi_information) ITEM(poi_justice) ITEM(poi_landmark) ITEM(poi_levee) ITEM(poi_library) ITEM(poi_locale) ITEM(poi_loudspeaker) ITEM(poi_mall) ITEM(poi_manmade_feature) ITEM(poi_marine) ITEM(poi_marine_type) ITEM(poi_mark) ITEM(poi_military) ITEM(poi_mine) ITEM(poi_nondangerous) ITEM(poi_oil_field) ITEM(poi_personal_service) ITEM(poi_pharmacy) ITEM(poi_post_removeme) ITEM(poi_public_office) ITEM(poi_repair_service) ITEM(poi_resort) ITEM(poi_rest_room_removeme) ITEM(poi_restaurant) ITEM(poi_restricted_area) ITEM(poi_restroom) ITEM(poi_sailing) ITEM(poi_scenic_area) ITEM(poi_school) ITEM(poi_service) ITEM(poi_shop_apparel) ITEM(poi_shop_computer) ITEM(poi_shop_department) ITEM(poi_shop_furnish_removeme) ITEM(poi_shop_grocery) ITEM(poi_shop_handg) ITEM(poi_shop_merchandise) ITEM(poi_shop_retail) ITEM(poi_shower) ITEM(poi_skiing) ITEM(poi_social_service) ITEM(poi_sounding) ITEM(poi_sport) ITEM(poi_stadium) ITEM(poi_subdivision_removeme) ITEM(poi_swimming) ITEM(poi_telephone) ITEM(poi_theater) ITEM(poi_tide) ITEM(poi_tower) ITEM(poi_trail) ITEM(poi_truck_stop) ITEM(poi_tunnel) ITEM(poi_wine) ITEM(poi_worship) ITEM(poi_wrecker) ITEM(poi_zoo) ITEM(rg_point) ITEM(point_unkn) ITEM(traffic_signals) ITEM(poi_gc_multi) ITEM(poi_gc_tradi) ITEM(poi_gc_event) ITEM(poi_gc_mystery) ITEM(poi_gc_question) ITEM(poi_gc_stages) ITEM(poi_gc_reference) ITEM(poi_gc_webcam) ITEM(poi_cafe) ITEM(nav_straight) ITEM(nav_turnaround) ITEM(nav_right_1) ITEM(nav_right_2) ITEM(nav_right_3) ITEM(nav_left_1) ITEM(nav_left_2) ITEM(nav_left_3) ITEM(nav_roundabout_r1) ITEM(nav_roundabout_r2) ITEM(nav_roundabout_r3) ITEM(nav_roundabout_r4) ITEM(nav_roundabout_r5) ITEM(nav_roundabout_r6) ITEM(nav_roundabout_r7) ITEM(nav_roundabout_r8) ITEM(nav_roundabout_l1) ITEM(nav_roundabout_l2) ITEM(nav_roundabout_l3) ITEM(nav_roundabout_l4) ITEM(nav_roundabout_l5) ITEM(nav_roundabout_l6) ITEM(nav_roundabout_l7) ITEM(nav_roundabout_l8) ITEM(poi_peak) ITEM(poi_rail_station) ITEM(poi_image) ITEM(mini_roundabout) ITEM(turning_circle) ITEM(poi_townhall) ITEM(poi_level_crossing) ITEM(poi_rail_halt) ITEM(poi_rail_tram_stop) ITEM(poi_wifi) ITEM(poi_bench) ITEM(poi_biergarten) ITEM(poi_boundary_stone) ITEM(poi_castle) ITEM(poi_hunting_stand) ITEM(poi_memorial) ITEM(poi_monument) ITEM(poi_shelter) ITEM(poi_fountain) ITEM(poi_potable_water) ITEM(poi_toilets) ITEM(poi_viewpoint) ITEM(poi_ruins) ITEM(nav_none) ITEM(nav_position) ITEM(nav_destination) ITEM(tec_common) ITEM(trackpoint_tracked) ITEM(announcement) ITEM(poi_post_box) ITEM(poi_post_office) ITEM(poi_school_university) ITEM(poi_school_college) ITEM(poi_motel) ITEM(poi_guesthouse) ITEM(poi_hostel) ITEM(poi_taxi) ITEM(poi_prison) ITEM(poi_kindergarten) ITEM(poi_shop_butcher) ITEM(poi_shop_baker) ITEM(poi_shop_kiosk) ITEM(poi_soccer) ITEM(poi_basketball) ITEM(poi_baseball) ITEM(poi_climbing) ITEM(poi_motor_sport) ITEM(poi_tennis) ITEM(house_number) ITEM(route_start) ITEM(route_end) ITEM(selected_point) ITEM(power_tower) ITEM(route_start_reverse) ITEM(log_entry) ITEM(poi_playground) ITEM(barrier_cycle) ITEM(barrier_bollard) ITEM(poi_vending_machine) ITEM(poi_recycling) ITEM(poi_hairdresser) ITEM(poi_shop_fruit) ITEM(poi_shop_bicycle) ITEM(poi_shop_florist) ITEM(poi_shop_optician) ITEM(poi_shop_beverages) ITEM(poi_nightclub) ITEM(poi_shop_shoes) ITEM(power_substation) ITEM(barrier_lift_gate) ITEM(traffic_sign_stop) ITEM(traffic_sign_city_limit) ITEM(poi_tree) ITEM(poi_shop_furniture) ITEM(poi_shop_parfum) ITEM(poi_bicycle_rental) ITEM(poi_bicycle_parking) ITEM(poi_car_sharing) ITEM(poi_shop_drugstore) ITEM(poi_shop_photo) ITEM(ch_node) ITEM(place_label) ITEM(vehicle) ITEM(vehicle_pedestrian) ITEM(bookmark_folder) ITEM(poi_pub) ITEM(poi_atm) ITEM(found_item) ITEM2(0x7ffffff0,poi_custom0) ITEM(poi_custom1) ITEM(poi_custom2) ITEM(poi_custom3) ITEM(poi_custom4) ITEM(poi_custom5) ITEM(poi_custom6) ITEM(poi_custom7) ITEM(poi_custom8) ITEM(poi_custom9) ITEM(poi_customa) ITEM(poi_customb) ITEM(poi_customc) ITEM(poi_customd) ITEM(poi_custome) ITEM(poi_customf) /* Line */ ITEM2(0x80000000,line) ITEM2(0x80000001,line_unspecified) ITEM(border_country) ITEM(border_state) ITEM(rail) ITEM(water_line) ITEM(street_nopass) ITEM(street_0) ITEM(street_1_city) ITEM(street_2_city) ITEM(street_3_city) ITEM(street_4_city) ITEM(highway_city) ITEM(street_1_land) ITEM(street_2_land) ITEM(street_3_land) ITEM(street_4_land) ITEM(street_n_lanes) ITEM(highway_land) ITEM(ramp) ITEM(roundabout) ITEM(ferry) ITEM(roadbook) ITEM(street_unkn) ITEM(street_route) ITEM(height_line_1) ITEM(height_line_2) ITEM(track) ITEM(height_line_3) ITEM(depth_line_1) ITEM(depth_line_2) ITEM(depth_line_3) ITEM(powerline) ITEM(pipeline) ITEM(time_zone) ITEM(marine_boundary) ITEM(marine_hazard) ITEM(rg_segment) ITEM(aeroway_runway) ITEM(aeroway_taxiway) ITEM(street_service) ITEM(coverage) ITEM(street_pedestrian) ITEM(bridge) ITEM(tunnel) ITEM(bridleway) ITEM(cycleway) ITEM(footway) ITEM(steps) ITEM(track_paved) ITEM(track_gravelled) ITEM(track_unpaved) ITEM(track_ground) ITEM(track_grass) ITEM(rail_narrow_gauge) ITEM(rail_light) ITEM(rail_subway) ITEM(rail_mono) ITEM(rail_tram) ITEM(rail_preserved) ITEM(rail_disused) ITEM(rail_abandoned) ITEM(lift_cable_car) ITEM(lift_chair) ITEM(lift_drag) ITEM(living_street) ITEM(bus_guideway) ITEM(street_construction) ITEM(border_civil) ITEM(border_political) ITEM(border_national_park) ITEM(water_river) ITEM(water_canal) ITEM(water_stream) ITEM(water_drain) ITEM(path) ITEM(hiking) ITEM(hiking_mountain) ITEM(hiking_mountain_demanding) ITEM(hiking_alpine) ITEM(hiking_alpine_demanding) ITEM(hiking_alpine_difficult) ITEM(street_parking_lane) ITEM(piste_nordic) ITEM(piste_downhill_novice) ITEM(piste_downhill_easy) ITEM(piste_downhill_intermediate) ITEM(piste_downhill_advanced) ITEM(piste_downhill_expert) ITEM(piste_downhill_freeride) ITEM(footway_and_piste_nordic) ITEM(tracking_0) ITEM(tracking_10) ITEM(tracking_20) ITEM(tracking_30) ITEM(tracking_40) ITEM(tracking_50) ITEM(tracking_60) ITEM(tracking_70) ITEM(tracking_80) ITEM(tracking_90) ITEM(tracking_100) ITEM(track_tracked) ITEM(house_number_interpolation_even) ITEM(house_number_interpolation_odd) ITEM(house_number_interpolation_all) ITEM(house_number_interpolation_alphabetic) ITEM(ditch) ITEM(hedge) ITEM(fence) ITEM(wall) ITEM(retaining_wall) ITEM(city_wall) ITEM(street_turn_restriction_no) ITEM(street_turn_restriction_only) ITEM(border_city) ITEM(border_county) ITEM(selected_line) ITEM(traffic_distortion) ITEM(street_route_occluded) ITEM(forest_way_1) ITEM(forest_way_2) ITEM(forest_way_3) ITEM(forest_way_4) ITEM(former_itinerary) ITEM(former_itinerary_part) /* Area */ ITEM2(0xc0000000,area) ITEM2(0xc0000001,area_unspecified) ITEM(poly_wood) ITEM(poly_water) ITEM(poly_town) ITEM(poly_cemetery) ITEM(poly_car_parking) ITEM(poly_industry) ITEM(poly_airport) ITEM(poly_hospital) ITEM(poly_park) ITEM(poly_sport) ITEM(poly_museum) ITEM(image) ITEM(image_path) ITEM(poly_commercial_center) ITEM(poly_golf_course) ITEM(poly_university) ITEM(poly_national_park) ITEM(poly_nature_park) ITEM(poly_flats) ITEM(poly_scrub) ITEM(poly_military_zone) ITEM(poly_marine) ITEM(plantation) ITEM(tundra) ITEM(tile) ITEM(submap) ITEM(poly_building) ITEM(poly_place) ITEM(poly_station) ITEM(poly_farm) ITEM(poly_sport_tennis) ITEM(poly_apron) ITEM(poly_terminal) ITEM(countryindex) ITEM(poly_sports_centre) ITEM(poly_sports_stadium) ITEM(poly_sports_track) ITEM(poly_sports_pitch) ITEM(poly_water_park) ITEM(poly_marina) ITEM(poly_fishing) ITEM(poly_theme_park) ITEM(poly_attraction) ITEM(poly_ruins) ITEM(poly_archaeological_site) ITEM(poly_artwork) ITEM(poly_zoo) ITEM(poly_camp_site) ITEM(poly_caravan_site) ITEM(poly_picnic_site) ITEM(poly_playground) ITEM(poly_allotments) ITEM(poly_village_green) ITEM(poly_recreation_ground) ITEM(poly_common) ITEM(poly_garden) ITEM(poly_nature_reserve) ITEM(poly_glacier) ITEM(poly_scree) ITEM(poly_fell) ITEM(poly_heath) ITEM(poly_marsh) ITEM(poly_mud) ITEM(poly_land) ITEM(poly_beach) ITEM(poly_quarry) ITEM(poly_landfill) ITEM(poly_retail) ITEM(poly_commercial) ITEM(poly_brownfield) ITEM(poly_greenfield) ITEM(poly_construction) ITEM(poly_railway) ITEM(poly_military) ITEM(poly_airfield) ITEM(poly_barracks) ITEM(poly_danger_area) ITEM(poly_range) ITEM(poly_naval_base) ITEM(poly_basin) ITEM(poly_reservoir) ITEM(poly_college) ITEM(poly_battlefield) ITEM(poly_pedestrian) ITEM(poly_plaza) ITEM(poly_service) ITEM(poly_street_1) ITEM(poly_street_2) ITEM(poly_street_3) ITEM(poly_wetland) ITEM(poly_aeroway_runway) ITEM(map_information) ITEM(selected_area) ITEM(poly_place1) ITEM(poly_place2) ITEM(poly_place3) ITEM(poly_place4) ITEM(poly_place5) ITEM(poly_place6) ITEM(poly_water_tiled) ITEM(poly_meadow) ITEM2(0xffffffff,last) navit-0.5.0~svn5643+dfsg.1/navit/keys.h000066400000000000000000000006551221777731700174530ustar00rootroot00000000000000#define NAVIT_KEY_MENU 1 /* ^A */ #define NAVIT_KEY_LEFT 2 /* ^B */ #define NAVIT_KEY_RIGHT 6 /* ^R */ #define NAVIT_KEY_BACKSPACE 8 /* ^H */ #define NAVIT_KEY_RETURN 13 /* ^M */ #define NAVIT_KEY_DOWN 14 /* ^N */ #define NAVIT_KEY_ZOOM_OUT 15 /* ^O */ #define NAVIT_KEY_UP 16 /* ^P */ #define NAVIT_KEY_ZOOM_IN 17 /* ^Q */ #define NAVIT_KEY_SEARCH 19 /* ^S */ #define NAVIT_KEY_BACK 27 /* Esc */ #define NAVIT_KEY_DELETE 127 navit-0.5.0~svn5643+dfsg.1/navit/layer.h000066400000000000000000000016041221777731700176070ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_LAYER_H #define NAVIT_LAYER_H enum layer_type { layer_town=0, layer_street, layer_poly, layer_end, }; #endif navit-0.5.0~svn5643+dfsg.1/navit/layout.c000066400000000000000000000352731221777731700200140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "item.h" #include "attr.h" #include "xmlconfig.h" #include "layout.h" #include "coord.h" #include "debug.h" struct layout * layout_new(struct attr *parent, struct attr **attrs) { struct layout *l; struct color def_color = {COLOR_BACKGROUND_}; struct attr *name_attr,*color_attr,*order_delta_attr,*font_attr,*day_attr,*night_attr,*active_attr; if (! (name_attr=attr_search(attrs, NULL, attr_name))) return NULL; l = g_new0(struct layout, 1); l->func=&layout_func; navit_object_ref((struct navit_object *)l); l->name = g_strdup(name_attr->u.str); if ((font_attr=attr_search(attrs, NULL, attr_font))) { l->font = g_strdup(font_attr->u.str); } if ((day_attr=attr_search(attrs, NULL, attr_daylayout))) { l->dayname = g_strdup(day_attr->u.str); } if ((night_attr=attr_search(attrs, NULL, attr_nightlayout))) { l->nightname = g_strdup(night_attr->u.str); } if ((color_attr=attr_search(attrs, NULL, attr_color))) l->color = *color_attr->u.color; else l->color = def_color; if ((order_delta_attr=attr_search(attrs, NULL, attr_order_delta))) l->order_delta=order_delta_attr->u.num; if ((active_attr=attr_search(attrs, NULL, attr_active))) l->active = active_attr->u.num; l->navit=parent->u.navit; return l; } struct attr_iter { GList *last; }; struct attr_iter * layout_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void layout_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } int layout_get_attr(struct layout *layout, enum attr_type type, struct attr *attr, struct attr_iter *iter) { GList *cursor,*layer; attr->type=type; switch (type) { case attr_name: attr->u.str=layout->name; return 1; case attr_cursor: cursor=layout->cursors; while (cursor) { if (!iter || iter->last == g_list_previous(cursor)) { attr->u.cursor=cursor->data; if (iter) iter->last=cursor; return 1; } cursor=g_list_next(cursor); } break; case attr_layer: layer=layout->layers; while (layer) { if (!iter || iter->last == g_list_previous(layer)) { attr->u.layer=layer->data; if (iter) iter->last=layer; return 1; } layer=g_list_next(layer); } break; case attr_active: attr->u.num=layout->active; break; default: break; } return 0; } int layout_add_attr(struct layout *layout, struct attr *attr) { switch (attr->type) { case attr_cursor: layout->cursors = g_list_append(layout->cursors, attr->u.cursor); break; case attr_layer: layout->layers = g_list_append(layout->layers, attr->u.layer); break; default: return 0; } layout->attrs=attr_generic_add_attr(layout->attrs, attr); return 1; } /** * Searchs the layout for a cursor with the given name. * * @param layout The layout * @param name The name * @returns A pointer to cursor with the given name or the name default or NULL. * @author Ralph Sennhauser (10/2009) */ struct cursor * layout_get_cursor(struct layout *this_, char *name) { GList *c; struct cursor *d=NULL; c=g_list_first(this_->cursors); while (c) { if (! strcmp(((struct cursor *)c->data)->name, name)) return c->data; if (! strcmp(((struct cursor *)c->data)->name, "default")) d=c->data; c=g_list_next(c); } return d; } struct cursor * cursor_new(struct attr *parent, struct attr **attrs) { struct attr *w, *h, *name, *interval, *sequence_range; struct cursor *this; w=attr_search(attrs, NULL, attr_w); h=attr_search(attrs, NULL, attr_h); if (! w || ! h) return NULL; this=g_new0(struct cursor,1); this->w=w->u.num; this->h=h->u.num; name=attr_search(attrs, NULL, attr_name); if (name) this->name=g_strdup(name->u.str); else this->name=g_strdup("default"); interval=attr_search(attrs, NULL, attr_interval); if (interval) this->interval=interval->u.num; sequence_range=attr_search(attrs, NULL, attr_sequence_range); if (sequence_range) { struct range *r=g_new0(struct range,1); r->min=sequence_range->u.range.min; r->max=sequence_range->u.range.max; this->sequence_range=r; } else { this->sequence_range=NULL; } dbg(2,"ret=%p\n", this); return this; } void cursor_destroy(struct cursor *this_) { if (this_->sequence_range) g_free(this_->sequence_range); if (this_->name) { g_free(this_->name); } g_free(this_); } int cursor_add_attr(struct cursor *this_, struct attr *attr) { switch (attr->type) { case attr_itemgra: this_->attrs=attr_generic_add_attr(this_->attrs, attr); return 1; default: break; } return 0; } static int layer_set_attr_do(struct layer *l, struct attr *attr, int init) { struct attr_iter *iter; struct navit_object *obj; struct attr layer; switch (attr->type) { case attr_active: l->active = attr->u.num; return 1; case attr_details: l->details = attr->u.num; return 1; case attr_name: g_free(l->name); l->name = g_strdup(attr->u.str); return 1; case attr_ref: navit_object_unref((struct navit_object *)l->ref); l->ref=NULL; obj=(struct navit_object *)l->navit; if (obj==NULL){ dbg(0, "Invalid layer reference '%s': Only layers inside a layout can use references.\n", attr->u.str); return 0; } iter=obj->func->iter_new(obj); while (obj->func->get_attr(obj, attr_layer, &layer, iter)) { if (!strcmp(layer.u.layer->name, attr->u.str)) { l->ref=(struct layer*)navit_object_ref(layer.u.navit_object); break; } } if (l->ref==NULL){ dbg(0, "Ignoring reference to unknown layer '%s' in layer '%s'.\n", attr->u.str, l->name); } obj->func->iter_destroy(iter); default: return 0; } } struct layer * layer_new(struct attr *parent, struct attr **attrs) { struct layer *l; l = g_new0(struct layer, 1); if (parent->type == attr_layout) l->navit=parent->u.layout->navit; l->func=&layer_func; navit_object_ref((struct navit_object *)l); l->active=1; for (;*attrs; attrs++) { layer_set_attr_do(l, *attrs, 1); } if (l->name==NULL){ dbg(0, "Ignoring layer without name.\n"); g_free(l); return NULL; } return l; } int layer_get_attr(struct layer *layer, enum attr_type type, struct attr *attr, struct attr_iter *iter) { attr->type=type; switch(type) { case attr_active: attr->u.num=layer->active; return 1; case attr_details: attr->u.num=layer->details; return 1; case attr_name: if (layer->name) { attr->u.str=layer->name; return 1; } break; default: return 0; } return 0; } int layer_add_attr(struct layer *layer, struct attr *attr) { switch (attr->type) { case attr_itemgra: layer->itemgras = g_list_append(layer->itemgras, attr->u.itemgra); return 1; default: return 0; } } int layer_set_attr(struct layer *layer, struct attr *attr) { return layer_set_attr_do(layer, attr, 0); } static void layer_destroy(struct layer *layer) { attr_list_free(layer->attrs); g_free(layer->name); g_free(layer); } struct itemgra * itemgra_new(struct attr *parent, struct attr **attrs) { struct itemgra *itm; struct attr *order, *item_types, *speed_range, *angle_range, *sequence_range; enum item_type *type; struct range defrange; itm = g_new0(struct itemgra, 1); order=attr_search(attrs, NULL, attr_order); item_types=attr_search(attrs, NULL, attr_item_types); speed_range=attr_search(attrs, NULL, attr_speed_range); angle_range=attr_search(attrs, NULL, attr_angle_range); sequence_range=attr_search(attrs, NULL, attr_sequence_range); defrange.min=0; defrange.max=32767; if (order) itm->order=order->u.range; else itm->order=defrange; if (speed_range) itm->speed_range=speed_range->u.range; else itm->speed_range=defrange; if (angle_range) itm->angle_range=angle_range->u.range; else itm->angle_range=defrange; if (sequence_range) itm->sequence_range=sequence_range->u.range; else itm->sequence_range=defrange; if (item_types) { type=item_types->u.item_types; while (type && *type != type_none) { itm->type=g_list_append(itm->type, GINT_TO_POINTER(*type)); type++; } } return itm; } int itemgra_add_attr(struct itemgra *itemgra, struct attr *attr) { switch (attr->type) { case attr_polygon: case attr_polyline: case attr_circle: case attr_text: case attr_icon: case attr_image: case attr_arrows: itemgra->elements = g_list_append(itemgra->elements, attr->u.element); return 1; default: dbg(0,"unknown: %s\n", attr_to_name(attr->type)); return 0; } } static void element_set_color(struct element *e, struct attr **attrs) { struct attr *color; color=attr_search(attrs, NULL, attr_color); if (color) e->color=*color->u.color; } static void element_set_background_color(struct color *c, struct attr **attrs) { struct attr *color; color=attr_search(attrs, NULL, attr_background_color); if (color) *c=*color->u.color; } static void element_set_text_size(struct element *e, struct attr **attrs) { struct attr *text_size; text_size=attr_search(attrs, NULL, attr_text_size); if (text_size) e->text_size=text_size->u.num; } static void element_set_polyline_width(struct element *e, struct attr **attrs) { struct attr *width; width=attr_search(attrs, NULL, attr_width); if (width) e->u.polyline.width=width->u.num; } static void element_set_polyline_directed(struct element *e, struct attr **attrs) { struct attr *directed; directed=attr_search(attrs, NULL, attr_directed); if (directed) e->u.polyline.directed=directed->u.num; } static void element_set_polyline_dash(struct element *e, struct attr **attrs) { struct attr *dash; int i; dash=attr_search(attrs, NULL, attr_dash); if (dash) { for (i=0; i<4; i++) { if (!dash->u.dash[i]) break; e->u.polyline.dash_table[i] = dash->u.dash[i]; } e->u.polyline.dash_num=i; } } static void element_set_polyline_offset(struct element *e, struct attr **attrs) { struct attr *offset; offset=attr_search(attrs, NULL, attr_offset); if (offset) e->u.polyline.offset=offset->u.num; } static void element_set_circle_width(struct element *e, struct attr **attrs) { struct attr *width; width=attr_search(attrs, NULL, attr_width); if (width) e->u.circle.width=width->u.num; } static void element_set_circle_radius(struct element *e, struct attr **attrs) { struct attr *radius; radius=attr_search(attrs, NULL, attr_radius); if (radius) e->u.circle.radius=radius->u.num; } struct polygon * polygon_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_new0(struct element, 1); e->type=element_polygon; element_set_color(e, attrs); return (struct polygon *)e; } struct polyline * polyline_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_new0(struct element, 1); e->type=element_polyline; element_set_color(e, attrs); element_set_polyline_width(e, attrs); element_set_polyline_directed(e, attrs); element_set_polyline_dash(e, attrs); element_set_polyline_offset(e, attrs); return (struct polyline *)e; } struct circle * circle_new(struct attr *parent, struct attr **attrs) { struct element *e; struct color color_black = {COLOR_BLACK_}; struct color color_white = {COLOR_WHITE_}; e = g_new0(struct element, 1); e->type=element_circle; e->color = color_black; e->u.circle.background_color = color_white; element_set_color(e, attrs); element_set_background_color(&e->u.circle.background_color, attrs); element_set_text_size(e, attrs); element_set_circle_width(e, attrs); element_set_circle_radius(e, attrs); return (struct circle *)e; } struct text * text_new(struct attr *parent, struct attr **attrs) { struct element *e; struct color color_black = {COLOR_BLACK_}; struct color color_white = {COLOR_WHITE_}; e = g_new0(struct element, 1); e->type=element_text; element_set_text_size(e, attrs); e->color = color_black; e->u.text.background_color = color_white; element_set_color(e, attrs); element_set_background_color(&e->u.text.background_color, attrs); return (struct text *)e; } struct icon * icon_new(struct attr *parent, struct attr **attrs) { struct element *e; struct attr *src,*w,*h,*rotation,*x,*y; src=attr_search(attrs, NULL, attr_src); if (! src) return NULL; e = g_malloc0(sizeof(*e)+strlen(src->u.str)+1); e->type=element_icon; e->u.icon.src=(char *)(e+1); if ((w=attr_search(attrs, NULL, attr_w))) e->u.icon.width=w->u.num; else e->u.icon.width=-1; if ((h=attr_search(attrs, NULL, attr_h))) e->u.icon.height=h->u.num; else e->u.icon.height=-1; if ((x=attr_search(attrs, NULL, attr_x))) e->u.icon.x=x->u.num; else e->u.icon.x=-1; if ((y=attr_search(attrs, NULL, attr_y))) e->u.icon.y=y->u.num; else e->u.icon.y=-1; if ((rotation=attr_search(attrs, NULL, attr_rotation))) e->u.icon.rotation=rotation->u.num; strcpy(e->u.icon.src,src->u.str); return (struct icon *)e; } struct image * image_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_malloc0(sizeof(*e)); e->type=element_image; return (struct image *)e; } struct arrows * arrows_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_malloc0(sizeof(*e)); e->type=element_arrows; element_set_color(e, attrs); return (struct arrows *)e; } int element_add_attr(struct element *e, struct attr *attr) { switch (attr->type) { case attr_coord: e->coord=g_realloc(e->coord,(e->coord_count+1)*sizeof(struct coord)); e->coord[e->coord_count++]=*attr->u.coord; return 1; default: return 0; } } struct object_func layout_func = { attr_layout, (object_func_new)layout_new, (object_func_get_attr)layout_get_attr, (object_func_iter_new)layout_attr_iter_new, (object_func_iter_destroy)layout_attr_iter_destroy, (object_func_set_attr)NULL, (object_func_add_attr)layout_add_attr, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; struct object_func layer_func = { attr_layer, (object_func_new)layer_new, (object_func_get_attr)layer_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)layer_set_attr, (object_func_add_attr)layer_add_attr, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)layer_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/layout.h000066400000000000000000000077711221777731700200230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_LAYOUT_H #define NAVIT_LAYOUT_H #include "item.h" #include "color.h" #ifdef __cplusplus extern "C" { #endif struct element { enum { element_point, element_polyline, element_polygon, element_circle, element_text, element_icon, element_image, element_arrows } type; struct color color; int text_size; union { struct element_point { char stub; } point; struct element_polyline { int width; int directed; int dash_num; int offset; unsigned char dash_table[4]; } polyline; struct element_polygon { char stub; } polygon; struct element_circle { int width; int radius; struct color background_color; } circle; struct element_icon { char *src; int width; int height; int rotation; int x; int y; } icon; struct element_text { struct color background_color; } text; } u; int coord_count; struct coord *coord; }; struct itemgra { struct range order,sequence_range,speed_range,angle_range; GList *type; GList *elements; }; struct layer { NAVIT_OBJECT struct navit *navit; char *name; int details; GList *itemgras; int active; struct layer *ref; }; struct cursor { struct attr **attrs; struct range *sequence_range; char *name; int w,h; int interval; }; struct layout { NAVIT_OBJECT struct navit *navit; char *name; char* dayname; char* nightname; char *font; struct color color; GList *layers; GList *cursors; int order_delta; int active; }; /* prototypes */ enum attr_type; struct arrows; struct attr; struct attr_iter; struct circle; struct cursor; struct element; struct icon; struct image; struct itemgra; struct layer; struct layout; struct polygon; struct polyline; struct text; struct layout *layout_new(struct attr *parent, struct attr **attrs); struct attr_iter *layout_attr_iter_new(void); void layout_attr_iter_destroy(struct attr_iter *iter); int layout_get_attr(struct layout *layout, enum attr_type type, struct attr *attr, struct attr_iter *iter); int layout_add_attr(struct layout *layout, struct attr *attr); struct cursor *layout_get_cursor(struct layout *this_, char *name); struct cursor *cursor_new(struct attr *parent, struct attr **attrs); void cursor_destroy(struct cursor *this_); int cursor_add_attr(struct cursor *this_, struct attr *attr); struct layer *layer_new(struct attr *parent, struct attr **attrs); int layer_get_attr(struct layer *layer, enum attr_type type, struct attr *attr, struct attr_iter *iter); int layer_add_attr(struct layer *layer, struct attr *attr); int layer_set_attr(struct layer *layer, struct attr *attr); struct itemgra *itemgra_new(struct attr *parent, struct attr **attrs); int itemgra_add_attr(struct itemgra *itemgra, struct attr *attr); struct polygon *polygon_new(struct attr *parent, struct attr **attrs); struct polyline *polyline_new(struct attr *parent, struct attr **attrs); struct circle *circle_new(struct attr *parent, struct attr **attrs); struct text *text_new(struct attr *parent, struct attr **attrs); struct icon *icon_new(struct attr *parent, struct attr **attrs); struct image *image_new(struct attr *parent, struct attr **attrs); struct arrows *arrows_new(struct attr *parent, struct attr **attrs); int element_add_attr(struct element *e, struct attr *attr); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/linguistics.c000066400000000000000000000252241221777731700210270ustar00rootroot00000000000000#include #include #include #include "debug.h" #include "linguistics.h" /* To have linguistics_casefold(linguistics_expand_special(s,i)) equal to linguistics_expand_special(linguistics_casefold(s),i), * please always specify here lower case expansions for special letters not having case variants (like german ß).*/ static const char *special[][3]={ /* Capital Diacritics */ /* ¨ Diaresis */ {"Ä","A","AE"}, {"Ë","E"}, {"Ï","I"}, {"Ö","O","OE"}, {"Ü","U","UE"}, {"Ÿ","Y"}, /* ˝ Double Acute Accent */ {"Ő","O","Ö"}, {"Ű","U","Ü"}, /* ´ Acute Accent */ {"Á","A"}, {"Ć","C"}, {"É","E"}, {"Í","I"}, {"Ĺ","L"}, {"Ń","N"}, {"Ó","O"}, {"Ŕ","R"}, {"Ś","S"}, {"Ú","U"}, {"Ý","Y"}, {"Ź","Z"}, /* ˛ Ogonek (nosinė) */ {"Ą","A"}, {"Ę","E"}, {"Į","I"}, {"Ų","U"}, /* ˙ Dot */ {"Ċ","C"}, {"Ė","E"}, {"Ġ","G"}, {"İ","I"}, {"Ŀ","L"}, {"Ż","Z"}, /* – Stroke */ {"Đ","D","DJ"}, /* Croatian Dj, not to be confused with the similar-looking Icelandic Eth */ {"Ħ","H"}, {"Ł","L"}, {"Ŧ","T"}, /* ˚ Ring */ {"Å","A","AA"}, {"Ů","U"}, /* ˇ Caron (haček, paukščiukas) */ {"Č","C"}, {"Ď","D"}, {"Ě","E"}, {"Ľ","L"}, {"Ň","N"}, {"Ř","R"}, {"Š","S"}, {"Ť","T"}, {"Ž","Z"}, /* / Slash */ {"Ø","O","OE"}, /* ¯ Macron */ {"Ā","A","AA"}, {"Ē","E","EE"}, {"Ī","I","II"}, {"Ō","O","OO"}, {"Ū","U","UU"}, /* ˘ Brevis */ {"Ă","A"}, {"Ĕ","E"}, {"Ğ","G"}, {"Ĭ","I"}, {"Ŏ","O"}, {"Ŭ","U"}, /* ^ Circumflex */ {"Â","A"}, {"Ĉ","C"}, {"Ê","E"}, {"Ĝ","G"}, {"Ĥ","H"}, {"Î","I"}, {"Ĵ","J"}, {"Ô","O"}, {"Ŝ","S"}, {"Û","U"}, {"Ŵ","W"}, {"Ŷ","Y"}, /* ¸ Cedilla */ {"Ç","C"}, {"Ģ","G","GJ"}, {"Ķ","K","KJ"}, {"Ļ","L","LJ"}, {"Ņ","N","NJ"}, {"Ŗ","R"}, {"Ş","S"}, {"Ţ","T"}, /* ~ Tilde */ {"Ã","A"}, {"Ĩ","I"}, {"Ñ","N"}, {"Õ","O"}, {"Ũ","U"}, /* ` Grave */ {"À","A"}, {"È","E"}, {"Ì","I"}, {"Ò","O"}, {"Ù","U"}, /* ligatures */ {"Æ","A","AE"}, {"IJ","IJ"}, {"Œ","O","OE"}, /* special letters */ {"Ð","D","DH"}, /* Icelandic Eth, not to be confused with the similar-looking Croatian Dj */ {"Ŋ","N","NG"}, {"Þ","T","TH"}, /* Small Diacritics */ /* ¨ Diaresis */ {"ä","a","ae"}, {"ë","e"}, {"ï","i"}, {"ö","o","oe"}, {"ü","u","ue"}, {"ÿ","y"}, /* ˝ Double Acute Accent */ {"ő","o","ö"}, {"ű","u","ü"}, /* ´ Acute Accent */ {"á","a"}, {"ć","c"}, {"é","e"}, {"í","i"}, {"ĺ","l"}, {"ń","n"}, {"ó","o"}, {"ŕ","r"}, {"ś","s"}, {"ú","u"}, {"ý","y"}, {"ź","z"}, /* ˛ Ogonek (nosinė) */ {"ą","a"}, {"ę","e"}, {"į","i"}, {"ų","u"}, /* ˙ Dot (and dotless i) */ {"ċ","c"}, {"ė","e"}, {"ġ","g"}, {"ı","i"}, {"ŀ","l"}, {"ż","z"}, /* – Stroke */ {"đ","d","dj"}, {"ħ","h"}, {"ł","l"}, {"ŧ","t"}, /* ˚ Ring */ {"å","a", "aa"}, {"ů","u"}, /* ˇ Caron (haček, paukščiukas) */ {"č","c"}, {"ď","d"}, {"ě","e"}, {"ľ","l"}, {"ň","n"}, {"ř","r"}, {"š","s"}, {"ť","t"}, {"ž","z"}, /* / Slash */ {"ø","o", "oe"}, /* Macron */ {"ā","a","aa"}, {"ē","e","ee"}, {"ī","i","ii"}, {"ō","o","oo"}, {"ū","u","uu"}, /* ˘ Brevis */ {"ă","a"}, {"ĕ","e"}, {"ğ","g"}, {"ĭ","i"}, {"ŏ","o"}, {"ŭ","u"}, /* ^ Circumflex */ {"â","a"}, {"ĉ","c"}, {"ê","e"}, {"ĝ","g"}, {"ĥ","h"}, {"î","i"}, {"ĵ","j"}, {"ô","o"}, {"ŝ","s"}, {"û","u"}, {"ŵ","w"}, {"ŷ","y"}, /* ¸ Cedilla */ {"ç","c"}, {"ģ","g","gj"}, {"ķ","k","kj"}, {"ļ","l","lj"}, {"ņ","n","nj"}, {"ŗ","r"}, {"ş","s"}, {"ţ","t"}, /* ~ Tilde */ {"ã","a"}, {"ĩ","i"}, {"õ","o"}, {"ñ","n"}, {"ũ","u"}, /* ` Grave */ {"à","a"}, {"è","e"}, {"ì","i"}, {"ò","o"}, {"ù","u"}, /* ligatures */ {"æ","a","ae"}, {"ij","ij"}, {"œ","o","oe"}, {"ß","s","ss"}, /* special letters */ {"ð","d","dh"}, {"ŋ","n","ng"}, {"þ","t","th"}, /* Cyrillic capital */ {"Ё","Е"}, {"І","I"}, {"Ї","I"}, {"Ў","У"}, {"Є","Е","Э"}, {"Ґ","Г"}, {"Ѓ","Г"}, {"Ђ","Д"}, {"Ќ","К"}, {"Љ","Л","ЛЬ"}, {"Њ","Н","НЬ"}, {"Џ","Ц"}, /* Cyrillic small */ {"ё","е"}, {"і","i"}, {"ї","i"}, {"ў","у"}, {"є","е","э"}, {"ґ","г"}, {"ѓ","г"}, {"ђ","д"}, {"ќ","к"}, {"љ","л","ль"}, {"њ","н","нь"}, {"џ","ц"}, }; /* Array of strings for case conversion * Even elements of array are strings of upper-case letters * Odd elements of array are strings of lower-case letters, in the order corresponding to directly preceeding even element. * Last element of array should be NULL. */ static const char *upperlower[]={ /*Latin diacritics*/ "ÄËÏÖÜŸŐŰÁĆÉÍĹŃÓŔŚÚÝŹĄĘĮŲĊĖĠİĿŻĐĦŁŦÅŮČĎĚĽŇŘŠŤŽØĀĒĪŌŪĂĔĞĬŎŬÂĈÊĜĤÎĴÔŜÛŴŶÇĢĶĻŅŖŞŢÃĨÑÕŨÀÈÌÒÙÆIJŒÐŊÞ", "äëïöüÿőűáćéíĺńóŕśúýźąęįųċėġıŀżđħłŧåůčďěľňřšťžøāēīōūăĕğĭŏŭâĉêĝĥîĵôŝûŵŷçģķļņŗşţãĩõñũàèìòùæijœðŋþ", /*Cyrillic*/ "АБВГҐЃДЂЕЄЁЖЗИЙКЌЛЉМНЊОПРСТУФХЦЏЧШЩЪЫЬЭЮЯІЇЎ", "абвгґѓдђеєёжзийкќлљмнњопрстуфхцџчшщъыьэюяіїў", NULL }; static GHashTable *casefold_hash, *special_hash; /* * @brief Prepare an utf-8 string for case insensitive comparison. * @param in String to prepeare. * @return String prepared for case insensitive search. Result shoud be g_free()d after use. */ char* linguistics_casefold(const char *in) { int len=strlen(in); const char *src=in; char *ret=g_new(char,len+1); char *dest=ret; char buf[10]; while(*src && dest-ret='A' && *src<='Z') { *dest++=*src++ - 'A' + 'a'; } else if (!(*src&128)) { *dest++=*src++; } else { int charlen; char *tmp, *folded; tmp=g_utf8_find_next_char(src,NULL); charlen=tmp-src+1; g_strlcpy(buf,src,charlen>10?10:charlen); folded=g_hash_table_lookup(casefold_hash,buf); if(folded) { while(*folded && dest-ret0) s=linguistics_expand_special(s1f,i); else s=s1f; word=s; while(word) { if(mode & linguistics_cmp_partial) ret=strncmp(word,s2,s2len); else ret=strcmp(word,s2); if(!ret || !(mode & linguistics_cmp_words)) break; word=linguistics_next_word(word); } if(i>0) g_free(s); if(!ret || !(mode & linguistics_cmp_expand)) break; } g_free(s1f); return ret; } /** * @brief Replace special characters in string (e.g. umlauts) with plain letters. * This is useful e.g. to canonicalize a string for comparison. * * @param str string to process * @param mode Replacement mode. 0=do nothing, 1=replace with single * UTF character, 2=replace with multiple letters if the commonly used * replacement has multitple letter (e.g. a-umlaut -> ae) * @returns copy of string, with characters replaced */ char * linguistics_expand_special(const char *str, int mode) { const char *in=str; char *out,*ret; int found=0; int ret_len=strlen(str); int in_rest=ret_len; out=ret=g_strdup(str); if (!mode) return ret; while (*in) { char *next=g_utf8_find_next_char(in, NULL); int len; int match=0; if(next) len=next-in; else len=strlen(in); in_rest-=len; if (len > 1) { char **spc=linguistics_get_special(in, next); if (spc) { const char *replace=spc[mode]; if (replace) { int replace_len=strlen(replace); if(out-ret+replace_len+in_rest>ret_len) { char *new_ret; ret_len+=(replace_len-len)*10; new_ret=g_realloc(ret,ret_len+1); out=new_ret+(out-ret); ret=new_ret; } dbg(1,"found %s %s %d %s %d\n",in,spc[0],len,replace,replace_len); strcpy(out, replace); out+=replace_len; match=1; } } } if (match) { found=1; in+=len; } else { while (len-- > 0) *out++=*in++; } } *out++='\0'; if (!found) { g_free(ret); ret=NULL; } return ret; } char * linguistics_next_word(char *str) { int len=strcspn(str, LINGUISTICS_WORD_SEPARATORS_ASCII); if (!str[len] || !str[len+1]) return NULL; return str+len+1; } int linguistics_search(const char *str) { if (!g_ascii_strcasecmp(str,"str")) return 0; if (!g_ascii_strcasecmp(str,"str.")) return 0; if (!g_ascii_strcasecmp(str,"strasse")) return 0; if (!g_ascii_strcasecmp(str,"weg")) return 0; return 1; } /** * @brief Copy one utf8 encoded char to newly allocated buffer. * * @param s pointer to the beginning of the char. * @return newly allocated nul-terminated string containing one utf8 encoded character. */ static char *linguistics_dup_utf8_char(const char *s) { char *ret, *next; next=g_utf8_find_next_char(s,NULL); ret=g_new(char, next-s+1); g_strlcpy(ret,s,next-s+1); return ret; } void linguistics_init(void) { int i; casefold_hash=g_hash_table_new_full(g_str_hash, g_str_equal,g_free,g_free); for (i = 0 ; upperlower[i]; i+=2) { int j,k; for(j=0,k=0;upperlower[i][j] && upperlower[i+1][k];) { char *s1=linguistics_dup_utf8_char(upperlower[i]+j); char *s2=linguistics_dup_utf8_char(upperlower[i+1]+k); g_hash_table_insert(casefold_hash,s1,s2); j+=strlen(s1); k+=strlen(s2); } } special_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i = 0 ; i < sizeof(special)/sizeof(special[0]); i++) g_hash_table_insert(special_hash,(gpointer)special[i][0],special[i]); } void linguistics_free(void) { g_hash_table_destroy(casefold_hash); g_hash_table_destroy(special_hash); casefold_hash=NULL; special_hash=NULL; } navit-0.5.0~svn5643+dfsg.1/navit/linguistics.h000066400000000000000000000010651221777731700210310ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif #define LINGUISTICS_WORD_SEPARATORS_ASCII " -/()'`" char *linguistics_expand_special(const char *str, int mode); char *linguistics_next_word(char *str); void linguistics_init(void); void linguistics_free(void); char *linguistics_casefold(const char *in); int linguistics_search(const char *str); enum linguistics_cmp_mode { linguistics_cmp_expand=1, linguistics_cmp_partial=2, linguistics_cmp_words=4 }; int linguistics_compare(const char *s1, const char *s2, enum linguistics_cmp_mode mode); #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/log.c000066400000000000000000000207241221777731700172530ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #include #include #include #include #include #include #include #include "file.h" #include "item.h" #include "event.h" #include "callback.h" #include "debug.h" #include "xmlconfig.h" #include "log.h" struct log_data { int len; int max_len; char *data; }; struct log { NAVIT_OBJECT FILE *f; int overwrite; int empty; int lazy; int mkdir; int flush_size; int flush_time; struct event_timeout *timer; struct callback *timer_callback; #ifdef HAVE_SYS_TIME_H struct timeval last_flush; #endif char *filename; char *filename_ex1; char *filename_ex2; struct log_data header; struct log_data data; struct log_data trailer; }; static void strftime_localtime(char *buffer, int size, char *fmt) { time_t t; struct tm *tm; t=time(NULL); tm=localtime(&t); strftime(buffer, 4096, fmt, tm); } static void expand_filenames(struct log *this_) { char *pos,buffer[4096]; int i; strftime_localtime(buffer, 4096, this_->filename); this_->filename_ex1=g_strdup(buffer); if ((pos=strstr(this_->filename_ex1,"%i"))) { #ifdef HAVE_API_ANDROID pos[1]='d'; #endif i=0; do { g_free(this_->filename_ex2); this_->filename_ex2=g_strdup_printf(this_->filename_ex1,i++); } while (file_exists(this_->filename_ex2)); #ifdef HAVE_API_ANDROID pos[1]='i'; #endif } else this_->filename_ex2=g_strdup(this_->filename_ex1); } static void log_set_last_flush(struct log *this_) { #ifdef HAVE_SYS_TIME_H gettimeofday(&this_->last_flush, NULL); #endif } static void log_open(struct log *this_) { char *mode; if (this_->overwrite) mode="w"; else mode="r+"; if (this_->mkdir) file_mkdir(this_->filename_ex2, 2); this_->f=fopen(this_->filename_ex2, mode); if (! this_->f) this_->f=fopen(this_->filename_ex2, "w"); if (! this_->f) return; if (!this_->overwrite) fseek(this_->f, 0, SEEK_END); this_->empty = !ftell(this_->f); log_set_last_flush(this_); } static void log_close(struct log *this_) { if (! this_->f) return; if (this_->trailer.len) fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f); fflush(this_->f); fclose(this_->f); this_->f=NULL; } static void log_flush(struct log *this_, enum log_flags flags) { long pos; if (this_->lazy && !this_->f) { if (!this_->data.len) return; log_open(this_); } if (! this_->f) return; if (this_->empty) { if (this_->header.len) fwrite(this_->header.data, 1, this_->header.len, this_->f); if (this_->header.len || this_->data.len) this_->empty=0; } fwrite(this_->data.data, 1, this_->data.len, this_->f); #ifndef HAVE_API_WIN32_BASE if (flags & log_flag_truncate) { pos=ftell(this_->f); ftruncate(fileno(this_->f), pos); } #endif if (this_->trailer.len) { pos=ftell(this_->f); if (pos > 0) { fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f); fseek(this_->f, pos, SEEK_SET); } } if (flags & log_flag_keep_pointer) fseek(this_->f, -this_->data.len, SEEK_CUR); fflush(this_->f); if (!(flags & log_flag_keep_buffer)) { g_free(this_->data.data); this_->data.data=NULL; this_->data.max_len=this_->data.len=0; } log_set_last_flush(this_); } static int log_flush_required(struct log *this_) { return this_->data.len > this_->flush_size; } static void log_change(struct log *this_) { log_flush(this_,0); log_close(this_); expand_filenames(this_); if (! this_->lazy) log_open(this_); } static int log_change_required(struct log *this_) { char buffer[4096]; strftime_localtime(buffer, 4096, this_->filename); return (strcmp(this_->filename_ex1, buffer) != 0); } static void log_timer(struct log *this_) { #ifdef HAVE_SYS_TIME_H struct timeval tv; int delta; gettimeofday(&tv, NULL); delta=(tv.tv_sec-this_->last_flush.tv_sec)*1000+(tv.tv_usec-this_->last_flush.tv_usec)/1000; dbg(1,"delta=%d flush_time=%d\n", delta, this_->flush_time); if (this_->flush_time && delta >= this_->flush_time*1000) log_flush(this_,0); #endif } int log_get_attr(struct log *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } struct log * log_new(struct attr * parent,struct attr **attrs) { struct log *ret=g_new0(struct log, 1); struct attr *data,*overwrite,*lazy,*mkdir,*flush_size,*flush_time; struct file_wordexp *wexp; char *filename, **wexp_data; dbg(1,"enter\n"); ret->func=&log_func; navit_object_ref((struct navit_object *)ret); data=attr_search(attrs, NULL, attr_data); if (! data) return NULL; filename=data->u.str; wexp=file_wordexp_new(filename); if (wexp && file_wordexp_get_count(wexp) > 0) { wexp_data=file_wordexp_get_array(wexp); filename=wexp_data[0]; } if (filename) ret->filename=g_strdup(filename); if (wexp) file_wordexp_destroy(wexp); overwrite=attr_search(attrs, NULL, attr_overwrite); if (overwrite) ret->overwrite=overwrite->u.num; lazy=attr_search(attrs, NULL, attr_lazy); if (lazy) ret->lazy=lazy->u.num; mkdir=attr_search(attrs, NULL, attr_mkdir); if (mkdir) ret->mkdir=mkdir->u.num; flush_size=attr_search(attrs, NULL, attr_flush_size); if (flush_size) ret->flush_size=flush_size->u.num; flush_time=attr_search(attrs, NULL, attr_flush_time); if (flush_time) ret->flush_time=flush_time->u.num; if (ret->flush_time) { dbg(1,"interval %d\n", ret->flush_time*1000); ret->timer_callback=callback_new_1(callback_cast(log_timer), ret); ret->timer=event_add_timeout(ret->flush_time*1000, 1, ret->timer_callback); } expand_filenames(ret); if (ret->lazy) log_set_last_flush(ret); else log_open(ret); ret->attrs=attr_list_dup(attrs); return ret; } void log_set_header(struct log *this_, char *data, int len) { this_->header.data=g_malloc(len); this_->header.max_len=this_->header.len=len; memcpy(this_->header.data, data, len); } void log_set_trailer(struct log *this_, char *data, int len) { this_->trailer.data=g_malloc(len); this_->trailer.max_len=this_->trailer.len=len; memcpy(this_->trailer.data, data, len); } void log_write(struct log *this_, char *data, int len, enum log_flags flags) { dbg(1,"enter\n"); if (log_change_required(this_)) { dbg(1,"log_change"); log_change(this_); } if (flags & log_flag_replace_buffer) this_->data.len=0; if (this_->data.len + len > this_->data.max_len) { dbg(2,"overflow\n"); this_->data.max_len+=16384; this_->data.data=g_realloc(this_->data.data,this_->data.max_len); } memcpy(this_->data.data+this_->data.len, data, len); this_->data.len+=len; if (log_flush_required(this_) || (flags & log_flag_force_flush)) log_flush(this_, flags); } void * log_get_buffer(struct log *this_, int *len) { if (len) *len=this_->data.len; return this_->data.data; } void log_printf(struct log *this_, char *fmt, ...) { char buffer[LOG_BUFFER_SIZE]; int size; va_list ap; va_start(ap, fmt); // Format the string and write it to the log size = g_vsnprintf(buffer, LOG_BUFFER_SIZE, fmt, ap); log_write(this_, buffer, size, 0); va_end(ap); } void log_destroy(struct log *this_) { dbg(0,"enter\n"); attr_list_free(this_->attrs); callback_destroy(this_->timer_callback); event_remove_timeout(this_->timer); log_flush(this_,0); log_close(this_); g_free(this_); } struct object_func log_func = { attr_log, (object_func_new)log_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navit_object_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)log_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/log.h000066400000000000000000000033731221777731700172610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_LOG_H #define NAVIT_LOG_H #define LOG_BUFFER_SIZE 256 /** * printf-style writing to the log file. A buffer of LOG_BUFFER_SIZE * bytes is preallocated for the complete format message, longer * messages will be truncated. */ enum log_flags { log_flag_replace_buffer=1, log_flag_force_flush=2, log_flag_keep_pointer=4, log_flag_keep_buffer=8, log_flag_truncate=16, }; /* prototypes */ enum attr_type; enum log_flags; struct attr; struct attr_iter; struct log; int log_get_attr(struct log *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct log *log_new(struct attr *parent, struct attr **attrs); void log_set_header(struct log *this_, char *data, int len); void log_set_trailer(struct log *this_, char *data, int len); void log_write(struct log *this_, char *data, int len, enum log_flags flags); void *log_get_buffer(struct log *this_, int *len); void log_printf(struct log *this_, char *fmt, ...); void log_destroy(struct log *this_); /* end of prototypes */ #endif navit-0.5.0~svn5643+dfsg.1/navit/main.c000066400000000000000000000343161221777731700174200ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #ifndef _WIN32 #include #include #endif #include "file.h" #include "debug.h" #include "main.h" #include "navit.h" #include "gui.h" #include "item.h" #include "xmlconfig.h" #include "coord.h" #include "route.h" #include "navigation.h" #include "event.h" #include "callback.h" #include "navit_nls.h" #include "util.h" #if HAVE_API_WIN32_BASE #include #include #endif #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif struct map_data *map_data_default; struct callback_list *cbl; #ifdef HAVE_API_WIN32 void setenv(char *var, char *val, int overwrite) { char *str=g_strdup_printf("%s=%s",var,val); if (overwrite || !getenv(var)) putenv(str); g_free(str); } #endif /* * environment_vars[][0:name,1-3:mode] * ':' replaced with NAVIT_PREFIX * '::' replaced with NAVIT_PREFIX and LIBDIR * '~' replaced with HOME */ static char *environment_vars[][5]={ {"NAVIT_LIBDIR", ":", "::/navit", ":\\lib", ":/lib"}, {"NAVIT_SHAREDIR", ":", ":/share/navit", ":", ":/share"}, {"NAVIT_LOCALEDIR", ":/../locale",":/share/locale",":\\locale", ":/locale"}, {"NAVIT_USER_DATADIR",":", "~/.navit", ":\\data", ":/home"}, {"NAVIT_LOGFILE", NULL, NULL, ":\\navit.log",NULL}, {"NAVIT_LIBPREFIX", "*/.libs/", NULL, NULL, NULL}, {NULL, NULL, NULL, NULL, NULL}, }; static void main_setup_environment(int mode) { int i=0; char *var,*val,*homedir; while ((var=environment_vars[i][0])) { val=environment_vars[i][mode+1]; if (val) { switch (val[0]) { case ':': if (val[1] == ':') val=g_strdup_printf("%s/%s%s", getenv("NAVIT_PREFIX"), LIBDIR+sizeof(PREFIX), val+2); else val=g_strdup_printf("%s%s", getenv("NAVIT_PREFIX"), val+1); break; case '~': homedir=getenv("HOME"); if (!homedir) homedir="./"; val=g_strdup_printf("%s%s", homedir, val+1); break; default: val=g_strdup(val); break; } setenv(var, val, 0); g_free(val); } i++; } } #ifdef HAVE_API_WIN32_BASE char *nls_table[][3]={ // NLS Table compiled by Nick "Number6" Geoghegan // Not an exhaustive list, but supports 99% of all languages in Windows //{"LANGNAME", "CTRYNAME", "Language Code"}, {"AFK", "ZAF", "af_ZA"}, // Afrikaans (South Africa) {"SQI", "ALB", "sq_AL"}, // Albanian (Albania) {"AMH", "ETH", "am_ET"}, // Amharic (Ethiopia) {"ARG", "DZA", "ar_DZ"}, // Arabic (Algeria) {"ARH", "BHR", "ar_BH"}, // Arabic (Bahrain) {"ARE", "EGY", "ar_EG"}, // Arabic (Egypt) {"ARI", "IRQ", "ar_IQ"}, // Arabic (Iraq) {"ARJ", "JOR", "ar_JO"}, // Arabic (Jordan) {"ARK", "KWT", "ar_KW"}, // Arabic (Kuwait) {"ARB", "LBN", "ar_LB"}, // Arabic (Lebanon) {"ARL", "LBY", "ar_LY"}, // Arabic (Libya) {"ARM", "MAR", "ar_MA"}, // Arabic (Morocco) {"ARO", "OMN", "ar_OM"}, // Arabic (Oman) {"ARQ", "QAT", "ar_QA"}, // Arabic (Qatar) {"ARA", "SAU", "ar_SA"}, // Arabic (Saudi Arabia) {"ARS", "SYR", "ar_SY"}, // Arabic (Syria) {"ART", "TUN", "ar_TN"}, // Arabic (Tunisia) {"ARU", "ARE", "ar_AE"}, // Arabic (U.A.E.) {"ARY", "YEM", "ar_YE"}, // Arabic (Yemen) {"HYE", "ARM", "hy_AM"}, // Armenian (Armenia) {"ASM", "IND", "as_IN"}, // Assamese (India) {"BAS", "RUS", "ba_RU"}, // Bashkir (Russia) {"EUQ", "ESP", "eu_ES"}, // Basque (Basque) {"BEL", "BLR", "be_BY"}, // Belarusian (Belarus) {"BNG", "BDG", "bn_BD"}, // Bengali (Bangladesh) {"BNG", "IND", "bn_IN"}, // Bengali (India) {"BRE", "FRA", "br_FR"}, // Breton (France) {"BGR", "BGR", "bg_BG"}, // Bulgarian (Bulgaria) {"CAT", "ESP", "ca_ES"}, // Catalan (Catalan) {"ZHH", "HKG", "zh_HK"}, // Chinese (Hong Kong S.A.R.) {"ZHM", "MCO", "zh_MO"}, // Chinese (Macao S.A.R.) {"CHS", "CHN", "zh_CN"}, // Chinese (People's Republic of China) {"ZHI", "SGP", "zh_SG"}, // Chinese (Singapore) {"CHT", "TWN", "zh_TW"}, // Chinese (Taiwan) {"COS", "FRA", "co_FR"}, // Corsican (France) {"HRV", "HRV", "hr_HR"}, // Croatian (Croatia) {"HRB", "BIH", "hr_BA"}, // Croatian (Latin, Bosnia and Herzegovina) {"CSY", "CZE", "cs_CZ"}, // Czech (Czech Republic) {"DAN", "DNK", "da_DK"}, // Danish (Denmark) {"NLB", "BEL", "nl_BE"}, // Dutch (Belgium) {"NLD", "NLD", "nl_NL"}, // Dutch (Netherlands) {"ENA", "AUS", "en_AU"}, // English (Australia) {"ENL", "BLZ", "en_BZ"}, // English (Belize) {"ENC", "CAN", "en_CA"}, // English (Canada) {"ENB", "CAR", "en_CB"}, // English (Caribbean) {"ENN", "IND", "en_IN"}, // English (India) {"ENI", "IRL", "en_IE"}, // English (Ireland) {"ENJ", "JAM", "en_JM"}, // English (Jamaica) {"ENM", "MYS", "en_MY"}, // English (Malaysia) {"ENZ", "NZL", "en_NZ"}, // English (New Zealand) {"ENP", "PHL", "en_PH"}, // English (Republic of the Philippines) {"ENE", "SGP", "en_SG"}, // English (Singapore) {"ENS", "ZAF", "en_ZA"}, // English (South Africa) {"ENT", "TTO", "en_TT"}, // English (Trinidad and Tobago) {"ENG", "GBR", "en_GB"}, // English (United Kingdom) {"ENU", "USA", "en_US"}, // English (United States) {"ENW", "ZWE", "en_ZW"}, // English (Zimbabwe) {"ETI", "EST", "et_EE"}, // Estonian (Estonia) {"FOS", "FRO", "fo_FO"}, // Faroese (Faroe Islands) {"FIN", "FIN", "fi_FI"}, // Finnish (Finland) {"FRB", "BEL", "fr_BE"}, // French (Belgium) {"FRC", "CAN", "fr_CA"}, // French (Canada) {"FRA", "FRA", "fr_FR"}, // French (France) {"FRL", "LUX", "fr_LU"}, // French (Luxembourg) {"FRM", "MCO", "fr_MC"}, // French (Principality of Monaco) {"FRS", "CHE", "fr_CH"}, // French (Switzerland) {"FYN", "NLD", "fy_NL"}, // Frisian (Netherlands) {"GLC", "ESP", "gl_ES"}, // Galician (Galician) {"KAT", "GEO", "ka_GE"}, // Georgian (Georgia) {"DEA", "AUT", "de_AT"}, // German (Austria) {"DEU", "DEU", "de_DE"}, // German (Germany) {"DEC", "LIE", "de_LI"}, // German (Liechtenstein) {"DEL", "LUX", "de_LU"}, // German (Luxembourg) {"DES", "CHE", "de_CH"}, // German (Switzerland) {"ELL", "GRC", "el_GR"}, // Greek (Greece) {"KAL", "GRL", "kl_GL"}, // Greenlandic (Greenland) {"GUJ", "IND", "gu_IN"}, // Gujarati (India) {"HEB", "ISR", "he_IL"}, // Hebrew (Israel) {"HIN", "IND", "hi_IN"}, // Hindi (India) {"HUN", "HUN", "hu_HU"}, // Hungarian (Hungary) {"ISL", "ISL", "is_IS"}, // Icelandic (Iceland) {"IBO", "NGA", "ig_NG"}, // Igbo (Nigeria) {"IND", "IDN", "id_ID"}, // Indonesian (Indonesia) {"IRE", "IRL", "ga_IE"}, // Irish (Ireland) {"XHO", "ZAF", "xh_ZA"}, // isiXhosa (South Africa) {"ZUL", "ZAF", "zu_ZA"}, // isiZulu (South Africa) {"ITA", "ITA", "it_IT"}, // Italian (Italy) {"ITS", "CHE", "it_CH"}, // Italian (Switzerland) {"JPN", "JPN", "ja_JP"}, // Japanese (Japan) {"KDI", "IND", "kn_IN"}, // Kannada (India) {"KKZ", "KAZ", "kk_KZ"}, // Kazakh (Kazakhstan) {"KHM", "KHM", "km_KH"}, // Khmer (Cambodia) {"KIN", "RWA", "rw_RW"}, // Kinyarwanda (Rwanda) {"SWK", "KEN", "sw_KE"}, // Kiswahili (Kenya) {"KOR", "KOR", "ko_KR"}, // Korean (Korea) {"KYR", "KGZ", "ky_KG"}, // Kyrgyz (Kyrgyzstan) {"LAO", "LAO", "lo_LA"}, // Lao (Lao P.D.R.) {"LVI", "LVA", "lv_LV"}, // Latvian (Latvia) {"LTH", "LTU", "lt_LT"}, // Lithuanian (Lithuania) {"LBX", "LUX", "lb_LU"}, // Luxembourgish (Luxembourg) {"MKI", "MKD", "mk_MK"}, // Macedonian (Former Yugoslav Republic of Macedonia) {"MSB", "BRN", "ms_BN"}, // Malay (Brunei Darussalam) {"MSL", "MYS", "ms_MY"}, // Malay (Malaysia) {"MYM", "IND", "ml_IN"}, // Malayalam (India) {"MLT", "MLT", "mt_MT"}, // Maltese (Malta) {"MRI", "NZL", "mi_NZ"}, // Maori (New Zealand) {"MAR", "IND", "mr_IN"}, // Marathi (India) {"MON", "MNG", "mn_MN"}, // Mongolian (Cyrillic, Mongolia) {"NEP", "NEP", "ne_NP"}, // Nepali (Nepal) {"NOR", "NOR", "nb_NO"}, // Norwegian, Bokmå(Norway) {"NON", "NOR", "nn_NO"}, // Norwegian, Nynorsk (Norway) {"OCI", "FRA", "oc_FR"}, // Occitan (France) {"ORI", "IND", "or_IN"}, // Oriya (India) {"PAS", "AFG", "ps_AF"}, // Pashto (Afghanistan) {"FAR", "IRN", "fa_IR"}, // Persian {"PLK", "POL", "pl_PL"}, // Polish (Poland) {"PTB", "BRA", "pt_BR"}, // Portuguese (Brazil) {"PTG", "PRT", "pt_PT"}, // Portuguese (Portugal) {"PAN", "IND", "pa_IN"}, // Punjabi (India) {"ROM", "ROM", "ro_RO"}, // Romanian (Romania) {"RMC", "CHE", "rm_CH"}, // Romansh (Switzerland) {"RUS", "RUS", "ru_RU"}, // Russian (Russia) {"SMG", "FIN", "se_FI"}, // Sami, Northern (Finland) {"SME", "NOR", "se_NO"}, // Sami, Northern (Norway) {"SMF", "SWE", "se_SE"}, // Sami, Northern (Sweden) {"SAN", "IND", "sa_IN"}, // Sanskrit (India) {"TSN", "ZAF", "tn_ZA"}, // Setswana (South Africa) {"SIN", "LKA", "si_LK"}, // Sinhala (Sri Lanka) {"SKY", "SVK", "sk_SK"}, // Slovak (Slovakia) {"SLV", "SVN", "sl_SI"}, // Slovenian (Slovenia) {"ESS", "ARG", "es_AR"}, // Spanish (Argentina) {"ESB", "BOL", "es_BO"}, // Spanish (Bolivia) {"ESL", "CHL", "es_CL"}, // Spanish (Chile) {"ESO", "COL", "es_CO"}, // Spanish (Colombia) {"ESC", "CRI", "es_CR"}, // Spanish (Costa Rica) {"ESD", "DOM", "es_DO"}, // Spanish (Dominican Republic) {"ESF", "ECU", "es_EC"}, // Spanish (Ecuador) {"ESE", "SLV", "es_SV"}, // Spanish (El Salvador) {"ESG", "GTM", "es_GT"}, // Spanish (Guatemala) {"ESH", "HND", "es_HN"}, // Spanish (Honduras) {"ESM", "MEX", "es_MX"}, // Spanish (Mexico) {"ESI", "NIC", "es_NI"}, // Spanish (Nicaragua) {"ESA", "PAN", "es_PA"}, // Spanish (Panama) {"ESZ", "PRY", "es_PY"}, // Spanish (Paraguay) {"ESR", "PER", "es_PE"}, // Spanish (Peru) {"ESU", "PRI", "es_PR"}, // Spanish (Puerto Rico) {"ESN", "ESP", "es_ES"}, // Spanish (Spain) {"EST", "USA", "es_US"}, // Spanish (United States) {"ESY", "URY", "es_UY"}, // Spanish (Uruguay) {"ESV", "VEN", "es_VE"}, // Spanish (Venezuela) {"SVF", "FIN", "sv_FI"}, // Swedish (Finland) {"SVE", "SWE", "sv_SE"}, // Swedish (Sweden) {"TAM", "IND", "ta_IN"}, // Tamil (India) {"TTT", "RUS", "tt_RU"}, // Tatar (Russia) {"TEL", "IND", "te_IN"}, // Telugu (India) {"THA", "THA", "th_TH"}, // Thai (Thailand) {"BOB", "CHN", "bo_CN"}, // Tibetan (PRC) {"TRK", "TUR", "tr_TR"}, // Turkish (Turkey) {"TUK", "TKM", "tk_TM"}, // Turkmen (Turkmenistan) {"UIG", "CHN", "ug_CN"}, // Uighur (PRC) {"UKR", "UKR", "uk_UA"}, // Ukrainian (Ukraine) {"URD", "PAK", "ur_PK"}, // Urdu (Islamic Republic of Pakistan) {"VIT", "VNM", "vi_VN"}, // Vietnamese (Vietnam) {"CYM", "GBR", "cy_GB"}, // Welsh (United Kingdom) {"WOL", "SEN", "wo_SN"}, // Wolof (Senegal) {"III", "CHN", "ii_CN"}, // Yi (PRC) {"YOR", "NGA", "yo_NG"}, // Yoruba (Nigeria) {NULL,NULL,NULL}, // Default - Can't find the language / Language not listed above }; static void win_set_nls(void) { char country[32],lang[32]; int i=0; #ifdef HAVE_API_WIN32_CE wchar_t wcountry[32],wlang[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, wlang, sizeof(wlang)); WideCharToMultiByte(CP_ACP,0,wlang,-1,lang,sizeof(lang),NULL,NULL); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, wcountry, sizeof(wcountry)); WideCharToMultiByte(CP_ACP,0,wcountry,-1,country,sizeof(country),NULL,NULL); #else GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, lang, sizeof(lang)); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, country, sizeof(country)); #endif while (nls_table[i][0]) { if (!strcmp(nls_table[i][0], lang) && !(strcmp(nls_table[i][1], country))) { dbg(1,"Setting LANG=%s for Lang %s Country %s\n",nls_table[i][2], lang, country); setenv("LANG",nls_table[i][2],0); return; } i++; } dbg(1,"Lang %s Country %s not found\n",lang,country); } #endif void main_init(const char *program) { char *s; #ifdef _UNICODE /* currently for wince */ wchar_t wfilename[MAX_PATH + 1]; #endif spawn_process_init(); cbl=callback_list_new(); #ifdef HAVE_API_WIN32_BASE win_set_nls(); #endif setenv("LC_NUMERIC","C",1); setlocale(LC_ALL,""); setlocale(LC_NUMERIC,"C"); #if !defined _WIN32 && !defined _WIN32_WCE if (file_exists("navit.c") || file_exists("navit.o") || file_exists("navit.lo") || file_exists("version.h")) { char buffer[PATH_MAX]; printf("%s",_("Running from source directory\n")); getcwd(buffer, PATH_MAX); /* libc of navit returns "dummy" */ setenv("NAVIT_PREFIX", buffer, 0); main_setup_environment(0); } else { if (!getenv("NAVIT_PREFIX")) { int l; int progpath_len; char *progpath="/bin/navit"; l=strlen(program); progpath_len=strlen(progpath); if (l > progpath_len && !strcmp(program+l-progpath_len,progpath)) { s=g_strdup(program); s[l-progpath_len]='\0'; if (strcmp(s, PREFIX)) printf(_("setting '%s' to '%s'\n"), "NAVIT_PREFIX", s); setenv("NAVIT_PREFIX", s, 0); g_free(s); } else setenv("NAVIT_PREFIX", PREFIX, 0); } #ifdef HAVE_API_ANDROID main_setup_environment(3); #else main_setup_environment(1); #endif } #else /* _WIN32 || _WIN32_WCE */ if (!getenv("NAVIT_PREFIX")) { char filename[MAX_PATH + 1], *end; int len; *filename = '\0'; #ifdef _UNICODE /* currently for wince */ if (GetModuleFileNameW(NULL, wfilename, MAX_PATH)) { wcstombs(filename, wfilename, MAX_PATH); #else if (GetModuleFileName(NULL, filename, MAX_PATH)) { #endif end = strrchr(filename, L'\\'); /* eliminate the file name which is on the right side */ if(end) *end = '\0'; } len=strlen(filename); if (len > 4 && !strcmp(filename+len-4,"\\bin")) { filename[len-4]='\0'; } setenv("NAVIT_PREFIX", filename, 0); } if (!getenv("HOME")) setenv("HOME", getenv("NAVIT_PREFIX"), 0); main_setup_environment(2); #endif /* _WIN32 || _WIN32_WCE */ s = getenv("NAVIT_WID"); if (s) { setenv("SDL_WINDOWID", s, 0); } } navit-0.5.0~svn5643+dfsg.1/navit/main.h000066400000000000000000000025151221777731700174210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAIN_H #define NAVIT_MAIN_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ struct navit; struct iter; struct attr; struct iter * main_iter_new(void); void main_iter_destroy(struct iter *iter); struct navit * main_get_navit(struct iter *iter); void main_add_navit(struct navit *nav); void main_remove_navit(struct navit *nav); int main_add_attr(struct attr *attr); int main_remove_attr(struct attr *attr); void main_init(const char *program); void main_init_nls(void); int main(int argc, char **argv); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/map-share.h000066400000000000000000000017201221777731700203470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAP_SHARE_H #define NAVIT_MAP_SHARE_H void map_srv_start_poa(CORBA_ORB orb, CORBA_Environment * ev); CORBA_Object map_srv_start_object(CORBA_Environment * ev, struct container *co); #endif navit-0.5.0~svn5643+dfsg.1/navit/map.c000066400000000000000000000465771221777731700172650ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains code that makes navit able to load maps * * This file contains the code that makes navit able to load maps. Because * navit is able to open maps in different formats, this code does not handle * any map format itself. This is done by map plugins which register to this * code by calling plugin_register_map_type(). * * When opening a new map, the map plugin will return a pointer to a map_priv * struct, which can be defined by the map plugin and contains whatever private * data the map plugin needs to access the map. This pointer will also be used * as a "handle" to access the map opened. * * A common task is to create a "map rect". A map rect is a rectangular part of * the map, that one can for example retrieve items from. It is not possible to * retrieve items directly from the complete map. Creating a map rect returns a * pointer to a map_rect_priv, which contains private data for the map rect and * will be used as "handle" for this map rect. */ #include #include #include "debug.h" #include "coord.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "transform.h" #include "plugin.h" #include "callback.h" #include "country.h" #include "xmlconfig.h" /** * @brief Holds information about a map * * This structure holds information about a map. */ struct map { NAVIT_OBJECT struct map_methods meth; /**< Structure with pointers to the map plugin's functions */ struct map_priv *priv; /**< Private data of the map, only known to the map plugin */ struct callback_list *attr_cbl; /**< List of callbacks that are called when attributes change */ }; /** * @brief Describes a rectangular extract of a map * * This structure describes a rectangular extract of a map. */ struct map_rect { struct map *m; /**< The map this extract is from */ struct map_rect_priv *priv; /**< Private data of this map rect, only known to the map plugin */ }; /** * @brief Opens a new map * * This function opens a new map based on the attributes passed. This function * takes the attribute "attr_type" to determine which type of map to open and passes * all attributes to the map plugin's function that was specified in the * plugin_register_new_map_type()-call. * * Note that every plugin should accept an attribute of type "attr_data" to be passed * with the filename of the map to be opened as value. * * @param attrs Attributes specifying which map to open, see description * @return The opened map or NULL on failure */ struct map * map_new(struct attr *parent, struct attr **attrs) { struct map *m; struct map_priv *(*maptype_new)(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl); struct attr *type=attr_search(attrs, NULL, attr_type); if (! type) { dbg(0,"missing type\n"); return NULL; } maptype_new=plugin_get_map_type(type->u.str); if (! maptype_new) { dbg(0,"invalid type '%s'\n", type->u.str); return NULL; } m=g_new0(struct map, 1); m->attrs=attr_list_dup(attrs); m->func=&map_func; navit_object_ref((struct navit_object *)m); m->attr_cbl=callback_list_new(); m->priv=maptype_new(&m->meth, attrs, m->attr_cbl); if (! m->priv) { map_destroy(m); m=NULL; } return m; } /** * @brief Gets an attribute from a map * * @param this_ The map the attribute should be read from * @param type The type of the attribute to be read * @param attr Pointer to an attrib-structure where the attribute should be written to * @param iter (NOT IMPLEMENTED) Used to iterate through all attributes of a type. Set this to NULL to get the first attribute, set this to an attr_iter to get the next attribute * @return True if the attribute type was found, false if not */ int map_get_attr(struct map *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret=0; if (this_->meth.map_get_attr) ret=this_->meth.map_get_attr(this_->priv, type, attr); if (!ret) ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); if (!ret && type == attr_active) { attr->type=type; attr->u.num=1; return 1; } return ret; } /** * @brief Sets an attribute of a map * * This sets an attribute of a map, overwriting an attribute of the same type if it * already exists. This function also calls all the callbacks that are registred * to be called when attributes change. * * @param this_ The map to set the attribute of * @param attr The attribute to set * @return True if the attr could be set, false otherwise */ int map_set_attr(struct map *this_, struct attr *attr) { this_->attrs=attr_generic_set_attr(this_->attrs, attr); if (this_->meth.map_set_attr) this_->meth.map_set_attr(this_->priv, attr); callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); return 1; } /** * @brief Registers a new callback for attribute-change * * This function registers a new callback function that should be called if the attributes * of the map change. * * @param this_ The map to associate the callback with * @param cb The callback to add */ void map_add_callback(struct map *this_, struct callback *cb) { callback_list_add(this_->attr_cbl, cb); } /** * @brief Removes a callback from the list of attribute-change callbacks * * This function removes one callback from the list of callbacks functions that should be called * when attributes of the map change. * * @param this_ The map to remove the callback from * @param cb The callback to remove */ void map_remove_callback(struct map *this_, struct callback *cb) { callback_list_remove(this_->attr_cbl, cb); } /** * @brief Checks if strings from a map have to be converted * * @param this_ Map to be checked for the need to convert strings * @return True if strings from the map have to be converted, false otherwise */ int map_requires_conversion(struct map *this_) { return (this_->meth.charset != NULL && strcmp(this_->meth.charset, "utf-8")); } /** * @brief Converts a string from a map * * @param this_ The map the string to be converted is from * @param str The string to be converted * @return The converted string. It has to be map_convert_free()d after use. */ char * map_convert_string(struct map *this_, char *str) { return g_convert(str, -1,"utf-8",this_->meth.charset,NULL,NULL,NULL); } char * map_convert_dup(char *str) { return g_strdup(str); } /** * @brief Frees the memory allocated for a converted string * * @param str The string to be freed */ void map_convert_free(char *str) { g_free(str); } /** * @brief Returns the projection of a map * * @param this_ The map to return the projection of * @return The projection of the map */ enum projection map_projection(struct map *this_) { return this_->meth.pro; } /** * @brief Sets the projection of a map * * @param this_ The map to set the projection of * @param pro The projection to be set */ void map_set_projection(struct map *this_, enum projection pro) { this_->meth.pro=pro; } /** * @brief Destroys an opened map * * @param m The map to be destroyed */ void map_destroy(struct map *m) { if (!m) return; if (m->priv) m->meth.map_destroy(m->priv); attr_list_free(m->attrs); callback_list_destroy(m->attr_cbl); g_free(m); } /** * @brief Creates a new map rect * * This creates a new map rect, which can be used to retrieve items from a map. If * sel is a linked-list of selections, all of them will be used. If you pass NULL as * sel, this means "get me the whole map". * * @param m The map to build the rect on * @param sel Map selection to choose the rectangle - may be NULL, see description * @return A new map rect */ struct map_rect * map_rect_new(struct map *m, struct map_selection *sel) { struct map_rect *mr; #if 0 printf("map_rect_new 0x%x,0x%x-0x%x,0x%x\n", r->lu.x, r->lu.y, r->rl.x, r->rl.y); #endif mr=g_new0(struct map_rect, 1); mr->m=m; mr->priv=m->meth.map_rect_new(m->priv, sel); if (! mr->priv) { g_free(mr); mr=NULL; } return mr; } /** * @brief Gets the next item from a map rect * * Returns an item from a map rect and advances the "item pointer" one step further, * so that at the next call the next item is returned. Returns NULL if there are no more items. * * @param mr The map rect to return an item from * @return An item from the map rect */ struct item * map_rect_get_item(struct map_rect *mr) { struct item *ret; dbg_assert(mr != NULL); dbg_assert(mr->m != NULL); dbg_assert(mr->m->meth.map_rect_get_item != NULL); ret=mr->m->meth.map_rect_get_item(mr->priv); if (ret) ret->map=mr->m; return ret; } /** * @brief Returns the item specified by the ID * * @param mr The map rect to search for the item * @param id_hi High part of the ID to be found * @param id_lo Low part of the ID to be found * @return The item with the specified ID or NULL if not found */ struct item * map_rect_get_item_byid(struct map_rect *mr, int id_hi, int id_lo) { struct item *ret=NULL; dbg_assert(mr != NULL); dbg_assert(mr->m != NULL); if (mr->m->meth.map_rect_get_item_byid) ret=mr->m->meth.map_rect_get_item_byid(mr->priv, id_hi, id_lo); if (ret) ret->map=mr->m; return ret; } /** * @brief Destroys a map rect * * @param mr The map rect to be destroyed */ void map_rect_destroy(struct map_rect *mr) { if (mr) { mr->m->meth.map_rect_destroy(mr->priv); g_free(mr); } } /** * @brief Holds information about a search on a map * * This structure holds information about a search performed on a map. This can be * used as "handle" to retrieve items from a search. */ struct map_search { struct map *m; struct attr search_attr; void *priv; }; /** * @brief Starts a search on a map * * This function starts a search on a map. What attributes one can search for depends on the * map plugin. * * The OSM/binfile plugin currently supports: attr_town_name, attr_street_name * The MG plugin currently supports: ttr_town_postal, attr_town_name, attr_street_name * * If you enable partial matches bear in mind that the search matches only the begin of the * strings - a search for a street named "street" would match to "streetfoo", but not to * "somestreet". Search is case insensitive. * * The item passed to this function specifies a "superior item" to "search within" - e.g. a town * in which we want to search for a street, or a country in which to search for a town. * * Please also note that the search for countries is not handled by map plugins but by navit internally - * have a look into country.c for details. Because of that every map plugin has to accept a country item * to be passed as "superior item". * * Note: If you change something here, please make sure to also update the documentation of mapset_search_new() * in mapset.c! * * @param m The map that should be searched * @param item Specifies a superior item to "search within" (see description) * @param search_attr Attribute specifying what to search for. See description. * @param partial Set this to true to also have partial matches. See description. * @return A new map search struct for this search */ struct map_search * map_search_new(struct map *m, struct item *item, struct attr *search_attr, int partial) { struct map_search *this_; dbg(1,"enter(%p,%p,%p,%d)\n", m, item, search_attr, partial); dbg(1,"0x%x 0x%x 0x%x\n", attr_country_all, search_attr->type, attr_country_name); this_=g_new0(struct map_search,1); this_->m=m; this_->search_attr=*search_attr; if ((search_attr->type >= attr_country_all && search_attr->type <= attr_country_name) || search_attr->type == attr_country_id) this_->priv=country_search_new(&this_->search_attr, partial); else { if (m->meth.map_search_new) { if (m->meth.charset) this_->search_attr.u.str=g_convert(this_->search_attr.u.str, -1,m->meth.charset,"utf-8",NULL,NULL,NULL); this_->priv=m->meth.map_search_new(m->priv, item, &this_->search_attr, partial); if (! this_->priv) { g_free(this_); this_=NULL; } } else { g_free(this_); this_=NULL; } } return this_; } /** * @brief Returns an item from a map search * * This returns an item of the result of a search on a map and advances the "item pointer" one step, * so that at the next call the next item will be returned. If there are no more items in the result * NULL is returned. * * @param this_ Map search struct of the search * @return One item of the result */ struct item * map_search_get_item(struct map_search *this_) { struct item *ret; if (! this_) return NULL; if ((this_->search_attr.type >= attr_country_all && this_->search_attr.type <= attr_country_name) || this_->search_attr.type == attr_country_id) return country_search_get_item(this_->priv); ret=this_->m->meth.map_search_get_item(this_->priv); if (ret) ret->map=this_->m; return ret; } /** * @brief Destroys a map search struct * * @param this_ The map search struct to be destroyed */ void map_search_destroy(struct map_search *this_) { if (! this_) return; if (this_->search_attr.type >= attr_country_all && this_->search_attr.type <= attr_country_name) country_search_destroy(this_->priv); else { if (this_->m->meth.charset) g_free(this_->search_attr.u.str); this_->m->meth.map_search_destroy(this_->priv); } g_free(this_); } /** * @brief Creates a new rectangular map selection * * @param center Coordinates of the center of the new rectangle * @param distance Distance of the rectangle's borders from the center * @param order Desired order of the new selection * @return The new map selection */ struct map_selection * map_selection_rect_new(struct pcoord *center, int distance, int order) { struct map_selection *ret=g_new0(struct map_selection, 1); ret->order=order; ret->range=item_range_all; ret->u.c_rect.lu.x=center->x-distance; ret->u.c_rect.lu.y=center->y+distance; ret->u.c_rect.rl.x=center->x+distance; ret->u.c_rect.rl.y=center->y-distance; return ret; } /** * @brief Duplicates a map selection, transforming coordinates * * This duplicates a map selection and at the same time transforms the internal * coordinates of the selection from one projection to another. * * @param sel The map selection to be duplicated * @param from The projection used for the selection at the moment * @param to The projection that should be used for the duplicated selection * @return A duplicated, transformed map selection */ struct map_selection * map_selection_dup_pro(struct map_selection *sel, enum projection from, enum projection to) { struct map_selection *next,**last; struct map_selection *ret=NULL; last=&ret; while (sel) { next = g_new(struct map_selection, 1); *next=*sel; if (from != projection_none || to != projection_none) { transform_from_to(&sel->u.c_rect.lu, from, &next->u.c_rect.lu, to); transform_from_to(&sel->u.c_rect.rl, from, &next->u.c_rect.rl, to); } *last=next; last=&next->next; sel = sel->next; } return ret; } /** * @brief Duplicates a map selection * * @param sel The map selection to duplicate * @return The duplicated map selection */ struct map_selection * map_selection_dup(struct map_selection *sel) { return map_selection_dup_pro(sel, projection_none, projection_none); } /** * @brief Destroys a map selection * * @param sel The map selection to be destroyed */ void map_selection_destroy(struct map_selection *sel) { struct map_selection *next; while (sel) { next = sel->next; g_free(sel); sel = next; } } /** * @brief Checks if a selection contains a rectangle containing an item * * This function checks if a selection contains a rectangle which exactly contains * an item. The rectangle is automatically built around the given item. * * @param sel The selection to be checked * @param item The item that the rectangle should be built around * @return True if the rectangle is within the selection, false otherwise */ int map_selection_contains_item_rect(struct map_selection *sel, struct item *item) { struct coord c; struct coord_rect r; int count=0; while (item_coord_get(item, &c, 1)) { if (! count) { r.lu=c; r.rl=c; } else coord_rect_extend(&r, &c); count++; } if (! count) return 0; return map_selection_contains_rect(sel, &r); } /** * @brief Checks if a selection contains a item range * * This function checks if a selection contains at least one of the items in range * * @param sel The selection to be checked * @param follow Whether the next pointer of the selection should be followed * @param ranges The item ranges to be checked * @count the number of elements in ranges * @return True if there is a match, false otherwise */ int map_selection_contains_item_range(struct map_selection *sel, int follow, struct item_range *range, int count) { int i; if (! sel) return 1; while (sel) { for (i = 0 ; i < count ; i++) { if (item_range_intersects_range(&sel->range, &range[i])) return 1; } if (! follow) break; sel=sel->next; } return 0; } /** * @brief Checks if a selection contains a item * * This function checks if a selection contains a item type * * @param sel The selection to be checked * @param follow Whether the next pointer of the selection should be followed * @param item The item type to be checked * @return True if there is a match, false otherwise */ int map_selection_contains_item(struct map_selection *sel, int follow, enum item_type type) { if (! sel) return 1; while (sel) { if (item_range_contains_item(&sel->range, type)) return 1; if (! follow) break; sel=sel->next; } return 0; } /** * @brief Checks if a pointer points to the private data of a map * * @param map The map whose private data should be checked. * @param priv The private data that should be checked. * @return True if priv is the private data of map */ int map_priv_is(struct map *map, struct map_priv *priv) { return (map->priv == priv); } void map_dump_filedesc(struct map *map, FILE *out) { struct map_rect *mr=map_rect_new(map, NULL); struct item *item; while ((item = map_rect_get_item(mr))) item_dump_filedesc(item, map, out); map_rect_destroy(mr); } void map_dump_file(struct map *map, const char *file) { FILE *f; f=fopen(file,"w"); if (f) { map_dump_filedesc(map, f); fclose(f); } else dbg(0,"failed to open file '%s'\n",file); } void map_dump(struct map *map) { map_dump_filedesc(map, stdout); } struct item * map_rect_create_item(struct map_rect *mr, enum item_type type_) { if(mr && mr->priv && mr->m) { return mr->m->meth.map_rect_create_item(mr->priv, type_) ; } else { return NULL; } } struct object_func map_func = { attr_map, (object_func_new)map_new, (object_func_get_attr)map_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)map_set_attr, (object_func_add_attr)NULL, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)map_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/map.h000066400000000000000000000240671221777731700172600ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains exported functions / structures for map.c * * This file contains code that works together with map.c and that is exported * to other modules. */ #ifndef NAVIT_MAP_H #define NAVIT_MAP_H #ifdef __cplusplus extern "C" { #endif struct map_priv; struct attr; #include "coord.h" #include "point.h" #include "layer.h" #include "debug.h" #define WORLD_BOUNDINGBOX_MIN_X -20000000 #define WORLD_BOUNDINGBOX_MAX_X 20000000 #define WORLD_BOUNDINGBOX_MIN_Y -20000000 #define WORLD_BOUNDINGBOX_MAX_Y 20000000 /** * @brief Used to select data from a map * * This struct is used to select data from a map. This one the one hand builds a * rectangle on the map and on the other hand selects an order for items of each * layer. Note that passing NULL instead of a pointer to such a struct often means * "get me everything". * * It's possible to link multiple selections in a linked list, see below. */ struct map_selection { struct map_selection *next; /**< Linked-List pointer */ union { struct coord_rect c_rect; /**< For building the rectangle based on coordinates */ struct point_rect p_rect; /**< For building the rectangle based on points */ } u; int order; /**< Holds the order */ struct item_range range; /**< Range of items which should be delivered */ }; /** * @brief Holds all functions a map plugin has to implement to be useable * * This structure holds pointers to a map plugin's functions navit's core will call * to communicate with the plugin. For further information look into map.c - there exist * functions with the same names acting more or less as "wrappers" around the functions here. * Especially the arguments (and their meaning) of each function will be described there. */ struct map_methods { enum projection pro; /**< The projection used for that type of map */ char *charset; /**< The charset this map uses - e.g. "iso8859-1" or "utf-8". Please specify this in a form so that g_convert() can handle it. */ void (*map_destroy)(struct map_priv *priv); /**< Function used to destroy ("close") a map. */ struct map_rect_priv * (*map_rect_new)(struct map_priv *map, struct map_selection *sel); /**< Function to create a new map rect on the map. */ void (*map_rect_destroy)(struct map_rect_priv *mr); /**< Function to destroy a map rect */ struct item * (*map_rect_get_item)(struct map_rect_priv *mr); /**< Function to return the next item from a map rect */ struct item * (*map_rect_get_item_byid)(struct map_rect_priv *mr, int id_hi, int id_lo); /**< Function to get an item with a specific ID from a map rect */ struct map_search_priv *(*map_search_new)(struct map_priv *map, struct item *item, struct attr *search, int partial); /**< Function to start a new search on the map */ void (*map_search_destroy)(struct map_search_priv *ms); /**< Function to destroy a map search struct */ struct item * (*map_search_get_item)(struct map_search_priv *ms); /**< Function to get the next item of a search on the map */ struct item * (*map_rect_create_item)(struct map_rect_priv *mr, enum item_type type); /**< Function to create a new item in the map */ int (*map_get_attr)(struct map_priv *priv, enum attr_type type, struct attr *attr); int (*map_set_attr)(struct map_priv *priv, struct attr *attr); }; /** * @brief Checks if a coordinate is within a map selection * * Checks if a coordinate is within a map selection. Note that since a selection of NULL * means "select everything", with sel = NULL this will always return true. If there are * more than one selection in a linked-list, it is sufficient if only one of the selections * contains the coordinate. * * @param sel The selection to check if the point is within * @param c Coordinate to check if it is within the selection * @return True if the coordinate is within one of the selections, False otherwise */ static inline int map_selection_contains_point(struct map_selection *sel, struct coord *c) { struct map_selection *curr=sel; while (curr) { struct coord_rect *r=&curr->u.c_rect; if (c->x >= r->lu.x && c->x <= r->rl.x && c->y <= r->lu.y && c->y >= r->rl.y) return 1; curr=curr->next; } return sel ? 0:1; } /** * @brief Checks if a polyline is within a map selection * * @sa Please refer to map_selection_contains_point() * * @param sel The selection to check if the polyline is within * @param c Coordinates of the polyline to check if it is within the selection * @param count Number of coordinates in c * @return True if the polyline is within one of the selections, False otherwise */ static inline int map_selection_contains_polyline(struct map_selection *sel, struct coord *c, int count) { int i,x_mi,x_ma,y_mi,y_ma; struct map_selection *curr; if (! sel) return 1; for (i = 0 ; i < count-1 ; i++) { x_mi=c[i].x; if (c[i+1].x < x_mi) x_mi=c[i+1].x; x_ma=c[i].x; if (c[i+1].x > x_ma) x_ma=c[i+1].x; y_mi=c[i].y; if (c[i+1].y < y_mi) y_mi=c[i+1].y; y_ma=c[i].y; if (c[i+1].y > y_ma) y_ma=c[i+1].y; curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; if (x_mi <= sr->rl.x && x_ma >= sr->lu.x && y_ma >= sr->rl.y && y_mi <= sr->lu.y) return 1; curr=curr->next; } } return 0; } /** * @brief Checks if a rectangle is within a map selection * * @sa Please refer to map_selection_contains_point() * * @param sel The selection to check if the rectangle is within * @param r Rectangle to be checked for * @return True if the rectangle is within one of the selections, False otherwise */ static inline int map_selection_contains_rect(struct map_selection *sel, struct coord_rect *r) { struct map_selection *curr; dbg_assert(r->lu.x <= r->rl.x); dbg_assert(r->lu.y >= r->rl.y); if (! sel) return 1; curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; dbg_assert(sr->lu.x <= sr->rl.x); dbg_assert(sr->lu.y >= sr->rl.y); if (r->lu.x <= sr->rl.x && r->rl.x >= sr->lu.x && r->lu.y >= sr->rl.y && r->rl.y <= sr->lu.y) return 1; curr=curr->next; } return 0; } /** * @brief Checks if a polygon is within a map selection * * @sa Please refer to map_selection_contains_point() * * @param sel The selection to check if the polygon is within * @param c Pointer to coordinates of the polygon * @param count Number of coordinates in c * @return True if the polygon is within one of the selections, False otherwise */ static inline int map_selection_contains_polygon(struct map_selection *sel, struct coord *c, int count) { struct coord_rect r; int i; if (! sel) return 1; if (! count) return 0; r.lu=c[0]; r.rl=c[0]; for (i = 1 ; i < count ; i++) { if (c[i].x < r.lu.x) r.lu.x=c[i].x; if (c[i].x > r.rl.x) r.rl.x=c[i].x; if (c[i].y < r.rl.y) r.rl.y=c[i].y; if (c[i].y > r.lu.y) r.lu.y=c[i].y; } return map_selection_contains_rect(sel, &r); } /* prototypes */ enum attr_type; enum projection; struct attr; struct attr_iter; struct callback; struct item; struct map; struct map_priv; struct map_rect; struct map_search; struct map_selection; struct pcoord; struct map *map_new(struct attr *parent, struct attr **attrs); struct map *map_ref(struct map* m); void map_unref(struct map* m); int map_get_attr(struct map *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int map_set_attr(struct map *this_, struct attr *attr); void map_add_callback(struct map *this_, struct callback *cb); void map_remove_callback(struct map *this_, struct callback *cb); int map_requires_conversion(struct map *this_); char *map_convert_string(struct map *this_, char *str); char *map_convert_dup(char *str); void map_convert_free(char *str); enum projection map_projection(struct map *this_); void map_set_projection(struct map *this_, enum projection pro); void map_destroy(struct map *m); struct map_rect *map_rect_new(struct map *m, struct map_selection *sel); struct item *map_rect_get_item(struct map_rect *mr); struct item *map_rect_get_item_byid(struct map_rect *mr, int id_hi, int id_lo); struct item *map_rect_create_item(struct map_rect *mr, enum item_type type_); void map_rect_destroy(struct map_rect *mr); struct map_search *map_search_new(struct map *m, struct item *item, struct attr *search_attr, int partial); struct item *map_search_get_item(struct map_search *this_); void map_search_destroy(struct map_search *this_); struct map_selection *map_selection_rect_new(struct pcoord *center, int distance, int order); struct map_selection *map_selection_dup_pro(struct map_selection *sel, enum projection from, enum projection to); struct map_selection *map_selection_dup(struct map_selection *sel); void map_selection_destroy(struct map_selection *sel); int map_selection_contains_item_rect(struct map_selection *sel, struct item *item); int map_selection_contains_item_range(struct map_selection *sel, int follow, struct item_range *range, int count); int map_selection_contains_item(struct map_selection *sel, int follow, enum item_type type); int map_priv_is(struct map *map, struct map_priv *priv); void map_dump_filedesc(struct map *map, FILE *out); void map_dump_file(struct map *map, const char *file); void map_dump(struct map *map); void map_destroy_do(struct map *m); struct maps * maps_new(struct attr *parent, struct attr **attrs); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/map/000077500000000000000000000000001221777731700170765ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/Makefile.am000066400000000000000000000005221221777731700211310ustar00rootroot00000000000000SUBDIRS= if MAP_BINFILE SUBDIRS+=binfile endif if MAP_FILTER SUBDIRS+=filter endif if HAVELIBGARMIN SUBDIRS+=garmin endif if MAP_MG SUBDIRS+=mg endif if MAP_SHAPEFILE SUBDIRS+=shapefile endif if MAP_TEXTFILE SUBDIRS+=textfile endif if MAP_CSV SUBDIRS+=csv endif DIST_SUBDIRS=mg textfile csv binfile garmin shapefile filter navit-0.5.0~svn5643+dfsg.1/navit/map/binfile/000077500000000000000000000000001221777731700205065ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/binfile/CMakeLists.txt000066400000000000000000000000531221777731700232440ustar00rootroot00000000000000module_add_library(map_binfile binfile.c) navit-0.5.0~svn5643+dfsg.1/navit/map/binfile/Makefile.am000066400000000000000000000005061221777731700225430ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_binfile if PLUGINS modulemap_LTLIBRARIES = libmap_binfile.la else noinst_LTLIBRARIES = libmap_binfile.la endif libmap_binfile_la_SOURCES = binfile.c libmap_binfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/map/binfile/binfile.c000066400000000000000000002246111221777731700222700ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "coord.h" #include "transform.h" #include "file.h" #include "zipfile.h" #include "linguistics.h" #include "endianess.h" #include "callback.h" #include "types.h" #include "geom.h" static int map_id; /** * @brief A map tile, a rectangular region of the world. * * Represents a "map tile", a rectangular region of the world. The * binfile format divides the world into tiles of different sizes for * easy handling. * A binfile is a ZIP archive; each member file (with the exception of * index files) represents one tile. The data from a tile file is read * into memory and used directly as the tile data of this struct. *

* See the Navit wiki for details on the binfile format: * * http://wiki.navit-project.org/index.php/Navit%27s_binary_map_driver *

* Note that this tile struct also maintains pointers to several current positions * inside the tile. These are not part of the actual tile data, but are * used for working with the data. */ struct tile { int *start; //!< Memory address of the buffer containing the tile data (the actual map data). int *end; //!< First memory address not belonging to the tile data. /**< Thus tile->end - tile->start represents the size of the tile data * in multiples of 4 Bytes. */ int *pos; //!< Pointer to current position (start of current item) inside the tile data. int *pos_coord_start; //!< Pointer to the first element inside the current item that is a coordinate. /**< That is the first position after the header of an * item. The header holds 3 entries each 32bit wide integers: * header[0] holds the size of the whole item (excluding this size field) * header[1] holds the type of the item * header[2] holds the size of the coordinates in the tile */ int *pos_coord; //!< Current position in the coordinates region of the current item. int *pos_attr_start; //!< Pointer to the first attr data structure of the current item. int *pos_attr; //!< Current position in the attr region of the current item. int *pos_next; //!< Pointer to the next item (the item which follows the "current item" as indicated by *pos). struct file *fi; //!< The file from which this tile was loaded. int zipfile_num; int mode; }; struct map_download { int state; struct map_priv *m; struct map_rect_priv *mr; struct file *http,*file; int zipfile,toffset,tlength,progress,read,dl_size; long long offset,start_offset,cd1offset,size; struct zip64_eoc *zip64_eoc; struct zip64_eocl *zip64_eocl; struct zip_eoc *zip_eoc; struct zip_cd *cd_copy,*cd; }; /** * @brief Represents the map from a single binfile. * */ struct map_priv { int id; char *filename; //!< Filename of the binfile. char *cachedir; struct file *fi,*http; struct file **fis; struct zip_cd *index_cd; int index_offset; int cde_size; struct zip_eoc *eoc; struct zip64_eoc *eoc64; int zip_members; unsigned char *search_data; int search_offset; int search_size; int version; int check_version; int map_version; GHashTable *changes; char *passwd; char *map_release; int flags; char *url; int update_available; char *progress; struct callback_list *cbl; struct map_download *download; int redirect; long download_enabled; }; struct map_rect_priv { int *start; int *end; enum attr_type attr_last; int label; int *label_attr[5]; struct map_selection *sel; struct map_priv *m; struct item item; int tile_depth; struct tile tiles[8]; struct tile *t; int country_id; char *url; struct attr attrs[8]; int status; struct map_search_priv *msp; #ifdef DEBUG_SIZE int size; #endif }; /** * @brief Represents a search on a map. * This struct represents a search on a map; it is created * when starting a search, and is used for retrieving results. */ struct map_search_priv { struct map_priv *map; struct map_rect_priv *mr; struct map_rect_priv *mr_item; struct item *item; struct attr search; struct map_selection ms; GList *boundaries; int partial; int mode; struct coord_rect rect_new; char *parent_name; GHashTable *search_results; }; static void push_tile(struct map_rect_priv *mr, struct tile *t, int offset, int length); static void setup_pos(struct map_rect_priv *mr); static void map_binfile_close(struct map_priv *m); static int map_binfile_open(struct map_priv *m); static void map_binfile_destroy(struct map_priv *m); static void lfh_to_cpu(struct zip_lfh *lfh) { dbg_assert(lfh != NULL); if (lfh->ziplocsig != zip_lfh_sig) { lfh->ziplocsig = le32_to_cpu(lfh->ziplocsig); lfh->zipver = le16_to_cpu(lfh->zipver); lfh->zipgenfld = le16_to_cpu(lfh->zipgenfld); lfh->zipmthd = le16_to_cpu(lfh->zipmthd); lfh->ziptime = le16_to_cpu(lfh->ziptime); lfh->zipdate = le16_to_cpu(lfh->zipdate); lfh->zipcrc = le32_to_cpu(lfh->zipcrc); lfh->zipsize = le32_to_cpu(lfh->zipsize); lfh->zipuncmp = le32_to_cpu(lfh->zipuncmp); lfh->zipfnln = le16_to_cpu(lfh->zipfnln); lfh->zipxtraln = le16_to_cpu(lfh->zipxtraln); } } static void cd_to_cpu(struct zip_cd *zcd) { dbg_assert(zcd != NULL); if (zcd->zipcensig != zip_cd_sig) { zcd->zipcensig = le32_to_cpu(zcd->zipcensig); zcd->zipccrc = le32_to_cpu(zcd->zipccrc); zcd->zipcsiz = le32_to_cpu(zcd->zipcsiz); zcd->zipcunc = le32_to_cpu(zcd->zipcunc); zcd->zipcfnl = le16_to_cpu(zcd->zipcfnl); zcd->zipcxtl = le16_to_cpu(zcd->zipcxtl); zcd->zipccml = le16_to_cpu(zcd->zipccml); zcd->zipdsk = le16_to_cpu(zcd->zipdsk); zcd->zipint = le16_to_cpu(zcd->zipint); zcd->zipext = le32_to_cpu(zcd->zipext); zcd->zipofst = le32_to_cpu(zcd->zipofst); } } static void eoc_to_cpu(struct zip_eoc *eoc) { dbg_assert(eoc != NULL); if (eoc->zipesig != zip_eoc_sig) { eoc->zipesig = le32_to_cpu(eoc->zipesig); eoc->zipedsk = le16_to_cpu(eoc->zipedsk); eoc->zipecen = le16_to_cpu(eoc->zipecen); eoc->zipenum = le16_to_cpu(eoc->zipenum); eoc->zipecenn = le16_to_cpu(eoc->zipecenn); eoc->zipecsz = le32_to_cpu(eoc->zipecsz); eoc->zipeofst = le32_to_cpu(eoc->zipeofst); eoc->zipecoml = le16_to_cpu(eoc->zipecoml); } } static void binfile_check_version(struct map_priv *m); static struct zip_eoc * binfile_read_eoc(struct file *fi) { struct zip_eoc *eoc; eoc=(struct zip_eoc *)file_data_read(fi,fi->size-sizeof(struct zip_eoc), sizeof(struct zip_eoc)); if (eoc) { eoc_to_cpu(eoc); dbg(1,"sig 0x%x\n", eoc->zipesig); if (eoc->zipesig != zip_eoc_sig) { dbg(0,"eoc signature check failed: 0x%x vs 0x%x\n",eoc->zipesig,zip_eoc_sig); file_data_free(fi,(unsigned char *)eoc); eoc=NULL; } } return eoc; } static struct zip64_eoc * binfile_read_eoc64(struct file *fi) { struct zip64_eocl *eocl; struct zip64_eoc *eoc; eocl=(struct zip64_eocl *)file_data_read(fi,fi->size-sizeof(struct zip_eoc)-sizeof(struct zip64_eocl), sizeof(struct zip64_eocl)); if (!eocl) return NULL; dbg(1,"sig 0x%x\n", eocl->zip64lsig); if (eocl->zip64lsig != zip64_eocl_sig) { file_data_free(fi,(unsigned char *)eocl); dbg(1,"eocl wrong\n"); return NULL; } eoc=(struct zip64_eoc *)file_data_read(fi,eocl->zip64lofst, sizeof(struct zip64_eoc)); if (eoc) { if (eoc->zip64esig != zip64_eoc_sig) { file_data_free(fi,(unsigned char *)eoc); dbg(1,"eoc wrong\n"); eoc=NULL; } dbg(1,"eoc64 ok 0x"LONGLONG_HEX_FMT " 0x"LONGLONG_HEX_FMT "\n",eoc->zip64eofst,eoc->zip64ecsz); } file_data_free(fi,(unsigned char *)eocl); return eoc; } static int binfile_cd_extra(struct zip_cd *cd) { return cd->zipcfnl+cd->zipcxtl; } static struct zip_cd * binfile_read_cd(struct map_priv *m, int offset, int len) { struct zip_cd *cd; long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; if (len == -1) { cd=(struct zip_cd *)file_data_read(m->fi,cdoffset+offset, sizeof(*cd)); cd_to_cpu(cd); len=binfile_cd_extra(cd); file_data_free(m->fi,(unsigned char *)cd); } cd=(struct zip_cd *)file_data_read(m->fi,cdoffset+offset, sizeof(*cd)+len); if (cd) { dbg(1,"cd at "LONGLONG_FMT" %d bytes\n",cdoffset+offset, sizeof(*cd)+len); cd_to_cpu(cd); dbg(1,"sig 0x%x\n", cd->zipcensig); if (cd->zipcensig != zip_cd_sig) { file_data_free(m->fi,(unsigned char *)cd); cd=NULL; } } return cd; } /** * @brief Get the ZIP64 extra field data corresponding to a zip central * directory header. * * @param cd pointer to zip central directory structure * @return pointer to ZIP64 extra field, or NULL if not available */ static struct zip_cd_ext * binfile_cd_ext(struct zip_cd *cd) { struct zip_cd_ext *ext; if (cd->zipofst != zip_size_64bit_placeholder) return NULL; if (cd->zipcxtl != sizeof(*ext)) return NULL; ext=(struct zip_cd_ext *)((unsigned char *)cd+sizeof(*cd)+cd->zipcfnl); if (ext->tag != zip_extra_header_id_zip64 || ext->size != 8) return NULL; return ext; } /** * @param cd pointer to zip central directory structure * @return Offset of local file header in zip file. * Will use ZIP64 data if present. */ static long long binfile_cd_offset(struct zip_cd *cd) { struct zip_cd_ext *ext=binfile_cd_ext(cd); if (ext) return ext->zipofst; else return cd->zipofst; } static struct zip_lfh * binfile_read_lfh(struct file *fi, long long offset) { struct zip_lfh *lfh; lfh=(struct zip_lfh *)(file_data_read(fi,offset,sizeof(struct zip_lfh))); if (lfh) { lfh_to_cpu(lfh); if (lfh->ziplocsig != zip_lfh_sig) { file_data_free(fi,(unsigned char *)lfh); lfh=NULL; } } return lfh; } static unsigned char * binfile_read_content(struct map_priv *m, struct file *fi, long long offset, struct zip_lfh *lfh) { struct zip_enc *enc; unsigned char *ret=NULL; offset+=sizeof(struct zip_lfh)+lfh->zipfnln; switch (lfh->zipmthd) { case 0: offset+=lfh->zipxtraln; ret=file_data_read(fi,offset, lfh->zipuncmp); break; case 8: offset+=lfh->zipxtraln; ret=file_data_read_compressed(fi,offset, lfh->zipsize, lfh->zipuncmp); break; case 99: if (!m->passwd) break; enc=(struct zip_enc *)file_data_read(fi, offset, sizeof(*enc)); offset+=lfh->zipxtraln; switch (enc->compress_method) { case 0: ret=file_data_read_encrypted(fi, offset, lfh->zipsize, lfh->zipuncmp, 0, m->passwd); break; case 8: ret=file_data_read_encrypted(fi, offset, lfh->zipsize, lfh->zipuncmp, 1, m->passwd); break; default: dbg(0,"Unknown encrypted compression method %d\n",enc->compress_method); } file_data_free(fi, (unsigned char *)enc); break; default: dbg(0,"Unknown compression method %d\n", lfh->zipmthd); } return ret; } static int binfile_search_cd(struct map_priv *m, int offset, char *name, int partial, int skip) { int size=4096; int end=m->eoc64?m->eoc64->zip64ecsz:m->eoc->zipecsz; int len=strlen(name); long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; struct zip_cd *cd; #if 0 dbg(0,"end=%d\n",end); #endif while (offset < end) { cd=(struct zip_cd *)(m->search_data+offset-m->search_offset); if (! m->search_data || m->search_offset > offset || offset-m->search_offset+sizeof(*cd) > m->search_size || offset-m->search_offset+sizeof(*cd)+cd->zipcfnl+cd->zipcxtl > m->search_size ) { #if 0 dbg(0,"reload %p %d %d\n", m->search_data, m->search_offset, offset); #endif if (m->search_data) file_data_free(m->fi,m->search_data); m->search_offset=offset; m->search_size=end-offset; if (m->search_size > size) m->search_size=size; m->search_data=file_data_read(m->fi,cdoffset+m->search_offset,m->search_size); cd=(struct zip_cd *)m->search_data; } #if 0 dbg(0,"offset=%d search_offset=%d search_size=%d search_data=%p cd=%p\n", offset, m->search_offset, m->search_size, m->search_data, cd); dbg(0,"offset=%d fn='%s'\n",offset,cd->zipcfn); #endif if (!skip && (partial || cd->zipcfnl == len) && !strncmp(cd->zipcfn, name, len)) return offset; skip=0; offset+=sizeof(*cd)+cd->zipcfnl+cd->zipcxtl+cd->zipccml; ; } return -1; } static void map_destroy_binfile(struct map_priv *m) { dbg(1,"map_destroy_binfile\n"); if (m->fi) map_binfile_close(m); map_binfile_destroy(m); } static void binfile_coord_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; t->pos_coord=t->pos_coord_start; } static inline int binfile_coord_left(void *priv_data) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; return (t->pos_attr_start-t->pos_coord)/2; } static int binfile_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; int max,ret=0; max=binfile_coord_left(priv_data); if (count > max) count=max; #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy(c, t->pos_coord, count*sizeof(struct coord)); #else { int i=0,end=count*sizeof(struct coord)/sizeof(int); int *src=(int *)t->pos_coord; int *dst=(int *)c; while (i++ < end) { *dst++=le32_to_cpu(*src); src++; } } #endif t->pos_coord+=count*2; ret=count; return ret; } /** * @brief * @param * @return */ static void binfile_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; t->pos_attr=t->pos_attr_start; mr->label=0; memset(mr->label_attr, 0, sizeof(mr->label_attr)); } static char * binfile_extract(struct map_priv *m, char *dir, char *filename, int partial) { char *full,*fulld,*sep; unsigned char *start; int len,offset=m->index_offset; struct zip_cd *cd; struct zip_lfh *lfh; FILE *f; for (;;) { offset=binfile_search_cd(m, offset, filename, partial, 1); if (offset == -1) break; cd=binfile_read_cd(m, offset, -1); len=strlen(dir)+1+cd->zipcfnl+1; full=g_malloc(len); strcpy(full,dir); strcpy(full+strlen(full),"/"); strncpy(full+strlen(full),cd->zipcfn,cd->zipcfnl); full[len-1]='\0'; fulld=g_strdup(full); sep=strrchr(fulld, '/'); if (sep) { *sep='\0'; file_mkdir(fulld, 1); } if (full[len-2] != '/') { lfh=binfile_read_lfh(m->fi, binfile_cd_offset(cd)); start=binfile_read_content(m, m->fi, binfile_cd_offset(cd), lfh); dbg(0,"fopen '%s'\n", full); f=fopen(full,"w"); fwrite(start, lfh->zipuncmp, 1, f); fclose(f); file_data_free(m->fi, start); file_data_free(m->fi, (unsigned char *)lfh); } file_data_free(m->fi, (unsigned char *)cd); g_free(fulld); g_free(full); if (! partial) break; } return g_strdup_printf("%s/%s",dir,filename); } static int binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; enum attr_type type; int i,size; if (attr_type != mr->attr_last) { t->pos_attr=t->pos_attr_start; mr->attr_last=attr_type; } while (t->pos_attr < t->pos_next) { size=le32_to_cpu(*(t->pos_attr++)); type=le32_to_cpu(t->pos_attr[0]); if (type == attr_label) mr->label=1; if (type == attr_house_number) mr->label_attr[0]=t->pos_attr; if (type == attr_street_name) mr->label_attr[1]=t->pos_attr; if (type == attr_street_name_systematic) mr->label_attr[2]=t->pos_attr; if (type == attr_district_name && mr->item.type < type_line) mr->label_attr[3]=t->pos_attr; if (type == attr_town_name && mr->item.type < type_line) mr->label_attr[4]=t->pos_attr; if (type == attr_type || attr_type == attr_any) { if (attr_type == attr_any) { dbg(1,"pos %p attr %s size %d\n", t->pos_attr-1, attr_to_name(type), size); } attr->type=type; if (ATTR_IS_GROUP(type)) { int i=0; int *subpos=t->pos_attr+1; int size_rem=size-1; i=0; while (size_rem > 0 && i < 7) { int subsize=le32_to_cpu(*subpos++); int subtype=le32_to_cpu(subpos[0]); mr->attrs[i].type=subtype; attr_data_set_le(&mr->attrs[i], subpos+1); subpos+=subsize; size_rem-=subsize+1; i++; } mr->attrs[i].type=type_none; mr->attrs[i].u.data=NULL; attr->u.attrs=mr->attrs; } else { attr_data_set_le(attr, t->pos_attr+1); if (type == attr_url_local) { g_free(mr->url); mr->url=binfile_extract(mr->m, mr->m->cachedir, attr->u.str, 1); attr->u.str=mr->url; } if (type == attr_flags && mr->m->map_version < 1) attr->u.num |= AF_CAR; } t->pos_attr+=size; return 1; } else { t->pos_attr+=size; } } if (!mr->label && (attr_type == attr_any || attr_type == attr_label)) { for (i = 0 ; i < sizeof(mr->label_attr)/sizeof(int *) ; i++) { if (mr->label_attr[i]) { mr->label=1; attr->type=attr_label; attr_data_set_le(attr,mr->label_attr[i]+1); return 1; } } } return 0; } struct binfile_hash_entry { struct item_id id; int flags; int data[0]; }; static guint binfile_hash_entry_hash(gconstpointer key) { const struct binfile_hash_entry *entry=key; return (entry->id.id_hi ^ entry->id.id_lo); } static gboolean binfile_hash_entry_equal(gconstpointer a, gconstpointer b) { const struct binfile_hash_entry *entry1=a,*entry2=b; return (entry1->id.id_hi==entry2->id.id_hi && entry1->id.id_lo == entry2->id.id_lo); } static int * binfile_item_dup(struct map_priv *m, struct item *item, struct tile *t, int extend) { int size=le32_to_cpu(t->pos[0]); struct binfile_hash_entry *entry=g_malloc(sizeof(struct binfile_hash_entry)+(size+1+extend)*sizeof(int)); void *ret=entry->data; entry->id.id_hi=item->id_hi; entry->id.id_lo=item->id_lo; entry->flags=1; dbg(0,"id 0x%x,0x%x\n",entry->id.id_hi,entry->id.id_lo); memcpy(ret, t->pos, (size+1)*sizeof(int)); if (!m->changes) m->changes=g_hash_table_new_full(binfile_hash_entry_hash, binfile_hash_entry_equal, g_free, NULL); g_hash_table_replace(m->changes, entry, entry); dbg(0,"ret %p\n",ret); return ret; } static int binfile_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t,*tn,new; int i,delta,move_len; int write_offset,move_offset,aoffset,coffset,clen; int *data; { int *i=t->pos,j=0; dbg(0,"Before: pos_coord=%d\n",t->pos_coord-i); while (i < t->pos_next) dbg(0,"%d:0x%x\n",j++,*i++); } aoffset=t->pos_attr-t->pos_attr_start; coffset=t->pos_coord-t->pos_coord_start-2; clen=t->pos_attr_start-t->pos_coord+2; dbg(0,"coffset=%d clen=%d\n",coffset,clen); switch (mode) { case change_mode_delete: if (count*2 > clen) count=clen/2; delta=-count*2; move_offset=coffset+count*2; move_len=t->pos_next-t->pos_coord_start-move_offset; write_offset=0; break; case change_mode_modify: write_offset=coffset; if (count*2 > clen) { delta=count*2-clen; move_offset=t->pos_attr_start-t->pos_coord_start; move_len=t->pos_next-t->pos_coord_start-move_offset; } else { move_len=0; move_offset=0; delta=0; } break; case change_mode_prepend: delta=count*2; move_offset=coffset-2; move_len=t->pos_next-t->pos_coord_start-move_offset; write_offset=coffset-2; break; case change_mode_append: delta=count*2; move_offset=coffset; move_len=t->pos_next-t->pos_coord_start-move_offset; write_offset=coffset; break; default: return 0; } dbg(0,"delta %d\n",delta); data=binfile_item_dup(mr->m, &mr->item, t, delta > 0 ? delta:0); data[0]=cpu_to_le32(le32_to_cpu(data[0])+delta); data[2]=cpu_to_le32(le32_to_cpu(data[2])+delta); new.pos=new.start=data; new.zipfile_num=t->zipfile_num; new.mode=2; push_tile(mr, &new, 0, 0); setup_pos(mr); tn=mr->t; tn->pos_coord=tn->pos_coord_start+coffset; tn->pos_attr=tn->pos_attr_start+aoffset; dbg(0,"moving %d ints from offset %d to %d\n",move_len,tn->pos_coord_start+move_offset-data,tn->pos_coord_start+move_offset+delta-data); memmove(tn->pos_coord_start+move_offset+delta, tn->pos_coord_start+move_offset, move_len*4); { int *i=tn->pos,j=0; dbg(0,"After move: pos_coord=%d\n",tn->pos_coord-i); while (i < tn->pos_next) dbg(0,"%d:0x%x\n",j++,*i++); } if (mode != change_mode_append) tn->pos_coord+=move_offset; if (mode != change_mode_delete) { dbg(0,"writing %d ints at offset %d\n",count*2,write_offset+tn->pos_coord_start-data); for (i = 0 ; i < count ; i++) { tn->pos_coord_start[write_offset++]=c[i].x; tn->pos_coord_start[write_offset++]=c[i].y; } } { int *i=tn->pos,j=0; dbg(0,"After: pos_coord=%d\n",tn->pos_coord-i); while (i < tn->pos_next) dbg(0,"%d:0x%x\n",j++,*i++); } return 1; } static int binfile_attr_set(void *priv_data, struct attr *attr, enum change_mode mode) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t,*tn,new; int offset,delta,move_len; int write_offset,move_offset,naoffset,coffset,oattr_len; int nattr_size,nattr_len,pad; int *data; { int *i=t->pos,j=0; dbg(0,"Before: pos_attr=%d\n",t->pos_attr-i); while (i < t->pos_next) dbg(0,"%d:0x%x\n",j++,*i++); } write_offset=0; naoffset=t->pos_attr-t->pos_attr_start; coffset=t->pos_coord-t->pos_coord_start; offset=0; oattr_len=0; if (!naoffset) { if (mode == change_mode_delete || mode == change_mode_modify) { dbg(0,"no attribute selected\n"); return 0; } if (mode == change_mode_append) naoffset=t->pos_next-t->pos_attr_start; } while (offset < naoffset) { oattr_len=le32_to_cpu(t->pos_attr_start[offset])+1; dbg(0,"len %d\n",oattr_len); write_offset=offset; offset+=oattr_len; } move_len=t->pos_next-t->pos_attr_start-offset; move_offset=offset; switch (mode) { case change_mode_delete: nattr_size=0; nattr_len=0; pad=0; break; case change_mode_modify: case change_mode_prepend: case change_mode_append: nattr_size=attr_data_size(attr); pad=(4-(nattr_size%4))%4; nattr_len=(nattr_size+pad)/4+2; if (mode == change_mode_prepend) { move_offset=write_offset; move_len+=oattr_len; } if (mode == change_mode_append) { write_offset=move_offset; } break; default: return 0; } if (mode == change_mode_delete || mode == change_mode_modify) delta=nattr_len-oattr_len; else delta=nattr_len; dbg(0,"delta %d oattr_len %d nattr_len %d\n",delta,oattr_len, nattr_len); data=binfile_item_dup(mr->m, &mr->item, t, delta > 0 ? delta:0); data[0]=cpu_to_le32(le32_to_cpu(data[0])+delta); new.pos=new.start=data; new.zipfile_num=t->zipfile_num; new.mode=2; push_tile(mr, &new, 0, 0); setup_pos(mr); tn=mr->t; tn->pos_coord=tn->pos_coord_start+coffset; tn->pos_attr=tn->pos_attr_start+offset; dbg(0,"attr start %d offset %d\n",tn->pos_attr_start-data,offset); dbg(0,"moving %d ints from offset %d to %d\n",move_len,tn->pos_attr_start+move_offset-data,tn->pos_attr_start+move_offset+delta-data); memmove(tn->pos_attr_start+move_offset+delta, tn->pos_attr_start+move_offset, move_len*4); if (mode != change_mode_append) tn->pos_attr+=delta; { int *i=tn->pos,j=0; dbg(0,"After move: pos_attr=%d\n",tn->pos_attr-i); while (i < tn->pos_next) dbg(0,"%d:0x%x\n",j++,*i++); } if (nattr_len) { int *nattr=tn->pos_attr_start+write_offset; dbg(0,"writing %d ints at %d\n",nattr_len,nattr-data); nattr[0]=cpu_to_le32(nattr_len-1); nattr[1]=cpu_to_le32(attr->type); memcpy(nattr+2, attr_data_get(attr), nattr_size); memset((unsigned char *)(nattr+2)+nattr_size, 0, pad); } { int *i=tn->pos,j=0; dbg(0,"After: pos_attr=%d\n",tn->pos_attr-i); while (i < tn->pos_next) dbg(0,"%d:0x%x\n",j++,*i++); } return 1; } static struct item_methods methods_binfile = { binfile_coord_rewind, binfile_coord_get, binfile_attr_rewind, binfile_attr_get, NULL, binfile_attr_set, binfile_coord_set, }; static void push_tile(struct map_rect_priv *mr, struct tile *t, int offset, int length) { dbg_assert(mr->tile_depth < 8); mr->t=&mr->tiles[mr->tile_depth++]; *(mr->t)=*t; mr->t->pos=mr->t->pos_next=mr->t->start+offset; if (length == -1) length=le32_to_cpu(mr->t->pos[0])+1; if (length > 0) mr->t->end=mr->t->pos+length; } static int pop_tile(struct map_rect_priv *mr) { if (mr->tile_depth <= 1) return 0; if (mr->t->mode < 2) file_data_free(mr->m->fi, (unsigned char *)(mr->t->start)); #ifdef DEBUG_SIZE #if DEBUG_SIZE > 0 dbg(0,"leave %d\n",mr->t->zipfile_num); #endif #endif mr->t=&mr->tiles[--mr->tile_depth-1]; return 1; } static int zipfile_to_tile(struct map_priv *m, struct zip_cd *cd, struct tile *t) { char buffer[1024]; struct zip_lfh *lfh; char *zipfn; struct file *fi; dbg(1,"enter %p %p %p\n", m, cd, t); dbg(1,"cd->zipofst=0x"LONGLONG_HEX_FMT "\n", binfile_cd_offset(cd)); t->start=NULL; t->mode=1; if (m->fis) fi=m->fis[cd->zipdsk]; else fi=m->fi; lfh=binfile_read_lfh(fi, binfile_cd_offset(cd)); zipfn=(char *)(file_data_read(fi,binfile_cd_offset(cd)+sizeof(struct zip_lfh), lfh->zipfnln)); strncpy(buffer, zipfn, lfh->zipfnln); buffer[lfh->zipfnln]='\0'; t->start=(int *)binfile_read_content(m, fi, binfile_cd_offset(cd), lfh); t->end=t->start+lfh->zipuncmp/4; t->fi=fi; dbg(1,"0x%x '%s' %d %d,%d\n", lfh->ziplocsig, buffer, sizeof(*cd)+cd->zipcfnl, lfh->zipsize, lfh->zipuncmp); file_data_free(fi, (unsigned char *)zipfn); file_data_free(fi, (unsigned char *)lfh); return t->start != NULL; } static int map_binfile_handle_redirect(struct map_priv *m) { char *location=file_http_header(m->http, "location"); if (!location) { m->redirect=0; return 0; } if (m->redirect) return 0; m->redirect=1; dbg(0,"redirected from %s to %s\n",m->url,location); g_free(m->url); m->url=g_strdup(location); file_destroy(m->http); m->http=NULL; return 1; } static int map_binfile_http_request(struct map_priv *m, struct attr **attrs) { if (!m->http) { m->http=file_create(NULL, attrs); } else { file_request(m->http, attrs); } return 1; } static long long map_binfile_download_size(struct map_priv *m) { struct attr url={attr_url}; struct attr http_method={attr_http_method}; struct attr persistent={attr_persistent}; struct attr *attrs[4]; int size_ret; long long ret; void *data; do { attrs[0]=&url; url.u.str=m->url; attrs[1]=&http_method; http_method.u.str="HEAD"; persistent.u.num=1; attrs[2]=&persistent; attrs[3]=NULL; map_binfile_http_request(m, attrs); data=file_data_read_special(m->http, 0, &size_ret); g_free(data); if (size_ret < 0) return 0; } while (map_binfile_handle_redirect(m)); ret=file_size(m->http); dbg(1,"file size "LONGLONG_FMT"\n",ret); return ret; } static int map_binfile_http_close(struct map_priv *m) { if (m->http) { file_destroy(m->http); m->http=NULL; } return 1; } static struct file * map_binfile_http_range(struct map_priv *m, long long offset, int size) { struct attr *attrs[4]; struct attr url={attr_url}; struct attr http_header={attr_http_header}; struct attr persistent={attr_persistent}; persistent.u.num=1; attrs[0]=&url; attrs[1]=&http_header; attrs[2]=&persistent; attrs[3]=NULL; url.u.str=m->url; http_header.u.str=g_strdup_printf("Range: bytes="LONGLONG_FMT"-"LONGLONG_FMT,offset, offset+size-1); map_binfile_http_request(m, attrs); g_free(http_header.u.str); return m->http; } static unsigned char * map_binfile_download_range(struct map_priv *m, long long offset, int size) { unsigned char *ret; int size_ret; struct file *http=map_binfile_http_range(m, offset, size); ret=file_data_read_special(http, size, &size_ret); if (size_ret != size) { dbg(0,"size %d vs %d\n",size,size_ret); g_free(ret); return NULL; } return ret; } static struct zip_cd * download_cd(struct map_download *download) { struct map_priv *m=download->m; struct zip64_eoc *zip64_eoc=(struct zip64_eoc *)file_data_read(m->fi, 0, sizeof(*zip64_eoc)); struct zip_cd *cd=(struct zip_cd *)map_binfile_download_range(m, zip64_eoc->zip64eofst+download->zipfile*m->cde_size,m->cde_size); file_data_free(m->fi, (unsigned char *)zip64_eoc); dbg(0,"needed cd, result %p\n",cd); return cd; } static int download_request(struct map_download *download) { struct attr url={attr_url}; struct attr http_header={attr_http_header}; struct attr persistent={attr_persistent}; struct attr *attrs[4]; if(!download->m->download_enabled) { dbg(0,"Tried downloading while it's not allowed\n"); return 0; } attrs[0]=&url; persistent.u.num=1; attrs[1]=&persistent; attrs[2]=NULL; if (strchr(download->m->url,'?')) { url.u.str=g_strdup_printf("%smemberid=%d",download->m->url,download->zipfile); download->dl_size=-1; } else { long long offset=binfile_cd_offset(download->cd_copy); int size=download->cd_copy->zipcsiz+sizeof(struct zip_lfh)+download->cd_copy->zipcfnl; url.u.str=g_strdup(download->m->url); http_header.u.str=g_strdup_printf("Range: bytes="LONGLONG_FMT"-"LONGLONG_FMT,offset,offset+size-1); attrs[2]=&http_header; attrs[3]=NULL; download->dl_size=size; } dbg(0,"encountered missing tile %d %s(%s), Downloading %d bytes at "LONGLONG_FMT"\n",download->zipfile, url.u.str,(char *)(download->cd_copy+1), download->dl_size, download->offset); map_binfile_http_request(download->m, attrs); g_free(url.u.str); download->http=download->m->http; return 1; } static int download_start(struct map_download *download) { long long offset; struct zip_eoc *eoc; if (!download->cd->zipcensig) { download->cd_copy=download_cd(download); } else { download->cd_copy=g_malloc(download->m->cde_size); memcpy(download->cd_copy, download->cd, download->m->cde_size); } file_data_remove(download->file, (unsigned char *)download->cd); download->cd=NULL; offset=file_size(download->file); offset-=sizeof(struct zip_eoc); eoc=(struct zip_eoc *)file_data_read(download->file, offset, sizeof(struct zip_eoc)); download->zip_eoc=g_malloc(sizeof(struct zip_eoc)); memcpy(download->zip_eoc, eoc, sizeof(struct zip_eoc)); file_data_remove(download->file, (unsigned char *)eoc); download->start_offset=download->offset=offset; return download_request(download); } static int download_download(struct map_download *download) { int size=64*1024,size_ret; unsigned char *data; if (download->dl_size != -1 && size > download->dl_size) size=download->dl_size; if (!size) return 1; data=file_data_read_special(download->http, size, &size_ret); if (!download->read && download->m->http && map_binfile_handle_redirect(download->m)) { g_free(data); download_request(download); return 0; } dbg(1,"got %d bytes writing at offset "LONGLONG_FMT"\n",size_ret,download->offset); if (size_ret <= 0) { g_free(data); return 1; } file_data_write(download->file, download->offset, size_ret, data); download->offset+=size_ret; download->read+=size_ret; download->dl_size-=size_ret; if (download->dl_size != -1) download->progress=download->read*100/(download->read+download->dl_size); return 0; } static int download_finish(struct map_download *download) { struct zip_lfh *lfh; char *lfh_filename; struct zip_cd_ext *ext; long long lfh_offset; file_data_write(download->file, download->offset, sizeof(struct zip_eoc), (void *)download->zip_eoc); lfh=(struct zip_lfh *)(file_data_read(download->file,download->start_offset, sizeof(struct zip_lfh))); ext=binfile_cd_ext(download->cd_copy); if (ext) ext->zipofst=download->start_offset; else download->cd_copy->zipofst=download->start_offset; download->cd_copy->zipcsiz=lfh->zipsize; download->cd_copy->zipcunc=lfh->zipuncmp; download->cd_copy->zipccrc=lfh->zipcrc; lfh_offset = binfile_cd_offset(download->cd_copy)+sizeof(struct zip_lfh); lfh_filename=(char *)file_data_read(download->file,lfh_offset,lfh->zipfnln); memcpy(download->cd_copy+1,lfh_filename,lfh->zipfnln); file_data_remove(download->file,(void *)lfh_filename); file_data_remove(download->file,(void *)lfh); file_data_write(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, binfile_cd_extra(download->cd_copy)+sizeof(struct zip_cd), (void *)download->cd_copy); file_data_flush(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, sizeof(struct zip_cd)); g_free(download->cd_copy); download->cd=(struct zip_cd *)(file_data_read(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, download->m->cde_size)); cd_to_cpu(download->cd); dbg(1,"Offset %d\n",download->cd->zipofst); return 1; } static int download_planet_size(struct map_download *download) { download->size=map_binfile_download_size(download->m); dbg(0,"Planet size "LONGLONG_FMT"\n",download->size); if (!download->size) return 0; return 1; } static int download_eoc(struct map_download *download) { download->zip64_eoc=(struct zip64_eoc *)map_binfile_download_range(download->m, download->size-98, 98); if (!download->zip64_eoc) return 0; download->zip64_eocl=(struct zip64_eocl *)(download->zip64_eoc+1); download->zip_eoc=(struct zip_eoc *)(download->zip64_eocl+1); if (download->zip64_eoc->zip64esig != zip64_eoc_sig || download->zip64_eocl->zip64lsig != zip64_eocl_sig || download->zip_eoc->zipesig != zip_eoc_sig) { dbg(0,"wrong signature on zip64_eoc downloaded from "LONGLONG_FMT"\n",download->size-98); g_free(download->zip64_eoc); return 0; } return 1; } static int download_directory_start(struct map_download *download) { download->http=map_binfile_http_range(download->m, download->zip64_eoc->zip64eofst, download->zip64_eoc->zip64ecsz); if (!download->http) return 0; return 1; } static int download_directory_do(struct map_download *download) { int count; for (count = 0 ; count < 100 ; count++) { int cd_xlen, size_ret; unsigned char *cd_data; struct zip_cd *cd; cd=(struct zip_cd *)file_data_read_special(download->http, sizeof(*cd), &size_ret); cd->zipcunc=0; dbg(1,"size_ret=%d\n",size_ret); if (!size_ret) return 0; if (size_ret != sizeof(*cd) || cd->zipcensig != zip_cd_sig) { dbg(0,"error1 size=%d vs %d\n",size_ret, sizeof(*cd)); return 0; } file_data_write(download->file, download->offset, sizeof(*cd), (unsigned char *)cd); download->offset+=sizeof(*cd); cd_xlen=cd->zipcfnl+cd->zipcxtl; cd_data=file_data_read_special(download->http, cd_xlen, &size_ret); if (size_ret != cd_xlen) { dbg(0,"error2 size=%d vs %d\n",size_ret,cd_xlen); return 0; } file_data_write(download->file, download->offset, cd_xlen, cd_data); download->offset+=cd_xlen; g_free(cd); g_free(cd_data); } return 1; } static int download_directory_finish(struct map_download *download) { download->http=NULL; return 1; } static int download_initial_finish(struct map_download *download) { download->zip64_eoc->zip64eofst=download->cd1offset; download->zip64_eocl->zip64lofst=download->offset; download->zip_eoc->zipeofst=download->cd1offset; #if 0 file_data_write(download->file, download->offset, sizeof(*download->zip64_eoc), (unsigned char *)download->zip64_eoc); download->offset+=sizeof(*download->zip64_eoc); file_data_write(download->file, download->offset, sizeof(*download->zip64_eocl), (unsigned char *)download->zip64_eocl); download->offset+=sizeof(*download->zip64_eocl); #endif file_data_write(download->file, download->offset, sizeof(*download->zip_eoc), (unsigned char *)download->zip_eoc); download->offset+=sizeof(*download->zip_eoc); g_free(download->zip64_eoc); download->zip64_eoc=NULL; return 1; } static void push_zipfile_tile_do(struct map_rect_priv *mr, struct zip_cd *cd, int zipfile, int offset, int length) { struct tile t; struct map_priv *m=mr->m; struct file *f=m->fi; dbg(1,"enter %p %d\n", mr, zipfile); #ifdef DEBUG_SIZE #if DEBUG_SIZE > 0 { char filename[cd->zipcfnl+1]; memcpy(filename, cd+1, cd->zipcfnl); filename[cd->zipcfnl]='\0'; dbg(0,"enter %d (%s) %d\n",zipfile, filename, cd->zipcunc); } #endif mr->size+=cd->zipcunc; #endif t.zipfile_num=zipfile; if (zipfile_to_tile(m, cd, &t)) push_tile(mr, &t, offset, length); file_data_free(f, (unsigned char *)cd); } static struct zip_cd * download(struct map_priv *m, struct map_rect_priv *mr, struct zip_cd *cd, int zipfile, int offset, int length, int async) { struct map_download *download; if(!m->download_enabled) return NULL; if (async == 2) { download=m->download; } else { download=g_new0(struct map_download, 1); if (mr) { download->m=m; download->mr=mr; download->file=m->fi; download->cd=cd; download->zipfile=zipfile; download->toffset=offset; download->tlength=length; download->state=1; } else { struct attr readwrite={attr_readwrite,{(void *)1}}; struct attr create={attr_create,{(void *)1}}; struct attr *attrs[3]; attrs[0]=&readwrite; attrs[1]=&create; attrs[2]=NULL; download->file=file_create(m->filename,attrs); download->m=m; download->state=4; } } if (async == 1) { m->download=download; g_free(m->progress); if (download->mr) m->progress=g_strdup_printf("Download Tile %d 0%%",download->zipfile); else m->progress=g_strdup_printf("Download Map Information 0%%"); callback_list_call_attr_0(m->cbl, attr_progress); return NULL; } for (;;) { dbg(0,"state=%d\n",download->state); switch (download->state) { case 0: dbg(0,"error\n"); break; case 1: if (download_start(download)) download->state=2; else download->state=0; break; case 2: if (download_download(download)) download->state=3; else { g_free(m->progress); m->progress=g_strdup_printf("Download Tile %d %d%%",download->zipfile,download->progress); callback_list_call_attr_0(m->cbl, attr_progress); } break; case 3: if (download_finish(download)) { struct zip_cd *ret; g_free(m->progress); m->progress=g_strdup_printf("Download Tile %d 100%%",download->zipfile); callback_list_call_attr_0(m->cbl, attr_progress); if (async) { push_zipfile_tile_do(download->mr, download->cd, download->zipfile, download->toffset, download->tlength); ret=NULL; } else ret=download->cd; g_free(m->progress); m->progress=NULL; g_free(download); if (async) m->download=NULL; return ret; } else download->state=0; break; case 4: if (download_planet_size(download)) download->state=5; else download->state=0; break; case 5: g_free(m->progress); m->progress=g_strdup_printf("Download Map Information 50%%"); callback_list_call_attr_0(m->cbl, attr_progress); if (download_eoc(download)) download->state=6; else { dbg(0,"download of eoc failed\n"); download->state=0; } break; case 6: g_free(m->progress); m->progress=g_strdup_printf("Download Map Information 100%%"); callback_list_call_attr_0(m->cbl, attr_progress); if (download_directory_start(download)) download->state=7; else download->state=0; break; case 7: g_free(m->progress); m->progress=g_strdup_printf("Download Map Directory %d%%",(int)(download->offset*100/download->zip64_eoc->zip64ecsz)); callback_list_call_attr_0(m->cbl, attr_progress); if (!download_directory_do(download)) download->state=8; break; case 8: if (download_directory_finish(download)) download->state=9; else download->state=0; break; case 9: download_initial_finish(download); m->fi=download->file; g_free(m->progress); m->progress=NULL; g_free(download); if (async) m->download=NULL; map_binfile_open(m); break; } if (async) return NULL; } } static int push_zipfile_tile(struct map_rect_priv *mr, int zipfile, int offset, int length, int async) { struct map_priv *m=mr->m; struct file *f=m->fi; long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; struct zip_cd *cd=(struct zip_cd *)(file_data_read(f, cdoffset + zipfile*m->cde_size, m->cde_size)); dbg(1,"read from "LONGLONG_FMT" %d bytes\n",cdoffset + zipfile*m->cde_size, m->cde_size); cd_to_cpu(cd); if (!cd->zipcunc && m->url) { cd=download(m, mr, cd, zipfile, offset, length, async); if (!cd) return 1; } push_zipfile_tile_do(mr, cd, zipfile, offset, length); return 0; } static struct map_rect_priv * map_rect_new_binfile_int(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; binfile_check_version(map); dbg(1,"map_rect_new_binfile\n"); if (!map->fi && !map->url) return NULL; map_binfile_http_close(map); mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->sel=sel; mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_binfile; mr->item.priv_data=mr; return mr; } static void tile_bbox(char *tile, int len, struct coord_rect *r) { struct coord c; int overlap=1; int xo,yo; struct coord_rect world_bbox = { { WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MAX_Y}, /* left upper corner */ { WORLD_BOUNDINGBOX_MAX_X, WORLD_BOUNDINGBOX_MIN_Y}, /* right lower corner */ }; *r=world_bbox; while (len) { c.x=(r->lu.x+r->rl.x)/2; c.y=(r->lu.y+r->rl.y)/2; xo=(r->rl.x-r->lu.x)*overlap/100; yo=(r->lu.y-r->rl.y)*overlap/100; switch (*tile) { case 'a': r->lu.x=c.x-xo; r->rl.y=c.y-yo; break; case 'b': r->rl.x=c.x+xo; r->rl.y=c.y-yo; break; case 'c': r->lu.x=c.x-xo; r->lu.y=c.y+yo; break; case 'd': r->rl.x=c.x+xo; r->lu.y=c.y+yo; break; default: return; } tile++; len--; } } static int map_download_selection_check(struct zip_cd *cd, struct map_selection *sel) { struct coord_rect cd_rect; if (cd->zipcunc) return 0; tile_bbox((char *)(cd+1), cd->zipcfnl, &cd_rect); while (sel) { if (coord_rect_overlap(&cd_rect, &sel->u.c_rect)) return 1; sel=sel->next; } return 0; } static void map_download_selection(struct map_priv *m, struct map_rect_priv *mr, struct map_selection *sel) { int i; struct zip_cd *cd; for (i = 0 ; i < m->zip_members ; i++) { cd=binfile_read_cd(m, m->cde_size*i, -1); if (map_download_selection_check(cd, sel)) download(m, mr, cd, i, 0, 0, 0); file_data_free(m->fi, (unsigned char *)cd); } } static struct map_rect_priv * map_rect_new_binfile(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr=map_rect_new_binfile_int(map, sel); struct tile t; dbg(1,"zip_members=%d\n", map->zip_members); if (map->url && map->fi && sel && sel->order == 255) { map_download_selection(map, mr, sel); } if (map->eoc) mr->status=1; else { unsigned char *d; if (map->fi) { d=file_data_read(map->fi, 0, map->fi->size); t.start=(int *)d; t.end=(int *)(d+map->fi->size); t.fi=map->fi; t.zipfile_num=0; t.mode=0; push_tile(mr, &t, 0, 0); } else if (map->url && !map->download) { download(map, NULL, NULL, 0, 0, 0, 1); mr->status=1; } } return mr; } static void write_changes_do(gpointer key, gpointer value, gpointer user_data) { struct binfile_hash_entry *entry=key; FILE *out=user_data; if (entry->flags) { entry->flags=0; fwrite(entry, sizeof(*entry)+(le32_to_cpu(entry->data[0])+1)*4, 1, out); dbg(0,"yes\n"); } } static void write_changes(struct map_priv *m) { FILE *changes; char *changes_file; if (!m->changes) return; changes_file=g_strdup_printf("%s.log",m->filename); changes=fopen(changes_file,"ab"); g_hash_table_foreach(m->changes, write_changes_do, changes); fclose(changes); g_free(changes_file); } static void load_changes(struct map_priv *m) { FILE *changes; char *changes_file; struct binfile_hash_entry entry,*e; int size; changes_file=g_strdup_printf("%s.log",m->filename); changes=fopen(changes_file,"rb"); if (! changes) { g_free(changes_file); return; } m->changes=g_hash_table_new_full(binfile_hash_entry_hash, binfile_hash_entry_equal, g_free, NULL); while (fread(&entry, sizeof(entry), 1, changes) == 1) { if (fread(&size, sizeof(size), 1, changes) != 1) break; e=g_malloc(sizeof(struct binfile_hash_entry)+(le32_to_cpu(size)+1)*4); *e=entry; e->data[0]=size; if (fread(e->data+1, le32_to_cpu(size)*4, 1, changes) != 1) break; g_hash_table_replace(m->changes, e, e); } fclose(changes); g_free(changes_file); } static void map_rect_destroy_binfile(struct map_rect_priv *mr) { write_changes(mr->m); while (pop_tile(mr)); #ifdef DEBUG_SIZE dbg(0,"size=%d kb\n",mr->size/1024); #endif if (mr->tiles[0].fi && mr->tiles[0].start) file_data_free(mr->tiles[0].fi, (unsigned char *)(mr->tiles[0].start)); g_free(mr->url); map_binfile_http_close(mr->m); g_free(mr); } static void setup_pos(struct map_rect_priv *mr) { int size,coord_size; struct tile *t=mr->t; size=le32_to_cpu(t->pos[0]); if (size > 1024*1024 || size < 0) { dbg(0,"size=0x%x\n", size); #if 0 fprintf(stderr,"offset=%d\n", (unsigned char *)(mr->pos)-mr->m->f->begin); #endif dbg(0,"size error\n"); } t->pos_next=t->pos+size+1; mr->item.type=le32_to_cpu(t->pos[1]); coord_size=le32_to_cpu(t->pos[2]); t->pos_coord_start=t->pos+3; t->pos_attr_start=t->pos_coord_start+coord_size; } static int selection_contains(struct map_selection *sel, struct coord_rect *r, struct range *mima) { int order; if (! sel) return 1; while (sel) { if (coord_rect_overlap(r, &sel->u.c_rect)) { order=sel->order; dbg(1,"min %d max %d order %d\n", mima->min, mima->max, order); if (!mima->min && !mima->max) return 1; if (order >= mima->min && order <= mima->max) return 1; } sel=sel->next; } return 0; } static void map_parse_country_binfile(struct map_rect_priv *mr) { struct attr at; if (!binfile_attr_get(mr->item.priv_data, attr_country_id, &at)) return; if( at.u.num != mr->country_id) return; if (!binfile_attr_get(mr->item.priv_data, attr_zipfile_ref, &at)) return; if(mr->msp) { struct attr *search=&mr->msp->search; if(search->type==attr_town_name || search->type==attr_district_name || search->type==attr_town_or_district_name) { struct attr af, al; if(binfile_attr_get(mr->item.priv_data, attr_first_key, &af)) { if(linguistics_compare(af.u.str,search->u.str,linguistics_cmp_partial)>0) { dbg(1,"Skipping index item with first_key='%s'\n", af.u.str); return; } } if(binfile_attr_get(mr->item.priv_data, attr_last_key, &al)) { if(linguistics_compare(al.u.str,search->u.str,linguistics_cmp_partial)<0) { dbg(1,"Skipping index item with first_key='%s', last_key='%s'\n", af.u.str, al.u.str); return; } } } } push_zipfile_tile(mr, at.u.num, 0, 0, 0); } static int map_parse_submap(struct map_rect_priv *mr, int async) { struct coord_rect r; struct coord c[2]; struct attr at; struct range mima; if (binfile_coord_get(mr->item.priv_data, c, 2) != 2) return 0; r.lu.x=c[0].x; r.lu.y=c[1].y; r.rl.x=c[1].x; r.rl.y=c[0].y; if (!binfile_attr_get(mr->item.priv_data, attr_order, &at)) return 0; #if __BYTE_ORDER == __BIG_ENDIAN mima.min=le16_to_cpu(at.u.range.max); mima.max=le16_to_cpu(at.u.range.min); #else mima=at.u.range; #endif if (!mr->m->eoc || !selection_contains(mr->sel, &r, &mima)) return 0; if (!binfile_attr_get(mr->item.priv_data, attr_zipfile_ref, &at)) return 0; dbg(1,"pushing zipfile %ld from %d\n", at.u.num, mr->t->zipfile_num); return push_zipfile_tile(mr, at.u.num, 0, 0, async); } static int push_modified_item(struct map_rect_priv *mr) { struct item_id id; struct binfile_hash_entry *entry; id.id_hi=mr->item.id_hi; id.id_lo=mr->item.id_lo; entry=g_hash_table_lookup(mr->m->changes, &id); if (entry) { struct tile tn; tn.pos_next=tn.pos=tn.start=entry->data; tn.zipfile_num=mr->item.id_hi; tn.mode=2; tn.end=tn.start+le32_to_cpu(entry->data[0])+1; push_tile(mr, &tn, 0, 0); return 1; } return 0; } static struct item * map_rect_get_item_binfile(struct map_rect_priv *mr) { struct tile *t; struct map_priv *m=mr->m; if (m->download) { download(m, NULL, NULL, 0, 0, 0, 2); return &busy_item; } if (mr->status == 1) { mr->status=0; if (push_zipfile_tile(mr, m->zip_members-1, 0, 0, 1)) return &busy_item; } for (;;) { t=mr->t; if (! t) return NULL; t->pos=t->pos_next; if (t->pos >= t->end) { if (pop_tile(mr)) continue; return NULL; } setup_pos(mr); binfile_coord_rewind(mr); binfile_attr_rewind(mr); if ((mr->item.type == type_submap) && (!mr->country_id)) { if (map_parse_submap(mr, 1)) return &busy_item; continue; } if (t->mode != 2) { mr->item.id_hi=t->zipfile_num; mr->item.id_lo=t->pos-t->start; if (mr->m->changes && push_modified_item(mr)) continue; } if (mr->country_id) { if (mr->item.type == type_countryindex) { map_parse_country_binfile(mr); } if (item_is_town(mr->item)) { return &mr->item; } else { continue; } } return &mr->item; } } static struct item * map_rect_get_item_byid_binfile(struct map_rect_priv *mr, int id_hi, int id_lo) { struct tile *t; if (mr->m->eoc) { while (pop_tile(mr)); push_zipfile_tile(mr, id_hi, 0, 0, 0); } t=mr->t; t->pos=t->start+id_lo; mr->item.id_hi=id_hi; mr->item.id_lo=id_lo; if (mr->m->changes) push_modified_item(mr); setup_pos(mr); binfile_coord_rewind(mr); binfile_attr_rewind(mr); return &mr->item; } static int binmap_search_by_index(struct map_priv *map, struct item *item, struct map_rect_priv **ret) { struct attr zipfile_ref; int *data; if (!item) { *ret=NULL; return 0; } if (item_attr_get(item, attr_item_id, &zipfile_ref)) { data=zipfile_ref.u.data; *ret=map_rect_new_binfile_int(map, NULL); push_zipfile_tile(*ret, le32_to_cpu(data[0]), le32_to_cpu(data[1]), -1, 0); return 3; } if (item_attr_get(item, attr_zipfile_ref, &zipfile_ref)) { *ret=map_rect_new_binfile_int(map, NULL); push_zipfile_tile(*ret, zipfile_ref.u.num, 0, 0, 0); return 1; } if (item_attr_get(item, attr_zipfile_ref_block, &zipfile_ref)) { data=zipfile_ref.u.data; *ret=map_rect_new_binfile_int(map, NULL); push_zipfile_tile(*ret, le32_to_cpu(data[0]), le32_to_cpu(data[1]), le32_to_cpu(data[2]), 0); return 2; } *ret=NULL; return 0; } static struct map_rect_priv * binmap_search_street_by_place(struct map_priv *map, struct item *town, struct coord *c, struct map_selection *sel, GList **boundaries) { struct attr town_name, poly_town_name; struct map_rect_priv *map_rec2; struct item *place; int found=0; if (!item_attr_get(town, attr_label, &town_name)) return NULL; sel->range = item_range_all; sel->order = 18; sel->next = NULL; sel->u.c_rect.lu=*c; sel->u.c_rect.rl=*c; map_rec2=map_rect_new_binfile(map, sel); while ((place=map_rect_get_item_binfile(map_rec2))) { if (item_is_poly_place(*place) && item_attr_get(place, attr_label, &poly_town_name) && !strcmp(poly_town_name.u.str,town_name.u.str)) { struct coord *c; int i,count; struct geom_poly_segment *bnd; count=binfile_coord_left(map_rec2); c=g_new(struct coord,count); found=1; item_coord_get(place, c, count); for (i = 0 ; i < count ; i++) coord_rect_extend(&sel->u.c_rect, &c[i]); bnd=g_new(struct geom_poly_segment,1); bnd->first=c; bnd->last=c+count-1; bnd->type=geom_poly_segment_type_way_outer; *boundaries=g_list_prepend(*boundaries,bnd); } } map_rect_destroy_binfile(map_rec2); if (found) return map_rect_new_binfile(map, sel); return NULL; } static struct map_rect_priv * binmap_search_street_by_estimate(struct map_priv *map, struct item *town, struct coord *c, struct map_selection *sel) { int size = 10000; switch (town->type) { case type_town_label_1e7: case type_town_label_5e6: case type_town_label_2e6: case type_town_label_1e6: case type_town_label_5e5: case type_town_label_2e5: case type_district_label_1e7: case type_district_label_5e6: case type_district_label_2e6: case type_district_label_1e6: case type_district_label_5e5: case type_district_label_2e5: size = 10000; break; case type_town_label_1e5: case type_town_label_5e4: case type_town_label_2e4: case type_district_label_1e5: case type_district_label_5e4: case type_district_label_2e4: size = 5000; break; case type_town_label_1e4: case type_town_label_5e3: case type_town_label_2e3: case type_district_label_1e4: case type_district_label_5e3: case type_district_label_2e3: size = 2500; break; case type_town_label_1e3: case type_town_label_5e2: case type_town_label_2e2: case type_town_label_1e2: case type_town_label_5e1: case type_town_label_2e1: case type_town_label_1e1: case type_town_label_5e0: case type_town_label_2e0: case type_town_label_1e0: case type_town_label_0e0: case type_district_label_1e3: case type_district_label_5e2: case type_district_label_2e2: case type_district_label_1e2: case type_district_label_5e1: case type_district_label_2e1: case type_district_label_1e1: case type_district_label_5e0: case type_district_label_2e0: case type_district_label_1e0: case type_district_label_0e0: size = 1000; break; default: break; } sel->u.c_rect.lu.x = c->x-size; sel->u.c_rect.lu.y = c->y+size; sel->u.c_rect.rl.x = c->x+size; sel->u.c_rect.rl.y = c->y-size; return map_rect_new_binfile(map, sel); } static struct map_rect_priv * binmap_search_housenumber_by_estimate(struct map_priv *map, struct coord *c, struct map_selection *sel) { int size = 400; sel->u.c_rect.lu.x = c->x-size; sel->u.c_rect.lu.y = c->y+size; sel->u.c_rect.rl.x = c->x+size; sel->u.c_rect.rl.y = c->y-size; sel->range = item_range_all; sel->order = 18; return map_rect_new_binfile(map, sel); } static struct map_search_priv * binmap_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) { struct map_rect_priv *map_rec; struct map_search_priv *msp=g_new0(struct map_search_priv, 1); struct item *town; int idx; msp->search = *search; msp->partial = partial; if(ATTR_IS_STRING(msp->search.type)) msp->search.u.str=linguistics_casefold(search->u.str); /* * NOTE: If you implement search for other attributes than attr_town_name and attr_street_name, * please update this comment and the documentation for map_search_new() in map.c */ switch (search->type) { case attr_country_name: break; case attr_town_name: case attr_town_or_district_name: map_rec = map_rect_new_binfile(map, NULL); if (!map_rec) break; map_rec->country_id = item->id_lo; map_rec->msp = msp; msp->mr = map_rec; return msp; break; case attr_town_postal: break; case attr_street_name: if (! item->map) break; if (!map_priv_is(item->map, map)) break; map_rec = map_rect_new_binfile(map, NULL); town = map_rect_get_item_byid_binfile(map_rec, item->id_hi, item->id_lo); if (town) { struct coord c; if (binmap_search_by_index(map, town, &msp->mr)) msp->mode = 1; else { if (item_coord_get(town, &c, 1)) { if ((msp->mr=binmap_search_street_by_place(map, town, &c, &msp->ms, &msp->boundaries))) msp->mode = 2; else { msp->mr=binmap_search_street_by_estimate(map, town, &c, &msp->ms); msp->mode = 3; } } } map_rect_destroy_binfile(map_rec); if (!msp->mr) break; return msp; } map_rect_destroy_binfile(map_rec); break; case attr_house_number: dbg(1,"case house_number"); if (! item->map) break; if (!map_priv_is(item->map, map)) break; msp->map=map; msp->mr_item = map_rect_new_binfile(map, NULL); msp->item = map_rect_get_item_byid_binfile(msp->mr_item, item->id_hi, item->id_lo); idx=binmap_search_by_index(map, msp->item, &msp->mr); if (idx) msp->mode = 1; else { struct coord c; if (item_coord_get(msp->item, &c, 1)) { struct attr attr; msp->mr=binmap_search_housenumber_by_estimate(map, &c, &msp->ms); msp->mode = 2; msp->rect_new=msp->ms.u.c_rect; if(item_attr_get(msp->item, attr_street_name, &attr)) msp->parent_name=g_strdup(attr.u.str); dbg(0,"pn=%s\n",msp->parent_name); } } if (idx != 3) { map_rect_destroy_binfile(msp->mr_item); msp->mr_item=NULL; } if (!msp->mr) { break; } return msp; default: break; } if(ATTR_IS_STRING(msp->search.type)) g_free(msp->search.u.str); g_free(msp); return NULL; } struct duplicate { struct coord c; char str[0]; }; static guint duplicate_hash(gconstpointer key) { const struct duplicate *d=key; return d->c.x^d->c.y^g_str_hash(d->str); } static gboolean duplicate_equal(gconstpointer a, gconstpointer b) { const struct duplicate *da=a; const struct duplicate *db=b; return (da->c.x == db->c.x && da->c.y == da->c.y && g_str_equal(da->str,db->str)); } /** * @brief Test an item if it's duplicate. If it's not a duplicate, return new struct duplicate to be duplicate_insert()'ed. * @param msp pointer to private map search data * @param item item to check * @param attr_type * returns - pointer to new struct duplicate, if this item is not already exist in hash * - NULL if this item already exists in duplicate hash or doesnt have an attr_type attr; */ static struct duplicate* duplicate_test(struct map_search_priv *msp, struct item *item, enum attr_type attr_type) { struct attr attr; int len; char *buffer; struct duplicate *d; if (!msp->search_results) msp->search_results = g_hash_table_new_full(duplicate_hash, duplicate_equal, g_free, NULL); binfile_attr_rewind(item->priv_data); if (!item_attr_get(item, attr_type, &attr)) return NULL; len=sizeof(struct coord)+strlen(attr.u.str)+1; buffer=g_alloca(sizeof(char)*len); d=(struct duplicate *)buffer; if (!item_coord_get(item, &d->c, 1)) { d->c.x=0; d->c.y=0; } strcpy(d->str, attr.u.str); binfile_coord_rewind(item->priv_data); binfile_attr_rewind(item->priv_data); if (!g_hash_table_lookup(msp->search_results, d)) { struct duplicate *dr=g_malloc(len); memcpy(dr, d, len); return dr; } return NULL; } /** * @brief Insert struct duplicate item into the duplicate hash. * @param msp pointer to private map search data * @param duplicate Duplicate info to insert */ static void duplicate_insert(struct map_search_priv *msp, struct duplicate *d) { g_hash_table_insert(msp->search_results, d, GINT_TO_POINTER(1)); } /** * @brief Check if item is dupicate and update duplicate hash if needed. * @param msp pointer to private map search data * @param item item to check * @param attr_type * @returns 0 if item is not a duplicate * 1 if item is duplicate or doesn't have required attr_type attribute */ static int duplicate(struct map_search_priv *msp, struct item *item, enum attr_type attr_type) { struct duplicate *d=duplicate_test(msp, item, attr_type); if(!d) return 1; duplicate_insert(msp,d); return 0; } static int item_inside_poly_list(struct item *it, GList *l) { while(l) { struct geom_poly_segment *p=l->data; int count=p->last-p->first+1; struct coord c; int ccount; item_coord_rewind(it); ccount=binfile_coord_left(it->priv_data); if(ccount==1) item_coord_get(it,&c,1); else if(ccount==2) { struct coord c2; item_coord_get(it,&c,1); item_coord_get(it,&c2,1); c.x=(c.x+c2.x)/2; c.y=(c.y+c2.y)/2; } else { if(ccount>3) ccount/=2; else ccount=2; while(--ccount>0) item_coord_get(it,&c,1); } if(geom_poly_point_inside(p->first,count,&c)) return 1; l=g_list_next(l); } return 0; } static struct item * binmap_search_get_item(struct map_search_priv *map_search) { struct item* it; struct attr at; enum linguistics_cmp_mode mode=(map_search->partial?linguistics_cmp_partial:0); for (;;) { while ((it = map_rect_get_item_binfile(map_search->mr))) { int has_house_number=0; switch (map_search->search.type) { case attr_town_name: case attr_district_name: case attr_town_or_district_name: if (map_search->mr->tile_depth > 1 && item_is_town(*it) && map_search->search.type != attr_district_name) { if (binfile_attr_get(it->priv_data, attr_town_name_match, &at) || binfile_attr_get(it->priv_data, attr_town_name, &at)) { if (!linguistics_compare(at.u.str, map_search->search.u.str, mode) && !duplicate(map_search, it, attr_town_name)) return it; } } if (map_search->mr->tile_depth > 1 && item_is_district(*it) && map_search->search.type != attr_town_name) { if (binfile_attr_get(it->priv_data, attr_district_name_match, &at) || binfile_attr_get(it->priv_data, attr_district_name, &at)) { if (!linguistics_compare(at.u.str, map_search->search.u.str, mode) && !duplicate(map_search, it, attr_town_name)) return it; } } break; case attr_street_name: if (map_search->mode == 1) { if (binfile_attr_get(it->priv_data, attr_street_name_match, &at) || binfile_attr_get(it->priv_data, attr_street_name, &at)) { if (!linguistics_compare(at.u.str, map_search->search.u.str, mode) && !duplicate(map_search, it, attr_street_name)) { return it; } } continue; } if (item_is_street(*it)) { struct attr at; if (!map_selection_contains_item_rect(map_search->mr->sel, it)) break; if(binfile_attr_get(it->priv_data, attr_label, &at)) { struct coord c[128]; struct duplicate *d; /* Extracting all coords here makes duplicate_new() not consider them (we don't want all * street segments to be reported as separate streets). */ while(item_coord_get(it,c,128)>0); d=duplicate_test(map_search, it, attr_label); if(!d) break; if(linguistics_compare(at.u.str, map_search->search.u.str, mode|linguistics_cmp_expand|linguistics_cmp_words)) { /* Remember this non-matching street name in duplicate hash to skip name * comparison for its following segments */ duplicate_insert(map_search, d); break; } if(map_search->boundaries && !item_inside_poly_list(it,map_search->boundaries)) { /* Other segments may fit the town poly. Do not update hash for now. */ g_free(d); break; } duplicate_insert(map_search, d); item_coord_rewind(it); return it; } } break; case attr_house_number: has_house_number=binfile_attr_get(it->priv_data, attr_house_number, &at); if (has_house_number || it->type == type_house_number || it->type == type_house_number_interpolation_even || it->type == type_house_number_interpolation_odd || it->type == type_house_number_interpolation_all || (map_search->mode == 1 && item_is_street(*it)) ) { if (has_house_number) { struct attr at2; if ( (map_search->mode!=2 || binfile_attr_get(it->priv_data, attr_street_name, &at2)) && !linguistics_compare(at.u.str, map_search->search.u.str, mode)) { if (!duplicate(map_search, it, attr_house_number)) { binfile_attr_rewind(it->priv_data); return it; } } } else return it; } else if(map_search->mode==2 && map_search->parent_name && item_is_street(*it) && binfile_attr_get(it->priv_data, attr_street_name, &at) && !strcmp(at.u.str, map_search->parent_name) ) { /* If matching street segment found, prepare to expand house number search region +100m around each way point */ struct coord c; while(item_coord_get(it,&c,1)) { c.x-=100; c.y-=100; coord_rect_extend(&map_search->rect_new,&c); c.x+=200; c.y+=200; coord_rect_extend(&map_search->rect_new,&c); } } continue; default: return NULL; } } if(map_search->search.type==attr_house_number && map_search->mode==2 && map_search->parent_name) { /* For unindexed house number search, check if street segments extending possible housenumber locations were found */ if(map_search->ms.u.c_rect.lu.x!=map_search->rect_new.lu.x || map_search->ms.u.c_rect.lu.y!=map_search->rect_new.lu.y || map_search->ms.u.c_rect.rl.x!=map_search->rect_new.rl.x || map_search->ms.u.c_rect.rl.y!=map_search->rect_new.rl.y) { map_search->ms.u.c_rect=map_search->rect_new; map_rect_destroy_binfile(map_search->mr); map_search->mr=map_rect_new_binfile(map_search->map, &map_search->ms); dbg(0,"Extended house number search region to %d x %d, restarting...\n",map_search->ms.u.c_rect.rl.x - map_search->ms.u.c_rect.lu.x, map_search->ms.u.c_rect.lu.y-map_search->ms.u.c_rect.rl.y); continue; } } if (!map_search->mr_item) return NULL; map_rect_destroy_binfile(map_search->mr); if (!binmap_search_by_index(map_search->map, map_search->item, &map_search->mr)) return NULL; } } static void binmap_search_destroy(struct map_search_priv *ms) { if (ms->search_results) g_hash_table_destroy(ms->search_results); if(ATTR_IS_STRING(ms->search.type)) g_free(ms->search.u.str); if(ms->parent_name) g_free(ms->parent_name); if (ms->mr_item) map_rect_destroy_binfile(ms->mr_item); if (ms->mr) map_rect_destroy_binfile(ms->mr); while(ms->boundaries) { geom_poly_segment_destroy(ms->boundaries->data); ms->boundaries=g_list_delete_link(ms->boundaries,ms->boundaries); } g_free(ms); } static int binmap_get_attr(struct map_priv *m, enum attr_type type, struct attr *attr) { attr->type=type; switch (type) { case attr_map_release: if (m->map_release) { attr->u.str=m->map_release; return 1; } break; case attr_progress: if (m->progress) { attr->u.str=m->progress; return 1; } default: break; } return 0; } static int binmap_set_attr(struct map_priv *map, struct attr *attr) { switch (attr->type) { case attr_update: map->download_enabled = attr->u.num; return 1; default: return 0; } } static struct map_methods map_methods_binfile = { projection_mg, "utf-8", map_destroy_binfile, map_rect_new_binfile, map_rect_destroy_binfile, map_rect_get_item_binfile, map_rect_get_item_byid_binfile, binmap_search_new, binmap_search_destroy, binmap_search_get_item, NULL, binmap_get_attr, binmap_set_attr, }; static int binfile_get_index(struct map_priv *m) { int len; int cde_index_size; int offset; struct zip_cd *cd; len = strlen("index"); cde_index_size = sizeof(struct zip_cd)+len; if (m->eoc64) offset = m->eoc64->zip64ecsz-cde_index_size; else offset = m->eoc->zipecsz-cde_index_size; cd = binfile_read_cd(m, offset, len); if (!cd) { cde_index_size+=sizeof(struct zip_cd_ext); if (m->eoc64) offset = m->eoc64->zip64ecsz-cde_index_size; else offset = m->eoc->zipecsz-cde_index_size; cd = binfile_read_cd(m, offset, len+sizeof(struct zip_cd_ext)); } if (cd) { if (cd->zipcfnl == len && !strncmp(cd->zipcfn, "index", len)) { m->index_offset=offset; m->index_cd=cd; return 1; } } offset=binfile_search_cd(m, 0, "index", 0, 0); if (offset == -1) return 0; cd=binfile_read_cd(m, offset, -1); if (!cd) return 0; m->index_offset=offset; m->index_cd=cd; return 1; } static int map_binfile_zip_setup(struct map_priv *m, char *filename, int mmap) { struct zip_cd *first_cd; int i; if (!(m->eoc=binfile_read_eoc(m->fi))) { dbg(0,"unable to read eoc\n"); return 0; } dbg_assert(m->eoc->zipedsk == m->eoc->zipecen); if (m->eoc->zipedsk && strlen(filename) > 3) { char *tmpfilename=g_strdup(filename),*ext=tmpfilename+strlen(tmpfilename)-3; m->fis=g_new(struct file *,m->eoc->zipedsk); for (i = 0 ; i < m->eoc->zipedsk-1 ; i++) { sprintf(ext,"b%02d",i+1); m->fis[i]=file_create(tmpfilename, 0); if (mmap) file_mmap(m->fis[i]); } m->fis[m->eoc->zipedsk-1]=m->fi; g_free(tmpfilename); } dbg(1,"num_disk %d\n",m->eoc->zipedsk); m->eoc64=binfile_read_eoc64(m->fi); if (!binfile_get_index(m)) { dbg(0,"no index found\n"); return 0; } if (!(first_cd=binfile_read_cd(m, 0, 0))) { dbg(0,"unable to get first cd\n"); return 0; } m->cde_size=sizeof(struct zip_cd)+first_cd->zipcfnl+first_cd->zipcxtl; m->zip_members=m->index_offset/m->cde_size+1; dbg(1,"cde_size %d\n", m->cde_size); dbg(1,"members %d\n",m->zip_members); file_data_free(m->fi, (unsigned char *)first_cd); if (mmap) file_mmap(m->fi); return 1; } #if 0 static int map_binfile_download_initial(struct map_priv *m) { struct attr readwrite={attr_readwrite,{(void *)1}}; struct attr create={attr_create,{(void *)1}}; struct attr *attrs[4]; struct file *out; long long woffset=0,planet_size; int size_ret; int cd1size,cdisize; long long cd1offset,cdioffset; struct zip64_eoc *zip64_eoc; struct zip64_eocl *zip64_eocl; struct zip_eoc *zip_eoc; struct zip_cd *cd1,*cdn,*cdi; int count,chunk,cdoffset=0; int mode=1; struct map_download *download=g_new0(struct map_download, 1); attrs[0]=&readwrite; attrs[1]=&create; attrs[2]=NULL; download->file=file_create(m->filename,attrs); download->m=m; download_planet_size(download); download_eoc(download); download_directory_start(download); while (download_directory_do(download)); download_directory_finish(download); download_initial_finish(download); m->fi=download->file; g_free(download); return 1; cd1size=sizeof(*cd1); cd1offset=zip64_eoc->zip64eofst; cd1=(struct zip_cd *)map_binfile_download_range(m, cd1offset, cd1size); if (!cd1) return 0; cd1size=sizeof(*cd1)+binfile_cd_extra(cd1); g_free(cd1); cd1=(struct zip_cd *)map_binfile_download_range(m, cd1offset, cd1size); if (!cd1) return 0; cd1->zipcunc=0; cdisize=sizeof(*cdi)+strlen("index")+cd1->zipcxtl; cdioffset=zip64_eoc->zip64eofst+zip64_eoc->zip64ecsz-cdisize; cdi=(struct zip_cd *)map_binfile_download_range(m, cdioffset, cdisize); if (!cdi) { g_free(cd1); return 0; } cdi->zipcunc=0; cdn=g_malloc0(cd1size*256); file_data_write(out, woffset, sizeof(*zip64_eoc), (unsigned char *)zip64_eoc); woffset+=sizeof(*zip64_eoc); cdoffset=woffset; file_data_write(out, woffset, cd1size, (unsigned char *)cd1); woffset+=cd1size; count=(cdioffset-cd1offset)/cd1size-1; while (count > 0) { if (count > 256) chunk=256; else chunk=count; file_data_write(out, woffset, cd1size*chunk, (unsigned char *)cdn); woffset+=cd1size*chunk; count-=chunk; } g_free(cdn); g_free(cd1); file_data_write(out, woffset, cdisize, (unsigned char *)cdi); woffset+=cdisize; } #endif static int map_binfile_open(struct map_priv *m) { int *magic; struct map_rect_priv *mr; struct item *item; struct attr attr; struct attr readwrite={attr_readwrite, {(void *)1}}; struct attr *attrs[]={&readwrite, NULL}; dbg(1,"file_create %s\n", m->filename); m->fi=file_create(m->filename, m->url?attrs:NULL); if (! m->fi && m->url) return 0; if (! m->fi) { dbg(0,"Failed to load '%s'\n", m->filename); return 0; } if (m->check_version) m->version=file_version(m->fi, m->check_version); magic=(int *)file_data_read(m->fi, 0, 4); if (!magic) { file_destroy(m->fi); m->fi=NULL; return 0; } *magic = le32_to_cpu(*magic); if (*magic == zip_lfh_sig || *magic == zip_split_sig || *magic == zip_cd_sig || *magic == zip64_eoc_sig) { if (!map_binfile_zip_setup(m, m->filename, m->flags & 1)) { dbg(0,"invalid file format for '%s'\n", m->filename); file_destroy(m->fi); m->fi=NULL; return 0; } } else if (*magic == zip_lfh_sig_rev || *magic == zip_split_sig_rev || *magic == zip_cd_sig_rev || *magic == zip64_eoc_sig_rev) { dbg(0,"endianness mismatch\n"); file_destroy(m->fi); m->fi=NULL; return 0; } else file_mmap(m->fi); file_data_free(m->fi, (unsigned char *)magic); m->cachedir=g_strdup("/tmp/navit"); m->map_version=0; mr=map_rect_new_binfile(m, NULL); if (mr) { while ((item=map_rect_get_item_binfile(mr)) == &busy_item); if (item && item->type == type_map_information) { if (binfile_attr_get(item->priv_data, attr_version, &attr)) m->map_version=attr.u.num; if (binfile_attr_get(item->priv_data, attr_map_release, &attr)) m->map_release=g_strdup(attr.u.str); if (m->url && binfile_attr_get(item->priv_data, attr_url, &attr)) { dbg(0,"url config %s map %s\n",m->url,attr.u.str); if (strcmp(m->url, attr.u.str)) m->update_available=1; g_free(m->url); m->url=g_strdup(attr.u.str); } } map_rect_destroy_binfile(mr); if (m->map_version >= 16) { dbg(0,"Warning: This map is incompatible with your navit version. Please update navit.\n"); return 0; } } return 1; } static void map_binfile_close(struct map_priv *m) { int i; file_data_free(m->fi, (unsigned char *)m->index_cd); file_data_free(m->fi, (unsigned char *)m->eoc); file_data_free(m->fi, (unsigned char *)m->eoc64); g_free(m->cachedir); g_free(m->map_release); if (m->fis) { for (i = 0 ; i < m->eoc->zipedsk ; i++) { file_destroy(m->fis[i]); } } else file_destroy(m->fi); } static void map_binfile_destroy(struct map_priv *m) { g_free(m->filename); g_free(m->url); g_free(m->progress); g_free(m); } static void binfile_check_version(struct map_priv *m) { int version=-1; if (!m->check_version) return; if (m->fi) version=file_version(m->fi, m->check_version); if (version != m->version) { if (m->fi) map_binfile_close(m); map_binfile_open(m); } } static struct map_priv * map_new_binfile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); struct attr *check_version,*map_pass,*flags,*url,*download_enabled; struct file_wordexp *wexp; char **wexp_data; if (! data) return NULL; wexp=file_wordexp_new(data->u.str); wexp_data=file_wordexp_get_array(wexp); dbg(1,"map_new_binfile %s\n", data->u.str); *meth=map_methods_binfile; m=g_new0(struct map_priv, 1); m->cbl=cbl; m->id=++map_id; m->filename=g_strdup(wexp_data[0]); file_wordexp_destroy(wexp); check_version=attr_search(attrs, NULL, attr_check_version); if (check_version) m->check_version=check_version->u.num; map_pass=attr_search(attrs, NULL, attr_map_pass); if (map_pass) m->passwd=g_strdup(map_pass->u.str); flags=attr_search(attrs, NULL, attr_flags); if (flags) m->flags=flags->u.num; url=attr_search(attrs, NULL, attr_url); if (url) m->url=g_strdup(url->u.str); download_enabled = attr_search(attrs, NULL, attr_update); if (download_enabled) m->download_enabled=download_enabled->u.num; if (!map_binfile_open(m) && !m->check_version && !m->url) { map_binfile_destroy(m); m=NULL; } else { load_changes(m); } return m; } void plugin_init(void) { dbg(1,"binfile: plugin_init\n"); if (sizeof(struct zip_cd) != 46) { dbg(0,"error: sizeof(struct zip_cd)=%d\n",sizeof(struct zip_cd)); } plugin_register_map_type("binfile", map_new_binfile); } navit-0.5.0~svn5643+dfsg.1/navit/map/csv/000077500000000000000000000000001221777731700176715ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/csv/CMakeLists.txt000066400000000000000000000000551221777731700224310ustar00rootroot00000000000000module_add_library(map_csv csv.c quadtree.c) navit-0.5.0~svn5643+dfsg.1/navit/map/csv/Makefile.am000066400000000000000000000005121221777731700217230ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_csv if PLUGINS modulemap_LTLIBRARIES = libmap_csv.la else noinst_LTLIBRARIES = libmap_csv.la endif libmap_csv_la_SOURCES = csv.c csv.h quadtree.c quadtree.h libmap_csv_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/map/csv/csv.c000066400000000000000000000475061221777731700206440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "transform.h" #include "file.h" #include "quadtree.h" #include "csv.h" static int map_id; /*prototypes*/ static int csv_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode); static struct item * csv_create_item(struct map_rect_priv *mr, enum item_type it_type); static void quadtree_item_free(void *mr, struct quadtree_item *qitem); static void quadtree_item_free_do(void *qitem); struct quadtree_data { enum item_type type; int id_lo; GList* attr_list; struct item *item; }; struct quadtree_data *quadtree_data_dup(struct quadtree_data *qdata) { struct quadtree_data *ret=g_new0(struct quadtree_data,1); GList *l; ret->type=qdata->type; ret->id_lo=qdata->id_lo; ret->item=g_new(struct item,1); *(ret->item)=*(qdata->item); for(l=qdata->attr_list;l;l=g_list_next(l)) { ret->attr_list=g_list_prepend(ret->attr_list,attr_dup(l->data)); } return ret; } static void save_map_csv(struct map_priv *m) { if(m->filename && m->dirty) { char* filename = g_strdup_printf("%s.tmp",m->filename); FILE* fp; int ferr = 0; char *csv_line = 0; char *tmpstr = 0; char *oldstr = 0; struct quadtree_iter *iter; struct quadtree_item *qitem; if( ! (fp=fopen(filename,"w+"))) { dbg(0, "Error opening csv file to write new entries"); return; } /*query the world*/ iter=quadtree_query(m->tree_root, -180, 180, -180, 180, quadtree_item_free, m); while((qitem = quadtree_item_next(iter))!=NULL) { int i; enum attr_type *at = m->attr_types; if(qitem->deleted) continue; csv_line = NULL; tmpstr = NULL; for(i=0;iattr_cnt;++i) { if(*at == attr_position_latitude) { tmpstr = g_strdup_printf("%lf",qitem->latitude); } else if(*at == attr_position_longitude) { tmpstr = g_strdup_printf("%lf",qitem->longitude); } else { GList* attr_list = ((struct quadtree_data*)(qitem->data))->attr_list; GList* attr_it = attr_list; struct attr* found_attr = NULL; /*search attributes*/ while(attr_it) { if(((struct attr*)(attr_it->data))->type == *at) { found_attr = attr_it->data; break; } attr_it = g_list_next(attr_it); } if(found_attr) { if(ATTR_IS_INT(*at)) { tmpstr = g_strdup_printf("%d", (int)found_attr->u.num); } else if(ATTR_IS_DOUBLE(*at)) { tmpstr = g_strdup_printf("%lf", *found_attr->u.numd); } else if(ATTR_IS_STRING(*at)) { tmpstr = g_strdup(found_attr->u.str); } else { dbg(0,"Cant represent attribute %s\n",attr_to_name(*at)); tmpstr=g_strdup(""); } } else { dbg(0,"No value defined for the atribute %s, assuming empty string\n",attr_to_name(*at)); tmpstr=g_strdup(""); } } if(i>0) { oldstr = csv_line; csv_line = g_strdup_printf("%s,%s",csv_line,tmpstr); g_free(tmpstr); g_free(oldstr); tmpstr = NULL; } else { csv_line=tmpstr; } ++at; } if(fprintf(fp,"%s\n", csv_line)<0) { ferr = 1; } g_free(csv_line); } if(fclose(fp)) { ferr = 1; } if(! ferr) { unlink(m->filename); rename(filename,m->filename); m->dirty = 0; } g_free(filename); quadtree_query_free(iter); } } static const int zoom_max = 18; static void map_destroy_csv(struct map_priv *m) { dbg(1,"map_destroy_csv\n"); /*save if changed */ save_map_csv(m); g_hash_table_destroy(m->qitem_hash); quadtree_destroy(m->tree_root); g_free(m->filename); g_free(m->charset); g_free(m->attr_types); g_free(m); } static void csv_coord_rewind(void *priv_data) { } static int csv_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; if(mr) { *c = mr->c; return 1; } else { return 0; } } static void csv_attr_rewind(void *priv_data) { /*TODO implement if needed*/ } static int csv_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { int i, bAttrFound = 0; GList* attr_list; struct map_rect_priv *mr=priv_data; enum attr_type *at; if( !mr || !mr->m || !mr->m->attr_types ) { return 0; } attr_list = ((struct quadtree_data*)(mr->qitem->data))->attr_list; if (attr_type == attr_any) { if (mr->at_iter==NULL) { /*start iteration*/ mr->at_iter = attr_list; if (mr->at_iter) { *attr = *(struct attr*)(mr->at_iter->data); return 1; } else { /*empty attr list*/ mr->at_iter = NULL; return 0; } } else { /*continue iteration*/ mr->at_iter = g_list_next(mr->at_iter); if(mr->at_iter) { *attr = *(struct attr*)mr->at_iter->data; return 1; } else { return 0; } } return 0; } at = mr->m->attr_types; for(i=0;im->attr_cnt;++i) { if(*at == attr_type) { bAttrFound = 1; break; } ++at; } if(!bAttrFound) { return 0; } while(attr_list) { if(((struct attr*)attr_list->data)->type == attr_type) { *attr = *(struct attr*)attr_list->data; return 1; } attr_list = g_list_next(attr_list); } return 0; } static int csv_attr_set(void *priv_data, struct attr *attr, enum change_mode mode) { struct map_rect_priv* mr = (struct map_rect_priv*)priv_data; struct map_priv* m = mr->m; int i, bFound = 0; struct attr *attr_new; GList *attr_list, *curr_attr_list; enum attr_type *at = m->attr_types; if(!mr || !mr->qitem) { return 0; } /*if attribute is not supported by this csv map return 0*/ for(i=0;iattr_cnt;++i) { if(*at==attr->type) { bFound = 1; break; } ++at; } if( ! bFound) { return 0; } m->dirty = 1; attr_new = attr_dup(attr); attr_list = ((struct quadtree_data*)(mr->qitem->data))->attr_list; curr_attr_list = attr_list; while(attr_list) { if(((struct attr*)attr_list->data)->type == attr->type) { switch(mode) { case change_mode_delete: attr_free((struct attr*)attr_list->data); curr_attr_list = g_list_delete_link(curr_attr_list,attr_list); m->dirty = 1; /* FIXME: To preserve consistency, may be the save_map_csv should be called here... */ attr_free(attr_new); return 1; case change_mode_modify: case change_mode_prepend: case change_mode_append: /* replace existing attribute */ if(attr_list->data) { attr_free((struct attr*)attr_list->data); } attr_list->data = attr_new; m->dirty = 1; save_map_csv(m); return 1; default: attr_free(attr_new); return 0; } } attr_list = g_list_next(attr_list); } if( mode==change_mode_modify || mode==change_mode_prepend || mode==change_mode_append) { /* add new attribute */ curr_attr_list = g_list_prepend(curr_attr_list, attr_new); ((struct quadtree_data*)(mr->qitem->data))->attr_list = curr_attr_list; m->dirty = 1; save_map_csv(m); return 1; } attr_free(attr_new); return 0; } static int csv_type_set(void *priv_data, enum item_type type) { struct map_rect_priv* mr = (struct map_rect_priv*)priv_data; dbg(1,"Enter %d\n", type); if(!mr || !mr->qitem) { dbg(1,"Nothing to do\n"); return 0; } if(type!=type_none) return 0; mr->qitem->deleted=1; dbg(1,"Item %p is deleted\n",mr->qitem); return 1; } static struct item_methods methods_csv = { csv_coord_rewind, csv_coord_get, csv_attr_rewind, csv_attr_get, NULL, csv_attr_set, csv_coord_set, csv_type_set }; /* * Sets coordinate of an existing item (either on the new list or an item with coord ) */ static int csv_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode) { struct quadtree_item query_item, *insert_item, *query_res; struct coord_geo cg; struct map_rect_priv* mr; struct map_priv* m; struct quadtree_item* qi; GList* new_it; dbg(1,"Set coordinates %d %d\n", c->x, c->y); /* for now we only support coord modification only */ if( ! change_mode_modify) { return 0; } /* csv driver supports one coord per record only */ if( count != 1) { return 0; } /* get curr_item of given map_rect */ mr = (struct map_rect_priv*)priv_data; m = mr->m; if(!mr->qitem) { return 0; } qi = mr->qitem; transform_to_geo(projection_mg, &c[0], &cg); /* if it is on the new list remove from new list and add it to the tree with the coord */ new_it = m->new_items; while(new_it) { if(new_it->data==qi) { break; } new_it = g_list_next(new_it); } if(new_it) { qi->longitude = cg.lng; qi->latitude = cg.lat; quadtree_add( m->tree_root, qi, mr->qiter); dbg(1,"Set coordinates %f %f\n", cg.lng, cg.lat); m->new_items = g_list_remove_link(m->new_items,new_it); m->dirty=1; save_map_csv(m); return 1; } /* else update quadtree item with the new coord remove item from the quadtree */ query_item.longitude = cg.lng; query_item.latitude = cg.lat; query_res = quadtree_find_item(m->tree_root, &query_item); if(!query_res) { return 0; } quadtree_delete_item(m->tree_root, query_res); /* add item to the tree with the new coord */ insert_item=g_new0(struct quadtree_item,1); insert_item->data=quadtree_data_dup(query_res->data); insert_item->longitude = cg.lng; insert_item->latitude = cg.lat; quadtree_add(m->tree_root, query_res, mr->qiter); mr->qitem->ref_count--; mr->qitem=insert_item; mr->qitem->ref_count++; m->dirty = 1; save_map_csv(m); return 1; } static void quadtree_item_free(void *this, struct quadtree_item *qitem) { struct map_priv* m=this; struct quadtree_data * qdata=qitem->data; if(m) { g_hash_table_remove(m->qitem_hash,&(qdata->item->id_lo)); } } static void quadtree_item_free_do(void *data) { struct quadtree_item *qitem=data; GList* attr_it; struct attr* attr; struct quadtree_data * qdata=qitem->data; if(qdata) { for(attr_it = qdata->attr_list;attr_it;attr_it = g_list_next(attr_it)) { attr = attr_it->data; attr_free(attr); } g_list_free(qdata->attr_list); g_free(qdata->item); g_free(qitem->data); } g_free(data); } /** * Dump all map data (including deleted items) to the log. */ static void map_csv_debug_dump(struct map_priv *map) { GList *l=g_hash_table_get_values(map->qitem_hash); GList *ll=l; while(ll) { struct quadtree_item *qi; GList *attrs; qi=ll->data; dbg(0,"%p del=%d ref=%d\n", qi,qi->deleted, qi->ref_count); attrs=((struct quadtree_data *)qi->data)->attr_list; while(attrs) { if(((struct attr*)attrs->data)->type==attr_label) dbg(0,"... %s\n",((struct attr*)attrs->data)->u.str); attrs=g_list_next(attrs); } ll=g_list_next(ll); } g_list_free(l); } static struct map_rect_priv * map_rect_new_csv(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; struct coord_geo lu; struct coord_geo rl; struct quadtree_iter *res = NULL; dbg(1,"map_rect_new_csv\n"); if(debug_level_get("map_csv")>2) { map_csv_debug_dump(map); } mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->bStarted = 0; mr->sel=sel; if (map->flags & 1) mr->item.id_hi=1; else mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_csv; mr->item.priv_data=mr; if(!sel) { lu.lng=-180; lu.lat=180; rl.lng=180; rl.lat=-180; } else { transform_to_geo(projection_mg, &sel->u.c_rect.lu, &lu); transform_to_geo(projection_mg, &sel->u.c_rect.rl, &rl); } res=quadtree_query(map->tree_root, lu.lng, rl.lng, rl.lat, lu.lat, quadtree_item_free, mr->m); mr->qiter = res; mr->qitem = NULL; return mr; } static void map_rect_destroy_csv(struct map_rect_priv *mr) { if(mr->qitem) mr->qitem->ref_count--; if(mr->qiter) quadtree_query_free(mr->qiter); g_free(mr); } static struct item * map_rect_get_item_csv(struct map_rect_priv *mr) { if(mr->qitem) mr->qitem->ref_count--; mr->qitem=quadtree_item_next(mr->qiter); if(mr->qitem) { struct item* ret=&(mr->item); struct coord_geo cg; mr->qitem->ref_count++; mr->item = *(((struct quadtree_data*)(mr->qitem->data))->item); ret->priv_data=mr; cg.lng = mr->qitem->longitude; cg.lat = mr->qitem->latitude; transform_from_geo(projection_mg, &cg, &mr->c); return ret; } return NULL; } static struct item * map_rect_get_item_byid_csv(struct map_rect_priv *mr, int id_hi, int id_lo) { /*currently id_hi is ignored*/ struct quadtree_item *qit = g_hash_table_lookup(mr->m->qitem_hash,&id_lo); if(mr->qitem ) mr->qitem->ref_count--; if(qit) { mr->qitem = qit; mr->qitem->ref_count++; mr->item=*(((struct quadtree_data*)(qit->data))->item); mr->item.priv_data=mr; return &(mr->item); } else { mr->qitem = NULL; return NULL; } } static int csv_get_attr(struct map_priv *m, enum attr_type type, struct attr *attr) { return 0; } static struct item * csv_create_item(struct map_rect_priv *mr, enum item_type it_type) { struct map_priv* m; struct quadtree_data* qd; struct quadtree_item* qi; struct item* curr_item; int* pID; if(mr && mr->m) { m = mr->m; } else { return NULL; } if( m->item_type != it_type) { return NULL; } m->dirty = 1; /*add item to the map*/ curr_item = item_new("",zoom_max); curr_item->type = m->item_type; curr_item->meth=&methods_csv; curr_item->id_lo = m->next_item_idx; if (m->flags & 1) curr_item->id_hi=1; else curr_item->id_hi=0; qd = g_new0(struct quadtree_data,1); qi = g_new0(struct quadtree_item,1); qd->item = curr_item; qd->attr_list = NULL; qi->data = qd; /*we don`t have valid coord yet*/ qi->longitude = 0; qi->latitude = 0; /*add the coord less item to the new list*/ m->new_items = g_list_prepend(m->new_items, qi); if(mr->qitem) mr->qitem->ref_count--; mr->qitem=qi; mr->item=*curr_item; mr->item.priv_data=mr; mr->qitem->ref_count++; /*don't add to the quadtree yet, wait until we have a valid coord*/ pID = g_new(int,1); *pID = m->next_item_idx; g_hash_table_insert(m->qitem_hash, pID,qi); ++m->next_item_idx; return &mr->item; } static struct map_methods map_methods_csv = { projection_mg, "iso8859-1", map_destroy_csv, map_rect_new_csv, map_rect_destroy_csv, map_rect_get_item_csv, map_rect_get_item_byid_csv, NULL, NULL, NULL, csv_create_item, csv_get_attr, }; static struct map_priv * map_new_csv(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m = NULL; struct attr *attr_types; struct attr *item_type_attr; struct attr *data; struct attr *flags; struct attr *charset; int bLonFound = 0; int bLatFound = 0; int attr_cnt = 0; enum attr_type* attr_type_list = NULL; struct quadtree_node* tree_root = quadtree_node_new(NULL,-180,180,-180,180); m = g_new0(struct map_priv, 1); m->id = ++map_id; m->qitem_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, quadtree_item_free_do); m->tree_root = tree_root; attr_types = attr_search(attrs, NULL, attr_attr_types); if(attr_types) { enum attr_type* at = attr_types->u.attr_types; while(*at != attr_none) { attr_type_list = g_realloc(attr_type_list,sizeof(enum attr_type)*(attr_cnt+1)); attr_type_list[attr_cnt] = *at; if(*at==attr_position_latitude) { bLatFound = 1; } else if(*at==attr_position_longitude) { bLonFound = 1; } ++attr_cnt; ++at; } m->attr_cnt = attr_cnt; m->attr_types = attr_type_list; } else { m->attr_types = NULL; return NULL; } charset = attr_search(attrs, NULL, attr_charset); if(charset) { dbg(1,"charset:%s\n",charset->u.str); m->charset=g_strdup(charset->u.str); } else { m->charset=g_strdup(map_methods_csv.charset); } if(bLonFound==0 || bLatFound==0) { return NULL; } item_type_attr=attr_search(attrs, NULL, attr_item_type); if( !item_type_attr || item_type_attr->u.item_type==type_none) { return NULL; } m->item_type = item_type_attr->u.item_type; flags=attr_search(attrs, NULL, attr_flags); if (flags) m->flags=flags->u.num; *meth = map_methods_csv; meth->charset=m->charset; data=attr_search(attrs, NULL, attr_data); if(data) { struct file_wordexp *wexp; char **wexp_data; FILE *fp; wexp=file_wordexp_new(data->u.str); wexp_data=file_wordexp_get_array(wexp); dbg(1,"map_new_csv %s\n", data->u.str); m->filename=g_strdup(wexp_data[0]); file_wordexp_destroy(wexp); /*load csv file into quadtree structure*/ /*if column number is wrong skip*/ if((fp=fopen(m->filename,"rt"))) { const int max_line_len = 256; char *line=g_alloca(sizeof(char)*max_line_len); while(!feof(fp)) { if(fgets(line,max_line_len,fp)) { char*line2; char* delim = ","; int col_cnt=0; char*tok; if(line[strlen(line)-1]=='\n' || line[strlen(line)-1]=='\r') { line[strlen(line)-1] = '\0'; } line2 = g_strdup(line); while((tok=strtok( (col_cnt==0)?line:NULL , delim))) { ++col_cnt; } if(col_cnt==attr_cnt) { int cnt = 0; /*index of current attr*/ char*tok; GList* attr_list = NULL; int bAddSum = 1; double longitude = 0.0, latitude=0.0; struct item *curr_item = item_new("",zoom_max);/*does not use parameters*/ curr_item->type = item_type_attr->u.item_type; curr_item->id_lo = m->next_item_idx; if (m->flags & 1) curr_item->id_hi=1; else curr_item->id_hi=0; curr_item->meth=&methods_csv; while((tok=strtok( (cnt==0)?line2:NULL , delim))) { struct attr*curr_attr = g_new0(struct attr,1); int bAdd = 1; curr_attr->type = attr_types->u.attr_types[cnt]; if(ATTR_IS_STRING(attr_types->u.attr_types[cnt])) { curr_attr->u.str = g_strdup(tok); } else if(ATTR_IS_INT(attr_types->u.attr_types[cnt])) { curr_attr->u.num = atoi(tok); } else if(ATTR_IS_DOUBLE(attr_types->u.attr_types[cnt])) { double *d = g_new(double,1); *d = atof(tok); curr_attr->u.numd = d; if(attr_types->u.attr_types[cnt] == attr_position_longitude) { longitude = *d; } if(attr_types->u.attr_types[cnt] == attr_position_latitude) { latitude = *d; } } else { /*unknown attribute*/ bAddSum = bAdd = 0; g_free(curr_attr); } if(bAdd) { attr_list = g_list_prepend(attr_list, curr_attr); } ++cnt; } if(bAddSum && (longitude!=0.0 || latitude!=0.0)) { struct quadtree_data* qd = g_new0(struct quadtree_data,1); struct quadtree_item* qi =g_new0(struct quadtree_item,1); int* pID = g_new(int,1); qd->item = curr_item; qd->attr_list = attr_list; qi->data = qd; qi->longitude = longitude; qi->latitude = latitude; quadtree_add(tree_root, qi, NULL); *pID = m->next_item_idx; g_hash_table_insert(m->qitem_hash, pID,qi); ++m->next_item_idx; dbg(1,"%s\n",line); } else { g_free(curr_item); } } else { dbg(0,"ERROR: Non-matching attr count and column count: %d %d SKIPPING line: %s\n",col_cnt, attr_cnt,line); } g_free(line2); } } fclose(fp); } else { dbg(0,"Error opening csv map file %s, starting with empty map\n", m->filename); } } else { dbg(1,"No data attribute, starting with in-memory map\n"); } dbg(2,"%p\n",tree_root); return m; } void plugin_init(void) { dbg(1,"csv: plugin_init\n"); plugin_register_map_type("csv", map_new_csv); } navit-0.5.0~svn5643+dfsg.1/navit/map/csv/csv.h000066400000000000000000000025731221777731700206440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "attr.h" #include "coord.h" #include "quadtree.h" struct map_priv { int id; struct quadtree_node* tree_root; int flags; GHashTable*qitem_hash; char* filename; /*need to write map file on exit*/ int dirty; int attr_cnt; enum attr_type *attr_types; int next_item_idx; enum item_type item_type; /*list of quadtree items that have no coord set yet ()*/ GList* new_items; char *charset; }; struct map_rect_priv { struct map_selection *sel; struct quadtree_iter *qiter; struct quadtree_item *qitem; struct coord c; int bStarted; struct item item; struct map_priv *m; GList* at_iter; }; navit-0.5.0~svn5643+dfsg.1/navit/map/csv/quadtree.c000066400000000000000000000575611221777731700216650ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "quadtree.h" #define QUADTREE_NODE_CAPACITY 10 #define MAX_DOUBLE 9999999 /* Check if two given line segments overlap (1-d case) */ #define segments_overlap(x11,x12, x21,x22) (((x11)<=(x21) && (x21)<=(x12)) || ((x21)<=(x11) && (x11)<=(x22))) /* Check if two given rectanlgles overlap (2-d case) */ #define rects_overlap(x11,y11,x12,y12, x21,y21,x22,y22) (segments_overlap(x11,x12, x21,x22) && segments_overlap(y11,y12, y21,y22)) /* Structure describing quadtree iterative query */ struct quadtree_iter { /* List representing stack of quad_tree_iter_nodes referring to higher-level quadtree_nodes */ GList *iter_nodes; double xmin,xmax,ymin,ymax; /* Current item pointer */ struct quadtree_item *item; void (*item_free)(void *context, struct quadtree_item *qitem); void *item_free_context; }; /* Structure describing one level of the quadtree iterative query */ struct quadtree_iter_node { struct quadtree_node *node; /* Number of subnode being analyzed (for non-leafs) */ int subnode; /* Number of item being analyzed (for leafs) */ int item; /* Number of subitems in items array (for leafs) */ int node_num; /* If the node referenced was a leaf when it was analyzed */ int is_leaf; struct quadtree_item *items[QUADTREE_NODE_CAPACITY]; }; static double dist_sq(double x1,double y1,double x2,double y2) { return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); } struct quadtree_node* quadtree_node_new(struct quadtree_node* parent, double xmin, double xmax, double ymin, double ymax ) { struct quadtree_node*ret = g_new0(struct quadtree_node,1); ret->xmin = xmin; ret->xmax = xmax; ret->ymin = ymin; ret->ymax = ymax; ret->is_leaf = 1; ret->parent = parent; return ret; } /* * searches all four subnodes recursively for the list of items within a rectangle */ void quadtree_find_rect_items(struct quadtree_node* this_, double dXMin, double dXMax, double dYMin, double dYMax, GList**out) { struct quadtree_node* nodes[4] = { this_->aa, this_->ab, this_->ba, this_->bb }; if( this_->is_leaf ) { int i; for(i=0;inode_num;++i) { //select only items within input rectangle if(dXMin<=this_->items[i]->longitude && this_->items[i]->longitude<=dXMax && dYMin<=this_->items[i]->latitude && this_->items[i]->latitude<=dYMax ) { *out=g_list_prepend(*out,this_->items[i]); } } } else { int i; for( i=0;i<4;++i) { if(nodes[i] ) { //limit flooding if(nodes[i]->xmaxxmin || nodes[i]->ymaxymin ) { continue; } //recurse into subtiles if there is at least one subtile corner within input rectangle quadtree_find_rect_items(nodes[i],dXMin,dXMax,dYMin,dYMax,out); } } } } /* * searches all four subnodes recursively for the closest item */ struct quadtree_item* quadtree_find_nearest_flood(struct quadtree_node* this_, struct quadtree_item* item, double current_max, struct quadtree_node* toSkip) { struct quadtree_node* nodes[4] = { this_->aa, this_->ab, this_->ba, this_->bb }; struct quadtree_item*res = NULL; if( this_->is_leaf ) { int i; double distance_sq = current_max; for(i=0;inode_num;++i) { double curr_dist_sq = dist_sq(item->longitude,item->latitude,this_->items[i]->longitude,this_->items[i]->latitude); if(curr_dist_sqitems[i]; } } } else { int i; for( i=0;i<4;++i) { if(nodes[i] && nodes[i]!=toSkip) { //limit flooding struct quadtree_item*res_tmp = NULL; if( dist_sq(nodes[i]->xmin,nodes[i]->ymin,item->longitude,item->latitude)xmax,nodes[i]->ymin,item->longitude,item->latitude)xmax,nodes[i]->ymax,item->longitude,item->latitude)xmin,nodes[i]->ymax,item->longitude,item->latitude)longitude,item->latitude,res->longitude,res->latitude); if(curr_dist_sqis_leaf ) { int i; for(i=0;inode_num;++i) { //TODO equality check may not be correct on float values! maybe it can be replaced by range check with some tolerance if(item->longitude==this_->items[i]->longitude && item->latitude==this_->items[i]->latitude) { res = this_->items[i]; return res; } } return NULL; } else { if( this_->aa && this_->aa->xmin<=item->longitude && item->longitudeaa->xmax && this_->aa->ymin<=item->latitude && item->latitudeaa->ymax ) { res = quadtree_find_item(this_->aa,item); } else if( this_->ab && this_->ab->xmin<=item->longitude && item->longitudeab->xmax && this_->ab->ymin<=item->latitude && item->latitudeab->ymax ) { res = quadtree_find_item(this_->ab,item); } else if( this_->ba && this_->ba->xmin<=item->longitude && item->longitudeba->xmax && this_->ba->ymin<=item->latitude && item->latitudeba->ymax ) { res = quadtree_find_item(this_->ba,item); } else if( this_->bb && this_->bb->xmin<=item->longitude && item->longitudebb->xmax && this_->bb->ymin<=item->latitude && item->latitudebb->ymax ) { res = quadtree_find_item(this_->bb,item); } else { return NULL; } } return res; } /* * returns the containing node for an item */ struct quadtree_node* quadtree_find_containing_node(struct quadtree_node* root, struct quadtree_item* item) { struct quadtree_node*res = NULL; if( ! root ) { return NULL; } if( root->is_leaf ) { int i; for(i=0;inode_num;++i) { if(item == root->items[i]) { res = root; } } } else { if( root->aa && root->aa->xmin<=item->longitude && item->longitudeaa->xmax && root->aa->ymin<=item->latitude && item->latitudeaa->ymax ) { res = quadtree_find_containing_node(root->aa,item); } else if( root->ab && root->ab->xmin<=item->longitude && item->longitudeab->xmax && root->ab->ymin<=item->latitude && item->latitudeab->ymax ) { res = quadtree_find_containing_node(root->ab,item); } else if( root->ba && root->ba->xmin<=item->longitude && item->longitudeba->xmax && root->ba->ymin<=item->latitude && item->latitudeba->ymax ) { res = quadtree_find_containing_node(root->ba,item); } else if( root->bb && root->bb->xmin<=item->longitude && item->longitudebb->xmax && root->bb->ymin<=item->latitude && item->latitudebb->ymax ) { res = quadtree_find_containing_node(root->bb,item); } else { //this should not happen } } return res; } int quadtree_delete_item(struct quadtree_node* root, struct quadtree_item* item) { struct quadtree_node* qn = quadtree_find_containing_node(root,item); int i, bFound=0; if(!qn || !qn->node_num) { return 0; } for(i=0;inode_num;++i) { if( qn->items[i] == item) { qn->items[i]->deleted=1; bFound=1; } } return bFound; } /* * tries to find closest item, first it descend into the quadtree as much as possible, then if no point is found go up n levels and flood */ struct quadtree_item* quadtree_find_nearest(struct quadtree_node* this_, struct quadtree_item* item) { struct quadtree_item*res = NULL; double distance_sq = MAX_DOUBLE; if( ! this_ ) { return NULL; } if( this_->is_leaf ) { int i; for(i=0;inode_num;++i) { double curr_dist_sq = dist_sq(item->longitude,item->latitude,this_->items[i]->longitude,this_->items[i]->latitude); if(curr_dist_sqitems[i]; } } //go up n levels if(!res && this_->parent) { struct quadtree_item*res2 = NULL; struct quadtree_node* anchestor = this_->parent; int cnt = 0; while (anchestor->parent && cnt<4) { anchestor = anchestor->parent; ++cnt; } res2 = quadtree_find_nearest_flood(anchestor,item,distance_sq,NULL); if(res2) { res = res2; } } } else { if( this_->aa && this_->aa->xmin<=item->longitude && item->longitudeaa->xmax && this_->aa->ymin<=item->latitude && item->latitudeaa->ymax ) { res = quadtree_find_nearest(this_->aa,item); } else if( this_->ab && this_->ab->xmin<=item->longitude && item->longitudeab->xmax && this_->ab->ymin<=item->latitude && item->latitudeab->ymax ) { res = quadtree_find_nearest(this_->ab,item); } else if( this_->ba && this_->ba->xmin<=item->longitude && item->longitudeba->xmax && this_->ba->ymin<=item->latitude && item->latitudeba->ymax ) { res = quadtree_find_nearest(this_->ba,item); } else if( this_->bb && this_->bb->xmin<=item->longitude && item->longitudebb->xmax && this_->bb->ymin<=item->latitude && item->latitudebb->ymax ) { res = quadtree_find_nearest(this_->bb,item); } else { if(this_->parent) { //go up two levels struct quadtree_node* anchestor = this_->parent; int cnt = 0; while (anchestor->parent && cnt<4) { anchestor = anchestor->parent; ++cnt; } res = quadtree_find_nearest_flood(anchestor,item,distance_sq,NULL); } } } return res; } /** * @brief Free space occupied by deleted unreferenced items. * @param node pointer to the quadtree node * @param iter Quadtree iteration context. * @return nothing */ void quadtree_node_drop_garbage(struct quadtree_node* node, struct quadtree_iter *iter) { int i,j; int node_num=node->node_num; dbg(1,"Processing unreferenced subnode children...\n"); for(i=0,j=0;iitems[i]->deleted && !node->items[i]->ref_count) { if(iter->item_free) { (iter->item_free)(iter->item_free_context, node->items[i]); } else { g_free(node->items[i]); } node->node_num--; node->items[i]=NULL; } else { node->items[j++]=node->items[i]; } if(i>j) node->items[i]=NULL; } } /** * @brief Add new node to quadtree. * @param this_ pointer to the quadtree (root) node * @param item item to add * @param iter Quadtree iteration context. Can be NULL if no garbage collection is needed. * @return nothing */ void quadtree_add(struct quadtree_node* this_, struct quadtree_item* item, struct quadtree_iter *iter) { if( this_->is_leaf ) { int bSame = 1; int i; if(iter) quadtree_node_drop_garbage(this_, iter); if(QUADTREE_NODE_CAPACITY-1 == this_->node_num) { double lon, lat; //avoid infinite recursion when all elements have the same coordinate lon = this_->items[0]->longitude; lat = this_->items[0]->latitude; for(i=1;inode_num;++i) { if (lon != this_->items[i]->longitude || lat != this_->items[i]->latitude) { bSame = 0; break; } } if (bSame) { //FIXME: memleak and items thrown away if more than QUADTREE_NODE_CAPACITY-1 items with same coordinates added. dbg(0,"Unable to add another item with same coordinates. Throwing item to the ground. Will leak %p.\n",item); return; } this_->items[this_->node_num++] = item; quadtree_split(this_); } else { this_->items[this_->node_num++] = item; } } else { if( this_->xmin<=item->longitude && item->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin<=item->latitude && item->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->aa) { this_->aa = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->aa,item,iter); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=item->longitude && item->longitudexmax && this_->ymin<=item->latitude && item->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->ab) { this_->ab = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->ab,item,iter); } else if( this_->xmin<=item->longitude && item->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin+(this_->ymax-this_->ymin)/2.0<=item->latitude && item->latitudeymax ) { if(!this_->ba) { this_->ba = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->ba,item,iter); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=item->longitude && item->longitudexmax && this_->ymin+(this_->ymax-this_->ymin)/2.0<=item->latitude && item->latitudeymax ) { if(!this_->bb) { this_->bb = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->bb,item,iter); } } } void quadtree_split(struct quadtree_node* this_) { int i; this_->is_leaf = 0; for(i=0;inode_num;++i) { if( this_->xmin<=this_->items[i]->longitude && this_->items[i]->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin<=this_->items[i]->latitude && this_->items[i]->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->aa) { this_->aa = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->aa,this_->items[i],NULL); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=this_->items[i]->longitude && this_->items[i]->longitudexmax && this_->ymin<=this_->items[i]->latitude && this_->items[i]->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->ab) { this_->ab = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->ab,this_->items[i],NULL); } else if( this_->xmin<=this_->items[i]->longitude && this_->items[i]->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin+(this_->ymax-this_->ymin)/2.0<=this_->items[i]->latitude && this_->items[i]->latitudeymax ) { if(!this_->ba) { this_->ba = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->ba,this_->items[i],NULL); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=this_->items[i]->longitude && this_->items[i]->longitudexmax && this_->ymin+(this_->ymax-this_->ymin)/2.0<=this_->items[i]->latitude && this_->items[i]->latitudeymax ) { if(!this_->bb) { this_->bb = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->bb,this_->items[i],NULL); } this_->items[i]=NULL; } this_->node_num = 0; } void quadtree_destroy(struct quadtree_node* this_) { if(this_->aa) { quadtree_destroy(this_->aa); this_->aa = NULL; } if(this_->ab) { quadtree_destroy(this_->ab); this_->ab = NULL; } if(this_->ba) { quadtree_destroy(this_->ba); this_->ba = NULL; } if(this_->bb) { quadtree_destroy(this_->bb); this_->bb = NULL; } free(this_); } /* * @brief Start iterating over quadtree items not marked for deletion. * @param this_ Pointer to the quadtree root node. * @param dXMin,dXMax,dYMin,dYMax boundig box of area of interest. * @param item_free function to be called to free the qitem, first parameter would be context, second parameter - actual qitem pointer to free * if this parameter is NULL, nothing would be called to free qitem pointer (possible massive memleak unless you store each qitem pointer in some * alternate storage) * @param item_free_context data to be passed as a first parameter to item_free function * @return pointer to the quad tree iteration structure. */ struct quadtree_iter *quadtree_query(struct quadtree_node *this_, double dXMin, double dXMax, double dYMin, double dYMax,void (*item_free)(void *context, struct quadtree_item *qitem), void *item_free_context) { struct quadtree_iter *ret=g_new0(struct quadtree_iter,1); struct quadtree_iter_node *n=g_new0(struct quadtree_iter_node,1); ret->xmin=dXMin; ret->xmax=dXMax; ret->ymin=dYMin; ret->ymax=dYMax; dbg(1,"%f %f %f %f\n",dXMin,dXMax,dYMin,dYMax) ret->item_free=item_free; ret->item_free_context=item_free_context; n->node=this_; ret->iter_nodes=g_list_prepend(ret->iter_nodes,n); n->is_leaf=this_->is_leaf; if(this_->is_leaf) { int i; n->node_num=this_->node_num; for(i=0;inode_num;i++) { n->items[i]=this_->items[i]; n->items[i]->ref_count++; } } this_->ref_count++; dbg(1,"Query %p \n",this_) return ret; } /* * @brief End iteration. * @param iter Pointer to the quadtree iteration structure. */ void quadtree_query_free(struct quadtree_iter *iter) { //Get the rest of the data to collect garbage and dereference all the items/nodes //TODO: No need to iterate the whole tree here. Just dereference nodes/items (if any). while(quadtree_item_next(iter)); g_free(iter); } /* * @brief Mark current item of iterator for deletion. * @param iter Pointer to the quadtree iteration structure. */ void quadtree_item_delete(struct quadtree_iter *iter) { if(iter->item) iter->item->deleted=1; } /* * @brief Get next item from the quadtree. Any met unreferenced items/nodes marked for deletion will be freed here. * @param iter Pointer to the quadtree iteration structure. * @return pointer to the next item, or NULL if no items are left. */ struct quadtree_item * quadtree_item_next(struct quadtree_iter *iter) { struct quadtree_iter_node *iter_node; struct quadtree_node *subnode; if(iter->item) { iter->item->ref_count--; iter->item=NULL; } while(iter->iter_nodes) { struct quadtree_node *nodes[4]; int i; iter_node=iter->iter_nodes->data; if(iter_node->is_leaf) { /* Try to find undeleted item in the current node */ dbg(1,"find item %p %p ...\n",iter->iter_nodes,iter->iter_nodes->data); while(iter_node->itemnode_num) { dbg(1,"%d %d\n",iter_node->item,iter_node->items[iter_node->item]->deleted); if(iter_node->items[iter_node->item]->deleted) { iter_node->item++; continue; } iter->item=iter_node->items[iter_node->item]; iter_node->item++; dbg(1,"Returning %p\n",iter->item); iter->item->ref_count++; return iter->item; } for(i=0;inode_num;i++) { iter_node->items[i]->ref_count--; } } else { /* No items left, try to find non-empty subnode */ nodes[0]=iter_node->node->aa; nodes[1]=iter_node->node->ab; nodes[2]=iter_node->node->ba; nodes[3]=iter_node->node->bb; for(subnode=NULL;!subnode && iter_node->subnode<4;iter_node->subnode++) { i=iter_node->subnode; if(!nodes[i] || !rects_overlap(nodes[i]->xmin, nodes[i]->ymin, nodes[i]->xmax, nodes[i]->ymax, iter->xmin, iter->ymin, iter->xmax, iter->ymax)) continue; dbg(1,"%f %f %f %f\n",nodes[i]->xmin, nodes[i]->xmax, nodes[i]->ymin, nodes[i]->ymax) subnode=nodes[i]; } if(subnode) { /* Go one level deeper */ dbg(1,"Go one level deeper...\n"); iter_node=g_new0(struct quadtree_iter_node, 1); iter_node->node=subnode; iter_node->is_leaf=subnode->is_leaf; if(iter_node->is_leaf) { int i; iter_node->node_num=subnode->node_num; for(i=0;inode_num;i++) { iter_node->items[i]=subnode->items[i]; iter_node->items[i]->ref_count++; } } subnode->ref_count++; iter->iter_nodes=g_list_prepend(iter->iter_nodes,iter_node); continue; } } /* No nodes and items left, fix up current subnode... */ iter_node=iter->iter_nodes->data; subnode=iter_node->node; subnode->ref_count--; if(!subnode->aa && !subnode->ab && !subnode->ba && !subnode->bb) subnode->is_leaf=1; /* 1. free deleted unreferenced items */ quadtree_node_drop_garbage(subnode, iter); /* 2. remove empty leaf subnode if it's unreferenced */ if(!subnode->ref_count && !subnode->node_num && subnode->is_leaf ) { dbg(1,"Going to delete an empty unreferenced leaf subnode...\n"); if(subnode->parent) { if(subnode->parent->aa==subnode) { subnode->parent->aa=NULL; } else if(subnode->parent->ab==subnode) { subnode->parent->ab=NULL; } else if(subnode->parent->ba==subnode) { subnode->parent->ba=NULL; } else if(subnode->parent->bb==subnode) { subnode->parent->bb=NULL; } else { dbg(0,"Found Quadtree structure corruption while trying to free an empty node.\n"); } if(!subnode->parent->aa && !subnode->parent->ab && !subnode->parent->ba && !subnode->parent->bb ) subnode->parent->is_leaf=1; g_free(subnode); } else dbg(1,"Quadtree is empty. NOT deleting the root subnode...\n"); } /* Go one step towards root */ dbg(2,"Going towards root...\n"); g_free(iter->iter_nodes->data); iter->iter_nodes=g_list_delete_link(iter->iter_nodes,iter->iter_nodes); } iter->item=NULL; return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/map/csv/quadtree.h000066400000000000000000000054631221777731700216640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef QUADTREE_H #define QUADTREE_H #include #define QUADTREE_NODE_CAPACITY 10 struct quadtree_item { double longitude; double latitude; int ref_count; int deleted; void *data; }; struct quadtree_node { int node_num; struct quadtree_item *items[QUADTREE_NODE_CAPACITY]; struct quadtree_node *aa; struct quadtree_node *ab; struct quadtree_node *ba; struct quadtree_node *bb; double xmin, xmax, ymin, ymax; int is_leaf; struct quadtree_node*parent; int ref_count; }; struct quadtree_iter; struct quadtree_node* quadtree_node_new(struct quadtree_node* parent, double xmin, double xmax, double ymin, double ymax ); struct quadtree_item* quadtree_find_nearest_flood(struct quadtree_node* this_, struct quadtree_item* item, double current_max, struct quadtree_node* toSkip); struct quadtree_item* quadtree_find_nearest(struct quadtree_node* this_, struct quadtree_item* item); struct quadtree_item* quadtree_find_item(struct quadtree_node* this_, struct quadtree_item* item); struct quadtree_node* quadtree_find_containing_node(struct quadtree_node* root, struct quadtree_item* item); int quadtree_delete_item(struct quadtree_node* root, struct quadtree_item* item); void quadtree_find_rect_items(struct quadtree_node* this_, double dXMin, double dXMax, double dYMin, double dYMax, GList**out); void quadtree_split(struct quadtree_node* this_); void quadtree_add(struct quadtree_node* this_, struct quadtree_item* item, struct quadtree_iter* iter); void quadtree_destroy(struct quadtree_node* this_); struct quadtree_iter *quadtree_query(struct quadtree_node *this_, double dXMin, double dXMax, double dYMin, double dYMax,void (*item_free)(void *context, struct quadtree_item *qitem), void *context); struct quadtree_item * quadtree_item_next(struct quadtree_iter *iter); void quadtree_query_free(struct quadtree_iter *iter); void quadtree_item_delete(struct quadtree_iter *iter); struct quadtree_data *quadtree_data_dup(struct quadtree_data *qdata); void quadtree_node_drop_garbage(struct quadtree_node* node, struct quadtree_iter *iter); #endif navit-0.5.0~svn5643+dfsg.1/navit/map/filter/000077500000000000000000000000001221777731700203635ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/filter/CMakeLists.txt000066400000000000000000000000511221777731700231170ustar00rootroot00000000000000module_add_library(map_filter filter.c) navit-0.5.0~svn5643+dfsg.1/navit/map/filter/Makefile.am000066400000000000000000000005001221777731700224120ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_filter if PLUGINS modulemap_LTLIBRARIES = libmap_filter.la else noinst_LTLIBRARIES = libmap_filter.la endif libmap_filter_la_SOURCES = filter.c libmap_filter_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/map/filter/filter.c000066400000000000000000000223021221777731700220130ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "coord.h" #include "transform.h" #include "file.h" #include "zipfile.h" #include "linguistics.h" #include "endianess.h" struct filter_entry { enum item_type first,last; enum attr_type cond_attr; char *cond_str; }; struct filter { GList *old; GList *new; }; struct map_priv { struct map *parent; GList *filters; }; struct map_rect_priv { struct map_selection *sel; struct map_priv *m; struct map_rect *parent; struct item item,*parent_item; }; struct map_search_priv { struct map_rect_priv *mr; }; static enum item_type filter_type(struct map_priv *m, struct item *item) { GList *filters=m->filters; struct filter_entry *entry; while (filters) { struct filter *filter=filters->data; int pos=0,count=0; GList *old,*new; old=filter->old; while (old) { entry=old->data; if (item->type >= entry->first && item->type <= entry->last) break; pos+=entry->last-entry->first+1; old=g_list_next(old); } if (old && entry && entry->cond_attr != attr_none) { struct attr attr; if (entry->cond_attr == attr_id) { char idstr[64]; sprintf(idstr,"0x%x 0x%x",item->id_hi,item->id_lo); if (strcmp(entry->cond_str, idstr)) old=NULL; } else if (!item_attr_get(item, entry->cond_attr, &attr)) { old=NULL; } else { char *wildcard=strchr(entry->cond_str,'*'); int len; if (!wildcard) len=strlen(entry->cond_str)+1; else len=wildcard-entry->cond_str; if (strncmp(entry->cond_str, attr.u.str, len)) old=NULL; } item_attr_rewind(item); } if (old) { new=filter->new; if (!new) return item->type; while (new) { struct filter_entry *entry=new->data; count+=entry->last-entry->first+1; new=g_list_next(new); } pos%=count; new=filter->new; while (new) { struct filter_entry *entry=new->data; if (pos <= entry->last-entry->first) return entry->first+pos; pos-=entry->last-entry->first+1; new=g_list_next(new); } } filters=g_list_next(filters); } return item->type; } static void free_filter_entry(struct filter_entry *filter) { g_free(filter->cond_str); g_free(filter); } static void free_filter(struct filter *filter) { g_list_foreach(filter->old, (GFunc)free_filter_entry, NULL); g_list_free(filter->old); filter->old=NULL; g_list_foreach(filter->new, (GFunc)free_filter_entry, NULL); g_list_free(filter->new); filter->new=NULL; } static void free_filters(struct map_priv *m) { g_list_foreach(m->filters, (GFunc)free_filter, NULL); g_list_free(m->filters); m->filters=NULL; } static GList * parse_filter(char *filter) { GList *ret=NULL; for (;;) { char *condition,*range,*next=strchr(filter,','); struct filter_entry *entry=g_new0(struct filter_entry, 1); if (next) *next++='\0'; condition=strchr(filter,'['); if (condition) *condition++='\0'; range=strchr(filter,'-'); if (range) *range++='\0'; if (!strcmp(filter,"*") && !range) { entry->first=type_none; entry->last=type_last; } else { entry->first=item_from_name(filter); if (range) entry->last=item_from_name(range); else entry->last=entry->first; } if (condition) { char *end=strchr(condition,']'); char *eq=strchr(condition,'='); if (end && eq && eq < end) { *end='\0'; *eq++='\0'; if (eq[0] == '"' || eq[0] == '\'') { char *quote=strchr(eq+1,eq[0]); if (quote) { eq++; *quote='\0'; } } entry->cond_attr=attr_from_name(condition); entry->cond_str=g_strdup(eq); } } ret=g_list_append(ret, entry); if (!next) break; filter=next; } return ret; } static void parse_filters(struct map_priv *m, char *filter) { char *filter_copy=g_strdup(filter); char *str=filter_copy; free_filters(m); for (;;) { char *pos,*bracket,*eq,*next=strchr(str,';'); struct filter *filter=g_new0(struct filter, 1); if (next) *next++='\0'; pos=str; for (;;) { eq=strchr(pos,'='); if (eq) { bracket=strchr(pos,'['); if (bracket && bracket < eq) { bracket=strchr(pos,']'); if (bracket) pos=bracket+1; else { eq=NULL; break; } } else { *eq++='\0'; break; } } else break; } filter->old=parse_filter(str); if (eq) filter->new=parse_filter(eq); m->filters=g_list_append(m->filters,filter); if (!next) break; str=next; } g_free(filter_copy); } static void map_filter_coord_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; item_coord_rewind(mr->parent_item); } static int map_filter_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; return item_coord_get(mr->parent_item, c, count); } static void map_filter_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; item_attr_rewind(mr->parent_item); } static int map_filter_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; return item_attr_get(mr->parent_item, attr_type, attr); } static struct item_methods methods_filter = { map_filter_coord_rewind, map_filter_coord_get, map_filter_attr_rewind, map_filter_attr_get, }; static struct map_rect_priv * map_filter_rect_new(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr=NULL; struct map_rect *parent; parent=map_rect_new(map->parent, sel); if (parent) { mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->sel=sel; mr->parent=parent; mr->item.meth=&methods_filter; mr->item.priv_data=mr; } return mr; } static void map_filter_rect_destroy(struct map_rect_priv *mr) { map_rect_destroy(mr->parent); g_free(mr); } static struct item * map_filter_rect_get_item(struct map_rect_priv *mr) { mr->parent_item=map_rect_get_item(mr->parent); if (!mr->parent_item) return NULL; mr->item.type=filter_type(mr->m,mr->parent_item); mr->item.id_lo=mr->parent_item->id_lo; mr->item.id_hi=mr->parent_item->id_hi; return &mr->item; } static struct item * map_filter_rect_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { dbg(0,"enter\n"); mr->parent_item=map_rect_get_item_byid(mr->parent, id_hi, id_lo); if (!mr->parent_item) return NULL; mr->item.type=filter_type(mr->m,mr->parent_item); mr->item.id_lo=mr->parent_item->id_lo; mr->item.id_hi=mr->parent_item->id_hi; return &mr->item; } static struct map_search_priv * map_filter_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) { dbg(0,"enter\n"); return NULL; } static struct item * map_filter_search_get_item(struct map_search_priv *map_search) { dbg(0,"enter\n"); return NULL; } static void map_filter_search_destroy(struct map_search_priv *ms) { dbg(0,"enter\n"); } static void map_filter_destroy(struct map_priv *m) { map_destroy(m->parent); g_free(m); } static int map_filter_set_attr(struct map_priv *m, struct attr *attr) { switch (attr->type) { case attr_filter: parse_filters(m,attr->u.str); return 1; default: return 0; } } static struct map_methods map_methods_filter = { projection_mg, "utf-8", map_filter_destroy, map_filter_rect_new, map_filter_rect_destroy, map_filter_rect_get_item, map_filter_rect_get_item_byid, map_filter_search_new, map_filter_search_destroy, map_filter_search_get_item, NULL, NULL, map_filter_set_attr, }; static struct map_priv * map_filter_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m=NULL; struct attr **parent_attrs,type,*subtype=attr_search(attrs, NULL, attr_subtype),*filter=attr_search(attrs, NULL, attr_filter); struct map *map; int i,j; if (! subtype || !filter) return NULL; i=0; while (attrs[i]) i++; parent_attrs=g_new(struct attr *,i+1); i=0; j=0; while (attrs[i]) { if (attrs[i]->type != attr_filter && attrs[i]->type != attr_type) { if (attrs[i]->type == attr_subtype) { type=*attrs[i]; type.type = attr_type; parent_attrs[j]=&type; } else parent_attrs[j]=attrs[i]; j++; } i++; } parent_attrs[j]=NULL; *meth=map_methods_filter; map=map_new(NULL, parent_attrs); if (map) { m=g_new0(struct map_priv, 1); m->parent=map; parse_filters(m,filter->u.str); } g_free(parent_attrs); return m; } void plugin_init(void) { dbg(1,"filter: plugin_init\n"); plugin_register_map_type("filter", map_filter_new); } navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/000077500000000000000000000000001221777731700203535ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/CMakeLists.txt000066400000000000000000000006161221777731700231160ustar00rootroot00000000000000add_executable(gentypes gentypes.c) include_directories( ${CMAKE_CURRENT_BINARY_DIR}) # add the command to generate the source code add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/g2nbuiltin.h COMMAND gentypes ${CMAKE_CURRENT_SOURCE_DIR}/garmintypes.txt ${CMAKE_CURRENT_BINARY_DIR}/g2nbuiltin.h DEPENDS gentypes ) module_add_library(map_garmin garmin.c gar2navit.c g2nbuiltin.h) navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/Makefile.am000066400000000000000000000020731221777731700224110ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_garmin AM_CPPFLAGS+= @LIBGARMIN_CFLAGS@ INCLUDES=-I$(top_srcdir)/navit/map/garmin/libgarmin AM_CPPFLAGS+=-I$(top_srcdir)/navit/map/garmin/libgarmin AM_CPPFLAGS+=-I$(srcdir) modulemap_LTLIBRARIES = libmap_garmin.la libmap_garmin_la_SOURCES = garmin.c garmin.h gar2navit.c gar2navit.h libmap_garmin_la_LIBADD = @LIBGARMIN_LIBS@ libmap_garmin_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ nodist_libmap_garmin_la_SOURCES = g2nbuiltin.h builddir = @builddir@ gar2navit.l$(OBJEXT): g2nbuiltin.h CLEANFILES = g2nbuiltin.h noinst_PROGRAMS=gentypes$(EXEEXT) gentypes_SOURCES=gentypes.c gentypes.$(OBJEXT): gentypes.c $(CC_FOR_BUILD) -I$(top_srcdir)/navit -I$(top_srcdir) -c -o $@ $< gentypes$(EXEEXT): $(gentypes_OBJECTS) $(gentypes_DEPENDENCIES) @rm -f gentypes$(EXEEXT) $(CCLD_FOR_BUILD) -o $@ $(gentypes_OBJECTS) g2nbuiltin.h: gentypes$(EXEEXT) garmintypes.txt ./gentypes$(EXEEXT) $(top_srcdir)/navit/map/garmin/garmintypes.txt $@ EXTRA_DIST = garmintypes.txt navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/gar2navit.c000066400000000000000000000121361221777731700224170ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ /* File format is: POINT GROUP,0x0100 = town_label_1e5, Megapolis (10M +) GROUP,0x0200 = town_label_5e4, Megapolis (5-10M) ... GROUP,0x1e00-0x1e3f = district_label, District, Province, State Name ... POLYLINE GROUP,0x00 = ALL, street_1_land, Road GROUP,0x01 = MCTL, highway_land, Major HWY thick GROUP,0x02 = MCTL, street_4_land, Principal HWY-thick GROUP,0x03 = MCTL, street_2_land, Principal HWY-medium .... POLYGONE GROUP,0x01 = town_poly, City (>200k) GROUP,0x02 = town_poly, City (<200k) GROUP,0x03 = town_poly, Village GROUP is 0 - RGN1 1 - RGN2-4 */ #include #include #include #include "item.h" #include "attr.h" #include "garmin.h" #include "gar2navit.h" static int add_def(struct gar2nav_conv *conv, int type, unsigned short minid, unsigned short maxid, unsigned int group, char *ntype, char *descr) { enum item_type it; struct gar2navit *g2n; dlog(11, "group=%d type=%d routable=%u min=%04X max=%04X ntype=%s descr=%s\n", group, type, minid, maxid, ntype, descr); it = item_from_name(ntype); if (it==type_none) { dlog(1, "Please define: %s\n", ntype); } g2n = calloc(1, sizeof(*g2n)); if (!g2n) return -1; g2n->id = minid; g2n->maxid = maxid; g2n->ntype = it; g2n->descr = strdup(descr); g2n->group = group; if (type == 1) { g2n->next = conv->points; conv->points = g2n; } else if (type == 2) { g2n->next = conv->polylines; conv->polylines = g2n; } else if (type == 3) { g2n->next = conv->polygons; conv->polygons = g2n; } return 0; } static int load_types_file(char *file, struct gar2nav_conv *conv) { char buf[4096]; char descr[4096]; char ntype[4096]; FILE *fp; unsigned int minid, maxid, group; int rc; int type = -1; fp = fopen(file, "r"); if (!fp) return -1; while (fgets(buf, sizeof(buf), fp)) { if (*buf == '#' || *buf == '\n') continue; if (!strncasecmp(buf, "POINT", 5)) { type = 1; continue; } else if (!strncasecmp(buf, "POI", 3)) { type = 1; continue; } else if (!strncasecmp(buf, "POLYLINE", 8)) { type = 2; continue; } else if (!strncasecmp(buf, "POLYGONE", 8)) { type = 3; continue; } // assume only lines are routable rc = sscanf(buf, "%d, 0x%04X - 0x%04X = %[^\t , ] , %[^\n]", &group, &minid, &maxid, ntype, descr); if (rc != 5) { maxid = 0; rc = sscanf(buf, "%d,0x%04X = %[^\t, ], %[^\n]", &group, &minid, ntype, descr); if (rc != 4) { dlog(1, "Invalid line rc=%d:[%s]\n",rc, buf); dlog(1, "minid=%04X ntype=[%s] des=[%s]\n", minid, ntype, descr); continue; } } add_def(conv, type, minid, maxid, group, ntype, descr); } fclose(fp); return 1; } struct gar2nav_conv *g2n_conv_load(char *file) { struct gar2nav_conv *c; int rc; c = calloc(1, sizeof(*c)); if (!c) return c; rc = load_types_file(file, c); if (rc < 0) { dlog(1, "Failed to load: [%s]\n", file); free(c); return NULL; } return c; } enum item_type g2n_get_type(struct gar2nav_conv *c, unsigned int type, unsigned short id) { struct gar2navit *def = NULL; int group; group = (type >> G2N_KIND_SHIFT); type &= ~G2N_KIND_MASK; if (type == G2N_POINT) def = c->points; else if (type == G2N_POLYLINE) def = c->polylines; else if (type == G2N_POLYGONE) def = c->polygons; else { dlog(1, "Unknown conversion type:%d\n", type); return type_none; } if (!def) { dlog(5, "No conversion data for %d\n", type); return type_none; } while (def) { if (def->group == group && ((!def->maxid && def->id == id) || (def->id <= id && id <= def->maxid))) return def->ntype; def = def->next; } dlog(5, "Type[%d]:ID:[%04X] unknown\n", type, id); return type == G2N_POINT ? type_point_unkn : type_street_unkn; } char *g2n_get_descr(struct gar2nav_conv *c, int type, unsigned short id) { struct gar2navit *def = NULL; if (type == G2N_POINT) def = c->points; else if (type == G2N_POLYLINE) def = c->polylines; else if (type == G2N_POLYGONE) def = c->polygons; else { dlog(1, "Unknown conversion type:%d\n", type); return NULL; } while (def) { if ((!def->maxid && def->id == id) || (def->id <= id && id <= def->maxid)) return def->descr; def = def->next; } dlog(5, "Type[%d]:ID:[%04X] unknown\n", type, id); return NULL; } #if 0 int main(int argc, char **argv) { load_types_file(argv[1], NULL); return 0; } #endif #include "g2nbuiltin.h" navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/gar2navit.h000066400000000000000000000030711221777731700224220ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ #define GROUP_RGN1 0 #define GROUP_RGN2 1 struct gar2navit { unsigned short id; unsigned short maxid; enum item_type ntype; unsigned group; char *descr; struct gar2navit *next; }; #define G2N_POINT 1 #define G2N_POLYLINE 2 #define G2N_POLYGONE 3 #define G2N_KIND_MASK 0xF0000000 #define G2N_KIND_SHIFT 28 #define G2N_RGN1 (GROUP_RGN1<<29) #define G2N_RGN2 (GROUP_RGN2<<29) struct gar2nav_conv { struct gar2navit *points; struct gar2navit *polylines; struct gar2navit *polygons; }; struct gar2nav_conv *g2n_conv_load(char *file); enum item_type g2n_get_type(struct gar2nav_conv *c, unsigned int type, unsigned short id); char *g2n_get_descr(struct gar2nav_conv *c, int type, unsigned short id); struct gar2nav_conv *g2n_default_conv(void); navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/garmin.c000066400000000000000000000536471221777731700220130ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ #include #include #include #include #include #include #include #include #include "config.h" #include "plugin.h" #include "data.h" #include "projection.h" #include "item.h" #include "debug.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "coord.h" #include "transform.h" #include #include "attr.h" #include "coord.h" #include #include "garmin.h" #include "gar2navit.h" static int map_id; struct map_priv { int id; char *filename; struct gar2nav_conv *conv; struct gar *g; }; struct map_rect_priv { int id; struct coord_rect r; char *label; // FIXME: Register all strings for searches int limit; struct map_priv *mpriv; struct gmap *gmap; struct gobject *cobj; struct gobject *objs; struct item item; unsigned int last_coord; void *last_itterated; struct coord last_c; void *last_oattr; unsigned int last_attr; struct gar_search *search; }; int garmin_debug = 10; void logfn(char *file, int line, int level, char *fmt, ...) { va_list ap; char fileline[256]; int sz; if (level > garmin_debug) return; va_start(ap, fmt); sz = sprintf(fileline, "%s:%d:%d|", file, line, level); debug_vprintf(0, "", strlen(""), fileline, sz, 1, fmt, ap); va_end(ap); } // need a base map and a map struct gscale { char *label; float scale; int bits; }; static struct gscale mapscales[] = { {"7000 km", 70000.0, 8} ,{"5000 km", 50000.0, 8} ,{"3000 km", 30000.0, 9} ,{"2000 km", 20000.0, 9} ,{"1500 km", 15000.0, 10} ,{"1000 km", 10000.0, 10} ,{"700 km", 7000.0, 11} ,{"500 km", 5000.0, 11} ,{"300 km", 3000.0, 13} ,{"200 km", 2000.0, 13} ,{"150 km", 1500.0, 13} ,{"100 km", 1000.0, 14} ,{"70 km", 700.0, 15} ,{"50 km", 500.0, 16} ,{"30 km", 300.0, 16} ,{"20 km", 200.0, 17} ,{"15 km", 150.0, 17} ,{"10 km", 100.0, 18} ,{"7 km", 70.0, 18} ,{"5 km", 50.0, 19} ,{"3 km", 30.0, 19} ,{"2 km", 20.0, 20} ,{"1.5 km", 15.0, 22} ,{"1 km", 10.0, 24} ,{"700 m", 7.0, 24} ,{"500 m", 5.0, 24} ,{"300 m", 3.0, 24} ,{"200 m", 2.0, 24} ,{"150 m", 1.5, 24} ,{"100 m", 1.0, 24} ,{"70 m", 0.7, 24} ,{"50 m", 0.5, 24} ,{"30 m", 0.3, 24} ,{"20 m", 0.2, 24} ,{"15 m", 0.1, 24} ,{"10 m", 0.15, 24} }; static int garmin_object_label(struct gobject *o, struct attr *attr) { struct map_rect_priv *mr = o->priv_data; char *codepage; char *label; if (!mr) { dlog(1, "Error object do not have priv_data!!\n"); return 0; } if (mr->label) { free(mr->label); } label = gar_get_object_lbl(o); if (label) { codepage = gar_obj_codepage(o); if (*codepage != 'a') { mr->label = g_convert(label, -1,"utf-8",codepage,NULL,NULL,NULL); free(label); } else mr->label = label; } else { mr->label = NULL; return 0; } if (mr->label) { char *cp = mr->label; #warning FIXME Process label and give only the visible part if (*mr->label == '@' || *mr->label == '^') cp++; /* FIXME: If zoomlevel is high convert ^ in the string to spaces */ attr->u.str = cp; return 1; } return 0; } static int garmin_object_debug(struct gobject *o, struct attr *attr) { struct map_rect_priv *mr = o->priv_data; if (!mr) { dlog(1, "Error object do not have priv_data!!\n"); return 0; } if (mr->label) free(mr->label); mr->label = gar_object_debug_str(o); if (mr->label) { attr->u.str = mr->label; return 1; } return 0; } static struct map_search_priv * gmap_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) { struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1); struct gar_search *gs; int rc; dlog(1, "Called!\n"); mr->mpriv=map; gs = g_new0(struct gar_search,1); if (!gs) { dlog(1, "Can not init search \n"); free(mr); return NULL; } mr->search = gs; switch (search->type) { case attr_country_name: gs->type = GS_COUNTRY; break; case attr_town_name: gs->type = GS_CITY; break; case attr_town_postal: gs->type = GS_ZIP; break; case attr_street_name: gs->type = GS_ROAD; break; #if someday case attr_region_name: case attr_intersection: case attr_housenumber: #endif default: dlog(1, "Don't know how to search for %d\n", search->type); goto out_err; } gs->match = partial ? GM_START : GM_EXACT; gs->needle = strdup(search->u.str); dlog(5, "Needle: %s\n", gs->needle); mr->gmap = gar_find_subfiles(mr->mpriv->g, gs, GO_GET_SEARCH); if (!mr->gmap) { dlog(1, "Can not init search \n"); goto out_err; } rc = gar_get_objects(mr->gmap, 0, gs, &mr->objs, GO_GET_SEARCH); if (rc < 0) { dlog(1, "Error loading objects\n"); goto out_err; } mr->cobj = mr->objs; dlog(4, "Loaded %d objects\n", rc); return (struct map_search_priv *)mr; out_err: free(gs); free(mr); return NULL; } /* Assumes that only one item will be itterated at time! */ static void coord_rewind(void *priv_data) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; mr->last_coord = 0; }; static void attr_rewind(void *priv_data) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; mr->last_attr = 0; }; static int point_coord_get(void *priv_data, struct coord *c, int count) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; struct gcoord gc; if (!count) return 0; if (g != mr->last_itterated) { mr->last_itterated = g; mr->last_coord = 0; } if (mr->last_coord > 0) return 0; gar_get_object_coord(mr->gmap, g, &gc); c->x = gc.x; c->y = gc.y; mr->last_coord++; // dlog(1,"point: x=%d y=%d\n", c->x, c->y); // dlog(1, "point: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y)); return 1; } static int coord_is_node(void *priv_data) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; return gar_is_object_dcoord_node(mr->gmap, g, mr->last_coord); } static int poly_coord_get(void *priv_data, struct coord *c, int count) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; int ndeltas = 0, total = 0; struct gcoord dc; if (!count) return 0; if (g != mr->last_itterated) { mr->last_itterated = g; mr->last_coord = 0; } ndeltas = gar_get_object_deltas(g); if (mr->last_coord > ndeltas + 1) return 0; while (count --) { if (mr->last_coord == 0) { gar_get_object_coord(mr->gmap, g, &dc); mr->last_c.x = dc.x; mr->last_c.y = dc.y; } else { if (!gar_get_object_dcoord(mr->gmap, g, mr->last_coord - 1, &dc)) { mr->last_coord = ndeltas + 2; return total; } mr->last_c.x += dc.x; mr->last_c.y += dc.y; } c->x = mr->last_c.x; c->y = mr->last_c.y; ddlog(1, "poly: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y)); // dlog(1,"poly: x=%d y=%d\n", c->x, c->y); c++; total++; mr->last_coord ++; } return total; } // for _any we must return one by one static int point_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; int rc; switch (attr_type) { case attr_any: if (g != mr->last_oattr) { mr->last_oattr = g; mr->last_attr = 0; } switch(mr->last_attr) { case 0: mr->last_attr++; attr->type = attr_label; rc = garmin_object_label(g, attr); if (rc) return rc; case 1: mr->last_attr++; attr->type = attr_debug; rc = garmin_object_debug(g, attr); if (rc) return rc; case 2: mr->last_attr++; if (g->type == GO_POLYLINE) { attr->type = attr_street_name; rc = garmin_object_label(g, attr); if (rc) return rc; } case 3: mr->last_attr++; attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; default: return 0; } break; case attr_label: attr->type = attr_label; return garmin_object_label(g, attr); case attr_town_name: attr->type = attr_town_name; return garmin_object_label(g, attr); case attr_street_name: attr->type = attr_type; return garmin_object_label(g, attr); case attr_street_name_systematic: /* TODO: Get secondary labels of roads */ return 0; case attr_flags: attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; default: dlog(1, "Don't know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type)); } return 0; } static struct item_methods methods_garmin_point = { coord_rewind, point_coord_get, attr_rewind, point_attr_get, }; static struct item_methods methods_garmin_poly = { coord_rewind, poly_coord_get, attr_rewind, // point_attr_rewind, point_attr_get, // poly_attr_get, coord_is_node, }; static int search_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; int rc; switch (attr_type) { case attr_any: if (g != mr->last_oattr) { mr->last_oattr = g; mr->last_attr = 0; } switch(mr->last_attr) { case 0: mr->last_attr++; attr->type = attr_label; rc = garmin_object_label(g, attr); if (rc) return rc; case 1: mr->last_attr++; attr->type = attr_debug; rc = garmin_object_debug(g, attr); if (rc) return rc; case 2: mr->last_attr++; if (g->type == GO_POLYLINE) { attr->type = attr_street_name; rc = garmin_object_label(g, attr); if (rc) return rc; } case 3: mr->last_attr++; attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; default: return 0; } break; case attr_label: attr->type = attr_label; return garmin_object_label(g, attr); case attr_town_name: attr->type = attr_town_name; if (mr->label) free(mr->label); mr->label = gar_srch_get_city(g); attr->u.str = mr->label; if (attr->u.str) return 1; return 0; case attr_town_id: rc = gar_srch_get_cityid(g); if (rc) { attr->type = attr_town_id; attr->u.num = rc; return 1; } return 0; case attr_town_postal: attr->type = attr_town_postal; attr->u.str = gar_srch_get_zip(g); if (attr->u.str) return 1; return 0; case attr_street_name: attr->type = attr_street_name; if (mr->label) free(mr->label); mr->label = gar_srch_get_roadname(g); attr->u.str = mr->label; if (attr->u.str) return 1; return 0; case attr_street_id: attr->type = attr_street_id; attr->u.num = gar_srch_get_roadid(g); if (attr->u.num) return 1; return 0; case attr_flags: attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; case attr_country_id: rc = gar_srch_get_countryid(g); if (rc) { attr->type = attr_country_id; attr->u.num = rc; return 1; } return 0; case attr_country_name: attr->type = attr_country_name; attr->u.str = gar_srch_get_country(g); if (attr->u.str) return 1; return 0; case attr_district_id: rc = gar_srch_get_regionid(g); if (rc) { attr->type = attr_district_id; attr->u.num = rc; return 1; } return 0; case attr_district_name: attr->type = attr_district_name; attr->u.str = gar_srch_get_region(g); if (attr->u.str) return 1; return 0; case attr_town_streets_item: return 0; default: dlog(1, "Don't know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type)); } return 0; } static int search_coord_get(void *priv_data, struct coord *c, int count) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; struct gcoord gc; if (!count) return 0; if (g != mr->last_itterated) { mr->last_itterated = g; mr->last_coord = 0; } if (mr->last_coord > 0) return 0; if (gar_get_object_coord(mr->gmap, g, &gc)) { c->x = gc.x; c->y = gc.y; mr->last_coord++; return 1; } return 0; } static struct item_methods methods_garmin_search = { coord_rewind, search_coord_get, attr_rewind, search_attr_get, }; static struct item * garmin_poi2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { if (mr->mpriv->conv) { int mask = gar_object_group(o) << G2N_KIND_SHIFT; mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POINT|mask, otype); } mr->item.meth = &methods_garmin_point; return &mr->item; } static struct item * garmin_pl2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { if (mr->mpriv->conv) { int mask = gar_object_group(o) << G2N_KIND_SHIFT; mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POLYLINE|mask, otype); } mr->item.meth = &methods_garmin_poly; return &mr->item; } static struct item * garmin_pg2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { if (mr->mpriv->conv) { int mask = gar_object_group(o) << G2N_KIND_SHIFT; mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POLYGONE|mask, otype); } mr->item.meth = &methods_garmin_poly; return &mr->item; } static struct item * garmin_srch2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { mr->item.type = type_country_label; mr->item.meth = &methods_garmin_search; return &mr->item; } static struct item * garmin_obj2item(struct map_rect_priv *mr, struct gobject *o) { unsigned short otype; otype = gar_obj_type(o); mr->item.type = type_none; switch (o->type) { case GO_POINT: return garmin_poi2item(mr, o, otype); case GO_POLYLINE: return garmin_pl2item(mr, o, otype); case GO_POLYGON: return garmin_pg2item(mr, o, otype); case GO_ROAD: return garmin_pl2item(mr, o, otype); #if 0 case GO_SEARCH: return garmin_srch2item(mr, o, otype); #endif default: dlog(1, "Unknown garmin object type:%d\n", o->type); } return NULL; } static struct item * gmap_rect_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct gobject *o; o = mr->objs = gar_get_object_by_id(mr->mpriv->g, id_hi, id_lo); if (!o) { dlog(1, "Can not find object\n"); return NULL; } mr->item.id_hi = id_hi; mr->item.id_lo = id_lo; mr->item.priv_data = o; mr->item.type = type_none; o->priv_data = mr; if (!garmin_obj2item(mr, o)) return NULL; return &mr->item; } static struct item * gmap_rect_get_item(struct map_rect_priv *mr) { struct gobject *o; if (!mr->objs) return NULL; if (!mr->cobj) return NULL; // mr->cobj = mr->objs; o = mr->cobj; // dlog(1, "gi:o=%p\n", o); mr->cobj = mr->cobj->next; if (o) { mr->item.id_hi = gar_object_mapid(o); mr->item.id_lo = gar_object_index(o); mr->item.priv_data = o; mr->item.type = type_none; o->priv_data = mr; if (!garmin_obj2item(mr, o)) return NULL; return &mr->item; } return NULL; } #define max(a,b) ((a) > (b) ? (a) : (b)) struct nl2gl_t { int g; int bits; char *descr; }; struct nl2gl_t nl2gl_1[] = { { /* 0 */ .g = 12, .descr = "0-120m", }, { /* 1 */ .g = 11, .descr = "0-120m", }, { /* 2 */ .g = 10, .descr = "0-120m", }, { /* 3 */ .g = 9, .descr = "0-120m", }, { /* 4 */ .g = 8, .descr = "0-120m", }, { /* 5 */ .g = 7, .descr = "0-120m", }, { /* 6 */ .g = 6, .descr = "0-120m", }, { /* 7 */ .g = 5, .descr = "0-120m", }, { /* 8 */ .g = 4, .descr = "0-120m", }, { /* 9 */ .g = 4, .descr = "0-120m", }, { /* 10 */ .g = 3, .descr = "0-120m", }, { /* 11 */ .g = 3, .descr = "0-120m", }, { /* 12 */ .g = 2, .descr = "0-120m", }, { /* 13 */ .g = 2, .descr = "0-120m", }, { /* 14 */ .g = 2, .descr = "0-120m", }, { /* 15 */ .g = 1, .descr = "0-120m", }, { /* 16 */ .g = 1, .descr = "0-120m", }, { /* 17 */ .g = 1, .descr = "0-120m", }, { /* 18 */ .g = 0, .descr = "0-120m", }, }; struct nl2gl_t nl2gl[] = { { /* 0 */ .g = 9, .descr = "0-120m", }, { /* 1 */ .g = 9, .descr = "0-120m", }, { /* 2 */ .g = 8, .descr = "0-120m", }, { /* 3 */ .g = 8, .descr = "0-120m", }, { /* 4 */ .g = 7, .descr = "0-120m", }, { /* 5 */ .g = 7, .descr = "0-120m", }, { /* 6 */ .g = 6, .descr = "0-120m", }, { /* 7 */ .g = 6, .descr = "0-120m", }, { /* 8 */ .g = 5, .descr = "0-120m", }, { /* 9 */ .g = 5, .descr = "0-120m", }, { /* 10 */ .g = 4, .descr = "0-120m", }, { /* 11 */ .g = 4, .descr = "0-120m", }, { /* 12 */ .g = 3, .descr = "0-120m", }, { /* 13 */ .g = 3, .descr = "0-120m", }, { /* 14 */ .g = 2, .descr = "0-120m", }, { /* 15 */ .g = 2, .descr = "0-120m", }, { /* 16 */ .g = 1, .descr = "0-120m", }, { /* 17 */ .g = 1, .descr = "0-120m", }, { /* 18 */ .g = 0, .descr = "0-120m", }, }; static int get_level(struct map_selection *sel) { return sel->order; } static int garmin_get_selection(struct map_rect_priv *map, struct map_selection *sel) { struct gar_rect r; struct gmap *gm; struct gobject **glast = NULL; int rc; int sl, el; int level = 0; // 18; /* max level for maps, overview maps can have bigger /* levels we do not deal w/ them */ int flags = 0; if (sel && sel->range.min == type_street_0 && sel->range.max == type_ferry) { // Get all roads flags = GO_GET_ROUTABLE; } else if (sel) flags = GO_GET_SORTED; if (sel) { r.lulat = sel->u.c_rect.lu.y; r.lulong = sel->u.c_rect.lu.x; r.rllat = sel->u.c_rect.rl.y; r.rllong = sel->u.c_rect.rl.x; level = get_level(sel); // level = nl2gl[level].g; dlog(2, "Looking level=%d for %f %f %f %f\n", level, r.lulat, r.lulong, r.rllat, r.rllong); } gm = gar_find_subfiles(map->mpriv->g, sel ? &r : NULL, flags); if (!gm) { if (sel) { dlog(1, "Can not find map data for the area: %f %f %f %f\n", r.lulat, r.lulong, r.rllat, r.rllong); } else { dlog(1, "Can not find map data\n"); } return -1; } #if 0 sl = (18-(gm->maxlevel - gm->minlevel))/2; el = sl + (gm->maxlevel - gm->minlevel); if (level < sl) level = sl; if (level > el) level = el; level = level - sl; level = (gm->maxlevel - gm->minlevel) - level; dlog(3, "sl=%d el=%d level=%d\n", sl, el, level); #endif sl = (18-gm->zoomlevels)/2; el = sl + gm->zoomlevels; if (level < sl) level = sl; if (level > el) level = el; level = level - sl; level = gm->basebits + level; dlog(3, "sl=%d el=%d level=%d\n", sl, el, level); map->gmap = gm; glast = &map->objs; while (*glast) { if ((*glast)->next) { *glast = (*glast)->next; } else break; } rc = gar_get_objects(gm, level, sel ? &r : NULL, glast, flags); if (rc < 0) { dlog(1, "Error loading objects\n"); return -1; } map->cobj = map->objs; dlog(2, "Loaded %d objects\n", rc); return rc; } // Can not return NULL, navit segfaults static struct map_rect_priv * gmap_rect_new(struct map_priv *map, struct map_selection *sel) { struct map_selection *ms = sel; struct map_rect_priv *mr; if (!map) return NULL; mr = calloc(1, sizeof(*mr)); if (!mr) return mr; mr->mpriv = map; if (!sel) { return mr; } else { while (ms) { dlog(2, "order %d\n", ms->order); if (garmin_get_selection(mr, ms) < 0) { // free(mr); // return NULL; } ms = ms->next; } } return mr; } static void gmap_rect_destroy(struct map_rect_priv *mr) { dlog(11,"destroy maprect\n"); if (mr->gmap) gar_free_gmap(mr->gmap); if (mr->objs) gar_free_objects(mr->objs); if (mr->label) free(mr->label); free(mr); } static void gmap_search_destroy(struct map_search_priv *ms) { gmap_rect_destroy((struct map_rect_priv *)ms); } static void gmap_destroy(struct map_priv *m) { dlog(5, "garmin_map_destroy\n"); if (m->g) gar_free(m->g); if (m->filename) free(m->filename); free(m); } static struct map_methods map_methods = { projection_garmin, "utf-8", gmap_destroy, gmap_rect_new, gmap_rect_destroy, gmap_rect_get_item, gmap_rect_get_item_byid, gmap_search_new, gmap_search_destroy, NULL, }; static struct map_priv * gmap_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data; struct attr *debug; struct attr *flags; char buf[PATH_MAX]; struct stat st; int dl = 1; struct gar_config cfg; int debugmask = 0; data=attr_search(attrs, NULL, attr_data); if (! data) return NULL; debug=attr_search(attrs, NULL, attr_debug); if (debug) { dl = atoi(debug->u.str); if (!dl) dl = 1; } flags=attr_search(attrs, NULL, attr_flags); if (flags) { debugmask = flags->u.num; } m=g_new(struct map_priv, 1); m->id=++map_id; m->filename = strdup(data->u.str); if (!m->filename) { g_free(m); return NULL; } memset(&cfg, 0, sizeof(struct gar_config)); cfg.opm = OPM_GPS; cfg.debuglevel = dl; cfg.debugmask = debugmask; garmin_debug = dl; m->g = gar_init_cfg(NULL, logfn, &cfg); if (!m->g) { g_free(m->filename); g_free(m); return NULL; } // we want the data now, later we can load only what's necessery if (gar_img_load(m->g, m->filename, 1) < 0) { gar_free(m->g); g_free(m->filename); g_free(m); return NULL; } m->conv = NULL; snprintf(buf, sizeof(buf), "%s.types", m->filename); if (!stat(buf, &st)) { dlog(1, "Loading custom types from %s\n", buf); m->conv = g2n_conv_load(buf); } if (!m->conv) { dlog(1, "Using builtin types\n"); m->conv = g2n_default_conv(); } if (!m->conv) { dlog(1, "Failed to load map types\n"); } *meth=map_methods; return m; } void plugin_init(void) { plugin_register_map_type("garmin", gmap_new); } navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/garmin.h000066400000000000000000000020741221777731700220040ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ #define dlog(x,y ...) logfn(__FILE__,__LINE__,x, ##y) #ifdef HARDDEBUG #define ddlog(x,y ...) logfn(__FILE__,__LINE__,x, ##y) #else #define ddlog(x,y ...) #endif extern int garmin_debug; void logfn(char *file, int line, int level, char *fmt, ...); navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/garmintypes.txt000066400000000000000000000662001221777731700234620ustar00rootroot00000000000000# # # POINT 0, 0x0000 = label_unkn, Unknown label 0, 0x0100 = town_label_1e5, Megapolis (10M +) 0, 0x0200 = town_label_5e4, Megapolis (5-10M) 0, 0x0300 = town_label_2e4, Big City (2-5M) 0, 0x0400 = town_label_1e4, Big City (1-2M) 0, 0x0500 = town_label_5e3, Big City (0.5-1M) 0, 0x0600 = town_label_2e3, City (200-500k) 0, 0x0700 = town_label_1e3, City (100-200k) 0, 0x0800 = town_label_5e2, City (50-100k) 0, 0x0900 = town_label_2e2, City (20-50k) 0, 0x0a00 = town_label_1e2, City (10-20k) 0, 0x0b00 = town_label_5e1, Small City (5-10k) 0, 0x0c00 = town_label_2e1, Small City (2-5k) 0, 0x0d00 = town_label_1e1, Village (1-2k) 0, 0x0e00 = town_label_5e0, Village (500-1000) 0, 0x0f00 = town_label_2e0, Village (200-500) 0, 0x1000 = town_label_1e0, Village (100-200) 0, 0x1100 = town_label_0e0, Village (0-100) 0, 0x1200 = port_label, Port with services 0, 0x1300 = label_unkn, Unknown label2 0, 0x1400-0x14FF = country_label, Large Country Name 0, 0x1500-0x15FF = country_label, Country Name 0, 0x1c00 = poi_wreck, Unclassified Obstruction 0, 0x1c01 = poi_wreck, Wreck 0, 0x1c02 = poi_danger_sea_wreck, submerged wreck, dangerous 0, 0x1c03 = poi_nondangerous, submerged wreck, non-dangerous 0, 0x1c04 = poi_wreck, Wreck, cleared by wire drag 0, 0x1c05 = poi_rock, Obstruction, visible at high water 0, 0x1c06 = poi_rock, Obstruction, awash 0, 0x1c07 = poi_rock, Obstruction, submerged 0, 0x1c08 = poi_rock, Obstruction, cleared by wire drag 0, 0x1c09 = poi_rock, Rock, awash 0, 0x1c0a = poi_rock, Rock, submerged at low Water 0, 0x1c0b = poi_sounding, Sounding 0, 0x1d00 = poi_tide, Tide Prediction 0, 0x1e00-0x1e3f = district_label, District, Province, State Name 0, 0x1f00 = district_label_0e0, Region, District Name # Fixme if it has label how to change to highway_exit_with_label ?? 0, 0x2000-0x203F = highway_exit, Exit 0, 0x2100-0x213F = highway_exit, Exit with Services 0, 0x2200-0x223F = highway_exit, Exit with Restroom 0, 0x2300-0x233F = highway_exit, Exit with Convinience Store 0, 0x2400-0x243F = highway_exit, Exit with Weight Station 0, 0x2500-0x253F = highway_exit, Exit with Toolbooth Booth 0, 0x2600-0x263F = highway_exit, Exit with Information 0, 0x2700-0x273F = highway_exit, Exit 0, 0x2800-0x283F = district_label_1e0, Region Name 0, 0x2900 = poi_public_utilities, Services 0, 0x2A00 = poi_dining, Dining(Other) 0, 0x2A01 = poi_dining, Dining(American) 0, 0x2A02 = poi_dining, Dining(Asian) 0, 0x2A03 = poi_dining, Dining(Barbecue) 0, 0x2A04 = poi_dining, Dining(Chinese) 0, 0x2A05 = poi_dining, Dining(Deli/Bakery) 0, 0x2A06 = poi_dining, Dining(International) 0, 0x2A07 = poi_fastfood, Fast Food 0, 0x2A08 = poi_dining, Dining(Italian) 0, 0x2A09 = poi_dining, Dining(Mexican) 0, 0x2A0A = poi_dining, Dining(Pizza) 0, 0x2A0B = poi_dining, Dining(Sea Food) 0, 0x2A0C = poi_dining, Dining(Steak/Grill) 0, 0x2A0D = poi_dining, Dining(Bagel/Donut) 0, 0x2A0E = poi_dining, Dining(Cafe/Diner) 0, 0x2A0F = poi_dining, Dining(French) 0, 0x2A10 = poi_dining, Dining(German) 0, 0x2A11 = poi_dining, Dining(British Isles) 0, 0x2A12 = poi_dining, Dining(Special Foods) 0, 0x2B00 = poi_hotel, Hotel(Other) 0, 0x2B01 = poi_hotel, Hotel/Motel 0, 0x2B02 = poi_hotel, Bed & Breakfast inn 0, 0x2B03 = poi_camp_rv, Camping/RV-Park 0, 0x2B04 = poi_resort, Resort 0, 0x2C00 = poi_attraction, Amusement Park 0, 0x2C01 = poi_attraction, Amusement Park 0, 0x2C02 = poi_museum_history, Museum/History 0, 0x2C03 = poi_library, Libraries 0, 0x2C04 = poi_landmark, Land Mark 0, 0x2C05 = poi_school, School 0, 0x2C06 = poi_park, Park 0, 0x2C07 = poi_zoo, Zoo 0, 0x2C08 = poi_stadium, Sportpark, Stadium,(point) 0, 0x2C09 = poi_fair, Fair, Conference(point) 0, 0x2C0A = poi_wine, Wine restaurant(point) 0, 0x2C0B = poi_worship, Place of Worship 0, 0x2C0C = poi_hotspring, Hot Spring 0, 0x2D00 = poi_theater, Theater 0, 0x2D01 = poi_theater, Theater 0, 0x2D02 = poi_bar, Bar 0, 0x2D03 = poi_cinema, Cinema 0, 0x2D04 = poi_casino, Casino 0, 0x2D05 = poi_golf, Golf 0, 0x2D06 = poi_skiing, Skiing Center 0, 0x2D07 = poi_bowling, Bowling 0, 0x2D08 = poi_icesport, Ice/Sporting 0, 0x2D09 = poi_swimming, Swimming 0, 0x2D0A = poi_sport, Sports(point) 0, 0x2D0B = poi_sailing, Sailing Airport 0, 0x2E00 = poi_shopping, Shoping general 0, 0x2E01 = poi_shop_department, Department Store 0, 0x2E02 = poi_shop_grocery, Grocery 0, 0x2E03 = poi_shop_merchandise, General Merchandiser 0, 0x2E04 = poi_mall, Shopping Center 0, 0x2E05 = poi_pharmacy, Pharmacy 0, 0x2E06 = poi_shopping, Convenience 0, 0x2E07 = poi_shop_apparel, Apparel 0, 0x2E08 = poi_shop_handg, House and Garden 0, 0x2E09 = poi_shop_furniture, Home Furnishing 0, 0x2E0a = poi_shop_retail, Special Retail 0, 0x2E0b = poi_shop_computer, Computer/Software 0, 0x2E0c = poi_shop_computer, Mobile Communications 0, 0x2F00 = poi_service, generic service 0, 0x2F01 = poi_fuel, Fuel/Gas 0, 0x2F02 = poi_car_rent, Car Rental 0, 0x2F03 = poi_autoservice, Car Repair 0, 0x2F04 = poi_airport, Airport 0, 0x2F05 = poi_post_office, Post Office 0, 0x2F06 = poi_bank, Bank 0, 0x2F07 = poi_car_dealer_parts, Car Dealer(point) 0, 0x2F08 = poi_bus_station, Bus Station 0, 0x2F09 = poi_marina, Marina 0, 0x2F0A = poi_wrecker, Wrecker Service 0, 0x2F0B = poi_car_parking, Parking 0, 0x2F0C = poi_restroom, Restroom 0, 0x2F0D = poi_auto_club, Automobile Club 0, 0x2F0E = poi_car_wash, Car Wash 0, 0x2F0F = poi_shop_gps, Garmin Dealer 0, 0x2F10 = poi_personal_service, Personal Service 0, 0x2F11 = poi_business_service, Business Service 0, 0x2F12 = poi_communication, Communication 0, 0x2F13 = poi_repair_service, Repair Service 0, 0x2F14 = poi_social_service, Social Service 0, 0x2F15 = poi_public_utilities, Utility 0, 0x2F16 = poi_truck_stop, Truck Stop 0, 0x2F17 = poi_bus_stop, Bus Stop 0, 0x3000 = poi_emergency, generic emergency/government 0, 0x3001 = poi_police, Police Station 0, 0x3002 = poi_hospital, Hospital 0, 0x3003 = poi_public_office, Public Office 0, 0x3004 = poi_justice, Justice 0, 0x3005 = poi_concert, Concert hall(point) 0, 0x3006 = poi_border_station, Border Station(point) 0, 0x3007 = poi_goverment_building, Goverment Building 0, 0x3008 = poi_firebrigade, FireFighters Station 0, 0x4000-0x403F = poi_golf, Golf 0, 0x4100-0x413F = poi_fish, Fish 0, 0x4200-0x423F = poi_wreck, Wreck 0, 0x4300-0x433F = poi_marina, Marina 0, 0x4400-0x443F = poi_fuel, Gas 0, 0x4500-0x453F = poi_restaurant, Restaurant 0, 0x4600-0x463F = poi_bar, Bar 0, 0x4700-0x473F = poi_boat_ramp, Boat Ramp 0, 0x4800-0x483F = poi_camping, Camping 0, 0x4900-0x493F = poi_park, Park 0, 0x4A00-0x4A3F = poi_picnic, Picnic Area 0, 0x4B00-0x4B3F = poi_hospital, Hospital 0, 0x4C00-0x4C3F = poi_information, Information 0, 0x4D00-0x4D3F = poi_car_parking, Parking 0, 0x4E00-0x4E3F = poi_restroom, Restroom 0, 0x4F00-0x4F3F = poi_shower, Shower 0, 0x5000-0x503F = poi_drinking_water, Drinking Water 0, 0x5100-0x513F = poi_telephone, Telephone 0, 0x5200-0x523F = poi_scenic_area, Scenic Area 0, 0x5300-0x533F = poi_skiing, Skiing 0, 0x5400-0x543F = poi_swimming, Swimming 0, 0x5500-0x553F = poi_dam, Dam 0, 0x5600-0x563F = poi_forbidden_area, Forbiden Area 0, 0x5700-0x573F = poi_danger_area, Danger Area 0, 0x5800-0x583F = poi_restricted_area, Restricted Area 0, 0x5900 = poi_airport, Generic Airport 0, 0x5901 = poi_airport, Large Airport 0, 0x5902 = poi_airport, Medium Airport 0, 0x5903 = poi_airport, Small Airport 0, 0x5904 = poi_heliport, Heliport 0, 0x5905-0x593F = poi_airport, Airport 0, 0x5a00 = poi_mark, Kilometer Pole 0, 0x5b00 = poi_mark, Kolokol 0, 0x5c00 = poi_diving, Diving Place 0, 0x5D00-0x5D3F = poi_daymark, Daymark,Green Square 0, 0x5E00-0x5E3F = poi_daymark, Daymark,Red Triangle 0, 0x6000 = poi_loudspeaker, LoudSpeaker 0, 0x6100 = poi_building, House 0, 0x6200 = poi_height, Height with point in feet one decimal place 0, 0x6300 = poi_height, Height without point in feet no decimal place 0, 0x6400 = poi_manmade_feature, Manmade Feature 0, 0x6401 = poi_bridge, Bridge 0, 0x6402 = poi_building, Building 0, 0x6403 = poi_cemetery, Cemetery 0, 0x6404 = poi_church, Church 0, 0x6405 = poi_townhall, Civil 0, 0x6406 = poi_crossing, Crossing 0, 0x6407 = poi_dam, Dam 0, 0x6408 = poi_hospital, Hospital 0, 0x6409 = poi_levee, Levee 0, 0x640A = poi_locale, Locale 0, 0x640B = poi_military, Military 0, 0x640C = poi_mine, Mine 0, 0x640D = poi_oil_field, Oil Field 0, 0x640E = poi_park, Park 0, 0x640F = poi_post_office, Post 0, 0x6410 = poi_school, School 0, 0x6411 = poi_tower, Tower 0, 0x6412 = poi_trail, Trail 0, 0x6413 = poi_tunnel, Tunnel 0, 0x6414 = poi_drinking_water, Drink water 0, 0x6415 = town_ghost, Ghost Town 0, 0x6416 = poi_ruins, Subdivision 0, 0x6500 = poi_water_feature, Water Feature 0, 0x6501 = poi_water_feature, Arroyo 0, 0x6502 = poi_water_feature, Sand Bar 0, 0x6503 = poi_bay, Bay 0, 0x6504 = poi_bend, Bend 0, 0x6505 = poi_water_feature, Canal 0, 0x6506 = poi_water_feature, Channel 0, 0x6507 = poi_cove, Cove 0, 0x6508 = poi_water_feature, Falls 0, 0x6509 = poi_water_feature, Geyser 0, 0x650A = poi_water_feature, Glacier 0, 0x650B = poi_marine, Harbour 0, 0x650C = poi_island, Island 0, 0x650D = poi_water_feature, Lake 0, 0x650E = poi_water_feature, Rapids 0, 0x650F = poi_water_feature, Reservoir 0, 0x6510 = poi_water_feature, Sea 0, 0x6511 = poi_water_feature, Spring 0, 0x6512 = poi_water_feature, Stream 0, 0x6513 = poi_water_feature, Swamp 0, 0x6600 = poi_land_feature, Land Feature 0, 0x6601 = poi_land_feature, Arch 0, 0x6602 = poi_land_feature, Area 0, 0x6603 = poi_land_feature, Basin 0, 0x6604 = poi_land_feature, Beach 0, 0x6605 = poi_land_feature, Bench 0, 0x6606 = poi_land_feature, Cape 0, 0x6607 = poi_land_feature, Cliff 0, 0x6608 = poi_land_feature, Crater 0, 0x6609 = poi_land_feature, Flat 0, 0x660A = poi_land_feature, Forest 0, 0x660B = poi_land_feature, Gap 0, 0x660C = poi_land_feature, Gut 0, 0x660D = poi_land_feature, Isthmus 0, 0x660E = poi_land_feature, Lava 0, 0x660F = poi_land_feature, Pillar 0, 0x6610 = poi_land_feature, Plain 0, 0x6611 = poi_land_feature, Range 0, 0x6612 = poi_land_feature, Reserve 0, 0x6613 = poi_land_feature, Ridge 0, 0x6614 = poi_land_feature, Rock 0, 0x6615 = poi_land_feature, Slope 0, 0x6616 = poi_land_feature, Summit 0, 0x6617 = poi_land_feature, Valley 0, 0x6618 = poi_land_feature, Woods # This are dublicated to 0x1700, 0x1800, 0x1900, 0x1A00, 0x1B00 # fix them if you need them 0, 0x1600 = poi_marine_type, Beakon 0, 0x1601 = poi_marine_type, Fog Horn 0, 0x1602 = poi_marine_type, Radio Beacon 0, 0x1603 = poi_marine_type, Racon 0, 0x1604 = poi_marine_type, Day Beacon, red triangle 0, 0x1605 = poi_marine_type, Day Beacon, green square 0, 0x1606 = poi_marine_type, Day Beacon, white diamond 0, 0x1607 = poi_marine_type, unlit Navaid, white 0, 0x1608 = poi_marine_type, unlit Navaid, red 0, 0x1609 = poi_marine_type, unlit Navaid, green 0, 0x160a = poi_marine_type, unlit Navaid, black 0, 0x160b = poi_marine_type, unlit Navaid, yellow or amber 0, 0x160c = poi_marine_type, unlit Navaid, orange 0, 0x160d = poi_marine_type, unlit Navaid, multi colored 0, 0x160e = poi_marine_type, Navaid, unknown 0, 0x160f = poi_marine_type, lighted Navaid, white 0, 0x1610 = poi_marine_type, lighted Navaid, red 0, 0x1611 = poi_marine_type, lighted Navaid, green 0, 0x1612 = poi_marine_type, lighted Navaid, yellow or amber 0, 0x1613 = poi_marine_type, lighted Navaid, orange 0, 0x1614 = poi_marine_type, lighted Navaid, violet 0, 0x1615 = poi_marine_type, lighted Navaid, blue 0, 0x1616 = poi_marine_type, lighted Navaid, multi colored # RGN2-4 types # Marine types start 1, 0x0100 = point_unkn, Light 1, 0x0102 = point_unkn, Light with north topmark 1, 0x0103 = point_unkn, Light with south topmark 1, 0x0104 = point_unkn, Light with east topmark 1, 0x0105 = point_unkn, Light with west topmark 1, 0x0106 = point_unkn, Isolated danger light 1, 0x0107 = point_unkn, Port hand light 1, 0x0108 = point_unkn, Starboard hand light 1, 0x0109 = point_unkn, Special purpose light 1, 0x010a = point_unkn, Safe water light 1, 0x0200 = point_unkn, Buoy 1, 0x0201 = point_unkn, Buoy 1, 0x0202 = point_unkn, Buoy with north topmark 1, 0x0203 = point_unkn, Buoy with south topmark 1, 0x0204 = point_unkn, Buoy with east topmark 1, 0x0205 = point_unkn, Buoy with west topmark 1, 0x0206 = point_unkn, Beacon 1, 0x0207 = point_unkn, Spar buoy 1, 0x0208 = point_unkn, Isolated danger buoy 1, 0x0209 = point_unkn, Port hand buoy 1, 0x020a = point_unkn, Starboard hand buoy 1, 0x020b = point_unkn, Special purpose buoy 1, 0x020c = point_unkn, Safe water buoy 1, 0x020d = point_unkn, Platform buoy 1, 0x020e = point_unkn, Beacon with north topmark 1, 0x020f = point_unkn, Beacon with south north topmark 1, 0x0210 = point_unkn, Beacon with east topmark 1, 0x0211 = point_unkn, Beacon with west topmark 1, 0x0212 = point_unkn, Isolated danger beacon 1, 0x0213 = point_unkn, Port hand beacon 1, 0x0214 = point_unkn, Starboard hand beacon 1, 0x0215 = point_unkn, Special purpose beacon 1, 0x0216 = point_unkn, Mooring buoy 1, 0x0217 = point_unkn, Fixed point 1, 0x0218 = point_unkn, Pole 1, 0x0300 = point_unkn, Depth point 1, 0x0301 = point_unkn, Depth point invisible 1, 0x0302 = point_unkn, Depth point underscore 1, 0x0303 = point_unkn, Spot height 1, 0x0304 = point_unkn, Building 1, 0x0305 = point_unkn, Chimney 1, 0x0306 = point_unkn, Church 1, 0x0307 = point_unkn, Tanks 1, 0x0308 = point_unkn, Tower 1, 0x0309 = point_unkn, Rock 1, 0x030a = point_unkn, Triangulation point 1, 0x030b = point_unkn, Radio mast 1, 0x0400 = point_unkn, Isolated danger 1, 0x0401 = point_unkn, Obstruction 1, 0x0402 = point_unkn, Wreck 1, 0x0403 = point_unkn, Exposed wreck 1, 0x0404 = point_unkn, Well 1, 0x0405 = point_unkn, Foul 1, 0x0406 = point_unkn, Explosive 1, 0x0407 = point_unkn, Fish haven 1, 0x0408 = point_unkn, Obstruction that covers 1, 0x0409 = point_unkn, Marine farm 1, 0x040a = point_unkn, Dangerous rock 1, 0x040b = point_unkn, No bottom found 1, 0x040c = point_unkn, Exposed rock 1, 0x040d = point_unkn, Dangerous rock 1, 0x040e = point_unkn, Underwater rock (non-dangerous rock) 1, 0x040f = point_unkn, Shoal 1, 0x0500 = point_unkn, Label point 1, 0x0600 = point_unkn, Centered label 1, 0x0700 = point_unkn, Miscellaneous point 1, 0x0701 = point_unkn, Recommended anchorage 1, 0x0702 = point_unkn, Pilot boarding place 1, 0x0703 = point_unkn, Yacht harbour 1, 0x0704 = point_unkn, Pile 1, 0x0705 = point_unkn, Anchoring prohibited 1, 0x0706 = point_unkn, Fishing prohibited 1, 0x0707 = point_unkn, Precautionary area 1, 0x0708 = point_unkn, Radio report point 1, 0x0709 = point_unkn, Anchorage berths 1, 0x070a = point_unkn, Rescue station 1, 0x070b = point_unkn, Fishing harbour 1, 0x070c = point_unkn, Airport 1, 0x0800 = point_unkn, Information 1, 0x0901 = point_unkn, Bottom conditions 1, 0x0902 = point_unkn, Fishing information 1, 0x0903 = point_unkn, Facility # NT types start 1, 0x0b00 = poi_dining, Dining(Other) 1, 0x0b04 = poi_dining, Dining(Chinese) 1, 0x0b05 = poi_dining, Dining (Deli/Bakery) 1, 0x0b06 = poi_dining, Dining (International) 1, 0x0b07 = poi_fastfood, Fast Food 1, 0x0b09 = poi_dining, Dining(Mexican) 1, 0x0b0a = poi_dining, Dining(Pizza) 1, 0x0b0b = poi_dining, Dining (Sea Food) 1, 0x0b0c = poi_dining, Dining (Steak/Grill) 1, 0x0b0d = poi_dining, Dining(Bagel/Donut) 1, 0x0b0e = poi_dining, Dining(Cafe/Diner) 1, 0x0c01 = poi_hotel, Hotel/Motel 1, 0x0c02 = poi_hotel, Bed & Breakfast inn 1, 0x0c03 = poi_camp_rv, Camping/RV-Park 1, 0x0c04 = poi_resort, Resort 1, 0x0d01 = poi_attraction, Amusement Park 1, 0x0d02 = poi_museum_history, Museum/History 1, 0x0d03 = poi_fair, Fair, Conference(point) 1, 0x0d04 = poi_scenic_area, Scenic Area 1, 0x0d05 = poi_school, School 1, 0x0d06 = poi_park, Park 1, 0x0d07 = poi_zoo, Zoo 1, 0x0d08 = poi_stadium, Sportpark, Stadium 1, 0x0d0a = poi_bar, Wine Bar 1, 0x0d14 = poi_hospital, Hospital 1, 0x0e01 = poi_theater, Theater 1, 0x0e02 = poi_bar, Bar 1, 0x0e03 = poi_cinema, Cinema 1, 0x0e04 = poi_casino, Casino 1, 0x0e05 = poi_golf, Golf 1, 0x0e06 = poi_skiing, Skiing Center/Lift 1, 0x0e07 = poi_bar, Night Bar/Piano 1, 0x0e08 = poi_icesport, Ice/Sporting 1, 0x0e09 = poi_swimming, Swimming 1, 0x0e0a = poi_sport, Sports(point) 1, 0x0f00 = poi_hotel, Hotel(Other) 1, 0x0f01 = poi_shop_department, Department Store 1, 0x0f02 = poi_shop_grocery, Grocery 1, 0x0f03 = poi_hotel, Hotel/Motel 1, 0x0f04 = poi_resort, Resort 1, 0x0f05 = poi_pharmacy, Pharmacy 1, 0x1001 = poi_fuel, Fuel/Gas 1, 0x1002 = poly_car_parking, Parking Lot 1, 0x1003 = poi_autoservice, Car Repair 1, 0x1004 = poi_airport, Airport 1, 0x1005 = poi_post_office, Post Office 1, 0x1006 = poi_bank, Bank 1, 0x1008 = poi_bus_station, Bus station 1, 0x1009 = poi_marina, SeaPort 1, 0x100a = poi_wrecker, Wrecker Service 1, 0x100b = poi_car_parking, Parking 1, 0x100d = poi_car_dealer_parts, Car Dealer(point) 1, 0x100e = poi_car_wash, Car Wash 1, 0x1011 = poi_bussines_service, Business Service 1, 0x1012 = poi_communication, Communication 1, 0x1013 = poi_repair_service, Repair Service 1, 0x1014 = poi_social_service, Social Service 1, 0x1015 = poi_public_utilities, Utility 1, 0x1101 = poi_police, Police Station 1, 0x1102 = poi_hospital, Hospital 1, 0x1104 = poi_justice, Justice 1, 0x1107 = poi_public_office, Public Office 1, 0x1400 = town_label_1e5, Megapolis (10M +) 1, 0x1401 = town_label_5e4, Megapolis (5-10M) 1, 0x1402 = town_label_2e4, Big City (2-5M) 1, 0x1403 = town_label_5e3, Big City (0.5-1M) 1, 0x1404 = town_label_2e3, City (200-500k) 1, 0x1405 = town_label_1e3, City (100-200k) 1, 0x1406 = town_label_5e2, City (50-100k) 1, 0x1405 = town_label_2e2, City (20-50k) 1, 0x1406 = town_label_1e2, City (10-20k) 1, 0x1407 = town_label_5e1, Small City (5-10k) 1, 0x1408 = town_label_2e1, Small City (2-5k) 1, 0x1409 = town_label_1e1, Village (1-2k) 1, 0x140a = town_label_5e0, Village (500-1000) 1, 0x140b = town_label_2e0, Village (200-500) 1, 0x140c = town_label_1e0, Village (100-200) 1, 0x140d = town_label_0e0, Village (0-100) 1, 0x1500 = poi_personal_service, Personal Service 1, 0x1501 = poi_bussines_service, Bussines Service POLYLINE 0, 0x00 = street_1_land, Road 0, 0x01 = highway_land, Major HWY thick 0, 0x02 = street_4_land, Principal HWY-thick 0, 0x03 = street_2_land, Principal HWY-medium 0, 0x04 = street_3_city, Arterial Road-medium 0, 0x05 = street_4_city, Arterial Road-thick 0, 0x06 = street_2_city, Road-thin 0, 0x07 = street_1_city, Alley-thick 0, 0x08 = ramp, Ramp 0, 0x09 = ramp, Ramp highspeed 0, 0x0a = street_0, Unpaved Road-thin 0, 0x0b = ramp, Major HWY Connector-thick 0, 0x0c = roundabout, Roundabout 0, 0x0d = street_unkn, Custom defined street 1 0, 0x0e = street_unkn, Custom defined street 2 0, 0x0f = street_unkn, Custom defined street 3 0, 0x10 = street_unkn, Custom defined street 4 0, 0x11 = street_unkn, Custom defined street 5 0, 0x12 = street_unkn, Custom defined street 6 0, 0x13 = street_unkn, Custom defined street 7 0, 0x14 = rail, Railroad 0, 0x15 = water_line, Shoreline 0, 0x16 = street_nopass, Trail 0, 0x18 = water_line, Stream-thin 0, 0x19 = time_zone, Time-Zone 0, 0x1a = ferry, Ferry 0, 0x1b = ferry, Ferry 0, 0x1c = border_country, Political Boundary 0, 0x1d = border_country, County Boundary 0, 0x1e = border_country, Intl. Boundary 0, 0x1f = water_line, River 0, 0x20 = height_line_1, Land Contour (thin) Height in feet 0, 0x21 = height_line_2, Land Contour (medium) Height in feet 0, 0x22 = height_line_3, Land Contour (thick) Height in feet 0, 0x23 = depth_line_1, Depth Contour (thin) Depth in feet 0, 0x24 = depth_line_2, Depth Contour (medium) Depth in feet 0, 0x25 = depth_line_3, Depth Contour (thick) Depth in feet 0, 0x26 = water_line, Intermittent River 0, 0x27 = street_nopass, Airport Runway 0, 0x28 = pipeline, Pipeline 0, 0x29 = powerline, Powerline 0, 0x2a = marine_boundary, Marine Boundary (no line) 0, 0x2b = marine_hazard, Marine Hazard (no line) # RGN2-4 # Marine 1, 0x0100 = street_unkn, Miscellaneous line 1, 0x0101 = street_unkn, Line 1, 0x0102 = street_unkn, Cartographic line 1, 0x0103 = street_unkn, Road 1, 0x0104 = street_unkn, Clearing line 1, 0x0105 = street_unkn, Contour line 1, 0x0106 = street_unkn, Overhead cable 1, 0x0107 = street_unkn, Bridge 1, 0x0108 = street_unkn, Recommended route 1, 0x0109 = street_unkn, Chart border 1, 0x0300 = street_unkn, Depth contour 1, 0x0301 = street_unkn, Depth contour value 1, 0x0307 = street_unkn, Intertidal zone border 1, 0x0400 = street_unkn, Obstruction line 1, 0x0401 = street_unkn, Submarine cable 1, 0x0402 = street_unkn, Submarine pipeline 1, 0x0403 = street_unkn, Pile barrier 1, 0x0404 = street_unkn, Fishing stakes 1, 0x0405 = street_unkn, Supply pipeline area 1, 0x0406 = street_unkn, Submarine cable area 1, 0x0407 = street_unkn, Dumping ground 1, 0x0408 = street_unkn, Explosive dumping ground 1, 0x0409 = street_unkn, Danger line 1, 0x040a = street_unkn, Overhead cable 1, 0x040b = street_unkn, Submerged construction 1, 0x040c = street_unkn, Pier/jetty 1, 0x0500 = street_unkn, Restriction 1, 0x0501 = street_unkn, Anchoring prohibited 1, 0x0502 = street_unkn, Fishing prohibited 1, 0x0503 = street_unkn, Prohibited area 1, 0x0504 = street_unkn, Military practice area 1, 0x0505 = street_unkn, Anchoring and fishing prohibited 1, 0x0506 = street_unkn, Limit of nature reservation 1, 0x0507 = street_unkn, Restricted area 1, 0x0508 = street_unkn, Minefield 1, 0x0600 = street_unkn, Miscellaneous line 1, 0x0601 = street_unkn, Cartographic line 1, 0x0602 = street_unkn, Traffic separation line 1, 0x0603 = street_unkn, International maritime boundary 1, 0x0604 = street_unkn, Straight territorial sea baseline 1, 0x0605 = street_unkn, Seaward limit of territorial sea 1, 0x0606 = street_unkn, Anchorage area 1, 0x0607 = street_unkn, Quarantine anchorage area 1, 0x0608 = street_unkn, Fishery zone 1, 0x0609 = street_unkn, Swept area 1, 0x060a = street_unkn, Traffic separation zone 1, 0x060b = street_unkn, Limit of exclusive economic zone 1, 0x060c = street_unkn, Established direction of traffic flow 1, 0x060d = street_unkn, Recommended direction of traffic flow 1, 0x060e = street_unkn, Harbour limit 1, 0x060f = street_unkn, Inadequately surveyed area 1, 0x0610 = street_unkn, Inshore traffic zone 1, 0x0611 = street_unkn, Limit of traffic lane 1, 0x0701 = street_unkn, River channel 1, 0x0702 = street_unkn, Submerged object 1, 0x0703 = street_unkn, Submerged object 1, 0x0704 = street_unkn, Submerged object 1, 0x0705 = street_unkn, Submerged object 1, 0x0706 = street_unkn, Chart boundary # NT types 1, 0x0a00 = water_line, River 1, 0x0a01 = water_line, Small River 1, 0x0a19 = street_unkn, Dry Creek 1, 0x0b04 = border_country, Country Border POLYGONE 0, 0x01 = poly_town, City (>200k) 0, 0x02 = poly_town, City (<200k) 0, 0x03 = poly_town, Village 0, 0x04 = poly_military_zone, Military 0, 0x05 = poly_car_parking, Parking Lot 0, 0x06 = poly_car_parking, Parking Garage 0, 0x07 = poly_airport, Airport 0, 0x08 = poly_commercial_center, Shopping Center 0, 0x09 = poly_marine, Marina 0, 0x0a = poly_university, University/College 0, 0x0b = poly_hospital, Hospital 0, 0x0c = poly_industry, Industrial 0, 0x0d = area, Reservation 0, 0x0e = poly_airport, Airport Runway 0, 0x13 = area_unspecified, Man made area 0, 0x14 = poly_national_park, National park 0, 0x15 = poly_national_park, National park 0, 0x16 = poly_nature_park, National park 0, 0x17 = poly_park, City Park 0, 0x18 = poly_golf_course, Golf 0, 0x19 = poly_sport, Sport 0, 0x1a = poly_cemetery, Cemetery 0, 0x1e = poly_nature_park, State Park 0, 0x1f = poly_park, State Park 0, 0x20 = poly_park, State Park 0, 0x28 = poly_water, Ocean 0, 0x29 = poly_water, Water Reservour 0, 0x32 = poly_water, Sea 0, 0x3b = poly_water, Water Reservour 0, 0x3c = poly_water, Lake (250-600 km2) 0, 0x3d = poly_water, Lake (77-250 km2) 0, 0x3e = poly_water, Lake (25-77 km2) 0, 0x3f = poly_water, Lake (11-25 km2) 0, 0x40 = poly_water, Lake (0.25-11 km2) 0, 0x41 = poly_water, Lake (<0.25 km2) 0, 0x42 = poly_water, Lake (>3.3k km2) 0, 0x43 = poly_water, Lake (1.1-3.3k km2) 0, 0x44 = poly_water, Lake (0.6-1.1k km2) 0, 0x45 = poly_water, Water Reservour 0, 0x46 = poly_water, River (>1km) 0, 0x47 = poly_water, River (200m-1km) 0, 0x48 = poly_water, River (40-200m) 0, 0x49 = poly_water, River (<40m) 0, 0x4a = area, Definition Area 0, 0x4b = area, Background 0, 0x4c = poly_water, Intermittent River/Lake 0, 0x4d = poly_glacier, Glaciers 0, 0x4e = plantation, Orchard or plantation 0, 0x4f = poly_scrub, Scrub 0, 0x50 = poly_wood, Woods 0, 0x51 = poly_wetland, Wetland 0, 0x52 = tundra, Tundra 0, 0x53 = poly_flats, Flats # RGN2-4 # Marine 1, 0x0100 = street_unkn, Land - white 1, 0x0101 = street_unkn, Land - non-urban 1, 0x0102 = street_unkn, Land - urban 1, 0x0103 = street_unkn, Chart exclusion area 1, 0x0104 = street_unkn, Chart background 1, 0x0105 = street_unkn, Bridge 1, 0x0300 = street_unkn, Depth area - white 1 1, 0x0301 = street_unkn, Intertidal zone 1, 0x0302 = street_unkn, Depth area - blue 1 1, 0x0303 = street_unkn, Depth area - blue 2 1, 0x0304 = street_unkn, Depth area - blue 3 1, 0x0305 = street_unkn, Depth area - blue 4 1, 0x0306 = street_unkn, Depth area - blue 5 1, 0x0307 = street_unkn, Depth area - white 1, 0x0400 = street_unkn, Obstruction (invisible) 1, 0x0401 = street_unkn, Submarine cable (invisible) 1, 0x0402 = street_unkn, Submarine pipeline (invisible) 1, 0x0403 = street_unkn, Pile barrier (invisible) 1, 0x0404 = street_unkn, Fishing stakes (invisible) 1, 0x0405 = street_unkn, Supply pipeline area/line (invisible) 1, 0x0406 = street_unkn, Submarine cable area/line (invisible) 1, 0x0407 = street_unkn, Dumping ground (invisible) 1, 0x0408 = street_unkn, Explosive dumping ground (invisible) 1, 0x0409 = street_unkn, Danger line (invisible) 1, 0x040a = street_unkn, Overhead cable (invisible) 1, 0x040b = street_unkn, Submerged construction (invisible) 1, 0x040c = street_unkn, Pier/jetty (invisible) 1, 0x0500 = street_unkn, Restriction area/line (invisible) 1, 0x0501 = street_unkn, Anchoring prohibited (invisible) 1, 0x0502 = street_unkn, Fishing prohibited (invisible) 1, 0x0503 = street_unkn, Prohibited area (invisible) 1, 0x0504 = street_unkn, Military practice area (invisible) 1, 0x0505 = street_unkn, Anchoring and fishing prohibited (invisible) 1, 0x0506 = street_unkn, Limit of nature reservation (invisible) 1, 0x0507 = street_unkn, Restricted area (invisible) 1, 0x0508 = street_unkn, Minefield (invisible) 1, 0x0600 = street_unkn, Miscellaneous area 1, 0x0601 = street_unkn, Cartographic area 1, 0x0602 = street_unkn, Traffic separation area 1, 0x0603 = street_unkn, International maritime boundary 1, 0x0604 = street_unkn, Straight territorial sea baseline 1, 0x0605 = street_unkn, Seaward limit of territorial sea 1, 0x0606 = street_unkn, Anchorage area 1, 0x0607 = street_unkn, Quarantine anchorage area 1, 0x0608 = street_unkn, Fishery zone 1, 0x0609 = street_unkn, Swept area 1, 0x060a = street_unkn, Traffic separation zone 1, 0x060b = street_unkn, Limit of exclusive economic zone 1, 0x060c = street_unkn, Established direction of traffic flow 1, 0x0701 = street_unkn, Fishing area 1, 0x0702 = street_unkn, Restricted area 1, 0x0703 = street_unkn, Anchorage area 1, 0x0704 = street_unkn, Fishing Hot Spots chart # NT types 1, 0x0800 = poly_town, Large City 1, 0x0801 = poly_town, City 1, 0x0900 = poly_plaza, Square/Place 1, 0x0902 = poly_car_parking, Car Park (Parking Lot) 1, 0x0904 = poly_airport, Airport 1, 0x090d = poly_sports_stadium, Stage like circus/sport/stadium 1, 0x090e = poly_cemetery, Graveyard/Cemetery 1, 0x0a01 = poly_national_park, National Park 1, 0x0a04 = poly_park, City Park 1, 0x0a05 = poly_nature_park, Nature Park 1, 0x0a06 = street_unkn, Dam/Man made/ ?? 1, 0x0b02 = poly_water, Sea 1, 0x0b03 = poly_water, Water Reservour 1, 0x0b07 = poly_water, Dam/Lake 1, 0x0b08 = poly_water, Dam/Lake 1, 0x0b0c = poly_water, River navit-0.5.0~svn5643+dfsg.1/navit/map/garmin/gentypes.c000066400000000000000000000071041221777731700223570ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ /* File format is: POINT GROUP,0x0100 = town_label_1e5, Megapolis (10M +) GROUP,0x0200 = town_label_5e4, Megapolis (5-10M) ... GROUP,0x1e00-0x1e3f = district_label, District, Province, State Name ... POLYLINE GROUP,0x00 = street_1_land, Road GROUP,0x01 = highway_land, Major HWY thick GROUP,0x02 = street_4_land, Principal HWY-thick GROUP,0x03 = street_2_land, Principal HWY-medium .... POLYGONE GROUP,0x01 = town_poly, City (>200k) GROUP,0x02 = town_poly, City (<200k) GROUP,0x03 = town_poly, Village GROUP is 0 - good old garmin types in RGN1 1 - NT types in RGN2-4 5 is completely unknown yet */ #include #include #include #include #include "item.h" #include "gar2navit.h" #define dlog(x, y...) fprintf(stderr, ## y) /* static int add_def(struct gar2nav_conv *conv, int type, unsigned short minid, unsigned short maxid, unsigned int routable, char *ntype, char *descr) */ static void print_header(FILE *fp) { fprintf(fp, "// This is autogenerated file -- DO NOT EDIT\n"); fprintf(fp, "struct gar2nav_conv *g2n_default_conv(void)\n" "{\n" "\tstruct gar2nav_conv *conv;\n" "\n" "\tconv = calloc(1, sizeof(*conv));\n" "\tif (!conv)\n" "\t\treturn conv;\n"); } static int load_types_file(char *file, char *out) { char buf[4096]; char descr[4096]; char ntype[4096]; FILE *fp; unsigned int minid, maxid, group; int rc; int type = -1; FILE *fpout = stdout; fp = fopen(file, "r"); if (!fp) return -1; if (out) { fpout = fopen(out, "w"); if (!fpout) return -1; } print_header(fpout); while (fgets(buf, sizeof(buf), fp)) { if (*buf == '#' || *buf == '\n') continue; if (!strncasecmp(buf, "POINT", 5)) { type = 1; continue; } else if (!strncasecmp(buf, "POI", 3)) { type = 1; continue; } else if (!strncasecmp(buf, "POLYLINE", 8)) { type = 2; continue; } else if (!strncasecmp(buf, "POLYGONE", 8)) { type = 3; continue; } rc = sscanf(buf, "%d, 0x%04X - 0x%04X = %[^\t , ] , %[^\n]", &group, &minid, &maxid, ntype, descr); if (rc != 5) { maxid = 0; rc = sscanf(buf, "%d, 0x%04X = %[^\t, ], %[^\n]", &group,&minid, ntype, descr); if (rc != 4) { dlog(1, "Invalid line rc=%d:[%s]\n",rc, buf); dlog(1, "minid=%04X ntype=[%s] des=[%s]\n", minid, ntype, descr); continue; } } fprintf(fpout, "\tadd_def(conv, %d, %#.04x, %#.04x, %d, \"%s\", \"%s\");\n", type, minid, maxid, group, ntype, descr); } fprintf(fpout, "\treturn conv;\n"); fprintf(fpout, "}\n"); fclose(fp); if (out) fclose(fpout); return 1; } int main(int argc, char **argv) { if (argc!=3) { fprintf(stderr, "Usage: %s garmintypes.txt outfile.c\n", argv[0]); return -1; } if (load_types_file(argv[1], argv[2]) < 0) { unlink(argv[2]); return -1; } return 0; } navit-0.5.0~svn5643+dfsg.1/navit/map/garmin_img/000077500000000000000000000000001221777731700212075ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/garmin_img/Makefile.am000066400000000000000000000003751221777731700232500ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_garmin_img modulemap_LTLIBRARIES = libmap_garmin_img.la libmap_garmin_img_la_SOURCES = garmin_img.c libmap_garmin_img_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/map/garmin_img/garmin_img.c000066400000000000000000001036051221777731700234710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "plugin.h" #include "data.h" #include "projection.h" #include "map.h" #include "maptype.h" #include "item.h" #include "attr.h" #include "coord.h" #include "transform.h" #include #include "attr.h" #include "coord.h" struct file { FILE *f; int offset; }; int shift=5; int subdiv_next=0x10; static void * file_read(struct file *f, int offset, int size) { void *ptr; int ret; ptr=calloc(size, 1); if (! ptr) return ptr; fseek(f->f, f->offset+offset, SEEK_SET); ret=fread(ptr, size, 1, f->f); if (ret != 1) { printf("fread %d vs %d offset %d+%d(0x%x)\n", ret, size, f->offset, offset,offset); g_assert(1==0); } return ptr; } static void file_free(void *ptr) { free(ptr); } struct offset_len { int offset; int length; } __attribute ((packed)); static void dump_offset_len(struct offset_len *off_len) { printf("offset: 0x%x(%d) length 0x%x(%d)\n", off_len->offset, off_len->offset, off_len->length, off_len->length); } struct timestamp { short creation_year; char creation_month; char creation_day; char creation_hour; char creation_minute; char creation_second; } __attribute__((packed)); struct img_header { char xor; char zero1[9]; char update_month; char update_year; char zero2[3]; char checksum[1]; char signature[7]; char unknown1[1]; char unknown2[2]; char unknown3[2]; char unknown4[2]; char unknown5[2]; char zero3[25]; struct timestamp ts; char unknown6; char map_file_identifier[7]; char unknown12; char map_description1[20]; short unknown13; short unknown14; char e1; char e2; char other[413]; char zero4[512]; char unknown7; char unknown8[11]; int file_offset; char unknown9; char unknown10[15]; char unknown11[480]; } __attribute__((packed)); static void dump_ts(struct timestamp *ts) { printf("%d-%02d-%02d %02d:%02d:%02d\n", ts->creation_year, ts->creation_month, ts->creation_day, ts->creation_hour, ts->creation_minute, ts->creation_second); } #if 0 static void dump_img(struct img_header *img_hdr) { printf("signature: '%s'\n", img_hdr->signature); printf("creation: "); dump_ts(&img_hdr->ts); printf("map_file_identifier: '%s'\n", img_hdr->map_file_identifier); printf("file_offset: 0x%x\n", img_hdr->file_offset); printf("e1: 0x%x(%d)\n", img_hdr->e1, img_hdr->e1); printf("e2: 0x%x(%d)\n", img_hdr->e2, img_hdr->e2); printf("offset 0x%x\n", (int) &img_hdr->e1 - (int) img_hdr); printf("size %d\n", sizeof(*img_hdr)); } #endif struct fat_block { char flag; char filename[8]; char type[3]; int size; char zero1; char part; char zero[14]; unsigned short blocks[240]; } __attribute__((packed)); #if 0 static void dump_fat_block(struct fat_block *fat_blk) { int i=0; char name[9]; char type[4]; printf("flag: 0x%x(%d)\n", fat_blk->flag, fat_blk->flag); strcpy(name, fat_blk->filename); name[8]='\0'; strcpy(type, fat_blk->type); type[3]='\0'; printf("name: '%s.%s'\n", name, type); printf("size: 0x%x(%d)\n", fat_blk->size, fat_blk->size); printf("part: 0x%x(%d)\n", fat_blk->part, fat_blk->part); printf("blocks: "); while (i < 240) { printf("0x%x(%d) ",fat_blk->blocks[i], fat_blk->blocks[i]); if (fat_blk->blocks[i] == 0xffff) break; i++; } printf("size: %d\n", sizeof(*fat_blk)); } #endif struct file_header { short header_len; char type[10]; char unknown1; char unknown2; struct timestamp ts; } __attribute__((packed)); static void dump_file(struct file_header *fil_hdr) { printf("header_len: %d\n", fil_hdr->header_len); printf("type: '%s'\n", fil_hdr->type); printf("unknown1: 0x%x(%d)\n", fil_hdr->unknown1, fil_hdr->unknown1); printf("unknown2: 0x%x(%d)\n", fil_hdr->unknown2, fil_hdr->unknown2); printf("creation: "); dump_ts(&fil_hdr->ts); printf("size %d\n", sizeof(*fil_hdr)); } struct region_header { struct file_header fil_hdr; struct offset_len offset_len; } __attribute__((packed)); #if 0 static void dump_region(struct region_header *rgn_hdr) { dump_offset_len(&rgn_hdr->offset_len); } #endif struct map_priv { int id; char *filename; }; struct map_rect_priv { struct coord_rect r; int limit; struct file tre; struct tree_header *tre_hdr; struct file rgn; struct region_header *rgn_hdr; struct file lbl; struct label_header *lbl_hdr; char *label; int subdiv_level_count; int subdiv_pos; char *subdiv; int rgn_offset; int rgn_end; struct rgn_point *pnt; struct rgn_poly *ply; unsigned char *ply_data; int ply_bitpos; int ply_bitcount; int ply_lngbits; int ply_latbits; int ply_lng; int ply_lat; int ply_lnglimit; int ply_latlimit; int ply_lngsign; int ply_latsign; struct offset_len rgn_items[4]; int rgn_type; int count; FILE *f; long pos; char line[256]; int attr_pos; enum attr_type attr_last; char attrs[256]; char attr[256]; double lat,lng; char lat_c,lng_c; int eoc; struct map_priv *m; struct item item; }; static int map_id; static int contains_coord(char *line) { return g_ascii_isdigit(line[0]); } static int debug=1; static int get_tag(char *line, char *name, int *pos, char *ret) { int len,quoted; char *p,*e,*n; if (debug) printf("get_tag %s from %s\n", name, line); if (! name) return 0; len=strlen(name); if (pos) p=line+*pos; else p=line; for(;;) { while (*p == ' ') { p++; } if (! *p) return 0; n=p; e=index(p,'='); if (! e) return 0; p=e+1; quoted=0; while (*p) { if (*p == ' ' && !quoted) break; if (*p == '"') quoted=1-quoted; p++; } if (e-n == len && !strncmp(n, name, len)) { e++; len=p-e; if (e[0] == '"') { e++; len-=2; } strncpy(ret, e, len); ret[len]='\0'; if (pos) *pos=p-line; return 1; } } return 0; } static void get_line(struct map_rect_priv *mr) { mr->pos=ftell(mr->f); fgets(mr->line, 256, mr->f); } static void map_destroy_garmin_img(struct map_priv *m) { if (debug) printf("map_destroy_garmin_img\n"); g_free(m); } static char * map_charset_garmin_img(struct map_priv *m) { return "iso8859-1"; } static enum projection map_projection_garmin_img(struct map_priv *m) { return projection_garmin; } struct label_data_offset { struct offset_len offset_len; char multiplier; char data; } __attribute ((packed)); #if 0 static void dump_label_data_offset(struct label_data_offset *lbl_dat) { dump_offset_len(&lbl_dat->offset_len); printf("multiplier 0x%x(%d)\n", lbl_dat->multiplier, lbl_dat->multiplier); printf("data 0x%x(%d)\n", lbl_dat->data, lbl_dat->data); } #endif struct label_data { struct offset_len offset_len; short size; int zero; } __attribute ((packed)); static void dump_label_data(struct label_data *lbl_dat) { dump_offset_len(&lbl_dat->offset_len); printf("size 0x%x(%d)\n", lbl_dat->size, lbl_dat->size); } struct tree_header { struct file_header fil_hdr; char boundary[12]; struct offset_len level; struct offset_len subdivision; struct label_data copyright; struct offset_len tre7; short unknown1; char zero1; struct label_data polyline; struct label_data polygon; struct label_data point; int mapid; }; static void dump_tree_header(struct tree_header *tre_hdr) { printf("tree_header:\n"); dump_file(&tre_hdr->fil_hdr); printf("level: "); dump_offset_len(&tre_hdr->level); printf("subdivision: "); dump_offset_len(&tre_hdr->subdivision); printf("copyright: "); dump_label_data(&tre_hdr->copyright); printf("polyline: "); dump_label_data(&tre_hdr->polyline); printf("polygon: "); dump_label_data(&tre_hdr->polygon); printf("point: "); dump_label_data(&tre_hdr->point); printf("len: 0x%x(%d)\n", sizeof(*tre_hdr), sizeof(*tre_hdr)); } struct label_header { struct file_header fil_hdr; struct label_data_offset label; struct label_data country; struct label_data region; struct label_data city; struct label_data poi_index; struct label_data_offset poi_properties; short zero1; char zero2; struct label_data poi_types; struct label_data zip; struct label_data hway; struct label_data exit; struct label_data hway_data; int unknown1; short unknown2; struct offset_len sort_descriptor; struct label_data lbl13; struct label_data lbl14; } __attribute((packed)); #if 0 static void dump_label(struct label_header *lbl_hdr) { dump_file(&lbl_hdr->fil_hdr); printf("label:\n"); dump_label_data_offset(&lbl_hdr->label); printf("country:\n"); dump_label_data(&lbl_hdr->country); printf("region:\n"); dump_label_data(&lbl_hdr->region); printf("city:\n"); dump_label_data(&lbl_hdr->city); printf("poi_index:\n"); dump_label_data(&lbl_hdr->poi_index); printf("poi_properties:\n"); dump_label_data_offset(&lbl_hdr->poi_properties); printf("poi_types:\n"); dump_label_data(&lbl_hdr->poi_types); printf("zip:\n"); dump_label_data(&lbl_hdr->zip); printf("hway:\n"); dump_label_data(&lbl_hdr->hway); printf("exit:\n"); dump_label_data(&lbl_hdr->exit); printf("hway_data:\n"); dump_label_data(&lbl_hdr->hway_data); printf("lbl13:\n"); dump_label_data(&lbl_hdr->lbl13); printf("lbl14:\n"); dump_label_data(&lbl_hdr->lbl14); printf("len: 0x%x(%d)\n", sizeof(*lbl_hdr), sizeof(*lbl_hdr)); } #endif struct triple { unsigned char data[3]; } __attribute((packed)); static unsigned int triple_u(struct triple *t) { return t->data[0] | (t->data[1] << 8) | (t->data[2] << 16); } static int triple(struct triple *t) { int ret=t->data[0] | (t->data[1] << 8) | (t->data[2] << 16); if (ret > 1<<23) ret=ret-(1<<24); return ret; } static void dump_triple_u(struct triple *t) { int val=triple_u(t); printf("0x%x(%d)\n", val, val); } struct tcoord { struct triple lng,lat; } __attribute((packed)); static void dump_tcoord(struct tcoord *t) { printf ("0x%x(%d),0x%x(%d)\n", triple_u(&t->lng), triple_u(&t->lng), triple_u(&t->lat), triple_u(&t->lat)); } struct level { unsigned char zoom; unsigned char bits_per_coord; unsigned short subdivisions; } __attribute((packed)); static void dump_level(struct level *lvl) { printf("level:\n"); printf("\tzoom 0x%x(%d)\n", lvl->zoom, lvl->zoom); printf("\tbits_per_coord 0x%x(%d)\n", lvl->bits_per_coord, lvl->bits_per_coord); printf("\tsubdivisions 0x%x(%d)\n", lvl->subdivisions, lvl->subdivisions); } struct subdivision { struct triple rgn_offset; unsigned char types; struct tcoord center; unsigned short width; unsigned short height; unsigned short next; } __attribute((packed)); static void dump_subdivision(struct subdivision *sub) { printf("subdivision:\n"); printf("\trgn_offset: "); dump_triple_u(&sub->rgn_offset); printf("\ttypes: 0x%x(%d)\n", sub->types, sub->types); printf("\tcenter: "); dump_tcoord(&sub->center); printf("\tsize: 0x%x(%d)x0x%x(%d) %s\n",sub->width & 0x7fff, sub->width & 0x7fff, sub->height, sub->height, sub->width & 0x8000 ? "Terminating" : ""); printf("\tnext: 0x%x(%d)\n",sub->next, sub->next); printf("\tlen: 0x%x(%d)\n", sizeof(*sub), sizeof(*sub)); } struct rgn_point { unsigned char info; struct triple lbl_offset; short lng_delta; short lat_delta; unsigned char subtype; } __attribute((packed)); static void dump_point(struct rgn_point *pnt) { printf("point:\n"); printf("\tinfo 0x%x(%d)\n", pnt->info, pnt->info); printf("\tlbl_offset 0x%x(%d)\n", triple_u(&pnt->lbl_offset), triple_u(&pnt->lbl_offset)); printf("\tlng_delta 0x%x(%d)\n", pnt->lng_delta, pnt->lng_delta); printf("\tlat_delta 0x%x(%d)\n", pnt->lat_delta, pnt->lat_delta); printf("\tsubtype 0x%x(%d)\n", pnt->subtype, pnt->subtype); printf("\tlen: 0x%x(%d)\n", sizeof(*pnt), sizeof(*pnt)); } struct rgn_poly { unsigned char info; struct triple lbl_offset; short lng_delta; short lat_delta; union { struct { unsigned char bitstream_len; unsigned char bitstream_info; } __attribute((packed)) p1; struct { unsigned short bitstream_len; unsigned char bitstream_info; } __attribute((packed)) p2; } __attribute((packed)) u; } __attribute((packed)); static void dump_poly(struct rgn_poly *ply) { printf("poly:\n"); printf("\tinfo 0x%x(%d)\n", ply->info, ply->info); printf("\tlbl_offset 0x%x(%d)\n", triple_u(&ply->lbl_offset), triple_u(&ply->lbl_offset)); printf("\tlng_delta 0x%x(%d)\n", ply->lng_delta, ply->lng_delta); printf("\tlat_delta 0x%x(%d)\n", ply->lat_delta, ply->lat_delta); if (ply->info & 0x80) { printf("\tbitstream_len 0x%x(%d)\n", ply->u.p2.bitstream_len, ply->u.p2.bitstream_len); printf("\tbitstream_info 0x%x(%d)\n", ply->u.p2.bitstream_info, ply->u.p2.bitstream_info); } else { printf("\tbitstream_len 0x%x(%d)\n", ply->u.p1.bitstream_len, ply->u.p1.bitstream_len); printf("\tbitstream_info 0x%x(%d)\n", ply->u.p1.bitstream_info, ply->u.p1.bitstream_info); } printf("\tlen: 0x%x(%d)\n", sizeof(*ply), sizeof(*ply)); } static void dump_hex(void *ptr, int len) { unsigned char *c=ptr; while (len--) { printf("%02x ", *c++); } printf("\n"); } static void dump_hex_r(void *ptr, int len, int rec) { unsigned char *c=ptr; int l=rec; while (len--) { printf("%02x ", *c++); if (! --l) { printf("\n"); l=rec; } } printf("\n"); } #if 0 static void dump_label_offset(struct map_rect_priv *mr, int offset) { void *p; p=file_read(&mr->lbl, mr->lbl_hdr->label.offset_len.offset+offset, 128); printf("%s\n", (char *)p); } #endif #if 0 static void dump_region_item(struct subdivision *sub, struct file *rgn, struct map_rect_priv *mr) { int offset,item_offset,i,j; unsigned short count=0; unsigned short *offsets[4]; unsigned short *file_offsets; struct rgn_point *pnt; offset=triple_u(&sub->rgn_offset)+mr->rgn_hdr->offset_len.offset; file_offsets=file_read(rgn, offset, 90*sizeof(unsigned short)); printf("0x%x ", offset); dump_hex(file_offsets, 90); for (i=0 ; i < 4 ; i++) { printf("i=%d\n", i); if (sub->types & (0x10 << i)) { if (count) { offsets[i]=&file_offsets[count-1]; } else offsets[i]=&count; count++; } else offsets[i]=NULL; } count--; count*=2; for (i=0 ; i < 4 ; i++) { printf("i=%d\n", i); if (offsets[i]) { printf("offset[%d]=0x%x(%d)\n", i, *offsets[i], *offsets[i]); switch (i) { case 0: printf("point\n"); break; case 1: printf("indexed point\n"); break; case 2: printf("polyline\n"); break; case 3: printf("polygon\n"); break; } item_offset=offset+*offsets[i]; switch (i) { case 0: case 1: for (j = 0 ; j < 10 ; j++) { struct coord_geo g; char buffer[1024]; double conv=180.0/(1UL<<23); pnt=file_read(rgn, item_offset, sizeof(*pnt)*20); // printf("0x%x ", item_offset); dump_hex(pnt, 32); dump_point(pnt); g.lng=(triple(&sub->center.lng)+(pnt->lng_delta << shift))*conv; g.lat=(triple(&sub->center.lat)+(pnt->lat_delta << shift))*conv; printf("%f %f\n", g.lng, g.lat); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS, buffer,sizeof(buffer)); printf("%s\n", buffer); dump_label_offset(mr, triple_u(&pnt->lbl_offset)); if (pnt->info & 0x80) item_offset+=sizeof(*pnt); else item_offset+=sizeof(*pnt)-1; } } } else { printf("offset[%d] doesn't exist\n", i); } } file_free(file_offsets); } #endif static void dump_levels(struct map_rect_priv *mr) { int i,offset; struct level *lvl; offset=mr->tre_hdr->level.offset; for (i = 0 ; i < mr->tre_hdr->level.length/sizeof(*lvl) ; i++) { lvl=file_read(&mr->tre, offset, sizeof(*lvl)); dump_level(lvl); offset+=sizeof(*lvl); } } #if 0 static void dump_tree(struct file *f, struct file *rgn, struct map_rect_priv *mr) { struct tree_header *tre_hdr; struct subdivision *sub; int i,offset; tre_hdr=file_read(f, 0, sizeof(*tre_hdr)); dump_tree_header(tre_hdr); offset=tre_hdr->subdivision.offset; sub=file_read(f, offset, sizeof(*sub)); dump_subdivision(sub); offset+=sizeof(*sub); for (i = 1 ; i < tre_hdr->subdivision.length/sizeof(*sub) ; i++) { printf("i=%d\n", i); sub=file_read(f, offset, sizeof(*sub)); dump_subdivision(sub); dump_region_item(sub, rgn, mr); if (sub->width & 0x8000) break; offset+=sizeof(*sub); } file_free(tre_hdr); } #endif #if 0 static void dump_labels(struct file *f) { struct label_header *lbl_hdr; lbl_hdr=file_read(f, 0, sizeof(*lbl_hdr)); printf("**labels**\n"); dump_label(lbl_hdr); file_free(lbl_hdr); #if 0 labels=alloca(lbl_hdr.label_length); file_read(f, lbl_hdr.label_offset, labels, lbl_hdr.label_length); l=labels; while (l < labels+lbl_hdr.label_length) { printf("'%s'(%d)\n", l, strlen(l)); l+=strlen(l)+1; } #endif } #endif static void garmin_img_coord_rewind(void *priv_data) { } static void parse_line(struct map_rect_priv *mr) { int pos=0; sscanf(mr->line,"%lf %c %lf %c %n",&mr->lat,&mr->lat_c,&mr->lng,&mr->lng_c,&pos); if (pos < strlen(mr->line)) { strcpy(mr->attrs, mr->line+pos); } } static int get_bits(struct map_rect_priv *mr, int bits) { unsigned long ret; ret=L(*((unsigned long *)(mr->ply_data+mr->ply_bitpos/8))); ret >>= (mr->ply_bitpos & 7); ret &= (1 << bits)-1; mr->ply_bitpos+=bits; return ret; } static int garmin_img_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct subdivision *sub=(struct subdivision *)(mr->subdiv+mr->subdiv_pos); int ret=0; int debug=0; if (debug) printf("garmin_img_coord_get %d\n",count); if (debug) dump_subdivision(sub); while (count--) { if (mr->rgn_type < 2) { c->x=triple(&sub->center.lng)+(mr->pnt->lng_delta << shift); c->y=triple(&sub->center.lat)+(mr->pnt->lat_delta << shift); } else { if (! mr->ply_bitpos) { if (mr->ply->info & 0x80) { mr->ply_bitcount=mr->ply->u.p2.bitstream_len*8; mr->ply_lngbits=mr->ply->u.p2.bitstream_info & 0xf; mr->ply_latbits=mr->ply->u.p2.bitstream_info >> 4; } else { mr->ply_bitcount=mr->ply->u.p1.bitstream_len*8; mr->ply_lngbits=mr->ply->u.p1.bitstream_info & 0xf; mr->ply_latbits=mr->ply->u.p1.bitstream_info >> 4; } if (mr->ply_lngbits <= 9) mr->ply_lngbits+=2; if (mr->ply_latbits <= 9) mr->ply_latbits+=2; if (! get_bits(mr,1)) { mr->ply_lngbits+=1; mr->ply_lngsign=0; } else if (get_bits(mr, 1)) mr->ply_lngsign=-1; else mr->ply_lngsign=1; if (! get_bits(mr,1)) { mr->ply_latbits+=1; mr->ply_latsign=0; } else if (get_bits(mr, 1)) mr->ply_latsign=-1; else mr->ply_latsign=1; mr->ply_lnglimit=1 << (mr->ply_lngbits-1); mr->ply_latlimit=1 << (mr->ply_latbits-1); mr->ply_lng=mr->ply->lng_delta; mr->ply_lat=mr->ply->lat_delta; if (debug) printf("lngbits %d latbits %d bitcount %d\n", mr->ply_lngbits, mr->ply_latbits, mr->ply_bitcount); c->x=0; c->y=0; } else { if (mr->ply_bitpos + mr->ply_lngbits + mr->ply_latbits > mr->ply_bitcount) { if (debug) printf("out of bits %d + %d + %d >= %d\n", mr->ply_bitpos, mr->ply_lngbits, mr->ply_latbits, mr->ply_bitcount); return ret; } c->x=0; c->y=0; int x,y; for (;;) { x=get_bits(mr,mr->ply_lngbits); if (debug) printf("x %d ", x); if (mr->ply_lngsign || x != mr->ply_lnglimit) break; c->x += x-1; } if (mr->ply_lngsign) { c->x=x*mr->ply_lngsign; } else { if (x >= mr->ply_lnglimit) c->x = x - (mr->ply_lnglimit << 1) - c->x; else c->x +=x; } for (;;) { y=get_bits(mr,mr->ply_latbits); if (debug) printf("y %d ", y); if (mr->ply_latsign || y != mr->ply_latlimit) break; c->y += y-1; } if (mr->ply_latsign) { c->y=y*mr->ply_latsign; } else { if (y >= mr->ply_latlimit) c->y = y - (mr->ply_latlimit << 1) - c->y; else c->y +=y; } mr->ply_lng += c->x; mr->ply_lat += c->y; } if (debug) printf(": x %d y %d\n", c->x, c->y); c->x=triple(&sub->center.lng)+(mr->ply_lng << shift); c->y=triple(&sub->center.lat)+(mr->ply_lat << shift); } #if 0 c->x-=0x6f160; c->y-=0x181f59; c->x+=0x168ca1; c->y+=0x68d815; #endif c++; ret++; if (mr->rgn_type < 2) return ret; } return ret; } static char * get_label_offset(struct map_rect_priv *mr, int offset) { g_assert(offset < mr->lbl_hdr->label.offset_len.length); return file_read(&mr->lbl, mr->lbl_hdr->label.offset_len.offset+offset, 128); } static void garmin_img_attr_rewind(void *priv_data) { } static int garmin_img_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; int debug=0; if (debug) printf("garmin_img_attr_get\n"); if (attr_type == attr_label) { if (debug) printf("garmin_img_attr_get label\n"); attr->type=attr_type; if (mr->rgn_type < 2) { if (mr->label) file_free(mr->label); mr->label=get_label_offset(mr, triple_u(&mr->pnt->lbl_offset) & 0x3fffff); attr->u.str=mr->label; } else { attr->u.str=""; } return 1; } return 0; } static struct item_methods methods_garmin_img = { garmin_img_coord_rewind, garmin_img_coord_get, garmin_img_attr_rewind, garmin_img_attr_get, }; static int rgn_next_type(struct map_rect_priv *mr) { while (mr->rgn_type < 3) { mr->rgn_type++; if (mr->rgn_items[mr->rgn_type].offset && mr->rgn_items[mr->rgn_type].length != 0) { mr->rgn_offset=mr->rgn_items[mr->rgn_type].offset; mr->rgn_end=mr->rgn_offset+mr->rgn_items[mr->rgn_type].length; return 0; } } return 1; } static int sub_next(struct map_rect_priv *mr, int next) { int i,offset,first=-1,last=-1,count=-1; int end; unsigned short *offsets; int debug=0; if (mr->subdiv_level_count <= 0) return 1; if (debug) printf("%d left\n", mr->subdiv_level_count); mr->subdiv_level_count--; #if 0 if (next && mr->subdiv[mr->subdiv_current].width & 0x8000) return 1; #endif if (debug) dump_hex_r(mr->subdiv+mr->subdiv_pos, 64, 14); mr->subdiv_pos+=next; if (debug) printf("subdiv_pos 0x%x\n", mr->subdiv_pos); if (mr->subdiv_pos > mr->tre_hdr->subdivision.length) return 1; struct subdivision *sub=(struct subdivision *)(mr->subdiv+mr->subdiv_pos); offset=triple_u(&sub->rgn_offset)+mr->rgn_hdr->offset_len.offset; if (debug) { printf("offset=0x%x\n", offset); dump_subdivision(sub); } offsets=file_read(&mr->rgn, offset, 3*sizeof(unsigned short)); if (! next) next=subdiv_next; if (mr->subdiv_pos+next < mr->tre_hdr->subdivision.length) end=triple_u(&((struct subdivision *)(mr->subdiv+mr->subdiv_pos+next))->rgn_offset)+mr->rgn_hdr->offset_len.offset; else end=mr->rgn_hdr->offset_len.offset+mr->rgn_hdr->offset_len.length; if (debug) { dump_subdivision(sub); dump_hex(offsets, 6); } for (i=0 ; i < 4 ; i++) { if (debug) printf("i=%d ", i); if (sub->types & (0x10 << i)) { if (debug) printf("+ "); if (first == -1) { first=i; mr->rgn_items[i].offset=offset; if (debug) printf("\n"); } else { mr->rgn_items[i].offset=offset+offsets[count]; if (debug) printf("0x%x\n", offsets[count]); mr->rgn_items[last].length=mr->rgn_items[i].offset-mr->rgn_items[last].offset; } last=i; count++; } else { if (debug) printf("-\n"); mr->rgn_items[i].offset=0; mr->rgn_items[i].length=0; } } if (first != -1) { mr->rgn_items[first].offset+=count*2; mr->rgn_items[first].length-=count*2; mr->rgn_items[last].length=end-mr->rgn_items[last].offset; } if (debug) { for (i=0 ; i < 4 ; i++) { printf("%d 0x%x 0x%x\n", i, mr->rgn_items[i].offset, mr->rgn_items[i].length); } } mr->rgn_type=-1; rgn_next_type(mr); if (debug) printf("*** offset 0x%x\n", mr->rgn_offset); file_free(offsets); return 0; } int item_count; static struct map_rect_priv * map_rect_new_garmin_img(struct map_priv *map, struct coord_rect *r, struct layer *layers, int limit) { struct map_rect_priv *mr; struct img_header img; if (debug) printf("map_rect_new_garmin_img\n"); mr=g_new0(struct map_rect_priv, 1); mr->m=map; if (r) mr->r=*r; mr->limit=limit; mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_garmin_img; mr->item.priv_data=mr; mr->f=fopen(map->filename, "r"); fread(&img, sizeof(img), 1, mr->f); #if 0 dump_img(&img); for (i = 0 ; i < (img.file_offset-sizeof(img))/sizeof(fat_blk) ; i++) { fread(&fat_blk, sizeof(fat_blk), 1, mr->f); if (!fat_blk.flag) break; dump_fat_block(&fat_blk); } #endif mr->rgn.offset=0xa*2048; mr->rgn.f=mr->f; mr->rgn_hdr=file_read(&mr->rgn, 0, sizeof(*mr->rgn_hdr)); mr->tre.offset=0x62b*2048; mr->tre.f=mr->f; mr->tre_hdr=file_read(&mr->tre, 0, sizeof(*mr->tre_hdr)); mr->lbl.offset=0x64a*2048; mr->lbl.f=mr->f; mr->lbl_hdr=file_read(&mr->lbl, 0, sizeof(*mr->lbl_hdr)); mr->subdiv=file_read(&mr->tre, mr->tre_hdr->subdivision.offset, mr->tre_hdr->subdivision.length); #if 0 dump_hex_r(mr->subdiv, mr->tre_hdr->subdivision.length, 16); #endif dump_tree_header(mr->tre_hdr); dump_levels(mr); printf("limit=%d\n", limit); if (limit < 3) { mr->subdiv_pos=0; mr->subdiv_level_count=1; shift=11; } else if (limit < 6) { mr->subdiv_pos=1*sizeof(struct subdivision); mr->subdiv_level_count=5; shift=9; } else if (limit < 8) { mr->subdiv_pos=6*sizeof(struct subdivision); mr->subdiv_level_count=9; shift=7; } else if (limit < 10) { mr->subdiv_pos=15*sizeof(struct subdivision); mr->subdiv_level_count=143; shift=5; } else { mr->subdiv_pos=158*sizeof(struct subdivision); mr->subdiv_level_count=4190; shift=2; subdiv_next=14; } #if 0 mr->rgn_offset=triple_u(&mr->subdiv[mr->subdiv_current].rgn_offset)+mr->rgn_hdr->offset_len.offset+4; mr->rgn_type=1; mr->rgn_end=mr->rgn_offset+20*8; #endif mr->count=0; item_count=0; #if 0 printf("*** offset 0x%x\n", 0x656c-mr->rgn.offset); printf("*** offset 0x%x\n", mr->rgn_offset); #endif #if 1 sub_next(mr, 0); #endif #if 0 { struct rgn_point *pnt; int i; int offset=0x65cc; for (i = 0 ; i < 26 ; i++) { pnt=file_read(&mr->rgn, 0x656c+8*i-mr->rgn.offset, sizeof(*pnt)); // dump_hex(pnt, sizeof(*pnt)); dump_point(pnt); dump_label_offset(mr, triple_u(&pnt->lbl_offset)); } } exit(0); #endif #if 0 dump_tree(&mr->tre,&mr->rgn,mr); #endif #if 0 f.offset=0x64a*2048; f.f=mr->f; dump_labels(&f); #endif #if 0 fseek(mr->f, img.file_offset, SEEK_SET); fread(&fil, sizeof(fil), 1, mr->f); dump_file(&fil); fread(&rgn, sizeof(rgn), 1, mr->f); dump_region(&rgn); fseek(mr->f, rgn.data_length, SEEK_CUR); fread(&fil, sizeof(fil), 1, mr->f); dump_file(&fil); #endif return mr; } static void map_rect_destroy_garmin_img(struct map_rect_priv *mr) { fclose(mr->f); g_free(mr); } static struct item * map_rect_get_item_garmin_img(struct map_rect_priv *mr) { char *p,type[256]; int ptype; int debug=0; item_count++; if (debug) printf("map_rect_get_item_garmin_img\n"); for (;;) { if (mr->rgn_offset < mr->rgn_end) { if (debug) printf("data available\n"); if (mr->rgn_type >= 2) { int len; if (debug) printf("polyline %d\n", mr->count); if (mr->ply) file_free(mr->ply); mr->ply=file_read(&mr->rgn, mr->rgn_offset, sizeof(*mr->ply)*3); if(triple_u(&mr->ply->lbl_offset) >= mr->lbl_hdr->label.offset_len.length) { printf("item_count %d\n", item_count); dump_poly(mr->ply); dump_hex(mr->ply, 32); printf("%d vs %d\n", triple_u(&mr->ply->lbl_offset), mr->lbl_hdr->label.offset_len.length); } g_assert(triple_u(&mr->ply->lbl_offset) < mr->lbl_hdr->label.offset_len.length); if (debug) { dump_hex(mr->ply, 16); dump_poly(mr->ply); } if (mr->ply_data) file_free(mr->ply_data); mr->rgn_offset+=10; if (mr->ply->info & 0x80) { mr->rgn_offset++; len=mr->ply->u.p2.bitstream_len; } else len=mr->ply->u.p1.bitstream_len; mr->ply_data=file_read(&mr->rgn, mr->rgn_offset, len); mr->rgn_offset += len; mr->ply_bitpos=0; // dump_hex(mr->ply_data, 32); if (mr->rgn_type == 3) { switch(mr->ply->info & 0x7f) { case 0x1: /* large urban area (>200k) */ mr->item.type=type_town_poly; break; case 0xd: /* reservation */ mr->item.type=type_park_poly; break; case 0xe: /* airport runway */ mr->item.type=type_airport_poly; break; case 0x14: /* national park */ mr->item.type=type_park_poly; break; case 0x32: /* sea */ case 0x3d: /* large lake (77-250km2) */ case 0x4c: /* intermittend water */ mr->item.type=type_water_poly; break; case 0x4b: /* background */ continue; default: printf("unknown polygon: 0x%x\n", mr->ply->info); mr->item.type=type_street_3_city; } } else { switch(mr->ply->info & 0x3f) { case 0x1: /* major highway */ mr->item.type=type_highway_land; break; case 0x2: /* principal highway */ mr->item.type=type_street_3_land; break; case 0x6: /* residental street */ mr->item.type=type_street_2_land; break; case 0x16: /* walkway/trail */ mr->item.type=type_street_1_land; break; case 0x1e: /* international boundary */ mr->item.type=type_border_country; break; case 0x20: /* minor land contour 1/10 */ mr->item.type=type_height_line_1; break; case 0x21: /* major land contour 1/2 */ mr->item.type=type_height_line_2; break; default: printf("unknown polyline: 0x%x\n", mr->ply->info); mr->item.type=type_street_3_city; } } return &mr->item; } if (mr->pnt) file_free(mr->pnt); mr->pnt=file_read(&mr->rgn, mr->rgn_offset, sizeof(*mr->pnt)); mr->item.type=type_none; int subtype=mr->pnt->subtype; if (mr->pnt->lbl_offset.data[2] & 0x80) mr->rgn_offset+=9; else { mr->rgn_offset+=8; subtype=0; } switch(mr->pnt->info) { case 0x3: /* large city 2-5M */ mr->item.type=type_town_label_2e6; break; case 0xa: /* small city/town 10-20k */ mr->item.type=type_town_label_1e4; break; case 0xd: /* settlement 1-2K */ mr->item.type=type_town_label_1e3; break; case 0x11: /* settlement less 100 */ mr->item.type=type_town_label_5e1; break; case 0x1c: switch(subtype) { case 0x01: mr->item.type=type_poi_wreck; break; } break; case 0x20: mr->item.type=type_highway_exit; break; case 0x25: mr->item.type=type_poi_toll_booth; break; case 0x2b: switch(subtype) { case 0x01: mr->item.type=type_poi_hotel; break; case 0x03: mr->item.type=type_poi_camp_rv; break; } break; case 0x2c: switch(subtype) { case 0x00: mr->item.type=type_poi_attraction; break; case 0x02: mr->item.type=type_poi_museum_history; break; } break; case 0x2e: mr->item.type=type_poi_shopping; break; case 0x2f: switch(subtype) { case 0x01: mr->item.type=type_poi_fuel; break; case 0x07: mr->item.type=type_poi_car_dealer_parts; break; case 0x0b: mr->item.type=type_poi_car_parking; break; case 0x15: mr->item.type=type_poi_public_utilities; break; } break; case 0x30: switch(subtype) { case 0x02: mr->item.type=type_poi_hospital; break; } break; case 0x43: mr->item.type=type_poi_marina; break; case 0x46: mr->item.type=type_poi_bar; break; case 0x48: mr->item.type=type_poi_camping; break; case 0x49: mr->item.type=type_poi_park; break; case 0x4a: mr->item.type=type_poi_picnic; break; case 0x59: /* airport */ mr->item.type=type_poi_airport; break; case 0x64: switch(subtype) { case 0x1: mr->item.type=type_poi_bridge; break; case 0x2: mr->item.type=type_poi_building; break; case 0x15: mr->item.type=type_town_ghost; break; } break; case 0x65: switch(subtype) { case 0x0: mr->item.type=type_poi_water_feature; break; case 0xc: mr->item.type=type_poi_island; break; case 0xd: mr->item.type=type_poi_lake; break; } break; case 0x66: switch(subtype) { case 0x0: mr->item.type=type_poi_land_feature; break; case 0x6: mr->item.type=type_poi_cape; break; case 0x14: mr->item.type=type_poi_rock; break; } break; } if (mr->item.type == type_none) { printf("unknown point: 0x%x 0x%x\n", mr->pnt->info, mr->pnt->subtype); dump_point(mr->pnt); printf("label: %s\n", get_label_offset(mr, triple_u(&mr->pnt->lbl_offset) & 0x3fffff)); mr->item.type=type_town_label; } return &mr->item; } if (debug) printf("out of data for type\n"); if (rgn_next_type(mr)) { if (debug) printf("out of data for region\n"); if (sub_next(mr, subdiv_next)) { if (debug) printf("out of data for subdivision\n"); return NULL; } } } } static struct item * map_rect_get_item_byid_garmin_img(struct map_rect_priv *mr, int id_hi, int id_lo) { fseek(mr->f, id_lo, SEEK_SET); get_line(mr); mr->item.id_hi=id_hi; return map_rect_get_item_garmin_img(mr); } static struct map_methods map_methods_garmin_img = { projection_garmin, "iso8859-1", map_destroy_garmin_img, map_charset_garmin_img, map_projection_garmin_img, map_rect_new_garmin_img, map_rect_destroy_garmin_img, map_rect_get_item_garmin_img, map_rect_get_item_byid_garmin_img, }; static struct map_priv * map_new_garmin_img(struct map_methods *meth, struct attr **attrs) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); if (! data) return NULL; *meth=map_methods_garmin_img; m=g_new(struct map_priv, 1); m->id=++map_id; m->filename=g_strdup(data->u.str); return m; } void plugin_init(void) { plugin_register_map_type("garmin_img", map_new_garmin_img); } navit-0.5.0~svn5643+dfsg.1/navit/map/mg/000077500000000000000000000000001221777731700175015ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/mg/CMakeLists.txt000066400000000000000000000001071221777731700222370ustar00rootroot00000000000000module_add_library(map_mg map.c block.c town.c tree.c poly.c street.c) navit-0.5.0~svn5643+dfsg.1/navit/map/mg/Makefile.am000066400000000000000000000005241221777731700215360ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_mg if PLUGINS modulemap_LTLIBRARIES = libmap_mg.la else noinst_LTLIBRARIES = libmap_mg.la endif libmap_mg_la_SOURCES = map.c block.c town.c tree.c poly.c street.c mg.h libmap_mg_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/map/mg/block.c000066400000000000000000000202361221777731700207420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "mg.h" int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem; struct block_index_item { /*unsigned int blocknum; unsigned int blocks;*/ unsigned char p[8]; }; static inline unsigned int block_index_item_get_blocknum(struct block_index_item * blk) { unsigned char *p = blk->p; return get_u32(&p); } static inline unsigned int block_index_item_get_blocks(struct block_index_item * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } struct block_index { /* unsigned int blocks; unsigned int size; unsigned int next; struct block_index_item list[0];*/ unsigned char p[12]; }; static inline unsigned int block_index_get_blocks(struct block_index * blk) { unsigned char *p = blk->p; return get_u32(&p); } static inline unsigned int block_index_get_size(struct block_index * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } static inline unsigned int block_index_get_next(struct block_index * blk) { unsigned char *p = blk->p+8; return get_u32(&p); } static inline struct block_index_item * block_index_get_list(struct block_index * blk) { return (struct block_index_item *)(blk->p+12); } static struct block * block_get(unsigned char **p) { struct block *ret=(struct block *)(*p); *p += sizeof(*ret); return ret; } static struct block * block_get_byid(struct file *file, int id, unsigned char **p_ret) { struct block_index *blk_idx; int blk_num,max; blk_idx=(struct block_index *)(file->begin+0x1000); max=(block_index_get_size(blk_idx)-sizeof(struct block_index))/sizeof(struct block_index_item); block_mem+=24; while (id >= max) { blk_idx=(struct block_index *)(file->begin+block_index_get_next(blk_idx)*512); id-=max; } blk_num=block_index_item_get_blocknum(&block_index_get_list(blk_idx)[id]); *p_ret=file->begin+blk_num*512; return block_get(p_ret); } int block_get_byindex(struct file *file, int idx, struct block_priv *blk) { dbg(1,"idx=%d\n", idx); blk->b=block_get_byid(file, idx, &blk->p); blk->block_start=(unsigned char *)(blk->b); blk->p_start=blk->p; blk->end=blk->block_start+block_get_size(blk->b); return 1; } static void block_setup_tags(struct map_rect_priv *mr) { int len; unsigned char *p,*t; char *str; mr->b.binarytree=0; p=mr->file->begin+0x0c; while (*p) { str=get_string(&p); len=get_u32_unal(&p); t=p; /* printf("String '%s' len %d\n", str, len); */ if (! strcmp(str,"FirstBatBlock")) { /* printf("%ld\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"MaxBlockSize")) { /* printf("%ld\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"FREE_BLOCK_LIST")) { /* printf("%ld\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"TotalRect")) { mr->b.b_rect.lu.x=get_u32_unal(&t); mr->b.b_rect.lu.y=get_u32_unal(&t); mr->b.b_rect.rl.x=get_u32_unal(&t); mr->b.b_rect.rl.y=get_u32_unal(&t); /* printf("0x%x,0x%x-0x%x,0x%x\n", mr->b.b_rect.lu.x, mr->b.b_rect.lu.y, mr->b.b_rect.rl.x, mr->b.b_rect.rl.y); */ } else if (! strcmp(str,"Version")) { /* printf("0x%lx\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"Categories")) { /* printf("0x%x\n", get_u16(&t)); */ } else if (! strcmp(str,"binaryTree")) { mr->b.binarytree=get_u32_unal(&t); /* printf("%d\n", mr->b.binarytree); */ } else if (! strcmp(str,"CategorySets")) { /* printf("0x%x\n", get_u16(&t)); */ } else if (! strcmp(str,"Kommentar")) { /* printf("%s\n", get_string(&t)); */ } p+=len; } } #if 0 static void block_rect_print(struct coord_rect *r) { printf ("0x%x,0x%x-0x%x,0x%x (0x%x,0x%x)", r->lu.x, r->lu.y, r->rl.x, r->rl.y, r->lu.x/2+r->rl.x/2,r->lu.y/2+r->rl.y/2); } #endif static void block_rect_same(struct coord_rect *r1, struct coord_rect *r2) { dbg_assert(r1->lu.x==r2->lu.x); dbg_assert(r1->lu.y==r2->lu.y); dbg_assert(r1->rl.x==r2->rl.x); dbg_assert(r1->rl.y==r2->rl.y); } int block_init(struct map_rect_priv *mr) { mr->b.block_num=-1; mr->b.bt.b=NULL; mr->b.bt.next=0; block_setup_tags(mr); if (mr->b.binarytree) { mr->b.bt.next=mr->b.binarytree; mr->b.bt.p=NULL; mr->b.bt.block_count=0; } if (mr->cur_sel && !coord_rect_overlap(&mr->cur_sel->u.c_rect, &mr->b.b_rect)) return 0; return block_next(mr); } int block_next_lin(struct map_rect_priv *mr) { struct coord_rect r; for (;;) { block_lin_count++; block_mem+=sizeof(struct block *); mr->b.block_num++; if (! mr->b.block_num) mr->b.p=mr->file->begin+0x2000; else mr->b.p=mr->b.block_start+block_get_blocks(mr->b.b)*512; if (mr->b.p >= mr->file->end) { dbg(1,"end of blocks %p vs %p\n", mr->b.p, mr->file->end); return 0; } mr->b.block_start=mr->b.p; mr->b.b=block_get(&mr->b.p); mr->b.p_start=mr->b.p; mr->b.end=mr->b.block_start+block_get_size(mr->b.b); if (block_get_count(mr->b.b) == -1) { dbg(1,"empty blocks\n"); return 0; } block_get_r(mr->b.b, &r); if (!mr->cur_sel || coord_rect_overlap(&mr->cur_sel->u.c_rect, &r)) { block_active_count++; block_active_mem+=block_get_blocks(mr->b.b)*512-sizeof(struct block *); dbg(1,"block ok\n"); return 1; } dbg(2,"block not in cur_sel\n"); } } int block_next(struct map_rect_priv *mr) { int blk_num,coord,r_h,r_w; struct block_bt_priv *bt=&mr->b.bt; struct coord_rect r; if (!mr->b.binarytree || ! mr->cur_sel) return block_next_lin(mr); for (;;) { if (! bt->p) { dbg(1,"block 0x%x\n", bt->next); if (bt->next == -1) return 0; bt->b=block_get_byid(mr->file, bt->next, &bt->p); bt->end=(unsigned char *)mr->b.bt.b+block_get_size(mr->b.bt.b); bt->next=block_get_next(bt->b); bt->order=0; dbg(1,"size 0x%x next 0x%x\n", block_get_size(bt->b), block_get_next(bt->b)); if (! mr->b.bt.block_count) { #if 0 if (debug) { printf("idx rect "); block_rect_print(&mr->b.bt.b->r); } #endif block_get_r(bt->b, &bt->r); bt->r_curr=bt->r; coord=get_u32(&mr->b.bt.p); } else { bt->p=(unsigned char *)bt->b+0xc; } bt->block_count++; } while (mr->b.bt.p < mr->b.bt.end) { block_idx_count++; blk_num=get_u32(&mr->b.bt.p); coord=get_u32(&mr->b.bt.p); block_mem+=8; dbg(1,"%p vs %p coord 0x%x ", mr->b.bt.end, mr->b.bt.p, coord); dbg(1,"block 0x%x", blk_num); r_w=bt->r_curr.rl.x-bt->r_curr.lu.x; r_h=bt->r_curr.lu.y-bt->r_curr.rl.y; #if 0 if (debug) { printf(" rect1 "); block_rect_print(&bt->r_curr); printf(" %dx%d", r_w, r_h); } #endif mr->b.b=NULL; if (blk_num != -1) { block_mem+=8; if (coord_rect_overlap(&mr->cur_sel->u.c_rect, &bt->r_curr)) { mr->b.b=block_get_byid(mr->file, blk_num, &mr->b.p); mr->b.block_num=blk_num; dbg_assert(mr->b.b != NULL); mr->b.block_start=(unsigned char *)(mr->b.b); mr->b.p_start=mr->b.p; mr->b.end=mr->b.block_start+block_get_size(mr->b.b); block_get_r(mr->b.b, &r); block_rect_same(&r, &bt->r_curr); } } if (coord != -1) { bt->stack[bt->stackp]=bt->r_curr; if (r_w > r_h) { bt->r_curr.rl.x=coord; bt->stack[bt->stackp].lu.x=coord+1; } else { bt->r_curr.lu.y=coord; bt->stack[bt->stackp].rl.y=coord+1; } bt->stackp++; dbg_assert(bt->stackp < BT_STACK_SIZE); } else { if (bt->stackp) { bt->stackp--; bt->r_curr=bt->stack[bt->stackp]; } else { bt->r_curr=bt->r; bt->order++; if (bt->order > 100) return 0; } } if (mr->b.b) { block_active_count++; block_active_mem+=block_get_blocks(mr->b.b)*512; return 1; } } bt->p=NULL; } return 0; } navit-0.5.0~svn5643+dfsg.1/navit/map/mg/map.c000066400000000000000000000340741221777731700204320ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "maptype.h" #include "mg.h" GList *maps; static struct country_isonum { int country; int isonum; int postal_len; char *postal_prefix; } country_isonums[]={ { 1,203}, { 2,703}, { 7,674}, { 11,233}, { 12,268}, { 13,428}, { 14,440}, { 15,498}, { 16,643}, { 17,804}, { 18,112}, { 20,818}, { 30,300}, { 31,528}, { 32, 56}, { 33,250}, { 34,724}, { 36,348}, { 39,380}, { 40,642}, { 41,756}, { 43, 40}, { 44,826}, { 45,208}, { 46,752}, { 47,578}, { 48,616}, { 49,276,5,"D@@"}, { 50,292}, { 51,620}, { 52,442}, { 53,372}, { 54,352}, { 55, 8}, { 56,470}, { 57,196}, { 58,246}, { 59,100}, { 61,422}, { 62, 20}, { 63,760}, { 66,682}, { 71,434}, { 72,376}, { 73,275}, { 75,438}, { 76,504}, { 77, 12}, { 78,788}, { 81,688}, { 83,400}, { 85,191}, { 86,705}, { 87, 70}, { 89,807}, { 90,792}, { 93,492}, { 94, 31}, { 95, 51}, { 98,234}, { 99,732}, {336,774}, }; struct map_priv * map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl); static int map_id; static char *file[]={ [file_border_ply]="border.ply", [file_bridge_ply]="bridge.ply", [file_build_ply]="build.ply", [file_golf_ply]="golf.ply", [file_height_ply]="height.ply", [file_natpark_ply]="natpark.ply", [file_nature_ply]="nature.ply", [file_other_ply]="other.ply", [file_rail_ply]="rail.ply", [file_sea_ply]="sea.ply", [file_street_bti]="street.bti", [file_street_str]="street.str", [file_strname_stn]="strname.stn", [file_town_twn]="town.twn", [file_tunnel_ply]="tunnel.ply", [file_water_ply]="water.ply", [file_woodland_ply]="woodland.ply", }; int mg_country_from_isonum(int isonum) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].isonum == isonum) return country_isonums[i].country; return 0; } int mg_country_to_isonum(int country) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].country == country) return country_isonums[i].isonum; return 0; } int mg_country_postal_len(int country) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].country == country) return country_isonums[i].postal_len; return 0; } static char *mg_country_postal_prefix(int isonum) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].isonum == isonum) return country_isonums[i].postal_prefix; return NULL; } struct item_range town_ranges[]={ {type_town_label,type_port_label}, }; struct item_range street_ranges[]={ {type_street_nopass,type_street_unkn}, }; struct item_range poly_ranges[]={ {type_border_country,type_water_line}, {type_street_unkn,type_street_unkn}, {type_area,type_last}, }; static int file_next(struct map_rect_priv *mr) { int debug=0; for (;;) { mr->current_file++; if (mr->current_file >= file_end) return 0; mr->file=mr->m->file[mr->current_file]; if (! mr->file) continue; switch (mr->current_file) { case file_strname_stn: continue; case file_town_twn: if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, town_ranges, sizeof(town_ranges)/sizeof(struct item_range))) continue; break; case file_street_str: if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, street_ranges, sizeof(street_ranges)/sizeof(struct item_range))) continue; break; default: if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, poly_ranges, sizeof(poly_ranges)/sizeof(struct item_range))) continue; break; } if (debug) printf("current file: '%s'\n", file[mr->current_file]); mr->cur_sel=mr->xsel; if (block_init(mr)) return 1; } } static void map_destroy_mg(struct map_priv *m) { int i; printf("mg_map_destroy\n"); for (i = 0 ; i < file_end ; i++) { if (m->file[i]) file_destroy(m->file[i]); } } extern int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem; struct map_rect_priv * map_rect_new_mg(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; int i; block_lin_count=0; block_idx_count=0; block_active_count=0; block_mem=0; block_active_mem=0; mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->xsel=sel; mr->current_file=-1; if (sel && sel->next) for (i=0 ; i < file_end ; i++) mr->block_hash[i]=g_hash_table_new(g_int_hash,g_int_equal); file_next(mr); return mr; } static struct item * map_rect_get_item_mg(struct map_rect_priv *mr) { for (;;) { switch (mr->current_file) { case file_town_twn: if (town_get(mr, &mr->town, &mr->item)) return &mr->item; break; case file_border_ply: case file_bridge_ply: case file_build_ply: case file_golf_ply: /* case file_height_ply: */ case file_natpark_ply: case file_nature_ply: case file_other_ply: case file_rail_ply: case file_sea_ply: /* case file_tunnel_ply: */ case file_water_ply: case file_woodland_ply: if (poly_get(mr, &mr->poly, &mr->item)) return &mr->item; break; case file_street_str: if (street_get(mr, &mr->street, &mr->item)) return &mr->item; break; case file_end: return NULL; default: break; } if (block_next(mr)) continue; if (mr->cur_sel->next) { mr->cur_sel=mr->cur_sel->next; if (block_init(mr)) continue; } if (file_next(mr)) continue; dbg(1,"lin_count %d idx_count %d active_count %d %d kB (%d kB)\n", block_lin_count, block_idx_count, block_active_count, (block_mem+block_active_mem)/1024, block_active_mem/1024); return NULL; } } struct item * map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo) { mr->current_file = (id_hi >> 16) & 0xff; switch (mr->current_file) { case file_town_twn: if (town_get_byid(mr, &mr->town, id_hi, id_lo, &mr->item)) return &mr->item; break; case file_street_str: if (street_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item)) return &mr->item; break; case file_strname_stn: if (street_name_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item)) return &mr->item; break; default: if (poly_get_byid(mr, &mr->poly, id_hi, id_lo, &mr->item)) return &mr->item; break; } return NULL; } void map_rect_destroy_mg(struct map_rect_priv *mr) { int i; for (i=0 ; i < file_end ; i++) if (mr->block_hash[i]) g_hash_table_destroy(mr->block_hash[i]); g_free(mr); } static char * map_search_mg_convert_special(char *str) { char *ret,*c=g_malloc(strlen(str)*2+1); ret=c; for (;;) { switch ((unsigned char)(*str)) { case 0xc4: *c++='A'; break; case 0xd6: *c++='O'; break; case 0xdc: *c++='U'; break; case 0xdf: *c++='s'; *c++='s'; break; case 0xe4: *c++='a'; break; case 0xf6: *c++='o'; break; case 0xfc: *c++='u'; break; default: dbg(1,"0x%x\n", *str); *c++=*str; break; } if (! *str) return ret; str++; } } static int map_search_setup(struct map_rect_priv *mr) { char *prefix; dbg(1,"%s\n", attr_to_name(mr->search_type)); switch (mr->search_type) { case attr_town_postal: if (mr->search_item.type != type_country_label) { dbg(0,"wrong parent type %s\n", item_to_name(mr->search_item.type)); return 0; } prefix=mg_country_postal_prefix(mr->search_item.id_lo); if (! prefix) return 0; tree_search_init(mr->m->dirname, "town.b1", &mr->ts, 0); mr->current_file=file_town_twn; mr->search_str=g_strdup_printf("%s%s",prefix,mr->search_attr->u.str); dbg(0,"search_str='%s'\n",mr->search_str); mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); break; case attr_town_name: if (mr->search_item.type != type_country_label) { dbg(0,"wrong parent type %s\n", item_to_name(mr->search_item.type)); return 0; } tree_search_init(mr->m->dirname, "town.b2", &mr->ts, 0x1000); mr->current_file=file_town_twn; mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str); mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); break; case attr_district_name: if (mr->search_item.type != type_country_label) { dbg(0,"wrong parent type %s\n", item_to_name(mr->search_item.type)); return 0; } tree_search_init(mr->m->dirname, "town.b3", &mr->ts, 0x1000); mr->current_file=file_town_twn; mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str); mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); break; case attr_street_name: if (mr->search_item.type != type_town_streets) { GList *tmp=maps; struct item *item=NULL; struct attr attr; struct map_rect_priv *mr2; while (tmp) { mr2=map_rect_new_mg(tmp->data, NULL); item=map_rect_get_item_byid_mg(mr2, mr->search_item.id_hi, mr->search_item.id_lo); if (item) break; map_rect_destroy_mg(mr2); tmp=g_list_next(tmp); } if (item) { if (item_attr_get(item, attr_town_streets_item, &attr)) { mr->search_item=*attr.u.item; map_rect_destroy_mg(mr2); } else { map_rect_destroy_mg(mr2); return 0; } } else { dbg(0,"wrong parent type %s %p 0x%x 0x%x\n", item_to_name(mr->search_item.type), item, mr->search_item.id_hi, mr->search_item.id_lo); return 0; } } dbg(1,"street_assoc=0x%x\n", mr->search_item.id_lo); tree_search_init(mr->m->dirname, "strname.b1", &mr->ts, 0); mr->current_file=file_strname_stn; mr->search_str=g_strdup(mr->search_attr->u.str); break; case attr_house_number: if (!map_priv_is(mr->search_item.map, mr->m)) return 0; if (!housenumber_search_setup(mr)) { dbg(0,"failed to search for attr_house_number\n"); return 0; } break; default: dbg(0,"unknown search %s\n",attr_to_name(mr->search_type)); return 0; } mr->file=mr->m->file[mr->current_file]; block_init(mr); return 1; } static void map_search_cleanup(struct map_rect_priv *mr); static struct item * map_search_get_item_mg(struct map_search_priv *ms); static struct map_search_priv * map_search_new_mg(struct map_priv *map, struct item *item, struct attr *search, int partial) { struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1); dbg(1,"searching for %s '%s'\n", attr_to_name(search->type), search->u.str); dbg(1,"id_lo=0x%x\n", item->id_lo); dbg(1,"search=%s\n", search->u.str); mr->m=map; mr->search_attr=attr_dup(search); mr->search_type=search->type; mr->search_item=*item; mr->search_partial=partial; if (search->type == attr_town_or_district_name) { mr->search_type=attr_town_name; mr->search_type_next=attr_district_name; } if (!map_search_setup(mr)) { dbg(1,"map_search_new_mg failed\n"); g_free(mr); return NULL; } mr->search_mr_tmp=map_rect_new_mg(map, NULL); return (struct map_search_priv *)mr; } static void map_search_cleanup(struct map_rect_priv *mr) { g_free(mr->search_str); mr->search_str=NULL; tree_search_free(&mr->ts); mr->search_linear=0; mr->search_p=NULL; mr->search_blk_count=0; mr->search_blk_off=NULL; mr->search_block=0; } static void map_search_destroy_mg(struct map_search_priv *ms) { struct map_rect_priv *mr=(struct map_rect_priv *)ms; dbg(1,"mr=%p\n", mr); if (! mr) return; map_search_cleanup(mr); if (mr->search_mr_tmp) map_rect_destroy_mg(mr->search_mr_tmp); attr_free(mr->search_attr); g_free(mr); } static struct item * map_search_get_item_mg(struct map_search_priv *ms) { struct map_rect_priv *mr=(struct map_rect_priv *)ms; struct item *ret=NULL; if (! mr) return NULL; switch (mr->search_type) { case attr_town_postal: case attr_town_name: case attr_district_name: ret=town_search_get_item(mr); break; case attr_street_name: ret=street_search_get_item(mr); break; case attr_house_number: ret=housenumber_search_get_item(mr); break; default: dbg(0,"unknown search %s\n",attr_to_name(mr->search_type)); break; } if (!ret && mr->search_type_next != attr_none) { mr->search_type=mr->search_type_next; mr->search_type_next=attr_none; map_search_cleanup(mr); map_search_setup(mr); return map_search_get_item_mg(ms); } return ret; } static struct map_methods map_methods_mg = { projection_mg, "iso8859-1", map_destroy_mg, map_rect_new_mg, map_rect_destroy_mg, map_rect_get_item_mg, map_rect_get_item_byid_mg, map_search_new_mg, map_search_destroy_mg, map_search_get_item_mg, }; struct map_priv * map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; int i,maybe_missing; struct attr *data=attr_search(attrs, NULL, attr_data); char *filename; struct file_wordexp *wexp; char **wexp_data; if (! data) return NULL; wexp=file_wordexp_new(data->u.str); wexp_data=file_wordexp_get_array(wexp); *meth=map_methods_mg; data=attr_search(attrs, NULL, attr_data); m=g_new(struct map_priv, 1); m->id=++map_id; m->dirname=g_strdup(wexp_data[0]); file_wordexp_destroy(wexp); for (i = 0 ; i < file_end ; i++) { if (file[i]) { filename=g_strdup_printf("%s/%s", m->dirname, file[i]); m->file[i]=file_create_caseinsensitive(filename, 0); if (! m->file[i]) { maybe_missing=(i == file_border_ply || i == file_height_ply || i == file_sea_ply); if (! maybe_missing) dbg(0,"Failed to load %s\n", filename); } else file_mmap(m->file[i]); g_free(filename); } } maps=g_list_append(maps, m); return m; } void plugin_init(void) { plugin_register_map_type("mg", map_new_mg); } navit-0.5.0~svn5643+dfsg.1/navit/map/mg/mg.h000066400000000000000000000251021221777731700202550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "attr.h" #include "coord.h" #include "data.h" #include "projection.h" #include "map.h" #include "file.h" struct block_data { struct file *file; }; struct block { /* int blocks; int size; int next; struct coord_rect r; int count;*/ unsigned char p[32]; }; static inline int block_get_blocks(struct block * blk) { unsigned char *p = blk->p; return get_u32(&p); } static inline int block_get_size(struct block * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } static inline int block_get_next(struct block * blk) { unsigned char *p = blk->p+8; return get_u32(&p); } static inline int block_get_count(struct block * blk) { unsigned char *p = blk->p+28; return get_u32(&p); } static inline void block_get_r(struct block * blk, struct coord_rect * r) { unsigned char *p = blk->p+12; r ->lu.x = get_u32(&p); r ->lu.y = get_u32(&p); r ->rl.x = get_u32(&p); r ->rl.y = get_u32(&p); } struct item_priv { int cidx; int aidx; unsigned char *cstart,*cp,*cend; unsigned char *astart,*ap,*aend; enum attr_type attr_last; enum attr_type attr_next; struct item item; }; struct town_priv { unsigned int id; /*!< Identifier */ struct coord c; /*!< Coordinates */ char *name; /*!< Name */ char *district; /*!< District */ char *postal_code1; /*!< Postal code */ unsigned char order; /*!< Order (Importance) */ unsigned char type; /*!< Type */ unsigned short country; /*!< Country */ unsigned int unknown2; /*!< Unknown */ unsigned char size; /*!< Size of town */ unsigned int street_assoc; /*!< Association to streets */ unsigned char unknown3; /*!< Unknown */ char *postal_code2; /*!< 2nd postal code */ unsigned int unknown4; /*!< Unknown */ int cidx; int aidx; enum attr_type attr_next; char debug[256]; char postal[32]; struct item town_attr_item; }; struct poly_priv { int poly_num; unsigned char *poly_next; int subpoly_num; int subpoly_num_all; unsigned char *subpoly_next; unsigned char *subpoly_start; unsigned char *p; struct coord c[2]; char *name; unsigned char order; unsigned char type; unsigned int polys; unsigned int *count; unsigned int count_sum; int aidx; enum attr_type attr_next; }; struct street_header { /*unsigned char order; int count;*/ unsigned char p[5]; } __attribute__((packed)); static inline unsigned char street_header_get_order(struct street_header * str) { return *str->p; } static inline int street_header_get_count(struct street_header * str) { unsigned char *p = str->p+1; return get_u32_unal(&p); } struct street_type { /*unsigned char order; unsigned short country;*/ unsigned char p[3]; } __attribute__((packed)); static inline unsigned char street_type_get_order(struct street_type * str) { return *str->p; } static inline unsigned short street_type_get_country(struct street_type * str) { unsigned char *p = str->p+1; return get_u16_unal(&p); } struct street_header_type { struct street_header *header; int type_count; struct street_type *type; }; struct street_str { /*int segid; unsigned char limit;*/ /* 0x03,0x30=One Way,0x33=No Passing */ /*unsigned char unknown2; unsigned char unknown3; unsigned char type; unsigned int nameid;*/ unsigned char p[12]; }; static inline int street_str_get_segid(struct street_str * str) { unsigned char *p = str->p; return get_u32_unal(&p); } static inline unsigned char street_str_get_limit(struct street_str * str) { return str->p[4]; } static inline unsigned char street_str_get_unknown2(struct street_str * str) { return str->p[5]; } static inline unsigned char street_str_get_unknown3(struct street_str * str) { return str->p[6]; } static inline unsigned char street_str_get_type(struct street_str * str) { return str->p[7]; } static inline unsigned int street_str_get_nameid(struct street_str * str) { unsigned char *p = str->p+8; return get_u32_unal(&p); } struct street_name_segment { int segid; int country; }; struct street_name { int len; int country; int townassoc; char *name1; char *name2; int segment_count; struct street_name_segment *segments; int aux_len; unsigned char *aux_data; int tmp_len; unsigned char *tmp_data; }; struct housenumber { int number; char *suffix; }; struct street_name_numbers { int len; int tag; int dist; int country; struct coord *c; struct housenumber first; struct housenumber last; int segment_count; struct street_name_segment *segments; int aux_len; unsigned char *aux_data; int tmp_len; unsigned char *tmp_data; }; static inline void street_name_numbers_get_coord(struct street_name_numbers * str, struct coord * c) { unsigned char *p=(unsigned char *)str->c; c->x=get_u32_unal(&p); c->y=get_u32_unal(&p); } struct street_name_number { int len; int tag; struct coord *c; struct housenumber first; struct housenumber last; struct street_name_segment *segment; }; struct street_priv { struct file *name_file; struct street_header *header; int type_count; struct street_type *type; struct street_str *str; struct street_str *str_start; unsigned char *coord_begin; unsigned char *p; unsigned char *p_rewind; unsigned char *end; unsigned char *next; int status; int status_rewind; struct coord_rect ref; int bytes; int more; int flags; int housenumber; int cidx; struct coord hnc[100]; struct housenumber hn[100]; int hn_count; struct street_name name; struct street_name_numbers name_numbers; struct street_name_number name_number; enum attr_type attr_next; char debug[256]; char first_number[32]; char last_number[32]; char current_number[32]; GHashTable *streetname_hash; }; enum file_index { file_border_ply=0, file_bridge_ply, file_build_ply, file_golf_ply, file_height_ply, file_natpark_ply, file_nature_ply, file_other_ply, file_rail_ply, file_sea_ply, file_street_bti, file_street_str, file_strname_stn, file_town_twn, file_tunnel_ply, file_water_ply, file_woodland_ply, file_end, file_town_twn_alt1, file_town_twn_alt2, file_street_str_alt1, file_street_str_alt2, file_street_str_alt3, file_street_str_alt4, }; struct map_priv { int id; struct file *file[file_end]; char *dirname; }; #define BT_STACK_SIZE 32 struct block_bt_priv { struct block *b; struct coord_rect r, r_curr; int next; int block_count; struct coord_rect stack[BT_STACK_SIZE]; int stackp; int order; unsigned char *p; unsigned char *end; }; struct block_priv { int block_num; struct coord_rect b_rect; unsigned char *block_start; struct block *b; unsigned char *p; unsigned char *end; unsigned char *p_start; int binarytree; struct block_bt_priv bt; }; struct block_offset { /* unsigned short offset; unsigned short block;*/ unsigned char p[4]; }; static inline unsigned short block_offset_get_offset(struct block_offset * blk) { unsigned char *p = blk->p; return get_u16_unal(&p); } static inline unsigned short block_offset_get_block(struct block_offset * blk) { unsigned char *p = blk->p+2; return get_u16_unal(&p); } struct tree_search_node { struct tree_hdr *hdr; unsigned char *p; unsigned char *last; unsigned char *end; int low; int high; int last_low; int last_high; }; struct tree_search { struct file *f; int last_node; int curr_node; struct tree_search_node nodes[5]; }; struct map_rect_priv { struct map_selection *xsel; struct map_selection *cur_sel; struct map_priv *m; enum file_index current_file; struct file *file; struct block_priv b; struct item item; struct town_priv town; struct poly_priv poly; struct street_priv street; struct tree_search ts; int search_country; struct item search_item; struct attr *search_attr; char *search_str; int search_partial; int search_linear; unsigned char *search_p; int search_blk_count; enum attr_type search_type,search_type_next; struct map_rect_priv *search_mr_tmp; struct item *search_item_tmp; struct block_offset *search_blk_off; int search_block; GHashTable *block_hash[file_end]; struct item_priv item3; }; int mg_country_from_isonum(int isonum); int mg_country_to_isonum(int country); int mg_country_postal_len(int country); int block_init(struct map_rect_priv *mr); int block_next(struct map_rect_priv *mr); int block_get_byindex(struct file *file, int idx, struct block_priv *blk); int block_next_lin(struct map_rect_priv *mr); int tree_search_hv(char *dirname, char *filename, unsigned int search1, unsigned int search2, int *result); int town_get(struct map_rect_priv *mr, struct town_priv *poly, struct item *item); int town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item); struct item * town_search_get_item(struct map_rect_priv *mr); int poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item); int poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item); int street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item); int street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item); int street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item); struct item * street_search_get_item(struct map_rect_priv *mr); void tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset); void tree_search_free(struct tree_search *ts); int tree_search_next(struct tree_search *ts, unsigned char **p, int dir); int tree_search_next_lin(struct tree_search *ts, unsigned char **p); struct item * housenumber_search_get_item(struct map_rect_priv *mr); struct map_rect_priv * map_rect_new_mg(struct map_priv *map, struct map_selection *sel); void map_rect_destroy_mg(struct map_rect_priv *mr); struct item *map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo); int housenumber_search_setup(struct map_rect_priv *mr); navit-0.5.0~svn5643+dfsg.1/navit/map/mg/poly.c000066400000000000000000000141511221777731700206320ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "mg.h" static void poly_coord_rewind(void *priv_data) { struct poly_priv *poly=priv_data; poly->p=poly->subpoly_start; } static int poly_coord_get(void *priv_data, struct coord *c, int count) { struct poly_priv *poly=priv_data; int ret=0; while (count--) { if (poly->p >= poly->subpoly_next) break; c->x=get_u32_unal(&poly->p); c->y=get_u32_unal(&poly->p); c++; ret++; } return ret; } static void poly_attr_rewind(void *priv_data) { struct poly_priv *poly=priv_data; poly->aidx=0; } static int poly_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct poly_priv *poly=priv_data; attr->type=attr_type; switch (attr_type) { case attr_any: while (poly->attr_next != attr_none) { if (poly_attr_get(poly, poly->attr_next, attr)) return 1; } return 0; case attr_label: attr->u.str=poly->name; poly->attr_next=attr_none; if (attr->u.str[0]) return 1; return 0; default: return 0; } return 1; } static struct item_methods poly_meth = { poly_coord_rewind, poly_coord_get, poly_attr_rewind, poly_attr_get, }; static void poly_get_data(struct poly_priv *poly, unsigned char **p) { poly->c[0].x=get_u32_unal(p); poly->c[0].y=get_u32_unal(p); poly->c[1].x=get_u32_unal(p); poly->c[1].y=get_u32_unal(p); *p+=sizeof(struct coord); poly->name=(char *)(*p); while (**p) { (*p)++; } (*p)++; poly->order=*(*p)++; poly->type=*(*p)++; poly->polys=get_u32_unal(p); poly->count=(unsigned int *)(*p); (*p)+=poly->polys*sizeof(unsigned int); poly->count_sum=get_u32_unal(p); } int poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item) { struct coord_rect r; for (;;) { if (mr->b.p >= mr->b.end) return 0; if (mr->b.p == mr->b.p_start) { poly->poly_num=0; poly->subpoly_num=0; poly->subpoly_num_all=0; poly->poly_next=mr->b.p; item->meth=&poly_meth; } if (poly->poly_num >= block_get_count(mr->b.b)) return 0; if (!poly->subpoly_num) { mr->b.p=poly->poly_next; item->id_lo=mr->b.p-mr->file->begin; poly_get_data(poly, &mr->b.p); poly->poly_next=mr->b.p+poly->count_sum*sizeof(struct coord); poly->poly_num++; r.lu=poly->c[0]; r.rl=poly->c[1]; if (mr->cur_sel && (poly->order > mr->cur_sel->order*3 || !coord_rect_overlap(&mr->cur_sel->u.c_rect, &r))) { poly->subpoly_num_all+=poly->polys; mr->b.p=poly->poly_next; continue; } switch(poly->type) { case 0x13: item->type=type_poly_wood; break; case 0x14: item->type=type_poly_town; break; case 0x15: item->type=type_poly_cemetery; break; case 0x16: item->type=type_poly_building; break; case 0x17: item->type=type_poly_museum; break; case 0x19: item->type=type_poly_place; break; case 0x1b: item->type=type_poly_commercial_center; break; case 0x1e: item->type=type_poly_industry; break; case 0x23: /* FIXME: what is this ?*/ item->type=type_poly_place; break; case 0x24: item->type=type_poly_car_parking; break; case 0x28: item->type=type_poly_airport; break; case 0x29: item->type=type_poly_station; break; case 0x2d: item->type=type_poly_hospital; break; case 0x2e: item->type=type_poly_hospital; break; case 0x2f: item->type=type_poly_university; break; case 0x30: item->type=type_poly_university; break; case 0x32: item->type=type_poly_park; break; case 0x34: item->type=type_poly_sport; break; case 0x35: item->type=type_poly_sport; break; case 0x37: item->type=type_poly_golf_course; break; case 0x38: item->type=type_poly_national_park; break; case 0x39: item->type=type_poly_nature_park; break; case 0x3c: item->type=type_poly_water; break; case 0xbc: item->type=type_water_line; break; case 0xc3: /* FIXME: what is this ?*/ item->type=type_border_state; break; case 0xc6: item->type=type_border_country; break; case 0xc7: item->type=type_border_state; break; case 0xd0: item->type=type_rail; break; default: dbg(0,"Unknown poly type 0x%x '%s' 0x%x,0x%x\n", poly->type,poly->name,r.lu.x,r.lu.y); item->type=type_street_unkn; } if (!map_selection_contains_item(mr->cur_sel, 0, item->type)) { poly->subpoly_num_all+=poly->polys; mr->b.p=poly->poly_next; continue; } } else mr->b.p=poly->subpoly_next; dbg(1,"%d %d %s\n", poly->subpoly_num_all, mr->b.block_num, poly->name); item->id_lo=poly->subpoly_num_all | (mr->b.block_num << 16); item->id_hi=(mr->current_file << 16); dbg(1,"0x%x 0x%x\n", item->id_lo, item->id_hi); poly->subpoly_next=mr->b.p+L(poly->count[poly->subpoly_num])*sizeof(struct coord); poly->subpoly_num++; poly->subpoly_num_all++; if (poly->subpoly_num >= poly->polys) poly->subpoly_num=0; poly->subpoly_start=poly->p=mr->b.p; item->priv_data=poly; poly->attr_next=attr_label; return 1; } } int poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item) { int count=id_lo & 0xffff; int ret=0; block_get_byindex(mr->m->file[mr->current_file], id_lo >> 16, &mr->b); while (count-- >= 0) { ret=poly_get(mr, poly, item); } return ret; } navit-0.5.0~svn5643+dfsg.1/navit/map/mg/street.c000066400000000000000000000705041221777731700211610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "mg.h" int coord_debug; #if 0 static void street_name_numbers_get(struct street_name_numbers *name_numbers, unsigned char **p); static void street_name_number_get(struct street_name_number *name_number, unsigned char **p); static void street_name_debug(struct street_name *sn, FILE *out) { struct street_name_numbers nns; unsigned char *p=sn->aux_data; unsigned char *end=p+sn->aux_len; int i; while (p < end) { unsigned char *pn,*pn_end; struct street_name_number nn; street_name_numbers_get(&nns, &p); fprintf(out,"0x%x 0x%x type=town_label label=\"%s(%d):0x%x:%d%s-%d%s\" debug=\"len=0x%x\"",nns.c->x,nns.c->y,sn->name2, sn->segment_count, nns.tag, nns.first.number,nns.first.suffix,nns.last.number,nns.last.suffix,nns.len); for (i = 0 ; i < sn->segment_count ; i++) { fprintf(out," debug=\"segment(%d)=0x%x\"",i,sn->segments[i].segid); } fprintf(out,"\n"); pn=nns.aux_data; pn_end=nns.aux_data+nns.aux_len; while (pn < pn_end) { street_name_number_get(&nn, &pn); fprintf(out,"0x%x 0x%x type=town_label label=\"%s:0x%x:%d%s-%d%s\" debug=\"len=0x%x\"\n", nn.c->x, nn.c->y, sn->name2, nn.tag, nn.first.number, nn.first.suffix, nn.last.number,nn.last.suffix,nn.len); } } fflush(out); } #endif static void street_name_get(struct street_name *name, unsigned char **p) { #if 0 static FILE *out; static GHashTable *hash; #endif unsigned char *start=*p; name->len=get_u16_unal(p); name->country=get_u16_unal(p); name->townassoc=get_u32_unal(p); name->name1=get_string(p); name->name2=get_string(p); name->segment_count=get_u32_unal(p); name->segments=(struct street_name_segment *)(*p); (*p)+=(sizeof (struct street_name_segment))*name->segment_count; name->aux_len=name->len-(*p-start); name->aux_data=*p; name->tmp_len=name->aux_len; name->tmp_data=name->aux_data; *p=start+name->len; #if 0 if (! out) { out=fopen("hn.txt","a"); } if (! hash) { hash=g_hash_table_new(NULL,NULL); } if (! g_hash_table_lookup(hash, *p)) { g_hash_table_insert(hash, *p, (void *)1); street_name_debug(name, out); } #endif } static int street_name_eod(struct street_name *name) { return (name->tmp_data >= name->aux_data+name->aux_len); } static void street_name_numbers_get(struct street_name_numbers *name_numbers, unsigned char **p) { unsigned char *start=*p; name_numbers->len=get_u16_unal(p); name_numbers->tag=get_u8(p); name_numbers->dist=get_u32_unal(p); name_numbers->country=get_u32_unal(p); name_numbers->c=coord_get(p); name_numbers->first.number=get_u16_unal(p); name_numbers->first.suffix=get_string(p); name_numbers->last.number=get_u16_unal(p); name_numbers->last.suffix=get_string(p); name_numbers->segment_count=get_u32_unal(p); name_numbers->segments=(struct street_name_segment *)(*p); (*p)+=sizeof(struct street_name_segment)*name_numbers->segment_count; name_numbers->aux_len=name_numbers->len-(*p-start); name_numbers->aux_data=*p; name_numbers->tmp_len=name_numbers->aux_len; name_numbers->tmp_data=name_numbers->aux_data; *p=start+name_numbers->len; } static int street_name_numbers_eod(struct street_name_numbers *name_numbers) { return (name_numbers->tmp_data >= name_numbers->aux_data+name_numbers->aux_len); } static void street_name_number_get(struct street_name_number *name_number, unsigned char **p) { unsigned char *start=*p; name_number->len=get_u16_unal(p); name_number->tag=get_u8(p); name_number->c=coord_get(p); name_number->first.number=get_u16_unal(p); name_number->first.suffix=get_string(p); name_number->last.number=get_u16_unal(p); name_number->last.suffix=get_string(p); name_number->segment=(struct street_name_segment *)p; *p=start+name_number->len; } static void street_name_get_by_id(struct street_name *name, struct file *file, unsigned long id) { unsigned char *p; if (id) { p=file->begin+id+0x2000; street_name_get(name, &p); } } static int street_get_bytes(struct coord_rect *r) { int bytes,dx,dy; bytes=2; dx=r->rl.x-r->lu.x; dy=r->lu.y-r->rl.y; dbg_assert(dx > 0); dbg_assert(dy > 0); if (dx > 32767 || dy > 32767) bytes=3; if (dx > 8388608 || dy > 8388608) bytes=4; return bytes; } static int street_get_coord(unsigned char **pos, int bytes, struct coord_rect *ref, struct coord *f) { unsigned char *p; int x,y,flags=0; p=*pos; x=*p++; x|=(*p++) << 8; if (bytes == 2) { if ( x > 0x7fff) { x=0x10000-x; flags=1; } } else if (bytes == 3) { x|=(*p++) << 16; if ( x > 0x7fffff) { x=0x1000000-x; flags=1; } } else { x|=(*p++) << 16; x|=(*p++) << 24; if (x < 0) { x=-x; flags=1; } } y=*p++; y|=(*p++) << 8; if (bytes == 3) { y|=(*p++) << 16; } else if (bytes == 4) { y|=(*p++) << 16; y|=(*p++) << 24; } if (f) { f->x=ref->lu.x+x; f->y=ref->rl.y+y; dbg(1,"0x%x,0x%x + 0x%x,0x%x = 0x%x,0x%x\n", x, y, ref->lu.x, ref->rl.y, f->x, f->y); } *pos=p; return flags; } static void street_coord_get_begin(unsigned char **p) { struct street_str *str; str=(struct street_str *)(*p); while (street_str_get_segid(str)) { str++; } (*p)=(unsigned char *)str; (*p)+=4; } static void street_coord_rewind(void *priv_data) { struct street_priv *street=priv_data; street->p=street->next=NULL; street->status=street->status_rewind; } static int street_coord_get_helper(struct street_priv *street, struct coord *c) { unsigned char *n; if (street->p+street->bytes*2 >= street->end) return 0; if (street->status >= 4) return 0; n=street->p; if (street_get_coord(&street->p, street->bytes, &street->ref, c)) { if (street->status) street->next=n; street->status+=2; if (street->status == 5) return 0; } return 1; } static int street_coord_get(void *priv_data, struct coord *c, int count) { struct street_priv *street=priv_data; int ret=0,i,scount; #ifdef DEBUG_COORD_GET int segid,debug=0; #endif if (! street->p && count) { street->p=street->coord_begin; scount=street->str-street->str_start; for (i = 0 ; i < scount ; i++) { street->status=street_str_get_segid(&street->str[i+1]) >= 0 ? 0:1; while (street_coord_get_helper(street, c)); street->p=street->next; } street->status_rewind=street->status=street_str_get_segid(&street->str[1]) >= 0 ? 0:1; } #ifdef DEBUG_COORD_GET segid=street_str_get_segid(&street->str[0]); if (segid < 0) segid=-segid; if (segid == 0x15) debug=1; if (debug) { dbg(0,"enter 0x%x\n",segid); } #endif while (count > 0) { if (street_coord_get_helper(street, c)) { #ifdef DEBUG_COORD_GET if (debug) { dbg(0,"0x%x,0x%x\n", c->x, c->y); } #endif c++; ret++; count--; } else { street->more=0; return ret; } } return ret; } static void street_attr_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static int street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct street_priv *street=priv_data; int nameid; dbg(1,"segid 0x%x\n", street_str_get_segid(street->str)); attr->type=attr_type; switch (attr_type) { case attr_any: while (street->attr_next != attr_none) { if (street_attr_get(street, street->attr_next, attr)) return 1; } return 0; case attr_label: street->attr_next=attr_street_name; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name2; if (attr->u.str && attr->u.str[0]) return 1; attr->u.str=street->name.name1; if (attr->u.str && attr->u.str[0]) return 1; return 0; case attr_street_name: street->attr_next=attr_street_name_systematic; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name2; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_street_name_systematic: street->attr_next=attr_flags; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name1; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_flags: attr->u.num=street->flags; street->attr_next=attr_country_id; return 1; case attr_country_id: street->attr_next=attr_debug; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.num=mg_country_to_isonum(street->name.country); return 1; case attr_debug: street->attr_next=attr_none; { struct street_str *str=street->str; sprintf(street->debug,"order:0x%x\nsegid:0x%x\nlimit:0x%x\nunknown2:0x%x\nunknown3:0x%x\ntype:0x%x\nnameid:0x%x\ntownassoc:0x%x",street_header_get_order(street->header),street_str_get_segid(str),street_str_get_limit(str),street_str_get_unknown2(str),street_str_get_unknown3(str),street_str_get_type(str),street_str_get_nameid(str), street->name.len ? street->name.townassoc : 0); attr->u.str=street->debug; } return 1; default: return 0; } return 1; } static struct item_methods street_meth = { street_coord_rewind, street_coord_get, street_attr_rewind, street_attr_get, }; static void street_get_data(struct street_priv *street, unsigned char **p) { street->header=(struct street_header *)(*p); (*p)+=sizeof(struct street_header); street->type_count=street_header_get_count(street->header); street->type=(struct street_type *)(*p); (*p)+=street->type_count*sizeof(struct street_type); } /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ static unsigned char limit[]={0,0,1,1,1,2,2,4,6,6,12,13,14,20,20,20,20,20,20}; int street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item) { int *flags; struct coord_rect r; for (;;) { while (street->more) { struct coord c; street_coord_get(street, &c, 1); } #if 0 if (street->housenumber) { if (street_get_housenumber(mr, street, item)) return 1; street->housenumber=0; } #endif if (mr->b.p == mr->b.p_start) { street_get_data(street, &mr->b.p); street->name_file=mr->m->file[file_strname_stn]; if (mr->cur_sel && street_header_get_order(street->header) > limit[mr->cur_sel->order]) return 0; street->end=mr->b.end; block_get_r(mr->b.b, &r); street->ref=r; street->bytes=street_get_bytes(&r); street->str_start=street->str=(struct street_str *)mr->b.p; street->coord_begin=mr->b.p; street_coord_get_begin(&street->coord_begin); street->p=street->coord_begin; street->type--; item->meth=&street_meth; item->priv_data=street; } else { street->str++; street->p=street->next; } if (! street_str_get_segid(street->str)) return 0; if (street_str_get_segid(street->str) < 0) street->type++; #if 0 dbg_assert(street->p != NULL); #endif street->next=NULL; street->status_rewind=street->status=street_str_get_segid(&street->str[1]) >= 0 ? 0:1; #if 0 if (street->type->country != 0x31) { printf("country=0x%x\n", street->type->country); } #endif item->id_hi=street_type_get_country(street->type) | (mr->current_file << 16); item->id_lo=street_str_get_segid(street->str) > 0 ? street_str_get_segid(street->str) : -street_str_get_segid(street->str); switch(street_str_get_type(street->str) & 0x1f) { case 0xf: /* very small street */ if (street_str_get_limit(street->str) == 0x33) item->type=type_street_nopass; else item->type=type_street_0; break; case 0xd: item->type=type_ferry; break; case 0xc: /* small street */ item->type=type_street_1_city; break; case 0xb: item->type=type_street_2_city; break; case 0xa: if ((street_str_get_limit(street->str) == 0x03 || street_str_get_limit(street->str) == 0x30) && street_header_get_order(street->header) < 4) item->type=type_street_4_city; else item->type=type_street_3_city; break; case 0x9: if (street_header_get_order(street->header) < 5) item->type=type_street_4_city; else if (street_header_get_order(street->header) < 7) item->type=type_street_2_city; else item->type=type_street_1_city; break; case 0x8: item->type=type_street_2_land; break; case 0x7: if ((street_str_get_limit(street->str) == 0x03 || street_str_get_limit(street->str) == 0x30) && street_header_get_order(street->header) < 4) item->type=type_street_4_city; else item->type=type_street_3_land; break; case 0x6: item->type=type_ramp; break; case 0x5: item->type=type_street_4_land; break; case 0x4: item->type=type_street_4_land; break; case 0x3: item->type=type_street_n_lanes; break; case 0x2: item->type=type_highway_city; break; case 0x1: item->type=type_highway_land; break; default: item->type=type_street_unkn; dbg(0,"unknown type 0x%x\n",street_str_get_type(street->str)); } flags=item_get_default_flags(item->type); if (flags) street->flags=*flags; else street->flags=0; if (street_str_get_type(street->str) & 0x40) { street->flags|=(street_str_get_limit(street->str) & 0x30) ? AF_ONEWAYREV:0; street->flags|=(street_str_get_limit(street->str) & 0x03) ? AF_ONEWAY:0; } else { street->flags|=(street_str_get_limit(street->str) & 0x30) ? AF_ONEWAY:0; street->flags|=(street_str_get_limit(street->str) & 0x03) ? AF_ONEWAYREV:0; } #if 0 coord_debug=(street->str->unknown2 != 0x40 || street->str->unknown3 != 0x40); if (coord_debug) { item->type=type_street_unkn; printf("%d %02x %02x %02x %02x\n", street->str->segid, street->str->type, street->str->limit, street->str->unknown2, street->str->unknown3); } #endif street->p_rewind=street->p; street->name.len=0; street->attr_next=attr_label; street->more=1; street->housenumber=1; street->hn_count=0; if (!map_selection_contains_item(mr->cur_sel, 0, item->type)) continue; item->meth=&street_meth; item->priv_data=street; return 1; } } int street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item) { int country=id_hi & 0xffff; int res; struct coord_rect r; dbg(1,"enter(%p,%p,0x%x,0x%x,%p)\n", mr, street, id_hi, id_lo, item); if (! country) return 0; if (! tree_search_hv(mr->m->dirname, "street", (id_lo >> 8) | (country << 24), id_lo & 0xff, &res)) return 0; dbg(1,"res=0x%x (blk=0x%x)\n", res, res >> 12); block_get_byindex(mr->m->file[mr->current_file], res >> 12, &mr->b); street_get_data(street, &mr->b.p); street->name_file=mr->m->file[file_strname_stn]; street->end=mr->b.end; block_get_r(mr->b.b, &r); street->ref=r; street->bytes=street_get_bytes(&r); street->str_start=street->str=(struct street_str *)mr->b.p; street->coord_begin=mr->b.p; street_coord_get_begin(&street->coord_begin); street->p=street->coord_begin; street->type--; item->meth=&street_meth; item->priv_data=street; street->str+=(res & 0xfff)-1; dbg(1,"segid 0x%x\n", street_str_get_segid(&street->str[1])); return street_get(mr, street, item); #if 0 mr->b.p=mr->b.block_start+(res & 0xffff); return town_get(mr, twn, item); #endif return 0; } struct street_name_index { int block; unsigned short country; int town_assoc; char name[0]; } __attribute__((packed)); static unsigned char latin1_tolower(unsigned char c) { if (c >= 'A' && c <= 'Z') return c - 'A' + 'a'; if (c == 0xc4 || c == 0xc9 || c == 0xd6 || c == 0xdc) return c+0x20; return c; } static unsigned char latin1_tolower_ascii(unsigned char c) { unsigned char ret=latin1_tolower(c); switch (ret) { case 0xe4: return 'a'; case 0xe9: return 'e'; case 0xf6: return 'o'; case 0xfc: return 'u'; default: if (ret >= 0x80) dbg(1,"ret=0x%x\n",c); return ret; } } static int strncasecmp_latin1(char *str1, char *str2, int len) { int d; while (len--) { d=latin1_tolower((unsigned char)(*str1))-latin1_tolower((unsigned char)(*str2)); if (d) return d; if (! *str1) return 0; str1++; str2++; } return 0; } static int strncasecmp_latin1_ascii(char *str1, char *str2, int len) { int d; while (len--) { d=latin1_tolower_ascii((unsigned char)(*str1))-latin1_tolower_ascii((unsigned char)(*str2)); if (d) return d; if (! *str1) return 0; str1++; str2++; } return 0; } static int street_search_compare_do(struct map_rect_priv *mr, int country, int town_assoc, char *name) { int d,len; dbg(1,"enter"); dbg(1,"country 0x%x town_assoc 0x%x name '%s'\n", country, town_assoc, name); d=(mr->search_item.id_hi & 0xffff)-country; dbg(1,"country %d (%d vs %d)\n", d, mr->search_item.id_hi & 0xffff, country); if (!d) { if (mr->search_item.id_lo == town_assoc ) { dbg(1,"town_assoc match (0x%x)\n", town_assoc); len=mr->search_partial ? strlen(mr->search_str):INT_MAX; d=strncasecmp_latin1(mr->search_str, name, len); if (!strncasecmp_latin1_ascii(mr->search_str, name, len)) d=0; dbg(1,"string %d\n", d); } else { if (town_assoc < mr->search_item.id_lo) d=1; else d=-1; dbg(1,"assoc %d 0x%x-0x%x\n",d, mr->search_item.id_lo, town_assoc); } } dbg(1,"d=%d\n", d); return d; } static int street_search_compare(unsigned char **p, struct map_rect_priv *mr) { struct street_name_index *i; int ret; dbg(1,"enter\n"); i=(struct street_name_index *)(*p); *p+=sizeof(*i)+strlen(i->name)+1; dbg(1,"block 0x%x\n", i->block); ret=street_search_compare_do(mr, i->country, i->town_assoc, i->name); if (ret <= 0) mr->search_block=i->block; return ret; } static void street_name_coord_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static void street_name_attr_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static int street_name_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct street_name_numbers snns; unsigned char *p=mr->street.name.aux_data; dbg(1,"aux_data=%p\n", p); if (count) { street_name_numbers_get(&snns, &p); street_name_numbers_get_coord(&snns, c); return 1; } return 0; } #if 0 static void debug(struct map_rect_priv *mr) { int i; struct street_name_numbers nns; unsigned char *p=mr->street.name.aux_data; unsigned char *end=p+mr->street.name.aux_len; printf("len=0x%x\n", mr->street.name.aux_len); for (i = 0 ; i < mr->street.name.aux_len ; i++) { printf("%02x ",mr->street.name.aux_data[i]); } printf("\n"); { while (p < end) { unsigned char *pn,*pn_end; struct street_name_number nn; street_name_numbers_get(&nns, &p); printf("name_numbers:\n"); printf(" len 0x%x\n", nns.len); printf(" tag 0x%x\n", nns.tag); printf(" dist 0x%x\n", nns.dist); printf(" country 0x%x\n", nns.country); printf(" coord 0x%x,0x%x\n", nns.c->x, nns.c->y); printf(" first %d\n", nns.first.number); printf(" last %d\n", nns.last.number); printf(" segment count 0x%x\n", nns.segment_count); printf(" aux_len 0x%x\n", nns.aux_len); pn=nns.aux_data; pn_end=nns.aux_data+nns.aux_len; while (pn < pn_end) { printf(" number:\n"); street_name_number_get(&nn, &pn); printf(" len 0x%x\n", nn.len); printf(" tag 0x%x\n", nn.tag); printf(" coord 0x%x,0x%x\n", nn.c->x, nn.c->y); printf(" first %d\n", nn.first.number); printf(" last %d\n", nn.last.number); } } } } #endif static int street_name_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; attr->type=attr_type; switch (attr_type) { case attr_street_name: attr->u.str=mr->street.name.name2; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_street_name_systematic: attr->u.str=mr->street.name.name1; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_name: case attr_district_name: case attr_postal: if (!mr->search_item_tmp) mr->search_item_tmp=map_rect_get_item_byid_mg(mr->search_mr_tmp, mr->street.name_numbers.country | (file_town_twn << 16), mr->street.name_numbers.dist); if (!mr->search_item_tmp) return 0; return item_attr_get(mr->search_item_tmp, attr_type, attr); default: dbg(0,"unknown attr %s\n",attr_to_name(attr_type)); return 0; } } static struct item_methods street_name_meth = { street_name_coord_rewind, street_name_coord_get, street_name_attr_rewind, street_name_attr_get, }; int street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item) { mr->current_file=id_hi >> 16; street->name_file=mr->m->file[mr->current_file]; item->type=type_street_name; item->id_hi=id_hi; item->id_lo=id_lo; item->meth=&street_name_meth; item->map=NULL; item->priv_data=mr; mr->b.p=street->name_file->begin+item->id_lo; dbg(1,"last %p map %p file %d begin %p\n", mr->b.p, mr->m, mr->current_file, mr->m->file[mr->current_file]->begin); street_name_get(&street->name, &mr->b.p); return 1; } static struct item * street_search_get_item_street_name(struct map_rect_priv *mr) { int dir=1,leaf; unsigned char *last; dbg(1,"enter\n"); if (! mr->search_blk_count) { dbg(1,"partial 0x%x '%s' ***\n", mr->town.street_assoc, mr->search_str); if (mr->search_linear) return NULL; dbg(1,"tree_search_next\n"); mr->search_block=-1; while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) { dir=street_search_compare(&mr->search_p, mr); } dbg(1,"dir=%d mr->search_block=0x%x\n", dir, mr->search_block); if (mr->search_block == -1) return NULL; mr->search_blk_count=1; block_get_byindex(mr->m->file[file_strname_stn], mr->search_block, &mr->b); mr->b.p=mr->b.block_start+12; } dbg(1,"name id 0x%x\n", mr->b.p-mr->m->file[file_strname_stn]->begin); if (! mr->search_blk_count) return NULL; for (;;) { if (mr->b.p >= mr->b.end) { if (!block_next_lin(mr)) { dbg(1,"end of blocks in %p, %p\n", mr->m->file[file_strname_stn]->begin, mr->m->file[file_strname_stn]->end); return NULL; } mr->b.p=mr->b.block_start+12; } while (mr->b.p < mr->b.end) { last=mr->b.p; street_name_get(&mr->street.name, &mr->b.p); dir=street_search_compare_do(mr, mr->street.name.country, mr->street.name.townassoc, mr->street.name.name2); dbg(1,"country 0x%x assoc 0x%x name1 '%s' name2 '%s' dir=%d\n", mr->street.name.country, mr->street.name.townassoc, mr->street.name.name1, mr->street.name.name2, dir); if (dir < 0) { dbg(1,"end of data\n"); mr->search_blk_count=0; return NULL; } if (!dir) { dbg(1,"result country 0x%x assoc 0x%x name1 '%s' name2 '%s' dir=%d aux_data=%p len=0x%x\n", mr->street.name.country, mr->street.name.townassoc, mr->street.name.name1, mr->street.name.name2, dir, mr->street.name.aux_data, mr->street.name.aux_len); mr->item.type = type_street_name; mr->item.id_hi=(file_strname_stn << 16); mr->item.id_lo=last-mr->m->file[file_strname_stn]->begin; dbg(1,"id 0x%x 0x%x last %p map %p file %d begin %p\n", mr->item.id_hi, mr->item.id_lo, last, mr->m, mr->current_file, mr->m->file[mr->current_file]->begin); mr->item.meth=&street_name_meth; mr->item.map=NULL; mr->item.priv_data=mr; /* debug(mr); */ dbg(1,"last %p\n",last); return &mr->item; } } } } struct item * street_search_get_item(struct map_rect_priv *mr) { struct item *item; for (;;) { if (!mr->street.name.tmp_data || street_name_eod(&mr->street.name)) { item=street_search_get_item_street_name(mr); if (!item) return NULL; if (!mr->street.name.aux_len) return item; } mr->item.id_hi++; street_name_numbers_get(&mr->street.name_numbers, &mr->street.name.tmp_data); mr->search_item_tmp=NULL; return &mr->item; } } static int street_name_numbers_next(struct map_rect_priv *mr) { if (street_name_eod(&mr->street.name)) return 0; dbg(1,"%p vs %p\n",mr->street.name.tmp_data, mr->street.name.aux_data); street_name_numbers_get(&mr->street.name_numbers, &mr->street.name.tmp_data); return 1; } static int street_name_number_next(struct map_rect_priv *mr) { if (street_name_numbers_eod(&mr->street.name_numbers)) return 0; street_name_number_get(&mr->street.name_number, &mr->street.name_numbers.tmp_data); sprintf(mr->street.first_number,"%d%s",mr->street.name_number.first.number,mr->street.name_number.first.suffix); sprintf(mr->street.last_number,"%d%s",mr->street.name_number.last.number,mr->street.name_number.last.suffix); mr->street.current_number[0]='\0'; return 1; } static void housenumber_coord_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static void housenumber_attr_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static int housenumber_coord_get(void *priv_data, struct coord *c, int count) { return 0; } static int housenumber_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; attr->type=attr_type; switch (attr_type) { case attr_house_number: attr->u.str=mr->street.current_number; return 1; case attr_town_name: case attr_district_name: case attr_postal: if (!mr->search_item_tmp) mr->search_item_tmp=map_rect_get_item_byid_mg(mr->search_mr_tmp, mr->street.name_numbers.country | (file_town_twn << 16), mr->street.name_numbers.dist); if (!mr->search_item_tmp) return 0; return item_attr_get(mr->search_item_tmp, attr_type, attr); default: dbg(0,"unknown attr %s\n",attr_to_name(attr_type)); return 0; } } static struct item_methods housenumber_meth = { housenumber_coord_rewind, housenumber_coord_get, housenumber_attr_rewind, housenumber_attr_get, }; int housenumber_search_setup(struct map_rect_priv *mr) { dbg(1,"enter (0x%x,0x%x)\n",mr->search_item.id_hi,mr->search_item.id_lo); int id=mr->search_item.id_hi & 0xff; mr->current_file=file_strname_stn; mr->street.name_file=mr->m->file[mr->current_file]; mr->b.p=mr->street.name_file->begin+mr->search_item.id_lo; mr->search_str=g_strdup(mr->search_attr->u.str); dbg(1,"last %p\n",mr->b.p); street_name_get(&mr->street.name, &mr->b.p); #if 0 debug(mr); #endif while (id > 0) { id--; dbg(1,"loop\n"); if (!street_name_numbers_next(mr)) return 0; } mr->item.type=type_house_number; mr->item.priv_data=mr; mr->item.id_hi=mr->search_item.id_hi + 0x100; mr->item.meth=&housenumber_meth; if (!id) mr->item.id_hi+=1; mr->item.id_lo=mr->search_item.id_lo; dbg(1,"getting name_number %p vs %p + %d\n",mr->street.name_numbers.tmp_data,mr->street.name_numbers.aux_data, mr->street.name_numbers.aux_len); if (!street_name_number_next(mr)) return 0; dbg(1,"enter\n"); // debug(mr); return 1; } static int house_number_next(char *number, char *first, char *last, int interpolation, int *percentage) { int firstn=atoi(first); int lastn=atoi(last); int current,delta,len=lastn-firstn; if (interpolation) { len/=2; } if (!number[0]) { strcpy(number,first); delta=0; } else { current=atoi(number)+(interpolation ? 2:1); if (current > lastn) return 0; sprintf(number,"%d",current); delta=current-firstn; } if (percentage) { if (len) *percentage=delta*100/len; else *percentage=50; } return 1; } struct item * housenumber_search_get_item(struct map_rect_priv *mr) { int d; dbg(1,"enter %s %s\n",mr->street.first_number,mr->street.last_number); for (;;) { if (!house_number_next(mr->street.current_number, mr->street.first_number, mr->street.last_number, 0, NULL)) { if (!street_name_number_next(mr)) return NULL; continue; } if (mr->search_partial) d=strncasecmp(mr->search_str, mr->street.current_number, strlen(mr->search_str)); else d=strcasecmp(mr->search_str, mr->street.current_number); if (!d) { mr->search_item_tmp=NULL; return &mr->item; } } } navit-0.5.0~svn5643+dfsg.1/navit/map/mg/town.c000066400000000000000000000205311221777731700206350ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "mg.h" static void town_coord_rewind(void *priv_data) { struct town_priv *twn=priv_data; twn->cidx=0; } static int town_coord_get(void *priv_data, struct coord *c, int count) { struct town_priv *twn=priv_data; if (twn->cidx || count <= 0) return 0; twn->cidx=1; *c=twn->c; return 1; } static void town_attr_rewind(void *priv_data) { struct town_priv *twn=priv_data; twn->aidx=0; twn->attr_next=attr_label; } static int town_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct town_priv *twn=priv_data; int len; attr->type=attr_type; switch (attr_type) { case attr_any: while (twn->attr_next != attr_none) { if (town_attr_get(twn, twn->attr_next, attr)) return 1; } return 0; case attr_label: attr->u.str=twn->district; twn->attr_next=attr_town_name; if (attr->u.str[0]) return 1; attr->u.str=twn->name; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_name: attr->u.str=twn->name; twn->attr_next=attr_town_postal; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_postal: case attr_postal: strncpy(twn->postal, twn->postal_code1, 32); attr->u.str=twn->postal; len=mg_country_postal_len(twn->country); if (!len) len=31; twn->postal[len]='\0'; twn->attr_next=attr_district_name; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_district_name: attr->u.str=twn->district; twn->attr_next=attr_debug; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_streets_item: twn->town_attr_item.type=type_town_streets; twn->town_attr_item.id_hi=twn->country | (file_town_twn << 16) | 0x10000000; twn->town_attr_item.id_lo=twn->street_assoc; attr->u.item=&twn->town_attr_item; twn->attr_next=attr_debug; return 1; case attr_debug: sprintf(twn->debug, "order %d\nsize %d\nstreet_assoc 0x%x", twn->order, twn->size, twn->street_assoc); attr->u.str=twn->debug; twn->attr_next=attr_none; return 1; default: dbg(1, "Don't know about attribute %d[%04X]=%s yet\n", attr_type, attr_type, attr_to_name(attr_type)); return 0; } return 1; } static struct item_methods town_meth = { town_coord_rewind, town_coord_get, town_attr_rewind, town_attr_get, }; static void town_get_data(struct town_priv *twn, unsigned char **p) { twn->id=get_u32_unal(p); twn->c.x=get_u32_unal(p); twn->c.y=get_u32_unal(p); twn->name=get_string(p); twn->district=get_string(p); twn->postal_code1=get_string(p); twn->order=get_u8(p); /* 1-15 (19) */ twn->country=get_u16_unal(p); twn->type=get_u8(p); twn->unknown2=get_u32_unal(p); twn->size=get_u8(p); twn->street_assoc=get_u32_unal(p); twn->unknown3=get_u8(p); twn->postal_code2=get_string(p); twn->unknown4=get_u32_unal(p); #if 0 printf("%s\t%s\t%s\t%d\t%d\t%d\n",twn->name,twn->district,twn->postal_code1,twn->order, twn->country, twn->type); #endif } /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ static unsigned char limit[]={0,1,2,2,4,6,8,10,11,13,14,14,14,20,20,20,20,20,20}; static enum item_type town_item[]={type_town_label_5e1, type_town_label_1e2, type_town_label_2e2, type_town_label_5e2, type_town_label_1e3, type_town_label_1e3, type_town_label_2e3, type_town_label_5e3, type_town_label_1e4, type_town_label_2e4, type_town_label_5e4, type_town_label_1e5, type_town_label_1e5, type_town_label_2e5, type_town_label_5e5, type_town_label_1e6, type_town_label_2e6}; static enum item_type district_item[]={type_district_label_5e1, type_district_label_1e2, type_district_label_2e2, type_district_label_5e2, type_district_label_1e3, type_district_label_1e3, type_district_label_2e3, type_district_label_5e3, type_district_label_1e4, type_district_label_2e4, type_district_label_5e4, type_district_label_1e5, type_district_label_1e5, type_district_label_2e5, type_district_label_5e5, type_district_label_1e6, type_district_label_2e6}; int town_get(struct map_rect_priv *mr, struct town_priv *twn, struct item *item) { int size; for (;;) { if (mr->b.p >= mr->b.end) return 0; town_get_data(twn, &mr->b.p); twn->cidx=0; twn->aidx=0; twn->attr_next=attr_label; if (! mr->cur_sel || (twn->order <= limit[mr->cur_sel->order] && coord_rect_contains(&mr->cur_sel->u.c_rect,&twn->c))) { switch(twn->type) { case 1: size=twn->size; if (size >= sizeof(town_item)/sizeof(enum item_type)) size=sizeof(town_item)/sizeof(enum item_type)-1; item->type=town_item[size]; break; case 3: size=twn->size; if (size == 6 && twn->order < 14) size++; if (size == 5 && twn->order < 14) size+=2; if (size >= sizeof(district_item)/sizeof(enum item_type)) size=sizeof(district_item)/sizeof(enum item_type)-1; item->type=district_item[size]; break; case 4: item->type=type_port_label; break; case 9: item->type=type_highway_exit_label; break; default: printf("unknown town type 0x%x '%s' '%s' 0x%x,0x%x\n", twn->type, twn->name, twn->district, twn->c.x, twn->c.y); item->type=type_town_label; } if (map_selection_contains_item(mr->cur_sel, 0, item->type)) { item->id_hi=twn->country | (mr->current_file << 16); item->id_lo=twn->id; item->priv_data=twn; item->meth=&town_meth; return 1; } } } } int town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item) { int country=id_hi & 0xffff; int res; if (!tree_search_hv(mr->m->dirname, "town", (id_lo >> 8) | (country << 24), id_lo & 0xff, &res)) return 0; block_get_byindex(mr->m->file[mr->current_file], res >> 16, &mr->b); mr->b.p=mr->b.block_start+(res & 0xffff); return town_get(mr, twn, item); } static int town_search_compare(unsigned char **p, struct map_rect_priv *mr) { int country, d; char *name; if (mr->search_type == attr_town_postal) { mr->search_blk_count=1; mr->search_blk_off=(struct block_offset *)(*p); *p+=4; name=get_string(p); d=0; } else { country=get_u16_unal(p); dbg(1,"country 0x%x ", country); name=get_string(p); dbg(1,"name '%s' ",name); mr->search_blk_count=get_u32_unal(p); mr->search_blk_off=(struct block_offset *)(*p); dbg(1,"len %d ", mr->search_blk_count); (*p)+=mr->search_blk_count*4; d=mr->search_country-country; } if (!d) { if (mr->search_partial) d=strncasecmp(mr->search_str, name, strlen(mr->search_str)); else d=strcasecmp(mr->search_str, name); } dbg(1,"%d \n",d); return d; } struct item * town_search_get_item(struct map_rect_priv *mr) { int dir=1,leaf; if (! mr->search_blk_count) { dbg(1,"partial %d 0x%x '%s' ***\n", mr->search_partial, mr->search_country, mr->search_str); if (! mr->search_linear) { while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) { dir=town_search_compare(&mr->search_p, mr); if (! dir) { mr->search_linear=1; mr->search_p=NULL; break; } } if (! mr->search_linear) { dbg(1,"not found\n"); return NULL; } } if (! tree_search_next_lin(&mr->ts, &mr->search_p)) { dbg(1,"linear not found\n"); return NULL; } if (town_search_compare(&mr->search_p, mr)) { dbg(1,"no match\n"); return NULL; } dbg(1,"found %d blocks\n",mr->search_blk_count); } if (! mr->search_blk_count) return NULL; dbg(1,"block 0x%x offset 0x%x\n", block_offset_get_block(mr->search_blk_off), block_offset_get_offset(mr->search_blk_off)); block_get_byindex(mr->m->file[mr->current_file], block_offset_get_block(mr->search_blk_off), &mr->b); mr->b.p=mr->b.block_start+block_offset_get_offset(mr->search_blk_off); town_get(mr, &mr->town, &mr->item); mr->search_blk_off++; mr->search_blk_count--; return &mr->item; } navit-0.5.0~svn5643+dfsg.1/navit/map/mg/tree.c000066400000000000000000000204111221777731700206020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "mg.h" struct tree_hdr { /*unsigned int addr; unsigned int size; unsigned int low;*/ unsigned char p[12]; }; static inline unsigned int tree_hdr_get_addr(struct tree_hdr * tree) { unsigned char *p = tree->p; return get_u32(&p); } static inline unsigned int tree_hdr_get_size(struct tree_hdr * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } static inline unsigned int tree_hdr_get_low(struct tree_hdr * tree) { unsigned char *p = tree->p+8; return get_u32(&p); } struct tree_hdr_h { /* unsigned int addr; unsigned int size;*/ unsigned char p[8]; }; static inline unsigned int tree_hdr_h_get_addr(struct tree_hdr_h * tree) { unsigned char *p = tree->p; return get_u32(&p); } static inline unsigned int tree_hdr_h_get_size(struct tree_hdr_h * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } struct tree_leaf_h { /* unsigned int lower; unsigned int higher; unsigned int match; unsigned int value;*/ unsigned char p[16]; }; static inline unsigned int tree_leaf_h_get_lower(struct tree_leaf_h * tree) { unsigned char *p = tree->p; return get_u32(&p); } static inline unsigned int tree_leaf_h_get_higher(struct tree_leaf_h * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } static inline unsigned int tree_leaf_h_get_match(struct tree_leaf_h * tree) { unsigned char *p = tree->p+8; return get_u32(&p); } static inline unsigned int tree_leaf_h_get_value(struct tree_leaf_h * tree) { unsigned char *p = tree->p+12; return get_u32(&p); } struct tree_hdr_v { /*unsigned int count; unsigned int next; unsigned int unknown;*/ unsigned char p[12]; }; static inline unsigned int tree_hdr_v_get_count(struct tree_hdr_v * tree) { unsigned char *p = tree->p; return get_u32_unal(&p); } static inline unsigned int tree_hdr_v_get_next(struct tree_hdr_v * tree) { unsigned char *p = tree->p+4; return get_u32_unal(&p); } static inline unsigned int tree_hdr_v_get_unknown(struct tree_hdr_v * tree) { unsigned char *p = tree->p+8; return get_u32_unal(&p); } struct tree_leaf_v { unsigned char key; /*int value;*/ unsigned char p[4]; } __attribute__((packed)); static inline int tree_leaf_v_get_value(struct tree_leaf_v * tree) { unsigned char *p = tree->p; return get_u32_unal(&p); } static int tree_search_h(struct file *file, unsigned int search) { unsigned char *p=file->begin,*end; int last,i=0,value,lower; struct tree_hdr_h *thdr; struct tree_leaf_h *tleaf; dbg(1,"enter\n"); while (i++ < 1000) { thdr=(struct tree_hdr_h *)p; p+=sizeof(*thdr); end=p+tree_hdr_h_get_size(thdr); dbg(1,"@0x%x\n", p-file->begin); last=0; while (p < end) { tleaf=(struct tree_leaf_h *)p; p+=sizeof(*tleaf); dbg(1,"low:0x%x high:0x%x match:0x%x val:0x%x search:0x%x\n", tree_leaf_h_get_lower(tleaf), tree_leaf_h_get_higher(tleaf), tree_leaf_h_get_match(tleaf), tree_leaf_h_get_value(tleaf), search); value=tree_leaf_h_get_value(tleaf); if (value == search) return tree_leaf_h_get_match(tleaf); if (value > search) { dbg(1,"lower\n"); lower=tree_leaf_h_get_lower(tleaf); if (lower) last=lower; break; } last=tree_leaf_h_get_higher(tleaf); } if (! last || last == -1) return 0; p=file->begin+last; } return 0; } static int tree_search_v(struct file *file, int offset, int search) { unsigned char *p=file->begin+offset; int i=0,count,next; struct tree_hdr_v *thdr; struct tree_leaf_v *tleaf; while (i++ < 1000) { thdr=(struct tree_hdr_v *)p; p+=sizeof(*thdr); count=tree_hdr_v_get_count(thdr); dbg(1,"offset=0x%x count=0x%x\n", p-file->begin, count); while (count--) { tleaf=(struct tree_leaf_v *)p; p+=sizeof(*tleaf); dbg(1,"0x%x 0x%x\n", tleaf->key, search); if (tleaf->key == search) return tree_leaf_v_get_value(tleaf); } next=tree_hdr_v_get_next(thdr); if (! next) break; p=file->begin+next; } return 0; } int tree_search_hv(char *dirname, char *filename, unsigned int search_h, unsigned int search_v, int *result) { struct file *f_idx_h, *f_idx_v; char buffer[4096]; int h,v; dbg(1,"enter(%s, %s, 0x%x, 0x%x, %p)\n",dirname, filename, search_h, search_v, result); sprintf(buffer, "%s/%s.h1", dirname, filename); f_idx_h=file_create_caseinsensitive(buffer, 0); if ((!f_idx_h) || (!file_mmap(f_idx_h))) return 0; sprintf(buffer, "%s/%s.v1", dirname, filename); f_idx_v=file_create_caseinsensitive(buffer, 0); dbg(1,"%p %p\n", f_idx_h, f_idx_v); if ((!f_idx_v) || (!file_mmap(f_idx_v))) { file_destroy(f_idx_h); return 0; } if ((h=tree_search_h(f_idx_h, search_h))) { dbg(1,"h=0x%x\n", h); if ((v=tree_search_v(f_idx_v, h, search_v))) { dbg(1,"v=0x%x\n", v); *result=v; file_destroy(f_idx_v); file_destroy(f_idx_h); dbg(1,"return 1\n"); return 1; } } file_destroy(f_idx_v); file_destroy(f_idx_h); dbg(1,"return 0\n"); return 0; } static struct tree_search_node * tree_search_enter(struct tree_search *ts, int offset) { struct tree_search_node *tsn=&ts->nodes[++ts->curr_node]; unsigned char *p; p=ts->f->begin+offset; tsn->hdr=(struct tree_hdr *)p; tsn->p=p+sizeof(struct tree_hdr); tsn->last=tsn->p; tsn->end=p+tree_hdr_get_size(tsn->hdr); tsn->low=tree_hdr_get_low(tsn->hdr); tsn->high=tree_hdr_get_low(tsn->hdr); dbg(1,"pos 0x%x addr 0x%x size 0x%x low 0x%x end 0x%x\n", p-ts->f->begin, tree_hdr_get_addr(tsn->hdr), tree_hdr_get_size(tsn->hdr), tree_hdr_get_low(tsn->hdr), tsn->end-ts->f->begin); return tsn; } int tree_search_next(struct tree_search *ts, unsigned char **p, int dir) { struct tree_search_node *tsn=&ts->nodes[ts->curr_node]; if (! *p) *p=tsn->p; dbg(1,"next *p=%p dir=%d\n", *p, dir); dbg(1,"low1=0x%x high1=0x%x\n", tsn->low, tsn->high); if (dir <= 0) { dbg(1,"down 0x%x\n", tsn->low); if (tsn->low != 0xffffffff) { tsn=tree_search_enter(ts, tsn->low); *p=tsn->p; tsn->high=get_u32(p); ts->last_node=ts->curr_node; dbg(1,"saving last2 %d 0x%x\n", ts->curr_node, tsn->last-ts->f->begin); dbg(1,"high2=0x%x\n", tsn->high); return 0; } return -1; } tsn->low=tsn->high; tsn->last=*p; tsn->high=get_u32_unal(p); dbg(1,"saving last3 %d %p\n", ts->curr_node, tsn->last); if (*p < tsn->end) return (tsn->low == 0xffffffff ? 1 : 0); dbg(1,"end reached high=0x%x\n",tsn->high); if (tsn->low != 0xffffffff) { dbg(1,"low 0x%x\n", tsn->low); tsn=tree_search_enter(ts, tsn->low); *p=tsn->p; tsn->high=get_u32_unal(p); ts->last_node=ts->curr_node; dbg(1,"saving last4 %d 0x%x\n", ts->curr_node, tsn->last-ts->f->begin); dbg(1,"high4=0x%x\n", tsn->high); return 0; } return -1; } int tree_search_next_lin(struct tree_search *ts, unsigned char **p) { struct tree_search_node *tsn=&ts->nodes[ts->curr_node]; int high; dbg(1,"pos=%d 0x%x\n", ts->curr_node, *p-ts->f->begin); if (*p) ts->nodes[ts->last_node].last=*p; *p=tsn->last; for (;;) { high=get_u32_unal(p); if (*p < tsn->end) { ts->last_node=ts->curr_node; while (high != 0xffffffff) { tsn=tree_search_enter(ts, high); dbg(1,"reload %d\n",ts->curr_node); high=tsn->low; } return 1; } dbg(1,"eon %d 0x%x 0x%x\n", ts->curr_node, *p-ts->f->begin, tsn->end-ts->f->begin); if (! ts->curr_node) break; ts->curr_node--; tsn=&ts->nodes[ts->curr_node]; *p=tsn->last; } return 0; } void tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset) { char buffer[4096]; sprintf(buffer, "%s/%s", dirname, filename); ts->f=file_create_caseinsensitive(buffer, 0); ts->curr_node=-1; if (ts->f) { file_mmap(ts->f); tree_search_enter(ts, offset); } } void tree_search_free(struct tree_search *ts) { if (ts->f) file_destroy(ts->f); } navit-0.5.0~svn5643+dfsg.1/navit/map/shapefile/000077500000000000000000000000001221777731700210365ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/shapefile/CMakeLists.txt000066400000000000000000000000561221777731700235770ustar00rootroot00000000000000module_add_library(map_shapefile shapefile.c) navit-0.5.0~svn5643+dfsg.1/navit/map/shapefile/Makefile.am000066400000000000000000000010271221777731700230720ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @SHAPEFILE_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_shapefile if PLUGINS modulemap_LTLIBRARIES = libmap_shapefile.la else noinst_LTLIBRARIES = libmap_shapefile.la endif libmap_shapefile_la_SOURCES = shapefile.c libmap_shapefile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ if HAVE_SYSTEM_SHAPEFILELIB libmap_shapefile_la_LIBADD = @SHAPEFILE_LIBS@ else libmap_shapefile_la_LIBADD = $(top_builddir)/navit/support/shapefile/libsupport_shapefile.la endif navit-0.5.0~svn5643+dfsg.1/navit/map/shapefile/shapefile.c000066400000000000000000000466431221777731700231570ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "transform.h" #include "file.h" #include "shapefil.h" #define IS_ARC(x) ((x).nSHPType == SHPT_ARC || (x).nSHPType == SHPT_ARCZ || (x).nSHPType == SHPT_ARCM) #define IS_POLYGON(x) ((x).nSHPType == SHPT_POLYGON || (x).nSHPType == SHPT_POLYGONZ || (x).nSHPType == SHPT_POLYGONM) struct map_priv { int id; char *filename; char *charset; SHPHandle hSHP; DBFHandle hDBF; int nShapeType, nEntities, nFields; double adfMinBound[4], adfMaxBound[4]; struct longest_match *lm; char *dbfmap_data; struct coord offset; enum projection pro; int flags; }; struct map_rect_priv { struct map_selection *sel; struct map_priv *m; struct item item; int idx; int cidx,cidx_rewind; int part,part_rewind; int aidx; enum attr_type anext; SHPObject *psShape; char *str; char *line; int attr_pos; struct attr *attr; }; static void map_destroy_shapefile(struct map_priv *m) { dbg(1,"map_destroy_shapefile\n"); g_free(m); } static void shapefile_coord_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; mr->cidx=mr->cidx_rewind; mr->part=mr->part_rewind; } static void shapefile_coord(struct map_rect_priv *mr, int idx, struct coord *c) { SHPObject *psShape=mr->psShape; struct coord cs; struct coord_geo g; if (!mr->m->pro) { g.lng=psShape->padfX[idx]+mr->m->offset.x; g.lat=psShape->padfY[idx]+mr->m->offset.y; transform_from_geo(projection_mg, &g, c); } else { cs.x=psShape->padfX[idx]+mr->m->offset.x; cs.y=psShape->padfY[idx]+mr->m->offset.y; transform_from_to(&cs, mr->m->pro, c, projection_mg); } } static int shapefile_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; int ret=0; int idx; SHPObject *psShape=mr->psShape; while (count) { idx=mr->cidx; if (idx >= psShape->nVertices) break; if (mr->part+1 < psShape->nParts && idx == psShape->panPartStart[mr->part+1]) { if (IS_POLYGON(*psShape)) { mr->part++; shapefile_coord(mr, 0, c); } else if (IS_ARC(*psShape)) { break; } else { dbg_assert("Neither POLYGON or ARC and has parts" == NULL); } } else { shapefile_coord(mr, idx, c); mr->cidx++; } ret++; c++; count--; } return ret; } static void shapefile_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; mr->aidx=0; mr->attr_pos=0; if (mr->m->flags & 1) mr->anext=attr_none; else mr->anext=attr_debug; } struct longest_match_list_item { void *data; int match_idx_count; int *match_idx; }; struct longest_match_list { GList *longest_match_list_items; }; struct longest_match { GHashTable *match_hash; char *match_present; int match_present_count; GList *longest_match_lists; int longest_match_list_count; }; static void longest_match_add_match(struct longest_match *lm, struct longest_match_list_item *lmi, char *match) { int idx; if (!(idx=(int)(long)g_hash_table_lookup(lm->match_hash, match))) { idx=lm->match_present_count++; lm->match_present=g_renew(char, lm->match_present, lm->match_present_count); g_hash_table_insert(lm->match_hash, g_strdup(match), (gpointer)(long)idx); } lmi->match_idx=g_renew(int, lmi->match_idx, lmi->match_idx_count+1); lmi->match_idx[lmi->match_idx_count++]=idx; } static void longest_match_item_destroy(struct longest_match_list_item *lmi, long flags) { if (!lmi) return; if (flags & 2) { g_free(lmi->data); } g_free(lmi->match_idx); g_free(lmi); } static struct longest_match_list_item * longest_match_item_new(struct longest_match_list *lml, void *data) { struct longest_match_list_item *ret=g_new0(struct longest_match_list_item,1); lml->longest_match_list_items=g_list_append(lml->longest_match_list_items, ret); ret->data=data; return ret; } static struct longest_match_list * longest_match_list_new(struct longest_match *lm) { struct longest_match_list *ret=g_new0(struct longest_match_list,1); lm->longest_match_lists=g_list_append(lm->longest_match_lists, ret); return ret; } static void longest_match_list_destroy(struct longest_match_list *lml, long flags) { if (!lml) return; if (flags & 1) { g_list_foreach(lml->longest_match_list_items, (GFunc)longest_match_item_destroy, (gpointer)flags); g_list_free(lml->longest_match_list_items); } g_free(lml); } static struct longest_match_list * longest_match_get_list(struct longest_match *lm, int list) { GList *l=lm->longest_match_lists; while (l && list > 0) { l=g_list_next(l); list++; } if (l) return l->data; return NULL; } static struct longest_match * longest_match_new(void) { struct longest_match *ret=g_new0(struct longest_match,1); ret->match_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); ret->match_present_count=1; return ret; } static void longest_match_destroy(struct longest_match *lm, long flags) { if (!lm) return; if (flags & 1) { g_list_foreach(lm->longest_match_lists, (GFunc)longest_match_list_destroy, (gpointer)flags); g_list_free(lm->longest_match_lists); } g_hash_table_destroy(lm->match_hash); g_free(lm->match_present); g_free(lm); } static void longest_match_clear(struct longest_match *lm) { if (lm->match_present) memset(lm->match_present, 0, lm->match_present_count); } static void longest_match_add_key_value(struct longest_match *lm, char *k, char *v) { char* buffer=g_alloca(strlen(k)+strlen(v)+2); int idx; strcpy(buffer,"*=*"); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=1; sprintf(buffer,"%s=*", k); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=2; sprintf(buffer,"*=%s", v); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=2; sprintf(buffer,"%s=%s", k, v); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=4; } static int longest_match_list_find(struct longest_match *lm, struct longest_match_list *lml, void **list, int max_list_len) { int j,longest=0,ret=0,sum,val; struct longest_match_list_item *curr; GList *l=lml->longest_match_list_items; while (l) { sum=0; curr=l->data; for (j = 0 ; j < curr->match_idx_count ; j++) { val=lm->match_present[curr->match_idx[j]]; if (val) sum+=val; else { sum=-1; break; } } if (sum > longest) { longest=sum; ret=0; } if (sum > 0 && sum == longest && ret < max_list_len) list[ret++]=curr->data; l=g_list_next(l); } return ret; } static void build_match(struct longest_match *lm, struct longest_match_list *lml, char *line) { struct longest_match_list_item *lmli; char *kvl=NULL,*i=NULL,*p,*kv; dbg(1,"line=%s\n",line); kvl=line; p=strchr(line,'\t'); if (p) { while (*p == '\t') *p++='\0'; i=p; } lmli=longest_match_item_new(lml,g_strdup(i)); while ((kv=strtok(kvl, ","))) { kvl=NULL; longest_match_add_match(lm, lmli, kv); } } static void build_matches(struct map_priv *m,char *matches) { char *matches2=g_strdup(matches); char *l=matches2,*p; struct longest_match_list *lml; m->lm=longest_match_new(); lml=longest_match_list_new(m->lm); while (l) { p=strchr(l,'\n'); if (p) *p++='\0'; if (strlen(l)) build_match(m->lm,lml,l); l=p; } g_free(matches2); } static void process_fields(struct map_priv *m, int id) { int i; char szTitle[12],*str; int nWidth, nDecimals; for (i = 0 ; i < m->nFields ; i++) { switch (DBFGetFieldInfo(m->hDBF, i, szTitle, &nWidth, &nDecimals )) { case FTString: str=g_strdup(DBFReadStringAttribute( m->hDBF, id, i )); break; case FTInteger: str=g_strdup_printf("%d",DBFReadIntegerAttribute( m->hDBF, id, i )); break; case FTDouble: str=g_strdup_printf("%lf",DBFReadDoubleAttribute( m->hDBF, id, i )); break; case FTInvalid: str=NULL; break; default: str=NULL; } longest_match_add_key_value(m->lm, szTitle, str); } } static int attr_resolve(struct map_rect_priv *mr, enum attr_type attr_type, struct attr *attr) { char name[1024]; char value[1024]; char szTitle[12]; const char *str; char *col,*type=NULL; int i,len, nWidth, nDecimals; if (!mr->line) return 0; if (attr_type != attr_any) type=attr_to_name(attr_type); if (attr_from_line(mr->line,type,&mr->attr_pos,value,name)) { len=strlen(value); if (value[0] == '$' && value[1] == '{' && value[len-1] == '}') { int found=0; value[len-1]='\0'; col=value+2; for (i = 0 ; i < mr->m->nFields ; i++) { if (DBFGetFieldInfo(mr->m->hDBF, i, szTitle, &nWidth, &nDecimals ) == FTString && !strcmp(szTitle,col)) { str=DBFReadStringAttribute( mr->m->hDBF, mr->item.id_hi, i); strcpy(value,str); found=1; break; } } if (!found) value[0]='\0'; } if (!value[0]) return -1; dbg(1,"name=%s value=%s\n",name,value); attr_free(mr->attr); mr->attr=attr_new_from_text(name,value); if (mr->attr) { *attr=*mr->attr; return 1; } return -1; } return 0; } static int shapefile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; struct map_priv *m=mr->m; char szTitle[12],*pszTypeName, *str; int code, ret, nWidth, nDecimals; attr->type=attr_type; switch (attr_type) { case attr_any: while ((code=attr_resolve(mr, attr_type, attr))) { if (code == 1) return 1; } while (mr->anext != attr_none) { ret=shapefile_attr_get(priv_data, mr->anext, attr); if (ret) return ret; } return 0; case attr_debug: if (mr->aidx >= m->nFields) { mr->anext=attr_none; return 0; } switch (DBFGetFieldInfo(m->hDBF, mr->aidx, szTitle, &nWidth, &nDecimals )) { case FTString: pszTypeName = "String"; str=g_strdup(DBFReadStringAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); break; case FTInteger: pszTypeName = "Integer"; str=g_strdup_printf("%d",DBFReadIntegerAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); break; case FTDouble: pszTypeName = "Double"; str=g_strdup_printf("%lf",DBFReadDoubleAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); break; case FTInvalid: pszTypeName = "Invalid"; str=NULL; break; default: pszTypeName = "Unknown"; str=NULL; } g_free(mr->str); mr->str=attr->u.str=g_strdup_printf("%s=%s(%s)",szTitle,str,pszTypeName); g_free(str); mr->aidx++; return 1; default: return (attr_resolve(mr, attr_type, attr) == 1); } } static struct item_methods methods_shapefile = { shapefile_coord_rewind, shapefile_coord_get, shapefile_attr_rewind, shapefile_attr_get, }; static struct map_rect_priv * map_rect_new_shapefile(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; char *dbfmapfile=g_strdup_printf("%s.dbfmap", map->filename); void *data; struct file *file; int size; int changed=0; if ((file=file_create(dbfmapfile, 0))) { size=file_size(file); data=file_data_read_all(file); if (data) { if (!map->dbfmap_data || size != strlen(map->dbfmap_data) || strncmp(data,map->dbfmap_data,size)) { g_free(map->dbfmap_data); map->dbfmap_data=g_malloc(size+1); memcpy(map->dbfmap_data, data, size); map->dbfmap_data[size]='\0'; changed=1; } file_data_free(file, data); } file_destroy(file); } else { dbg(0,"Failed to open %s\n",dbfmapfile); if (map->dbfmap_data) { changed=1; g_free(map->dbfmap_data); map->dbfmap_data=NULL; } } dbg(1,"%s changed %d old %p\n",dbfmapfile,changed,map->dbfmap_data); if (changed) { longest_match_destroy(map->lm,1); map->lm=NULL; if (map->dbfmap_data) { build_matches(map,map->dbfmap_data); } } dbg(1,"map_rect_new_shapefile\n"); mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->idx=0; mr->item.id_lo=0; mr->item.id_hi=0; mr->item.meth=&methods_shapefile; mr->item.priv_data=mr; g_free(dbfmapfile); return mr; } static void map_rect_destroy_shapefile(struct map_rect_priv *mr) { if (mr->psShape) SHPDestroyObject(mr->psShape); attr_free(mr->attr); g_free(mr->str); g_free(mr); } static struct item * map_rect_get_item_shapefile(struct map_rect_priv *mr) { struct map_priv *m=mr->m; void *lines[5]; struct longest_match_list *lml; int count; char type[1024]; if (mr->psShape && IS_ARC(*mr->psShape) && mr->part+1 < mr->psShape->nParts) { mr->part++; mr->part_rewind=mr->part; mr->cidx_rewind=mr->psShape->panPartStart[mr->part]; } else { if (mr->idx >= m->nEntities) return NULL; mr->item.id_hi=mr->idx; if (mr->psShape) SHPDestroyObject(mr->psShape); mr->psShape=SHPReadObject(m->hSHP, mr->idx); if (mr->psShape->nVertices > 1) mr->item.type=type_street_unkn; else mr->item.type=type_point_unkn; if (m->lm) { longest_match_clear(m->lm); process_fields(m, mr->idx); lml=longest_match_get_list(m->lm, 0); count=longest_match_list_find(m->lm, lml, lines, sizeof(lines)/sizeof(void *)); if (count) { mr->line=lines[0]; if (attr_from_line(mr->line,"type",NULL,type,NULL)) { dbg(1,"type='%s'\n", type); mr->item.type=item_from_name(type); if (mr->item.type == type_none && strcmp(type,"none")) dbg(0,"Warning: type '%s' unknown\n", type); } else { dbg(0,"failed to get attribute type\n"); } } else mr->line=NULL; } mr->idx++; mr->part_rewind=0; mr->cidx_rewind=0; } shapefile_coord_rewind(mr); shapefile_attr_rewind(mr); return &mr->item; } static struct item * map_rect_get_item_byid_shapefile(struct map_rect_priv *mr, int id_hi, int id_lo) { mr->idx=id_hi; while (id_lo--) { if (!map_rect_get_item_shapefile(mr)) return NULL; } return map_rect_get_item_shapefile(mr); } static struct map_methods map_methods_shapefile = { projection_mg, "iso8859-1", map_destroy_shapefile, map_rect_new_shapefile, map_rect_destroy_shapefile, map_rect_get_item_shapefile, map_rect_get_item_byid_shapefile, }; static struct map_priv * map_new_shapefile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); struct attr *charset=attr_search(attrs, NULL, attr_charset); struct attr *projectionname=attr_search(attrs, NULL, attr_projectionname); struct attr *flags=attr_search(attrs, NULL, attr_flags); struct file_wordexp *wexp; char *wdata; char **wexp_data; char *shapefile,*dbffile; if (! data) return NULL; dbg(1,"map_new_shapefile %s\n", data->u.str); wdata=g_strdup(data->u.str); wexp=file_wordexp_new(wdata); wexp_data=file_wordexp_get_array(wexp); *meth=map_methods_shapefile; m=g_new0(struct map_priv, 1); m->filename=g_strdup(wexp_data[0]); shapefile=g_strdup_printf("%s.shp", m->filename); m->hSHP=SHPOpen(shapefile, "rb" ); SHPGetInfo( m->hSHP, &m->nEntities, &m->nShapeType, m->adfMinBound, m->adfMaxBound ); g_free(shapefile); dbffile=g_strdup_printf("%s.dbf", m->filename); m->hDBF=DBFOpen(dbffile, "rb"); m->nFields=DBFGetFieldCount(m->hDBF); g_free(dbffile); dbg(1,"map_new_shapefile %s %s\n", m->filename, wdata); if (charset) { m->charset=g_strdup(charset->u.str); meth->charset=m->charset; } if (projectionname) m->pro=projection_from_name(projectionname->u.str, &m->offset); if (flags) m->flags=flags->u.num; file_wordexp_destroy(wexp); return m; } void plugin_init(void) { dbg(1,"shapefile: plugin_init\n"); plugin_register_map_type("shapefile", map_new_shapefile); } /************************************************************************/ /* VSI_SHP_Open() */ /************************************************************************/ static SAFile VSI_SHP_Open( const char *pszFilename, const char *pszAccess ) { return (SAFile)fopen(pszFilename, pszAccess); } /************************************************************************/ /* VSI_SHP_Read() */ /************************************************************************/ static SAOffset VSI_SHP_Read( void *p, SAOffset size, SAOffset nmemb, SAFile file ) { return fread(p, size, nmemb, (FILE *)file); } /************************************************************************/ /* VSI_SHP_Write() */ /************************************************************************/ static SAOffset VSI_SHP_Write( void *p, SAOffset size, SAOffset nmemb, SAFile file ) { return fwrite(p, size, nmemb, (FILE *)file); } /************************************************************************/ /* VSI_SHP_Seek() */ /************************************************************************/ static SAOffset VSI_SHP_Seek( SAFile file, SAOffset offset, int whence ) { return fseek((FILE *)file, offset, whence); } /************************************************************************/ /* VSI_SHP_Tell() */ /************************************************************************/ static SAOffset VSI_SHP_Tell( SAFile file ) { return ftell((FILE *)file); } static int VSI_SHP_Flush( SAFile file ) { return fflush((FILE *)file); } /************************************************************************/ /* VSI_SHP_Close() */ /************************************************************************/ static int VSI_SHP_Close( SAFile file ) { return fclose((FILE *)file); } /************************************************************************/ /* SADError() */ /************************************************************************/ static void VSI_SHP_Error( const char *message ) { dbg(0,"error:%s\n", message); } /************************************************************************/ /* VSI_SHP_Remove() */ /************************************************************************/ static int VSI_SHP_Remove( const char *pszFilename ) { return unlink(pszFilename); } /************************************************************************/ /* SASetupDefaultHooks() */ /************************************************************************/ void SASetupDefaultHooks( SAHooks *psHooks ) { psHooks->FOpen = VSI_SHP_Open; psHooks->FRead = VSI_SHP_Read; psHooks->FWrite = VSI_SHP_Write; psHooks->FSeek = VSI_SHP_Seek; psHooks->FTell = VSI_SHP_Tell; psHooks->FFlush = VSI_SHP_Flush; psHooks->FClose = VSI_SHP_Close; psHooks->Remove = VSI_SHP_Remove; psHooks->Atof = atof; psHooks->Error = VSI_SHP_Error; } navit-0.5.0~svn5643+dfsg.1/navit/map/textfile/000077500000000000000000000000001221777731700207225ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/map/textfile/CMakeLists.txt000066400000000000000000000000541221777731700234610ustar00rootroot00000000000000module_add_library(map_textfile textfile.c) navit-0.5.0~svn5643+dfsg.1/navit/map/textfile/Makefile.am000066400000000000000000000005271221777731700227620ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_textfile if PLUGINS modulemap_LTLIBRARIES = libmap_textfile.la else noinst_LTLIBRARIES = libmap_textfile.la endif libmap_textfile_la_SOURCES = textfile.c textfile.h libmap_textfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/map/textfile/textfile.c000066400000000000000000000216331221777731700227170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "transform.h" #include "file.h" #include "textfile.h" static int map_id; static void remove_comment_line(char* line){ if (line[0]==TEXTFILE_COMMENT_CHAR){ line='\0'; } } static void get_line(struct map_rect_priv *mr) { if(mr->f) { if (!mr->m->is_pipe) mr->pos=ftell(mr->f); else mr->pos+=mr->lastlen; fgets(mr->line, TEXTFILE_LINE_SIZE, mr->f); dbg(1,"read textfile line: %s\n", mr->line); remove_comment_line(mr->line); mr->lastlen=strlen(mr->line)+1; if (strlen(mr->line) >= TEXTFILE_LINE_SIZE-1) dbg(0, "line too long: %s\n", mr->line); } } static void map_destroy_textfile(struct map_priv *m) { g_free(m->filename); if(m->charset) { g_free(m->charset); } g_free(m); } static void textfile_coord_rewind(void *priv_data) { } static int parse_line(struct map_rect_priv *mr, int attr) { int pos; pos=coord_parse(mr->line, projection_mg, &mr->c); if (pos < strlen(mr->line) && attr) { strcpy(mr->attrs, mr->line+pos); } return pos; } static int textfile_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; int ret=0; dbg(1,"enter, count: %d\n",count); while (count--) { if (mr->f && !feof(mr->f) && (!mr->item.id_hi || !mr->eoc) && parse_line(mr, mr->item.id_hi)) { if (c){ *c=mr->c; dbg(1,"c=0x%x,0x%x\n", c->x, c->y); c++; } ret++; get_line(mr); if (mr->item.id_hi) mr->eoc=1; } else { mr->more=0; break; } } return ret; } static void textfile_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; mr->attr_pos=0; mr->attr_last=attr_none; } static void textfile_encode_attr(char *attr_val, enum attr_type attr_type, struct attr *attr) { if (attr_type >= attr_type_int_begin && attr_type <= attr_type_int_end) attr->u.num=atoi(attr_val); else attr->u.str=attr_val; } static int textfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; char *str=NULL; dbg(1,"mr=%p attrs='%s' ", mr, mr->attrs); if (attr_type != mr->attr_last) { dbg(1,"reset attr_pos\n"); mr->attr_pos=0; mr->attr_last=attr_type; } if (attr_type == attr_any) { dbg(1,"attr_any"); if (attr_from_line(mr->attrs,NULL,&mr->attr_pos,mr->attr, mr->attr_name)) { attr_type=attr_from_name(mr->attr_name); dbg(1,"found attr '%s' 0x%x\n", mr->attr_name, attr_type); attr->type=attr_type; textfile_encode_attr(mr->attr, attr_type, attr); return 1; } } else { str=attr_to_name(attr_type); dbg(1,"attr='%s' ",str); if (attr_from_line(mr->attrs,str,&mr->attr_pos,mr->attr, NULL)) { textfile_encode_attr(mr->attr, attr_type, attr); dbg(1,"found\n"); return 1; } } dbg(1,"not found\n"); return 0; } static struct item_methods methods_textfile = { textfile_coord_rewind, textfile_coord_get, textfile_attr_rewind, textfile_attr_get, }; static struct map_rect_priv * map_rect_new_textfile(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; dbg(1,"enter\n"); mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->sel=sel; if (map->flags & 1) mr->item.id_hi=1; else mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_textfile; mr->item.priv_data=mr; if (map->is_pipe) { #ifdef HAVE_POPEN char *oargs,*args=g_strdup(map->filename),*sep=" "; enum layer_type lay; g_free(mr->args); while (sel) { oargs=args; args=g_strdup_printf("%s 0x%x 0x%x 0x%x 0x%x", oargs, sel->u.c_rect.lu.x, sel->u.c_rect.lu.y, sel->u.c_rect.rl.x, sel->u.c_rect.rl.y); g_free(oargs); for (lay=layer_town ; lay < layer_end ; lay++) { oargs=args; args=g_strdup_printf("%s%s%d", oargs, sep, sel->order); g_free(oargs); sep=","; } sel=sel->next; } dbg(1,"popen args %s\n", args); mr->args=args; mr->f=popen(mr->args, "r"); mr->pos=0; mr->lastlen=0; #else dbg(0,"unable to work with pipes %s\n",map->filename); #endif } else { mr->f=fopen(map->filename, "r"); } if(!mr->f) { if (!(errno == ENOENT && map->no_warning_if_map_file_missing)) { dbg(0, "error opening textfile %s: %s\n", map->filename, strerror(errno)); } } get_line(mr); return mr; } static void map_rect_destroy_textfile(struct map_rect_priv *mr) { if (mr->f) { if (mr->m->is_pipe) { #ifdef HAVE_POPEN pclose(mr->f); #endif } else { fclose(mr->f); } } g_free(mr); } static struct item * map_rect_get_item_textfile(struct map_rect_priv *mr) { char *p,type[TEXTFILE_LINE_SIZE]; dbg(1,"map_rect_get_item_textfile id_hi=%d line=%s", mr->item.id_hi, mr->line); if (!mr->f) { return NULL; } while (mr->more) { struct coord c; textfile_coord_get(mr, &c, 1); } for(;;) { if (feof(mr->f)) { dbg(1,"map_rect_get_item_textfile: eof %d\n",mr->item.id_hi); if (mr->m->flags & 1) { if (!mr->item.id_hi) return NULL; mr->item.id_hi=0; } else { if (mr->item.id_hi) return NULL; mr->item.id_hi=1; } if (mr->m->is_pipe) { #ifdef HAVE_POPEN pclose(mr->f); mr->f=popen(mr->args, "r"); mr->pos=0; mr->lastlen=0; #endif } else { fseek(mr->f, 0, SEEK_SET); clearerr(mr->f); } get_line(mr); } if ((p=strchr(mr->line,'\n'))) *p='\0'; if (mr->item.id_hi) { mr->attrs[0]='\0'; if (!parse_line(mr, 1)) { get_line(mr); continue; } dbg(1,"map_rect_get_item_textfile: point found\n"); mr->eoc=0; mr->item.id_lo=mr->pos; } else { if (parse_line(mr, 1)) { get_line(mr); continue; } dbg(1,"map_rect_get_item_textfile: line found\n"); if (! mr->line[0]) { get_line(mr); continue; } mr->item.id_lo=mr->pos; strcpy(mr->attrs, mr->line); get_line(mr); dbg(1,"mr=%p attrs=%s\n", mr, mr->attrs); } dbg(1,"get_attrs %s\n", mr->attrs); if (attr_from_line(mr->attrs,"type",NULL,type,NULL)) { dbg(1,"type='%s'\n", type); mr->item.type=item_from_name(type); if (mr->item.type == type_none) dbg(0, "Warning: type '%s' unknown\n", type); } else { get_line(mr); continue; } mr->attr_last=attr_none; mr->more=1; dbg(1,"return attr='%s'\n", mr->attrs); return &mr->item; } } static struct item * map_rect_get_item_byid_textfile(struct map_rect_priv *mr, int id_hi, int id_lo) { if (mr->m->is_pipe) { #ifndef _MSC_VER pclose(mr->f); mr->f=popen(mr->args, "r"); mr->pos=0; mr->lastlen=0; #endif /* _MSC_VER */ } else fseek(mr->f, id_lo, SEEK_SET); get_line(mr); mr->item.id_hi=id_hi; return map_rect_get_item_textfile(mr); } static struct map_methods map_methods_textfile = { projection_mg, "iso8859-1", map_destroy_textfile, map_rect_new_textfile, map_rect_destroy_textfile, map_rect_get_item_textfile, map_rect_get_item_byid_textfile, }; static struct map_priv * map_new_textfile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); struct attr *charset=attr_search(attrs, NULL, attr_charset); struct attr *flags=attr_search(attrs, NULL, attr_flags); struct attr *no_warn=attr_search(attrs, NULL, attr_no_warning_if_map_file_missing); struct file_wordexp *wexp; int len,is_pipe=0; char *wdata; char **wexp_data; if (! data) return NULL; dbg(1,"map_new_textfile %s\n", data->u.str); wdata=g_strdup(data->u.str); len=strlen(wdata); if (len && wdata[len-1] == '|') { wdata[len-1]='\0'; is_pipe=1; } wexp=file_wordexp_new(wdata); wexp_data=file_wordexp_get_array(wexp); *meth=map_methods_textfile; m=g_new0(struct map_priv, 1); m->id=++map_id; m->filename=g_strdup(wexp_data[0]); m->is_pipe=is_pipe; m->no_warning_if_map_file_missing=(no_warn!=NULL) && (no_warn->u.num); if (flags) m->flags=flags->u.num; dbg(1,"map_new_textfile %s %s\n", m->filename, wdata); if (charset) { m->charset=g_strdup(charset->u.str); meth->charset=m->charset; } file_wordexp_destroy(wexp); g_free(wdata); return m; } void plugin_init(void) { dbg(1,"textfile: plugin_init\n"); plugin_register_map_type("textfile", map_new_textfile); } navit-0.5.0~svn5643+dfsg.1/navit/map/textfile/textfile.h000066400000000000000000000025131221777731700227200ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "attr.h" #include "coord.h" #define TEXTFILE_COMMENT_CHAR '#' struct map_priv { int id; char *filename; char *charset; int is_pipe; int no_warning_if_map_file_missing; int flags; }; #define TEXTFILE_LINE_SIZE 512 struct map_rect_priv { struct map_selection *sel; FILE *f; long pos; char line[TEXTFILE_LINE_SIZE]; int attr_pos; enum attr_type attr_last; char attrs[TEXTFILE_LINE_SIZE]; char attr[TEXTFILE_LINE_SIZE]; char attr_name[TEXTFILE_LINE_SIZE]; struct coord c; int eoc; int more; struct map_priv *m; struct item item; char *args; int lastlen; }; navit-0.5.0~svn5643+dfsg.1/navit/map_data.h000066400000000000000000000026361221777731700202470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAP_DATA_H #define NAVIT_MAP_DATA_H enum file_index { file_border_ply=0, file_bridge_ply, file_height_ply, file_other_ply, file_rail_ply, file_sea_ply, file_street_bti, file_street_str, file_strname_stn, file_town_twn, file_tunnel_ply, file_water_ply, file_woodland_ply, file_end }; struct map_data { struct file *file[file_end]; struct map_data *next; }; struct map_data *load_maps(char *map); struct transformation; struct block_info; void map_data_foreach(struct map_data *mdata, int file, struct transformation *t, int limit, void(*func)(struct block_info *, unsigned char *, unsigned char *, void *), void *data); #endif navit-0.5.0~svn5643+dfsg.1/navit/maps.c000066400000000000000000000051611221777731700174300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2012 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "debug.h" #include "file.h" #include "map.h" #include "mapset.h" #include "xmlconfig.h" struct maps; struct maps * maps_new(struct attr *parent, struct attr **attrs) { struct attr *data,**attrs_dup; if (!parent) { dbg(0,"No parent\n"); return NULL; } if (parent->type != attr_mapset) { dbg(0,"Parent must be mapset\n"); return NULL; } dbg(0,"enter\n"); attrs_dup=attr_list_dup(attrs); data=attr_search(attrs_dup, NULL, attr_data); if (data) { struct file_wordexp *wexp=file_wordexp_new(data->u.str); int i,count=file_wordexp_get_count(wexp); char **array=file_wordexp_get_array(wexp); struct attr *name; struct attr *name_provided = attr_search(attrs_dup, NULL, attr_name); // if no name was provided, fill the name with the location if (!name_provided) { struct attr name_tmp; name_tmp.type = attr_name; name_tmp.u.str="NULL"; attrs_dup=attr_generic_add_attr(attrs_dup, &name_tmp); name = attr_search(attrs_dup, NULL, attr_name); } for (i = 0 ; i < count ; i++) { struct attr map; g_free(data->u.str); data->u.str=g_strdup(array[i]); if (!name_provided) { g_free(name->u.str); name->u.str=g_strdup(array[i]); } map.type=attr_map; map.u.map=map_new(parent, attrs_dup); if (map.u.map) { mapset_add_attr(parent->u.mapset, &map); navit_object_unref(map.u.navit_object); } } file_wordexp_destroy(wexp); } else { dbg(0,"no data attribute\n"); } attr_list_free(attrs_dup); return NULL; } struct object_func maps_func = { attr_maps, (object_func_new)maps_new, (object_func_get_attr)NULL, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)NULL, (object_func_add_attr)NULL, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)NULL, (object_func_unref)NULL, }; navit-0.5.0~svn5643+dfsg.1/navit/maps/000077500000000000000000000000001221777731700172615ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/maps/CMakeLists.txt000066400000000000000000000032411221777731700220210ustar00rootroot00000000000000if(SAMPLE_MAP) set(SAMPLE_MAP_NAME osm_bbox_11.3,47.9,11.7,48.2) set(maptool_args "--attr-debug-level=5") GET_TARGET_PROPERTY(MAPTOOL_PATH maptool LOCATION) add_custom_target(sample_map ALL DEPENDS ${SAMPLE_MAP_NAME}.xml) add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.xml COMMAND ${CMAKE_COMMAND} -D TYPE=binfile -D DATA=${SAMPLE_MAP_NAME}.bin -D DST=${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.xml -P ${PROJECT_SOURCE_DIR}/cmake/navit_writemapxml.cmake VERBATIM DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin ) if(DOWNLOAD_SAMPLE_MAP) add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin COMMAND ${CMAKE_COMMAND} -D URL=http://www.navit-project.org/maps/${SAMPLE_MAP_NAME}.bin -D DST=${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin -P ${PROJECT_SOURCE_DIR}/cmake/navit_download.cmake VERBATIM ) else() add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin COMMAND bzcat ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 | ${MAPTOOL_PATH} ${maptool_args} ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin VERBATIM DEPENDS maptool ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 ) add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 COMMAND ${CMAKE_COMMAND} -D URL=http://www.navit-project.org/maps/${SAMPLE_MAP_NAME}.osm.bz2 -D DST=${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 -P ${PROJECT_SOURCE_DIR}/cmake/navit_download.cmake VERBATIM ) endif() endif() navit-0.5.0~svn5643+dfsg.1/navit/maps/Makefile.am000066400000000000000000000024321221777731700213160ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc .SECONDARY: SAMPLE_MAP=osm_bbox_11.3,47.9,11.7,48.2 maptool_args=--attr-debug-level=5 maptool=$(top_builddir)/navit/maptool/maptool maps_DATA = $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml SUFFIXES=.osm.bz2 .osm.pbf .txt .shp .osm samplemap: $(SAMPLE_MAP).bin .osm.bin: echo "Converting osm map" $(maptool) $(maptool_args) $@.tmp <$< mv $@.tmp $@ .txt.bin: $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/textfile/libmap_textfile.la -m "type=textfile data="$< mv $@.tmp $@ .shp.bin: $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/shapefile/libmap_shapefile.la -m "type=shapefile data=$(subst .shp,,$<) $(SHAPEFILE_ATTRIBUTES)" mv $@.tmp $@ .osm.bz2.bin: echo "Converting osm map" bzcat $< | $(maptool) $(maptool_args) $@.tmp mv $@.tmp $@ .osm.pbf.bin: echo "Converting osm map" $(maptool) --protobuf $(maptool_args) $@.tmp <$< mv $@.tmp $@ .bin.xml: echo '' >$@ $(SAMPLE_MAP).osm.bz2: echo "Downloading osm sample map" wget -O $(SAMPLE_MAP).osm.bz2.tmp http://www.navit-project.org/maps/$(SAMPLE_MAP).osm.bz2 mv $(SAMPLE_MAP).osm.bz2.tmp $(SAMPLE_MAP).osm.bz2 distclean-local: rm -f $(SAMPLE_MAP).osm.bz2 $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml all: navit-0.5.0~svn5643+dfsg.1/navit/mapset.c000066400000000000000000000243741221777731700177700ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains code used for loading more than one map * * The code in this file introduces "mapsets", which are collections of several maps. * This enables navit to operate on more than one map at once. See map.c / map.h to learn * how maps are handled. */ #include #include #include #include "debug.h" #include "item.h" #include "mapset.h" #include "projection.h" #include "map.h" #include "xmlconfig.h" /** * @brief A mapset * * This structure holds a complete mapset */ struct mapset { NAVIT_OBJECT GList *maps; /**< Linked list of all the maps in the mapset */ }; struct attr_iter { GList *last; }; /** * @brief Creates a new, empty mapset * * @return The new mapset */ struct mapset *mapset_new(struct attr *parent, struct attr **attrs) { struct mapset *ms; ms=g_new0(struct mapset, 1); ms->func=&mapset_func; navit_object_ref((struct navit_object *)ms); ms->attrs=attr_list_dup(attrs); return ms; } struct mapset *mapset_dup(struct mapset *ms) { struct mapset *ret=mapset_new(NULL, ms->attrs); ret->maps=g_list_copy(ms->maps); return ret; } struct attr_iter * mapset_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void mapset_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } /** * @brief Adds a map to a mapset * * @param ms The mapset to add the map to * @param m The map to be added */ int mapset_add_attr(struct mapset *ms, struct attr *attr) { switch (attr->type) { case attr_map: ms->attrs=attr_generic_add_attr(ms->attrs,attr); ms->maps=g_list_append(ms->maps, attr->u.map); return 1; default: return 0; } } int mapset_remove_attr(struct mapset *ms, struct attr *attr) { switch (attr->type) { case attr_map: ms->attrs=attr_generic_remove_attr(ms->attrs,attr); ms->maps=g_list_remove(ms->maps, attr->u.map); return 1; default: return 0; } } int mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter) { GList *map; map=ms->maps; attr->type=type; switch (type) { case attr_map: while (map) { if (!iter || iter->last == g_list_previous(map)) { attr->u.map=map->data; if (iter) iter->last=map; return 1; } map=g_list_next(map); } break; default: break; } return 0; } /** * @brief Destroys a mapset. * * This destroys a mapset. Please note that it does not touch the contained maps * in any way. * * @param ms The mapset to be destroyed */ void mapset_destroy(struct mapset *ms) { g_list_free(ms->maps); attr_list_free(ms->attrs); g_free(ms); } /** * @brief Handle for a mapset in use * * This struct is used for a mapset that is in use. With this it is possible to iterate * all maps in a mapset. */ struct mapset_handle { GList *l; /**< Pointer to the current (next) map */ }; /** * @brief Returns a new handle for a mapset * * This returns a new handle for an existing mapset. The new handle points to the first * map in the set. * * @param ms The mapset to get a handle of * @return The new mapset handle */ struct mapset_handle * mapset_open(struct mapset *ms) { struct mapset_handle *ret=NULL; if(ms) { ret=g_new(struct mapset_handle, 1); ret->l=ms->maps; } return ret; } /** * @brief Gets the next map from a mapset handle * * If you set active to true, this function will not return any maps that * have the attr_active attribute associated with them and set to false. * * @param msh The mapset handle to get the next map of * @param active Set to true to only get active maps (See description) * @return The next map */ struct map * mapset_next(struct mapset_handle *msh, int active) { struct map *ret; struct attr active_attr; for (;;) { if (!msh || !msh->l) return NULL; ret=msh->l->data; msh->l=g_list_next(msh->l); if (!active) return ret; if (active == 2 && map_get_attr(ret, attr_route_active, &active_attr, NULL)) { if (active_attr.u.num) return ret; else continue; } if (active == 3 && map_get_attr(ret, attr_search_active, &active_attr, NULL)) { if (active_attr.u.num) return ret; else continue; } if (!map_get_attr(ret, attr_active, &active_attr, NULL)) return ret; if (active_attr.u.num) return ret; } } /** * @brief Gets a map from the mapset by name * * @param ms The map * @param map_name the map name used by the search * @return The next map */ struct map * mapset_get_map_by_name(struct mapset *ms, const char*map_name) { struct mapset_handle*msh; struct map*curr_map; struct attr map_attr; if( !ms || !map_name ) { return NULL; } msh=mapset_open(ms); while ((curr_map=mapset_next(msh, 1))) { //get map name if(map_get_attr(curr_map,attr_name, &map_attr,NULL)) { if( ! strcmp(map_attr.u.str, map_name)) { break; } } } mapset_close(msh); return curr_map; } /** * @brief Closes a mapset handle after it is no longer used * * @param msh Mapset handle to be closed */ void mapset_close(struct mapset_handle *msh) { g_free(msh); } /** * @brief Holds information about a search in a mapset * * This struct holds information about a search (e.g. for a street) in a mapset. * * @sa For a more detailed description see the documentation of mapset_search_new(). */ struct mapset_search { GList *map; /**< The list of maps to be searched within */ struct map_search *ms; /**< A map search struct for the map currently active */ struct item *item; /**< "Superior" item. */ struct attr *search_attr; /**< Attribute to be searched for. */ int partial; /**< Indicates if one would like to have partial matches */ struct mapset *mapset; /**< reference to current mapset. Set to NULL when all maps are searched */ }; /** * @brief Starts a search on a mapset * * This function starts a search on a mapset. What attributes one can search for depends on the * map plugin. See the description of map_search_new() in map.c for details. * * If you enable partial matches bear in mind that the search matches only the begin of the * strings - a search for a street named "street" would match to "streetfoo", but not to * "somestreet". Search is case insensitive. * * The item passed to this function specifies a "superior item" to "search within" - e.g. a town * in which we want to search for a street, or a country in which to search for a town. * * @param ms The mapset that should be searched * @param item Specifies a superior item to "search within" (see description) * @param search_attr Attribute specifying what to search for. See description. * @param partial Set this to true to also have partial matches. See description. * @return A new mapset search struct for this search */ struct mapset_search * mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial) { struct mapset_search *this; dbg(1,"enter(%p,%p,%p,%d)\n", ms, item, search_attr, partial); this=g_new0(struct mapset_search,1); if(this != NULL && ms!=NULL ) { this->mapset=ms; this->item=item; this->search_attr=search_attr; this->partial=partial; return this; } else { return NULL; } } /** * @brief Returns the next found item from a mapset search * * This function returns the next item from a mapset search or NULL if there are no more items found. * It automatically iterates through all the maps in the mapset. Please note that maps which have the * attr_active attribute associated with them and set to false are not searched. * * @param this The mapset search to return an item from * @return The next found item or NULL if there are no more items found */ struct item * mapset_search_get_item(struct mapset_search *this_) { struct item *ret=NULL; struct attr active_attr; int country_search=this_->search_attr->type >= attr_country_all && this_->search_attr->type <= attr_country_name; while ((this_) && (this_->mapset) && (!this_->ms || !(ret=map_search_get_item(this_->ms)))) { /* The current map has no more items to be returned */ /* Use only the first map from the mapset to search for country codes. */ if (this_->map && country_search) break; for (;;) { if (!this_->map) this_->map=this_->mapset->maps; else this_->map=g_list_next(this_->map); if (!this_->map) { /* No more maps left, mark this mapset_search as finished */ this_->mapset=NULL; break; } /* Any map can be used for country search, regardless of it's attr_active value */ if(country_search) break; if (map_get_attr(this_->map->data, attr_search_active, &active_attr, NULL)) { if (!active_attr.u.num) continue; } if (!map_get_attr(this_->map->data, attr_active, &active_attr, NULL)) break; if (active_attr.u.num) break; } if(this_->ms) { map_search_destroy(this_->ms); this_->ms=NULL; } if (! this_->map) break; this_->ms=map_search_new(this_->map->data, this_->item, this_->search_attr, this_->partial); } return ret; } /** * @brief Destroys a mapset search * * @param this The mapset search to be destroyed */ void mapset_search_destroy(struct mapset_search *this_) { if (this_) { map_search_destroy(this_->ms); g_free(this_); } } struct object_func mapset_func = { attr_mapset, (object_func_new)mapset_new, (object_func_get_attr)mapset_get_attr, (object_func_iter_new)mapset_attr_iter_new, (object_func_iter_destroy)mapset_attr_iter_destroy, (object_func_set_attr)NULL, (object_func_add_attr)mapset_add_attr, (object_func_remove_attr)mapset_remove_attr, (object_func_init)NULL, (object_func_destroy)mapset_destroy, (object_func_dup)mapset_dup, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/mapset.h000066400000000000000000000040751221777731700177710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAPSET_H #define NAVIT_MAPSET_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct item; struct map; struct mapset; struct mapset_handle; struct mapset_search; struct mapset *mapset_new(struct attr *parent, struct attr **attrs); struct mapset *mapset_dup(struct mapset *ms); struct attr_iter *mapset_attr_iter_new(void); void mapset_attr_iter_destroy(struct attr_iter *iter); int mapset_add_attr(struct mapset *ms, struct attr *attr); int mapset_remove_attr(struct mapset *ms, struct attr *attr); int mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter); void mapset_destroy(struct mapset *ms); struct map *mapset_get_map_by_name(struct mapset *ms, const char*map_name); struct mapset_handle *mapset_open(struct mapset *ms); struct map *mapset_next(struct mapset_handle *msh, int active); void mapset_close(struct mapset_handle *msh); struct mapset_search *mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial); struct item *mapset_search_get_item(struct mapset_search *this_); void mapset_search_destroy(struct mapset_search *this_); struct mapset * mapset_ref(struct mapset* m); void mapset_unref(struct mapset *m); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/maptool/000077500000000000000000000000001221777731700177745ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/maptool/CMakeLists.txt000066400000000000000000000016421221777731700225370ustar00rootroot00000000000000 if(BUILD_MAPTOOL) add_definitions( -DMODULE=maptool ${NAVIT_COMPILE_FLAGS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) SET(MAPTOOL_SOURCE boundaries.c buffer.c ch.c coastline.c itembin.c itembin_buffer.c misc.c osm.c osm_o5m.c osm_relations.c sourcesink.c tempfile.c tile.c zip.c osm_xml.c) if(NOT MSVC) SET(MAPTOOL_SOURCE ${MAPTOOL_SOURCE} osm_protobuf.c osm_protobufdb.c generated-code/fileformat.pb-c.c generated-code/osmformat.pb-c.c google/protobuf-c/protobuf-c.c) endif(NOT MSVC) add_library (maptool_core ${MAPTOOL_SOURCE}) add_executable (maptool maptool.c) if(NOT MSVC) SET(NAVIT_LIBS ${NAVIT_LIBS} m) endif(NOT MSVC) target_link_libraries(maptool maptool_core ${NAVIT_LIBNAME} ${NAVIT_LIBS}) install(TARGETS maptool DESTINATION ${BIN_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) endif() navit-0.5.0~svn5643+dfsg.1/navit/maptool/Makefile.am000066400000000000000000000015351221777731700220340ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc if !SUPPORT_ANDROID bin_PROGRAMS = maptool noinst_LTLIBRARIES = libmaptool.la endif AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit @ZLIB_CFLAGS@ @POSTGRESQL_CFLAGS@ -DMODULE=maptool libmaptool_la_SOURCES = boundaries.c buffer.c ch.c coastline.c itembin.c itembin_buffer.c misc.c osm.c osm_o5m.c osm_psql.c osm_protobuf.c osm_protobufdb.c osm_relations.c osm_xml.c sourcesink.c tempfile.c tile.c zip.c maptool.h generated-code/fileformat.pb-c.c generated-code/fileformat.pb-c.h generated-code/osmformat.pb-c.c generated-code/osmformat.pb-c.h google/protobuf-c/protobuf-c.c google/protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c-private.h maptool_SOURCES = maptool.c maptool_LDADD = libmaptool.la ../libnavit.la @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @POSTGRESQL_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ @LIBC_LIBS@ navit-0.5.0~svn5643+dfsg.1/navit/maptool/boundaries.c000066400000000000000000000241521221777731700222770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif char * osm_tag_value(struct item_bin *ib, char *key) { char *tag=NULL; int len=strlen(key); while ((tag=item_bin_get_attr(ib, attr_osm_tag, tag))) { if (!strncmp(tag,key,len) && tag[len] == '=') return tag+len+1; } return NULL; } #if 0 static char * osm_tag_name(struct item_bin *ib) { return osm_tag_value(ib, "name"); } #endif osmid boundary_relid(struct boundary *b) { long long *id; if (!b) return 0; if (!b->ib) return 0; id=item_bin_get_attr(b->ib, attr_osm_relationid, NULL); if (id) return *id; return 0; } static void process_boundaries_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) { struct boundary *b=relation_priv; enum geom_poly_segment_type role=(long)member_priv; int *dup; dup=item_bin_get_attr(member,attr_duplicate,NULL); if(!dup || *dup==0) b->segments=g_list_prepend(b->segments,item_bin_to_poly_segment(member, role)); } static GList * process_boundaries_setup(FILE *boundaries, struct relations *relations) { struct item_bin *ib; GList *boundaries_list=NULL; struct relations_func *relations_func; relations_func=relations_func_new(process_boundaries_member, NULL); while ((ib=read_item(boundaries))) { char *member=NULL; struct boundary *boundary=g_new0(struct boundary, 1); char *admin_level=osm_tag_value(ib, "admin_level"); char *iso=osm_tag_value(ib, "ISO3166-1"); int has_subrelations=0; int has_outer_ways=0; if(!iso) iso=osm_tag_value(ib, "iso3166-1:alpha2"); if (admin_level && !strcmp(admin_level, "2")) { if(!iso) { char *int_name=osm_tag_value(ib,"int_name"); if(int_name && !strcmp(int_name,"France")) iso="FR"; } if (iso) { struct country_table *country=country_from_iso2(iso); if (!country) osm_warning("relation",item_bin_get_relationid(ib),0,"Country Boundary contains unknown ISO3166-1 value '%s'\n",iso); else { boundary->iso2=g_strdup(iso); osm_info("relation",item_bin_get_relationid(ib),0,"Country Boundary for '%s'\n",iso); } boundary->country=country; } else osm_warning("relation",item_bin_get_relationid(ib),0,"Country Boundary doesn't contain an ISO3166-1 tag\n"); } while ((member=item_bin_get_attr(ib, attr_osm_member, member))) { long long osm_id; int read=0; int member_type; char *rolestr; if (sscanf(member,"%d:"LONGLONG_FMT":%n",&member_type,&osm_id,&read) < 2) continue; rolestr=member+read; if(member_type==1) { if(!strcmp(rolestr,"admin_centre") || !strcmp(rolestr,"admin_center")) boundary->admin_centre=osm_id; } if(member_type==2) { enum geom_poly_segment_type role; if (!strcmp(rolestr,"outer") || !strcmp(rolestr,"exclave")) { has_outer_ways=1; role=geom_poly_segment_type_way_outer; } else if (!strcmp(rolestr,"inner") || !strcmp(rolestr,"enclave")) role=geom_poly_segment_type_way_inner; else if (!strcmp(rolestr,"")) role=geom_poly_segment_type_way_unknown; else { osm_warning("relation",item_bin_get_relationid(ib),0,"Unknown role %s in member ",rolestr); osm_warning("way",osm_id,1,"\n"); role=geom_poly_segment_type_none; } relations_add_func(relations, relations_func, boundary, (gpointer)role, 2, osm_id); } if(member_type==3) { if (!strcmp(rolestr,"outer") || !strcmp(rolestr,"exclave") || !strcmp(rolestr,"inner") || !strcmp(rolestr,"enclave")) has_subrelations++; } } if(boundary->iso2 && has_subrelations) osm_warning("relation",item_bin_get_relationid(ib),0,"Country boundary '%s' has %d relations as boundary segments. These are not supported yet.\n", boundary->iso2, has_subrelations); if(boundary->iso2 && !has_outer_ways) { osm_warning("relation",item_bin_get_relationid(ib),0,"Skipping country boundary for '%s' because it has no outer ways.\n", boundary->iso2); g_free(boundary->iso2); boundary->iso2=NULL; } boundary->ib=item_bin_dup(ib); boundaries_list=g_list_append(boundaries_list, boundary); } return boundaries_list; } GList * boundary_find_matches(GList *l, struct coord *c) { GList *ret=NULL; while (l) { struct boundary *boundary=l->data; if (bbox_contains_coord(&boundary->r, c)) { if (geom_poly_segments_point_inside(boundary->sorted_segments,c) > 0) ret=g_list_prepend(ret, boundary); ret=g_list_concat(ret,boundary_find_matches(boundary->children, c)); } l=g_list_next(l); } return ret; } #if 0 static void test(GList *boundaries_list) { struct item_bin *ib; FILE *f=fopen("country_276.bin.unsorted","r"); printf("start\n"); while ((ib=read_item(f))) { struct coord *c=(struct coord *)(ib+1); char *name=item_bin_get_attr(ib, attr_town_name, NULL); printf("%s:",name); boundary_find_matches(boundaries_list, c); printf("\n"); } fclose(f); printf("end\n"); } static void dump_hierarchy(GList *l, char *prefix) { char *newprefix=g_alloca(sizeof(char)*(strlen(prefix)+2)); strcpy(newprefix, prefix); strcat(newprefix," "); while (l) { struct boundary *boundary=l->data; fprintf(stderr,"%s:%s (0x%x,0x%x)-(0x%x,0x%x)\n",prefix,osm_tag_name(boundary->ib),boundary->r.l.x,boundary->r.l.y,boundary->r.h.x,boundary->r.h.y); dump_hierarchy(boundary->children, newprefix); l=g_list_next(l); } } static gint boundary_bbox_compare(gconstpointer a, gconstpointer b) { const struct boundary *boundarya=a; const struct boundary *boundaryb=b; long long areaa=bbox_area(&boundarya->r); long long areab=bbox_area(&boundaryb->r); if (areaa > areab) return 1; if (areaa < areab) return -1; return 0; } #endif static GList * process_boundaries_insert(GList *list, struct boundary *boundary) { GList *l=list; while (l) { struct boundary *b=l->data; if (bbox_contains_bbox(&boundary->r, &b->r)) { list=g_list_remove(list, b); boundary->children=g_list_prepend(boundary->children, b); l=list; } else if (bbox_contains_bbox(&b->r, &boundary->r)) { b->children=process_boundaries_insert(b->children, boundary); return list; } else l=g_list_next(l); } return g_list_prepend(list, boundary); } static GList * process_boundaries_finish(GList *boundaries_list) { GList *l,*sl; GList *ret=NULL; l=boundaries_list; while (l) { struct boundary *boundary=l->data; int first=1; FILE *f=NULL,*fu=NULL; if (boundary->country) { char *name=g_strdup_printf("country_%s_poly",boundary->iso2); f=tempfile("",name,1); g_free(name); } boundary->sorted_segments=geom_poly_segments_sort(boundary->segments, geom_poly_segment_type_way_right_side); sl=boundary->sorted_segments; while (sl) { struct geom_poly_segment *gs=sl->data; struct coord *c=gs->first; while (c <= gs->last) { if (first) { boundary->r.l=*c; boundary->r.h=*c; first=0; } else bbox_extend(c, &boundary->r); c++; } if (f) { struct item_bin *ib=item_bin; item_bin_init(ib, type_selected_line); item_bin_add_coord(ib, gs->first, gs->last-gs->first+1); item_bin_write(ib, f); } if (boundary->country) { if (!coord_is_equal(*gs->first,*gs->last)) { struct item_bin *ib; if (!fu) { char *name=g_strdup_printf("country_%s_broken",boundary->iso2); fu=tempfile("",name,1); g_free(name); } ib=item_bin; item_bin_init(ib, type_selected_point); item_bin_add_coord(ib, gs->first, 1); item_bin_write(ib, fu); item_bin_init(ib, type_selected_point); item_bin_add_coord(ib, gs->last, 1); item_bin_write(ib, fu); } } sl=g_list_next(sl); } ret=process_boundaries_insert(ret, boundary); l=g_list_next(l); if (f) fclose(f); if (fu) { if (boundary->country) osm_warning("relation",item_bin_get_relationid(boundary->ib),0,"Broken country polygon '%s'\n",boundary->iso2); fclose(fu); } } #if 0 printf("hierarchy\n"); #endif #if 0 boundaries_list=g_list_sort(boundaries_list, boundary_bbox_compare); l=boundaries_list; while (l) { struct boundary *boundary=l->data; GList *l2,*ln; ln=l2=g_list_next(l); while (l2) { struct boundary *boundary2=l2->data; if (bbox_contains_bbox(&boundary2->r, &boundary->r)) { boundaries_list=g_list_remove(boundaries_list, boundary); boundary2->children=g_list_append(boundary2->children, boundary); #if 0 printf("found\n"); #endif break; } l2=g_list_next(l2); } l=ln; } dump_hierarchy(boundaries_list,""); #if 0 printf("hierarchy done\n"); printf("test\n"); test(boundaries_list); #endif #endif return ret; } GList * process_boundaries(FILE *boundaries, FILE *ways) { GList *boundaries_list; struct relations *relations=relations_new(); boundaries_list=process_boundaries_setup(boundaries, relations); relations_process(relations, NULL, ways, NULL); relations_destroy(relations); return process_boundaries_finish(boundaries_list); } void free_boundaries(GList *l) { while (l) { struct boundary *boundary=l->data; GList *s=boundary->segments; while (s) { struct geom_poly_segment *seg=s->data; g_free(seg->first); g_free(seg); s=g_list_next(s); }; s=boundary->sorted_segments; while (s) { struct geom_poly_segment *seg=s->data; g_free(seg->first); g_free(seg); s=g_list_next(s); }; g_list_free(boundary->segments); g_list_free(boundary->sorted_segments); g_free(boundary->ib); g_free(boundary->iso2); free_boundaries(boundary->children); g_free(boundary); l=g_list_next(l); } g_list_free(l); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/buffer.c000066400000000000000000000033351221777731700214150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "maptool.h" #include "debug.h" void save_buffer(char *filename, struct buffer *b, long long offset) { FILE *f; f=fopen(filename,"rb+"); if (! f) f=fopen(filename,"wb+"); dbg_assert(f != NULL); fseek(f, offset, SEEK_SET); fwrite(b->base, b->size, 1, f); fclose(f); } void load_buffer(char *filename, struct buffer *b, long long offset, long long size) { FILE *f; long long len; if (b->base) free(b->base); b->malloced=0; f=fopen(filename,"rb"); fseek(f, 0, SEEK_END); len=ftell(f); if (offset+size > len) { size=len-offset; } b->size=b->malloced=size; #if 0 fprintf(stderr,"reading "LONGLONG_FMT" bytes from %s at "LONGLONG_FMT"\n", b->size, filename, offset); #endif fseek(f, offset, SEEK_SET); b->base=malloc(b->size); dbg_assert(b->base != NULL); fread(b->base, b->size, 1, f); fclose(f); } long long sizeof_buffer(char *filename) { long long ret; FILE *f=fopen(filename,"rb"); fseek(f, 0, SEEK_END); ret=ftell(f); fclose(f); return ret; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/ch.c000066400000000000000000000324531221777731700205410ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #include "coord.h" #include "file.h" #include "debug.h" #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 10 #define g_slice_alloc0 g_malloc0 #define g_slice_new(x) g_new(x,1) #define g_slice_new0(x) g_new0(x,1) #define g_slice_free(x,y) g_free(y) #define g_slice_free1(x,y) g_free(y) #endif struct ch_edge { int flags; int weight; struct item_id target,middle; }; struct node { int first_edge; int dummy; } *nodes; int node_count; struct edge { unsigned target:26; unsigned scedge1:6; unsigned weight:28; unsigned type:2; unsigned flags:2; unsigned int edge_count; unsigned scedge2:6; unsigned scmiddle:26; } *edges; int edge_count; struct newnode { int newnode; } *newnodes; int newnode_count; GHashTable *newnode_hash; struct edge_hash_item { int first,last; }; GHashTable *edge_hash; struct file *sgr,*ddsg_node_index; struct coord *node_index; GHashTable *sgr_nodes_hash; static int ch_levels=14; static int road_speed(enum item_type type) { switch (type) { case type_street_0: case type_street_1_city: case type_living_street: case type_street_service: case type_track_gravelled: case type_track_unpaved: return 10; case type_street_2_city: case type_track_paved: return 30; case type_street_3_city: return 40; case type_street_4_city: return 50; case type_highway_city: return 80; case type_street_1_land: return 60; case type_street_2_land: return 65; case type_street_3_land: return 70; case type_street_4_land: return 80; case type_street_n_lanes: return 120; case type_highway_land: return 120; case type_ramp: return 40; case type_roundabout: return 10; case type_ferry: return 40; default: return 0; } } static void coord_slice_free(void *data) { g_slice_free(struct coord, data); } static GHashTable * coord_hash_new(void) { return g_hash_table_new_full(coord_hash, coord_equal, coord_slice_free, NULL); } static void item_id_slice_free(void *data) { g_slice_free(struct item_id, data); } static void add_node_to_hash(FILE *idx, GHashTable *hash, struct coord *c, int *nodes) { if (! g_hash_table_lookup(hash, c)) { struct coord *ct=g_slice_new(struct coord); *ct=*c; fwrite(c, sizeof(*c), 1, idx); (*nodes)++; g_hash_table_insert(hash, ct, (void *)(*nodes)); } } static void edge_hash_slice_free(void *data) { g_slice_free(struct edge_hash_item, data); } static guint edge_hash_hash(gconstpointer key) { const struct edge_hash_item *itm=key; return itm->first*2654435761UL+itm->last; } static gboolean edge_hash_equal(gconstpointer a, gconstpointer b) { const struct edge_hash_item *itm_a=a; const struct edge_hash_item *itm_b=b; return (itm_a->first == itm_b->first && itm_a->last == itm_b->last); } static void ch_generate_ddsg(FILE *in, FILE *ref, FILE *idx, FILE *ddsg) { GHashTable *hash=coord_hash_new(); struct item_bin *ib; int nodes=0,edges=0; while ((ib=read_item(in))) { int ccount=ib->clen/2; struct coord *c=(struct coord *)(ib+1); if (road_speed(ib->type)) { add_node_to_hash(idx, hash, &c[0], &nodes); add_node_to_hash(idx, hash, &c[ccount-1], &nodes); edges++; } } edge_hash=g_hash_table_new_full(edge_hash_hash, edge_hash_equal, edge_hash_slice_free, item_id_slice_free); fseek(in, 0, SEEK_SET); fprintf(ddsg,"d\n"); fprintf(ddsg,"%d %d\n", nodes, edges); while ((ib=read_item(in))) { int i,ccount=ib->clen/2; struct coord *c=(struct coord *)(ib+1); int n1,n2,speed=road_speed(ib->type); struct item_id road_id; double l; fread(&road_id, sizeof(road_id), 1, ref); if (speed) { struct edge_hash_item *hi=g_slice_new(struct edge_hash_item); struct item_id *id=g_slice_new(struct item_id); *id=road_id; dbg_assert((n1=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[0]))) != 0); dbg_assert((n2=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[ccount-1]))) != 0); l=0; for (i = 0 ; i < ccount-1 ; i++) { l+=sqrt(sq(c[i+1].x-c[i].x)+sq(c[i+1].y-c[i].y)); } fprintf(ddsg,"%d %d %d 0\n", n1-1, n2-1, (int)(l*36/speed)); hi->first=n1-1; hi->last=n2-1; g_hash_table_insert(edge_hash, hi, id); } } g_hash_table_destroy(hash); } static void ch_generate_sgr(char *suffix) { #ifndef HAVE_API_WIN32_CE char command[1024]; sprintf(command,"./contraction-hierarchies-20080621/main -s -p -f ddsg_%s.tmp -o hcn_%s.tmp -l hcn_log_%s.tmp -x 190 -y 1 -e 600 -p 1000 -k 1,3.3,2,10,3,10,5",suffix,suffix,suffix); printf("%s\n",command); system(command); sprintf(command,"./contraction-hierarchies-20080621/main -c -f ddsg_%s.tmp -h hcn_%s.tmp -k 1,3.3,2,10,3,10,5 -C ch_%s.tmp -O 1 -z sgr_%s.tmp",suffix,suffix,suffix,suffix); printf("%s\n",command); system(command); #endif } static void ch_process_node(FILE *out, int node, int resolve) { int first_edge_id=nodes[node].first_edge; int last_edge_id=nodes[node+1].first_edge; int edge_id; struct ch_edge ch_edge; struct item_bin *item_bin; struct edge_hash_item fwd,rev; int oldnode; memset(&ch_edge, 0, sizeof(ch_edge)); item_bin=init_item(type_ch_node); oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER(node))); #if 0 dbg(0,"0x%x,0x%x\n",node_index[oldnode].x,node_index[oldnode].y); #endif item_bin_add_coord(item_bin, &node_index[oldnode], 1); fwd.first=oldnode; rev.last=oldnode; for (edge_id = first_edge_id ; edge_id < last_edge_id ; edge_id++) { if (resolve) { struct edge *edge=&edges[edge_id]; int oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER((int)edge->target))); struct item_id *id; ch_edge.weight=edge->weight; fwd.last=oldnode; rev.first=oldnode; ch_edge.flags=edge->flags & 3; if (edge->scmiddle == 67108863) { id=g_hash_table_lookup(edge_hash, &fwd); if (!id) { ch_edge.flags|=8; id=g_hash_table_lookup(edge_hash, &rev); } if (id == NULL) { fprintf(stderr,"Shortcut %d Weight %d\n",edge->scmiddle,edge->weight); fprintf(stderr,"Neither %d-%d nor %d-%d exists\n",fwd.first,fwd.last,rev.first,rev.last); exit(1); } else { ch_edge.middle=*id; #if 0 dbg(0,"middle street id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id)); #endif } } else { ch_edge.flags|=4; id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->scmiddle)); dbg_assert(id != NULL); ch_edge.middle=*id; #if 0 dbg(0,"middle node id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id)); #endif } id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->target)); #if 0 dbg(0,"id for %d is "ITEM_ID_FMT"\n",edge->target,ITEM_ID_ARGS(*id)); #endif if (id == NULL) { fprintf(stderr,"Failed to look up target %d\n",edge->target); } else { ch_edge.target=*id; } } item_bin_add_attr_data(item_bin,attr_ch_edge,&ch_edge,sizeof(ch_edge)); } item_bin_write(item_bin, out); } static void ch_process_nodes(FILE *out, int pos, int count, int resolve) { int i; printf("count %d sum=%d newnode_count=%d\n",count,pos,newnode_count); for (i = 0 ; i < count ; i++) ch_process_node(out, pos+i, resolve); } static void ch_process(FILE **files, int depth, int resolve) { int count=newnode_count; int pos=0; while (depth > 0 && pos < newnode_count) { count=(count+1)/2; ch_process_nodes(files[depth], pos, count, resolve); pos+=count; depth--; } ch_process_nodes(files[depth], pos, newnode_count-pos, resolve); } static void ch_setup(char *suffix) { int i; if (!sgr) { int *data,size,offset=0; char *filename=tempfile_name(suffix,"sgr"); printf("filename=%s\n",filename); sgr=file_create(filename,0); g_free(filename); dbg_assert(sgr != NULL); file_mmap(sgr); size=sizeof(int); data=(int *)file_data_read(sgr, offset, size); node_count=*data; offset+=size; size=node_count*sizeof(struct node); nodes=(struct node *)file_data_read(sgr, offset, size); offset+=size; size=sizeof(int); data=(int *)file_data_read(sgr, offset, size); edge_count=*data; offset+=size; size=edge_count*sizeof(struct edge); edges=(struct edge *)file_data_read(sgr, offset, size); offset+=size; size=sizeof(int); data=(int *)file_data_read(sgr, offset, size); newnode_count=*data; offset+=size; size=edge_count*sizeof(struct newnode); newnodes=(struct newnode *)file_data_read(sgr, offset, size); offset+=size; newnode_hash=g_hash_table_new(NULL, NULL); for (i = 0 ; i < newnode_count ; i++) { g_hash_table_insert(newnode_hash, GINT_TO_POINTER(newnodes[i].newnode), GINT_TO_POINTER(i)); } } if (!ddsg_node_index) { char *filename=tempfile_name(suffix,"ddsg_coords"); ddsg_node_index=file_create(filename,0); g_free(filename); dbg_assert(ddsg_node_index != NULL); file_mmap(ddsg_node_index); node_index=(struct coord *)file_data_read(ddsg_node_index, 0, file_size(ddsg_node_index)); } } static void ch_create_tempfiles(char *suffix, FILE **files, int count, int mode) { char name[256]; int i; for (i = 0 ; i <= count ; i++) { sprintf(name,"graph_%d",i); files[i]=tempfile(suffix, name, mode); } } static void ch_close_tempfiles(FILE **files, int count) { int i; for (i = 0 ; i <= count ; i++) { fclose(files[i]); } } #if 0 static void ch_remove_tempfiles(char *suffix, int count) { char name[256]; int i; for (i = 0 ; i <= count ; i++) { sprintf(name,"graph_%d",i); tempfile_unlink(suffix, name); } } #endif static void ch_copy_to_tiles(char *suffix, int count, struct tile_info *info, FILE *ref) { char name[256]; int i; FILE *f; struct item_bin *item_bin; for (i = count ; i >= 0 ; i--) { sprintf(name,"graph_%d",i); f=tempfile(suffix, name, 0); while ((item_bin = read_item(f))) { tile_write_item_minmax(info, item_bin, ref, i, i); } fclose(f); } } void ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) { struct tile_info info; FILE *in,*ref,*ddsg_coords,*ddsg; FILE **graphfiles; info.write=0; info.maxlen=0; info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=tilesdir_out; graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1)); ch_create_tempfiles(suffix, graphfiles, ch_levels, 1); in=tempfile(map_suffix,"ways_split",0); ref=tempfile(map_suffix,"ways_split_ref",0); ddsg_coords=tempfile(suffix,"ddsg_coords",1); ddsg=tempfile(suffix,"ddsg",1); ch_generate_ddsg(in, ref, ddsg_coords, ddsg); fclose(in); fclose(ref); fclose(ddsg_coords); fclose(ddsg); ch_generate_sgr(suffix); ch_setup(suffix); ch_process(graphfiles, ch_levels, 0); ch_close_tempfiles(graphfiles, ch_levels); tile_hash=g_hash_table_new(g_str_hash, g_str_equal); ch_copy_to_tiles(suffix, ch_levels, &info, NULL); merge_tiles(&info); write_tilesdir(&info, zip_info, tilesdir_out); } void ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info) { struct tile_info info; struct tile_head *th; FILE **graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1)); FILE *ref; struct item_id id; int nodeid=0; info.write=1; info.maxlen=zip_get_maxnamelen(zip_info); info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=NULL; ref=tempfile(suffix,"sgr_ref",1); create_tile_hash(); th=tile_head_root; while (th) { th->zip_data=NULL; th->process=1; th=th->next; } ch_setup(suffix); ch_copy_to_tiles(suffix, ch_levels, &info, ref); fclose(ref); ref=tempfile(suffix,"sgr_ref",0); sgr_nodes_hash=g_hash_table_new_full(NULL, NULL, NULL, item_id_slice_free); while (fread(&id, sizeof(id), 1, ref)) { struct item_id *id2=g_slice_new(struct item_id); *id2=id; #if 0 dbg(0,"%d is "ITEM_ID_FMT"\n",nodeid,ITEM_ID_ARGS(*id2)); #endif g_hash_table_insert(sgr_nodes_hash, GINT_TO_POINTER(nodeid), id2); nodeid++; } th=tile_head_root; while (th) { th->zip_data=malloc(th->total_size); th->total_size_used=0; th=th->next; } ch_create_tempfiles(suffix, graphfiles, ch_levels, 1); ch_process(graphfiles, ch_levels, 1); ch_close_tempfiles(graphfiles, ch_levels); g_hash_table_destroy(newnode_hash); g_hash_table_destroy(edge_hash); g_hash_table_destroy(sgr_nodes_hash); ch_copy_to_tiles(suffix, ch_levels, &info, NULL); write_tilesdir(&info, zip_info, NULL); th=tile_head_root; while (th) { if (th->name[0]) { if (th->total_size != th->total_size_used) { fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used); exit(1); } write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size); } else { fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info)); } g_free(th->zip_data); th=th->next; } } navit-0.5.0~svn5643+dfsg.1/navit/maptool/coastline.c000066400000000000000000000442161221777731700221300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "maptool.h" #include "debug.h" struct coastline_tile { osmid wayid; int edges; }; static int distance_from_ll(struct coord *c, struct rect *bbox) { int dist=0; if (c->x == bbox->l.x) return dist+c->y-bbox->l.y; dist+=bbox->h.y-bbox->l.y; if (c->y == bbox->h.y) return dist+c->x-bbox->l.x; dist+=bbox->h.x-bbox->l.x; if (c->x == bbox->h.x) return dist+bbox->h.y-c->y; dist+=bbox->h.y-bbox->l.y; if (c->y == bbox->l.y) return dist+bbox->h.x-c->x; return -1; } static struct geom_poly_segment * find_next(struct rect *bbox, GList *segments, struct coord *c, int exclude, struct coord *ci) { int min=INT_MAX,search=distance_from_ll(c, bbox)+(exclude?1:0); GList *curr; int i; struct geom_poly_segment *ret=NULL; int dbgl=1; for (i = 0 ; i < 2 ; i++) { curr=segments; dbg(dbgl,"search distance %d\n",search); while (curr) { struct geom_poly_segment *seg=curr->data; int dist=distance_from_ll(seg->first, bbox); dbg(dbgl,"0x%x 0x%x dist %d\n",seg->first->x,seg->first->y,dist); if (dist != -1 && seg->first != seg->last && dist < min && (dist >= search)) { min=dist; ci[0]=*seg->first; ci[1]=*seg->last; ret=seg; } curr=g_list_next(curr); } if (ret || !search) break; search=0; } return ret; } static void close_polygon(struct item_bin *ib, struct coord *from, struct coord *to, int dir, struct rect *bbox, int *edges) { int i,e,dist,fromdist,todist; int full=(bbox->h.x-bbox->l.x+bbox->h.y-bbox->l.y)*2; int corners=0,first_corner=0; struct coord c; if (dir > 0) { fromdist=distance_from_ll(from, bbox); todist=distance_from_ll(to, bbox); } else { fromdist=distance_from_ll(to, bbox); todist=distance_from_ll(from, bbox); } #if 0 fprintf(stderr,"close_polygon fromdist %d todist %d full %d dir %d\n", fromdist, todist, full, dir); #endif if (fromdist > todist) todist+=full; #if 0 fprintf(stderr,"close_polygon corrected fromdist %d todist %d full %d dir %d\n", fromdist, todist, full, dir); #endif for (i = 0 ; i < 8 ; i++) { if (dir > 0) e=i; else e=7-i; switch (e%4) { case 0: c=bbox->l; break; case 1: c.x=bbox->l.x; c.y=bbox->h.y; break; case 2: c=bbox->h; break; case 3: c.x=bbox->h.x; c.y=bbox->l.y; break; } dist=distance_from_ll(&c, bbox); if (e & 4) dist+=full; #if 0 fprintf(stderr,"dist %d %d\n",e,dist); #endif if (dist > fromdist && dist < todist) { item_bin_add_coord(ib, &c, 1); #if 0 fprintf(stderr,"add\n"); #endif } if (dist >= fromdist && dist <= todist) { if (!corners) first_corner=e; corners++; } } while (corners >= 2) { *edges |= 1<<(first_corner%4); first_corner++; corners--; } } struct coastline_tile_data { struct item_bin_sink_func *sink; GHashTable *tile_edges; int level; GList *k,*v; }; static GList * tile_data_to_segments(int *tile_data) { int *end=tile_data+tile_data[0]; int *curr=tile_data+1; GList *segments=NULL; int count=0; while (curr < end) { struct item_bin *ib=(struct item_bin *)curr; segments=g_list_prepend(segments,item_bin_to_poly_segment(ib, geom_poly_segment_type_way_right_side)); curr+=ib->len+1; count++; } #if 0 fprintf(stderr,"%d segments\n",count); #endif return segments; } static void tile_collector_process_tile(char *tile, int *tile_data, struct coastline_tile_data *data) { int poly_start_valid,tile_start_valid,exclude,search=0; struct rect bbox; struct coord cn[2],end,poly_start,tile_start; struct geom_poly_segment *first; struct item_bin *ib=NULL; struct item_bin_sink *out=data->sink->priv_data[1]; int dbgl=1; int edges=0,flags; GList *sorted_segments,*curr; struct item_bin *ibt=(struct item_bin *)(tile_data+1); struct coastline_tile *ct=g_new0(struct coastline_tile, 1); ct->wayid=item_bin_get_wayid(ibt); #if 0 if (strncmp(tile,"bcdbdcabddddba",7)) return; #endif #if 0 if (strncmp(tile,"bcdbdcaaaaddba",14)) return; #endif #if 0 fprintf(stderr,"tile %s of size %d\n", tile, *tile_data); #endif tile_bbox(tile, &bbox, 0); curr=tile_data_to_segments(tile_data); sorted_segments=geom_poly_segments_sort(curr, geom_poly_segment_type_way_right_side); g_list_foreach(curr,(GFunc)geom_poly_segment_destroy,NULL); g_list_free(curr); #if 0 { GList *sort_segments=sorted_segments; int count=0; while (sort_segments) { struct geom_poly_segment *seg=sort_segments->data; struct item_bin *ib=(struct item_bin *)buffer; char *text=g_strdup_printf("segment %d type %d %p %s area "LONGLONG_FMT,count++,seg->type,sort_segments,coord_is_equal(*seg->first, *seg->last) ? "closed":"open",geom_poly_area(seg->first,seg->last-seg->first+1)); item_bin_init(ib, type_rg_segment); item_bin_add_coord(ib, seg->first, seg->last-seg->first+1); item_bin_add_attr_string(ib, attr_debug, text); // fprintf(stderr,"%s\n",text); g_free(text); // item_bin_dump(ib, stderr); item_bin_write_to_sink(ib, out, NULL); sort_segments=g_list_next(sort_segments); } } #endif flags=0; curr=sorted_segments; while (curr) { struct geom_poly_segment *seg=curr->data; switch (seg->type) { case geom_poly_segment_type_way_inner: flags|=1; break; case geom_poly_segment_type_way_outer: flags|=2; break; default: flags|=4; break; } curr=g_list_next(curr); } if (flags == 1) { ct->edges=15; ib=init_item(type_poly_water_tiled); item_bin_bbox(ib, &bbox); item_bin_add_attr_longlong(ib, attr_osm_wayid, ct->wayid); item_bin_write_to_sink(ib, out, NULL); g_hash_table_insert(data->tile_edges, g_strdup(tile), ct); return; } #if 1 end=bbox.l; tile_start_valid=0; poly_start_valid=0; exclude=0; poly_start.x=0; poly_start.y=0; tile_start.x=0; tile_start.y=0; for (;;) { search++; // item_bin_write_debug_point_to_sink(out, &end, "Search %d",search); dbg(dbgl,"searching next polygon from 0x%x 0x%x\n",end.x,end.y); first=find_next(&bbox, sorted_segments, &end, exclude, cn); exclude=1; if (!first) break; if (!tile_start_valid) { tile_start=cn[0]; tile_start_valid=1; } else { if (cn[0].x == tile_start.x && cn[0].y == tile_start.y) { dbg(dbgl,"end of tile reached\n"); break; } } if (first->type == geom_poly_segment_type_none) { end=cn[0]; continue; } poly_start_valid=0; dbg(dbgl,"start of polygon 0x%x 0x%x\n",cn[0].x,cn[0].y); for (;;) { if (!poly_start_valid) { poly_start=cn[0]; poly_start_valid=1; ib=init_item(type_poly_water_tiled); } else { close_polygon(ib, &end, &cn[0], 1, &bbox, &edges); if (cn[0].x == poly_start.x && cn[0].y == poly_start.y) { dbg(dbgl,"poly end reached\n"); item_bin_add_attr_longlong(ib, attr_osm_wayid, ct->wayid); item_bin_write_to_sink(ib, out, NULL); end=cn[0]; break; } } if (first->type == geom_poly_segment_type_none) break; item_bin_add_coord(ib, first->first, first->last-first->first+1); first->type=geom_poly_segment_type_none; end=cn[1]; if (distance_from_ll(&end, &bbox) == -1) { dbg(dbgl,"incomplete\n"); break; } first=find_next(&bbox, sorted_segments, &end, 1, cn); dbg(dbgl,"next segment of polygon 0x%x 0x%x\n",cn[0].x,cn[0].y); } if (search > 55) break; } g_list_foreach(sorted_segments,(GFunc)geom_poly_segment_destroy,NULL); g_list_free(sorted_segments); #endif #if 0 { int *end=tile_data+tile_data[0]; int *curr=tile_data+1; while (curr < end) { struct item_bin *ib=(struct item_bin *)curr; // item_bin_dump(ib); ib->type=type_rg_segment; item_bin_write_to_sink(ib, out, NULL); curr+=ib->len+1; #if 0 { struct coord *c[2]; int i; char *s; c[0]=(struct coord *)(ib+1); c[1]=c[0]+ib->clen/2-1; for (i = 0 ; i < 2 ; i++) { s=coord_to_str(c[i]); item_bin_write_debug_point_to_sink(out, c[i], "%s",s); g_free(s); } } #endif } } #endif ct->edges=edges; g_hash_table_insert(data->tile_edges, g_strdup(tile), ct); #if 0 item_bin_init(ib, type_border_country); item_bin_bbox(ib, &bbox); item_bin_add_attr_string(ib, attr_debug, tile); item_bin_write_to_sink(ib, out, NULL); #endif #if 0 c.x=(bbox.l.x+bbox.h.x)/2; c.y=(bbox.l.y+bbox.h.y)/2; item_bin_write_debug_point_to_sink(out, &c, "%s %d",tile,edges); #endif } static void ocean_tile(GHashTable *hash, char *tile, char c, osmid wayid, struct item_bin_sink *out) { int len=strlen(tile); char *tile2=g_alloca(sizeof(char)*(len+1)); struct rect bbox; struct item_bin *ib; struct coastline_tile *ct; strcpy(tile2, tile); tile2[len-1]=c; //fprintf(stderr,"Testing %s\n",tile2); ct=g_hash_table_lookup(hash, tile2); if (ct) return; //fprintf(stderr,"%s ok\n",tile2); tile_bbox(tile2, &bbox, 0); ib=init_item(type_poly_water_tiled); item_bin_bbox(ib, &bbox); item_bin_add_attr_longlong(ib, attr_osm_wayid, wayid); item_bin_write_to_sink(ib, out, NULL); ct=g_new0(struct coastline_tile, 1); ct->edges=15; ct->wayid=wayid; g_hash_table_insert(hash, g_strdup(tile2), ct); #if 0 item_bin_init(ib, type_border_country); item_bin_bbox(ib, &bbox); item_bin_add_attr_string(ib, attr_debug, tile2); item_bin_write_to_sink(ib, out, NULL); #endif #if 0 { struct coord co; co.x=(bbox.l.x+bbox.h.x)/2; co.y=(bbox.l.y+bbox.h.y)/2; item_bin_write_debug_point_to_sink(out, &co, "%s 15",tile2); } #endif } /* ba */ /* dc */ static void tile_collector_add_siblings(char *tile, struct coastline_tile *ct, struct coastline_tile_data *data) { int len=strlen(tile); char t=tile[len-1]; struct item_bin_sink *out=data->sink->priv_data[1]; int edges=ct->edges; int debug=0; #if 0 if (!strncmp(tile,"bcacccaadbdcd",10)) debug=1; #endif if (debug) fprintf(stderr,"%s (%c) has %d edges active\n",tile,t,edges); if (t == 'a' && (edges & 1)) ocean_tile(data->tile_edges, tile, 'b', ct->wayid, out); if (t == 'a' && (edges & 8)) ocean_tile(data->tile_edges, tile, 'c', ct->wayid, out); if (t == 'b' && (edges & 4)) ocean_tile(data->tile_edges, tile, 'a', ct->wayid, out); if (t == 'b' && (edges & 8)) ocean_tile(data->tile_edges, tile, 'd', ct->wayid, out); if (t == 'c' && (edges & 1)) ocean_tile(data->tile_edges, tile, 'd', ct->wayid, out); if (t == 'c' && (edges & 2)) ocean_tile(data->tile_edges, tile, 'a', ct->wayid, out); if (t == 'd' && (edges & 4)) ocean_tile(data->tile_edges, tile, 'c', ct->wayid, out); if (t == 'd' && (edges & 2)) ocean_tile(data->tile_edges, tile, 'b', ct->wayid, out); } static int tile_sibling_edges(GHashTable *hash, char *tile, char c) { int len=strlen(tile); char *tile2=g_alloca(sizeof(char)*(len+1)); struct coastline_tile *ct; strcpy(tile2, tile); tile2[len-1]=c; ct=g_hash_table_lookup(hash, tile2); if (ct) return ct->edges; return 15; } #if 0 static void ocean_tile2(struct rect *r, int dx, int dy, int wf, int hf, struct item_bin_sink *out) { struct item_bin *ib; int w=r->h.x-r->l.x; int h=r->h.y-r->l.y; char tile2[32]; struct rect bbox; bbox.l.x=r->l.x+dx*w; bbox.l.y=r->l.y+dy*h; bbox.h.x=bbox.l.x+w*wf; bbox.h.y=bbox.l.y+h*hf; //fprintf(stderr,"0x%x,0x%x-0x%x,0x%x -> 0x%x,0x%x-0x%x,0x%x\n",r->l.x,r->l.y,r->h.x,r->h.y,bbox.l.x,bbox.l.y,bbox.h.x,bbox.h.y); ib=init_item(type_poly_water_tiled); item_bin_bbox(ib, &bbox); item_bin_write_to_sink(ib, out, NULL); #if 0 item_bin_init(ib, type_border_country); item_bin_bbox(ib, &bbox); item_bin_add_attr_string(ib, attr_debug, tile2); item_bin_write_to_sink(ib, out, NULL); #endif tile(&bbox, NULL, tile2, 32, 0, NULL); #if 0 { struct coord co; co.x=(bbox.l.x+bbox.h.x)/2; co.y=(bbox.l.y+bbox.h.y)/2; item_bin_write_debug_point_to_sink(out, &co, "%s 15",tile2); } #endif } #endif static void tile_collector_add_siblings2(char *tile, struct coastline_tile *ct, struct coastline_tile_data *data) { int edges=ct->edges; int pedges=0; int debug=0; int len=strlen(tile); struct coastline_tile *cn, *co; char *tile2=g_alloca(sizeof(char)*(len+1)); char t=tile[len-1]; strcpy(tile2, tile); tile2[len-1]='\0'; #if 0 if (!strncmp(tile,"bcacccaadbdcd",10)) debug=1; #endif if (debug) fprintf(stderr,"len of %s %d vs %d\n",tile,len,data->level); if (debug) fprintf(stderr,"checking siblings of '%s' with %d edges active\n",tile,edges); if (t == 'b' && (edges & 1) && (tile_sibling_edges(data->tile_edges, tile, 'd') & 1)) pedges|=1; if (t == 'd' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'b') & 1)) pedges|=1; if (t == 'a' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'b') & 2)) pedges|=2; if (t == 'b' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'a') & 2)) pedges|=2; if (t == 'a' && (edges & 4) && (tile_sibling_edges(data->tile_edges, tile, 'c') & 4)) pedges|=4; if (t == 'c' && (edges & 4) && (tile_sibling_edges(data->tile_edges, tile, 'a') & 4)) pedges|=4; if (t == 'd' && (edges & 8) && (tile_sibling_edges(data->tile_edges, tile, 'c') & 8)) pedges|=8; if (t == 'c' && (edges & 8) && (tile_sibling_edges(data->tile_edges, tile, 'd') & 8)) pedges|=8; co=g_hash_table_lookup(data->tile_edges, tile2); if (debug) fprintf(stderr,"result '%s' %d old %d\n",tile2,pedges,co?co->edges:0); cn=g_new0(struct coastline_tile, 1); cn->edges=pedges; if (co) { cn->edges|=co->edges; cn->wayid=co->wayid; } else cn->wayid=ct->wayid; g_hash_table_insert(data->tile_edges, g_strdup(tile2), cn); } static void foreach_tile_func(gpointer key, gpointer value, gpointer user_data) { struct coastline_tile_data *data=user_data; if (strlen((char *)key) == data->level) { data->k=g_list_prepend(data->k, key); data->v=g_list_prepend(data->v, value); } } static void foreach_tile(struct coastline_tile_data *data, void(*func)(char *, struct coastline_tile *, struct coastline_tile_data *)) { GList *k,*v; data->k=NULL; data->v=NULL; g_hash_table_foreach(data->tile_edges, foreach_tile_func, data); k=data->k; v=data->v; while (k) { func(k->data,v->data,data); k=g_list_next(k); v=g_list_next(v); } g_list_free(data->k); g_list_free(data->v); } static int tile_collector_finish(struct item_bin_sink_func *tile_collector) { struct coastline_tile_data data; int i; GHashTable *hash; data.sink=tile_collector; data.tile_edges=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); hash=tile_collector->priv_data[0]; fprintf(stderr,"tile_collector_finish\n"); #if 1 g_hash_table_foreach(hash, (GHFunc) tile_collector_process_tile, &data); #endif fprintf(stderr,"tile_collector_finish foreach done\n"); g_hash_table_destroy(hash); fprintf(stderr,"tile_collector_finish destroy done\n"); for (i = 14 ; i > 0 ; i--) { fprintf(stderr,"Level=%d\n",i); data.level=i; foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); } #if 0 data.level=13; g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings2, &data); data.level=12; g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); #endif item_bin_sink_func_destroy(tile_collector); fprintf(stderr,"tile_collector_finish done\n"); return 0; } static int coastline_processor_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data) { #if 0 int i; struct coord *c=(struct coord *)(ib+1); for (i = 0 ; i < 19 ; i++) { c[i]=c[i+420]; } ib->clen=(i-1)*2; #endif item_bin_write_clipped(ib, func->priv_data[0], func->priv_data[1]); return 0; } static struct item_bin_sink_func * coastline_processor_new(struct item_bin_sink *out) { struct item_bin_sink_func *coastline_processor=item_bin_sink_func_new(coastline_processor_process); struct item_bin_sink *tiles=item_bin_sink_new(); struct item_bin_sink_func *tile_collector=tile_collector_new(out); struct tile_parameter *param=g_new0(struct tile_parameter, 1); param->min=14; param->max=14; param->overlap=0; param->attr_to_copy=attr_osm_wayid; item_bin_sink_add_func(tiles, tile_collector); coastline_processor->priv_data[0]=param; coastline_processor->priv_data[1]=tiles; coastline_processor->priv_data[2]=tile_collector; return coastline_processor; } static void coastline_processor_finish(struct item_bin_sink_func *coastline_processor) { struct tile_parameter *param=coastline_processor->priv_data[0]; struct item_bin_sink *tiles=coastline_processor->priv_data[1]; struct item_bin_sink_func *tile_collector=coastline_processor->priv_data[2]; g_free(param); tile_collector_finish(tile_collector); item_bin_sink_destroy(tiles); item_bin_sink_func_destroy(coastline_processor); } void process_coastlines(FILE *in, FILE *out) { struct item_bin_sink *reader=file_reader_new(in,-1,0); struct item_bin_sink_func *file_writer=file_writer_new(out); struct item_bin_sink *result=item_bin_sink_new(); struct item_bin_sink_func *coastline_processor=coastline_processor_new(result); item_bin_sink_add_func(reader, coastline_processor); item_bin_sink_add_func(result, file_writer); file_reader_finish(reader); coastline_processor_finish(coastline_processor); file_writer_finish(file_writer); item_bin_sink_destroy(result); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/fileformat.proto000066400000000000000000000016621221777731700232160ustar00rootroot00000000000000option java_package = "crosby.binary"; package OSMPBF; //protoc --java_out=../.. fileformat.proto // // STORAGE LAYER: Storing primitives. // message Blob { optional bytes raw = 1; // No compression optional int32 raw_size = 2; // When compressed, the uncompressed size // Possible compressed versions of the data. optional bytes zlib_data = 3; // PROPOSED feature for LZMA compressed data. SUPPORT IS NOT REQUIRED. optional bytes lzma_data = 4; // Formerly used for bzip2 compressed data. Depreciated in 2010. optional bytes OBSOLETE_bzip2_data = 5 [deprecated=true]; // Don't reuse this tag number. } /* A file contains an sequence of fileblock headers, each prefixed by their length in network byte order, followed by a data block containing the actual data. types staring with a "_" are reserved. */ message BlobHeader { required string type = 1; optional bytes indexdata = 2; required int32 datasize = 3; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/generated-code/000077500000000000000000000000001221777731700226425ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/maptool/generated-code/fileformat.pb-c.c000066400000000000000000000165611221777731700257670ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Do not generate deprecated warnings for self */ #ifndef PROTOBUF_C_NO_DEPRECATED #define PROTOBUF_C_NO_DEPRECATED #endif #include "fileformat.pb-c.h" void osmpbf__blob__init (OSMPBF__Blob *message) { static OSMPBF__Blob init_value = OSMPBF__BLOB__INIT; *message = init_value; } size_t osmpbf__blob__get_packed_size (const OSMPBF__Blob *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__blob__pack (const OSMPBF__Blob *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__blob__pack_to_buffer (const OSMPBF__Blob *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Blob * osmpbf__blob__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Blob *) protobuf_c_message_unpack (&osmpbf__blob__descriptor, allocator, len, data); } void osmpbf__blob__free_unpacked (OSMPBF__Blob *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__blob_header__init (OSMPBF__BlobHeader *message) { static OSMPBF__BlobHeader init_value = OSMPBF__BLOB_HEADER__INIT; *message = init_value; } size_t osmpbf__blob_header__get_packed_size (const OSMPBF__BlobHeader *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__blob_header__pack (const OSMPBF__BlobHeader *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__blob_header__pack_to_buffer (const OSMPBF__BlobHeader *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__BlobHeader * osmpbf__blob_header__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__BlobHeader *) protobuf_c_message_unpack (&osmpbf__blob_header__descriptor, allocator, len, data); } void osmpbf__blob_header__free_unpacked (OSMPBF__BlobHeader *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } static const ProtobufCFieldDescriptor osmpbf__blob__field_descriptors[5] = { { "raw", 1, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_raw), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, raw), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "raw_size", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_raw_size), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, raw_size), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "zlib_data", 3, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_zlib_data), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, zlib_data), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lzma_data", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_lzma_data), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, lzma_data), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "OBSOLETE_bzip2_data", 5, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_obsolete_bzip2_data), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, obsolete_bzip2_data), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__blob__field_indices_by_name[] = { 4, /* field[4] = OBSOLETE_bzip2_data */ 3, /* field[3] = lzma_data */ 0, /* field[0] = raw */ 1, /* field[1] = raw_size */ 2, /* field[2] = zlib_data */ }; static const ProtobufCIntRange osmpbf__blob__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__blob__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Blob", "Blob", "OSMPBF__Blob", "OSMPBF", sizeof(OSMPBF__Blob), 5, osmpbf__blob__field_descriptors, osmpbf__blob__field_indices_by_name, 1, osmpbf__blob__number_ranges, (ProtobufCMessageInit) osmpbf__blob__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__blob_header__field_descriptors[3] = { { "type", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_STRING, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, type), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "indexdata", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, has_indexdata), PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, indexdata), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "datasize", 3, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT32, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, datasize), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__blob_header__field_indices_by_name[] = { 2, /* field[2] = datasize */ 1, /* field[1] = indexdata */ 0, /* field[0] = type */ }; static const ProtobufCIntRange osmpbf__blob_header__number_ranges[1 + 1] = { { 1, 0 }, { 0, 3 } }; const ProtobufCMessageDescriptor osmpbf__blob_header__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.BlobHeader", "BlobHeader", "OSMPBF__BlobHeader", "OSMPBF", sizeof(OSMPBF__BlobHeader), 3, osmpbf__blob_header__field_descriptors, osmpbf__blob_header__field_indices_by_name, 1, osmpbf__blob_header__number_ranges, (ProtobufCMessageInit) osmpbf__blob_header__init, NULL,NULL,NULL /* reserved[123] */ }; navit-0.5.0~svn5643+dfsg.1/navit/maptool/generated-code/fileformat.pb-c.h000066400000000000000000000066371221777731700257770ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ #ifndef PROTOBUF_C_fileformat_2eproto__INCLUDED #define PROTOBUF_C_fileformat_2eproto__INCLUDED #include PROTOBUF_C_BEGIN_DECLS typedef struct _OSMPBF__Blob OSMPBF__Blob; typedef struct _OSMPBF__BlobHeader OSMPBF__BlobHeader; /* --- enums --- */ /* --- messages --- */ struct _OSMPBF__Blob { ProtobufCMessage base; protobuf_c_boolean has_raw; ProtobufCBinaryData raw; protobuf_c_boolean has_raw_size; int32_t raw_size; protobuf_c_boolean has_zlib_data; ProtobufCBinaryData zlib_data; protobuf_c_boolean has_lzma_data; ProtobufCBinaryData lzma_data; protobuf_c_boolean has_obsolete_bzip2_data PROTOBUF_C_DEPRECATED; ProtobufCBinaryData obsolete_bzip2_data PROTOBUF_C_DEPRECATED; }; #define OSMPBF__BLOB__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__blob__descriptor) \ , 0,{0,NULL}, 0,0, 0,{0,NULL}, 0,{0,NULL}, 0,{0,NULL} } struct _OSMPBF__BlobHeader { ProtobufCMessage base; char *type; protobuf_c_boolean has_indexdata; ProtobufCBinaryData indexdata; int32_t datasize; }; #define OSMPBF__BLOB_HEADER__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__blob_header__descriptor) \ , NULL, 0,{0,NULL}, 0 } /* OSMPBF__Blob methods */ void osmpbf__blob__init (OSMPBF__Blob *message); size_t osmpbf__blob__get_packed_size (const OSMPBF__Blob *message); size_t osmpbf__blob__pack (const OSMPBF__Blob *message, uint8_t *out); size_t osmpbf__blob__pack_to_buffer (const OSMPBF__Blob *message, ProtobufCBuffer *buffer); OSMPBF__Blob * osmpbf__blob__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__blob__free_unpacked (OSMPBF__Blob *message, ProtobufCAllocator *allocator); /* OSMPBF__BlobHeader methods */ void osmpbf__blob_header__init (OSMPBF__BlobHeader *message); size_t osmpbf__blob_header__get_packed_size (const OSMPBF__BlobHeader *message); size_t osmpbf__blob_header__pack (const OSMPBF__BlobHeader *message, uint8_t *out); size_t osmpbf__blob_header__pack_to_buffer (const OSMPBF__BlobHeader *message, ProtobufCBuffer *buffer); OSMPBF__BlobHeader * osmpbf__blob_header__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__blob_header__free_unpacked (OSMPBF__BlobHeader *message, ProtobufCAllocator *allocator); /* --- per-message closures --- */ typedef void (*OSMPBF__Blob_Closure) (const OSMPBF__Blob *message, void *closure_data); typedef void (*OSMPBF__BlobHeader_Closure) (const OSMPBF__BlobHeader *message, void *closure_data); /* --- services --- */ /* --- descriptors --- */ extern const ProtobufCMessageDescriptor osmpbf__blob__descriptor; extern const ProtobufCMessageDescriptor osmpbf__blob_header__descriptor; PROTOBUF_C_END_DECLS #endif /* PROTOBUF_fileformat_2eproto__INCLUDED */ navit-0.5.0~svn5643+dfsg.1/navit/maptool/generated-code/osmformat.pb-c.c000066400000000000000000001373711221777731700256510ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Do not generate deprecated warnings for self */ #ifndef PROTOBUF_C_NO_DEPRECATED #define PROTOBUF_C_NO_DEPRECATED #endif #include "osmformat.pb-c.h" void osmpbf__header_block__init (OSMPBF__HeaderBlock *message) { static OSMPBF__HeaderBlock init_value = OSMPBF__HEADER_BLOCK__INIT; *message = init_value; } size_t osmpbf__header_block__get_packed_size (const OSMPBF__HeaderBlock *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__header_block__pack (const OSMPBF__HeaderBlock *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__header_block__pack_to_buffer (const OSMPBF__HeaderBlock *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__HeaderBlock * osmpbf__header_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__HeaderBlock *) protobuf_c_message_unpack (&osmpbf__header_block__descriptor, allocator, len, data); } void osmpbf__header_block__free_unpacked (OSMPBF__HeaderBlock *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__header_bbox__init (OSMPBF__HeaderBBox *message) { static OSMPBF__HeaderBBox init_value = OSMPBF__HEADER_BBOX__INIT; *message = init_value; } size_t osmpbf__header_bbox__get_packed_size (const OSMPBF__HeaderBBox *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__header_bbox__pack (const OSMPBF__HeaderBBox *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__header_bbox__pack_to_buffer (const OSMPBF__HeaderBBox *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__HeaderBBox * osmpbf__header_bbox__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__HeaderBBox *) protobuf_c_message_unpack (&osmpbf__header_bbox__descriptor, allocator, len, data); } void osmpbf__header_bbox__free_unpacked (OSMPBF__HeaderBBox *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__primitive_block__init (OSMPBF__PrimitiveBlock *message) { static OSMPBF__PrimitiveBlock init_value = OSMPBF__PRIMITIVE_BLOCK__INIT; *message = init_value; } size_t osmpbf__primitive_block__get_packed_size (const OSMPBF__PrimitiveBlock *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__primitive_block__pack (const OSMPBF__PrimitiveBlock *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__primitive_block__pack_to_buffer (const OSMPBF__PrimitiveBlock *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__PrimitiveBlock * osmpbf__primitive_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__PrimitiveBlock *) protobuf_c_message_unpack (&osmpbf__primitive_block__descriptor, allocator, len, data); } void osmpbf__primitive_block__free_unpacked (OSMPBF__PrimitiveBlock *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__primitive_group__init (OSMPBF__PrimitiveGroup *message) { static OSMPBF__PrimitiveGroup init_value = OSMPBF__PRIMITIVE_GROUP__INIT; *message = init_value; } size_t osmpbf__primitive_group__get_packed_size (const OSMPBF__PrimitiveGroup *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__primitive_group__pack (const OSMPBF__PrimitiveGroup *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__primitive_group__pack_to_buffer (const OSMPBF__PrimitiveGroup *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__PrimitiveGroup * osmpbf__primitive_group__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__PrimitiveGroup *) protobuf_c_message_unpack (&osmpbf__primitive_group__descriptor, allocator, len, data); } void osmpbf__primitive_group__free_unpacked (OSMPBF__PrimitiveGroup *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__string_table__init (OSMPBF__StringTable *message) { static OSMPBF__StringTable init_value = OSMPBF__STRING_TABLE__INIT; *message = init_value; } size_t osmpbf__string_table__get_packed_size (const OSMPBF__StringTable *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__string_table__pack (const OSMPBF__StringTable *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__string_table__pack_to_buffer (const OSMPBF__StringTable *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__StringTable * osmpbf__string_table__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__StringTable *) protobuf_c_message_unpack (&osmpbf__string_table__descriptor, allocator, len, data); } void osmpbf__string_table__free_unpacked (OSMPBF__StringTable *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__info__init (OSMPBF__Info *message) { static OSMPBF__Info init_value = OSMPBF__INFO__INIT; *message = init_value; } size_t osmpbf__info__get_packed_size (const OSMPBF__Info *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__info__pack (const OSMPBF__Info *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__info__pack_to_buffer (const OSMPBF__Info *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Info * osmpbf__info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Info *) protobuf_c_message_unpack (&osmpbf__info__descriptor, allocator, len, data); } void osmpbf__info__free_unpacked (OSMPBF__Info *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__dense_info__init (OSMPBF__DenseInfo *message) { static OSMPBF__DenseInfo init_value = OSMPBF__DENSE_INFO__INIT; *message = init_value; } size_t osmpbf__dense_info__get_packed_size (const OSMPBF__DenseInfo *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__dense_info__pack (const OSMPBF__DenseInfo *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__dense_info__pack_to_buffer (const OSMPBF__DenseInfo *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__DenseInfo * osmpbf__dense_info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__DenseInfo *) protobuf_c_message_unpack (&osmpbf__dense_info__descriptor, allocator, len, data); } void osmpbf__dense_info__free_unpacked (OSMPBF__DenseInfo *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__change_set__init (OSMPBF__ChangeSet *message) { static OSMPBF__ChangeSet init_value = OSMPBF__CHANGE_SET__INIT; *message = init_value; } size_t osmpbf__change_set__get_packed_size (const OSMPBF__ChangeSet *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__change_set__pack (const OSMPBF__ChangeSet *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__change_set__pack_to_buffer (const OSMPBF__ChangeSet *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__ChangeSet * osmpbf__change_set__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__ChangeSet *) protobuf_c_message_unpack (&osmpbf__change_set__descriptor, allocator, len, data); } void osmpbf__change_set__free_unpacked (OSMPBF__ChangeSet *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__node__init (OSMPBF__Node *message) { static OSMPBF__Node init_value = OSMPBF__NODE__INIT; *message = init_value; } size_t osmpbf__node__get_packed_size (const OSMPBF__Node *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__node__pack (const OSMPBF__Node *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__node__pack_to_buffer (const OSMPBF__Node *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Node * osmpbf__node__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Node *) protobuf_c_message_unpack (&osmpbf__node__descriptor, allocator, len, data); } void osmpbf__node__free_unpacked (OSMPBF__Node *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__dense_nodes__init (OSMPBF__DenseNodes *message) { static OSMPBF__DenseNodes init_value = OSMPBF__DENSE_NODES__INIT; *message = init_value; } size_t osmpbf__dense_nodes__get_packed_size (const OSMPBF__DenseNodes *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__dense_nodes__pack (const OSMPBF__DenseNodes *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__dense_nodes__pack_to_buffer (const OSMPBF__DenseNodes *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__DenseNodes * osmpbf__dense_nodes__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__DenseNodes *) protobuf_c_message_unpack (&osmpbf__dense_nodes__descriptor, allocator, len, data); } void osmpbf__dense_nodes__free_unpacked (OSMPBF__DenseNodes *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__way__init (OSMPBF__Way *message) { static OSMPBF__Way init_value = OSMPBF__WAY__INIT; *message = init_value; } size_t osmpbf__way__get_packed_size (const OSMPBF__Way *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__way__pack (const OSMPBF__Way *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__way__pack_to_buffer (const OSMPBF__Way *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Way * osmpbf__way__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Way *) protobuf_c_message_unpack (&osmpbf__way__descriptor, allocator, len, data); } void osmpbf__way__free_unpacked (OSMPBF__Way *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__relation__init (OSMPBF__Relation *message) { static OSMPBF__Relation init_value = OSMPBF__RELATION__INIT; *message = init_value; } size_t osmpbf__relation__get_packed_size (const OSMPBF__Relation *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__relation__pack (const OSMPBF__Relation *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__relation__pack_to_buffer (const OSMPBF__Relation *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Relation * osmpbf__relation__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Relation *) protobuf_c_message_unpack (&osmpbf__relation__descriptor, allocator, len, data); } void osmpbf__relation__free_unpacked (OSMPBF__Relation *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } static const ProtobufCFieldDescriptor osmpbf__header_block__field_descriptors[5] = { { "bbox", 1, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, bbox), &osmpbf__header_bbox__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "required_features", 4, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_STRING, PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, n_required_features), PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, required_features), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "optional_features", 5, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_STRING, PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, n_optional_features), PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, optional_features), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "writingprogram", 16, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_STRING, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, writingprogram), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "source", 17, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_STRING, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, source), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__header_block__field_indices_by_name[] = { 0, /* field[0] = bbox */ 2, /* field[2] = optional_features */ 1, /* field[1] = required_features */ 4, /* field[4] = source */ 3, /* field[3] = writingprogram */ }; static const ProtobufCIntRange osmpbf__header_block__number_ranges[3 + 1] = { { 1, 0 }, { 4, 1 }, { 16, 3 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__header_block__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.HeaderBlock", "HeaderBlock", "OSMPBF__HeaderBlock", "OSMPBF", sizeof(OSMPBF__HeaderBlock), 5, osmpbf__header_block__field_descriptors, osmpbf__header_block__field_indices_by_name, 3, osmpbf__header_block__number_ranges, (ProtobufCMessageInit) osmpbf__header_block__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__header_bbox__field_descriptors[4] = { { "left", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, left), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "right", 2, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, right), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "top", 3, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, top), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "bottom", 4, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, bottom), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__header_bbox__field_indices_by_name[] = { 3, /* field[3] = bottom */ 0, /* field[0] = left */ 1, /* field[1] = right */ 2, /* field[2] = top */ }; static const ProtobufCIntRange osmpbf__header_bbox__number_ranges[1 + 1] = { { 1, 0 }, { 0, 4 } }; const ProtobufCMessageDescriptor osmpbf__header_bbox__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.HeaderBBox", "HeaderBBox", "OSMPBF__HeaderBBox", "OSMPBF", sizeof(OSMPBF__HeaderBBox), 4, osmpbf__header_bbox__field_descriptors, osmpbf__header_bbox__field_indices_by_name, 1, osmpbf__header_bbox__number_ranges, (ProtobufCMessageInit) osmpbf__header_bbox__init, NULL,NULL,NULL /* reserved[123] */ }; static const int32_t osmpbf__primitive_block__granularity__default_value = 100; static const int64_t osmpbf__primitive_block__lat_offset__default_value = 0; static const int64_t osmpbf__primitive_block__lon_offset__default_value = 0; static const int32_t osmpbf__primitive_block__date_granularity__default_value = 1000; static const ProtobufCFieldDescriptor osmpbf__primitive_block__field_descriptors[6] = { { "stringtable", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, stringtable), &osmpbf__string_table__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "primitivegroup", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, n_primitivegroup), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, primitivegroup), &osmpbf__primitive_group__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "granularity", 17, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_granularity), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, granularity), NULL, &osmpbf__primitive_block__granularity__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "date_granularity", 18, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_date_granularity), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, date_granularity), NULL, &osmpbf__primitive_block__date_granularity__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lat_offset", 19, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_lat_offset), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, lat_offset), NULL, &osmpbf__primitive_block__lat_offset__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lon_offset", 20, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_lon_offset), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, lon_offset), NULL, &osmpbf__primitive_block__lon_offset__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__primitive_block__field_indices_by_name[] = { 3, /* field[3] = date_granularity */ 2, /* field[2] = granularity */ 4, /* field[4] = lat_offset */ 5, /* field[5] = lon_offset */ 1, /* field[1] = primitivegroup */ 0, /* field[0] = stringtable */ }; static const ProtobufCIntRange osmpbf__primitive_block__number_ranges[2 + 1] = { { 1, 0 }, { 17, 2 }, { 0, 6 } }; const ProtobufCMessageDescriptor osmpbf__primitive_block__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.PrimitiveBlock", "PrimitiveBlock", "OSMPBF__PrimitiveBlock", "OSMPBF", sizeof(OSMPBF__PrimitiveBlock), 6, osmpbf__primitive_block__field_descriptors, osmpbf__primitive_block__field_indices_by_name, 2, osmpbf__primitive_block__number_ranges, (ProtobufCMessageInit) osmpbf__primitive_block__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__primitive_group__field_descriptors[5] = { { "nodes", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_nodes), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, nodes), &osmpbf__node__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "dense", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, dense), &osmpbf__dense_nodes__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "ways", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_ways), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, ways), &osmpbf__way__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "relations", 4, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_relations), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, relations), &osmpbf__relation__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "changesets", 5, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_changesets), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, changesets), &osmpbf__change_set__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__primitive_group__field_indices_by_name[] = { 4, /* field[4] = changesets */ 1, /* field[1] = dense */ 0, /* field[0] = nodes */ 3, /* field[3] = relations */ 2, /* field[2] = ways */ }; static const ProtobufCIntRange osmpbf__primitive_group__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__primitive_group__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.PrimitiveGroup", "PrimitiveGroup", "OSMPBF__PrimitiveGroup", "OSMPBF", sizeof(OSMPBF__PrimitiveGroup), 5, osmpbf__primitive_group__field_descriptors, osmpbf__primitive_group__field_indices_by_name, 1, osmpbf__primitive_group__number_ranges, (ProtobufCMessageInit) osmpbf__primitive_group__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__string_table__field_descriptors[1] = { { "s", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__StringTable, n_s), PROTOBUF_C_OFFSETOF(OSMPBF__StringTable, s), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__string_table__field_indices_by_name[] = { 0, /* field[0] = s */ }; static const ProtobufCIntRange osmpbf__string_table__number_ranges[1 + 1] = { { 1, 0 }, { 0, 1 } }; const ProtobufCMessageDescriptor osmpbf__string_table__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.StringTable", "StringTable", "OSMPBF__StringTable", "OSMPBF", sizeof(OSMPBF__StringTable), 1, osmpbf__string_table__field_descriptors, osmpbf__string_table__field_indices_by_name, 1, osmpbf__string_table__number_ranges, (ProtobufCMessageInit) osmpbf__string_table__init, NULL,NULL,NULL /* reserved[123] */ }; static const int32_t osmpbf__info__version__default_value = -1; static const ProtobufCFieldDescriptor osmpbf__info__field_descriptors[5] = { { "version", 1, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_version), PROTOBUF_C_OFFSETOF(OSMPBF__Info, version), NULL, &osmpbf__info__version__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "timestamp", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_timestamp), PROTOBUF_C_OFFSETOF(OSMPBF__Info, timestamp), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "changeset", 3, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_changeset), PROTOBUF_C_OFFSETOF(OSMPBF__Info, changeset), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "uid", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_uid), PROTOBUF_C_OFFSETOF(OSMPBF__Info, uid), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "user_sid", 5, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_user_sid), PROTOBUF_C_OFFSETOF(OSMPBF__Info, user_sid), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__info__field_indices_by_name[] = { 2, /* field[2] = changeset */ 1, /* field[1] = timestamp */ 3, /* field[3] = uid */ 4, /* field[4] = user_sid */ 0, /* field[0] = version */ }; static const ProtobufCIntRange osmpbf__info__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__info__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Info", "Info", "OSMPBF__Info", "OSMPBF", sizeof(OSMPBF__Info), 5, osmpbf__info__field_descriptors, osmpbf__info__field_indices_by_name, 1, osmpbf__info__number_ranges, (ProtobufCMessageInit) osmpbf__info__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__dense_info__field_descriptors[5] = { { "version", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_version), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, version), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "timestamp", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_timestamp), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, timestamp), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "changeset", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_changeset), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, changeset), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "uid", 4, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_uid), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, uid), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "user_sid", 5, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_user_sid), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, user_sid), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__dense_info__field_indices_by_name[] = { 2, /* field[2] = changeset */ 1, /* field[1] = timestamp */ 3, /* field[3] = uid */ 4, /* field[4] = user_sid */ 0, /* field[0] = version */ }; static const ProtobufCIntRange osmpbf__dense_info__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__dense_info__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.DenseInfo", "DenseInfo", "OSMPBF__DenseInfo", "OSMPBF", sizeof(OSMPBF__DenseInfo), 5, osmpbf__dense_info__field_descriptors, osmpbf__dense_info__field_indices_by_name, 1, osmpbf__dense_info__number_ranges, (ProtobufCMessageInit) osmpbf__dense_info__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__change_set__field_descriptors[1] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__ChangeSet, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__change_set__field_indices_by_name[] = { 0, /* field[0] = id */ }; static const ProtobufCIntRange osmpbf__change_set__number_ranges[1 + 1] = { { 1, 0 }, { 0, 1 } }; const ProtobufCMessageDescriptor osmpbf__change_set__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.ChangeSet", "ChangeSet", "OSMPBF__ChangeSet", "OSMPBF", sizeof(OSMPBF__ChangeSet), 1, osmpbf__change_set__field_descriptors, osmpbf__change_set__field_indices_by_name, 1, osmpbf__change_set__number_ranges, (ProtobufCMessageInit) osmpbf__change_set__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__node__field_descriptors[6] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Node, n_keys), PROTOBUF_C_OFFSETOF(OSMPBF__Node, keys), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "vals", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Node, n_vals), PROTOBUF_C_OFFSETOF(OSMPBF__Node, vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "info", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, info), &osmpbf__info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lat", 8, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, lat), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lon", 9, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, lon), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__node__field_indices_by_name[] = { 0, /* field[0] = id */ 3, /* field[3] = info */ 1, /* field[1] = keys */ 4, /* field[4] = lat */ 5, /* field[5] = lon */ 2, /* field[2] = vals */ }; static const ProtobufCIntRange osmpbf__node__number_ranges[2 + 1] = { { 1, 0 }, { 8, 4 }, { 0, 6 } }; const ProtobufCMessageDescriptor osmpbf__node__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Node", "Node", "OSMPBF__Node", "OSMPBF", sizeof(OSMPBF__Node), 6, osmpbf__node__field_descriptors, osmpbf__node__field_indices_by_name, 2, osmpbf__node__number_ranges, (ProtobufCMessageInit) osmpbf__node__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__dense_nodes__field_descriptors[5] = { { "id", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_id), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, id), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "denseinfo", 5, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, denseinfo), &osmpbf__dense_info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lat", 8, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_lat), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, lat), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lon", 9, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_lon), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, lon), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys_vals", 10, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_keys_vals), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, keys_vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__dense_nodes__field_indices_by_name[] = { 1, /* field[1] = denseinfo */ 0, /* field[0] = id */ 4, /* field[4] = keys_vals */ 2, /* field[2] = lat */ 3, /* field[3] = lon */ }; static const ProtobufCIntRange osmpbf__dense_nodes__number_ranges[3 + 1] = { { 1, 0 }, { 5, 1 }, { 8, 2 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__dense_nodes__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.DenseNodes", "DenseNodes", "OSMPBF__DenseNodes", "OSMPBF", sizeof(OSMPBF__DenseNodes), 5, osmpbf__dense_nodes__field_descriptors, osmpbf__dense_nodes__field_indices_by_name, 3, osmpbf__dense_nodes__number_ranges, (ProtobufCMessageInit) osmpbf__dense_nodes__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__way__field_descriptors[5] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Way, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_keys), PROTOBUF_C_OFFSETOF(OSMPBF__Way, keys), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "vals", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_vals), PROTOBUF_C_OFFSETOF(OSMPBF__Way, vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "info", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Way, info), &osmpbf__info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "refs", 8, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_refs), PROTOBUF_C_OFFSETOF(OSMPBF__Way, refs), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__way__field_indices_by_name[] = { 0, /* field[0] = id */ 3, /* field[3] = info */ 1, /* field[1] = keys */ 4, /* field[4] = refs */ 2, /* field[2] = vals */ }; static const ProtobufCIntRange osmpbf__way__number_ranges[2 + 1] = { { 1, 0 }, { 8, 4 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__way__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Way", "Way", "OSMPBF__Way", "OSMPBF", sizeof(OSMPBF__Way), 5, osmpbf__way__field_descriptors, osmpbf__way__field_indices_by_name, 2, osmpbf__way__number_ranges, (ProtobufCMessageInit) osmpbf__way__init, NULL,NULL,NULL /* reserved[123] */ }; const ProtobufCEnumValue osmpbf__relation__member_type__enum_values_by_number[3] = { { "NODE", "OSMPBF__RELATION__MEMBER_TYPE__NODE", 0 }, { "WAY", "OSMPBF__RELATION__MEMBER_TYPE__WAY", 1 }, { "RELATION", "OSMPBF__RELATION__MEMBER_TYPE__RELATION", 2 }, }; static const ProtobufCIntRange osmpbf__relation__member_type__value_ranges[] = { {0, 0},{0, 3} }; const ProtobufCEnumValueIndex osmpbf__relation__member_type__enum_values_by_name[3] = { { "NODE", 0 }, { "RELATION", 2 }, { "WAY", 1 }, }; const ProtobufCEnumDescriptor osmpbf__relation__member_type__descriptor = { PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC, "OSMPBF.Relation.MemberType", "MemberType", "OSMPBF__Relation__MemberType", "OSMPBF", 3, osmpbf__relation__member_type__enum_values_by_number, 3, osmpbf__relation__member_type__enum_values_by_name, 1, osmpbf__relation__member_type__value_ranges, NULL,NULL,NULL,NULL /* reserved[1234] */ }; static const ProtobufCFieldDescriptor osmpbf__relation__field_descriptors[7] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Relation, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_keys), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, keys), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "vals", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_vals), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "info", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Relation, info), &osmpbf__info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "roles_sid", 8, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_roles_sid), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, roles_sid), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "memids", 9, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_memids), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, memids), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "types", 10, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_ENUM, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_types), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, types), &osmpbf__relation__member_type__descriptor, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__relation__field_indices_by_name[] = { 0, /* field[0] = id */ 3, /* field[3] = info */ 1, /* field[1] = keys */ 5, /* field[5] = memids */ 4, /* field[4] = roles_sid */ 6, /* field[6] = types */ 2, /* field[2] = vals */ }; static const ProtobufCIntRange osmpbf__relation__number_ranges[2 + 1] = { { 1, 0 }, { 8, 4 }, { 0, 7 } }; const ProtobufCMessageDescriptor osmpbf__relation__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Relation", "Relation", "OSMPBF__Relation", "OSMPBF", sizeof(OSMPBF__Relation), 7, osmpbf__relation__field_descriptors, osmpbf__relation__field_indices_by_name, 2, osmpbf__relation__number_ranges, (ProtobufCMessageInit) osmpbf__relation__init, NULL,NULL,NULL /* reserved[123] */ }; navit-0.5.0~svn5643+dfsg.1/navit/maptool/generated-code/osmformat.pb-c.h000066400000000000000000000441461221777731700256530ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ #ifndef PROTOBUF_C_osmformat_2eproto__INCLUDED #define PROTOBUF_C_osmformat_2eproto__INCLUDED #include PROTOBUF_C_BEGIN_DECLS typedef struct _OSMPBF__HeaderBlock OSMPBF__HeaderBlock; typedef struct _OSMPBF__HeaderBBox OSMPBF__HeaderBBox; typedef struct _OSMPBF__PrimitiveBlock OSMPBF__PrimitiveBlock; typedef struct _OSMPBF__PrimitiveGroup OSMPBF__PrimitiveGroup; typedef struct _OSMPBF__StringTable OSMPBF__StringTable; typedef struct _OSMPBF__Info OSMPBF__Info; typedef struct _OSMPBF__DenseInfo OSMPBF__DenseInfo; typedef struct _OSMPBF__ChangeSet OSMPBF__ChangeSet; typedef struct _OSMPBF__Node OSMPBF__Node; typedef struct _OSMPBF__DenseNodes OSMPBF__DenseNodes; typedef struct _OSMPBF__Way OSMPBF__Way; typedef struct _OSMPBF__Relation OSMPBF__Relation; /* --- enums --- */ typedef enum _OSMPBF__Relation__MemberType { OSMPBF__RELATION__MEMBER_TYPE__NODE = 0, OSMPBF__RELATION__MEMBER_TYPE__WAY = 1, OSMPBF__RELATION__MEMBER_TYPE__RELATION = 2 } OSMPBF__Relation__MemberType; /* --- messages --- */ struct _OSMPBF__HeaderBlock { ProtobufCMessage base; OSMPBF__HeaderBBox *bbox; size_t n_required_features; char **required_features; size_t n_optional_features; char **optional_features; char *writingprogram; char *source; }; #define OSMPBF__HEADER_BLOCK__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__header_block__descriptor) \ , NULL, 0,NULL, 0,NULL, NULL, NULL } struct _OSMPBF__HeaderBBox { ProtobufCMessage base; int64_t left; int64_t right; int64_t top; int64_t bottom; }; #define OSMPBF__HEADER_BBOX__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__header_bbox__descriptor) \ , 0, 0, 0, 0 } struct _OSMPBF__PrimitiveBlock { ProtobufCMessage base; OSMPBF__StringTable *stringtable; size_t n_primitivegroup; OSMPBF__PrimitiveGroup **primitivegroup; protobuf_c_boolean has_granularity; int32_t granularity; protobuf_c_boolean has_lat_offset; int64_t lat_offset; protobuf_c_boolean has_lon_offset; int64_t lon_offset; protobuf_c_boolean has_date_granularity; int32_t date_granularity; }; #define OSMPBF__PRIMITIVE_BLOCK__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__primitive_block__descriptor) \ , NULL, 0,NULL, 0,100, 0,0, 0,0, 0,1000 } struct _OSMPBF__PrimitiveGroup { ProtobufCMessage base; size_t n_nodes; OSMPBF__Node **nodes; OSMPBF__DenseNodes *dense; size_t n_ways; OSMPBF__Way **ways; size_t n_relations; OSMPBF__Relation **relations; size_t n_changesets; OSMPBF__ChangeSet **changesets; }; #define OSMPBF__PRIMITIVE_GROUP__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__primitive_group__descriptor) \ , 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } struct _OSMPBF__StringTable { ProtobufCMessage base; size_t n_s; ProtobufCBinaryData *s; }; #define OSMPBF__STRING_TABLE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__string_table__descriptor) \ , 0,NULL } struct _OSMPBF__Info { ProtobufCMessage base; protobuf_c_boolean has_version; int32_t version; protobuf_c_boolean has_timestamp; int64_t timestamp; protobuf_c_boolean has_changeset; int64_t changeset; protobuf_c_boolean has_uid; int32_t uid; protobuf_c_boolean has_user_sid; uint32_t user_sid; }; #define OSMPBF__INFO__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__info__descriptor) \ , 0,-1, 0,0, 0,0, 0,0, 0,0 } struct _OSMPBF__DenseInfo { ProtobufCMessage base; size_t n_version; int32_t *version; size_t n_timestamp; int64_t *timestamp; size_t n_changeset; int64_t *changeset; size_t n_uid; int32_t *uid; size_t n_user_sid; int32_t *user_sid; }; #define OSMPBF__DENSE_INFO__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__dense_info__descriptor) \ , 0,NULL, 0,NULL, 0,NULL, 0,NULL, 0,NULL } struct _OSMPBF__ChangeSet { ProtobufCMessage base; int64_t id; }; #define OSMPBF__CHANGE_SET__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__change_set__descriptor) \ , 0 } struct _OSMPBF__Node { ProtobufCMessage base; int64_t id; size_t n_keys; uint32_t *keys; size_t n_vals; uint32_t *vals; OSMPBF__Info *info; int64_t lat; int64_t lon; }; #define OSMPBF__NODE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__node__descriptor) \ , 0, 0,NULL, 0,NULL, NULL, 0, 0 } struct _OSMPBF__DenseNodes { ProtobufCMessage base; size_t n_id; int64_t *id; OSMPBF__DenseInfo *denseinfo; size_t n_lat; int64_t *lat; size_t n_lon; int64_t *lon; size_t n_keys_vals; int32_t *keys_vals; }; #define OSMPBF__DENSE_NODES__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__dense_nodes__descriptor) \ , 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } struct _OSMPBF__Way { ProtobufCMessage base; int64_t id; size_t n_keys; uint32_t *keys; size_t n_vals; uint32_t *vals; OSMPBF__Info *info; size_t n_refs; int64_t *refs; }; #define OSMPBF__WAY__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__way__descriptor) \ , 0, 0,NULL, 0,NULL, NULL, 0,NULL } struct _OSMPBF__Relation { ProtobufCMessage base; int64_t id; size_t n_keys; uint32_t *keys; size_t n_vals; uint32_t *vals; OSMPBF__Info *info; size_t n_roles_sid; int32_t *roles_sid; size_t n_memids; int64_t *memids; size_t n_types; OSMPBF__Relation__MemberType *types; }; #define OSMPBF__RELATION__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__relation__descriptor) \ , 0, 0,NULL, 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } /* OSMPBF__HeaderBlock methods */ void osmpbf__header_block__init (OSMPBF__HeaderBlock *message); size_t osmpbf__header_block__get_packed_size (const OSMPBF__HeaderBlock *message); size_t osmpbf__header_block__pack (const OSMPBF__HeaderBlock *message, uint8_t *out); size_t osmpbf__header_block__pack_to_buffer (const OSMPBF__HeaderBlock *message, ProtobufCBuffer *buffer); OSMPBF__HeaderBlock * osmpbf__header_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__header_block__free_unpacked (OSMPBF__HeaderBlock *message, ProtobufCAllocator *allocator); /* OSMPBF__HeaderBBox methods */ void osmpbf__header_bbox__init (OSMPBF__HeaderBBox *message); size_t osmpbf__header_bbox__get_packed_size (const OSMPBF__HeaderBBox *message); size_t osmpbf__header_bbox__pack (const OSMPBF__HeaderBBox *message, uint8_t *out); size_t osmpbf__header_bbox__pack_to_buffer (const OSMPBF__HeaderBBox *message, ProtobufCBuffer *buffer); OSMPBF__HeaderBBox * osmpbf__header_bbox__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__header_bbox__free_unpacked (OSMPBF__HeaderBBox *message, ProtobufCAllocator *allocator); /* OSMPBF__PrimitiveBlock methods */ void osmpbf__primitive_block__init (OSMPBF__PrimitiveBlock *message); size_t osmpbf__primitive_block__get_packed_size (const OSMPBF__PrimitiveBlock *message); size_t osmpbf__primitive_block__pack (const OSMPBF__PrimitiveBlock *message, uint8_t *out); size_t osmpbf__primitive_block__pack_to_buffer (const OSMPBF__PrimitiveBlock *message, ProtobufCBuffer *buffer); OSMPBF__PrimitiveBlock * osmpbf__primitive_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__primitive_block__free_unpacked (OSMPBF__PrimitiveBlock *message, ProtobufCAllocator *allocator); /* OSMPBF__PrimitiveGroup methods */ void osmpbf__primitive_group__init (OSMPBF__PrimitiveGroup *message); size_t osmpbf__primitive_group__get_packed_size (const OSMPBF__PrimitiveGroup *message); size_t osmpbf__primitive_group__pack (const OSMPBF__PrimitiveGroup *message, uint8_t *out); size_t osmpbf__primitive_group__pack_to_buffer (const OSMPBF__PrimitiveGroup *message, ProtobufCBuffer *buffer); OSMPBF__PrimitiveGroup * osmpbf__primitive_group__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__primitive_group__free_unpacked (OSMPBF__PrimitiveGroup *message, ProtobufCAllocator *allocator); /* OSMPBF__StringTable methods */ void osmpbf__string_table__init (OSMPBF__StringTable *message); size_t osmpbf__string_table__get_packed_size (const OSMPBF__StringTable *message); size_t osmpbf__string_table__pack (const OSMPBF__StringTable *message, uint8_t *out); size_t osmpbf__string_table__pack_to_buffer (const OSMPBF__StringTable *message, ProtobufCBuffer *buffer); OSMPBF__StringTable * osmpbf__string_table__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__string_table__free_unpacked (OSMPBF__StringTable *message, ProtobufCAllocator *allocator); /* OSMPBF__Info methods */ void osmpbf__info__init (OSMPBF__Info *message); size_t osmpbf__info__get_packed_size (const OSMPBF__Info *message); size_t osmpbf__info__pack (const OSMPBF__Info *message, uint8_t *out); size_t osmpbf__info__pack_to_buffer (const OSMPBF__Info *message, ProtobufCBuffer *buffer); OSMPBF__Info * osmpbf__info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__info__free_unpacked (OSMPBF__Info *message, ProtobufCAllocator *allocator); /* OSMPBF__DenseInfo methods */ void osmpbf__dense_info__init (OSMPBF__DenseInfo *message); size_t osmpbf__dense_info__get_packed_size (const OSMPBF__DenseInfo *message); size_t osmpbf__dense_info__pack (const OSMPBF__DenseInfo *message, uint8_t *out); size_t osmpbf__dense_info__pack_to_buffer (const OSMPBF__DenseInfo *message, ProtobufCBuffer *buffer); OSMPBF__DenseInfo * osmpbf__dense_info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__dense_info__free_unpacked (OSMPBF__DenseInfo *message, ProtobufCAllocator *allocator); /* OSMPBF__ChangeSet methods */ void osmpbf__change_set__init (OSMPBF__ChangeSet *message); size_t osmpbf__change_set__get_packed_size (const OSMPBF__ChangeSet *message); size_t osmpbf__change_set__pack (const OSMPBF__ChangeSet *message, uint8_t *out); size_t osmpbf__change_set__pack_to_buffer (const OSMPBF__ChangeSet *message, ProtobufCBuffer *buffer); OSMPBF__ChangeSet * osmpbf__change_set__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__change_set__free_unpacked (OSMPBF__ChangeSet *message, ProtobufCAllocator *allocator); /* OSMPBF__Node methods */ void osmpbf__node__init (OSMPBF__Node *message); size_t osmpbf__node__get_packed_size (const OSMPBF__Node *message); size_t osmpbf__node__pack (const OSMPBF__Node *message, uint8_t *out); size_t osmpbf__node__pack_to_buffer (const OSMPBF__Node *message, ProtobufCBuffer *buffer); OSMPBF__Node * osmpbf__node__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__node__free_unpacked (OSMPBF__Node *message, ProtobufCAllocator *allocator); /* OSMPBF__DenseNodes methods */ void osmpbf__dense_nodes__init (OSMPBF__DenseNodes *message); size_t osmpbf__dense_nodes__get_packed_size (const OSMPBF__DenseNodes *message); size_t osmpbf__dense_nodes__pack (const OSMPBF__DenseNodes *message, uint8_t *out); size_t osmpbf__dense_nodes__pack_to_buffer (const OSMPBF__DenseNodes *message, ProtobufCBuffer *buffer); OSMPBF__DenseNodes * osmpbf__dense_nodes__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__dense_nodes__free_unpacked (OSMPBF__DenseNodes *message, ProtobufCAllocator *allocator); /* OSMPBF__Way methods */ void osmpbf__way__init (OSMPBF__Way *message); size_t osmpbf__way__get_packed_size (const OSMPBF__Way *message); size_t osmpbf__way__pack (const OSMPBF__Way *message, uint8_t *out); size_t osmpbf__way__pack_to_buffer (const OSMPBF__Way *message, ProtobufCBuffer *buffer); OSMPBF__Way * osmpbf__way__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__way__free_unpacked (OSMPBF__Way *message, ProtobufCAllocator *allocator); /* OSMPBF__Relation methods */ void osmpbf__relation__init (OSMPBF__Relation *message); size_t osmpbf__relation__get_packed_size (const OSMPBF__Relation *message); size_t osmpbf__relation__pack (const OSMPBF__Relation *message, uint8_t *out); size_t osmpbf__relation__pack_to_buffer (const OSMPBF__Relation *message, ProtobufCBuffer *buffer); OSMPBF__Relation * osmpbf__relation__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__relation__free_unpacked (OSMPBF__Relation *message, ProtobufCAllocator *allocator); /* --- per-message closures --- */ typedef void (*OSMPBF__HeaderBlock_Closure) (const OSMPBF__HeaderBlock *message, void *closure_data); typedef void (*OSMPBF__HeaderBBox_Closure) (const OSMPBF__HeaderBBox *message, void *closure_data); typedef void (*OSMPBF__PrimitiveBlock_Closure) (const OSMPBF__PrimitiveBlock *message, void *closure_data); typedef void (*OSMPBF__PrimitiveGroup_Closure) (const OSMPBF__PrimitiveGroup *message, void *closure_data); typedef void (*OSMPBF__StringTable_Closure) (const OSMPBF__StringTable *message, void *closure_data); typedef void (*OSMPBF__Info_Closure) (const OSMPBF__Info *message, void *closure_data); typedef void (*OSMPBF__DenseInfo_Closure) (const OSMPBF__DenseInfo *message, void *closure_data); typedef void (*OSMPBF__ChangeSet_Closure) (const OSMPBF__ChangeSet *message, void *closure_data); typedef void (*OSMPBF__Node_Closure) (const OSMPBF__Node *message, void *closure_data); typedef void (*OSMPBF__DenseNodes_Closure) (const OSMPBF__DenseNodes *message, void *closure_data); typedef void (*OSMPBF__Way_Closure) (const OSMPBF__Way *message, void *closure_data); typedef void (*OSMPBF__Relation_Closure) (const OSMPBF__Relation *message, void *closure_data); /* --- services --- */ /* --- descriptors --- */ extern const ProtobufCMessageDescriptor osmpbf__header_block__descriptor; extern const ProtobufCMessageDescriptor osmpbf__header_bbox__descriptor; extern const ProtobufCMessageDescriptor osmpbf__primitive_block__descriptor; extern const ProtobufCMessageDescriptor osmpbf__primitive_group__descriptor; extern const ProtobufCMessageDescriptor osmpbf__string_table__descriptor; extern const ProtobufCMessageDescriptor osmpbf__info__descriptor; extern const ProtobufCMessageDescriptor osmpbf__dense_info__descriptor; extern const ProtobufCMessageDescriptor osmpbf__change_set__descriptor; extern const ProtobufCMessageDescriptor osmpbf__node__descriptor; extern const ProtobufCMessageDescriptor osmpbf__dense_nodes__descriptor; extern const ProtobufCMessageDescriptor osmpbf__way__descriptor; extern const ProtobufCMessageDescriptor osmpbf__relation__descriptor; extern const ProtobufCEnumDescriptor osmpbf__relation__member_type__descriptor; PROTOBUF_C_END_DECLS #endif /* PROTOBUF_osmformat_2eproto__INCLUDED */ navit-0.5.0~svn5643+dfsg.1/navit/maptool/google/000077500000000000000000000000001221777731700212505ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/maptool/google/protobuf-c/000077500000000000000000000000001221777731700233305ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/maptool/google/protobuf-c/protobuf-c-private.h000066400000000000000000000054411221777731700272350ustar00rootroot00000000000000/* --- protobuf-c-private.h: private structures and functions --- */ /* * Copyright 2008, Dave Benson. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 Unless * required by applicable law or agreed to in writing, * software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* === needs to be declared for the PROTOBUF_C_BUFFER_SIMPLE_INIT macro === */ void protobuf_c_buffer_simple_append (ProtobufCBuffer *buffer, size_t len, const unsigned char *data); /* === stuff which needs to be declared for use in the generated code === */ struct _ProtobufCEnumValueIndex { const char *name; unsigned index; /* into values[] array */ }; /* IntRange: helper structure for optimizing int => index lookups in the case where the keys are mostly consecutive values, as they presumably are for enums and fields. The data structures assumes that the values in the original array are sorted */ struct _ProtobufCIntRange { int start_value; unsigned orig_index; /* NOTE: the number of values in the range can be inferred by looking at the next element's orig_index. a dummy element is added to make this simple */ }; /* === declared for exposition on ProtobufCIntRange === */ /* note: ranges must have an extra sentinel IntRange at the end whose orig_index is set to the number of actual values in the original array */ /* returns -1 if no orig_index found */ int protobuf_c_int_ranges_lookup (unsigned n_ranges, ProtobufCIntRange *ranges); #define PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC 0x14159bc3 #define PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC 0x28aaeef9 #define PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC 0x114315af /* === behind the scenes on the generated service's __init functions */ typedef void (*ProtobufCServiceDestroy) (ProtobufCService *service); void protobuf_c_service_generated_init (ProtobufCService *service, const ProtobufCServiceDescriptor *descriptor, ProtobufCServiceDestroy destroy); void protobuf_c_service_invoke_internal(ProtobufCService *service, unsigned method_index, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data); navit-0.5.0~svn5643+dfsg.1/navit/maptool/google/protobuf-c/protobuf-c.c000066400000000000000000002347041221777731700255660ustar00rootroot00000000000000/* --- protobuf-c.c: public protobuf c runtime implementation --- */ /* * Copyright 2008, Dave Benson. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 Unless * required by applicable law or agreed to in writing, * software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* TODO items: * 64-BIT OPTIMIZATION: certain implementations use 32-bit math even on 64-bit platforms (uint64_size, uint64_pack, parse_uint64) * get_packed_size and pack seem to use type-prefixed names, whereas parse uses type-suffixed names. pick one and stick with it. Decision: go with type-suffixed, since the type (or its instance) is typically the object of the verb. NOTE: perhaps the "parse" methods should be reanemd to "unpack" at the same time. (this only affects internal (static) functions) * use TRUE and FALSE instead of 1 and 0 as appropriate * use size_t consistently */ #include /* for occasional printf()s */ #include /* for abort(), malloc() etc */ #include /* for strlen(), memcpy(), memmove() */ #ifndef PRINT_UNPACK_ERRORS #define PRINT_UNPACK_ERRORS 1 #endif #include "protobuf-c.h" #define MAX_UINT64_ENCODED_SIZE 10 /* convenience macros */ #define TMPALLOC(allocator, size) ((allocator)->tmp_alloc ((allocator)->allocator_data, (size))) #define FREE(allocator, ptr) \ do { if ((ptr) != NULL) ((allocator)->free ((allocator)->allocator_data, (ptr))); } while(0) #define UNALIGNED_ALLOC(allocator, size) ALLOC (allocator, size) /* placeholder */ #define STRUCT_MEMBER_P(struct_p, struct_offset) \ ((void *) ((uint8_t*) (struct_p) + (struct_offset))) #define STRUCT_MEMBER(member_type, struct_p, struct_offset) \ (*(member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset))) #define STRUCT_MEMBER_PTR(member_type, struct_p, struct_offset) \ ((member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset))) #define TRUE 1 #define FALSE 0 static void alloc_failed_warning (unsigned size, const char *filename, unsigned line) { fprintf (stderr, "WARNING: out-of-memory allocating a block of size %u (%s:%u)\n", size, filename, line); } /* Try to allocate memory, running some special code if it fails. */ #define DO_ALLOC(dst, allocator, size, fail_code) \ { size_t da__allocation_size = (size); \ if (da__allocation_size == 0) \ dst = NULL; \ else if ((dst=((allocator)->alloc ((allocator)->allocator_data, \ da__allocation_size))) == NULL) \ { \ alloc_failed_warning (da__allocation_size, __FILE__, __LINE__); \ fail_code; \ } \ } #define DO_UNALIGNED_ALLOC DO_ALLOC /* placeholder */ #define ASSERT_IS_ENUM_DESCRIPTOR(desc) \ assert((desc)->magic == PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC) #define ASSERT_IS_MESSAGE_DESCRIPTOR(desc) \ assert((desc)->magic == PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC) #define ASSERT_IS_MESSAGE(message) \ ASSERT_IS_MESSAGE_DESCRIPTOR((message)->descriptor) #define ASSERT_IS_SERVICE_DESCRIPTOR(desc) \ assert((desc)->magic == PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC) /* --- allocator --- */ static void protobuf_c_out_of_memory_default (void) { fprintf (stderr, "Out Of Memory!!!\n"); abort (); } void (*protobuf_c_out_of_memory) (void) = protobuf_c_out_of_memory_default; static void *system_alloc(void *allocator_data, size_t size) { void *rv; (void) allocator_data; if (size == 0) return NULL; rv = malloc (size); if (rv == NULL) protobuf_c_out_of_memory (); return rv; } static void system_free (void *allocator_data, void *data) { (void) allocator_data; if (data) free (data); } /* Some users may configure the default allocator; providing your own allocator to unpack() is prefered. this allocator is still used for packing nested messages. */ ProtobufCAllocator protobuf_c_default_allocator = { system_alloc, system_free, NULL, 8192, NULL }; /* Users should NOT modify this structure, but it's difficult to prevent. please modify protobuf_c_default_allocator instead. */ ProtobufCAllocator protobuf_c_system_allocator = { system_alloc, system_free, NULL, 8192, NULL }; /* === buffer-simple === */ void protobuf_c_buffer_simple_append (ProtobufCBuffer *buffer, size_t len, const uint8_t *data) { ProtobufCBufferSimple *simp = (ProtobufCBufferSimple *) buffer; size_t new_len = simp->len + len; if (new_len > simp->alloced) { size_t new_alloced = simp->alloced * 2; uint8_t *new_data; while (new_alloced < new_len) new_alloced += new_alloced; DO_ALLOC (new_data, &protobuf_c_default_allocator, new_alloced, return); memcpy (new_data, simp->data, simp->len); if (simp->must_free_data) FREE (&protobuf_c_default_allocator, simp->data); else simp->must_free_data = 1; simp->data = new_data; simp->alloced = new_alloced; } memcpy (simp->data + simp->len, data, len); simp->len = new_len; } /* === get_packed_size() === */ /* Return the number of bytes required to store the tag for the field (which includes 3 bits for the wire-type, and a single bit that denotes the end-of-tag. */ static inline size_t get_tag_size (unsigned number) { if (number < (1<<4)) return 1; else if (number < (1<<11)) return 2; else if (number < (1<<18)) return 3; else if (number < (1<<25)) return 4; else return 5; } /* Return the number of bytes required to store a variable-length unsigned integer that fits in 32-bit uint in base-128 encoding. */ static inline size_t uint32_size (uint32_t v) { if (v < (1<<7)) return 1; else if (v < (1<<14)) return 2; else if (v < (1<<21)) return 3; else if (v < (1<<28)) return 4; else return 5; } /* Return the number of bytes required to store a variable-length signed integer that fits in 32-bit int in base-128 encoding. */ static inline size_t int32_size (int32_t v) { if (v < 0) return 10; else if (v < (1<<7)) return 1; else if (v < (1<<14)) return 2; else if (v < (1<<21)) return 3; else if (v < (1<<28)) return 4; else return 5; } /* return the zigzag-encoded 32-bit unsigned int from a 32-bit signed int */ static inline uint32_t zigzag32 (int32_t v) { if (v < 0) return ((uint32_t)(-v)) * 2 - 1; else return v * 2; } /* Return the number of bytes required to store a variable-length signed integer that fits in 32-bit int, converted to unsigned via the zig-zag algorithm, then packed using base-128 encoding. */ static inline size_t sint32_size (int32_t v) { return uint32_size(zigzag32(v)); } /* Return the number of bytes required to store a variable-length unsigned integer that fits in 64-bit uint in base-128 encoding. */ static inline size_t uint64_size (uint64_t v) { uint32_t upper_v = (v>>32); if (upper_v == 0) return uint32_size ((uint32_t)v); else if (upper_v < (1<<3)) return 5; else if (upper_v < (1<<10)) return 6; else if (upper_v < (1<<17)) return 7; else if (upper_v < (1<<24)) return 8; else if (upper_v < (1U<<31)) return 9; else return 10; } /* return the zigzag-encoded 64-bit unsigned int from a 64-bit signed int */ static inline uint64_t zigzag64 (int64_t v) { if (v < 0) return ((uint64_t)(-v)) * 2 - 1; else return v * 2; } /* Return the number of bytes required to store a variable-length signed integer that fits in 64-bit int, converted to unsigned via the zig-zag algorithm, then packed using base-128 encoding. */ static inline size_t sint64_size (int64_t v) { return uint64_size(zigzag64(v)); } /* Get serialized size of a single field in the message, including the space needed by the identifying tag. */ static size_t required_field_get_packed_size (const ProtobufCFieldDescriptor *field, const void *member) { size_t rv = get_tag_size (field->id); switch (field->type) { case PROTOBUF_C_TYPE_SINT32: return rv + sint32_size (*(const int32_t *) member); case PROTOBUF_C_TYPE_INT32: return rv + int32_size (*(const uint32_t *) member); case PROTOBUF_C_TYPE_UINT32: return rv + uint32_size (*(const uint32_t *) member); case PROTOBUF_C_TYPE_SINT64: return rv + sint64_size (*(const int64_t *) member); case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: return rv + uint64_size (*(const uint64_t *) member); case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: return rv + 4; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: return rv + 8; case PROTOBUF_C_TYPE_BOOL: return rv + 1; case PROTOBUF_C_TYPE_FLOAT: return rv + 4; case PROTOBUF_C_TYPE_DOUBLE: return rv + 8; case PROTOBUF_C_TYPE_ENUM: // TODO: is this correct for negative-valued enums? return rv + uint32_size (*(const uint32_t *) member); case PROTOBUF_C_TYPE_STRING: { const char *str = *(char * const *) member; size_t len = str ? strlen (str) : 0; return rv + uint32_size (len) + len; } case PROTOBUF_C_TYPE_BYTES: { size_t len = ((const ProtobufCBinaryData*) member)->len; return rv + uint32_size (len) + len; } //case PROTOBUF_C_TYPE_GROUP: case PROTOBUF_C_TYPE_MESSAGE: { const ProtobufCMessage *msg = * (ProtobufCMessage * const *) member; size_t subrv = msg ? protobuf_c_message_get_packed_size (msg) : 0; return rv + uint32_size (subrv) + subrv; } } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } /* Get serialized size of a single optional field in the message, including the space needed by the identifying tag. Returns 0 if the optional field isn't set. */ static size_t optional_field_get_packed_size (const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL || ptr == field->default_value) return 0; } else { if (!*has) return 0; } return required_field_get_packed_size (field, member); } /* Get serialized size of a repeated field in the message, which may consist of any number of values (including 0). Includes the space needed by the identifying tags (as needed). */ static size_t repeated_field_get_packed_size (const ProtobufCFieldDescriptor *field, size_t count, const void *member) { size_t header_size; size_t rv = 0; unsigned i; void *array = * (void * const *) member; if (count == 0) return 0; header_size = get_tag_size (field->id); if (!field->packed) header_size *= count; switch (field->type) { case PROTOBUF_C_TYPE_SINT32: for (i = 0; i < count; i++) rv += sint32_size (((int32_t*)array)[i]); break; case PROTOBUF_C_TYPE_INT32: for (i = 0; i < count; i++) rv += int32_size (((uint32_t*)array)[i]); break; case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_ENUM: for (i = 0; i < count; i++) rv += uint32_size (((uint32_t*)array)[i]); break; case PROTOBUF_C_TYPE_SINT64: for (i = 0; i < count; i++) rv += sint64_size (((int64_t*)array)[i]); break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: for (i = 0; i < count; i++) rv += uint64_size (((uint64_t*)array)[i]); break; case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: rv += 4 * count; break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: rv += 8 * count; break; case PROTOBUF_C_TYPE_BOOL: rv += count; break; case PROTOBUF_C_TYPE_STRING: for (i = 0; i < count; i++) { size_t len = strlen (((char**) array)[i]); rv += uint32_size (len) + len; } break; case PROTOBUF_C_TYPE_BYTES: for (i = 0; i < count; i++) { size_t len = ((ProtobufCBinaryData*) array)[i].len; rv += uint32_size (len) + len; } break; case PROTOBUF_C_TYPE_MESSAGE: for (i = 0; i < count; i++) { size_t len = protobuf_c_message_get_packed_size (((ProtobufCMessage **) array)[i]); rv += uint32_size (len) + len; } break; //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED } if (field->packed) header_size += uint32_size (rv); return header_size + rv; } /* Get the packed size of a unknown field (meaning one that is passed through mostly uninterpreted... this is done for forward compatibilty with the addition of new fields). */ static inline size_t unknown_field_get_packed_size (const ProtobufCMessageUnknownField *field) { return get_tag_size (field->tag) + field->len; } /* Get the number of bytes that the message will occupy once serialized. */ size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message) { unsigned i; size_t rv = 0; ASSERT_IS_MESSAGE (message); for (i = 0; i < message->descriptor->n_fields; i++) { const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; const void *member = ((const char *) message) + field->offset; const void *qmember = ((const char *) message) + field->quantifier_offset; if (field->label == PROTOBUF_C_LABEL_REQUIRED) rv += required_field_get_packed_size (field, member); else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) rv += optional_field_get_packed_size (field, qmember, member); else rv += repeated_field_get_packed_size (field, * (const size_t *) qmember, member); } for (i = 0; i < message->n_unknown_fields; i++) rv += unknown_field_get_packed_size (&message->unknown_fields[i]); return rv; } /* === pack() === */ /* Pack an unsigned 32-bit integer in base-128 encoding, and return the number of bytes needed: this will be 5 or less. */ static inline size_t uint32_pack (uint32_t value, uint8_t *out) { unsigned rv = 0; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; } } } } /* assert: value<128 */ out[rv++] = value; return rv; } /* Pack a 32-bit signed integer, returning the number of bytes needed. Negative numbers are packed as twos-complement 64-bit integers. */ static inline size_t int32_pack (int32_t value, uint8_t *out) { if (value < 0) { out[0] = value | 0x80; out[1] = (value>>7) | 0x80; out[2] = (value>>14) | 0x80; out[3] = (value>>21) | 0x80; out[4] = (value>>28) | 0x80; out[5] = out[6] = out[7] = out[8] = 0xff; out[9] = 0x01; return 10; } else return uint32_pack (value, out); } /* Pack a 32-bit integer in zigwag encoding. */ static inline size_t sint32_pack (int32_t value, uint8_t *out) { return uint32_pack (zigzag32 (value), out); } /* Pack a 64-bit unsigned integer that fits in a 64-bit uint, using base-128 encoding. */ static size_t uint64_pack (uint64_t value, uint8_t *out) { uint32_t hi = value>>32; uint32_t lo = value; unsigned rv; if (hi == 0) return uint32_pack ((uint32_t)lo, out); out[0] = (lo) | 0x80; out[1] = (lo>>7) | 0x80; out[2] = (lo>>14) | 0x80; out[3] = (lo>>21) | 0x80; if (hi < 8) { out[4] = (hi<<4) | (lo>>28); return 5; } else { out[4] = ((hi&7)<<4) | (lo>>28) | 0x80; hi >>= 3; } rv = 5; while (hi >= 128) { out[rv++] = hi | 0x80; hi >>= 7; } out[rv++] = hi; return rv; } /* Pack a 64-bit signed integer in zigzan encoding, return the size of the packed output. (Max returned value is 10) */ static inline size_t sint64_pack (int64_t value, uint8_t *out) { return uint64_pack (zigzag64 (value), out); } /* Pack a 32-bit value, little-endian. Used for fixed32, sfixed32, float) */ static inline size_t fixed32_pack (uint32_t value, uint8_t *out) { #if IS_LITTLE_ENDIAN memcpy (out, &value, 4); #else out[0] = value; out[1] = value>>8; out[2] = value>>16; out[3] = value>>24; #endif return 4; } /* Pack a 64-bit fixed-length value. (Used for fixed64, sfixed64, double) */ /* XXX: the big-endian impl is really only good for 32-bit machines, a 64-bit version would be appreciated, plus a way to decide to use 64-bit math where convenient. */ static inline size_t fixed64_pack (uint64_t value, uint8_t *out) { #if IS_LITTLE_ENDIAN memcpy (out, &value, 8); #else fixed32_pack (value, out); fixed32_pack (value>>32, out+4); #endif return 8; } /* Pack a boolean as 0 or 1, even though the protobuf_c_boolean can really assume any integer value. */ /* XXX: perhaps on some platforms "*out = !!value" would be a better impl, b/c that is idiotmatic c++ in some stl impls. */ static inline size_t boolean_pack (protobuf_c_boolean value, uint8_t *out) { *out = value ? 1 : 0; return 1; } /* Pack a length-prefixed string. The input string is NUL-terminated. The NULL pointer is treated as an empty string. This isn't really necessary, but it allows people to leave required strings blank. (See Issue 13 in the bug tracker for a little more explanation). */ static inline size_t string_pack (const char * str, uint8_t *out) { if (str == NULL) { out[0] = 0; return 1; } else { size_t len = strlen (str); size_t rv = uint32_pack (len, out); memcpy (out + rv, str, len); return rv + len; } } static inline size_t binary_data_pack (const ProtobufCBinaryData *bd, uint8_t *out) { size_t len = bd->len; size_t rv = uint32_pack (len, out); memcpy (out + rv, bd->data, len); return rv + len; } static inline size_t prefixed_message_pack (const ProtobufCMessage *message, uint8_t *out) { if (message == NULL) { out[0] = 0; return 1; } else { size_t rv = protobuf_c_message_pack (message, out + 1); uint32_t rv_packed_size = uint32_size (rv); if (rv_packed_size != 1) memmove (out + rv_packed_size, out + 1, rv); return uint32_pack (rv, out) + rv; } } /* wire-type will be added in required_field_pack() */ /* XXX: just call uint64_pack on 64-bit platforms. */ static size_t tag_pack (uint32_t id, uint8_t *out) { if (id < (1<<(32-3))) return uint32_pack (id<<3, out); else return uint64_pack (((uint64_t)id) << 3, out); } static size_t required_field_pack (const ProtobufCFieldDescriptor *field, const void *member, uint8_t *out) { size_t rv = tag_pack (field->id, out); switch (field->type) { case PROTOBUF_C_TYPE_SINT32: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + sint32_pack (*(const int32_t *) member, out + rv); case PROTOBUF_C_TYPE_INT32: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + int32_pack (*(const uint32_t *) member, out + rv); case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_ENUM: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + uint32_pack (*(const uint32_t *) member, out + rv); case PROTOBUF_C_TYPE_SINT64: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + sint64_pack (*(const int64_t *) member, out + rv); case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + uint64_pack (*(const uint64_t *) member, out + rv); case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: out[0] |= PROTOBUF_C_WIRE_TYPE_32BIT; return rv + fixed32_pack (*(const uint32_t *) member, out + rv); case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: out[0] |= PROTOBUF_C_WIRE_TYPE_64BIT; return rv + fixed64_pack (*(const uint64_t *) member, out + rv); case PROTOBUF_C_TYPE_BOOL: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + boolean_pack (*(const protobuf_c_boolean *) member, out + rv); case PROTOBUF_C_TYPE_STRING: { out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; return rv + string_pack (*(char * const *) member, out + rv); } case PROTOBUF_C_TYPE_BYTES: { const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; return rv + binary_data_pack (bd, out + rv); } //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: { out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; return rv + prefixed_message_pack (*(ProtobufCMessage * const *) member, out + rv); } } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } static size_t optional_field_pack (const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member, uint8_t *out) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL || ptr == field->default_value) return 0; } else { if (!*has) return 0; } return required_field_pack (field, member, out); } /* TODO: implement as a table lookup */ static inline size_t sizeof_elt_in_repeated_array (ProtobufCType type) { switch (type) { case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: case PROTOBUF_C_TYPE_ENUM: return 4; case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: return 8; case PROTOBUF_C_TYPE_BOOL: return sizeof (protobuf_c_boolean); case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_MESSAGE: return sizeof (void *); case PROTOBUF_C_TYPE_BYTES: return sizeof (ProtobufCBinaryData); } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } static void copy_to_little_endian_32 (void *out, const void *in, unsigned N) { #if IS_LITTLE_ENDIAN memcpy (out, in, N * 4); #else unsigned i; const uint32_t *ini = in; for (i = 0; i < N; i++) fixed32_pack (ini[i], (uint8_t*)out + 4*i); #endif } static void copy_to_little_endian_64 (void *out, const void *in, unsigned N) { #if IS_LITTLE_ENDIAN memcpy (out, in, N * 8); #else unsigned i; const uint64_t *ini = in; for (i = 0; i < N; i++) fixed64_pack (ini[i], (uint8_t*)out + 8*i); #endif } static unsigned get_type_min_size (ProtobufCType type) { if (type == PROTOBUF_C_TYPE_SFIXED32 || type == PROTOBUF_C_TYPE_FIXED32 || type == PROTOBUF_C_TYPE_FLOAT) return 4; if (type == PROTOBUF_C_TYPE_SFIXED64 || type == PROTOBUF_C_TYPE_FIXED64 || type == PROTOBUF_C_TYPE_DOUBLE) return 8; return 1; } static size_t repeated_field_pack (const ProtobufCFieldDescriptor *field, size_t count, const void *member, uint8_t *out) { char *array = * (char * const *) member; unsigned i; if (field->packed) { unsigned header_len; unsigned len_start; unsigned min_length; unsigned payload_len; unsigned length_size_min; unsigned actual_length_size; uint8_t *payload_at; if (count == 0) return 0; header_len = tag_pack (field->id, out); out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; len_start = header_len; min_length = get_type_min_size (field->type) * count; length_size_min = uint32_size (min_length); header_len += length_size_min; payload_at = out + header_len; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: copy_to_little_endian_32 (payload_at, array, count); payload_at += count * 4; break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: copy_to_little_endian_64 (payload_at, array, count); payload_at += count * 8; break; case PROTOBUF_C_TYPE_INT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) payload_at += int32_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_SINT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) payload_at += sint32_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_SINT64: { const int64_t *arr = (const int64_t *) array; for (i = 0; i < count; i++) payload_at += sint64_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: { const uint32_t *arr = (const uint32_t *) array; for (i = 0; i < count; i++) payload_at += uint32_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: { const uint64_t *arr = (const uint64_t *) array; for (i = 0; i < count; i++) payload_at += uint64_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_BOOL: { const protobuf_c_boolean *arr = (const protobuf_c_boolean *) array; for (i = 0; i < count; i++) payload_at += boolean_pack (arr[i], payload_at); } break; default: assert (0); } payload_len = payload_at - (out + header_len); actual_length_size = uint32_size (payload_len); if (length_size_min != actual_length_size) { assert (actual_length_size == length_size_min + 1); memmove (out + header_len + 1, out + header_len, payload_len); header_len++; } uint32_pack (payload_len, out + len_start); return header_len + payload_len; } else { /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */ size_t rv = 0; unsigned siz = sizeof_elt_in_repeated_array (field->type); for (i = 0; i < count; i++) { rv += required_field_pack (field, array, out + rv); array += siz; } return rv; } } static size_t unknown_field_pack (const ProtobufCMessageUnknownField *field, uint8_t *out) { size_t rv = tag_pack (field->tag, out); out[0] |= field->wire_type; memcpy (out + rv, field->data, field->len); return rv + field->len; } size_t protobuf_c_message_pack (const ProtobufCMessage *message, uint8_t *out) { unsigned i; size_t rv = 0; ASSERT_IS_MESSAGE (message); for (i = 0; i < message->descriptor->n_fields; i++) { const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; const void *member = ((const char *) message) + field->offset; /* it doesn't hurt to compute qmember (a pointer to the quantifier field of the structure), but the pointer is only valid if the field is one of: - a repeated field - an optional field that isn't a pointer type (meaning: not a message or a string) */ const void *qmember = ((const char *) message) + field->quantifier_offset; if (field->label == PROTOBUF_C_LABEL_REQUIRED) rv += required_field_pack (field, member, out + rv); else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) /* note that qmember is bogus for strings and messages, but it isn't used */ rv += optional_field_pack (field, qmember, member, out + rv); else rv += repeated_field_pack (field, * (const size_t *) qmember, member, out + rv); } for (i = 0; i < message->n_unknown_fields; i++) rv += unknown_field_pack (&message->unknown_fields[i], out + rv); return rv; } /* === pack_to_buffer() === */ static size_t required_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, const void *member, ProtobufCBuffer *buffer) { size_t rv; uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2]; rv = tag_pack (field->id, scratch); switch (field->type) { case PROTOBUF_C_TYPE_SINT32: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += sint32_pack (*(const int32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_INT32: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += int32_pack (*(const uint32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_ENUM: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += uint32_pack (*(const uint32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_SINT64: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += sint64_pack (*(const int64_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += uint64_pack (*(const uint64_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: scratch[0] |= PROTOBUF_C_WIRE_TYPE_32BIT; rv += fixed32_pack (*(const uint32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: scratch[0] |= PROTOBUF_C_WIRE_TYPE_64BIT; rv += fixed64_pack (*(const uint64_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_BOOL: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += boolean_pack (*(const protobuf_c_boolean *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_STRING: { const char *str = *(char * const *) member; size_t sublen = str ? strlen (str) : 0; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; rv += uint32_pack (sublen, scratch + rv); buffer->append (buffer, rv, scratch); buffer->append (buffer, sublen, (const uint8_t *) str); rv += sublen; break; } case PROTOBUF_C_TYPE_BYTES: { const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); size_t sublen = bd->len; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; rv += uint32_pack (sublen, scratch + rv); buffer->append (buffer, rv, scratch); buffer->append (buffer, sublen, bd->data); rv += sublen; break; } //PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: { uint8_t simple_buffer_scratch[256]; size_t sublen; ProtobufCBufferSimple simple_buffer = PROTOBUF_C_BUFFER_SIMPLE_INIT (simple_buffer_scratch); const ProtobufCMessage *msg = *(ProtobufCMessage * const *) member; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; if (msg == NULL) sublen = 0; else sublen = protobuf_c_message_pack_to_buffer (msg, &simple_buffer.base); rv += uint32_pack (sublen, scratch + rv); buffer->append (buffer, rv, scratch); buffer->append (buffer, sublen, simple_buffer.data); rv += sublen; PROTOBUF_C_BUFFER_SIMPLE_CLEAR (&simple_buffer); break; } default: PROTOBUF_C_ASSERT_NOT_REACHED (); } return rv; } static size_t optional_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member, ProtobufCBuffer *buffer) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL || ptr == field->default_value) return 0; } else { if (!*has) return 0; } return required_field_pack_to_buffer (field, member, buffer); } static size_t get_packed_payload_length (const ProtobufCFieldDescriptor *field, unsigned count, const void *array) { unsigned rv = 0; unsigned i; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: return count * 4; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: return count * 8; case PROTOBUF_C_TYPE_INT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) rv += int32_size (arr[i]); } break; case PROTOBUF_C_TYPE_SINT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) rv += sint32_size (arr[i]); } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: { const uint32_t *arr = (const uint32_t *) array; for (i = 0; i < count; i++) rv += uint32_size (arr[i]); } break; case PROTOBUF_C_TYPE_SINT64: { const int64_t *arr = (const int64_t *) array; for (i = 0; i < count; i++) rv += sint64_size (arr[i]); } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: { const uint64_t *arr = (const uint64_t *) array; for (i = 0; i < count; i++) rv += uint64_size (arr[i]); } break; case PROTOBUF_C_TYPE_BOOL: return count; default: assert (0); } return rv; } static size_t pack_buffer_packed_payload (const ProtobufCFieldDescriptor *field, unsigned count, const void *array, ProtobufCBuffer *buffer) { uint8_t scratch[16]; size_t rv = 0; unsigned i; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: #if IS_LITTLE_ENDIAN rv = count * 4; goto no_packing_needed; #else for (i = 0; i < count; i++) { unsigned len = fixed32_pack (((uint32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } #endif break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: #if IS_LITTLE_ENDIAN rv = count * 8; goto no_packing_needed; #else for (i = 0; i < count; i++) { unsigned len = fixed64_pack (((uint64_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; #endif case PROTOBUF_C_TYPE_INT32: for (i = 0; i < count; i++) { unsigned len = int32_pack (((int32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_SINT32: for (i = 0; i < count; i++) { unsigned len = sint32_pack (((int32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: for (i = 0; i < count; i++) { unsigned len = uint32_pack (((uint32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_SINT64: for (i = 0; i < count; i++) { unsigned len = sint64_pack (((int64_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: for (i = 0; i < count; i++) { unsigned len = uint64_pack (((uint64_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_BOOL: for (i = 0; i < count; i++) { unsigned len = boolean_pack (((protobuf_c_boolean*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } return count; default: assert(0); } return rv; #if IS_LITTLE_ENDIAN no_packing_needed: buffer->append (buffer, rv, array); return rv; #endif } static size_t repeated_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, unsigned count, const void *member, ProtobufCBuffer *buffer) { char *array = * (char * const *) member; if (count == 0) return 0; if (field->packed) { uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2]; size_t rv = tag_pack (field->id, scratch); size_t payload_len = get_packed_payload_length (field, count, array); size_t tmp; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; rv += uint32_pack (payload_len, scratch + rv); buffer->append (buffer, rv, scratch); tmp = pack_buffer_packed_payload (field, count, array, buffer); if (tmp != payload_len){ fprintf (stderr, "Unexpected payload length: %zu (expected: %zu). Aborting.\n", tmp, payload_len); abort (); } return rv + payload_len; } else { size_t siz; unsigned i; /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */ unsigned rv = 0; siz = sizeof_elt_in_repeated_array (field->type); for (i = 0; i < count; i++) { rv += required_field_pack_to_buffer (field, array, buffer); array += siz; } return rv; } } static size_t unknown_field_pack_to_buffer (const ProtobufCMessageUnknownField *field, ProtobufCBuffer *buffer) { uint8_t header[MAX_UINT64_ENCODED_SIZE]; size_t rv = tag_pack (field->tag, header); header[0] |= field->wire_type; buffer->append (buffer, rv, header); buffer->append (buffer, field->len, field->data); return rv + field->len; } size_t protobuf_c_message_pack_to_buffer (const ProtobufCMessage *message, ProtobufCBuffer *buffer) { unsigned i; size_t rv = 0; ASSERT_IS_MESSAGE (message); for (i = 0; i < message->descriptor->n_fields; i++) { const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; const void *member = ((const char *) message) + field->offset; const void *qmember = ((const char *) message) + field->quantifier_offset; if (field->label == PROTOBUF_C_LABEL_REQUIRED) rv += required_field_pack_to_buffer (field, member, buffer); else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) rv += optional_field_pack_to_buffer (field, qmember, member, buffer); else rv += repeated_field_pack_to_buffer (field, * (const size_t *) qmember, member, buffer); } for (i = 0; i < message->n_unknown_fields; i++) rv += unknown_field_pack_to_buffer (&message->unknown_fields[i], buffer); return rv; } /* === unpacking === */ #if PRINT_UNPACK_ERRORS # define UNPACK_ERROR(args) do { printf args;printf("\n"); }while(0) #else # define UNPACK_ERROR(args) do { } while (0) #endif static inline int int_range_lookup (unsigned n_ranges, const ProtobufCIntRange *ranges, int value) { unsigned start, n; if (n_ranges == 0) return -1; start = 0; n = n_ranges; while (n > 1) { unsigned mid = start + n / 2; if (value < ranges[mid].start_value) { n = mid - start; } else if (value >= ranges[mid].start_value + (int)(ranges[mid+1].orig_index-ranges[mid].orig_index)) { unsigned new_start = mid + 1; n = start + n - new_start; start = new_start; } else return (value - ranges[mid].start_value) + ranges[mid].orig_index; } if (n > 0) { unsigned start_orig_index = ranges[start].orig_index; unsigned range_size = ranges[start+1].orig_index - start_orig_index; if (ranges[start].start_value <= value && value < (int)(ranges[start].start_value + range_size)) return (value - ranges[start].start_value) + start_orig_index; } return -1; } static size_t parse_tag_and_wiretype (size_t len, const uint8_t *data, uint32_t *tag_out, ProtobufCWireType *wiretype_out) { unsigned max_rv = len > 5 ? 5 : len; uint32_t tag = (data[0]&0x7f) >> 3; unsigned shift = 4; unsigned rv; *wiretype_out = data[0] & 7; if ((data[0] & 0x80) == 0) { *tag_out = tag; return 1; } for (rv = 1; rv < max_rv; rv++) if (data[rv] & 0x80) { tag |= (data[rv] & 0x7f) << shift; shift += 7; } else { tag |= data[rv] << shift; *tag_out = tag; return rv + 1; } return 0; /* error: bad header */ } /* sizeof(ScannedMember) must be <= (1< len) { UNPACK_ERROR (("data too short after length-prefix of %u", val)); return 0; } return hdr_len + val; } static size_t max_b128_numbers (size_t len, const uint8_t *data) { size_t rv = 0; while (len--) if ((*data++ & 0x80) == 0) ++rv; return rv; } /* Given a raw slab of packed-repeated values, determine the number of elements. This function detects certain kinds of errors but not others; the remaining error checking is done by parse_packed_repeated_member() */ static protobuf_c_boolean count_packed_elements (ProtobufCType type, size_t len, const uint8_t *data, size_t *count_out) { switch (type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: if (len % 4 != 0) { UNPACK_ERROR (("length must be a multiple of 4 for fixed-length 32-bit types")); return FALSE; } *count_out = len / 4; return TRUE; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: if (len % 8 != 0) { UNPACK_ERROR (("length must be a multiple of 8 for fixed-length 64-bit types")); return FALSE; } *count_out = len / 8; return TRUE; case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_UINT64: *count_out = max_b128_numbers (len, data); return TRUE; case PROTOBUF_C_TYPE_BOOL: *count_out = len; return TRUE; case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_BYTES: case PROTOBUF_C_TYPE_MESSAGE: default: UNPACK_ERROR (("bad protobuf-c type %u for packed-repeated", type)); return FALSE; } } static inline uint32_t parse_uint32 (unsigned len, const uint8_t *data) { unsigned rv = data[0] & 0x7f; if (len > 1) { rv |= ((data[1] & 0x7f) << 7); if (len > 2) { rv |= ((data[2] & 0x7f) << 14); if (len > 3) { rv |= ((data[3] & 0x7f) << 21); if (len > 4) rv |= (data[4] << 28); } } } return rv; } static inline uint32_t parse_int32 (unsigned len, const uint8_t *data) { return parse_uint32 (len, data); } static inline int32_t unzigzag32 (uint32_t v) { if (v&1) return -(v>>1) - 1; else return v>>1; } static inline uint32_t parse_fixed_uint32 (const uint8_t *data) { #if IS_LITTLE_ENDIAN uint32_t t; memcpy (&t, data, 4); return t; #else return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); #endif } static uint64_t parse_uint64 (unsigned len, const uint8_t *data) { unsigned shift, i; if (len < 5) return parse_uint32 (len, data); uint64_t rv = ((data[0] & 0x7f)) | ((data[1] & 0x7f)<<7) | ((data[2] & 0x7f)<<14) | ((data[3] & 0x7f)<<21); shift = 28; for (i = 4; i < len; i++) { rv |= (((uint64_t)(data[i]&0x7f)) << shift); shift += 7; } return rv; } static inline int64_t unzigzag64 (uint64_t v) { if (v&1) return -(v>>1) - 1; else return v>>1; } static inline uint64_t parse_fixed_uint64 (const uint8_t *data) { #if IS_LITTLE_ENDIAN uint64_t t; memcpy (&t, data, 8); return t; #else return (uint64_t)parse_fixed_uint32 (data) | (((uint64_t)parse_fixed_uint32(data+4)) << 32); #endif } static protobuf_c_boolean parse_boolean (unsigned len, const uint8_t *data) { unsigned i; for (i = 0; i < len; i++) if (data[i] & 0x7f) return 1; return 0; } static protobuf_c_boolean parse_required_member (ScannedMember *scanned_member, void *member, ProtobufCAllocator *allocator, protobuf_c_boolean maybe_clear) { unsigned len = scanned_member->len; const uint8_t *data = scanned_member->data; ProtobufCWireType wire_type = scanned_member->wire_type; switch (scanned_member->field->type) { case PROTOBUF_C_TYPE_INT32: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint32_t*)member = parse_int32 (len, data); return 1; case PROTOBUF_C_TYPE_UINT32: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint32_t*)member = parse_uint32 (len, data); return 1; case PROTOBUF_C_TYPE_SINT32: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(int32_t*)member = unzigzag32 (parse_uint32 (len, data)); return 1; case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: if (wire_type != PROTOBUF_C_WIRE_TYPE_32BIT) return 0; *(uint32_t*)member = parse_fixed_uint32 (data); return 1; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint64_t*)member = parse_uint64 (len, data); return 1; case PROTOBUF_C_TYPE_SINT64: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(int64_t*)member = unzigzag64 (parse_uint64 (len, data)); return 1; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: if (wire_type != PROTOBUF_C_WIRE_TYPE_64BIT) return 0; *(uint64_t*)member = parse_fixed_uint64 (data); return 1; case PROTOBUF_C_TYPE_BOOL: *(protobuf_c_boolean*)member = parse_boolean (len, data); return 1; case PROTOBUF_C_TYPE_ENUM: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint32_t*)member = parse_uint32 (len, data); return 1; case PROTOBUF_C_TYPE_STRING: if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return 0; { char **pstr = member; unsigned pref_len = scanned_member->length_prefix_len; if (maybe_clear && *pstr != NULL) { const char *def = scanned_member->field->default_value; if (*pstr != NULL && *pstr != def) FREE (allocator, *pstr); } DO_ALLOC (*pstr, allocator, len - pref_len + 1, return 0); memcpy (*pstr, data + pref_len, len - pref_len); (*pstr)[len-pref_len] = 0; return 1; } case PROTOBUF_C_TYPE_BYTES: if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return 0; { ProtobufCBinaryData *bd = member; const ProtobufCBinaryData *def_bd; unsigned pref_len = scanned_member->length_prefix_len; def_bd = scanned_member->field->default_value; if (maybe_clear && bd->data != NULL && bd->data != def_bd->data) FREE (allocator, bd->data); DO_ALLOC (bd->data, allocator, len - pref_len, return 0); memcpy (bd->data, data + pref_len, len - pref_len); bd->len = len - pref_len; return 1; } //case PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return 0; { ProtobufCMessage **pmessage = member; ProtobufCMessage *subm; const ProtobufCMessage *def_mess; unsigned pref_len = scanned_member->length_prefix_len; def_mess = scanned_member->field->default_value; if (maybe_clear && *pmessage != NULL && *pmessage != def_mess) protobuf_c_message_free_unpacked (*pmessage, allocator); subm = protobuf_c_message_unpack (scanned_member->field->descriptor, allocator, len - pref_len, data + pref_len); *pmessage = subm; /* since we freed the message we must clear the field, even if NULL */ if (subm == NULL) return 0; return 1; } } return 0; } static protobuf_c_boolean parse_optional_member (ScannedMember *scanned_member, void *member, ProtobufCMessage *message, ProtobufCAllocator *allocator) { if (!parse_required_member (scanned_member, member, allocator, TRUE)) return 0; if (scanned_member->field->quantifier_offset != 0) STRUCT_MEMBER (protobuf_c_boolean, message, scanned_member->field->quantifier_offset) = 1; return 1; } static protobuf_c_boolean parse_repeated_member (ScannedMember *scanned_member, void *member, ProtobufCMessage *message, ProtobufCAllocator *allocator) { const ProtobufCFieldDescriptor *field = scanned_member->field; size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset); size_t siz = sizeof_elt_in_repeated_array (field->type); char *array = *(char**)member; if (!parse_required_member (scanned_member, array + siz * (*p_n), allocator, FALSE)) return 0; *p_n += 1; return 1; } static unsigned scan_varint (unsigned len, const uint8_t *data) { unsigned i; if (len > 10) len = 10; for (i = 0; i < len; i++) if ((data[i] & 0x80) == 0) break; if (i == len) return 0; return i + 1; } static protobuf_c_boolean parse_packed_repeated_member (ScannedMember *scanned_member, void *member, ProtobufCMessage *message) { const ProtobufCFieldDescriptor *field = scanned_member->field; size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset); size_t siz = sizeof_elt_in_repeated_array (field->type); char *array = *(char**)member + siz * (*p_n); const uint8_t *at = scanned_member->data + scanned_member->length_prefix_len; size_t rem = scanned_member->len - scanned_member->length_prefix_len; size_t count = 0; unsigned i; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: count = (scanned_member->len - scanned_member->length_prefix_len) / 4; #if IS_LITTLE_ENDIAN goto no_unpacking_needed; #else for (i = 0; i < count; i++) { ((uint32_t*)array)[i] = parse_fixed_uint32 (at); at += 4; } #endif break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: count = (scanned_member->len - scanned_member->length_prefix_len) / 8; #if IS_LITTLE_ENDIAN goto no_unpacking_needed; #else for (i = 0; i < count; i++) { ((uint64_t*)array)[i] = parse_fixed_uint64 (at); at += 8; } break; #endif case PROTOBUF_C_TYPE_INT32: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated int32 value")); return FALSE; } ((int32_t*)array)[count++] = parse_int32 (s, at); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_SINT32: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated sint32 value")); return FALSE; } ((int32_t*)array)[count++] = unzigzag32 (parse_uint32 (s, at)); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated enum or uint32 value")); return FALSE; } ((uint32_t*)array)[count++] = parse_uint32 (s, at); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_SINT64: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated sint64 value")); return FALSE; } ((int64_t*)array)[count++] = unzigzag64 (parse_uint64 (s, at)); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated int64/uint64 value")); return FALSE; } ((int64_t*)array)[count++] = parse_uint64 (s, at); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_BOOL: count = rem; for (i = 0; i < count; i++) { if (at[i] > 1) { UNPACK_ERROR (("bad packed-repeated boolean value")); return FALSE; } ((protobuf_c_boolean*)array)[i] = at[i]; } break; default: assert(0); } *p_n += count; return TRUE; #if IS_LITTLE_ENDIAN no_unpacking_needed: memcpy (array, at, count * siz); *p_n += count; return TRUE; #endif } static protobuf_c_boolean parse_member (ScannedMember *scanned_member, ProtobufCMessage *message, ProtobufCAllocator *allocator) { const ProtobufCFieldDescriptor *field = scanned_member->field; void *member; if (field == NULL) { ProtobufCMessageUnknownField *ufield = message->unknown_fields + (message->n_unknown_fields++); ufield->tag = scanned_member->tag; ufield->wire_type = scanned_member->wire_type; ufield->len = scanned_member->len; DO_UNALIGNED_ALLOC (ufield->data, allocator, scanned_member->len, return 0); memcpy (ufield->data, scanned_member->data, ufield->len); return 1; } member = (char*)message + field->offset; switch (field->label) { case PROTOBUF_C_LABEL_REQUIRED: return parse_required_member (scanned_member, member, allocator, TRUE); case PROTOBUF_C_LABEL_OPTIONAL: return parse_optional_member (scanned_member, member, message, allocator); case PROTOBUF_C_LABEL_REPEATED: if (field->packed && scanned_member->wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return parse_packed_repeated_member (scanned_member, member, message); else return parse_repeated_member (scanned_member, member, message, allocator); } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } /* TODO: expose/use this function if desc->message_init==NULL (which occurs for old code, and may be useful for certain programatic techniques for generating descriptors). */ static void protobuf_c_message_init_generic (const ProtobufCMessageDescriptor *desc, ProtobufCMessage *message) { unsigned i; memset (message, 0, desc->sizeof_message); message->descriptor = desc; for (i = 0; i < desc->n_fields; i++) if (desc->fields[i].default_value != NULL && desc->fields[i].label != PROTOBUF_C_LABEL_REPEATED) { void *field = STRUCT_MEMBER_P (message, desc->fields[i].offset); const void *dv = desc->fields[i].default_value; switch (desc->fields[i].type) { case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: case PROTOBUF_C_TYPE_ENUM: memcpy (field, dv, 4); break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_UINT64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: memcpy (field, dv, 8); break; case PROTOBUF_C_TYPE_BOOL: memcpy (field, dv, sizeof (protobuf_c_boolean)); break; case PROTOBUF_C_TYPE_BYTES: memcpy (field, dv, sizeof (ProtobufCBinaryData)); break; case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_MESSAGE: /* the next line essentially implements a cast from const, which is totally unavoidable. */ *(const void**)field = dv; break; } } } /* ScannedMember slabs (an unpacking implementation detail). Before doing real unpacking, we first scan through the elements to see how many there are (for repeated fields), and which field to use (for non-repeated fields given twice). * In order to avoid allocations for small messages, we keep a stack-allocated slab of ScannedMembers of size FIRST_SCANNED_MEMBER_SLAB_SIZE (16). After we fill that up, we allocate each slab twice as large as the previous one. */ #define FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2 4 /* The number of slabs, including the stack-allocated ones; choose the number so that we would overflow if we needed a slab larger than provided. */ #define MAX_SCANNED_MEMBER_SLAB \ (sizeof(void*)*8 - 1 \ - BOUND_SIZEOF_SCANNED_MEMBER_LOG2 \ - FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2) ProtobufCMessage * protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc, ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { ProtobufCMessage *rv; size_t rem = len; const uint8_t *at = data; const ProtobufCFieldDescriptor *last_field = desc->fields + 0; ScannedMember first_member_slab[1<n_fields + word_bits - 1) / word_bits; required_fields_bitmap = alloca(required_fields_bitmap_len * sizeof(long)); memset(required_fields_bitmap, 0, required_fields_bitmap_len * sizeof(long)); DO_ALLOC (rv, allocator, desc->sizeof_message, return NULL); scanned_member_slabs[0] = first_member_slab; /* Generated code always defines "message_init". However, we provide a fallback for (1) users of old protobuf-c generated-code that do not provide the function, and (2) descriptors constructed from some other source (most likely, direct construction from the .proto file) */ if (desc->message_init != NULL) protobuf_c_message_init (desc, rv); else protobuf_c_message_init_generic (desc, rv); while (rem > 0) { uint32_t tag; ProtobufCWireType wire_type; size_t used = parse_tag_and_wiretype (rem, at, &tag, &wire_type); const ProtobufCFieldDescriptor *field; ScannedMember tmp; if (used == 0) { UNPACK_ERROR (("error parsing tag/wiretype at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } /* XXX: consider optimizing for field[1].id == tag, if field[1] exists! */ if (last_field->id != tag) { /* lookup field */ int field_index = int_range_lookup (desc->n_field_ranges, desc->field_ranges, tag); if (field_index < 0) { field = NULL; n_unknown++; } else { field = desc->fields + field_index; last_field = field; last_field_index = field_index; } } else field = last_field; if (field != NULL && field->label == PROTOBUF_C_LABEL_REQUIRED) required_fields_bitmap[last_field_index / word_bits] |= (1UL << (last_field_index % word_bits)); at += used; rem -= used; tmp.tag = tag; tmp.wire_type = wire_type; tmp.field = field; tmp.data = at; switch (wire_type) { case PROTOBUF_C_WIRE_TYPE_VARINT: { unsigned max_len = rem < 10 ? rem : 10; unsigned i; for (i = 0; i < max_len; i++) if ((at[i] & 0x80) == 0) break; if (i == max_len) { UNPACK_ERROR (("unterminated varint at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } tmp.len = i + 1; } break; case PROTOBUF_C_WIRE_TYPE_64BIT: if (rem < 8) { UNPACK_ERROR (("too short after 64bit wiretype at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } tmp.len = 8; break; case PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED: { size_t pref_len; tmp.len = scan_length_prefixed_data (rem, at, &pref_len); if (tmp.len == 0) { /* NOTE: scan_length_prefixed_data calls UNPACK_ERROR */ goto error_cleanup_during_scan; } tmp.length_prefix_len = pref_len; break; } case PROTOBUF_C_WIRE_TYPE_32BIT: if (rem < 4) { UNPACK_ERROR (("too short after 32bit wiretype at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } tmp.len = 4; break; default: UNPACK_ERROR (("unsupported tag %u at offset %u", wire_type, (unsigned)(at-data))); goto error_cleanup_during_scan; } if (in_slab_index == (1U<<(which_slab+FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2))) { size_t size; in_slab_index = 0; if (which_slab == MAX_SCANNED_MEMBER_SLAB) { UNPACK_ERROR (("too many fields")); goto error_cleanup_during_scan; } which_slab++; size = sizeof(ScannedMember) << (which_slab+FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2); /* TODO: consider using alloca() ! */ if (allocator->tmp_alloc != NULL) scanned_member_slabs[which_slab] = TMPALLOC(allocator, size); else DO_ALLOC (scanned_member_slabs[which_slab], allocator, size, goto error_cleanup_during_scan); } scanned_member_slabs[which_slab][in_slab_index++] = tmp; if (field != NULL && field->label == PROTOBUF_C_LABEL_REPEATED) { size_t *n = STRUCT_MEMBER_PTR (size_t, rv, field->quantifier_offset); if (field->packed && wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) { size_t count; if (!count_packed_elements (field->type, tmp.len - tmp.length_prefix_len, tmp.data + tmp.length_prefix_len, &count)) { UNPACK_ERROR (("counting packed elements")); goto error_cleanup_during_scan; } *n += count; } else *n += 1; } at += tmp.len; rem -= tmp.len; } /* allocate space for repeated fields, also check that all required fields have been set */ for (f = 0; f < desc->n_fields; f++) { const ProtobufCFieldDescriptor *field = desc->fields + f; if (field->label == PROTOBUF_C_LABEL_REPEATED) { size_t siz = sizeof_elt_in_repeated_array (field->type); size_t *n_ptr = STRUCT_MEMBER_PTR (size_t, rv, field->quantifier_offset); if (*n_ptr != 0) { unsigned n = *n_ptr; *n_ptr = 0; assert(rv->descriptor != NULL); #define CLEAR_REMAINING_N_PTRS() \ for(f++;f < desc->n_fields; f++) \ { \ field = desc->fields + f; \ if (field->label == PROTOBUF_C_LABEL_REPEATED) \ STRUCT_MEMBER (size_t, rv, field->quantifier_offset) = 0; \ } DO_ALLOC (STRUCT_MEMBER (void *, rv, field->offset), allocator, siz * n, CLEAR_REMAINING_N_PTRS (); goto error_cleanup); #undef CLEAR_REMAINING_N_PTRS } } else if (field->label == PROTOBUF_C_LABEL_REQUIRED) { if (field->default_value == NULL && 0 == (required_fields_bitmap[f / word_bits] & (1UL << (f % word_bits)))) { UNPACK_ERROR (("message '%s': missing required field '%s'", desc->name, field->name)); goto error_cleanup; } } } /* allocate space for unknown fields */ if (n_unknown) { DO_ALLOC (rv->unknown_fields, allocator, n_unknown * sizeof (ProtobufCMessageUnknownField), goto error_cleanup); } /* do real parsing */ for (i_slab = 0; i_slab <= which_slab; i_slab++) { unsigned max = (i_slab == which_slab) ? in_slab_index : (1U<<(i_slab+4)); ScannedMember *slab = scanned_member_slabs[i_slab]; unsigned j; for (j = 0; j < max; j++) { if (!parse_member (slab + j, rv, allocator)) { UNPACK_ERROR (("error parsing member %s of %s", slab->field ? slab->field->name : "*unknown-field*", desc->name)); goto error_cleanup; } } } /* cleanup */ if (allocator->tmp_alloc == NULL) { unsigned j; for (j = 1; j <= which_slab; j++) FREE (allocator, scanned_member_slabs[j]); } return rv; error_cleanup: protobuf_c_message_free_unpacked (rv, allocator); if (allocator->tmp_alloc == NULL) { unsigned j; for (j = 1; j <= which_slab; j++) FREE (allocator, scanned_member_slabs[j]); } return NULL; error_cleanup_during_scan: FREE (allocator, rv); if (allocator->tmp_alloc == NULL) { unsigned j; for (j = 1; j <= which_slab; j++) FREE (allocator, scanned_member_slabs[j]); } return NULL; } /* === free_unpacked === */ void protobuf_c_message_free_unpacked (ProtobufCMessage *message, ProtobufCAllocator *allocator) { const ProtobufCMessageDescriptor *desc = message->descriptor; unsigned f; ASSERT_IS_MESSAGE (message); if (allocator == NULL) allocator = &protobuf_c_default_allocator; message->descriptor = NULL; for (f = 0; f < desc->n_fields; f++) { if (desc->fields[f].label == PROTOBUF_C_LABEL_REPEATED) { size_t n = STRUCT_MEMBER (size_t, message, desc->fields[f].quantifier_offset); void * arr = STRUCT_MEMBER (void *, message, desc->fields[f].offset); if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) { unsigned i; for (i = 0; i < n; i++) FREE (allocator, ((char**)arr)[i]); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) { unsigned i; for (i = 0; i < n; i++) FREE (allocator, ((ProtobufCBinaryData*)arr)[i].data); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) { unsigned i; for (i = 0; i < n; i++) protobuf_c_message_free_unpacked (((ProtobufCMessage**)arr)[i], allocator); } if (arr != NULL) FREE (allocator, arr); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) { char *str = STRUCT_MEMBER (char *, message, desc->fields[f].offset); if (str && str != desc->fields[f].default_value) FREE (allocator, str); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) { void *data = STRUCT_MEMBER (ProtobufCBinaryData, message, desc->fields[f].offset).data; const ProtobufCBinaryData *default_bd; default_bd = desc->fields[f].default_value; if (data != NULL && (default_bd == NULL || default_bd->data != data)) FREE (allocator, data); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) { ProtobufCMessage *sm; sm = STRUCT_MEMBER (ProtobufCMessage *, message,desc->fields[f].offset); if (sm && sm != desc->fields[f].default_value) protobuf_c_message_free_unpacked (sm, allocator); } } for (f = 0; f < message->n_unknown_fields; f++) FREE (allocator, message->unknown_fields[f].data); if (message->unknown_fields != NULL) FREE (allocator, message->unknown_fields); FREE (allocator, message); } /* === services === */ typedef void (*GenericHandler)(void *service, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data); void protobuf_c_service_invoke_internal(ProtobufCService *service, unsigned method_index, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data) { GenericHandler *handlers; GenericHandler handler; /* Verify that method_index is within range. If this fails, you are likely invoking a newly added method on an old service. (Although other memory corruption bugs can cause this assertion too) */ PROTOBUF_C_ASSERT (method_index < service->descriptor->n_methods); /* Get the array of virtual methods (which are enumerated by the generated code) */ handlers = (GenericHandler *) (service + 1); /* get our method and invoke it */ /* TODO: seems like handler==NULL is a situation that needs handling */ handler = handlers[method_index]; (*handler) (service, input, closure, closure_data); } void protobuf_c_service_generated_init (ProtobufCService *service, const ProtobufCServiceDescriptor *descriptor, ProtobufCServiceDestroy destroy) { ASSERT_IS_SERVICE_DESCRIPTOR(descriptor); service->descriptor = descriptor; service->destroy = destroy; service->invoke = protobuf_c_service_invoke_internal; memset (service + 1, 0, descriptor->n_methods * sizeof (GenericHandler)); } void protobuf_c_service_destroy (ProtobufCService *service) { service->destroy (service); } /* --- querying the descriptors --- */ const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value_by_name (const ProtobufCEnumDescriptor *desc, const char *name) { unsigned start = 0, count = desc->n_value_names; while (count > 1) { unsigned mid = start + count / 2; int rv = strcmp (desc->values_by_name[mid].name, name); if (rv == 0) return desc->values + desc->values_by_name[mid].index; else if (rv < 0) { count = start + count - (mid + 1); start = mid + 1; } else count = mid - start; } if (count == 0) return NULL; if (strcmp (desc->values_by_name[start].name, name) == 0) return desc->values + desc->values_by_name[start].index; return NULL; } const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value (const ProtobufCEnumDescriptor *desc, int value) { int rv = int_range_lookup (desc->n_value_ranges, desc->value_ranges, value); if (rv < 0) return NULL; return desc->values + rv; } const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field_by_name (const ProtobufCMessageDescriptor *desc, const char *name) { unsigned start = 0, count = desc->n_fields; const ProtobufCFieldDescriptor *field; while (count > 1) { unsigned mid = start + count / 2; int rv; field = desc->fields + desc->fields_sorted_by_name[mid]; rv = strcmp (field->name, name); if (rv == 0) return field; else if (rv < 0) { count = start + count - (mid + 1); start = mid + 1; } else count = mid - start; } if (count == 0) return NULL; field = desc->fields + desc->fields_sorted_by_name[start]; if (strcmp (field->name, name) == 0) return field; return NULL; } const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field (const ProtobufCMessageDescriptor *desc, unsigned value) { int rv = int_range_lookup (desc->n_field_ranges, desc->field_ranges, value); if (rv < 0) return NULL; return desc->fields + rv; } const ProtobufCMethodDescriptor * protobuf_c_service_descriptor_get_method_by_name (const ProtobufCServiceDescriptor *desc, const char *name) { unsigned start = 0, count = desc->n_methods; while (count > 1) { unsigned mid = start + count / 2; unsigned mid_index = desc->method_indices_by_name[mid]; const char *mid_name = desc->methods[mid_index].name; int rv = strcmp (mid_name, name); if (rv == 0) return desc->methods + desc->method_indices_by_name[mid]; if (rv < 0) { count = start + count - (mid + 1); start = mid + 1; } else { count = mid - start; } } if (count == 0) return NULL; if (strcmp (desc->methods[desc->method_indices_by_name[start]].name, name) == 0) return desc->methods + desc->method_indices_by_name[start]; return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/google/protobuf-c/protobuf-c.h000066400000000000000000000347751221777731700256010ustar00rootroot00000000000000/* --- protobuf-c.h: public protobuf c runtime api --- */ /* * Copyright 2008, Dave Benson. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 Unless * required by applicable law or agreed to in writing, * software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef __PROTOBUF_C_RUNTIME_H_ #define __PROTOBUF_C_RUNTIME_H_ #include #include #ifdef __cplusplus # define PROTOBUF_C_BEGIN_DECLS extern "C" { # define PROTOBUF_C_END_DECLS } #else # define PROTOBUF_C_BEGIN_DECLS # define PROTOBUF_C_END_DECLS #endif #if !defined(PROTOBUF_C_NO_DEPRECATED) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define PROTOBUF_C_DEPRECATED __attribute__((__deprecated__)) #else #define PROTOBUF_C_DEPRECATED #endif /* Define int32_t, int64_t, uint32_t, uint64_t, uint8_t. Usually, just include to do the work. XXX: should we use stdint.h? */ #ifndef PROTOBUF_C_SKIP_INTTYPES_H # if defined(_MSC_VER) /* On windows, in ms visual studio, define the types ourselves */ # define int32_t signed __int32 # define uint32_t unsigned __int32 # define int64_t signed __int64 # define uint64_t unsigned __int64 # define uint8_t unsigned char # else /* Use the system inttypes.h */ # include # endif #endif PROTOBUF_C_BEGIN_DECLS typedef enum { PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_LABEL_REPEATED } ProtobufCLabel; typedef enum { PROTOBUF_C_TYPE_INT32, PROTOBUF_C_TYPE_SINT32, PROTOBUF_C_TYPE_SFIXED32, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_TYPE_SFIXED64, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_TYPE_FIXED32, PROTOBUF_C_TYPE_UINT64, PROTOBUF_C_TYPE_FIXED64, PROTOBUF_C_TYPE_FLOAT, PROTOBUF_C_TYPE_DOUBLE, PROTOBUF_C_TYPE_BOOL, PROTOBUF_C_TYPE_ENUM, PROTOBUF_C_TYPE_STRING, PROTOBUF_C_TYPE_BYTES, //PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED PROTOBUF_C_TYPE_MESSAGE, } ProtobufCType; typedef int protobuf_c_boolean; #define PROTOBUF_C_OFFSETOF(struct, member) offsetof(struct, member) #define PROTOBUF_C_ASSERT(condition) assert(condition) #define PROTOBUF_C_ASSERT_NOT_REACHED() assert(0) typedef struct _ProtobufCBinaryData ProtobufCBinaryData; struct _ProtobufCBinaryData { size_t len; uint8_t *data; }; typedef struct _ProtobufCIntRange ProtobufCIntRange; /* private */ /* --- memory management --- */ typedef struct _ProtobufCAllocator ProtobufCAllocator; struct _ProtobufCAllocator { void *(*alloc)(void *allocator_data, size_t size); void (*free)(void *allocator_data, void *pointer); void *(*tmp_alloc)(void *allocator_data, size_t size); unsigned max_alloca; void *allocator_data; }; /* This is a configurable allocator. * By default, it uses the system allocator (meaning malloc() and free()). * This is typically changed to adapt to frameworks that provide * some nonstandard allocation functions. * * NOTE: you may modify this allocator. */ extern ProtobufCAllocator protobuf_c_default_allocator; /* settable */ /* This is the system allocator, meaning it uses malloc() and free(). * * NOTE: please do NOT modify this allocator. */ extern ProtobufCAllocator protobuf_c_system_allocator; /* use malloc, free etc */ /* This is the function that our default allocators call when they run out-of-memory. The default behavior of this function is to terminate your program. */ extern void (*protobuf_c_out_of_memory) (void); /* --- append-only data buffer --- */ typedef struct _ProtobufCBuffer ProtobufCBuffer; struct _ProtobufCBuffer { void (*append)(ProtobufCBuffer *buffer, size_t len, const uint8_t *data); }; /* --- enums --- */ typedef struct _ProtobufCEnumValue ProtobufCEnumValue; typedef struct _ProtobufCEnumValueIndex ProtobufCEnumValueIndex; typedef struct _ProtobufCEnumDescriptor ProtobufCEnumDescriptor; /* ProtobufCEnumValue: this represents a single value of * an enumeration. * 'name' is the string identifying this value, as given in the .proto file. * 'c_name' is the full name of the C enumeration value. * 'value' is the number assigned to this value, as given in the .proto file. */ struct _ProtobufCEnumValue { const char *name; const char *c_name; int value; }; /* ProtobufCEnumDescriptor: the represents the enum as a whole, * with all its values. * 'magic' is a code we check to ensure that the api is used correctly. * 'name' is the qualified name (e.g. "namespace.Type"). * 'short_name' is the unqualified name ("Type"), as given in the .proto file. * 'package_name' is the '.'-separated namespace * 'n_values' is the number of distinct values. * 'values' is the array of distinct values. * 'n_value_names' number of named values (including aliases). * 'value_names' are the named values (including aliases). * * The rest of the values are private essentially. * * see also: Use protobuf_c_enum_descriptor_get_value_by_name() * and protobuf_c_enum_descriptor_get_value() to efficiently * lookup values in the descriptor. */ struct _ProtobufCEnumDescriptor { uint32_t magic; const char *name; const char *short_name; const char *c_name; const char *package_name; /* sorted by value */ unsigned n_values; const ProtobufCEnumValue *values; /* sorted by name */ unsigned n_value_names; const ProtobufCEnumValueIndex *values_by_name; /* value-ranges, for faster lookups by number */ unsigned n_value_ranges; const ProtobufCIntRange *value_ranges; void *reserved1; void *reserved2; void *reserved3; void *reserved4; }; /* --- messages --- */ typedef struct _ProtobufCMessageDescriptor ProtobufCMessageDescriptor; typedef struct _ProtobufCFieldDescriptor ProtobufCFieldDescriptor; typedef struct _ProtobufCMessage ProtobufCMessage; typedef void (*ProtobufCMessageInit)(ProtobufCMessage *); /* ProtobufCFieldDescriptor: description of a single field * in a message. * 'name' is the name of the field, as given in the .proto file. * 'id' is the code representing the field, as given in the .proto file. * 'label' is one of PROTOBUF_C_LABEL_{REQUIRED,OPTIONAL,REPEATED} * 'type' is the type of field. * 'quantifier_offset' is the offset in bytes into the message's C structure * for this member's "has_MEMBER" field (for optional members) or * "n_MEMBER" field (for repeated members). * 'offset' is the offset in bytes into the message's C structure * for the member itself. * 'descriptor' is a pointer to a ProtobufC{Enum,Message}Descriptor * if type is PROTOBUF_C_TYPE_{ENUM,MESSAGE} respectively, * otherwise NULL. * 'default_value' is a pointer to a default value for this field, * where allowed. */ struct _ProtobufCFieldDescriptor { const char *name; uint32_t id; ProtobufCLabel label; ProtobufCType type; unsigned quantifier_offset; unsigned offset; const void *descriptor; /* for MESSAGE and ENUM types */ const void *default_value; /* or NULL if no default-value */ protobuf_c_boolean packed; unsigned reserved_flags; void *reserved2; void *reserved3; }; /* ProtobufCMessageDescriptor: description of a message. * * 'magic' is a code we check to ensure that the api is used correctly. * 'name' is the qualified name (e.g. "namespace.Type"). * 'short_name' is the unqualified name ("Type"), as given in the .proto file. * 'c_name' is the c-formatted name of the structure * 'package_name' is the '.'-separated namespace * 'sizeof_message' is the size in bytes of the C structure * representing an instance of this type of message. * 'n_fields' is the number of known fields in this message. * 'fields' is the fields sorted by id number. * 'fields_sorted_by_name', 'n_field_ranges' and 'field_ranges' * are used for looking up fields by name and id. (private) */ struct _ProtobufCMessageDescriptor { uint32_t magic; const char *name; const char *short_name; const char *c_name; const char *package_name; size_t sizeof_message; /* sorted by field-id */ unsigned n_fields; const ProtobufCFieldDescriptor *fields; const unsigned *fields_sorted_by_name; /* ranges, optimization for looking up fields */ unsigned n_field_ranges; const ProtobufCIntRange *field_ranges; ProtobufCMessageInit message_init; void *reserved1; void *reserved2; void *reserved3; }; /* ProtobufCMessage: an instance of a message. * * ProtobufCMessage is sort-of a lightweight * base-class for all messages. * * In particular, ProtobufCMessage doesn't have * any allocation policy associated with it. * That's because it is common to create ProtobufCMessage's * on the stack. In fact, we that's what we recommend * for sending messages (because if you just allocate from the * stack, then you can't really have a memory leak). * * This means that functions like protobuf_c_message_unpack() * which return a ProtobufCMessage must be paired * with a free function, like protobuf_c_message_free_unpacked(). * * 'descriptor' gives the locations and types of the members of message * 'n_unknown_fields' is the number of fields we didn't recognize. * 'unknown_fields' are fields we didn't recognize. */ typedef struct _ProtobufCMessageUnknownField ProtobufCMessageUnknownField; struct _ProtobufCMessage { const ProtobufCMessageDescriptor *descriptor; unsigned n_unknown_fields; ProtobufCMessageUnknownField *unknown_fields; }; #define PROTOBUF_C_MESSAGE_INIT(descriptor) { descriptor, 0, NULL } /* To pack a message: you have two options: (1) you can compute the size of the message using protobuf_c_message_get_packed_size() then pass protobuf_c_message_pack() a buffer of that length. (2) Provide a virtual buffer (a ProtobufCBuffer) to accept data as we scan through it. */ size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message); size_t protobuf_c_message_pack (const ProtobufCMessage *message, uint8_t *out); size_t protobuf_c_message_pack_to_buffer (const ProtobufCMessage *message, ProtobufCBuffer *buffer); ProtobufCMessage * protobuf_c_message_unpack (const ProtobufCMessageDescriptor *, ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void protobuf_c_message_free_unpacked (ProtobufCMessage *message, ProtobufCAllocator *allocator); /* WARNING: 'message' must be a block of memory of size descriptor->sizeof_message. */ #define protobuf_c_message_init(descriptor, message) ((descriptor)->message_init((ProtobufCMessage*) (message))) /* --- services --- */ typedef struct _ProtobufCMethodDescriptor ProtobufCMethodDescriptor; typedef struct _ProtobufCServiceDescriptor ProtobufCServiceDescriptor; struct _ProtobufCMethodDescriptor { const char *name; const ProtobufCMessageDescriptor *input; const ProtobufCMessageDescriptor *output; }; struct _ProtobufCServiceDescriptor { uint32_t magic; const char *name; const char *short_name; const char *c_name; const char *package; unsigned n_methods; const ProtobufCMethodDescriptor *methods; /* in order from .proto file */ const unsigned *method_indices_by_name; }; typedef struct _ProtobufCService ProtobufCService; typedef void (*ProtobufCClosure)(const ProtobufCMessage *message, void *closure_data); struct _ProtobufCService { const ProtobufCServiceDescriptor *descriptor; void (*invoke)(ProtobufCService *service, unsigned method_index, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data); void (*destroy) (ProtobufCService *service); }; void protobuf_c_service_destroy (ProtobufCService *); /* --- querying the descriptors --- */ const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value_by_name (const ProtobufCEnumDescriptor *desc, const char *name); const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value (const ProtobufCEnumDescriptor *desc, int value); const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field_by_name (const ProtobufCMessageDescriptor *desc, const char *name); const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field (const ProtobufCMessageDescriptor *desc, unsigned value); const ProtobufCMethodDescriptor * protobuf_c_service_descriptor_get_method_by_name (const ProtobufCServiceDescriptor *desc, const char *name); /* --- wire format enums --- */ typedef enum { PROTOBUF_C_WIRE_TYPE_VARINT, PROTOBUF_C_WIRE_TYPE_64BIT, PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED, PROTOBUF_C_WIRE_TYPE_START_GROUP, /* unsupported */ PROTOBUF_C_WIRE_TYPE_END_GROUP, /* unsupported */ PROTOBUF_C_WIRE_TYPE_32BIT } ProtobufCWireType; /* --- unknown message fields --- */ struct _ProtobufCMessageUnknownField { uint32_t tag; ProtobufCWireType wire_type; size_t len; uint8_t *data; }; /* --- extra (superfluous) api: trivial buffer --- */ typedef struct _ProtobufCBufferSimple ProtobufCBufferSimple; struct _ProtobufCBufferSimple { ProtobufCBuffer base; size_t alloced; size_t len; uint8_t *data; protobuf_c_boolean must_free_data; }; #define PROTOBUF_C_BUFFER_SIMPLE_INIT(array_of_bytes) \ { { protobuf_c_buffer_simple_append }, \ sizeof(array_of_bytes), 0, (array_of_bytes), 0 } #define PROTOBUF_C_BUFFER_SIMPLE_CLEAR(simp_buf) \ do { if ((simp_buf)->must_free_data) \ protobuf_c_default_allocator.free (&protobuf_c_default_allocator.allocator_data, (simp_buf)->data); } while (0) /* ====== private ====== */ #include "protobuf-c-private.h" PROTOBUF_C_END_DECLS #endif /* __PROTOBUF_C_RUNTIME_H_ */ navit-0.5.0~svn5643+dfsg.1/navit/maptool/itembin.c000066400000000000000000000420211221777731700215660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "maptool.h" #include "linguistics.h" #include "file.h" #include "debug.h" int item_bin_read(struct item_bin *ib, FILE *in) { if (fread(ib, 4, 1, in) == 0) return 0; if (!ib->len) return 1; if (fread((unsigned char *)ib+4, ib->len*4, 1, in)) return 2; return 0; } void item_bin_set_type(struct item_bin *ib, enum item_type type) { ib->type=type; } void item_bin_init(struct item_bin *ib, enum item_type type) { ib->clen=0; ib->len=2; item_bin_set_type(ib, type); } void item_bin_add_coord(struct item_bin *ib, struct coord *c, int count) { struct coord *c2=(struct coord *)(ib+1); c2+=ib->clen/2; memcpy(c2, c, count*sizeof(struct coord)); ib->clen+=count*2; ib->len+=count*2; } void item_bin_add_coord_reverse(struct item_bin *ib, struct coord *c, int count) { int i; for (i = count-1 ; i >= 0 ; i--) item_bin_add_coord(ib, &c[i], 1); } void item_bin_bbox(struct item_bin *ib, struct rect *r) { struct coord c; item_bin_add_coord(ib, &r->l, 1); c.x=r->h.x; c.y=r->l.y; item_bin_add_coord(ib, &c, 1); item_bin_add_coord(ib, &r->h, 1); c.x=r->l.x; c.y=r->h.y; item_bin_add_coord(ib, &c, 1); item_bin_add_coord(ib, &r->l, 1); } void item_bin_copy_coord(struct item_bin *ib, struct item_bin *from, int dir) { struct coord *c=(struct coord *)(from+1); int i,count=from->clen/2; if (dir >= 0) { item_bin_add_coord(ib, c, count); return; } for (i = 1 ; i <= count ; i++) item_bin_add_coord(ib, &c[count-i], 1); } void item_bin_copy_attr(struct item_bin *ib, struct item_bin *from, enum attr_type attr) { struct attr_bin *ab=item_bin_get_attr_bin(from, attr, NULL); if (ab) item_bin_add_attr_data(ib, ab->type, (void *)(ab+1), (ab->len-1)*4); assert(attr == attr_osm_wayid); assert(item_bin_get_wayid(ib) == item_bin_get_wayid(from)); } void item_bin_add_coord_rect(struct item_bin *ib, struct rect *r) { item_bin_add_coord(ib, &r->l, 1); item_bin_add_coord(ib, &r->h, 1); } int attr_bin_write_data(struct attr_bin *ab, enum attr_type type, void *data, int size) { int pad=(4-(size%4))%4; ab->type=type; memcpy(ab+1, data, size); memset((unsigned char *)(ab+1)+size, 0, pad); ab->len=(size+pad)/4+1; return ab->len+1; } int attr_bin_write_attr(struct attr_bin *ab, struct attr *attr) { return attr_bin_write_data(ab, attr->type, attr_data_get(attr), attr_data_size(attr)); } void item_bin_add_attr_data(struct item_bin *ib, enum attr_type type, void *data, int size) { struct attr_bin *ab=(struct attr_bin *)((int *)ib+ib->len+1); ib->len+=attr_bin_write_data(ab, type, data, size); } void item_bin_add_attr(struct item_bin *ib, struct attr *attr) { struct attr_bin *ab=(struct attr_bin *)((int *)ib+ib->len+1); if (ATTR_IS_GROUP(attr->type)) { int i=0; int *abptr; ab->type=attr->type; ab->len=1; abptr=(int *)(ab+1); while (attr->u.attrs[i].type) { int size=attr_bin_write_attr((struct attr_bin *)abptr, &attr->u.attrs[i]); ab->len+=size; abptr+=size; i++; } ib->len+=ab->len+1; } else ib->len+=attr_bin_write_attr(ab, attr); } void item_bin_remove_attr(struct item_bin *ib, void *ptr) { unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { struct attr_bin *ab=(struct attr_bin *)s; s+=(ab->len+1)*4; if ((void *)(ab+1) == ptr) { ib->len-=ab->len+1; memmove(ab,s,e-s); return; } } } void item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val) { struct attr attr; attr.type=type; attr.u.num=val; item_bin_add_attr(ib, &attr); } void * item_bin_get_attr(struct item_bin *ib, enum attr_type type, void *last) { unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { struct attr_bin *ab=(struct attr_bin *)s; s+=(ab->len+1)*4; if (ab->type == type && (void *)(ab+1) > last) { return (ab+1); } } return NULL; } struct attr_bin * item_bin_get_attr_bin(struct item_bin *ib, enum attr_type type, void *last) { unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { struct attr_bin *ab=(struct attr_bin *)s; s+=(ab->len+1)*4; if (ab->type == type && (void *)(ab+1) > last) { return ab; } } return NULL; } struct attr_bin * item_bin_get_attr_bin_last(struct item_bin *ib) { struct attr_bin *ab=NULL; unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { ab=(struct attr_bin *)s; s+=(ab->len+1)*4; } return ab; } void item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val) { struct attr attr; attr.type=type; attr.u.num64=&val; item_bin_add_attr(ib, &attr); } void item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str) { struct attr attr; if (! str) return; attr.type=type; attr.u.str=str; item_bin_add_attr(ib, &attr); } void item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max) { struct attr attr; attr.type=type; attr.u.range.min=min; attr.u.range.max=max; item_bin_add_attr(ib, &attr); } void item_bin_write(struct item_bin *ib, FILE *out) { fwrite(ib, (ib->len+1)*4, 1, out); } struct item_bin * item_bin_dup(struct item_bin *ib) { int len=(ib->len+1)*4; struct item_bin *ret=g_malloc(len); memcpy(ret, ib, len); return ret; } void item_bin_write_range(struct item_bin *ib, FILE *out, int min, int max) { struct range r; r.min=min; r.max=max; fwrite(&r, sizeof(r), 1, out); item_bin_write(ib, out); } void item_bin_write_clipped(struct item_bin *ib, struct tile_parameter *param, struct item_bin_sink *out) { struct tile_data tile_data; int i; bbox((struct coord *)(ib+1), ib->clen/2, &tile_data.item_bbox); tile_data.buffer[0]='\0'; tile_data.tile_depth=tile(&tile_data.item_bbox, NULL, tile_data.buffer, param->max, param->overlap, &tile_data.tile_bbox); if (tile_data.tile_depth == param->max || tile_data.tile_depth >= param->min) { item_bin_write_to_sink(ib, out, &tile_data); return; } for (i = 0 ; i < 4 ; i++) { struct rect clip_rect; tile_data.buffer[tile_data.tile_depth]='a'+i; tile_data.buffer[tile_data.tile_depth+1]='\0'; tile_bbox(tile_data.buffer, &clip_rect, param->overlap); if (ib->type < type_area) clip_line(ib, &clip_rect, param, out); else clip_polygon(ib, &clip_rect, param, out); } } static char * coord_to_str(struct coord *c) { int x=c->x; int y=c->y; char *sx=""; char *sy=""; if (x < 0) { sx="-"; x=-x; } if (y < 0) { sy="-"; y=-y; } return g_strdup_printf("%s0x%x %s0x%x",sx,x,sy,y); } static void dump_coord(struct coord *c, FILE *out) { char *str=coord_to_str(c); fprintf(out,"%s",str); g_free(str); } void item_bin_dump(struct item_bin *ib, FILE *out) { struct coord *c; struct attr_bin *a; struct attr attr; int *attr_start; int *attr_end; int i; char *str; c=(struct coord *)(ib+1); if (ib->type < type_line) { dump_coord(c,out); fprintf(out, " "); } attr_start=(int *)(ib+1)+ib->clen; attr_end=(int *)ib+ib->len+1; fprintf(out,"type=%s", item_to_name(ib->type)); while (attr_start < attr_end) { a=(struct attr_bin *)(attr_start); attr_start+=a->len+1; attr.type=a->type; attr_data_set(&attr, (a+1)); str=attr_to_text(&attr, NULL, 1); fprintf(out," %s=\"%s\"", attr_to_name(a->type), str); g_free(str); } fprintf(out," debug=\"length=%d\"", ib->len); fprintf(out,"\n"); if (ib->type >= type_line) { for (i = 0 ; i < ib->clen/2 ; i++) { dump_coord(c+i,out); fprintf(out,"\n"); } } } void dump_itembin(struct item_bin *ib) { item_bin_dump(ib, stdout); } struct population_table { enum item_type type; int population; }; static struct population_table town_population[] = { {type_town_label_0e0,0}, {type_town_label_1e0,1}, {type_town_label_2e0,2}, {type_town_label_5e0,5}, {type_town_label_1e1,10}, {type_town_label_2e1,20}, {type_town_label_5e1,50}, {type_town_label_1e2,100}, {type_town_label_2e2,200}, {type_town_label_5e2,500}, {type_town_label_1e3,1000}, {type_town_label_2e3,2000}, {type_town_label_5e3,5000}, {type_town_label_1e4,10000}, {type_town_label_2e4,20000}, {type_town_label_5e4,50000}, {type_town_label_1e5,100000}, {type_town_label_2e5,200000}, {type_town_label_5e5,500000}, {type_town_label_1e6,1000000}, {type_town_label_2e6,2000000}, {type_town_label_5e6,5000000}, {type_town_label_1e7,10000000}, }; static struct population_table district_population[] = { {type_district_label_0e0,0}, {type_district_label_1e0,1}, {type_district_label_2e0,2}, {type_district_label_5e0,5}, {type_district_label_1e1,10}, {type_district_label_2e1,20}, {type_district_label_5e1,50}, {type_district_label_1e2,100}, {type_district_label_2e2,200}, {type_district_label_5e2,500}, {type_district_label_1e3,1000}, {type_district_label_2e3,2000}, {type_district_label_5e3,5000}, {type_district_label_1e4,10000}, {type_district_label_2e4,20000}, {type_district_label_5e4,50000}, {type_district_label_1e5,100000}, {type_district_label_2e5,200000}, {type_district_label_5e5,500000}, {type_district_label_1e6,1000000}, {type_district_label_2e6,2000000}, {type_district_label_5e6,5000000}, {type_district_label_1e7,10000000}, }; void item_bin_set_type_by_population(struct item_bin *ib, int population) { struct population_table *table; int i,count; if (population < 0) population=0; if (item_is_district(*ib)) { table=district_population; count=sizeof(district_population)/sizeof(district_population[0]); } else { table=town_population; count=sizeof(town_population)/sizeof(town_population[0]); } for (i = 0 ; i < count ; i++) { if (population < table[i].population) break; } item_bin_set_type(ib, table[i-1].type); } void item_bin_write_match(struct item_bin *ib, enum attr_type type, enum attr_type match, int maxdepth, FILE *out) { char *word=item_bin_get_attr(ib, type, NULL); int i,words=0,len; char tilename[32]=""; if (!word) return; if(maxdepth && ib->clen>0) { struct rect r; struct coord *c=(struct coord *)(ib+1); r.l=c[0]; r.h=c[0]; for (i = 1 ; i < ib->clen/2 ; i++) bbox_extend(&c[i], &r); tile(&r,NULL,tilename,maxdepth,overlap,NULL); } /* insert attr_tile_name attribute before the attribute used as alphabetical key (of type type) */ if(maxdepth) { item_bin_add_attr_string(ib, attr_tile_name, tilename); item_bin_add_attr_string(ib, type, word); item_bin_remove_attr(ib,word); word=item_bin_get_attr(ib, type, NULL); } len=ib->len; do { if (linguistics_search(word)) { for (i = 0 ; i < 3 ; i++) { char *str=linguistics_expand_special(word, i); if (str) { ib->len=len; if (i || words) item_bin_add_attr_string(ib, match, str); item_bin_write(ib, out); g_free(str); } } words++; } word=linguistics_next_word(word); } while (word); } static int item_bin_sort_compare(const void *p1, const void *p2) { struct item_bin *ib1=*((struct item_bin **)p1),*ib2=*((struct item_bin **)p2); struct attr_bin *attr1,*attr2; char *s1,*s2; int ret; attr1=item_bin_get_attr_bin(ib1, attr_tile_name, NULL); attr2=item_bin_get_attr_bin(ib2, attr_tile_name, NULL); if(attr1&&attr2) { s1=(char *)(attr1+1); s2=(char *)(attr2+1); ret=strcmp(s1,s2); if(ret) return ret; } #if 0 dbg_assert(ib1->clen==2); dbg_assert(ib2->clen==2); attr1=(struct attr_bin *)((int *)(ib1+1)+ib1->clen); attr2=(struct attr_bin *)((int *)(ib2+1)+ib1->clen); #else attr1=item_bin_get_attr_bin_last(ib1); attr2=item_bin_get_attr_bin_last(ib2); #endif #if 0 dbg_assert(attr1->type == attr_town_name || attr1->type == attr_town_name_match); dbg_assert(attr2->type == attr_town_name || attr2->type == attr_town_name_match); #endif s1=(char *)(attr1+1); s2=(char *)(attr2+1); if (attr1->type == attr_house_number && attr2->type == attr_house_number) { ret=atoi(s1)-atoi(s2); if (ret) return ret; } s1=linguistics_casefold(s1); s2=linguistics_casefold(s2); ret=strcmp(s1, s2); g_free(s1); g_free(s2); if (!ret) { int match1=0,match2=0; match1=(attr1->type == attr_town_name_match || attr1->type == attr_district_name_match); match2=(attr2->type == attr_town_name_match || attr2->type == attr_district_name_match); ret=match1-match2; } #if 0 fprintf(stderr,"sort_countries_compare p1=%p p2=%p %s %s\n",p1,p2,s1,s2); #endif return ret; } int item_bin_sort_file(char *in_file, char *out_file, struct rect *r, int *size) { int j,k,count,rc=0; struct coord *c; struct item_bin *ib; FILE *f; unsigned char *p,**idx,*buffer; if (file_get_contents(in_file, &buffer, size)) { ib=(struct item_bin *)buffer; p=buffer; count=0; while (p < buffer+*size) { count++; p+=(*((int *)p)+1)*4; } idx=g_malloc(count*sizeof(void *)); p=buffer; for (j = 0 ; j < count ; j++) { idx[j]=p; p+=(*((int *)p)+1)*4; } qsort(idx, count, sizeof(void *), item_bin_sort_compare); f=fopen(out_file,"wb"); for (j = 0 ; j < count ; j++) { ib=(struct item_bin *)(idx[j]); c=(struct coord *)(ib+1); fwrite(ib, (ib->len+1)*4, 1, f); if (r) { for (k = 0 ; k < ib->clen/2 ; k++) { if (rc) bbox_extend(&c[k], r); else { r->l=c[k]; r->h=c[k]; } rc++; } } } fclose(f); g_free(idx); g_free(buffer); return 1; } return 0; } struct geom_poly_segment * item_bin_to_poly_segment(struct item_bin *ib, int type) { struct geom_poly_segment *ret=g_new(struct geom_poly_segment, 1); int count=ib->clen*sizeof(int)/sizeof(struct coord); ret->type=type; ret->first=g_new(struct coord, count); ret->last=ret->first+count-1; geom_coord_copy((struct coord *)(ib+1), ret->first, count, 0); return ret; } void clip_line(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out) { char *buffer=g_alloca(sizeof(char)*(ib->len*4+32)); struct item_bin *ib_new=(struct item_bin *)buffer; struct coord *pa=(struct coord *)(ib+1); int count=ib->clen/2; struct coord p1,p2; int i,code; item_bin_init(ib_new, ib->type); for (i = 0 ; i < count ; i++) { if (i) { p1.x=pa[i-1].x; p1.y=pa[i-1].y; p2.x=pa[i].x; p2.y=pa[i].y; /* 0 = invisible, 1 = completely visible, 3 = start point clipped, 5 = end point clipped, 7 both points clipped */ code=geom_clip_line_code(&p1, &p2, r); #if 1 if (((code == 1 || code == 5) && ib_new->clen == 0) || (code & 2)) { item_bin_add_coord(ib_new, &p1, 1); } if (code) { item_bin_add_coord(ib_new, &p2, 1); } if (i == count-1 || (code & 4)) { if (param->attr_to_copy) item_bin_copy_attr(ib_new, ib, param->attr_to_copy); if (ib_new->clen) item_bin_write_clipped(ib_new, param, out); item_bin_init(ib_new, ib->type); } #else if (code) { item_bin_init(ib_new, ib->type); item_bin_add_coord(ib_new, &p1, 1); item_bin_add_coord(ib_new, &p2, 1); if (param->attr_to_copy) item_bin_copy_attr(ib_new, ib, param->attr_to_copy); item_bin_write_clipped(ib_new, param, out); } #endif } } } void clip_polygon(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out) { int count_in=ib->clen/2; struct coord *pin,*p,*s,pi; char *buffer1=g_alloca(sizeof(char)*(ib->len*4+ib->clen*7+32)); struct item_bin *ib1=(struct item_bin *)buffer1; char *buffer2=g_alloca(sizeof(char)*(ib->len*4+ib->clen*7+32)); struct item_bin *ib2=(struct item_bin *)buffer2; struct item_bin *ib_in,*ib_out; int edge,i; ib_out=ib1; ib_in=ib; for (edge = 0 ; edge < 4 ; edge++) { count_in=ib_in->clen/2; pin=(struct coord *)(ib_in+1); p=pin; s=pin+count_in-1; item_bin_init(ib_out, ib_in->type); for (i = 0 ; i < count_in ; i++) { if (geom_is_inside(p, r, edge)) { if (! geom_is_inside(s, r, edge)) { geom_poly_intersection(s,p,r,edge,&pi); item_bin_add_coord(ib_out, &pi, 1); } item_bin_add_coord(ib_out, p, 1); } else { if (geom_is_inside(s, r, edge)) { geom_poly_intersection(p,s,r,edge,&pi); item_bin_add_coord(ib_out, &pi, 1); } } s=p; p++; } if (ib_in == ib1) { ib_in=ib2; ib_out=ib1; } else { ib_in=ib1; ib_out=ib2; } } if (ib_in->clen) { if (param->attr_to_copy) item_bin_copy_attr(ib_in, ib, param->attr_to_copy); item_bin_write_clipped(ib_in, param, out); } } navit-0.5.0~svn5643+dfsg.1/navit/maptool/itembin_buffer.c000066400000000000000000000033531221777731700231240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #include "debug.h" static char buffer[2000000]; struct item_bin *item_bin=(struct item_bin *)(void *)buffer; static struct node_item *node_item=(struct node_item *)(void *)buffer; struct node_item * read_node_item(FILE *in) { if (fread(node_item, sizeof(struct node_item), 1, in) != 1) return NULL; return node_item; } struct item_bin * read_item(FILE *in) { struct item_bin *ib=(struct item_bin *) buffer; for (;;) { switch (item_bin_read(ib, in)) { case 0: return NULL; case 2: dbg_assert((ib->len+1)*4 < sizeof(buffer)); bytes_read+=(ib->len+1)*sizeof(int); return ib; default: continue; } } } struct item_bin * read_item_range(FILE *in, int *min, int *max) { struct range r; if (fread(&r, sizeof(r), 1, in) != 1) return NULL; *min=r.min; *max=r.max; return read_item(in); } struct item_bin * init_item(enum item_type type) { struct item_bin *ib=(struct item_bin *) buffer; item_bin_init(ib, type); return ib; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/maptool.c000066400000000000000000000646601221777731700216270ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #ifdef _MSC_VER #include "getopt_long.h" #define atoll _atoi64 #else #include #include #include #endif #include #include #include #include "file.h" #include "item.h" #include "map.h" #include "main.h" #include "config.h" #include "zipfile.h" #include "linguistics.h" #include "plugin.h" #include "util.h" #include "maptool.h" long long slice_size=1024*1024*1024; int attr_debug_level=1; int ignore_unkown = 0; GHashTable *dedupe_ways_hash; int phase; int slices; int unknown_country; int doway2poi=1; char ch_suffix[] ="r"; /* Used to make compiler happy due to Bug 35903 in gcc */ int experimental; struct buffer node_buffer = { 64*1024*1024, }; int processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles; int overlap=1; int bytes_read; static long start_brk; static struct timeval start_tv; static void progress_time(void) { struct timeval tv; int seconds; gettimeofday(&tv, NULL); seconds=tv.tv_sec-start_tv.tv_sec; fprintf(stderr," %d:%02d",seconds/60,seconds%60); } static void progress_memory(void) { #ifdef HAVE_SBRK long mem=(long)sbrk(0)-start_brk; fprintf(stderr," %ld MB",mem/1024/1024); #endif #if 0 system("grep -i VmRSS /proc/$PPID/status"); #endif } void sig_alrm(int sig) { #ifndef _WIN32 signal(SIGALRM, sig_alrm); alarm(30); #endif fprintf(stderr,"PROGRESS%d: Processed %d nodes (%d out) %d ways %d relations %d tiles", phase, processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles); progress_time(); progress_memory(); fprintf(stderr,"\n"); } void sig_alrm_end(void) { #ifndef _WIN32 alarm(0); #endif } static struct plugins *plugins; static void add_plugin(char *path) { struct attr pa_attr={attr_path}; struct attr pl_attr={attr_plugins}; struct attr *attrs[2]={&pa_attr,NULL}; if (! plugins) { file_init(); plugins=plugins_new(); } pa_attr.u.str=path; pl_attr.u.plugins=plugins; plugin_new(&pl_attr,attrs); } static void maptool_init(FILE* rule_file) { if (plugins) plugins_init(plugins); osm_init(rule_file); } static void usage(FILE *f) { /* DEVELOPPERS : don't forget to update the manpage if you modify theses options */ fprintf(f,"\n"); fprintf(f,"maptool - parse osm textfile and convert to Navit binfile format\n\n"); fprintf(f,"Usage (for OSM XML data):\n"); fprintf(f,"bzcat planet.osm.bz2 | maptool mymap.bin\n"); fprintf(f,"Usage (for OSM Protobuf/PBF data):\n"); fprintf(f,"maptool --protobuf -i planet.osm.pbf planet.bin\n"); fprintf(f,"Available switches:\n"); fprintf(f,"-h (--help) : this screen\n"); fprintf(f,"-5 (--md5) : set file where to write md5 sum\n"); fprintf(f,"-6 (--64bit) : set zip 64 bit compression\n"); fprintf(f,"-a (--attr-debug-level) : control which data is included in the debug attribute\n"); fprintf(f,"-c (--dump-coordinates) : dump coordinates after phase 1\n"); #ifdef HAVE_POSTGRESQL fprintf(f,"-d (--db) : get osm data out of a postgresql database with osm simple scheme and given connect string\n"); #endif fprintf(f,"-e (--end) : end at specified phase\n"); fprintf(f,"-E (--experimental) : Enable experimental features\n"); fprintf(f,"-i (--input-file) : specify the input file name (OSM), overrules default stdin\n"); fprintf(f,"-k (--keep-tmpfiles) : do not delete tmp files after processing. useful to reuse them\n\n"); fprintf(f,"-M (--o5m) : input file os o5m\n"); fprintf(f,"-N (--nodes-only) : process only nodes\n"); fprintf(f,"-o (--coverage) : map every street to item coverage\n"); fprintf(f,"-P (--protobuf) : input file is protobuf\n"); fprintf(f,"-r (--rule-file) : read mapping rules from specified file\n"); fprintf(f,"-s (--start) : start at specified phase\n"); fprintf(f,"-S (--slice-size) : defines the amount of memory to use, in bytes. Default is 1GB\n"); fprintf(f,"-t (--timestamp) y-m-dTh:m:s : Set zip timestamp\n"); fprintf(f,"-w (--dedupe-ways) : ensure no duplicate ways or nodes. useful when using several input files\n"); fprintf(f,"-W (--ways-only) : process only ways\n"); fprintf(f,"-U (--unknown-country) : add objects with unknown country to index\n"); fprintf(f,"-x (--index-size) : set maximum country index size in bytes\n"); fprintf(f,"-z (--compression-level) : set the compression level\n"); fprintf(f,"Internal options (undocumented):\n"); fprintf(f,"-b (--binfile)\n"); fprintf(f,"-B \n"); fprintf(f,"-m (--map) \n"); fprintf(f,"-O \n"); fprintf(f,"-p (--plugin) \n"); exit(1); } struct maptool_params { int zip64; int keep_tmpfiles; int process_nodes; int process_ways; int process_relations; char *protobufdb; char *protobufdb_operation; char *md5file; int start; int end; int output; int o5m; int compression_level; int protobuf; int dump_coordinates; int input; GList *map_handles; FILE* input_file; FILE* rule_file; char *url; struct maptool_osm osm; FILE *ways_split; char *timestamp; char *result; char *dbstr; int node_table_loaded; int countries_loaded; int tilesdir_loaded; int max_index_size; }; static int parse_option(struct maptool_params *p, char **argv, int argc, int *option_index) { char *optarg_cp,*attr_name,*attr_value; struct map *handle; struct attr *attrs[10]; int pos,c,i; static struct option long_options[] = { {"md5", 1, 0, '5'}, {"64bit", 0, 0, '6'}, {"attr-debug-level", 1, 0, 'a'}, {"binfile", 0, 0, 'b'}, {"compression-level", 1, 0, 'z'}, #ifdef HAVE_POSTGRESQL {"db", 1, 0, 'd'}, #endif {"dedupe-ways", 0, 0, 'w'}, {"dump", 0, 0, 'D'}, {"dump-coordinates", 0, 0, 'c'}, {"end", 1, 0, 'e'}, {"experimental", 0, 0, 'E'}, {"help", 0, 0, 'h'}, {"keep-tmpfiles", 0, 0, 'k'}, {"nodes-only", 0, 0, 'N'}, {"map", 1, 0, 'm'}, {"o5m", 0, 0, 'M'}, {"plugin", 1, 0, 'p'}, {"protobuf", 0, 0, 'P'}, {"start", 1, 0, 's'}, {"timestamp", 1, 0, 't'}, {"input-file", 1, 0, 'i'}, {"rule-file", 1, 0, 'r'}, {"ignore-unknown", 0, 0, 'n'}, {"url", 1, 0, 'u'}, {"ways-only", 0, 0, 'W'}, {"slice-size", 1, 0, 'S'}, {"unknown-country", 0, 0, 'U'}, {"index-size", 0, 0, 'x'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "5:6B:DEMNO:PS:Wa:bc" #ifdef HAVE_POSTGRESQL "d:" #endif "e:hi:knm:p:r:s:t:wu:z:Ux:", long_options, option_index); if (c == -1) return 1; switch (c) { case '5': p->md5file=optarg; break; case '6': p->zip64=1; break; case 'B': p->protobufdb=optarg; break; case 'D': p->output=1; break; case 'E': experimental=1; break; case 'M': p->o5m=1; break; case 'N': p->process_ways=0; break; case 'R': p->process_relations=0; break; case 'O': p->protobufdb_operation=optarg; p->output=1; break; case 'P': p->protobuf=1; break; case 'S': slice_size=atoll(optarg); break; case 'W': p->process_nodes=0; break; case 'U': unknown_country=1; break; case 'a': attr_debug_level=atoi(optarg); break; case 'b': p->input=1; break; case 'c': p->dump_coordinates=1; break; #ifdef HAVE_POSTGRESQL case 'd': p->dbstr=optarg; break; #endif case 'e': p->end=atoi(optarg); break; case 'h': return 2; case 'm': optarg_cp=g_strdup(optarg); pos=0; i=0; attr_name=g_strdup(optarg); attr_value=g_strdup(optarg); while (i < 9 && attr_from_line(optarg_cp, NULL, &pos, attr_value, attr_name)) { attrs[i]=attr_new_from_text(attr_name,attr_value); if (attrs[i]) { i++; } else { fprintf(stderr,"Failed to convert %s=%s to attribute\n",attr_name,attr_value); } attr_value=g_strdup(optarg); } attrs[i++]=NULL; g_free(attr_value); g_free(optarg_cp); handle=map_new(NULL, attrs); if (! handle) { fprintf(stderr,"Failed to create map from attributes\n"); exit(1); } p->map_handles=g_list_append(p->map_handles,handle); break; case 'n': fprintf(stderr,"I will IGNORE unknown types\n"); ignore_unkown=1; break; case 'k': fprintf(stderr,"I will KEEP tmp files\n"); p->keep_tmpfiles=1; break; case 'p': add_plugin(optarg); break; case 's': p->start=atoi(optarg); break; case 't': p->timestamp=optarg; break; case 'w': dedupe_ways_hash=g_hash_table_new(NULL, NULL); break; case 'i': p->input_file = fopen( optarg, "r" ); if (p->input_file == NULL ) { fprintf( stderr, "\nInput file (%s) not found\n", optarg ); exit( -1 ); } break; case 'r': p->rule_file = fopen( optarg, "r" ); if (p->rule_file == NULL ) { fprintf( stderr, "\nRule file (%s) not found\n", optarg ); exit( -1 ); } break; case 'u': p->url=optarg; break; case 'x': p->max_index_size=atoi(optarg); break; #ifdef HAVE_ZLIB case 'z': p->compression_level=atoi(optarg); break; #endif case '?': default: return 0; } return 3; } static int start_phase(struct maptool_params *p, char *str) { phase++; if (p->start <= phase && p->end >= phase) { fprintf(stderr,"PROGRESS: Phase %d: %s",phase,str); progress_time(); progress_memory(); fprintf(stderr,"\n"); return 1; } else return 0; } static void osm_collect_data(struct maptool_params *p, char *suffix) { unlink("coords.tmp"); if (p->process_ways) p->osm.ways=tempfile(suffix,"ways",1); if (p->process_nodes) { p->osm.nodes=tempfile(suffix,"nodes",1); p->osm.towns=tempfile(suffix,"towns",1); } if (p->process_ways && p->process_nodes) { p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",1); if(doway2poi) { p->osm.line2poi=tempfile(suffix,"line2poi",1); p->osm.poly2poi=tempfile(suffix,"poly2poi",1); } } if (p->process_relations) { p->osm.boundaries=tempfile(suffix,"boundaries",1); if(experimental) p->osm.associated_streets=tempfile(suffix,"associated_streets",1); } #ifdef HAVE_POSTGRESQL if (p->dbstr) map_collect_data_osm_db(p->dbstr,&p->osm); else #endif if (p->map_handles) { GList *l; phase1_map(p->map_handles,p->osm.ways,p->osm.nodes); l=p->map_handles; while (l) { map_destroy(l->data); l=g_list_next(l); } } else if (p->protobuf) { #ifdef _MSC_VER fprintf(stderr,"Option -P not yet supported on MSVC\n"); exit(1); #else map_collect_data_osm_protobuf(p->input_file,&p->osm); #endif } else if (p->o5m) map_collect_data_osm_o5m(p->input_file,&p->osm); else map_collect_data_osm(p->input_file,&p->osm); if (node_buffer.size==0 && !p->map_handles){ fprintf(stderr,"No nodes found - looks like an invalid input file.\n"); exit(1); } flush_nodes(1); if (p->osm.ways) fclose(p->osm.ways); if (p->osm.nodes) fclose(p->osm.nodes); if (p->osm.turn_restrictions) fclose(p->osm.turn_restrictions); if (p->osm.associated_streets) fclose(p->osm.associated_streets); if (p->osm.boundaries) fclose(p->osm.boundaries); if (p->osm.poly2poi) fclose(p->osm.poly2poi); if (p->osm.line2poi) fclose(p->osm.line2poi); if (p->osm.towns) fclose(p->osm.towns); } int debug_ref=0; static void osm_count_references(struct maptool_params *p, char *suffix, int clear) { int i,first=1; fprintf(stderr,"%d slices\n",slices); for (i = slices-1 ; i>=0 ; i--) { fprintf(stderr, "slice %d of %d\n",slices-i-1,slices-1); if (!first) { FILE *ways=tempfile(suffix,"ways",0); load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size); if (clear) clear_node_item_buffer(); ref_ways(ways); save_buffer("coords.tmp",&node_buffer, i*slice_size); fclose(ways); } if(doway2poi) { FILE *poly2poi=tempfile(suffix,first?"poly2poi":"poly2poi_resolved",0); FILE *poly2poinew=tempfile(suffix,"poly2poi_resolved_new",1); FILE *line2poi=tempfile(suffix,first?"line2poi":"line2poi_resolved",0); FILE *line2poinew=tempfile(suffix,"line2poi_resolved_new",1); resolve_ways(poly2poi, poly2poinew); resolve_ways(line2poi, line2poinew); fclose(poly2poi); fclose(poly2poinew); fclose(line2poi); fclose(line2poinew); tempfile_rename(suffix,"poly2poi_resolved_new","poly2poi_resolved"); tempfile_rename(suffix,"line2poi_resolved_new","line2poi_resolved"); if (first && !p->keep_tmpfiles) { tempfile_unlink(suffix,"poly2poi"); tempfile_unlink(suffix,"line2poi"); } } first=0; } } static void osm_find_intersections(struct maptool_params *p, char *suffix) { FILE *ways, *ways_split, *ways_split_index, *graph, *coastline; int i; ways=tempfile(suffix,"ways",0); for (i = 0 ; i < slices ; i++) { int final=(i >= slices-1); ways_split=tempfile(suffix,"ways_split",1); ways_split_index=final ? tempfile(suffix,"ways_split_index",1) : NULL; graph=tempfile(suffix,"graph",1); coastline=tempfile(suffix,"coastline",1); if (i) load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size); map_find_intersections(ways,ways_split,ways_split_index,graph,coastline,final); fclose(ways_split); if (ways_split_index) fclose(ways_split_index); fclose(ways); fclose(graph); fclose(coastline); if (! final) { tempfile_rename(suffix,"ways_split","ways_to_resolve"); ways=tempfile(suffix,"ways_to_resolve",0); } } if(!p->keep_tmpfiles) tempfile_unlink(suffix,"ways"); tempfile_unlink(suffix,"ways_to_resolve"); } static void osm_process_way2poi(struct maptool_params *p, char *suffix) { FILE *poly2poi=tempfile(suffix,"poly2poi_resolved",0); FILE *line2poi=tempfile(suffix,"line2poi_resolved",0); FILE *way2poi_result=tempfile(suffix,"way2poi_result",1); if (poly2poi) { process_way2poi(poly2poi, way2poi_result, type_area); fclose(poly2poi); } if (line2poi) { process_way2poi(line2poi, way2poi_result, type_line); fclose(line2poi); } fclose(way2poi_result); } static void osm_process_coastlines(struct maptool_params *p, char *suffix) { FILE *coastline=tempfile(suffix,"coastline",0); if (coastline) { FILE *coastline_result=tempfile(suffix,"coastline_result",1); process_coastlines(coastline, coastline_result); fclose(coastline_result); fclose(coastline); } } static void osm_process_turn_restrictions(struct maptool_params *p, char *suffix) { FILE *ways_split, *ways_split_index, *relations, *coords; p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",0); if (!p->osm.turn_restrictions) return; relations=tempfile(suffix,"relations",1); coords=fopen("coords.tmp","rb"); ways_split=tempfile(suffix,"ways_split",0); ways_split_index=tempfile(suffix,"ways_split_index",0); process_turn_restrictions(p->osm.turn_restrictions,coords,ways_split,ways_split_index,relations); fclose(ways_split_index); fclose(ways_split); fclose(coords); fclose(relations); fclose(p->osm.turn_restrictions); if(!p->keep_tmpfiles) tempfile_unlink(suffix,"turn_restrictions"); } static void maptool_dump(struct maptool_params *p, char *suffix) { char *files[10]; int i,files_count=0; if (p->process_nodes) files[files_count++]="nodes"; if (p->process_ways) files[files_count++]="ways_split"; if (p->process_relations) files[files_count++]="relations"; for (i = 0 ; i < files_count ; i++) { FILE *f=tempfile(suffix,files[i],0); if (f) { dump(f); fclose(f); } } } static void maptool_generate_tiles(struct maptool_params *p, char *suffix, char **filenames, int filename_count, int first, char *suffix0) { struct zip_info *zip_info; FILE *tilesdir; FILE *files[10]; int zipnum, f; if (first) { zip_info=zip_new(); zip_set_zip64(zip_info, p->zip64); zip_set_timestamp(zip_info, p->timestamp); } zipnum=zip_get_zipnum(zip_info); tilesdir=tempfile(suffix,"tilesdir",1); if (!strcmp(suffix,ch_suffix)) { /* Makes compiler happy due to bug 35903 in gcc */ ch_generate_tiles(suffix0,suffix,tilesdir,zip_info); } else { for (f = 0 ; f < filename_count ; f++) files[f]=tempfile(suffix,filenames[f],0); phase4(files,filename_count,0,suffix,tilesdir,zip_info); for (f = 0 ; f < filename_count ; f++) { if (files[f]) fclose(files[f]); } } fclose(tilesdir); zip_set_zipnum(zip_info,zipnum); } static void maptool_assemble_map(struct maptool_params *p, char *suffix, char **filenames, char **referencenames, int filename_count, int first, int last, char *suffix0) { FILE *files[10]; FILE *references[10]; struct zip_info *zip_info; int zipnum,f; if (first) { char *zipdir=tempfile_name("zipdir",""); char *zipindex=tempfile_name("index",""); zip_info=zip_new(); zip_set_zip64(zip_info, p->zip64); zip_set_timestamp(zip_info, p->timestamp); zip_set_maxnamelen(zip_info, 14+strlen(suffix0)); zip_set_compression_level(zip_info, p->compression_level); if (p->md5file) zip_set_md5(zip_info, 1); zip_open(zip_info, p->result, zipdir, zipindex); if (p->url) { map_information_attrs[1].type=attr_url; map_information_attrs[1].u.str=p->url; } index_init(zip_info, 1); } if (!strcmp(suffix,ch_suffix)) { /* Makes compiler happy due to bug 35903 in gcc */ ch_assemble_map(suffix0,suffix,zip_info); } else { for (f = 0 ; f < filename_count ; f++) { files[f]=tempfile(suffix, filenames[f], 0); if (referencenames[f]) references[f]=tempfile(suffix,referencenames[f],1); else references[f]=NULL; } phase5(files,references,filename_count,0,suffix,zip_info); for (f = 0 ; f < filename_count ; f++) { if (files[f]) fclose(files[f]); if (references[f]) fclose(references[f]); } } if(!p->keep_tmpfiles) { tempfile_unlink(suffix,"relations"); tempfile_unlink(suffix,"nodes"); tempfile_unlink(suffix,"ways_split"); tempfile_unlink(suffix,"poly2poi_resolved"); tempfile_unlink(suffix,"line2poi_resolved"); tempfile_unlink(suffix,"ways_split_ref"); tempfile_unlink(suffix,"coastline"); tempfile_unlink(suffix,"turn_restrictions"); tempfile_unlink(suffix,"graph"); tempfile_unlink(suffix,"tilesdir"); tempfile_unlink(suffix,"boundaries"); tempfile_unlink(suffix,"way2poi_result"); tempfile_unlink(suffix,"coastline_result"); tempfile_unlink(suffix,"towns_poly"); unlink("coords.tmp"); } if (last) { unsigned char md5_data[16]; zipnum=zip_get_zipnum(zip_info); add_aux_tiles("auxtiles.txt", zip_info); write_countrydir(zip_info,p->max_index_size); zip_set_zipnum(zip_info, zipnum); write_aux_tiles(zip_info); zip_write_index(zip_info); zip_write_directory(zip_info); zip_close(zip_info); if (p->md5file && zip_get_md5(zip_info, md5_data)) { FILE *md5=fopen(p->md5file,"w"); int i; for (i = 0 ; i < 16 ; i++) fprintf(md5,"%02x",md5_data[i]); fprintf(md5,"\n"); fclose(md5); } if (!p->keep_tmpfiles) { remove_countryfiles(); tempfile_unlink("index",""); tempfile_unlink("zipdir",""); } } } static void maptool_load_node_table(struct maptool_params *p, int last) { if (!p->node_table_loaded) { slices=(sizeof_buffer("coords.tmp")+slice_size-1)/slice_size; load_buffer("coords.tmp",&node_buffer,last?(slices-1)*slice_size:0, slice_size); p->node_table_loaded=1; } } static void maptool_load_countries(struct maptool_params *p) { if (!p->countries_loaded) { load_countries(); p->countries_loaded=1; } } static void maptool_load_tilesdir(struct maptool_params *p, char *suffix) { if (!p->tilesdir_loaded) { FILE *tilesdir=tempfile(suffix,"tilesdir",0); load_tilesdir(tilesdir); p->tilesdir_loaded=1; } } int main(int argc, char **argv) { #if 0 FILE *files[10]; FILE *references[10]; #endif struct maptool_params p; #if 0 char *suffixes[]={"m0l0", "m0l1","m0l2","m0l3","m0l4","m0l5","m0l6"}; char *suffixes[]={"m","r"}; #else char *suffixes[]={""}; #endif char *suffix=suffixes[0]; char *filenames[20]; char *referencenames[20]; int filename_count=0; int suffix_count=sizeof(suffixes)/sizeof(char *); int i; int suffix_start=0; int option_index=0; main_init(argv[0]); linguistics_init(); #ifndef HAVE_GLIB _g_slice_thread_init_nomessage(); #endif memset(&p, 0, sizeof(p)); #ifdef HAVE_ZLIB p.compression_level=9; #endif p.start=1; p.end=99; p.input_file=stdin; p.process_nodes=1; p.process_ways=1; p.process_relations=1; p.timestamp=current_to_iso8601(); p.max_index_size=65536; #ifdef HAVE_SBRK start_brk=(long)sbrk(0); #endif gettimeofday(&start_tv, NULL); while (1) { int parse_result=parse_option(&p, argv, argc, &option_index); if (!parse_result) { usage(stderr); exit(1); } if (parse_result == 1) break; if (parse_result == 2) { usage(stdout); exit(0); } } #if 0 if (experimental) { fprintf(stderr,"No experimental features available\n"); exit(0); } #endif if (optind != argc-(p.output == 1 ? 0:1)) usage(stderr); p.result=argv[optind]; // initialize plugins and OSM mappings maptool_init(p.rule_file); if (p.protobufdb_operation) { #ifdef _MSC_VER fprintf(stderr,"Option -O not yet supported on MSVC\n"); exit(1); #else osm_protobufdb_load(p.input_file, p.protobufdb); return 0; #endif } phase=0; // input from an OSM file if (p.input == 0) { if (start_phase(&p, "collecting data")) { osm_collect_data(&p, suffix); p.node_table_loaded=1; } if (start_phase(&p, "counting references and resolving ways")) { maptool_load_node_table(&p,1); osm_count_references(&p, suffix, p.start == phase); } if (start_phase(&p,"converting ways to pois")) { osm_process_way2poi(&p, suffix); } if (start_phase(&p,"finding intersections")) { if (p.process_ways) { maptool_load_node_table(&p,0); osm_find_intersections(&p, suffix); } } free(node_buffer.base); node_buffer.base=NULL; node_buffer.malloced=0; node_buffer.size=0; p.node_table_loaded=0; } else { if (start_phase(&p,"reading data")) { FILE *ways_split=tempfile(suffix,"ways_split",1); process_binfile(stdin, ways_split); fclose(ways_split); } } if (start_phase(&p,"generating coastlines")) { osm_process_coastlines(&p, suffix); } if (start_phase(&p,"assinging towns to countries")) { FILE *towns=tempfile(suffix,"towns",0),*boundaries=NULL,*ways=NULL; if (towns) { boundaries=tempfile(suffix,"boundaries",0); ways=tempfile(suffix,"ways_split",0); osm_process_towns(towns,boundaries,ways,suffix); fclose(ways); fclose(boundaries); fclose(towns); if(!p.keep_tmpfiles) tempfile_unlink(suffix,"towns"); } } if (start_phase(&p,"sorting countries")) { sort_countries(p.keep_tmpfiles); p.countries_loaded=1; } if (start_phase(&p,"generating turn restrictions")) { if (p.process_relations) { osm_process_turn_restrictions(&p, suffix); } if(!p.keep_tmpfiles) tempfile_unlink(suffix,"ways_split_index"); } if (experimental && p.process_relations && p.process_ways && p.process_nodes && start_phase(&p,"processing associated street relations")) { FILE *ways_in=tempfile(suffix,"ways_split",0); FILE *ways_out=tempfile(suffix,"ways_split_as",1); FILE *nodes_in=tempfile(suffix,"nodes",0); FILE *nodes_out=tempfile(suffix,"nodes_as",1); FILE *nodes2_in=NULL; FILE *nodes2_out=NULL; if(p.osm.line2poi) { nodes2_in=tempfile(suffix,"way2poi_result",0); nodes2_out=tempfile(suffix,"way2poi_result_as",1); } p.osm.associated_streets=tempfile(suffix,"associated_streets",0); process_associated_streets(p.osm.associated_streets, ways_in, ways_out, nodes_in, nodes_out, nodes2_in, nodes2_out); fclose(ways_in); fclose(nodes_in); fclose(ways_out); fclose(nodes_out); fclose(p.osm.associated_streets); tempfile_rename(suffix,"ways_split","ways_split_pre_as"); tempfile_rename(suffix,"nodes","nodes_pre_as"); tempfile_rename(suffix,"ways_split_as","ways_split"); tempfile_rename(suffix,"nodes_as","nodes"); if(p.osm.line2poi) { fclose(nodes2_in); fclose(nodes2_out); tempfile_rename(suffix,"way2poi_result","way2poi_result_pre_as"); tempfile_rename(suffix,"way2poi_result_as","way2poi_result"); } if(!p.keep_tmpfiles) { tempfile_unlink(suffix,"ways_split__pre_as"); tempfile_unlink(suffix,"nodes_pre_as"); tempfile_unlink(suffix,"way2poi_result_pre_as"); tempfile_unlink(suffix,"associated_streets"); } } if (p.output == 1 && start_phase(&p,"dumping")) { maptool_dump(&p, suffix); exit(0); } if (p.process_relations) { filenames[filename_count]="relations"; referencenames[filename_count++]=NULL; filenames[filename_count]="towns_poly"; referencenames[filename_count++]=NULL; } if (p.process_ways) { filenames[filename_count]="ways_split"; referencenames[filename_count++]=NULL; filenames[filename_count]="coastline_result"; referencenames[filename_count++]=NULL; } if (p.process_nodes) { filenames[filename_count]="nodes"; referencenames[filename_count++]=NULL; filenames[filename_count]="way2poi_result"; referencenames[filename_count++]=NULL; } for (i = suffix_start ; i < suffix_count ; i++) { suffix=suffixes[i]; if (start_phase(&p,"generating tiles")) { maptool_load_countries(&p); maptool_generate_tiles(&p, suffix, filenames, filename_count, i == suffix_start, suffixes[0]); p.tilesdir_loaded=1; } if (start_phase(&p,"assembling map")) { maptool_load_countries(&p); maptool_load_tilesdir(&p, suffix); maptool_assemble_map(&p, suffix, filenames, referencenames, filename_count, i == suffix_start, i == suffix_count-1, suffixes[0]); } phase-=2; } phase+=2; start_phase(&p,"done"); return 0; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/maptool.h000066400000000000000000000326001221777731700216210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "config.h" #include "coord.h" #include "item.h" #include "attr.h" #include "geom.h" #include "types.h" #ifdef HAVE_LIBCRYPTO #include #endif #define sq(x) ((double)(x)*(x)) #define BUFFER_SIZE 1280 #define debug_tile(x) 0 #define debug_itembin(x) 0 struct tile_data { char buffer[1024]; int tile_depth; struct rect item_bbox; struct rect tile_bbox; }; struct tile_parameter { int min; int max; int overlap; enum attr_type attr_to_copy; }; struct tile_info { int write; int maxlen; char *suffix; GList **tiles_list; FILE *tilesdir_out; }; extern struct tile_head { int num_subtiles; int total_size; char *name; char *zip_data; int total_size_used; int zipnum; int process; struct tile_head *next; // char subtiles[0]; } *tile_head_root; struct item_bin { int len; enum item_type type; int clen; }; struct attr_bin { int len; enum attr_type type; }; struct item_bin_sink_func { int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data); void *priv_data[8]; }; struct item_bin_sink { void *priv_data[8]; GList *sink_funcs; }; struct node_item { unsigned int id; char ref_node; char ref_way; char ref_ref; char dummy; struct coord c; }; struct zip_info; struct country_table; /** * Data type for the ID of an OSM element (node/way/relation). * Must be at least 64 bit wide because IDs will soon exceed 32 bit. */ typedef unsigned long long int osmid; #define OSMID_FMT LONGLONG_FMT /* boundaries.c */ struct boundary { struct item_bin *ib; struct country_table *country; char *iso2; GList *segments,*sorted_segments; GList *children; struct rect r; osmid admin_centre; }; char *osm_tag_value(struct item_bin *ib, char *key); osmid boundary_relid(struct boundary *b); GList *process_boundaries(FILE *boundaries, FILE *ways); GList *boundary_find_matches(GList *bl, struct coord *c); void free_boundaries(GList *l); /* buffer.c */ struct buffer { int malloced_step; long long malloced; unsigned char *base; long long size; }; void save_buffer(char *filename, struct buffer *b, long long offset); void load_buffer(char *filename, struct buffer *b, long long offset, long long size); long long sizeof_buffer(char *filename); /* ch.c */ void ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info); void ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info); /* coastline.c */ void process_coastlines(FILE *in, FILE *out); /* itembin.c */ int item_bin_read(struct item_bin *ib, FILE *in); void item_bin_set_type(struct item_bin *ib, enum item_type type); void item_bin_init(struct item_bin *ib, enum item_type type); void item_bin_add_coord(struct item_bin *ib, struct coord *c, int count); void item_bin_add_coord_reverse(struct item_bin *ib, struct coord *c, int count); void item_bin_bbox(struct item_bin *ib, struct rect *r); void item_bin_copy_coord(struct item_bin *ib, struct item_bin *from, int dir); void item_bin_copy_attr(struct item_bin *ib, struct item_bin *from, enum attr_type attr); void item_bin_add_coord_rect(struct item_bin *ib, struct rect *r); int attr_bin_write_data(struct attr_bin *ab, enum attr_type type, void *data, int size); int attr_bin_write_attr(struct attr_bin *ab, struct attr *attr); void item_bin_add_attr_data(struct item_bin *ib, enum attr_type type, void *data, int size); void item_bin_add_attr(struct item_bin *ib, struct attr *attr); void item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val); void *item_bin_get_attr(struct item_bin *ib, enum attr_type type, void *last); struct attr_bin * item_bin_get_attr_bin(struct item_bin *ib, enum attr_type type, void *last); struct attr_bin * item_bin_get_attr_bin_last(struct item_bin *ib); void item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val); void item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str); void item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max); void item_bin_remove_attr(struct item_bin *ib, void *ptr); void item_bin_write(struct item_bin *ib, FILE *out); struct item_bin *item_bin_dup(struct item_bin *ib); void item_bin_write_range(struct item_bin *ib, FILE *out, int min, int max); void item_bin_write_clipped(struct item_bin *ib, struct tile_parameter *param, struct item_bin_sink *out); void item_bin_dump(struct item_bin *ib, FILE *out); void dump_itembin(struct item_bin *ib); void item_bin_set_type_by_population(struct item_bin *ib, int population); void item_bin_write_match(struct item_bin *ib, enum attr_type type, enum attr_type match, int maxdepth, FILE *out); int item_bin_sort_file(char *in_file, char *out_file, struct rect *r, int *size); void clip_line(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out); void clip_polygon(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out); struct geom_poly_segment *item_bin_to_poly_segment(struct item_bin *ib, int type); /* itembin_buffer.c */ struct node_item *read_node_item(FILE *in); struct item_bin *read_item(FILE *in); struct item_bin *read_item_range(FILE *in, int *min, int *max); struct item_bin *init_item(enum item_type type); /* maptool.c */ extern long long slice_size; extern int attr_debug_level; extern char *suffix; extern int ignore_unkown; extern GHashTable *dedupe_ways_hash; extern int slices; extern struct buffer node_buffer; extern int processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles; extern struct item_bin *item_bin; extern int bytes_read; extern int overlap; extern int unknown_country; extern int experimental; void sig_alrm(int sig); void sig_alrm_end(void); /* misc.c */ extern struct rect world_bbox; void bbox_extend(struct coord *c, struct rect *r); void bbox(struct coord *c, int count, struct rect *r); int contains_bbox(int xl, int yl, int xh, int yh, struct rect *r); int bbox_contains_coord(struct rect *r, struct coord *c); int bbox_contains_bbox(struct rect *out, struct rect *in); long long bbox_area(struct rect const *r); void phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes); void dump(FILE *in); int phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info); int phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info); void process_binfile(FILE *in, FILE *out); void add_aux_tiles(char *name, struct zip_info *info); void cat(FILE *in, FILE *out); int item_order_by_type(enum item_type type); /* osm.c */ struct maptool_osm { FILE *boundaries; FILE *turn_restrictions; FILE *associated_streets; FILE *nodes; FILE *ways; FILE *line2poi; FILE *poly2poi; FILE *towns; }; void osm_warning(char *type, long long id, int cont, char *fmt, ...); void osm_info(char *type, long long id, int cont, char *fmt, ...); void osm_add_tag(char *k, char *v); void osm_add_node(osmid id, double lat, double lon); void osm_add_way(osmid id); void osm_add_relation(osmid id); void osm_end_relation(struct maptool_osm *osm); void osm_add_member(int type, osmid ref, char *role); void osm_end_way(struct maptool_osm *osm); void osm_end_node(struct maptool_osm *osm); void osm_add_nd(osmid ref); long long item_bin_get_id(struct item_bin *ib); void flush_nodes(int final); void sort_countries(int keep_tmpfiles); void process_associated_streets(FILE *in, FILE *ways_in, FILE *ways_out, FILE *nodes_in, FILE *nodes_out, FILE *nodes2_in, FILE *nodes2_out); void process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out); void process_turn_restrictions_old(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out); void clear_node_item_buffer(void); void ref_ways(FILE *in); void resolve_ways(FILE *in, FILE *out); long long item_bin_get_nodeid(struct item_bin *ib); long long item_bin_get_wayid(struct item_bin *ib); long long item_bin_get_relationid(struct item_bin *ib); FILE *resolve_ways_file(FILE *in, char *suffix, char *filename); void process_way2poi(FILE *in, FILE *out, int type); int map_find_intersections(FILE *in, FILE *out, FILE *out_index, FILE *out_graph, FILE *out_coastline, int final); void write_countrydir(struct zip_info *zip_info, int max_index_size); void osm_process_towns(FILE *in, FILE *boundaries, FILE *ways, char *suffix); void load_countries(void); void remove_countryfiles(void); struct country_table * country_from_iso2(char *iso); void osm_init(FILE*); /* osm_o5m.c */ int map_collect_data_osm_o5m(FILE *in, struct maptool_osm *osm); /* osm_psql.c */ int map_collect_data_osm_db(char *dbstr, struct maptool_osm *osm); /* osm_protobuf.c */ int map_collect_data_osm_protobuf(FILE *in, struct maptool_osm *osm); int osm_protobufdb_load(FILE *in, char *dir); /* osm_relations.c */ struct relations * relations_new(void); struct relations_func *relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv); void relations_add_func(struct relations *rel, struct relations_func *func, void *relation_priv, void *member_priv, int type, osmid id); void relations_process(struct relations *rel, FILE *nodes, FILE *ways, FILE *relations); void relations_destroy(struct relations *rel); /* osm_xml.c */ int osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size); void osm_xml_decode_entities(char *buffer); int map_collect_data_osm(FILE *in, struct maptool_osm *osm); /* sourcesink.c */ struct item_bin_sink *item_bin_sink_new(void); struct item_bin_sink_func *item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)); void item_bin_sink_func_destroy(struct item_bin_sink_func *func); void item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func); void item_bin_sink_destroy(struct item_bin_sink *sink); int item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data); struct item_bin_sink *file_reader_new(FILE *in, int limit, int offset); int file_reader_finish(struct item_bin_sink *sink); int file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data); struct item_bin_sink_func *file_writer_new(FILE *out); int file_writer_finish(struct item_bin_sink_func *file_writer); int tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data); struct item_bin_sink_func *tile_collector_new(struct item_bin_sink *out); /* tempfile.c */ char *tempfile_name(char *suffix, char *name); FILE *tempfile(char *suffix, char *name, int mode); void tempfile_unlink(char *suffix, char *name); void tempfile_rename(char *suffix, char *from, char *to); /* tile.c */ extern GHashTable *tile_hash,*tile_hash2; struct aux_tile { char *name; char *filename; int size; }; extern GList *aux_tile_list; int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr); void tile_bbox(char *tile, struct rect *r, int overlap); int tile_len(char *tile); void load_tilesdir(FILE *in); void tile_write_item_to_tile(struct tile_info *info, struct item_bin *ib, FILE *reference, char *name); void tile_write_item_minmax(struct tile_info *info, struct item_bin *ib, FILE *reference, int min, int max); int add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size); int write_aux_tiles(struct zip_info *zip_info); int create_tile_hash(void); void write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out); void merge_tiles(struct tile_info *info); struct attr map_information_attrs[32]; void index_init(struct zip_info *info, int version); void index_submap_add(struct tile_info *info, struct tile_head *th); /* zip.c */ void write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size); void zip_write_index(struct zip_info *info); int zip_write_directory(struct zip_info *info); struct zip_info *zip_new(void); void zip_set_md5(struct zip_info *info, int on); int zip_get_md5(struct zip_info *info, unsigned char *out); void zip_set_zip64(struct zip_info *info, int on); void zip_set_compression_level(struct zip_info *info, int level); void zip_set_maxnamelen(struct zip_info *info, int max); int zip_get_maxnamelen(struct zip_info *info); int zip_add_member(struct zip_info *info); int zip_set_timestamp(struct zip_info *info, char *timestamp); int zip_set_password(struct zip_info *info, char *password); void zip_open(struct zip_info *info, char *out, char *dir, char *index); FILE *zip_get_index(struct zip_info *info); int zip_get_zipnum(struct zip_info *info); void zip_set_zipnum(struct zip_info *info, int num); void zip_close(struct zip_info *info); void zip_destroy(struct zip_info *info); navit-0.5.0~svn5643+dfsg.1/navit/maptool/misc.c000066400000000000000000000227661221777731700211100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #ifndef _MSC_VER #include #include #endif #include #include #include #include "file.h" #include "item.h" #include "map.h" #include "main.h" #include "config.h" #include "zipfile.h" #include "linguistics.h" #include "plugin.h" #include "maptool.h" #define phase1_coord_max 16384 struct rect world_bbox = { { WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MIN_Y}, { WORLD_BOUNDINGBOX_MAX_X, WORLD_BOUNDINGBOX_MAX_Y}, }; void bbox_extend(struct coord *c, struct rect *r) { if (c->x < r->l.x) r->l.x=c->x; if (c->y < r->l.y) r->l.y=c->y; if (c->x > r->h.x) r->h.x=c->x; if (c->y > r->h.y) r->h.y=c->y; } void bbox(struct coord *c, int count, struct rect *r) { if (! count) return; r->l=*c; r->h=*c; while (--count) { c++; bbox_extend(c, r); } } int contains_bbox(int xl, int yl, int xh, int yh, struct rect *r) { if (r->h.x < xl || r->h.x > xh) { return 0; } if (r->l.x > xh || r->l.x < xl) { return 0; } if (r->h.y < yl || r->h.y > yh) { return 0; } if (r->l.y > yh || r->l.y < yl) { return 0; } return 1; } int bbox_contains_coord(struct rect *r, struct coord *c) { if (r->h.x < c->x) return 0; if (r->l.x > c->x) return 0; if (r->h.y < c->y) return 0; if (r->l.y > c->y) return 0; return 1; } int bbox_contains_bbox(struct rect *out, struct rect *in) { if (out->h.x < in->h.x) return 0; if (out->l.x > in->l.x) return 0; if (out->h.y < in->h.y) return 0; if (out->l.y > in->l.y) return 0; return 1; } long long bbox_area(struct rect const *r) { return ((long long)r->h.x-r->l.x)*(r->h.y-r->l.y); } void phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes) { struct map_rect *mr; struct item *item; int count; struct coord ca[phase1_coord_max]; struct attr attr; struct item_bin *item_bin; while (maps) { mr=map_rect_new(maps->data, NULL); while ((item = map_rect_get_item(mr))) { count=item_coord_get(item, ca, item->type < type_line ? 1: phase1_coord_max); item_bin=init_item(item->type); item_bin_add_coord(item_bin, ca, count); while (item_attr_get(item, attr_any, &attr)) { if (attr.type >= attr_type_string_begin && attr.type <= attr_type_string_end) { attr.u.str=map_convert_string(maps->data, attr.u.str); if (attr.u.str) { item_bin_add_attr(item_bin, &attr); map_convert_free(attr.u.str); } } else item_bin_add_attr(item_bin, &attr); } if (item->type >= type_line) item_bin_write(item_bin, out_ways); else item_bin_write(item_bin, out_nodes); } map_rect_destroy(mr); maps=g_list_next(maps); } } int item_order_by_type(enum item_type type) { int max=14; switch (type) { case type_town_label_1e7: case type_town_label_5e6: case type_town_label_2e6: case type_town_label_1e6: case type_town_label_5e5: case type_district_label_1e7: case type_district_label_5e6: case type_district_label_2e6: case type_district_label_1e6: case type_district_label_5e5: max=6; break; case type_town_label_2e5: case type_town_label_1e5: case type_district_label_2e5: case type_district_label_1e5: case type_street_n_lanes: case type_highway_city: case type_highway_land: case type_ramp: max=8; break; case type_town_label_5e4: case type_town_label_2e4: case type_town_label_1e4: case type_district_label_5e4: case type_district_label_2e4: case type_district_label_1e4: max=9; break; case type_street_4_land: case type_street_4_city: max=10; break; case type_town_label_5e3: case type_town_label_2e3: case type_town_label_1e3: case type_district_label_5e3: case type_district_label_2e3: case type_district_label_1e3: case type_street_3_city: case type_street_3_land: max=12; break; default: break; } return max; } static void phase34_process_file(struct tile_info *info, FILE *in, FILE *reference) { struct item_bin *ib; struct attr_bin *a; int max; while ((ib=read_item(in))) { if (ib->type < 0x80000000) processed_nodes++; else processed_ways++; max=item_order_by_type(ib->type); a=item_bin_get_attr_bin(ib, attr_order, NULL); if(a) { int max2=((struct range *)(a+1))->max; if(max>max2) max=max2; } tile_write_item_minmax(info, ib, reference, 0, max); } } static void phase34_process_file_range(struct tile_info *info, FILE *in, FILE *reference) { struct item_bin *ib; int min,max; while ((ib=read_item_range(in, &min, &max))) { if (ib->type < 0x80000000) processed_nodes++; else processed_ways++; tile_write_item_minmax(info, ib, reference, min, max); } } static int phase34(struct tile_info *info, struct zip_info *zip_info, FILE **in, FILE **reference, int in_count, int with_range) { int i; processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0; bytes_read=0; sig_alrm(0); if (! info->write) tile_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i = 0 ; i < in_count ; i++) { if (in[i]) { if (with_range) phase34_process_file_range(info, in[i], reference ? reference[i]:NULL); else phase34_process_file(info, in[i], reference ? reference[i]:NULL); } } if (! info->write) merge_tiles(info); sig_alrm(0); sig_alrm_end(); write_tilesdir(info, zip_info, info->tilesdir_out); return 0; } void dump(FILE *in) { struct item_bin *ib; while ((ib=read_item(in))) { dump_itembin(ib); } } int phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) { struct tile_info info; info.write=0; info.maxlen=0; info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=tilesdir_out; return phase34(&info, zip_info, in, NULL, in_count, with_range); } static int process_slice(FILE **in, FILE **reference, int in_count, int with_range, long long size, char *suffix, struct zip_info *zip_info) { struct tile_head *th; char *slice_data,*zip_data; int zipfiles=0; struct tile_info info; int i; slice_data=malloc(size); assert(slice_data != NULL); zip_data=slice_data; th=tile_head_root; while (th) { if (th->process) { th->zip_data=zip_data; zip_data+=th->total_size; } th=th->next; } for (i = 0 ; i < in_count ; i++) { if (in[i]) fseek(in[i], 0, SEEK_SET); if (reference && reference[i]) { fseek(reference[i], 0, SEEK_SET); } } info.write=1; info.maxlen=zip_get_maxnamelen(zip_info); info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=NULL; phase34(&info, zip_info, in, reference, in_count, with_range); th=tile_head_root; while (th) { if (th->process) { if (th->name[0]) { if (th->total_size != th->total_size_used) { fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used); exit(1); } write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size); zipfiles++; } else fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info)); } th=th->next; } free(slice_data); return zipfiles; } int phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info) { long long size; int slices; int zipnum,written_tiles; struct tile_head *th,*th2; create_tile_hash(); th=tile_head_root; size=0; slices=0; fprintf(stderr, "Maximum slice size "LONGLONG_FMT"\n", slice_size); while (th) { if (size + th->total_size > slice_size) { fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); size=0; slices++; } size+=th->total_size; th=th->next; } if (size) fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); th=tile_head_root; size=0; slices=0; while (th) { th2=tile_head_root; while (th2) { th2->process=0; th2=th2->next; } size=0; while (th && size+th->total_size < slice_size) { size+=th->total_size; th->process=1; th=th->next; } /* process_slice() modifies zip_info, but need to retain old info */ zipnum=zip_get_zipnum(zip_info); written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info); zip_set_zipnum(zip_info, zipnum+written_tiles); slices++; } return 0; } void process_binfile(FILE *in, FILE *out) { struct item_bin *ib; while ((ib=read_item(in))) { fwrite(ib, (ib->len+1)*4, 1, out); } } void add_aux_tiles(char *name, struct zip_info *info) { char buffer[4096]; char *s; FILE *in; FILE *tmp; in=fopen(name,"rb"); if (!in) return; while (fscanf(in,"%s",buffer) == 1) { s=strchr(buffer,'/'); if (s) s++; else s=buffer; tmp=fopen(buffer,"rb"); if (tmp) { fseek(tmp, 0, SEEK_END); add_aux_tile(info, s, buffer, ftell(tmp)); fclose(tmp); } } fclose(in); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm.c000066400000000000000000002617571221777731700207600ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef _MSC_VER #define strcasecmp _stricmp #define snprintf _snprintf #else #include #endif #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "country.h" #include "file.h" #include "profile.h" #include "types.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #define M_PI_4 0.785398163397448309616 #endif extern int doway2poi; static int in_way, in_node, in_relation; osmid nodeid,wayid; long long current_id; static GHashTable *attr_hash,*country_table_hash,*attr_hash; static char *attr_present; static int attr_present_count; static struct item_bin item; int maxspeed_attr_value; char debug_attr_buffer[BUFFER_SIZE]; int flags[4]; int flagsa[4]; int flags_attr_value; struct attr_bin osmid_attr; long int osmid_attr_value; char is_in_buffer[BUFFER_SIZE]; char attr_strings_buffer[BUFFER_SIZE*16]; int attr_strings_buffer_len; struct coord coord_buffer[65536]; struct attr_mapping { enum item_type type; int attr_present_idx_count; int attr_present_idx[0]; }; static void nodes_ref_item_bin(struct item_bin *ib); static struct attr_mapping **attr_mapping_node; static int attr_mapping_node_count; static struct attr_mapping **attr_mapping_way; static int attr_mapping_way_count; static struct attr_mapping **attr_mapping_way2poi; static int attr_mapping_way2poi_count; static struct attr_mapping **attr_mapping_rel2poly_place; static int attr_mapping_rel2poly_place_count; static int attr_longest_match(struct attr_mapping **mapping, int mapping_count, enum item_type *types, int types_count); static void attr_longest_match_clear(void); enum attr_strings { attr_string_phone, attr_string_fax, attr_string_email, attr_string_url, attr_string_district_name, attr_string_street_name, attr_string_street_name_systematic, attr_string_house_number, attr_string_label, attr_string_postal, attr_string_population, attr_string_county_name, attr_string_last, }; char *attr_strings[attr_string_last]; char *osm_types[]={"unknown","node","way","relation"}; #define IS_REF(c) ((c).x >= (1 << 30)) #define REF(c) ((c).y) #define SET_REF(c,ref) do { (c).x = 1 << 30; (c).y = ref ; } while(0) /* Table of country codes with possible is_in spellings. * Note: If you update this list, check also country array in country.c */ struct country_table { int countryid; char *names; char *admin_levels; FILE *file; int size; struct rect r; int nparts; } country_table[] = { { 4,"Afghanistan"}, { 8,"Albania"}, { 10,"Antarctica"}, { 12,"Algeria"}, { 16,"American Samoa"}, { 20,"Andorra"}, { 24,"Angola"}, { 28,"Antigua and Barbuda"}, { 31,"Azerbaijan"}, { 32,"Argentina,República Argentina,AR "}, { 36,"Australia,AUS"}, { 40,"Austria,Österreich,AUT"}, { 44,"Bahamas"}, { 48,"Bahrain"}, { 50,"Bangladesh"}, { 51,"Armenia"}, { 52,"Barbados"}, { 56,"Belgium,Belgique,Belgie,België,Belgien"}, { 60,"Bermuda"}, { 64,"Bhutan"}, { 68,"Bolivia, Plurinational State of"}, { 70,"Bosnia and Herzegovina,Bosna i Hercegovina,Босна и Херцеговина"}, { 72,"Botswana"}, { 74,"Bouvet Island"}, { 76,"Brazil"}, { 84,"Belize"}, { 86,"British Indian Ocean Territory"}, { 90,"Solomon Islands"}, { 92,"Virgin Islands, British"}, { 96,"Brunei Darussalam"}, { 100,"Bulgaria,България"}, { 104,"Myanmar"}, { 108,"Burundi"}, { 112,"Belarus"}, { 116,"Cambodia"}, { 120,"Cameroon"}, { 124,"Canada"}, { 132,"Cape Verde"}, { 136,"Cayman Islands"}, { 140,"Central African Republic"}, { 144,"Sri Lanka"}, { 148,"Chad"}, { 152,"Chile"}, { 156,"China"}, { 158,"Taiwan, Province of China"}, { 162,"Christmas Island"}, { 166,"Cocos (Keeling) Islands"}, { 170,"Colombia"}, { 174,"Comoros"}, { 175,"Mayotte"}, { 178,"Congo"}, { 180,"Congo, the Democratic Republic of the"}, { 184,"Cook Islands"}, { 188,"Costa Rica"}, { 191,"Croatia,Republika Hrvatska,HR"}, { 192,"Cuba"}, { 196,"Cyprus"}, { 203,"Czech Republic,Česká republika,CZ"}, { 204,"Benin"}, { 208,"Denmark,Danmark,DK"}, { 212,"Dominica"}, { 214,"Dominican Republic"}, { 218,"Ecuador"}, { 222,"El Salvador"}, { 226,"Equatorial Guinea"}, { 231,"Ethiopia"}, { 232,"Eritrea"}, { 233,"Estonia"}, { 234,"Faroe Islands,Føroyar"}, { 238,"Falkland Islands (Malvinas)"}, { 239,"South Georgia and the South Sandwich Islands"}, { 242,"Fiji"}, { 246,"Finland,Suomi"}, { 248,"Åland Islands"}, { 250,"France,République française,FR","3s5c7M"}, { 254,"French Guiana"}, { 258,"French Polynesia"}, { 260,"French Southern Territories"}, { 262,"Djibouti"}, { 266,"Gabon"}, { 268,"Georgia"}, { 270,"Gambia"}, { 275,"Palestinian Territory, Occupied"}, { 276,"Germany,Deutschland,Bundesrepublik Deutschland","345c7M"}, { 288,"Ghana"}, { 292,"Gibraltar"}, { 296,"Kiribati"}, { 300,"Greece"}, { 304,"Greenland"}, { 308,"Grenada"}, { 312,"Guadeloupe"}, { 316,"Guam"}, { 320,"Guatemala"}, { 324,"Guinea"}, { 328,"Guyana"}, { 332,"Haiti"}, { 334,"Heard Island and McDonald Islands"}, { 336,"Holy See (Vatican City State)"}, { 340,"Honduras"}, { 344,"Hong Kong"}, { 348,"Hungary,Magyarország"}, { 352,"Iceland"}, { 356,"India"}, { 360,"Indonesia"}, { 364,"Iran, Islamic Republic of"}, { 368,"Iraq"}, { 372,"Ireland"}, { 376,"Israel"}, { 380,"Italy,Italia"}, { 384,"Côte d'Ivoire"}, { 388,"Jamaica"}, { 392,"Japan"}, { 398,"Kazakhstan"}, { 400,"Jordan"}, { 404,"Kenya"}, { 408,"Korea, Democratic People's Republic of"}, { 410,"Korea, Republic of"}, { 414,"Kuwait"}, { 417,"Kyrgyzstan"}, { 418,"Lao People's Democratic Republic"}, { 422,"Lebanon"}, { 426,"Lesotho"}, { 428,"Latvia"}, { 430,"Liberia"}, { 434,"Libyan Arab Jamahiriya"}, { 438,"Liechtenstein"}, { 440,"Lithuania,Lietuva"}, { 442,"Luxembourg"}, { 446,"Macao"}, { 450,"Madagascar"}, { 454,"Malawi"}, { 458,"Malaysia"}, { 462,"Maldives"}, { 466,"Mali"}, { 470,"Malta"}, { 474,"Martinique"}, { 478,"Mauritania"}, { 480,"Mauritius"}, { 484,"Mexico"}, { 492,"Monaco"}, { 496,"Mongolia"}, { 498,"Moldova, Republic of"}, { 499,"Montenegro,Црна Гора,Crna Gora"}, { 500,"Montserrat"}, { 504,"Morocco"}, { 508,"Mozambique"}, { 512,"Oman"}, { 516,"Namibia"}, { 520,"Nauru"}, { 524,"Nepal"}, { 528,"Nederland,The Netherlands,Niederlande,NL,Netherlands"}, { 530,"Netherlands Antilles"}, { 531,"Curacao"}, { 533,"Aruba"}, { 534,"Sint Maarten (Dutch part)"}, { 535,"Bonaire, Sint Eustatius and Saba"}, { 540,"New Caledonia"}, { 548,"Vanuatu"}, { 554,"New Zealand"}, { 558,"Nicaragua"}, { 562,"Niger"}, { 566,"Nigeria"}, { 570,"Niue"}, { 574,"Norfolk Island"}, { 578,"Norway,Norge,Noreg,NO"}, { 580,"Northern Mariana Islands"}, { 581,"United States Minor Outlying Islands"}, { 583,"Micronesia, Federated States of"}, { 584,"Marshall Islands"}, { 585,"Palau"}, { 586,"Pakistan"}, { 591,"Panama"}, { 598,"Papua New Guinea"}, { 600,"Paraguay"}, { 604,"Peru"}, { 608,"Philippines"}, { 612,"Pitcairn"}, { 616,"Poland,Polska,PL"}, { 620,"Portugal"}, { 624,"Guinea-Bissau"}, { 626,"Timor-Leste"}, { 630,"Puerto Rico"}, { 634,"Qatar"}, { 638,"Réunion"}, { 642,"România,Romania,RO"}, { 643,"Россия,Российская Федерация,Russia,Russian Federation","3s5c7m"}, { 646,"Rwanda"}, { 652,"Saint Barthélemy"}, { 654,"Saint Helena, Ascension and Tristan da Cunha"}, { 659,"Saint Kitts and Nevis"}, { 660,"Anguilla"}, { 662,"Saint Lucia"}, { 663,"Saint Martin (French part)"}, { 666,"Saint Pierre and Miquelon"}, { 670,"Saint Vincent and the Grenadines"}, { 674,"San Marino"}, { 678,"Sao Tome and Principe"}, { 682,"Saudi Arabia"}, { 686,"Senegal"}, { 688,"Srbija,Србија,Serbia"}, { 690,"Seychelles"}, { 694,"Sierra Leone"}, { 702,"Singapore"}, { 703,"Slovakia,Slovensko,SK"}, { 704,"Viet Nam"}, { 705,"Slovenia,Republika Slovenija,SI"}, { 706,"Somalia"}, { 710,"South Africa"}, { 716,"Zimbabwe"}, { 724,"Spain,Espana,España,Reino de Espana,Reino de España","345scm"}, { 728,"South Sudan"}, { 732,"Western Sahara"}, { 736,"Sudan"}, { 740,"Suriname"}, { 744,"Svalbard and Jan Mayen"}, { 748,"Swaziland"}, { 752,"Sweden,Sverige,Konungariket Sverige,SE"}, { 756,"Switzerland,Schweiz"}, { 760,"Syrian Arab Republic"}, { 762,"Tajikistan"}, { 764,"Thailand"}, { 768,"Togo"}, { 772,"Tokelau"}, { 776,"Tonga"}, { 780,"Trinidad and Tobago"}, { 784,"United Arab Emirates"}, { 788,"Tunisia"}, { 792,"Turkey"}, { 795,"Turkmenistan"}, { 796,"Turks and Caicos Islands"}, { 798,"Tuvalu"}, { 800,"Uganda"}, { 804,"Ukraine","3s5c78"}, { 807,"Macedonia,Македонија"}, { 818,"Egypt"}, { 826,"United Kingdom,UK","3s5c7m"}, { 831,"Guernsey"}, { 832,"Jersey"}, { 833,"Isle of Man"}, { 834,"Tanzania, United Republic of"}, { 840,"USA","3s5c7m"}, { 850,"Virgin Islands, U.S."}, { 854,"Burkina Faso"}, { 858,"Uruguay"}, { 860,"Uzbekistan"}, { 862,"Venezuela, Bolivarian Republic of"}, { 876,"Wallis and Futuna"}, { 882,"Samoa"}, { 887,"Yemen"}, { 894,"Zambia"}, { 999,"Unknown"}, }; // first char - item type // =w - ways // =? - used both for nodes and ways // otherwise - nodes static char *attrmap={ "n *=* point_unkn\n" // "n Annehmlichkeit=Hochsitz poi_hunting_stand\n" "? addr:housenumber=* house_number\n" "? aeroway=aerodrome poi_airport\n" "? aeroway=airport poi_airport\n" "? aeroway=helipad poi_heliport\n" "? aeroway=terminal poi_airport\n" "? amenity=atm poi_atm\n" "? amenity=bank poi_bank\n" "? amenity=bar poi_bar\n" "n amenity=bench poi_bench\n" "? amenity=bicycle_rental poi_bicycle_rental\n" "? amenity=bicycle_parking poi_bicycle_parking\n" "? amenity=biergarten poi_biergarten\n" "? amenity=bus_station poi_bus_station\n" "? amenity=cafe poi_cafe\n" "? amenity=car_sharing poi_car_sharing\n" "? amenity=car_wash poi_car_wash\n" "? amenity=cinema poi_cinema\n" "? amenity=college poi_school_college\n" "? amenity=courthouse poi_justice\n" "? amenity=drinking_water poi_potable_water\n" "? amenity=fast_food poi_fastfood\n" "? amenity=fire_station poi_firebrigade\n" "? amenity=fountain poi_fountain\n" "? amenity=fuel poi_fuel\n" "? amenity=grave_yard poi_cemetery\n" "? amenity=hospital poi_hospital\n" "? amenity=hunting_stand poi_hunting_stand\n" "? amenity=kindergarten poi_kindergarten\n" "? amenity=library poi_library\n" "? amenity=nightclub poi_nightclub\n" "? amenity=park_bench poi_bench\n" "? amenity=parking poi_car_parking\n" "? amenity=pharmacy poi_pharmacy\n" "? amenity=place_of_worship,religion=christian poi_church\n" "? amenity=place_of_worship poi_worship\n" "? amenity=police poi_police\n" "? amenity=post_box poi_post_box\n" "? amenity=post_office poi_post_office\n" "? amenity=prison poi_prison\n" "? amenity=pub poi_pub\n" "? amenity=public_building poi_public_office\n" "? amenity=recycling poi_recycling\n" "? amenity=restaurant,cuisine=fine_dining poi_dining\n" "? amenity=restaurant poi_restaurant\n" "? amenity=school poi_school\n" "? amenity=shelter poi_shelter\n" "? amenity=taxi poi_taxi\n" "? amenity=tec_common tec_common\n" "? amenity=telephone poi_telephone\n" "? amenity=theatre poi_theater\n" "? amenity=toilets poi_restroom\n" "? amenity=townhall poi_townhall\n" "? amenity=university poi_school_university\n" "? amenity=vending_machine poi_vending_machine\n" "n barrier=bollard barrier_bollard\n" "n barrier=cycle_barrier barrier_cycle\n" "n barrier=lift_gate barrier_lift_gate\n" "? car=car_rental poi_car_rent\n" "? highway=bus_station poi_bus_station\n" "? highway=bus_stop poi_bus_stop\n" "n highway=mini_roundabout mini_roundabout\n" "n highway=motorway_junction highway_exit\n" "n highway=stop traffic_sign_stop\n" "n highway=toll_booth poi_toll_booth\n" "n highway=traffic_signals traffic_signals\n" "n highway=turning_circle turning_circle\n" "? historic=boundary_stone poi_boundary_stone\n" "? historic=castle poi_castle\n" "? historic=memorial poi_memorial\n" "? historic=monument poi_monument\n" "? historic=ruins poi_ruins\n" // "? historic=* poi_ruins\n" "? landuse=cemetery poi_cemetery\n" "? leisure=fishing poi_fish\n" "? leisure=golf_course poi_golf\n" "? leisure=marina poi_marine\n" "? leisure=playground poi_playground\n" "? leisure=slipway poi_boat_ramp\n" "? leisure=sports_centre poi_sport\n" "? leisure=stadium poi_stadium\n" "? man_made=tower poi_tower\n" "? military=airfield poi_military\n" "? military=barracks poi_military\n" "? military=bunker poi_military\n" "? military=danger_area poi_danger_area\n" "? military=range poi_military\n" "? natural=bay poi_bay\n" "? natural=peak,ele=* poi_peak\n" // show only major peaks with elevation "? natural=tree poi_tree\n" "n place=city town_label_2e5\n" "n place=hamlet town_label_2e2\n" "n place=locality town_label_2e0\n" "n place=suburb district_label\n" "n place=town town_label_2e4\n" "n place=village town_label_2e3\n" "n power=tower power_tower\n" "n power=sub_station power_substation\n" "n railway=halt poi_rail_halt\n" "n railway=level_crossing poi_level_crossing\n" "? railway=station poi_rail_station\n" "? railway=tram_stop poi_rail_tram_stop\n" "? shop=baker poi_shop_baker\n" "? shop=bakery poi_shop_baker\n" "? shop=beverages poi_shop_beverages\n" "? shop=bicycle poi_shop_bicycle\n" "? shop=butcher poi_shop_butcher\n" "? shop=car poi_car_dealer_parts\n" "? shop=car_repair poi_repair_service\n" "? shop=clothes poi_shop_apparel\n" "? shop=convenience poi_shop_grocery\n" "? shop=drogist poi_shop_drugstore\n" "? shop=florist poi_shop_florist\n" "? shop=fruit poi_shop_fruit\n" "? shop=furniture poi_shop_furniture\n" "? shop=garden_centre poi_shop_handg\n" "? shop=hardware poi_shop_handg\n" "? shop=hairdresser poi_hairdresser\n" "? shop=kiosk poi_shop_kiosk\n" "? shop=optician poi_shop_optician\n" "? shop=parfum poi_shop_parfum\n" "? shop=photo poi_shop_photo\n" "? shop=shoes poi_shop_shoes\n" "? shop=supermarket poi_shopping\n" "? sport=10pin poi_bowling\n" "? sport=baseball poi_baseball\n" "? sport=basketball poi_basketball\n" "? sport=climbing poi_climbing\n" "? sport=golf poi_golf\n" "? sport=motor_sports poi_motor_sport\n" "? sport=skiing poi_skiing\n" "? sport=soccer poi_soccer\n" "? sport=stadium poi_stadium\n" "? sport=swimming poi_swimming\n" "? sport=tennis poi_tennis\n" "? tourism=attraction poi_attraction\n" "? tourism=camp_site poi_camp_rv\n" "? tourism=caravan_site poi_camp_rv\n" "? tourism=guest_house poi_guesthouse\n" "? tourism=hostel poi_hostel\n" "? tourism=hotel poi_hotel\n" "? tourism=information poi_information\n" "? tourism=motel poi_motel\n" "? tourism=museum poi_museum_history\n" "? tourism=picnic_site poi_picnic\n" "? tourism=theme_park poi_resort\n" "? tourism=viewpoint poi_viewpoint\n" "? tourism=zoo poi_zoo\n" "n traffic_sign=city_limit traffic_sign_city_limit\n" "n highway=speed_camera tec_common\n" "w *=* street_unkn\n" "w addr:interpolation=even house_number_interpolation_even\n" "w addr:interpolation=odd house_number_interpolation_odd\n" "w addr:interpolation=all house_number_interpolation_all\n" "w addr:interpolation=alphabetic house_number_interpolation_alphabetic\n" "w aerialway=cable_car lift_cable_car\n" "w aerialway=chair_lift lift_chair\n" "w aerialway=drag_lift lift_drag\n" "w aeroway=aerodrome poly_airport\n" "w aeroway=apron poly_apron\n" "w aeroway=runway aeroway_runway\n" "w aeroway=taxiway aeroway_taxiway\n" "w aeroway=terminal poly_terminal\n" "w amenity=college poly_college\n" "w amenity=grave_yard poly_cemetery\n" "w amenity=parking poly_car_parking\n" "w amenity=place_of_worship poly_building\n" "w amenity=university poly_university\n" "w boundary=administrative,admin_level=2 border_country\n" "w boundary=civil border_civil\n" "w boundary=national_park border_national_park\n" "w boundary=political border_political\n" "w building=* poly_building\n" "w contour_ext=elevation_major height_line_1\n" "w contour_ext=elevation_medium height_line_2\n" "w contour_ext=elevation_minor height_line_3\n" "w highway=bridleway bridleway\n" "w highway=bus_guideway bus_guideway\n" "w highway=construction street_construction\n" "w highway=cyclepath cycleway\n" "w highway=cycleway cycleway\n" "w highway=footway footway\n" "w highway=footway,piste:type=nordic footway_and_piste_nordic\n" "w highway=living_street living_street\n" "w highway=minor street_1_land\n" "w highway=parking_lane street_parking_lane\n" "w highway=path path\n" "w highway=path,bicycle=designated cycleway\n" "w highway=path,bicycle=official cycleway\n" "w highway=path,bicycle=designated,foot=designated cycleway\n" "w highway=path,bicycle=official,foot=official cycleway\n" "w highway=path,foot=designated footway\n" "w highway=path,foot=official footway\n" "w highway=path,horse=designated bridleway\n" "w highway=path,horse=official bridleway\n" "w highway=path,sac_scale=alpine_hiking hiking_alpine\n" "w highway=path,sac_scale=demanding_alpine_hiking hiking_alpine_demanding\n" "w highway=path,sac_scale=demanding_mountain_hiking hiking_mountain_demanding\n" "w highway=path,sac_scale=difficult_alpine_hiking hiking_alpine_difficult\n" "w highway=path,sac_scale=hiking hiking\n" "w highway=path,sac_scale=mountain_hiking hiking_mountain\n" "w highway=pedestrian street_pedestrian\n" "w highway=pedestrian,area=1 poly_pedestrian\n" "w highway=plaza poly_plaza\n" "w highway=motorway highway_land\n" "w highway=motorway,rural=0 highway_city\n" "w highway=motorway_link ramp\n" "w highway=trunk street_n_lanes\n" "w highway=trunk_link ramp\n" "w highway=primary street_4_land\n" "w highway=primary,name=*,rural=1 street_4_land\n" "w highway=primary,name=* street_4_city\n" "w highway=primary,rural=0 street_4_city\n" "w highway=primary_link ramp\n" "w highway=secondary street_3_land\n" "w highway=secondary,name=*,rural=1 street_3_land\n" "w highway=secondary,name=* street_3_city\n" "w highway=secondary,rural=0 street_3_city\n" "w highway=secondary,area=1 poly_street_3\n" "w highway=secondary_link ramp\n" "w highway=tertiary street_2_land\n" "w highway=tertiary,name=*,rural=1 street_2_land\n" "w highway=tertiary,name=* street_2_city\n" "w highway=tertiary,rural=0 street_2_city\n" "w highway=tertiary,area=1 poly_street_2\n" "w highway=tertiary_link ramp\n" "w highway=residential street_1_city\n" "w highway=residential,area=1 poly_street_1\n" "w highway=unclassified street_1_city\n" "w highway=unclassified,area=1 poly_street_1\n" "w highway=road street_1_city\n" "w highway=service street_service\n" "w highway=service,area=1 poly_service\n" "w highway=service,service=parking_aisle street_parking_lane\n" "w highway=track track_gravelled\n" "w highway=track,surface=grass track_grass\n" "w highway=track,surface=gravel track_gravelled\n" "w highway=track,surface=ground track_ground\n" "w highway=track,surface=paved track_paved\n" "w highway=track,surface=unpaved track_unpaved\n" "w highway=track,tracktype=grade1 track_paved\n" "w highway=track,tracktype=grade2 track_gravelled\n" "w highway=track,tracktype=grade3 track_unpaved\n" "w highway=track,tracktype=grade4 track_ground\n" "w highway=track,tracktype=grade5 track_grass\n" "w highway=track,surface=paved,tracktype=grade1 track_paved\n" "w highway=track,surface=gravel,tracktype=grade2 track_gravelled\n" "w highway=track,surface=unpaved,tracktype=grade3 track_unpaved\n" "w highway=track,surface=ground,tracktype=grade4 track_ground\n" "w highway=track,surface=grass,tracktype=grade5 track_grass\n" "w highway=unsurfaced track_gravelled\n" "w highway=steps steps\n" "w historic=archaeological_site poly_archaeological_site\n" "w historic=battlefield poly_battlefield\n" "w historic=ruins poly_ruins\n" "w historic=town_gate poly_building\n" "w landuse=allotments poly_allotments\n" "w landuse=basin poly_basin\n" "w landuse=brownfield poly_brownfield\n" "w landuse=cemetery poly_cemetery\n" "w landuse=commercial poly_commercial\n" "w landuse=construction poly_construction\n" "w landuse=farm poly_farm\n" "w landuse=farmland poly_farm\n" "w landuse=farmyard poly_town\n" "w landuse=forest poly_wood\n" "w landuse=greenfield poly_greenfield\n" "w landuse=industrial poly_industry\n" "w landuse=landfill poly_landfill\n" "w landuse=military poly_military\n" "w landuse=meadow poly_meadow\n" "w landuse=plaza poly_plaza\n" "w landuse=quarry poly_quarry\n" "w landuse=railway poly_railway\n" "w landuse=recreation_ground poly_recreation_ground\n" "w landuse=reservoir poly_reservoir\n" "w landuse=residential poly_town\n" "w landuse=residential,area=1 poly_town\n" "w landuse=retail poly_retail\n" "w landuse=village_green poly_village_green\n" "w landuse=vineyard poly_farm\n" "w leisure=common poly_common\n" "w leisure=fishing poly_fishing\n" "w leisure=garden poly_garden\n" "w leisure=golf_course poly_golf_course\n" "w leisure=marina poly_marina\n" "w leisure=nature_reserve poly_nature_reserve\n" "w leisure=park poly_park\n" "w leisure=pitch poly_sports_pitch\n" "w leisure=playground poly_playground\n" "w leisure=sports_centre poly_sport\n" "w leisure=stadium poly_sports_stadium\n" "w leisure=track poly_sports_track\n" "w leisure=water_park poly_water_park\n" "w military=airfield poly_airfield\n" "w military=barracks poly_barracks\n" "w military=danger_area poly_danger_area\n" "w military=naval_base poly_naval_base\n" "w military=range poly_range\n" "w natural=beach poly_beach\n" "w natural=coastline water_line\n" "w natural=fell poly_fell\n" "w natural=glacier poly_glacier\n" "w natural=heath poly_heath\n" "w natural=land poly_land\n" "w natural=marsh poly_marsh\n" "w natural=meadow poly_meadow\n" "w natural=mud poly_mud\n" "w natural=scree poly_scree\n" "w natural=scrub poly_scrub\n" "w natural=water poly_water\n" "w natural=wood poly_wood\n" "w piste:type=downhill,piste:difficulty=advanced piste_downhill_advanced\n" "w piste:type=downhill,piste:difficulty=easy piste_downhill_easy\n" "w piste:type=downhill,piste:difficulty=expert piste_downhill_expert\n" "w piste:type=downhill,piste:difficulty=freeride piste_downhill_freeride\n" "w piste:type=downhill,piste:difficulty=intermediate piste_downhill_intermediate\n" "w piste:type=downhill,piste:difficulty=novice piste_downhill_novice\n" "w piste:type=nordic piste_nordic\n" "w place=suburb poly_place1\n" "w place=hamlet poly_place2\n" "w place=isolated_dwelling poly_place2\n" "w place=locality poly_place2\n" "w place=village poly_place3\n" "w place=municipality poly_place4\n" "w place=town poly_place5\n" "w place=city poly_place6\n" "w de:place=city poly_place6\n" "w power=line powerline\n" "w railway=abandoned rail_abandoned\n" "w railway=disused rail_disused\n" "w railway=light_rail rail_light\n" "w railway=monorail rail_mono\n" "w railway=narrow_gauge rail_narrow_gauge\n" "w railway=preserved rail_preserved\n" "w railway=rail rail\n" "w railway=subway rail_subway\n" "w railway=tram rail_tram\n" "w route=ferry ferry\n" "w route=ski piste_nordic\n" "w sport=* poly_sport\n" "w tourism=artwork poly_artwork\n" "w tourism=attraction poly_attraction\n" "w tourism=camp_site poly_camp_site\n" "w tourism=caravan_site poly_caravan_site\n" "w tourism=picnic_site poly_picnic_site\n" "w tourism=theme_park poly_theme_park\n" "w tourism=zoo poly_zoo\n" "w waterway=canal water_canal\n" "w waterway=drain water_drain\n" "w waterway=river water_river\n" "w waterway=riverbank poly_water\n" "w waterway=stream water_stream\n" "w barrier=ditch ditch\n" "w barrier=hedge hedge\n" "w barrier=fence fence\n" "w barrier=wall wall\n" "w barrier=retaining_wall retaining_wall\n" "w barrier=city_wall city_wall\n" }; static void build_attrmap_line(char *line) { char *t=NULL,*kvl=NULL,*i=NULL,*p,*kv; struct attr_mapping *attr_mapping=g_malloc0(sizeof(struct attr_mapping)); int idx,attr_mapping_count=0; t=line; p=strpbrk(t," \t"); if (p) { while (*p && isspace(*p)) *p++='\0'; kvl=p; p=strpbrk(kvl," \t");; } if (p) { while (*p && isspace(*p)) *p++='\0'; i=p; } if (t[0] == 'w') { if (! i) i="street_unkn"; } else { if (! i) i="point_unkn"; } attr_mapping->type=item_from_name(i); if (!attr_mapping->type) { printf("no id found for '%s'\n",i); } while ((kv=strtok(kvl, ","))) { kvl=NULL; if (!(idx=(int)(long)g_hash_table_lookup(attr_hash, kv))) { idx=attr_present_count++; g_hash_table_insert(attr_hash, kv, (gpointer)(long)idx); } attr_mapping=g_realloc(attr_mapping, sizeof(struct attr_mapping)+(attr_mapping_count+1)*sizeof(int)); attr_mapping->attr_present_idx[attr_mapping_count++]=idx; attr_mapping->attr_present_idx_count=attr_mapping_count; } if (t[0]== 'w') { attr_mapping_way=g_realloc(attr_mapping_way, sizeof(*attr_mapping_way)*(attr_mapping_way_count+1)); attr_mapping_way[attr_mapping_way_count++]=attr_mapping; if(item_is_poly_place(*attr_mapping)) { attr_mapping_rel2poly_place=g_realloc(attr_mapping_rel2poly_place, sizeof(*attr_mapping_rel2poly_place)*(attr_mapping_rel2poly_place_count+1)); attr_mapping_rel2poly_place[attr_mapping_rel2poly_place_count++]=attr_mapping; } } if (t[0]== '?' && doway2poi) { attr_mapping_way2poi=g_realloc(attr_mapping_way2poi, sizeof(*attr_mapping_way2poi)*(attr_mapping_way2poi_count+1)); attr_mapping_way2poi[attr_mapping_way2poi_count++]=attr_mapping; } if (t[0]!= 'w') { attr_mapping_node=g_realloc(attr_mapping_node, sizeof(*attr_mapping_node)*(attr_mapping_node_count+1)); attr_mapping_node[attr_mapping_node_count++]=attr_mapping; } } static void build_attrmap(FILE* rule_file) { attr_hash=g_hash_table_new(g_str_hash, g_str_equal); attr_present_count=1; // build attribute map from rule file if given if( rule_file ) { char buffer[200], *p; while (fgets( buffer, 200, rule_file )) { p=strchr(buffer,'\n'); if(p) *p = 0; build_attrmap_line( g_strdup( buffer ) ); } fclose( rule_file ); } // use hardcoded default attributes else { char *p,*map=g_strdup(attrmap); while (map) { p=strchr(map,'\n'); if (p) *p++='\0'; if (strlen(map)) build_attrmap_line(map); map=p; } } attr_present=g_malloc0(sizeof(*attr_present)*attr_present_count); } static void build_countrytable(void) { int i; char *names,*str,*tok; country_table_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { names=g_strdup(country_table[i].names); str=names; while ((tok=strtok(str, ","))) { str=NULL; g_hash_table_insert(country_table_hash, tok, (gpointer)&country_table[i]); } } } void osm_warning(char *type, long long id, int cont, char *fmt, ...) { char str[4096]; va_list ap; va_start(ap, fmt); vsnprintf(str, sizeof(str), fmt, ap); va_end(ap); fprintf(stderr,"%shttp://www.openstreetmap.org/browse/%s/"LONGLONG_FMT" %s",cont ? "":"OSM Warning:",type,id,str); } void osm_info(char *type, long long id, int cont, char *fmt, ...) { char str[4096]; va_list ap; va_start(ap, fmt); vsnprintf(str, sizeof(str), fmt, ap); va_end(ap); fprintf(stderr,"%shttp://www.openstreetmap.org/browse/%s/"LONGLONG_FMT" %s",cont ? "":"OSM Info:",type,id,str); } static void attr_strings_clear(void) { attr_strings_buffer_len=0; memset(attr_strings, 0, sizeof(attr_strings)); } static void attr_strings_save(enum attr_strings id, char *str) { attr_strings[id]=attr_strings_buffer+attr_strings_buffer_len; strcpy(attr_strings[id], str); attr_strings_buffer_len+=strlen(str)+1; } long long item_bin_get_nodeid(struct item_bin *ib) { long long *ret=item_bin_get_attr(ib, attr_osm_nodeid, NULL); if (ret) return *ret; return 0; } long long item_bin_get_wayid(struct item_bin *ib) { long long *ret=item_bin_get_attr(ib, attr_osm_wayid, NULL); if (ret) return *ret; return 0; } long long item_bin_get_relationid(struct item_bin *ib) { long long *ret=item_bin_get_attr(ib, attr_osm_relationid, NULL); if (ret) return *ret; return 0; } long long item_bin_get_id(struct item_bin *ib) { long long ret; if (ib->type < 0x80000000) return item_bin_get_nodeid(ib); ret=item_bin_get_wayid(ib); if (!ret) ret=item_bin_get_relationid(ib); return ret; } static int node_is_tagged; static void relation_add_tag(char *k, char *v); static int access_value(char *v) { if (!strcmp(v,"1")) return 1; if (!strcmp(v,"yes")) return 1; if (!strcmp(v,"designated")) return 1; if (!strcmp(v,"official")) return 1; if (!strcmp(v,"permissive")) return 1; if (!strcmp(v,"0")) return 2; if (!strcmp(v,"no")) return 2; if (!strcmp(v,"agricultural")) return 2; if (!strcmp(v,"forestry")) return 2; if (!strcmp(v,"private")) return 2; if (!strcmp(v,"delivery")) return 2; if (!strcmp(v,"destination")) return 2; return 3; } static void osm_update_attr_present(char *k, char *v); void osm_add_tag(char *k, char *v) { int level=2; if (in_relation) { relation_add_tag(k,v); return; } if (! strcmp(k,"ele")) level=9; if (! strcmp(k,"time")) level=9; if (! strcmp(k,"created_by")) level=9; if (! strncmp(k,"tiger:",6) || !strcmp(k,"AND_nodes")) level=9; if (! strcmp(k,"converted_by") || ! strcmp(k,"source")) level=8; if (! strncmp(k,"osmarender:",11) || !strncmp(k,"svg:",4)) level=8; if (! strcmp(k,"layer")) level=7; if (! strcasecmp(v,"true") || ! strcasecmp(v,"yes")) v="1"; if (! strcasecmp(v,"false") || ! strcasecmp(v,"no")) v="0"; if (! strcmp(k,"oneway")) { if (!strcmp(v,"1")) { flags[0] |= AF_ONEWAY | AF_ROUNDABOUT_VALID; } if (! strcmp(v,"-1")) { flags[0] |= AF_ONEWAYREV | AF_ROUNDABOUT_VALID; } if (!in_way) level=6; else level=5; } if (! strcmp(k,"junction")) { if (! strcmp(v,"roundabout")) flags[0] |= AF_ONEWAY | AF_ROUNDABOUT | AF_ROUNDABOUT_VALID; } if (! strcmp(k,"maxspeed")) { if (strstr(v, "mph")) { maxspeed_attr_value = (int)floor(atof(v) * 1.609344); } else { maxspeed_attr_value = atoi(v); } if (maxspeed_attr_value) flags[0] |= AF_SPEED_LIMIT; level=5; } if (! strcmp(k,"toll")) { if (!strcmp(v,"1")) { flags[0] |= AF_TOLL; } } if (! strcmp(k,"access")) { if (strcmp(v,"destination")) flagsa[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_HORSE|AF_BIKE|AF_PEDESTRIAN; else flags[0] |= AF_THROUGH_TRAFFIC_LIMIT; level=5; } if (! strcmp(k,"vehicle")) { flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_BIKE; level=5; } if (! strcmp(k,"motor_vehicle")) { flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED; level=5; } if (! strcmp(k,"bicycle")) { flags[access_value(v)] |= AF_BIKE; level=5; } if (! strcmp(k,"foot")) { flags[access_value(v)] |= AF_PEDESTRIAN; level=5; } if (! strcmp(k,"horse")) { flags[access_value(v)] |= AF_HORSE; level=5; } if (! strcmp(k,"moped")) { flags[access_value(v)] |= AF_MOPED; level=5; } if (! strcmp(k,"motorcycle")) { flags[access_value(v)] |= AF_MOTORCYCLE; level=5; } if (! strcmp(k,"motorcar")) { flags[access_value(v)] |= AF_CAR; level=5; } if (! strcmp(k,"hov")) { flags[access_value(v)] |= AF_HIGH_OCCUPANCY_CAR; level=5; } if (! strcmp(k,"bus")) { flags[access_value(v)] |= AF_PUBLIC_BUS; level=5; } if (! strcmp(k,"taxi")) { flags[access_value(v)] |= AF_TAXI; level=5; } if (! strcmp(k,"goods")) { flags[access_value(v)] |= AF_DELIVERY_TRUCK; level=5; } if (! strcmp(k,"hgv")) { flags[access_value(v)] |= AF_TRANSPORT_TRUCK; level=5; } if (! strcmp(k,"emergency")) { flags[access_value(v)] |= AF_EMERGENCY_VEHICLES; level=5; } if (! strcmp(k,"hazmat")) { flags[access_value(v)] |= AF_DANGEROUS_GOODS; level=5; } if (! strcmp(k,"tunnel") && !strcmp(v,"1")) { flags[0] |= AF_UNDERGROUND; } if (! strcmp(k,"note")) level=5; if (! strcmp(k,"name")) { attr_strings_save(attr_string_label, v); level=5; } if (! strcmp(k,"addr:email")) { attr_strings_save(attr_string_email, v); level=5; } if (! strcmp(k,"addr:suburb")) { attr_strings_save(attr_string_district_name, v); level=5; } if (! strcmp(k,"addr:housenumber")) { attr_strings_save(attr_string_house_number, v); level=5; } if (! strcmp(k,"addr:street")) { attr_strings_save(attr_string_street_name, v); level=5; } if (! strcmp(k,"phone")) { attr_strings_save(attr_string_phone, v); level=5; } if (! strcmp(k,"fax")) { attr_strings_save(attr_string_fax, v); level=5; } if (! strcmp(k,"postal_code")) { attr_strings_save(attr_string_postal, v); level=5; } if (! strcmp(k,"addr:postcode") && !attr_strings[attr_string_postal]) { attr_strings_save(attr_string_postal, v); level=5; } if (! strcmp(k,"openGeoDB:postal_codes") && !attr_strings[attr_string_postal]) { attr_strings_save(attr_string_postal, v); level=5; } if (! strcmp(k,"population")) { attr_strings_save(attr_string_population, v); level=5; } if (! strcmp(k,"openGeoDB:population") && !attr_strings[attr_string_population]) { attr_strings_save(attr_string_population, v); level=5; } if (! strcmp(k,"ref")) { if (in_way) attr_strings_save(attr_string_street_name_systematic, v); level=5; } if (! strcmp(k,"openGeoDB:is_in")) { if (!is_in_buffer[0]) strcpy(is_in_buffer, v); level=5; } if (! strcmp(k,"is_in")) { if (!is_in_buffer[0]) strcpy(is_in_buffer, v); level=5; } if (! strcmp(k,"is_in:country")) { /** * Sometimes there is no is_in tag, only is_in:country. * I put this here so it can be overwritten by the previous if clause if there IS an is_in tag. */ strcpy(is_in_buffer, v); level=5; } if (! strcmp(k,"place_county")) { /** * Ireland uses the place_county OSM tag to describe what county a town is in. * This would be equivalent to is_in: Town; Locality; Country * A real world example would be Node: Moycullen (52234625) * The tag is processed as Moycullen; Galway; Ireland * where Galway is the county */ strcpy(is_in_buffer, "Ireland"); attr_strings_save(attr_string_county_name, v); level=5; } if (! strcmp(k,"gnis:ST_alpha")) { /* assume a gnis tag means it is part of the USA: http://en.wikipedia.org/wiki/Geographic_Names_Information_System many US towns do not have is_in tags */ strcpy(is_in_buffer, "USA"); level=5; } if (! strcmp(k,"lanes")) { level=5; } if (attr_debug_level >= level) { int bytes_left = sizeof( debug_attr_buffer ) - strlen(debug_attr_buffer) - 1; if ( bytes_left > 0 ) { snprintf(debug_attr_buffer+strlen(debug_attr_buffer), bytes_left, " %s=%s", k, v); debug_attr_buffer[ sizeof( debug_attr_buffer ) - 1 ] = '\0'; node_is_tagged=1; } } if (level < 6) node_is_tagged=1; osm_update_attr_present(k, v); } static void osm_update_attr_present(char *k, char *v) { int idx; char *p, buffer[BUFFER_SIZE*2+2]; strcpy(buffer,"*=*"); if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) attr_present[idx]=1; sprintf(buffer,"%s=*", k); for(p=buffer;*p;p++) if(isspace(*p)) *p='_'; if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) attr_present[idx]=2; sprintf(buffer,"*=%s", v); for(p=buffer;*p;p++) if(isspace(*p)) *p='_'; if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) attr_present[idx]=2; sprintf(buffer,"%s=%s", k, v); for(p=buffer;*p;p++) if(isspace(*p)) *p='_'; if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) attr_present[idx]=4; } int coord_count; static void extend_buffer(struct buffer *b) { b->malloced+=b->malloced_step; b->base=realloc(b->base, b->malloced); if (b->base == NULL) { fprintf(stderr,"realloc of %d bytes failed\n",(int)b->malloced); exit(1); } } int nodeid_last; GHashTable *node_hash,*way_hash; static void node_buffer_to_hash(void) { int i,count=node_buffer.size/sizeof(struct node_item); struct node_item *ni=(struct node_item *)node_buffer.base; for (i = 0 ; i < count ; i++) g_hash_table_insert(node_hash, (gpointer)(long)(ni[i].id), (gpointer)(long)i); } static struct node_item *ni; void flush_nodes(int final) { fprintf(stderr,"flush_nodes %d\n",final); save_buffer("coords.tmp",&node_buffer,slices*slice_size); if (!final) { node_buffer.size=0; } slices++; } void osm_add_node(osmid id, double lat, double lon) { in_node=1; if (node_buffer.size + sizeof(struct node_item) > node_buffer.malloced) extend_buffer(&node_buffer); attr_strings_clear(); node_is_tagged=0; nodeid=id; item.type=type_point_unkn; debug_attr_buffer[0]='\0'; is_in_buffer[0]='\0'; debug_attr_buffer[0]='\0'; osmid_attr.type=attr_osm_nodeid; osmid_attr.len=3; osmid_attr_value=id; if (node_buffer.size + sizeof(struct node_item) > slice_size) { flush_nodes(0); } ni=(struct node_item *)(node_buffer.base+node_buffer.size); ni->id=id; ni->ref_node=0; ni->ref_way=0; ni->ref_ref=0; ni->dummy=0; ni->c.x=lon*6371000.0*M_PI/180; ni->c.y=log(tan(M_PI_4+lat*M_PI/360))*6371000.0; node_buffer.size+=sizeof(struct node_item); if (! node_hash) { if (ni->id > nodeid_last) { nodeid_last=ni->id; } else { fprintf(stderr,"INFO: Nodes out of sequence (new %d vs old %d), adding hash\n", ni->id, nodeid_last); node_hash=g_hash_table_new(NULL, NULL); node_buffer_to_hash(); } } else if (!g_hash_table_lookup(node_hash, (gpointer)(long)(ni->id))) g_hash_table_insert(node_hash, (gpointer)(long)(ni->id), (gpointer)(long)(ni-(struct node_item *)node_buffer.base)); else { node_buffer.size-=sizeof(struct node_item); nodeid=0; } } void clear_node_item_buffer(void) { int j,count=node_buffer.size/sizeof(struct node_item); struct node_item *ni=(struct node_item *)(node_buffer.base); for (j = 0 ; j < count ; j++) { ni[j].ref_way=0; } } static struct node_item * node_item_get(int id) { struct node_item *ni=(struct node_item *)(node_buffer.base); int count=node_buffer.size/sizeof(struct node_item); int interval=count/4; int p=count/2; if(interval==0) { // If fewer than 4 nodes defined so far set interval to 1 to // avoid infinite loop interval = 1; } if (node_hash) { int i; i=(int)(long)(g_hash_table_lookup(node_hash, (gpointer)(long)(unsigned int)id)); return ni+i; } if (ni[0].id > id) return NULL; if (ni[count-1].id < id) return NULL; while (ni[p].id != id) { #if 0 fprintf(stderr,"p=%d count=%d interval=%d id=%d ni[p].id=%d\n", p, count, interval, id, ni[p].id); #endif if (ni[p].id < id) { p+=interval; if (interval == 1) { if (p >= count) return NULL; if (ni[p].id > id) return NULL; } else { if (p >= count) p=count-1; } } else { p-=interval; if (interval == 1) { if (p < 0) return NULL; if (ni[p].id < id) return NULL; } else { if (p < 0) p=0; } } if (interval > 1) interval/=2; } return &ni[p]; } static int load_node(FILE *coords, int p, struct node_item *ret) { fseek(coords, p*sizeof(struct node_item), SEEK_SET); if (fread(ret, sizeof(*ret), 1, coords) != 1) { fprintf(stderr,"read failed\n"); return 0; } return 1; } static int node_item_get_from_file(FILE *coords, int id, struct node_item *ret) { int count; int interval; int p; if (node_hash) { int i; i=(int)(long)(g_hash_table_lookup(node_hash, (gpointer)(long)id)); fseek(coords, i*sizeof(*ret), SEEK_SET); if (fread(ret, sizeof(*ret), 1, coords) == 1) return 1; else return 0; } fseek(coords, 0, SEEK_END); count=ftell(coords)/sizeof(struct node_item); interval=count/4; p=count/2; if(interval==0) { // If fewer than 4 nodes defined so far set interval to 1 to // avoid infinite loop interval = 1; } if (!load_node(coords, p, ret)) return 0; for (;;) { if (ret->id == id) return 1; if (ret->id < id) { p+=interval; if (interval == 1) { if (p >= count) return 0; if (!load_node(coords, p, ret)) return 0; if (ret->id > id) return 0; } else { if (p >= count) p=count-1; if (!load_node(coords, p, ret)) return 0; } } else { p-=interval; if (interval == 1) { if (p < 0) return 0; if (!load_node(coords, p, ret)) return 0; if (ret->id < id) return 0; } else { if (p < 0) p=0; if (!load_node(coords, p, ret)) return 0; } } if (interval > 1) interval/=2; } } void osm_add_way(osmid id) { static osmid wayid_last; in_way=1; wayid=id; coord_count=0; attr_strings_clear(); item.type=type_street_unkn; debug_attr_buffer[0]='\0'; maxspeed_attr_value=0; flags_attr_value = 0; memset(flags, 0, sizeof(flags)); memset(flagsa, 0, sizeof(flagsa)); debug_attr_buffer[0]='\0'; osmid_attr_value=id; if (wayid < wayid_last && !way_hash) { fprintf(stderr,"INFO: Ways out of sequence (new "OSMID_FMT" vs old "OSMID_FMT"), adding hash\n", wayid, wayid_last); way_hash=g_hash_table_new(NULL, NULL); } wayid_last=wayid; } char relation_type[BUFFER_SIZE]; char iso_code[BUFFER_SIZE]; int admin_level; int boundary; void osm_add_relation(osmid id) { current_id=id; in_relation=1; debug_attr_buffer[0]='\0'; relation_type[0]='\0'; iso_code[0]='\0'; admin_level=-1; boundary=0; item_bin_init(item_bin, type_none); item_bin_add_attr_longlong(item_bin, attr_osm_relationid, current_id); } static int country_id_from_iso2(char *iso) { int ret=0; if (iso) { struct country_search *search; struct attr country_iso2,country_id; struct item *item; country_iso2.type=attr_country_iso2; country_iso2.u.str=iso; search=country_search_new(&country_iso2,0); if ((item=country_search_get_item(search)) && item_attr_get(item, attr_country_id, &country_id)) ret=country_id.u.num; country_search_destroy(search); } return ret; } static struct country_table * country_from_countryid(int id) { int i; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { if (country_table[i].countryid == id) return &country_table[i]; } return NULL; } struct country_table * country_from_iso2(char *iso) { return country_from_countryid(country_id_from_iso2(iso)); } void osm_end_relation(struct maptool_osm *osm) { enum item_type type; in_relation=0; if(attr_longest_match(attr_mapping_rel2poly_place, attr_mapping_rel2poly_place_count, &type, 1)) { item_bin->type=type; } else type=type_none; if ((!strcmp(relation_type, "multipolygon") || !strcmp(relation_type, "boundary")) && (boundary || type!=type_none)) { #if 0 if (admin_level == 2) { FILE *f; fprintf(stderr,"Multipolygon for %s\n", iso_code); char *name=g_strdup_printf("country_%s.tmp",iso_code); f=fopen(name,"w"); item_bin_write(item_bin, f); fclose(f); } #endif item_bin_write(item_bin, osm->boundaries); } if (!strcmp(relation_type, "restriction") && (item_bin->type == type_street_turn_restriction_no || item_bin->type == type_street_turn_restriction_only)) item_bin_write(item_bin, osm->turn_restrictions); if (experimental && !strcmp(relation_type, "associatedStreet") ) item_bin_write(item_bin, osm->associated_streets); attr_longest_match_clear(); } void osm_add_member(int type, osmid ref, char *role) { char member_buffer[BUFFER_SIZE*3+3]; struct attr memberattr = { attr_osm_member }; sprintf(member_buffer,"%d:"LONGLONG_FMT":%s", type, (long long) ref, role); memberattr.u.str=member_buffer; item_bin_add_attr(item_bin, &memberattr); } static void relation_add_tag(char *k, char *v) { int add_tag=1; #if 0 fprintf(stderr,"add tag %s %s\n",k,v); #endif if (!strcmp(k,"type")) { strcpy(relation_type, v); add_tag=0; } else if (!strcmp(k,"restriction")) { if (!strncmp(v,"no_",3)) { item_bin->type=type_street_turn_restriction_no; add_tag=0; } else if (!strncmp(v,"only_",5)) { item_bin->type=type_street_turn_restriction_only; add_tag=0; } else { item_bin->type=type_none; osm_warning("relation", current_id, 0, "Unknown restriction %s\n",v); } } else if (!strcmp(k,"admin_level")) { admin_level=atoi(v); } else if (!strcmp(k,"boundary")) { if (!strcmp(v,"administrative") || !strcmp(v,"postal_code")) { boundary=1; } } else if (!strcmp(k,"ISO3166-1")) { strcpy(iso_code, v); } if (add_tag) { char *tag; tag=g_alloca(strlen(k)+strlen(v)+2); sprintf(tag,"%s=%s",k,v); item_bin_add_attr_string(item_bin, attr_osm_tag, tag); } osm_update_attr_present(k,v); } static int attr_longest_match(struct attr_mapping **mapping, int mapping_count, enum item_type *types, int types_count) { int i,j,longest=0,ret=0,sum,val; struct attr_mapping *curr; for (i = 0 ; i < mapping_count ; i++) { sum=0; curr=mapping[i]; for (j = 0 ; j < curr->attr_present_idx_count ; j++) { val=attr_present[curr->attr_present_idx[j]]; if (val) sum+=val; else { sum=-1; break; } } if (sum > longest) { longest=sum; ret=0; } if (sum > 0 && sum == longest && ret < types_count) types[ret++]=curr->type; } return ret; } static void attr_longest_match_clear(void) { memset(attr_present, 0, sizeof(*attr_present)*attr_present_count); } void osm_end_way(struct maptool_osm *osm) { int i,count; int *def_flags,add_flags; enum item_type types[10]; struct item_bin *item_bin; int count_lines=0, count_areas=0; in_way=0; if (! osm->ways) return; if (dedupe_ways_hash) { if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long)wayid)) return; g_hash_table_insert(dedupe_ways_hash, (gpointer)(long)wayid, (gpointer)1); } count=attr_longest_match(attr_mapping_way, attr_mapping_way_count, types, sizeof(types)/sizeof(enum item_type)); if (!count) { count=1; types[0]=type_street_unkn; } if (count >= 10) { fprintf(stderr,"way id %ld\n",osmid_attr_value); dbg_assert(count < 10); } for (i = 0 ; i < count ; i++) { add_flags=0; if (types[i] == type_none) continue; if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) continue; if (types[i] != type_street_unkn) { if(types[i]0) item_bin_add_attr_int(item_bin, attr_duplicate, 1); item_bin_write(item_bin,osm->ways); } if(osm->line2poi) { count=attr_longest_match(attr_mapping_way2poi, attr_mapping_way2poi_count, types, sizeof(types)/sizeof(enum item_type)); dbg_assert(count < 10); for (i = 0 ; i < count ; i++) { if (types[i] == type_none || types[i] == type_point_unkn) continue; item_bin=init_item(types[i]); item_bin_add_coord(item_bin, coord_buffer, coord_count); item_bin_add_attr_string(item_bin, attr_label, attr_strings[attr_string_label]); item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]); item_bin_add_attr_string(item_bin, attr_district_name, attr_strings[attr_string_district_name]); item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]); item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]); item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]); item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]); item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]); item_bin_add_attr_longlong(item_bin, attr_osm_wayid, osmid_attr_value); item_bin_write(item_bin, count_areas<=count_lines ? osm->line2poi:osm->poly2poi); } } attr_longest_match_clear(); } void osm_end_node(struct maptool_osm *osm) { int count,i; char *postal; enum item_type types[10]; struct item_bin *item_bin; in_node=0; if (!osm->nodes || ! node_is_tagged || ! nodeid) return; count=attr_longest_match(attr_mapping_node, attr_mapping_node_count, types, sizeof(types)/sizeof(enum item_type)); if (!count) { types[0]=type_point_unkn; count=1; } dbg_assert(count < 10); for (i = 0 ; i < count ; i++) { if (types[i] == type_none) continue; if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) continue; item_bin=init_item(types[i]); if (item_is_town(*item_bin) && attr_strings[attr_string_population]) item_bin_set_type_by_population(item_bin, atoi(attr_strings[attr_string_population])); item_bin_add_coord(item_bin, &ni->c, 1); item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_name : attr_label, attr_strings[attr_string_label]); item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]); item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]); item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]); item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]); item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]); item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]); item_bin_add_attr_longlong(item_bin, attr_osm_nodeid, osmid_attr_value); item_bin_add_attr_string(item_bin, attr_debug, debug_attr_buffer); postal=attr_strings[attr_string_postal]; if (postal) { char *sep=strchr(postal,','); if (sep) *sep='\0'; item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_postal : attr_postal, postal); } item_bin_write(item_bin,osm->nodes); if (item_is_town(*item_bin) && attr_strings[attr_string_label] && osm->towns) { item_bin=init_item(item_bin->type); item_bin_add_coord(item_bin, &ni->c, 1); item_bin_add_attr_string(item_bin, attr_osm_is_in, is_in_buffer); item_bin_add_attr_longlong(item_bin, attr_osm_nodeid, osmid_attr_value); item_bin_add_attr_string(item_bin, attr_town_postal, postal); item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); item_bin_add_attr_string(item_bin, item_is_district(*item_bin)?attr_district_name:attr_town_name, attr_strings[attr_string_label]); item_bin_write(item_bin, osm->towns); } } processed_nodes_out++; attr_longest_match_clear(); } static struct country_table * osm_process_town_unknown_country(void) { static struct country_table *unknown; if (!unknown) unknown=country_from_countryid(999); return unknown; } static struct country_table * osm_process_town_by_is_in(struct item_bin *ib,char *is_in, struct attr *attrs, GHashTable *town_hash) { struct country_table *result=NULL, *lookup; char *tok,*dup=g_strdup(is_in),*buf=dup; int find_town_name = 0; if (item_is_district(*ib)) find_town_name = 1; while ((tok=strtok(buf, ",;"))) { while (*tok==' ') tok++; if (find_town_name && g_hash_table_lookup(town_hash, tok)) { attrs[10].type = attr_town_name; attrs[10].u.str = g_strdup(tok); find_town_name = 0; } lookup=g_hash_table_lookup(country_table_hash,tok); if (lookup) { if (result && result->countryid != lookup->countryid) { char *label=item_bin_get_attr(ib, attr_town_name, NULL); osm_warning("node",item_bin_get_nodeid(ib),0,"conflict for %s is_in=%s country %d vs %d\n", label, is_in, lookup->countryid, result->countryid); } result=lookup; } buf=NULL; } g_free(dup); return result; } static struct country_table * osm_process_town_by_boundary(GList *bl, struct item_bin *ib, struct coord *c, struct attr *attrs) { GList *l,*matches=boundary_find_matches(bl, c); struct boundary *match=NULL; l=matches; while (l) { struct boundary *b=l->data; if (b->country) { if (match && match->country->countryid!=b->country->countryid) { osm_warning("node",item_bin_get_nodeid(ib),0,"node (0x%x,0x%x) conflict country ", c->x, c->y); osm_warning("relation",boundary_relid(match),1,"country %d vs ",match->country->countryid); osm_warning("relation",boundary_relid(b),1,"country %d\n",b->country->countryid); } match=b; } l=g_list_next(l); } if (match) { if (match && match->country && match->country->admin_levels) { long long *nodeid=item_bin_get_attr(ib, attr_osm_nodeid, NULL); long long node_id=0; int end=strlen(match->country->admin_levels)+3; int a; int max_adm_level=0; if(nodeid) node_id=*nodeid; l=matches; while (l) { struct boundary *b=l->data; char *admin_level=osm_tag_value(b->ib, "admin_level"); char *postal=osm_tag_value(b->ib, "postal_code"); if (admin_level) { char *name; a=atoi(admin_level); if (a > 2 && a < end) { enum attr_type attr_type=attr_none; switch(match->country->admin_levels[a-3]) { case 's': attr_type=attr_state_name; break; case 'c': attr_type=attr_county_name; break; case 'M': b->ib->type=type_poly_place6; case 'm': attr_type=attr_municipality_name; break; } name=osm_tag_value(b->ib, "name"); if (name && attr_type != attr_none) { attrs[a-2].type=attr_type; attrs[a-2].u.str=name; } } if(b->admin_centre && b->admin_centre==node_id) { if(!max_adm_level || max_adm_level0) for(a=end-1;a>max_adm_level && a>2;a--) attrs[a-2].type=type_none; } g_list_free(matches); return match->country; } else { g_list_free(matches); return NULL; } } static void osm_town_relations_to_poly(GList *boundaries, FILE *towns_poly) { while(boundaries) { struct boundary *b=boundaries->data; if(item_is_poly_place(*b->ib)) { GList *s=b->sorted_segments; while(s) { struct geom_poly_segment *seg=s->data; if((seg->type==geom_poly_segment_type_way_outer || seg->type==geom_poly_segment_type_way_unknown) && coord_is_equal(*seg->first,*seg->last)) { struct item_bin *ib=init_item(b->ib->type); void *a; item_bin_add_coord(ib, seg->first, seg->last-seg->first+1); a=osm_tag_value(b->ib, "name"); if(a) item_bin_add_attr_string(ib,attr_label,a); a=osm_tag_value(b->ib, "osm_relationid"); if(a) item_bin_add_attr_longlong(ib,attr_osm_relationid,atol(a)); item_bin_write(ib, towns_poly); } s=g_list_next(s); } } osm_town_relations_to_poly(b->children, towns_poly); boundaries=g_list_next(boundaries); } } void osm_process_towns(FILE *in, FILE *boundaries, FILE *ways, char *suffix) { struct item_bin *ib; GList *bl; GHashTable *town_hash; struct attr attrs[11]; FILE *towns_poly; profile(0,NULL); bl=process_boundaries(boundaries, ways); profile(1,"processed boundraries\n"); town_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); while ((ib=read_item(in))) { if (!item_is_district(*ib)) { char *townname=item_bin_get_attr(ib, attr_town_name, NULL); g_hash_table_insert(town_hash, strdup(townname), (gpointer)1); } } fseek(in, 0, SEEK_SET); profile(1, "Finished town table rebuild\n"); while ((ib=read_item(in))) { struct coord *c=(struct coord *)(ib+1); struct country_table *result=NULL; char *is_in=item_bin_get_attr(ib, attr_osm_is_in, NULL); int i; memset(attrs, 0, sizeof(attrs)); result=osm_process_town_by_boundary(bl, ib, c, attrs); if (!result) result=osm_process_town_by_is_in(ib, is_in, attrs, town_hash); else if (item_is_district(*ib)) // just for the town name osm_process_town_by_is_in(ib, is_in, attrs, town_hash); // treat a district like a town, if we could not find the town it blongs to if (!item_bin_get_attr(ib, attr_town_name, NULL) && attrs[10].type != attr_town_name) { char *district_name = item_bin_get_attr(ib, attr_district_name, NULL); if (district_name) { struct attr attr_new_town_name; attr_new_town_name.type = attr_town_name; attr_new_town_name.u.str = district_name; item_bin_add_attr(ib, &attr_new_town_name); item_bin_remove_attr(ib, district_name); } } if (!result && unknown_country) result=osm_process_town_unknown_country(); if (result) { if (!result->file) { char *name=g_strdup_printf("country_%d.unsorted.tmp", result->countryid); result->file=fopen(name,"wb"); g_free(name); } if (result->file) { long long *nodeid; if (is_in) item_bin_remove_attr(ib, is_in); nodeid=item_bin_get_attr(ib, attr_osm_nodeid, NULL); if (nodeid) item_bin_remove_attr(ib, nodeid); if (attrs[0].type != attr_none) { char *postal=item_bin_get_attr(ib, attr_town_postal, NULL); if (postal) item_bin_remove_attr(ib, postal); } for (i = 0 ; i < 11 ; i++) { if (attrs[i].type != attr_none) item_bin_add_attr(ib, &attrs[i]); } if(item_bin_get_attr(ib, attr_district_name, NULL)) item_bin_write_match(ib, attr_district_name, attr_district_name_match, 5, result->file); else item_bin_write_match(ib, attr_town_name, attr_town_name_match, 5, result->file); } } } towns_poly=tempfile(suffix,"towns_poly",1); osm_town_relations_to_poly(bl, towns_poly); fclose(towns_poly); g_hash_table_destroy(town_hash); free_boundaries(bl); profile(0, "Finished processing towns\n"); } void sort_countries(int keep_tmpfiles) { int i; struct country_table *co; char *name_in,*name_out; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; if (co->file) { fclose(co->file); co->file=NULL; } name_in=g_strdup_printf("country_%d.unsorted.tmp", co->countryid); name_out=g_strdup_printf("country_%d.tmp", co->countryid); co->r=world_bbox; item_bin_sort_file(name_in, name_out, &co->r, &co->size); if (!keep_tmpfiles) unlink(name_in); g_free(name_in); g_free(name_out); } } struct relation_member { int type; long long id; char *role; }; static int get_relation_member(char *str, struct relation_member *memb) { int len; sscanf(str,"%d:"LONGLONG_FMT":%n",&memb->type,&memb->id,&len); memb->role=str+len; return 1; } static int search_relation_member(struct item_bin *ib, char *role, struct relation_member *memb, int *min_count) { char *str=NULL; int count=0; while ((str=item_bin_get_attr(ib, attr_osm_member, str))) { if (!get_relation_member(str, memb)) return 0; count++; if (!strcmp(memb->role, role) && (!min_count || *min_count < count)) { if (min_count) *min_count=count; return 1; } } return 0; } static int load_way_index(FILE *ways_index, int p, long long *idx) { int step=sizeof(*idx)*2; fseek(ways_index, p*step, SEEK_SET); if (fread(idx, step, 1, ways_index) != 1) { fprintf(stderr,"read failed\n"); return 0; } return 1; } static int seek_to_way(FILE *way, FILE *ways_index, long long wayid) { long offset; long long idx[2]; int count,interval,p; if (way_hash) { if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)wayid, NULL, (gpointer)&offset))) return 0; fseek(way, offset, SEEK_SET); return 1; } fseek(ways_index, 0, SEEK_END); count=ftell(ways_index)/sizeof(idx); interval=count/4; p=count/2; if(interval==0) { // If fewer than 4 nodes defined so far set interval to 1 to // avoid infinite loop interval = 1; } if (!load_way_index(ways_index, p, idx)) return 0; for (;;) { if (idx[0] == wayid) { fseek(way, idx[1], SEEK_SET); return 1; } if (idx[0] < wayid) { p+=interval; if (interval == 1) { if (p >= count) return 0; if (!load_way_index(ways_index, p, idx)) return 0; if (idx[0] > wayid) return 0; } else { if (p >= count) p=count-1; if (!load_way_index(ways_index, p, idx)) return 0; } } else { p-=interval; if (interval == 1) { if (p < 0) return 0; if (!load_way_index(ways_index, p, idx)) return 0; if (idx[0] < wayid) return 0; } else { if (p < 0) p=0; if (!load_way_index(ways_index, p, idx)) return 0; } } if (interval > 1) interval/=2; } } static struct coord * get_way(FILE *way, FILE *ways_index, struct coord *c, long long wayid, struct item_bin *ret, int debug) { long long currid; int last; struct coord *ic; if (!seek_to_way(way, ways_index, wayid)) { if (debug) fprintf(stderr,"not found in index"); return NULL; } while (item_bin_read(ret, way)) { currid=item_bin_get_wayid(ret); if (debug) fprintf(stderr,LONGLONG_FMT":",currid); if (currid != wayid) return NULL; ic=(struct coord *)(ret+1); last=ret->clen/2-1; if (debug) fprintf(stderr,"(0x%x,0x%x)-(0x%x,0x%x)",ic[0].x,ic[0].y,ic[last].x,ic[last].y); if (!c) return &ic[0]; if (ic[0].x == c->x && ic[0].y == c->y) return &ic[last]; if (ic[last].x == c->x && ic[last].y == c->y) return &ic[0]; } return NULL; } struct associated_street { osmid relid; char *name; }; struct associated_street_member_func_priv { FILE *out; GList *allocations; }; static void process_associated_street_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) { struct associated_street_member_func_priv *fp=func_priv; struct associated_street *rel=relation_priv; if(!fp->out) { /* Pass 1, fill associated street names in relation_priv */ char *name; if(!rel->name && item_is_street(*member) && (name=item_bin_get_attr(member,attr_street_name,NULL))!=NULL ) { rel->name=g_strdup(name); fp->allocations=g_list_prepend(fp->allocations, rel->name); } } else { /* Pass 2, add associated street names to relation members which do not have street name attr defined but have house number defined or are streets */ int type_implies_streetname=item_is_street(*member) || member->type==type_house_number_interpolation_even || member->type==type_house_number_interpolation_odd || member->type==type_house_number_interpolation_all || member->type==type_house_number_interpolation_alphabetic; if(rel->name && !item_bin_get_attr(member,attr_street_name,NULL) && (type_implies_streetname || item_bin_get_attr(member,attr_house_number,NULL))) item_bin_add_attr_string(member, attr_street_name, rel->name); item_bin_write(member,fp->out); } } static void relation_func_writethrough(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) { FILE *out=*(FILE **)func_priv; if(out) item_bin_write(member,out); } static void process_associated_streets_setup(FILE *in, struct relations *relations, struct associated_street_member_func_priv *fp) { struct relation_member relm; long long relid; struct item_bin *ib; struct relations_func *relations_func; int min_count; fseek(in, 0, SEEK_SET); relations_func=relations_func_new(process_associated_street_member, fp); while ((ib=read_item(in))) { char *name=osm_tag_value(ib, "name"); int namelen=name?strlen(name)+1:0; struct associated_street *rel=g_malloc0(sizeof(struct associated_street)+namelen); relid=item_bin_get_relationid(ib); rel->relid=relid; if(name) { rel->name=(char*)(rel+1); g_strlcpy(rel->name,name,namelen); } fprintf(stderr,"name=%s\n",rel->name); min_count=0; while(search_relation_member(ib, "street",&relm,&min_count)) { if(relm.type==2) relations_add_func(relations, relations_func, rel, NULL, relm.type, relm.id); fprintf(stderr,"street type=%d(should be 2) id="LONGLONG_FMT "\n",relm.type,relm.id); } min_count=0; while(search_relation_member(ib, "house",&relm,&min_count)) { fprintf(stderr,"house type=%d id="LONGLONG_FMT"\n",relm.type,relm.id); relations_add_func(relations, relations_func, rel, NULL, relm.type, relm.id); } min_count=0; while(search_relation_member(ib, "addr:houselink",&relm,&min_count)) { fprintf(stderr,"houselink type=%d id="LONGLONG_FMT"\n",relm.type,relm.id); relations_add_func(relations, relations_func, rel, NULL, relm.type, relm.id); } min_count=0; while(search_relation_member(ib, "address",&relm,&min_count)) { fprintf(stderr,"address type=%d id="LONGLONG_FMT"\n",relm.type,relm.id); relations_add_func(relations, relations_func, rel, NULL, relm.type, relm.id); } } relations_func=relations_func_new(relation_func_writethrough, &fp->out); relations_add_func(relations, relations_func, NULL, NULL, -1, 0); } void process_associated_streets(FILE *in, FILE *ways_in, FILE *ways_out, FILE *nodes_in, FILE *nodes_out, FILE *nodes2_in, FILE *nodes2_out) { struct relations *relations=relations_new(); struct associated_street_member_func_priv fp={NULL,NULL}; fseek(in, 0, SEEK_SET); process_associated_streets_setup(in, relations, &fp); /* Set noname relations names from their street members */ fseek(ways_in, 0, SEEK_SET); relations_process(relations, NULL, ways_in, NULL); /* Set street names on all members */ fp.out=ways_out; fseek(ways_in, 0, SEEK_SET); relations_process(relations, NULL, ways_in, NULL); fp.out=nodes_out; fseek(nodes_in, 0, SEEK_SET); relations_process(relations, NULL, nodes_in, NULL); if(nodes2_in) { fp.out=nodes2_out; fseek(nodes2_in, 0, SEEK_SET); relations_process(relations, NULL, nodes2_in, NULL); } relations_destroy(relations); g_list_foreach(fp.allocations, (GFunc)free, NULL); g_list_free(fp.allocations); } struct turn_restriction { osmid relid; enum item_type type; struct coord *c[3]; int c_count[3]; struct rect r; int order; }; static void process_turn_restrictions_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) { int i,count,type=(long)member_priv; struct turn_restriction *turn_restriction=relation_priv; struct coord *c=(struct coord *)(member+1); int ccount=member->clen/2; if (member->type < type_line) count=1; else count=2; turn_restriction->c[type]=g_renew(struct coord, turn_restriction->c[type], turn_restriction->c_count[type]+count); turn_restriction->c[type][turn_restriction->c_count[type]++]=c[0]; if (count > 1) turn_restriction->c[type][turn_restriction->c_count[type]++]=c[ccount-1]; if(IS_REF(turn_restriction->r.l)) { turn_restriction->r.l=c[0]; turn_restriction->r.h=c[0]; i=1; } else i=0; for(;ir); i=item_order_by_type(member->type); if(iorder) turn_restriction->order=i; } static void process_turn_restrictions_fromto(struct turn_restriction *t, int type, struct coord **c) { int i,j; for (i = 0 ; i < t->c_count[type] ; i+=2) { for (j = 0 ; j < t->c_count[1] ; j++) { if (coord_is_equal(t->c[type][i],t->c[1][j])) { c[0]=&t->c[type][i+1]; c[1]=&t->c[type][i]; return; } if (coord_is_equal(t->c[type][i+1],t->c[1][j])) { c[0]=&t->c[type][i]; c[1]=&t->c[type][i+1]; return; } } } } static void process_turn_restrictions_dump_coord(struct coord *c, int count) { int i; for (i = 0 ; i < count ; i++) { fprintf(stderr,"(0x%x,0x%x)",c[i].x,c[i].y); } } static void process_turn_restrictions_finish(GList *tr, FILE *out) { GList *l=tr; while (l) { struct turn_restriction *t=l->data; struct coord *c[4]; struct item_bin *ib=item_bin; if (!t->c_count[0]) { osm_warning("relation",t->relid,0,"turn restriction: from member not found\n"); } else if (!t->c_count[1]) { osm_warning("relation",t->relid,0,"turn restriction: via member not found\n"); } else if (!t->c_count[2]) { osm_warning("relation",t->relid,0,"turn restriction: to member not found\n"); } else { process_turn_restrictions_fromto(t, 0, c); process_turn_restrictions_fromto(t, 2, c+2); if (!c[0] || !c[2]) { osm_warning("relation",t->relid,0,"turn restriction: via ("); process_turn_restrictions_dump_coord(t->c[1], t->c_count[1]); fprintf(stderr,")"); if (!c[0]) { fprintf(stderr," failed to connect to from ("); process_turn_restrictions_dump_coord(t->c[0], t->c_count[0]); fprintf(stderr,")"); } if (!c[2]) { fprintf(stderr," failed to connect to to ("); process_turn_restrictions_dump_coord(t->c[2], t->c_count[2]); fprintf(stderr,")"); } fprintf(stderr,"\n"); } else { if (t->c_count[1] <= 2) { int order; char tilebuf[20]=""; item_bin_init(ib,t->type); item_bin_add_coord(ib, c[0], 1); item_bin_add_coord(ib, c[1], 1); if (t->c_count[1] > 1) item_bin_add_coord(ib, c[3], 1); item_bin_add_coord(ib, c[2], 1); order=tile(&t->r,"",tilebuf,sizeof(tilebuf)-1,overlap,NULL); if(order > t->order) order=t->order; item_bin_add_attr_range(ib,attr_order,0,order); item_bin_write(ib, out); } } } g_free(t); l=g_list_next(l); } g_list_free(tr); } static GList * process_turn_restrictions_setup(FILE *in, struct relations *relations) { struct relation_member fromm,tom,viam,tmpm; long long relid; struct item_bin *ib; struct relations_func *relations_func; int min_count; GList *turn_restrictions=NULL; fseek(in, 0, SEEK_SET); relations_func=relations_func_new(process_turn_restrictions_member, NULL); while ((ib=read_item(in))) { struct turn_restriction *turn_restriction; relid=item_bin_get_relationid(ib); min_count=0; if (!search_relation_member(ib, "from",&fromm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: from member missing\n"); continue; } if (search_relation_member(ib, "from",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple from members\n"); continue; } min_count=0; if (!search_relation_member(ib, "to",&tom,&min_count)) { osm_warning("relation",relid,0,"turn restriction: to member missing\n"); continue; } if (search_relation_member(ib, "to",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple to members\n"); continue; } min_count=0; if (!search_relation_member(ib, "via",&viam,&min_count)) { osm_warning("relation",relid,0,"turn restriction: via member missing\n"); continue; } if (search_relation_member(ib, "via",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple via member\n"); continue; } if (fromm.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for from member "); osm_warning(osm_types[fromm.type],fromm.id,1,"\n"); continue; } if (tom.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for to member "); osm_warning(osm_types[tom.type],tom.id,1,"\n"); continue; } if (viam.type != 1 && viam.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for via member "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } turn_restriction=g_new0(struct turn_restriction, 1); turn_restriction->relid=relid; turn_restriction->type=ib->type; turn_restriction->r.l.x=1<<30; turn_restriction->order=255; relations_add_func(relations, relations_func, turn_restriction, (gpointer) 0, fromm.type, fromm.id); relations_add_func(relations, relations_func, turn_restriction, (gpointer) 1, viam.type, viam.id); relations_add_func(relations, relations_func, turn_restriction, (gpointer) 2, tom.type, tom.id); turn_restrictions=g_list_append(turn_restrictions, turn_restriction); } return turn_restrictions; } void process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out) { struct relations *relations=relations_new(); GList *turn_restrictions; fseek(in, 0, SEEK_SET); turn_restrictions=process_turn_restrictions_setup(in, relations); relations_process(relations, coords, ways, NULL); process_turn_restrictions_finish(turn_restrictions, out); relations_destroy(relations); } void process_turn_restrictions_old(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out) { struct relation_member fromm,tom,viam,tmpm; struct node_item ni; long long relid; char from_buffer[65536],to_buffer[65536],via_buffer[65536]; struct item_bin *ib,*from=(struct item_bin *)from_buffer,*to=(struct item_bin *)to_buffer,*via=(struct item_bin *)via_buffer; struct coord *fromc,*toc,*viafrom,*viato,*tmp; int min_count; while ((ib=read_item(in))) { relid=item_bin_get_relationid(ib); min_count=0; if (!search_relation_member(ib, "from",&fromm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: from member missing\n"); continue; } if (search_relation_member(ib, "from",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple from members\n"); continue; } min_count=0; if (!search_relation_member(ib, "to",&tom,&min_count)) { osm_warning("relation",relid,0,"turn restriction: to member missing\n"); continue; } if (search_relation_member(ib, "to",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple to members\n"); continue; } min_count=0; if (!search_relation_member(ib, "via",&viam,&min_count)) { osm_warning("relation",relid,0,"turn restriction: via member missing\n"); continue; } if (search_relation_member(ib, "via",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple via member\n"); continue; } if (fromm.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for from member "); osm_warning(osm_types[fromm.type],fromm.id,1,"\n"); continue; } if (tom.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for to member "); osm_warning(osm_types[tom.type],tom.id,1,"\n"); continue; } if (viam.type != 1 && viam.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for via member "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } if (viam.type == 1) { if (!node_item_get_from_file(coords, viam.id, &ni)) { osm_warning("relation",relid,0,"turn restriction: failed to get via member "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } viafrom=&ni.c; viato=&ni.c; } else { if (!(viafrom=get_way(ways, ways_index, NULL, viam.id, via, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to get first via coordinate from "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } if (!(viato=get_way(ways, ways_index, viafrom, viam.id, via, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to get last via coordinate from "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } } #if 0 fprintf(stderr,"via "LONGLONG_FMT" vs %d\n",viam.id, ni.id); fprintf(stderr,"coord 0x%x,0x%x\n",ni.c.x,ni.c.y); fprintf(stderr,"Lookup "LONGLONG_FMT"\n",fromm.id); #endif if (!(fromc=get_way(ways, ways_index, viafrom, fromm.id, from, 0))) { if (viam.type == 1 || !(fromc=get_way(ways, ways_index, viato, fromm.id, from, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to connect via "); osm_warning(osm_types[viam.type],viam.id,1," 0x%x,0x%x-0x%x,0x%x to from member ",viafrom->x,viafrom->y,viato->x,viato->y); osm_warning(osm_types[fromm.type],fromm.id,1," ("); get_way(ways, ways_index, viafrom, fromm.id, from, 1); fprintf(stderr,")\n"); continue; } else { tmp=viato; viato=viafrom; viafrom=tmp; } } if (!(toc=get_way(ways, ways_index, viato, tom.id, to, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to connect via "); osm_warning(osm_types[viam.type],viam.id,1," 0x%x,0x%x-0x%x,0x%x to to member ",viafrom->x,viafrom->y,viato->x,viato->y); osm_warning(osm_types[tom.type],tom.id,1," ("); get_way(ways, ways_index, viato, tom.id, to, 1); fprintf(stderr,")\n"); continue; } #if 0 fprintf(stderr,"(0x%x,0x%x)-(0x%x,0x%x)-(0x%x,0x%x)\n",fromc->x,fromc->y, ni.c.x, ni.c.y, toc->x, toc->y); #endif item_bin_init(ib,ib->type); item_bin_add_coord(ib, fromc, 1); item_bin_add_coord(ib, viafrom, 1); if (viam.type == 2) item_bin_add_coord(ib, viato, 1); item_bin_add_coord(ib, toc, 1); item_bin_write(item_bin, out); } } #if 0 static void process_countries(FILE *way, FILE *ways_index) { FILE *in=fopen("country_de.tmp","r"); struct item_bin *ib; char buffer2[400000]; struct item_bin *ib2=(struct item_bin *)buffer2; GList *segments=NULL,*sort_segments; fseek(in, 0, SEEK_SET); while ((ib=read_item(in))) { char *str=NULL; struct relation_member member; while ((str=item_bin_get_attr(ib, attr_osm_member, str))) { if (!get_relation_member(str, &member)) break; if (member.type == 2) { if (!seek_to_way(way, ways_index, member.id)) { fprintf(stderr,"not found in index"); break; } while (item_bin_read(ib2, way)) { if (item_bin_get_wayid(ib2) != member.id) break; segments=g_list_prepend(segments,item_bin_to_poly_segment(ib2, geom_poly_segment_type_way_unknown)); break; } } } } sort_segments=geom_poly_segments_sort(segments, geom_poly_segment_type_way_left_side); FILE *tmp=fopen("tst.txt","w"); while (sort_segments) { struct geom_poly_segment *seg=sort_segments->data; if (!seg) { fprintf(stderr,"is null\n"); } else { fprintf(stderr,"segment %p %s area "LONGLONG_FMT"\n",sort_segments,coord_is_equal(*seg->first, *seg->last) ? "closed":"open",geom_poly_area(seg->first,seg->last-seg->first+1)); } #if 0 int count=seg->last-seg->first+1; item_bin_init(ib, type_border_country); item_bin_add_coord(ib, seg->first, count); item_bin_dump(ib, tmp); #endif sort_segments=g_list_next(sort_segments); } fclose(tmp); fclose(in); } #endif static void node_ref_way(osmid node) { struct node_item *ni; ni=node_item_get(node); if (ni) ni->ref_way++; } static void nodes_ref_item_bin(struct item_bin *ib) { int i; struct coord *c=(struct coord *)(ib+1); for (i = 0 ; i < ib->clen/2 ; i++) node_ref_way(REF(c[i])); } void osm_add_nd(osmid ref) { SET_REF(coord_buffer[coord_count], ref); coord_count++; if (coord_count > 65536) { fprintf(stderr,"ERROR: Overflow\n"); exit(1); } } static void write_item_part(FILE *out, FILE *out_index, FILE *out_graph, struct item_bin *orig, int first, int last, long long *last_id) { struct item_bin new; struct coord *c=(struct coord *)(orig+1); char *attr=(char *)(c+orig->clen/2); int attr_len=orig->len-orig->clen-2; processed_ways++; new.type=orig->type; new.clen=(last-first+1)*2; new.len=new.clen+attr_len+2; if (out_index) { long long idx[2]; idx[0]=item_bin_get_wayid(orig); idx[1]=ftell(out); if (way_hash) { if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)idx[0], NULL, NULL))) g_hash_table_insert(way_hash, (gpointer)(long)idx[0], (gpointer)(long)idx[1]); } else { if (!last_id || *last_id != idx[0]) fwrite(idx, sizeof(idx), 1, out_index); if (last_id) *last_id=idx[0]; } } #if 0 fprintf(stderr,"first %d last %d type 0x%x len %d clen %d attr_len %d\n", first, last, new.type, new.len, new.clen, attr_len); #endif fwrite(&new, sizeof(new), 1, out); fwrite(c+first, new.clen*4, 1, out); fwrite(attr, attr_len*4, 1, out); #if 0 fwrite(&new, sizeof(new), 1, out_graph); fwrite(c+first, new.clen*4, 1, out_graph); fwrite(attr, attr_len*4, 1, out_graph); #endif } void ref_ways(FILE *in) { struct item_bin *ib; fseek(in, 0, SEEK_SET); while ((ib=read_item(in))) nodes_ref_item_bin(ib); } void resolve_ways(FILE *in, FILE *out) { struct item_bin *ib; struct coord *c; int i; struct node_item *ni; fseek(in, 0, SEEK_SET); while ((ib=read_item(in))) { c=(struct coord *)(ib+1); for (i = 0 ; i < ib->clen/2 ; i++) { if(!IS_REF(c[i])) continue; ni=node_item_get(REF(c[i])); if(ni) { c[i].x=ni->c.x; c[i].y=ni->c.y; } } item_bin_write(ib,out); } } FILE * resolve_ways_file(FILE *in, char *suffix, char *filename) { char *newfilename=g_strdup_printf("%s_new",filename); FILE *new=tempfile(suffix,newfilename,1); resolve_ways(in, new); fclose(in); fclose(new); tempfile_rename(suffix,newfilename,filename); g_free(newfilename); return tempfile(suffix,filename,0); } /** * Get POI coordinates from area/line coordinates. * @param in *in input file with area/line coordinates. * @param in *out output file with POI coordinates * @param in type input file original contents type: type_line or type_area * @returns nothing */ void process_way2poi(FILE *in, FILE *out, int type) { struct item_bin *ib; while ((ib=read_item(in))) { int count=ib->clen/2; if(count>1 && ib->typetype, ib->len, ib->clen); #endif ccount=ib->clen/2; if (ccount <= 1) continue; c=(struct coord *)(ib+1); last=0; for (i = 0 ; i < ccount ; i++) { if (IS_REF(c[i])) { ndref=REF(c[i]); ni=node_item_get(ndref); if (ni) { c[i]=ni->c; if (ni->ref_way > 1 && i != 0 && i != ccount-1 && i != last && item_get_default_flags(ib->type)) { write_item_part(out, out_index, out_graph, ib, last, i, &last_id); last=i; } } else if (final) { osm_warning("way",item_bin_get_wayid(ib),0,"Non-existing reference to "); osm_warning("node",ndref,1,"\n"); remaining=(ib->len+1)*4-sizeof(struct item_bin)-i*sizeof(struct coord); memmove(&c[i], &c[i+1], remaining); ib->clen-=2; ib->len-=2; i--; ccount--; } } } if (ccount) { write_item_part(out, out_index, out_graph, ib, last, ccount-1, &last_id); if (final && ib->type == type_water_line && out_coastline) { write_item_part(out_coastline, NULL, NULL, ib, last, ccount-1, NULL); } } } sig_alrm(0); sig_alrm_end(); return 0; } static void index_country_add(struct zip_info *info, int country_id, char*first_key, char *last_key, char *tile, char *filename, int size, FILE *out) { struct item_bin *item_bin=init_item(type_countryindex); int num=0, zip_num; char tilename[32]; do { snprintf(tilename,sizeof(tilename),"%ss%d", tile, num); num++; zip_num=add_aux_tile(info, tilename, filename, size); } while (zip_num == -1); item_bin_add_attr_int(item_bin, attr_country_id, country_id); if(first_key) item_bin_add_attr_string(item_bin, attr_first_key, first_key); if(last_key) item_bin_add_attr_string(item_bin, attr_last_key, last_key); item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_num); item_bin_write(item_bin, out); } void write_countrydir(struct zip_info *zip_info, int max_index_size) { int i; int max=11; char filename[32]; struct country_table *co; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; if(co->size) { FILE *in; char countrypart[32]; char partsuffix[32]; FILE *out=NULL; char *outname=NULL; int partsize; char buffer[50000]; struct item_bin *ib=(struct item_bin*)buffer; int ibsize; char tileco[32]=""; char tileprev[32]=""; char tilecur[32]=""; char *countryindexname; FILE *countryindex; char key[1024]="",first_key[1024]="",last_key[1024]=""; tile(&co->r, "", tileco, max, overlap, NULL); snprintf(filename,sizeof(filename),"country_%d.tmp", co->countryid); in=fopen(filename,"rb"); snprintf(countrypart,sizeof(countrypart),"country_%d_p",co->countryid); countryindex=tempfile("0",countrypart,1); countryindexname=tempfile_name("0",countrypart); partsize=0; while(1) { int r=item_bin_read(ib,in); struct attr_bin *a; ibsize=r>0?(ib->len+1)*4 : 0; if(ibsize) { g_strlcpy(tileprev,tilecur,sizeof(tileprev)); a=item_bin_get_attr_bin(ib, attr_tile_name, NULL); if(a) { g_strlcpy(tilecur,(char *)(a+1),sizeof(tilecur)); item_bin_remove_attr(ib,a+1); } else tilecur[0]=0; a=item_bin_get_attr_bin_last(ib); if(a && ATTR_IS_STRING(a->type)) g_strlcpy(key,(char *)(a+1),sizeof(key)); } /* If output file is already opened, and: - we have reached end of input file, or - adding new tile would make index part too big, or - item just read belongs to a different tile than the previous one, then close existing output file, put reference to the country index tile.*/ if(out && (!r || (partsize && ((partsize+ibsize)>max_index_size)) || strcmp(tileprev,tilecur)) ) { partsize=ftell(out); fclose(out); out=NULL; index_country_add(zip_info,co->countryid,first_key,last_key,strlen(tileco)>strlen(tileprev)?tileco:tileprev,outname,partsize,countryindex); g_free(outname); outname=NULL; g_strlcpy(first_key,key,sizeof(first_key)); } /* No items left, finish this country index. */ if(!r) break; /* Open new output file. */ if(!out) { co->nparts++; snprintf(partsuffix,sizeof(partsuffix),"%d",co->nparts); out=tempfile(partsuffix,countrypart,1); outname=tempfile_name(partsuffix,countrypart); partsize=0; } item_bin_write(ib,out); partsize+=ibsize; g_strlcpy(last_key,key,sizeof(last_key)); } partsize=ftell(countryindex); if(partsize) index_country_add(zip_info,co->countryid,NULL,NULL,tileco,countryindexname, partsize, zip_get_index(zip_info)); fclose(countryindex); g_free(countryindexname); } } } void load_countries(void) { char filename[32]; FILE *f; int i; struct country_table *co; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; sprintf(filename,"country_%d.tmp", co->countryid); f=fopen(filename,"rb"); if (f) { int i,first=1; struct item_bin *ib; while ((ib=read_item(f))) { struct coord *c=(struct coord *)(ib+1); co->size+=ib->len*4+4; for (i = 0 ; i < ib->clen/2 ; i++) { if (first) { co->r.l=c[i]; co->r.h=c[i]; first=0; } else bbox_extend(&c[i], &co->r); } } fseek(f, 0, SEEK_END); co->size=ftell(f); fclose(f); } } } void remove_countryfiles(void) { int i,j; char filename[32]; struct country_table *co; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; if (co->size) { sprintf(filename,"country_%d.tmp", co->countryid); unlink(filename); } for(j=0; j<=co->nparts;j++) { char partsuffix[32]; sprintf(filename,"country_%d_p", co->countryid); sprintf(partsuffix,"%d",j); tempfile_unlink(partsuffix,filename); } } } void osm_init(FILE* rule_file) { build_attrmap(rule_file); build_countrytable(); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm_o5m.c000066400000000000000000000154641221777731700215300ustar00rootroot00000000000000#include #include #include #include "maptool.h" static int print; static char *types[]={"node","way","relation"}; struct o5m { unsigned char buffer[65536]; int buffer_size; unsigned char *buffer_start; unsigned char *buffer_end; FILE *in; int error; int lat, lon, uid, version; long long id, rid[3], changeset; time_t timestamp; char *user; }; static struct string_table { char strings[15000][256]; int pos; } st; static double latlon_scale=10000000.0; #define buffer_end(o,x) ((o)->buffer_start+(x) > (o)->buffer_end && !fill_buffer((o), (x))) static int fill_buffer(struct o5m *o, int min) { int count; memmove(o->buffer, o->buffer_start, o->buffer_end-o->buffer_start); o->buffer_end-=o->buffer_start-o->buffer; o->buffer_start=o->buffer; count=fread(o->buffer_end, 1, o->buffer+o->buffer_size-o->buffer_end, o->in); if (!count) return 0; o->buffer_end+=count; return (min <= o->buffer_end - o->buffer); } static unsigned long long get_uval(unsigned char **p) { unsigned char c; long long ret=0; int shift=0; for (;;) { c=*((*p)++); ret+=((long long)c & 0x7f) << shift; if (!(c & 0x80)) return ret; shift+=7; } } static unsigned long long get_sval(unsigned char **p) { long long ret=get_uval(p); if (ret & 1) { return -((ret >> 1)+1); } else { return ret >> 1; } } static void get_strings(struct string_table *st, unsigned char **p, char **s1, char **s2) { int len,xlen=0; *s1=(char *)*p; len=strlen(*s1); xlen=1; if (s2) { *s2=*s1+len+1; len+=strlen(*s2); xlen++; } (*p)+=len+xlen; if (len <= 250) { memcpy(st->strings[st->pos++], *s1, len+xlen); if (st->pos >= 15000) st->pos=0; } } static void get_strings_ref(struct string_table *st, int ref, char **s1, char **s2) { int pos=st->pos-ref; if (pos < 0) pos+=15000; *s1=st->strings[pos]; if (s2) *s2=*s1+strlen(*s1)+1; } static void print_escaped(char *s) { for (;;) { switch (*s) { case 0: return; case 9: case 13: case 34: case 38: case 39: case 60: case 62: printf("&#%d;",*s); break; default: putc(*s,stdout); break; } s++; } } static void o5m_reset(struct o5m *o) { o->lat=0; o->lon=0; o->id=0; o->rid[0]=0; o->rid[1]=0; o->rid[2]=0; o->changeset=0; o->timestamp=0; } static void o5m_print_start(struct o5m *o, int c) { printf("\t<%s id=\""LONGLONG_FMT"\"",types[c-0x10],o->id); } static void o5m_print_version(struct o5m *o, int tags) { char timestamp_str[64]; if (o->version) { strftime(timestamp_str, sizeof(timestamp_str), "%Y-%m-%dT%H:%M:%SZ", gmtime(&o->timestamp)); printf(" version=\"%d\" timestamp=\"%s\" changeset=\""LONGLONG_FMT"\"",o->version,timestamp_str,o->changeset); if (o->uid) { printf(" uid=\"%d\" user=\"",o->uid); print_escaped(o->user); printf("\""); } } printf("%s\n",tags?">":"/>"); } static void o5m_print_end(char c) { printf("\t\n",types[c-0x10]); } int map_collect_data_osm_o5m(FILE *in, struct maptool_osm *osm) { struct o5m o; unsigned char c, *end, *rend; int len, rlen, ref, tags; char *uidstr, *role; if (print) { printf("\n"); printf("\n"); } o5m_reset(&o); o.buffer_size=sizeof(o.buffer); o.buffer_start=o.buffer; o.buffer_end=o.buffer; o.error=0; o.in=in; fill_buffer(&o,1); for (;;) { if (buffer_end(&o, 1)) { fprintf(stderr,"unexpected eof\n"); return 1; } c=*(o.buffer_start++); switch (c) { case 0x10: case 0x11: case 0x12: (void)buffer_end(&o, 4); len=get_uval(&o.buffer_start); if (o.buffer_start > o.buffer_end) { fprintf(stderr,"unexpected eof\n"); return 0; } if (buffer_end(&o, len)) { fprintf(stderr,"unexpected eof or buffer too small\n"); return 0; } end=o.buffer_start+len; o.id+=get_sval(&o.buffer_start); o.version=get_uval(&o.buffer_start); if (o.version) { o.timestamp+=get_sval(&o.buffer_start); if (o.timestamp) { o.changeset+=get_sval(&o.buffer_start); ref=get_uval(&o.buffer_start); if (ref) get_strings_ref(&st, ref, &uidstr, &o.user); else get_strings(&st, &o.buffer_start, &uidstr, &o.user); o.uid=get_uval((unsigned char **)&uidstr); } } if (print) o5m_print_start(&o, c); switch (c) { case 0x10: o.lon+=get_sval(&o.buffer_start); o.lat+=get_sval(&o.buffer_start); osm_add_node(o.id, o.lat/latlon_scale,o.lon/latlon_scale); tags=end > o.buffer_start; if (print) { printf(" lat=\"%.7f\" lon=\"%.7f\"",o.lat/10000000.0,o.lon/10000000.0); o5m_print_version(&o, tags); } break; case 0x11: osm_add_way(o.id); rlen=get_uval(&o.buffer_start); tags=end > o.buffer_start; rend=o.buffer_start+rlen; if (print) o5m_print_version(&o, tags); while (o.buffer_start < rend) { o.rid[0]+=get_sval(&o.buffer_start); osm_add_nd(o.rid[0]); if (print) printf("\t\t\n",o.rid[0]); } break; case 0x12: osm_add_relation(o.id); rlen=get_uval(&o.buffer_start); tags=end > o.buffer_start; rend=o.buffer_start+rlen; if (print) o5m_print_version(&o, tags); while (o.buffer_start < rend) { long long delta=get_sval(&o.buffer_start); int r; ref=get_uval(&o.buffer_start); if (ref) get_strings_ref(&st, ref, &role, NULL); else get_strings(&st, &o.buffer_start, &role, NULL); r=role[0]-'0'; if (r < 0) r=0; if (r > 2) r=2; o.rid[r]+=delta; osm_add_member(r+1, o.rid[r], role+1); if (print) printf("\t\t\n",types[r], o.rid[r], role+1); } break; } while (end > o.buffer_start) { char *k, *v; ref=get_uval(&o.buffer_start); if (ref) get_strings_ref(&st, ref, &k, &v); else get_strings(&st, &o.buffer_start, &k, &v); osm_add_tag(k, v); if (print) { printf("\t\t\n"); } } if (print && tags) { o5m_print_end(c); } switch (c) { case 0x10: osm_end_node(osm); break; case 0x11: osm_end_way(osm); break; case 0x12: osm_end_relation(osm); break; } break; case 0xdb: if (print) printf("\t\n"); len=get_uval(&o.buffer_start); if (o.buffer_start > o.buffer_end) { return 0; } if (buffer_end(&o, len)) { return 0; } o.buffer_start+=len; break; case 0xe0: if (buffer_end(&o, 5)) return 0; o.buffer_start+=5; break; case 0xfe: return 1; case 0xff: o5m_reset(&o); break; default: fprintf(stderr,"Unknown tag 0x%x\n",c); return 0; } } return 0; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm_protobuf.c000066400000000000000000000232751221777731700226670ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "file.h" #include "generated-code/fileformat.pb-c.h" #include "generated-code/osmformat.pb-c.h" static double latlon_scale=10000000.0; /* Maximum length of a BlobHeader, see * http://wiki.openstreetmap.org/wiki/PBF_Format */ #define MAX_HEADER_LENGTH 1024 * 64 /* Maximum length of a Blob */ #define MAX_BLOB_LENGTH 1024 * 1024 * 32 #define SANITY_CHECK_LENGTH(length, max_length) \ if (length > max_length){ \ fprintf(stderr,"Not a valid protobuf file. " \ "Invalid block size in input: %d, max is %d. \n", \ length, max_length); \ return NULL; \ } static OSMPBF__BlobHeader * read_header(FILE *f) { unsigned char *buffer,lenb[4]; int len; if (fread(lenb, 4, 1, f) != 1) return NULL; len=(lenb[0] << 24) | (lenb[1] << 16) | (lenb[2] << 8) | lenb[3]; SANITY_CHECK_LENGTH(len, MAX_HEADER_LENGTH) buffer=alloca(len); if (fread(buffer, len, 1, f) != 1) return NULL; return osmpbf__blob_header__unpack(&protobuf_c_system_allocator, len, buffer); } static OSMPBF__Blob * read_blob(OSMPBF__BlobHeader *header, FILE *f) { unsigned char *buffer; int len=header->datasize; SANITY_CHECK_LENGTH(len, MAX_BLOB_LENGTH) buffer=alloca(len); if (fread(buffer, len, 1, f) != 1) return NULL; return osmpbf__blob__unpack(&protobuf_c_system_allocator, len, buffer); } static unsigned char * uncompress_blob(OSMPBF__Blob *blob) { unsigned char *ret=malloc(blob->raw_size); int zerr; z_stream strm; if (!ret) return NULL; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in=blob->zlib_data.len; strm.next_in=blob->zlib_data.data; strm.avail_out=blob->raw_size; strm.next_out=ret; zerr = inflateInit(&strm); if (zerr != Z_OK) { free(ret); return NULL; } zerr = inflate(&strm, Z_NO_FLUSH); if (zerr != Z_STREAM_END) { free(ret); return NULL; } inflateEnd(&strm); return ret; } static int get_string(char *buffer, int buffer_size, OSMPBF__PrimitiveBlock *primitive_block, int id, int escape) { int len=primitive_block->stringtable->s[id].len; char *data=(char *)primitive_block->stringtable->s[id].data; if (primitive_block->stringtable->s[id].len >= buffer_size) { buffer[0]='\0'; return 0; } if (escape) { int i; char *p=buffer; for (i = 0 ; i < len ; i++) { switch(data[i]) { case '\t': case '\r': case '\n': case '>': case '<': case '\'': case '"': case '&': sprintf(p,"&#%d;",data[i]); p+=strlen(p); break; default: *p++=data[i]; } } *p++='\0'; return 1; } else { strncpy(buffer, data, len); buffer[len]='\0'; return 1; } } static void process_osmheader(OSMPBF__Blob *blob, unsigned char *data) { OSMPBF__HeaderBlock *header_block; header_block=osmpbf__header_block__unpack(&protobuf_c_system_allocator, blob->raw_size, data); osmpbf__header_block__free_unpacked(header_block, &protobuf_c_system_allocator); } #if 0 static void process_user(OSMPBF__PrimitiveBlock *primitive_block, int user_sid, int uid, int swap) { char userbuff[1024]; get_string(userbuff, sizeof(userbuff), primitive_block, user_sid, 1); if (userbuff[0] && uid != -1) { if (swap) printf(" uid=\"%d\" user=\"%s\"",uid,userbuff); else printf(" user=\"%s\" uid=\"%d\"",userbuff,uid); } } static void process_timestamp(long long timestamp) { time_t ts; struct tm *tm; char tsbuff[1024]; ts=timestamp; tm=gmtime(&ts); strftime(tsbuff, sizeof(tsbuff), "%Y-%m-%dT%H:%M:%SZ", tm); printf(" timestamp=\"%s\"",tsbuff); } #endif static void process_tag(OSMPBF__PrimitiveBlock *primitive_block, int key, int val) { char keybuff[1024]; char valbuff[1024]; #if 0 get_string(keybuff, sizeof(keybuff), primitive_block, key, 1); get_string(valbuff, sizeof(valbuff), primitive_block, val, 1); printf("\t\t\n",keybuff,valbuff); #else get_string(keybuff, sizeof(keybuff), primitive_block, key, 0); get_string(valbuff, sizeof(valbuff), primitive_block, val, 0); osm_add_tag(keybuff, valbuff); #endif } static void process_dense(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__DenseNodes *dense, struct maptool_osm *osm) { int i,j=0,has_tags; long long id=0,lat=0,lon=0,changeset=0,timestamp=0; int user_sid=0,uid=0; if (!dense) return; for (i = 0 ; i < dense->n_id ; i++) { id+=dense->id[i]; lat+=dense->lat[i]; lon+=dense->lon[i]; changeset+=dense->denseinfo->changeset[i]; user_sid+=dense->denseinfo->user_sid[i]; uid+=dense->denseinfo->uid[i]; timestamp+=dense->denseinfo->timestamp[i]; has_tags=dense->keys_vals && dense->keys_vals[j]; osm_add_node(id, lat/latlon_scale,lon/latlon_scale); #if 0 printf("\tdenseinfo->version[i],changeset); process_user(primitive_block, user_sid, uid, 0); process_timestamp(timestamp); #endif if (has_tags) { #if 0 printf(">\n"); #endif while (dense->keys_vals[j]) { process_tag(primitive_block, dense->keys_vals[j], dense->keys_vals[j+1]); j+=2; } #if 0 printf("\t\n"); } else printf("/>\n"); #else } #endif osm_end_node(osm); j++; } } #if 0 static void process_info(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Info *info) { printf(" version=\"%d\" changeset=\"%Ld\"",info->version,info->changeset); process_user(primitive_block, info->user_sid, info->uid, 1); process_timestamp(info->timestamp); } #endif static void process_way(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Way *way, struct maptool_osm *osm) { int i; long long ref=0; osm_add_way(way->id); #if 0 printf("\tid); process_info(primitive_block, way->info); printf(">\n"); #else #endif for (i = 0 ; i < way->n_refs ; i++) { ref+=way->refs[i]; osm_add_nd(ref); #if 0 printf("\t\t\n",ref); #else #endif } for (i = 0 ; i < way->n_keys ; i++) process_tag(primitive_block, way->keys[i], way->vals[i]); #if 0 printf("\t\n"); #endif osm_end_way(osm); } static void process_relation(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Relation *relation, struct maptool_osm *osm) { int i; long long ref=0; char rolebuff[1024]; #if 0 printf("\tid); process_info(primitive_block, relation->info); printf(">\n"); #endif osm_add_relation(relation->id); for (i = 0 ; i < relation->n_roles_sid ; i++) { #if 0 printf("\t\ttypes[i]) { case 0: printf("node"); break; case 1: printf("way"); break; case 2: printf("relation"); break; default: printf("unknown"); break; } #endif ref+=relation->memids[i]; get_string(rolebuff, sizeof(rolebuff), primitive_block, relation->roles_sid[i], 1); #if 0 printf("\" ref=\"%Ld\" role=\"%s\"/>\n",ref,rolebuff); #else osm_add_member(relation->types[i]+1,ref,rolebuff); #endif } for (i = 0 ; i < relation->n_keys ; i++) process_tag(primitive_block, relation->keys[i], relation->vals[i]); #if 0 printf("\t\n"); #else osm_end_relation(osm); #endif } static void process_osmdata(OSMPBF__Blob *blob, unsigned char *data, struct maptool_osm *osm) { int i,j; OSMPBF__PrimitiveBlock *primitive_block; primitive_block=osmpbf__primitive_block__unpack(&protobuf_c_system_allocator, blob->raw_size, data); for (i = 0 ; i < primitive_block->n_primitivegroup ; i++) { OSMPBF__PrimitiveGroup *primitive_group=primitive_block->primitivegroup[i]; process_dense(primitive_block, primitive_group->dense, osm); for (j = 0 ; j < primitive_group->n_ways ; j++) process_way(primitive_block, primitive_group->ways[j], osm); for (j = 0 ; j < primitive_group->n_relations ; j++) process_relation(primitive_block, primitive_group->relations[j], osm); #if 0 printf("Group %p %d %d %d %d\n",primitive_group->dense,primitive_group->n_nodes,primitive_group->n_ways,primitive_group->n_relations,primitive_group->n_changesets); #endif } osmpbf__primitive_block__free_unpacked(primitive_block, &protobuf_c_system_allocator); } int map_collect_data_osm_protobuf(FILE *in, struct maptool_osm *osm) { OSMPBF__BlobHeader *header; OSMPBF__Blob *blob; unsigned char *data; #if 0 printf("\n"); printf("\n"); #endif while ((header=read_header(in))) { blob=read_blob(header, in); data=uncompress_blob(blob); if (!strcmp(header->type,"OSMHeader")) { process_osmheader(blob, data); } else if (!strcmp(header->type,"OSMData")) { process_osmdata(blob, data, osm); } else { printf("skipping fileblock of unknown type '%s'\n", header->type); return 0; } free(data); osmpbf__blob__free_unpacked(blob, &protobuf_c_system_allocator); osmpbf__blob_header__free_unpacked(header, &protobuf_c_system_allocator); } #if 0 printf("\n"); #endif return 1; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm_protobufdb.c000066400000000000000000000535571221777731700232030ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "file.h" #include "generated-code/fileformat.pb-c.h" #include "generated-code/osmformat.pb-c.h" static double latlon_scale=10000000.0; struct db_config { int node_ids_per_file; int node_ids_per_blob; int node_ids_per_group; int way_ids_per_file; int way_ids_per_blob; int way_ids_per_group; int relation_ids_per_file; int relation_ids_per_blob; int relation_ids_per_group; } db_config = { 200000, 30000, 500, 40000, 1000, 30, 10000, 500, 20, }; struct osm_protobufdb_context { int current_file, current_block, active_block; int in_node, in_way, in_relation; OSMPBF__Node n; OSMPBF__Way w; OSMPBF__Relation r; OSMPBF__Info i; FILE *f; OSMPBF__PrimitiveBlock *pb; OSMPBF__PrimitiveGroup *pg; GHashTable *string_hash; OSMPBF__DenseInfo *di; OSMPBF__DenseNodes *dn; OSMPBF__StringTable *st; } context; static int osm_protobufdb_write_blob(OSMPBF__Blob *blob, FILE *out) { unsigned char lenb[4]; int len,blen; unsigned char *buffer; OSMPBF__BlobHeader header=OSMPBF__BLOB_HEADER__INIT; blen=osmpbf__blob__get_packed_size(blob); header.type="OSMData"; header.datasize=blen; len=osmpbf__blob_header__get_packed_size(&header); buffer=alloca(len); lenb[0]=len>>24; lenb[1]=len>>16; lenb[2]=len>>8; lenb[3]=len; osmpbf__blob_header__pack(&header, buffer); if (fwrite(lenb, sizeof(lenb), 1, out) != 1) return 0; if (fwrite(buffer, len, 1, out) != 1) return 0; buffer=alloca(blen); osmpbf__blob__pack(blob, buffer); if (fwrite(buffer, blen, 1, out) != 1) return 0; return 1; } #if 0 void dump_block(OSMPBF__PrimitiveBlock *pb) { int i,j; printf("%d groups\n",pb->n_primitivegroup); for (i = 0 ; i < pb->n_primitivegroup ; i++) { printf("%d relations\n",pb->primitivegroup[i]->n_relations); for (j = 0 ; j < pb->primitivegroup[i]->n_relations ; j++) { printf("Info %d\n",pb->primitivegroup[i]->relations[j]->info->version); } } } #endif static int osm_protobufdb_finish_block(struct osm_protobufdb_context *ctx) { OSMPBF__Blob *blob,empty_blob=OSMPBF__BLOB__INIT; int len; if (!ctx->pb) return 0; len=osmpbf__primitive_block__get_packed_size(ctx->pb); while (ctx->current_block < ctx->active_block) { osm_protobufdb_write_blob(&empty_blob, ctx->f); ctx->current_block++; } blob=malloc(sizeof(*blob)); *blob=empty_blob; blob->has_raw=1; blob->has_raw_size=1; blob->raw.data=malloc(len); osmpbf__primitive_block__pack(ctx->pb, blob->raw.data); blob->raw.len=len; blob->raw_size=len; osm_protobufdb_write_blob(blob, ctx->f); osmpbf__blob__free_unpacked(blob, &protobuf_c_system_allocator); osmpbf__primitive_block__free_unpacked(ctx->pb, &protobuf_c_system_allocator); ctx->pb=NULL; ctx->current_block++; return 1; } static int osm_protobufdb_start_block(struct osm_protobufdb_context *ctx, int blocknum) { OSMPBF__PrimitiveBlock pb=OSMPBF__PRIMITIVE_BLOCK__INIT; OSMPBF__StringTable st=OSMPBF__STRING_TABLE__INIT; if (ctx->active_block == blocknum) return 0; osm_protobufdb_finish_block(ctx); ctx->active_block=blocknum; ctx->pb=malloc(sizeof(*ctx->pb)); *ctx->pb=pb; ctx->pb->stringtable=malloc(sizeof(*ctx->pb->stringtable)); *ctx->pb->stringtable=st; ctx->st=ctx->pb->stringtable; return 1; } static int osm_protobufdb_start_group(struct osm_protobufdb_context *ctx, int groupnum) { OSMPBF__PrimitiveGroup pg=OSMPBF__PRIMITIVE_GROUP__INIT; if (ctx->pb->n_primitivegroup <= groupnum) { ctx->pb->primitivegroup=realloc(ctx->pb->primitivegroup, (groupnum+1)*sizeof(ctx->pb->primitivegroup[0])); while (ctx->pb->n_primitivegroup <= groupnum) { ctx->pb->primitivegroup[ctx->pb->n_primitivegroup]=malloc(sizeof(*context.pg)); *ctx->pb->primitivegroup[ctx->pb->n_primitivegroup++]=pg; } g_hash_table_destroy(ctx->string_hash); ctx->string_hash=g_hash_table_new(g_str_hash, g_str_equal); } ctx->pg=ctx->pb->primitivegroup[groupnum]; if (!ctx->pg) { ctx->pg=malloc(sizeof(*context.pg)); *ctx->pg=pg; ctx->pb->primitivegroup[groupnum]=ctx->pg; } return 1; } #if 0 static int osm_protobufdb_start_densenode(struct osm_protobufdb_context *ctx) { OSMPBF__DenseInfo di=OSMPBF__DENSE_INFO__INIT; OSMPBF__DenseNodes dn=OSMPBF__DENSE_NODES__INIT; if (!ctx->pg->dense) { ctx->dn=malloc(sizeof(*context.dn)); *ctx->dn=dn; ctx->pg->dense=ctx->dn; } else ctx->dn=ctx->pg->dense; if (!ctx->dn->denseinfo) { ctx->di=malloc(sizeof(*context.di)); *ctx->di=di; ctx->dn->denseinfo=ctx->di; } else ctx->di=ctx->dn->denseinfo; return 1; } static void osm_protobufdb_write_primitive_group(OSMPBF__PrimitiveGroup *pg, OSMPBF__PrimitiveBlock *pb) { pb->primitivegroup=realloc(pb->primitivegroup,(pb->n_primitivegroup+1)*sizeof(OSMPBF__PrimitiveGroup *)); pb->primitivegroup[pb->n_primitivegroup++]=pg; } #endif #define insert(struct, member, pos) {\ int n=struct->n_##member; \ int s=sizeof(struct->member[0]); \ struct->member=realloc(struct->member, (n+1)*s); \ memmove(&struct->member[n+1], &struct->member[n], (pos-n)*s); \ memset(&struct->member[n], 0, s); \ struct->n_##member++;\ } #if 0 static int osm_protobufdb_insert_densenode(long long id, OSMPBF__Node *offset, OSMPBF__Info *offseti, OSMPBF__DenseNodes *dn) { int i,l,p; memset(offset, 0, sizeof(*offset)); offseti->timestamp=0; offseti->changeset=0; offseti->user_sid=0; offseti->uid=0; l=dn->n_id; for (i = 0 ; i < l ; i++) { offset->id+=dn->id[i]; offset->lat+=dn->lat[i]; offset->lon+=dn->lon[i]; offseti->timestamp+=dn->denseinfo->timestamp[i]; offseti->changeset+=dn->denseinfo->changeset[i]; offseti->user_sid+=dn->denseinfo->user_sid[i]; offseti->uid+=dn->denseinfo->uid[i]; } p=l; insert(dn, id, p); insert(dn, lat, p); insert(dn, lon, p); insert(dn->denseinfo, version, p); insert(dn->denseinfo, timestamp, p); insert(dn->denseinfo, changeset, p); insert(dn->denseinfo, user_sid, p); insert(dn->denseinfo, uid, p); return p; } static void osm_protobufdb_modify_densenode(OSMPBF__Node *node, OSMPBF__Info *info, OSMPBF__Node *offset, OSMPBF__Info *offseti, int pos, OSMPBF__DenseNodes *dn) { int i; if (pos+1 < dn->n_id) { dn->id[pos+1]+=dn->id[pos]-node->id; dn->lat[pos+1]+=dn->lat[pos]-node->lat; dn->lon[pos+1]+=dn->lon[pos]-node->lon; dn->denseinfo->timestamp[pos+1]+=dn->denseinfo->timestamp[pos]-info->timestamp; dn->denseinfo->changeset[pos+1]+=dn->denseinfo->changeset[pos]-info->changeset; dn->denseinfo->user_sid[pos+1]+=dn->denseinfo->user_sid[pos]-info->user_sid; dn->denseinfo->uid[pos+1]+=dn->denseinfo->uid[pos]-info->uid; } dn->id[pos]=node->id-offset->id; dn->lat[pos]=node->lat-offset->lat; dn->lon[pos]=node->lon-offset->lon; dn->keys_vals=realloc(dn->keys_vals, (dn->n_keys_vals+node->n_keys+node->n_vals+1)*sizeof(dn->keys_vals[0])); for (i = 0 ; i < node->n_keys ; i++) { dn->keys_vals[dn->n_keys_vals++]=node->keys[i]; dn->keys_vals[dn->n_keys_vals++]=node->vals[i]; } dn->keys_vals[dn->n_keys_vals++]=0; dn->denseinfo->version[pos]=info->version; dn->denseinfo->timestamp[pos]=info->timestamp-offseti->timestamp; dn->denseinfo->changeset[pos]=info->changeset-offseti->changeset; dn->denseinfo->user_sid[pos]=info->user_sid-offseti->user_sid; dn->denseinfo->uid[pos]=info->uid-offseti->uid; } #endif static int osm_protobufdb_insert_node(long long id, OSMPBF__PrimitiveGroup *pg) { int l,p; OSMPBF__Node node=OSMPBF__NODE__INIT; l=pg->n_nodes; p=l; insert(pg, nodes, p); pg->nodes[p]=malloc(sizeof(*pg->nodes[0])); *pg->nodes[p]=node; return p; } static void osm_protobufdb_modify_node(OSMPBF__Node *node, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) { OSMPBF__Node *n=pg->nodes[pos]; OSMPBF__Info *old_info; if (n->keys) free(n->keys); if (n->vals) free(n->vals); old_info=n->info; *n=*node; if (!info) { if (old_info) osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); n->info=NULL; } else { if (old_info) n->info=old_info; else n->info=malloc(sizeof(*info)); *n->info=*info; } } static int osm_protobufdb_insert_way(long long id, OSMPBF__PrimitiveGroup *pg) { int l,p; OSMPBF__Way way=OSMPBF__WAY__INIT; l=pg->n_ways; p=l; insert(pg, ways, p); pg->ways[p]=malloc(sizeof(*pg->ways[0])); *pg->ways[p]=way; return p; } static void osm_protobufdb_modify_way(OSMPBF__Way *way, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) { OSMPBF__Way *w=pg->ways[pos]; OSMPBF__Info *old_info; int i; long long ref=0; if (w->keys) free(w->keys); if (w->vals) free(w->vals); if (w->refs) free(w->refs); old_info=w->info; *w=*way; for (i = 0 ; i < w->n_refs ; i++) { w->refs[i]-=ref; ref+=w->refs[i]; } if (!info) { if (old_info) osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); w->info=NULL; } else { if (old_info) w->info=old_info; else w->info=malloc(sizeof(*info)); *w->info=*info; } } static int osm_protobufdb_insert_relation(long long id, OSMPBF__PrimitiveGroup *pg) { int l,p; OSMPBF__Relation relation=OSMPBF__RELATION__INIT; l=pg->n_relations; p=l; insert(pg, relations, p); pg->relations[p]=malloc(sizeof(*pg->relations[0])); *pg->relations[p]=relation; return p; } static void osm_protobufdb_modify_relation(OSMPBF__Relation *relation, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) { OSMPBF__Relation *r=pg->relations[pos]; OSMPBF__Info *old_info; int i; long long ref=0; if (r->keys) free(r->keys); if (r->vals) free(r->vals); if (r->roles_sid) free(r->roles_sid); if (r->memids) free(r->memids); if (r->types) free(r->types); old_info=r->info; *r=*relation; for (i = 0 ; i < r->n_memids ; i++) { r->memids[i]-=ref; ref+=r->memids[i]; } if (!info) { if (old_info) osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); r->info=NULL; } else { if (old_info) r->info=old_info; else r->info=malloc(sizeof(*info)); *r->info=*info; } } static int osm_protobufdb_string(struct osm_protobufdb_context *ctx, char *str) { char *strd; OSMPBF__StringTable *st=ctx->st; gpointer value; assert(ctx->string_hash != NULL); if (g_hash_table_lookup_extended(ctx->string_hash, str, NULL, &value)) { return (long)value; } if (!st->n_s) { st->n_s++; } strd=strdup(str); st->s=realloc(st->s, sizeof(st->s[0])*(st->n_s+1)); if (st->n_s == 1) { st->s[0].data=NULL; st->s[0].len=0; } st->s[st->n_s].data=(unsigned char *)strd; st->s[st->n_s].len=strlen(strd); g_hash_table_insert(ctx->string_hash, strd, (gpointer)st->n_s); return st->n_s++; } static int osm_protobufdb_finish_file(struct osm_protobufdb_context *ctx) { osm_protobufdb_finish_block(ctx); if (ctx->f) { fclose(ctx->f); ctx->f=NULL; } ctx->current_file=-1; return 1; } static int osm_protobufdb_start_file(struct osm_protobufdb_context *ctx, int type, int num) { char name[1024]; if (ctx->current_file == num) return 0; osm_protobufdb_finish_file(ctx); sprintf(name,"tst/%d-%08d",type,num); ctx->f=fopen(name,"w"); ctx->current_file=num; ctx->current_block=0; ctx->active_block=-1; return 1; } static void test(void) { #if 0 struct node n,o; long long id=1; long long lat=0; long long lon=0; long long timestamp=0; long long changeset=0; int version=1; int user_sid=0; int uid=0; int p; n.id=1; #endif #if 0 OSMPBF__DenseInfo di=OSMPBF__DENSE_INFO__INIT; OSMPBF__DenseNodes dn=OSMPBF__DENSE_NODES__INIT; #endif context.current_file=-1; #if 0 context.di=malloc(sizeof(*context.di)); *context.di=di; context.dn=malloc(sizeof(*context.dn)); *context.dn=dn; #endif #if 0 di.n_version=1; di.version=&version; di.n_timestamp=1; di.timestamp=×tamp; di.n_changeset=1; di.changeset=&changeset; di.n_user_sid=1; di.user_sid=&user_sid; di.n_uid=1; di.uid=&uid; #endif #if 0 n.id=1; n.lat=1; n.lon=1; n.timestamp=1; n.changeset=1; n.version=1; n.user_sid=0; n.uid=0; p=osm_protobufdb_insert_densenode(&n.id, &o, &dn); osm_protobufdb_modify(&n, &o, p, &dn); p=osm_protobufdb_insert_densenode(&n.id, &o, &dn); osm_protobufdb_modify(&n, &o, p, &dn); #endif #if 0 dn.n_id=1; dn.id=&id; dn.n_lat=1; dn.lat=⪫ dn.n_lon=1; dn.lon=&lon; #endif #if 0 st.n_s=1; data.data="Test"; data.len=4; st.s=&data; #endif } static void finish(void) { osm_protobufdb_finish_file(&context); #if 0 osm_protobufdb_write_primitive_group(context.pg, context.pb); osm_protobufdb_write_primitive_block(context.pb, context.blob); osm_protobufdb_write_blob_to_file(); #endif } static long long osm_protobufdb_timestamp(char *str) { struct tm tm; int res=sscanf(str,"%d-%d-%dT%d:%d:%dZ",&tm.tm_year,&tm.tm_mon,&tm.tm_mday,&tm.tm_hour,&tm.tm_min,&tm.tm_sec); if (res != 6) return 0; tm.tm_year-=1900; tm.tm_mon-=1; #if defined(HAVE_API_WIN32_BASE) || defined(ANDROID) return 0; #else return timegm(&tm); #endif } static void osm_protobufdb_parse_info(struct osm_protobufdb_context *ctx, char *str) { char version[1024]; char changeset[1024]; char user[1024]; char uid[1024]; char timestamp[1024]; OSMPBF__Info *i=&ctx->i, ii=OSMPBF__INFO__INIT; *i=ii; if (osm_xml_get_attribute(str, "version", version, sizeof(version))) { i->version=atoi(version); i->has_version=1; } if (osm_xml_get_attribute(str, "changeset", changeset, sizeof(changeset))) { i->changeset=atoll(changeset); i->has_changeset=1; } if (osm_xml_get_attribute(str, "user", user, sizeof(user))) { osm_xml_decode_entities(user); i->user_sid=osm_protobufdb_string(ctx, user); i->has_user_sid=1; } if (osm_xml_get_attribute(str, "uid", uid, sizeof(uid))) { i->uid=atoi(uid); i->has_uid=1; } if (osm_xml_get_attribute(str, "timestamp", timestamp, sizeof(timestamp))) { i->timestamp=osm_protobufdb_timestamp(timestamp); i->has_timestamp=1; } } static int osm_protobufdb_parse_node(struct osm_protobufdb_context *ctx, char *str) { char id[1024]; char lat[1024]; char lon[1024]; OSMPBF__Node *n=&ctx->n, ni=OSMPBF__NODE__INIT; *n=ni; if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) return 0; if (!osm_xml_get_attribute(str, "lat", lat, sizeof(lat))) return 0; if (!osm_xml_get_attribute(str, "lon", lon, sizeof(lon))) return 0; n->id=atoll(id); n->lat=atof(lat)*latlon_scale+0.5; n->lon=atof(lon)*latlon_scale+0.5; int file=n->id/db_config.node_ids_per_file; int fileo=n->id%db_config.node_ids_per_file; int blob=fileo/db_config.node_ids_per_blob; int blobo=fileo%db_config.node_ids_per_blob; int group=blobo/db_config.node_ids_per_group; osm_protobufdb_start_file(ctx, 1, file); osm_protobufdb_start_block(ctx, blob); osm_protobufdb_start_group(ctx, group); osm_protobufdb_parse_info(ctx, str); ctx->in_node=1; return 1; } static int osm_protobufdb_end_node(struct osm_protobufdb_context *ctx) { int p; #if 0 OSMPBF__Node *n=&ctx->n,offset; OSMPBF__Info *i=&ctx->i,offseti; osm_protobufdb_start_densenode(ctx); p=osm_protobufdb_insert_densenode(n->id, &offset, &offseti, context.dn); osm_protobufdb_modify_densenode(n, i, &offset, &offseti, p, context.dn); #else p=osm_protobufdb_insert_node(ctx->n.id, ctx->pg); osm_protobufdb_modify_node(&ctx->n, &ctx->i, p, ctx->pg); #endif ctx->in_node=0; return 1; } static int osm_protobufdb_parse_way(struct osm_protobufdb_context *ctx, char *str) { char id[1024]; OSMPBF__Way *w=&ctx->w, wi=OSMPBF__WAY__INIT; *w=wi; if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) return 0; w->id=atoll(id); int file=w->id/db_config.way_ids_per_file; int fileo=w->id%db_config.way_ids_per_file; int blob=fileo/db_config.way_ids_per_blob; int blobo=fileo%db_config.way_ids_per_blob; int group=blobo/db_config.way_ids_per_group; osm_protobufdb_start_file(ctx, 2, file); osm_protobufdb_start_block(ctx, blob); osm_protobufdb_start_group(ctx, group); osm_protobufdb_parse_info(ctx, str); ctx->in_way=1; return 1; } static int osm_protobufdb_end_way(struct osm_protobufdb_context *ctx) { int p; p=osm_protobufdb_insert_way(ctx->w.id, ctx->pg); osm_protobufdb_modify_way(&ctx->w, &ctx->i, p, ctx->pg); ctx->in_way=0; return 1; } static int osm_protobufdb_parse_relation(struct osm_protobufdb_context *ctx, char *str) { char id[1024]; OSMPBF__Relation *r=&ctx->r, ri=OSMPBF__RELATION__INIT; *r=ri; if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) return 0; r->id=atoll(id); int file=r->id/db_config.relation_ids_per_file; int fileo=r->id%db_config.relation_ids_per_file; int blob=fileo/db_config.relation_ids_per_blob; int blobo=fileo%db_config.relation_ids_per_blob; int group=blobo/db_config.relation_ids_per_group; osm_protobufdb_start_file(ctx, 3, file); osm_protobufdb_start_block(ctx, blob); osm_protobufdb_start_group(ctx, group); osm_protobufdb_parse_info(ctx, str); ctx->in_relation=1; return 1; } static int osm_protobufdb_end_relation(struct osm_protobufdb_context *ctx) { int p; p=osm_protobufdb_insert_relation(ctx->r.id, ctx->pg); osm_protobufdb_modify_relation(&ctx->r, &ctx->i, p, ctx->pg); ctx->in_node=0; return 1; } static int osm_protobufdb_parse_tag(struct osm_protobufdb_context *ctx, char *str) { OSMPBF__Node *n=&ctx->n; OSMPBF__Way *w=&ctx->w; OSMPBF__Relation *r=&ctx->r; char k_buffer[BUFFER_SIZE]; char v_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(str, "k", k_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(str, "v", v_buffer, BUFFER_SIZE)) return 0; osm_xml_decode_entities(v_buffer); if (ctx->in_node) { n->keys=realloc(n->keys, (n->n_keys+1)*sizeof(n->keys[0])); n->vals=realloc(n->vals, (n->n_vals+1)*sizeof(n->vals[0])); n->keys[n->n_keys++]=osm_protobufdb_string(ctx, k_buffer); n->vals[n->n_vals++]=osm_protobufdb_string(ctx, v_buffer); } if (ctx->in_way) { w->keys=realloc(w->keys, (w->n_keys+1)*sizeof(w->keys[0])); w->vals=realloc(w->vals, (w->n_vals+1)*sizeof(w->vals[0])); w->keys[w->n_keys++]=osm_protobufdb_string(ctx, k_buffer); w->vals[w->n_vals++]=osm_protobufdb_string(ctx, v_buffer); } if (ctx->in_relation) { r->keys=realloc(r->keys, (r->n_keys+1)*sizeof(r->keys[0])); r->vals=realloc(r->vals, (r->n_vals+1)*sizeof(r->vals[0])); r->keys[r->n_keys++]=osm_protobufdb_string(ctx, k_buffer); r->vals[r->n_vals++]=osm_protobufdb_string(ctx, v_buffer); } return 1; } static int osm_protobufdb_parse_nd(struct osm_protobufdb_context *ctx, char *str) { OSMPBF__Way *w=&ctx->w; char ref_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(str, "ref", ref_buffer, BUFFER_SIZE)) return 0; if (ctx->in_way) { w->refs=realloc(w->refs, (w->n_refs+1)*sizeof(w->refs[0])); w->refs[w->n_refs++]=atoll(ref_buffer); } return 1; } static int osm_protobufdb_parse_member(struct osm_protobufdb_context *ctx, char *str) { OSMPBF__Relation *r=&ctx->r; char type_buffer[BUFFER_SIZE]; char ref_buffer[BUFFER_SIZE]; char role_buffer[BUFFER_SIZE]; int type=0; if (!osm_xml_get_attribute(str, "type", type_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(str, "ref", ref_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(str, "role", role_buffer, BUFFER_SIZE)) return 0; if (!strcmp(type_buffer,"node")) type=0; else if (!strcmp(type_buffer,"way")) type=1; else if (!strcmp(type_buffer,"relation")) type=2; if (ctx->in_relation) { r->roles_sid=realloc(r->roles_sid, (r->n_roles_sid+1)*sizeof(r->roles_sid[0])); r->roles_sid[r->n_roles_sid++]=osm_protobufdb_string(ctx, role_buffer); r->memids=realloc(r->memids, (r->n_memids+1)*sizeof(r->memids[0])); r->memids[r->n_memids++]=atoll(ref_buffer); r->types=realloc(r->types, (r->n_types+1)*sizeof(r->types[0])); r->types[r->n_types++]=type; } return 1; } int osm_protobufdb_load(FILE *in, char *dir) { int size=BUFFER_SIZE; char buffer[size]; char *p; sig_alrm(0); test(); while (fgets(buffer, size, in)) { int closed=strstr(buffer,"/>")?1:0; p=strchr(buffer,'<'); if (! p) { fprintf(stderr,"WARNING: wrong line %s\n", buffer); continue; } if (!strncmp(p, "",7)) { osm_protobufdb_end_node(&context); } else if (!strncmp(p, "",6)) { osm_protobufdb_end_way(&context); } else if (!strncmp(p, "",11)) { osm_protobufdb_end_relation(&context); } else if (!strncmp(p, "",6)) { } else { fprintf(stderr,"WARNING: unknown tag in %s\n", buffer); } } finish(); return 1; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm_psql.c000066400000000000000000000120021221777731700217700ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "file.h" #ifdef HAVE_POSTGRESQL #include int map_collect_data_osm_db(char *dbstr, struct maptool_osm *osm) { PGconn *conn; PGresult *res,*node,*way,*tag; int count,tagged,i,j,k; long min, max, id, tag_id, node_id; char query[256]; sig_alrm(0); conn=PQconnectdb(dbstr); if (! conn) { fprintf(stderr,"Failed to connect to database with '%s'\n",dbstr); exit(1); } res=PQexec(conn, "begin"); if (! res) { fprintf(stderr, "Cannot begin transaction: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "set transaction isolation level serializable"); if (! res) { fprintf(stderr, "Cannot set isolation level: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "declare node cursor for select id,x(coordinate),y(coordinate) from node order by id"); if (! res) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "declare way cursor for select id from way order by id"); if (! res) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "declare relation cursor for select id from relation order by id"); if (! res) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } for (;;) { node=PQexec(conn, "fetch 100000 from node"); if (! node) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(node); exit(1); } count=PQntuples(node); if (! count) break; min=atol(PQgetvalue(node, 0, 0)); max=atol(PQgetvalue(node, count-1, 0)); sprintf(query,"select node_id,name,value from node_tag where node_id >= %ld and node_id <= %ld order by node_id", min, max); tag=PQexec(conn, query); if (! tag) { fprintf(stderr, "Cannot query node_tag: %s\n", PQerrorMessage(conn)); exit(1); } j=0; for (i = 0 ; i < count ; i++) { id=atol(PQgetvalue(node, i, 0)); osm_add_node(id, atof(PQgetvalue(node, i, 1)), atof(PQgetvalue(node, i, 2))); tagged=0; processed_nodes++; while (j < PQntuples(tag)) { tag_id=atol(PQgetvalue(tag, j, 0)); if (tag_id == id) { osm_add_tag(PQgetvalue(tag, j, 1), PQgetvalue(tag, j, 2)); tagged=1; j++; } if (tag_id < id) j++; if (tag_id > id) break; } osm_end_node(osm); } PQclear(tag); PQclear(node); } for (;;) { way=PQexec(conn, "fetch 100000 from way"); if (! way) { fprintf(stderr, "Cannot setup cursor for ways: %s\n", PQerrorMessage(conn)); PQclear(node); exit(1); } count=PQntuples(way); if (! count) break; min=atol(PQgetvalue(way, 0, 0)); max=atol(PQgetvalue(way, count-1, 0)); sprintf(query,"select way_id,node_id from way_node where way_id >= %ld and way_id <= %ld order by way_id,sequence_id", min, max); node=PQexec(conn, query); if (! node) { fprintf(stderr, "Cannot query way_node: %s\n", PQerrorMessage(conn)); exit(1); } sprintf(query,"select way_id,name,value from way_tag where way_id >= %ld and way_id <= %ld order by way_id", min, max); tag=PQexec(conn, query); if (! tag) { fprintf(stderr, "Cannot query way_tag: %s\n", PQerrorMessage(conn)); exit(1); } j=0; k=0; for (i = 0 ; i < count ; i++) { id=atol(PQgetvalue(way, i, 0)); osm_add_way(id); tagged=0; processed_ways++; while (k < PQntuples(node)) { node_id=atol(PQgetvalue(node, k, 0)); if (node_id == id) { osm_add_nd(atoll(PQgetvalue(node, k, 1))); tagged=1; k++; } if (node_id < id) k++; if (node_id > id) break; } while (j < PQntuples(tag)) { tag_id=atol(PQgetvalue(tag, j, 0)); if (tag_id == id) { osm_add_tag(PQgetvalue(tag, j, 1), PQgetvalue(tag, j, 2)); tagged=1; j++; } if (tag_id < id) j++; if (tag_id > id) break; } if (tagged) osm_end_way(osm); } PQclear(tag); PQclear(node); PQclear(way); } res=PQexec(conn, "commit"); if (! res) { fprintf(stderr, "Cannot commit transaction: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } sig_alrm(0); sig_alrm_end(); return 1; } #endif navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm_relations.c000066400000000000000000000125201221777731700230160ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #include "attr.h" struct relations { GHashTable *member_hash[3]; GList *default_members; }; struct relations_func { void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv); void *func_priv; }; struct relations_member { osmid memberid; void *relation_priv,*member_priv; struct relations_func *func; }; static guint relations_member_hash(gconstpointer key) { const struct relations_member *memb=key; return (memb->memberid >> 32)^(memb->memberid & 0xffffffff); } static gboolean relations_member_equal(gconstpointer a, gconstpointer b) { const struct relations_member *memba=a; const struct relations_member *membb=b; return (memba->memberid == membb->memberid); } struct relations * relations_new(void) { struct relations *ret=g_new0(struct relations, 1); int i; for (i = 0 ; i < 3 ; i++) ret->member_hash[i]=g_hash_table_new_full(relations_member_hash, relations_member_equal, NULL, NULL); return ret; } struct relations_func * relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv) { struct relations_func *relations_func=g_new(struct relations_func, 1); relations_func->func=func; relations_func->func_priv=func_priv; return relations_func; } /* * @brief Add a relation member to relations collection. * @param in rel relations collection to add the new member to. * @param in funct structure defining function to call when this member is read * @param in relation_priv parameter describing relation. Will be passed to funct function * @param in member_priv parameter describing member function. Will be passed to funct function * @param in type This member type: 1 - node, 2 - way, 3 - relation. * Set to -1 to add a default member action which matches any item of any type which is not a member of any relation. * @param in osmid This member id * @param unused relations */ void relations_add_func(struct relations *rel, struct relations_func *func, void *relation_priv, void *member_priv, int type, osmid id) { struct relations_member *memb=g_new(struct relations_member, 1); memb->memberid=id; memb->relation_priv=relation_priv; memb->member_priv=member_priv; memb->func=func; if(type>0) { GHashTable *member_hash=rel->member_hash[type-1]; g_hash_table_insert(member_hash, memb, g_list_append(g_hash_table_lookup(member_hash, memb), memb)); } else rel->default_members=g_list_append(rel->default_members, memb); } /* * @brief Process relations members from the file. * @param in rel struct relations storing pre-processed relations info * @param in nodes file containing nodes in "coords.tmp" format * @param in ways file containing items in item_bin format. This file may contain both nodes, ways, and relations in that format. * @param unused relations */ void relations_process(struct relations *rel, FILE *nodes, FILE *ways, FILE *relations) { char buffer[128]; struct item_bin *ib=(struct item_bin *)buffer; long long *id; struct coord *c=(struct coord *)(ib+1),cn={0,0}; struct node_item *ni; GList *l; if (nodes) { item_bin_init(ib, type_point_unkn); item_bin_add_coord(ib, &cn, 1); item_bin_add_attr_longlong(ib, attr_osm_nodeid, 0); id=item_bin_get_attr(ib, attr_osm_nodeid, NULL); while ((ni=read_node_item(nodes))) { *id=ni->id; *c=ni->c; l=g_hash_table_lookup(rel->member_hash[0], id); while (l) { struct relations_member *memb=l->data; memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); l=g_list_next(l); } } } if (ways) { while ((ib=read_item(ways))) { l=NULL; if(NULL!=(id=item_bin_get_attr(ib, attr_osm_nodeid, NULL))) l=g_hash_table_lookup(rel->member_hash[0], id); else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_wayid, NULL))) l=g_hash_table_lookup(rel->member_hash[1], id); else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_relationid, NULL))) l=g_hash_table_lookup(rel->member_hash[2], id); if(!l) l=rel->default_members; while (l) { struct relations_member *memb=l->data; memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); l=g_list_next(l); } } } } static void relations_destroy_func(void *key, GList *l, void *data) { GList *ll=l; while (ll) { g_free(ll->data); ll=g_list_next(ll); } g_list_free(l); } void relations_destroy(struct relations *relations) { int i; for (i = 0 ; i < 3 ; i++) { g_hash_table_foreach(relations->member_hash[i], (GHFunc)relations_destroy_func, NULL); g_hash_table_destroy(relations->member_hash[i]); } g_free(relations); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osm_xml.c000066400000000000000000000137221221777731700216230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #ifdef _MSC_VER #define atoll _atoi64 #else #include #endif #include "maptool.h" int osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size) { int len=strlen(attribute); char *pos,*i,s,*attr; attr=g_alloca(len+2); strcpy(attr, attribute); strcpy(attr+len, "="); pos=strstr(xml, attr); if (! pos) return 0; pos+=len+1; s=*pos++; if (! s) return 0; i=strchr(pos, s); if (! i) return 0; if (i - pos > buffer_size) { fprintf(stderr,"Buffer overflow %ld vs %d\n", (long)(i-pos), buffer_size); return 0; } strncpy(buffer, pos, i-pos); buffer[i-pos]='\0'; return 1; } static struct entity { char *entity; char c; } entities[]= { {""",'"'}, {"'",'\''}, {"&",'&'}, {"<",'<'}, {">",'>'}, {""",'"'}, {"'",'\''}, {"&",'&'}, {"<",'<'}, {">",'>'}, {"{",'{'}, {"}",'}'}, }; void osm_xml_decode_entities(char *buffer) { char *pos=buffer; int i,len; while ((pos=strchr(pos, '&'))) { for (i = 0 ; i < sizeof(entities)/sizeof(struct entity); i++) { len=strlen(entities[i].entity); if (!strncmp(pos, entities[i].entity, len)) { *pos=entities[i].c; memmove(pos+1, pos+len, strlen(pos+len)+1); break; } } pos++; } } static int parse_tag(char *p) { char k_buffer[BUFFER_SIZE]; char v_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "k", k_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "v", v_buffer, BUFFER_SIZE)) return 0; osm_xml_decode_entities(v_buffer); osm_add_tag(k_buffer, v_buffer); return 1; } static int parse_node(char *p) { char id_buffer[BUFFER_SIZE]; char lat_buffer[BUFFER_SIZE]; char lon_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "lat", lat_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "lon", lon_buffer, BUFFER_SIZE)) return 0; osm_add_node(atoll(id_buffer), atof(lat_buffer), atof(lon_buffer)); return 1; } static int parse_way(char *p) { char id_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) return 0; osm_add_way(atoll(id_buffer)); return 1; } static int parse_relation(char *p) { char id_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) return 0; osm_add_relation(atoll(id_buffer)); return 1; } static int parse_member(char *p) { char type_buffer[BUFFER_SIZE]; char ref_buffer[BUFFER_SIZE]; char role_buffer[BUFFER_SIZE]; int type; if (!osm_xml_get_attribute(p, "type", type_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "role", role_buffer, BUFFER_SIZE)) return 0; if (!strcmp(type_buffer,"node")) type=1; else if (!strcmp(type_buffer,"way")) type=2; else if (!strcmp(type_buffer,"relation")) type=3; else { fprintf(stderr,"Unknown type %s\n",type_buffer); type=0; } osm_add_member(type, atoll(ref_buffer), role_buffer); return 1; } static int parse_nd(char *p) { char ref_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE)) return 0; osm_add_nd(atoll(ref_buffer)); return 1; } static int xml_declaration_in_line(char* buffer){ return !strncmp(buffer, "",7)) { osm_end_node(osm); } else if (!strncmp(p, "",6)) { osm_end_way(osm); } else if (!strncmp(p, "",11)) { osm_end_relation(osm); } else if (!strncmp(p, "",6)) { } else { fprintf(stderr,"WARNING: unknown tag in %s\n", buffer); } } sig_alrm(0); sig_alrm_end(); return 1; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/osmformat.proto000066400000000000000000000143661221777731700231020ustar00rootroot00000000000000option java_package = "crosby.binary"; package OSMPBF; /* OSM Binary file format This is the master schema file of the OSM binary file format. This file is designed to support limited random-access and future extendability. A binary OSM file consists of a sequence of FileBlocks (please see fileformat.proto). The first fileblock contains a serialized instance of HeaderBlock, followed by a sequence of PrimitiveBlock blocks that contain the primitives. Each primitiveblock is designed to be independently parsable. It contains a string table storing all strings in that block (keys and values in tags, roles in relations, usernames, etc.) as well as metadata containing the precision of coordinates or timestamps in that block. A primitiveblock contains a sequence of primitive groups, each containing primitives of the same type (nodes, densenodes, ways, relations). Coordinates are stored in signed 64-bit integers. Lat&lon are measured in units nanodegrees. The default of granularity of 100 nanodegrees corresponds to about 1cm on the ground, and a full lat or lon fits into 32 bits. Converting an integer to a lattitude or longitude uses the formula: $OUT = IN * granularity / 10**9$. Many encoding schemes use delta coding when representing nodes and relations. */ ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// /* Contains the file header. */ message HeaderBlock { optional HeaderBBox bbox = 1; /* Additional tags to aid in parsing this dataset */ repeated string required_features = 4; repeated string optional_features = 5; optional string writingprogram = 16; optional string source = 17; // From the bbox field. } /** The bounding box field in the OSM header. BBOX, as used in the OSM header. Units are always in nanodegrees -- they do not obey granularity rules. */ message HeaderBBox { required sint64 left = 1; required sint64 right = 2; required sint64 top = 3; required sint64 bottom = 4; } /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// message PrimitiveBlock { required StringTable stringtable = 1; repeated PrimitiveGroup primitivegroup = 2; // Granularity, units of nanodegrees, used to store coordinates in this block optional int32 granularity = 17 [default=100]; // Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees. optional int64 lat_offset = 19 [default=0]; optional int64 lon_offset = 20 [default=0]; // Granularity of dates, normally represented in units of milliseconds since the 1970 epoch. optional int32 date_granularity = 18 [default=1000]; // Proposed extension: //optional BBox bbox = XX; } // Group of OSMPrimitives. All primitives in a group must be the same type. message PrimitiveGroup { repeated Node nodes = 1; optional DenseNodes dense = 2; repeated Way ways = 3; repeated Relation relations = 4; repeated ChangeSet changesets = 5; } /** String table, contains the common strings in each block. Note that we reserve index '0' as a delimiter, so the entry at that index in the table is ALWAYS blank and unused. */ message StringTable { repeated bytes s = 1; } /* Optional metadata that may be included into each primitive. */ message Info { optional int32 version = 1 [default = -1]; optional int64 timestamp = 2; optional int64 changeset = 3; optional int32 uid = 4; optional uint32 user_sid = 5; // String IDs } /** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. */ message DenseInfo { repeated int32 version = 1 [packed = true]; repeated sint64 timestamp = 2 [packed = true]; // DELTA coded repeated sint64 changeset = 3 [packed = true]; // DELTA coded repeated sint32 uid = 4 [packed = true]; // DELTA coded repeated sint32 user_sid = 5 [packed = true]; // String IDs for usernames. DELTA coded } // THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW. // TODO: REMOVE THIS? message ChangeSet { required int64 id = 1; // // // Parallel arrays. // repeated uint32 keys = 2 [packed = true]; // String IDs. // repeated uint32 vals = 3 [packed = true]; // String IDs. // // optional Info info = 4; // optional int64 created_at = 8; // optional int64 closetime_delta = 9; // optional bool open = 10; // optional HeaderBBox bbox = 11; } message Node { required sint64 id = 1; // Parallel arrays. repeated uint32 keys = 2 [packed = true]; // String IDs. repeated uint32 vals = 3 [packed = true]; // String IDs. optional Info info = 4; // May be omitted in omitmeta required sint64 lat = 8; required sint64 lon = 9; } /* Used to densly represent a sequence of nodes that do not have any tags. We represent these nodes columnwise as five columns: ID's, lats, and lons, all delta coded. When metadata is not omitted, We encode keys & vals for all nodes as a single array of integers containing key-stringid and val-stringid, using a stringid of 0 as a delimiter between nodes. ( ( )* '0' )* */ message DenseNodes { repeated sint64 id = 1 [packed = true]; // DELTA coded //repeated Info info = 4; optional DenseInfo denseinfo = 5; repeated sint64 lat = 8 [packed = true]; // DELTA coded repeated sint64 lon = 9 [packed = true]; // DELTA coded // Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless. repeated int32 keys_vals = 10 [packed = true]; } message Way { required int64 id = 1; // Parallel arrays. repeated uint32 keys = 2 [packed = true]; repeated uint32 vals = 3 [packed = true]; optional Info info = 4; repeated sint64 refs = 8 [packed = true]; // DELTA coded } message Relation { enum MemberType { NODE = 0; WAY = 1; RELATION = 2; } required int64 id = 1; // Parallel arrays. repeated uint32 keys = 2 [packed = true]; repeated uint32 vals = 3 [packed = true]; optional Info info = 4; // Parallel arrays repeated int32 roles_sid = 8 [packed = true]; repeated sint64 memids = 9 [packed = true]; // DELTA encoded repeated MemberType types = 10 [packed = true]; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/sourcesink.c000066400000000000000000000101071221777731700223240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "coord.h" #include "item.h" #include "attr.h" #include "maptool.h" struct item_bin_sink * item_bin_sink_new(void) { struct item_bin_sink *ret=g_new0(struct item_bin_sink, 1); return ret; } struct item_bin_sink_func * item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)) { struct item_bin_sink_func *ret=g_new0(struct item_bin_sink_func, 1); ret->func=func; return ret; } void item_bin_sink_func_destroy(struct item_bin_sink_func *func) { g_free(func); } void item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func) { sink->sink_funcs=g_list_append(sink->sink_funcs, func); } void item_bin_sink_destroy(struct item_bin_sink *sink) { /* g_list_foreach(sink->sink_funcs, (GFunc)g_free, NULL); */ g_list_free(sink->sink_funcs); g_free(sink); } int item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data) { GList *list=sink->sink_funcs; int ret=0; while (list) { struct item_bin_sink_func *func=list->data; ret=func->func(func, ib, tile_data); if (ret) break; list=g_list_next(list); } return ret; } struct item_bin_sink * file_reader_new(FILE *in, int limit, int offset) { struct item_bin_sink *ret; if (!in) return NULL; ret=item_bin_sink_new(); ret->priv_data[0]=in; ret->priv_data[1]=(void *)(long)limit; ret->priv_data[2]=(void *)(long)offset; fseek(in, 0, SEEK_SET); return ret; } int file_reader_finish(struct item_bin_sink *sink) { struct item_bin *ib; int ret =0; FILE *in=sink->priv_data[0]; int limit=(int)(long)sink->priv_data[1]; int offset=(int)(long)sink->priv_data[2]; while ((ib=read_item(in))) { if (offset > 0) { offset--; } else { ret=item_bin_write_to_sink(ib, sink, NULL); if (ret || (limit != -1 && !--limit)) { item_bin_sink_destroy(sink); return ret; } } } item_bin_sink_destroy(sink); return 0; } int file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data) { FILE *out=func->priv_data[0]; item_bin_write(ib, out); return 0; } struct item_bin_sink_func * file_writer_new(FILE *out) { struct item_bin_sink_func *file_writer; if (!out) return NULL; file_writer=item_bin_sink_func_new(file_writer_process); file_writer->priv_data[0]=out; return file_writer; } int file_writer_finish(struct item_bin_sink_func *file_writer) { item_bin_sink_func_destroy(file_writer); return 0; } int tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data) { int *buffer,*buffer2; int len=ib->len+1; GHashTable *hash=tile_collector->priv_data[0]; buffer=g_hash_table_lookup(hash, tile_data->buffer); buffer2=g_malloc((len+(buffer ? buffer[0] : 1))*4); if (buffer) { memcpy(buffer2, buffer, buffer[0]*4); } else buffer2[0]=1; memcpy(buffer2+buffer2[0], ib, len*4); buffer2[0]+=len; g_hash_table_insert(hash, g_strdup(tile_data->buffer), buffer2); return 0; } struct item_bin_sink_func * tile_collector_new(struct item_bin_sink *out) { struct item_bin_sink_func *tile_collector; tile_collector=item_bin_sink_func_new(tile_collector_process); tile_collector->priv_data[0]=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); tile_collector->priv_data[1]=out; return tile_collector; } navit-0.5.0~svn5643+dfsg.1/navit/maptool/tempfile.c000066400000000000000000000031131221777731700217430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef _MSC_VER #include #endif #include "maptool.h" #include "debug.h" char * tempfile_name(char *suffix, char *name) { return g_strdup_printf("%s_%s.tmp",name, suffix); } FILE * tempfile(char *suffix, char *name, int mode) { char *buffer=tempfile_name(suffix, name); FILE *ret=NULL; switch (mode) { case 0: ret=fopen(buffer, "rb"); break; case 1: ret=fopen(buffer, "wb+"); break; case 2: ret=fopen(buffer, "ab"); break; } g_free(buffer); return ret; } void tempfile_unlink(char *suffix, char *name) { char buffer[4096]; sprintf(buffer,"%s_%s.tmp",name, suffix); unlink(buffer); } void tempfile_rename(char *suffix, char *from, char *to) { char buffer_from[4096],buffer_to[4096]; sprintf(buffer_from,"%s_%s.tmp",from,suffix); sprintf(buffer_to,"%s_%s.tmp",to,suffix); dbg_assert(rename(buffer_from, buffer_to) == 0); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/tile.c000066400000000000000000000401541221777731700211010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #ifndef _MSC_VER #include #include #endif #include #include #include #include "file.h" #include "item.h" #include "map.h" #include "zipfile.h" #include "main.h" #include "config.h" #include "linguistics.h" #include "plugin.h" #include "maptool.h" GList *aux_tile_list; struct tile_head *tile_head_root; GHashTable *strings_hash,*tile_hash,*tile_hash2; static char* string_hash_lookup( const char* key ) { char* key_ptr = NULL; if ( strings_hash == NULL ) { strings_hash = g_hash_table_new(g_str_hash, g_str_equal); } if ( ( key_ptr = g_hash_table_lookup(strings_hash, key )) == NULL ) { key_ptr = g_strdup( key ); g_hash_table_insert(strings_hash, key_ptr, (gpointer)key_ptr ); } return key_ptr; } static char** th_get_subtile( const struct tile_head* th, int idx ) { char* subtile_ptr = NULL; subtile_ptr = (char*)th + sizeof( struct tile_head ) + idx * sizeof( char *); return (char**)subtile_ptr; } int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr) { int x0,x2,x4; int y0,y2,y4; int xo,yo; int i; x0=world_bbox.l.x; y0=world_bbox.l.y; x4=world_bbox.h.x; y4=world_bbox.h.y; for (i = 0 ; i < max ; i++) { x2=(x0+x4)/2; y2=(y0+y4)/2; xo=(x4-x0)*overlap/100; yo=(y4-y0)*overlap/100; if ( contains_bbox(x0,y0,x2+xo,y2+yo,r)) { strcat(ret,"d"); x4=x2+xo; y4=y2+yo; } else if (contains_bbox(x2-xo,y0,x4,y2+yo,r)) { strcat(ret,"c"); x0=x2-xo; y4=y2+yo; } else if (contains_bbox(x0,y2-yo,x2+xo,y4,r)) { strcat(ret,"b"); x4=x2+xo; y0=y2-yo; } else if (contains_bbox(x2-xo,y2-yo,x4,y4,r)) { strcat(ret,"a"); x0=x2-xo; y0=y2-yo; } else break; } if (tr) { tr->l.x=x0; tr->l.y=y0; tr->h.x=x4; tr->h.y=y4; } if (suffix) strcat(ret,suffix); return i; } void tile_bbox(char *tile, struct rect *r, int overlap) { struct coord c; int xo,yo; *r=world_bbox; while (*tile) { c.x=(r->l.x+r->h.x)/2; c.y=(r->l.y+r->h.y)/2; xo=(r->h.x-r->l.x)*overlap/100; yo=(r->h.y-r->l.y)*overlap/100; switch (*tile) { case 'a': r->l.x=c.x-xo; r->l.y=c.y-yo; break; case 'b': r->h.x=c.x+xo; r->l.y=c.y-yo; break; case 'c': r->l.x=c.x-xo; r->h.y=c.y+yo; break; case 'd': r->h.x=c.x+xo; r->h.y=c.y+yo; break; } tile++; } } int tile_len(char *tile) { int ret=0; while (tile[0] >= 'a' && tile[0] <= 'd') { tile++; ret++; } return ret; } static void tile_extend(char *tile, struct item_bin *ib, GList **tiles_list) { struct tile_head *th=NULL; if (debug_tile(tile)) fprintf(stderr,"Tile:Writing %d bytes to '%s' (%p,%p) 0x%x "LONGLONG_FMT"\n", (ib->len+1)*4, tile, g_hash_table_lookup(tile_hash, tile), tile_hash2 ? g_hash_table_lookup(tile_hash2, tile) : NULL, ib->type, item_bin_get_id(ib)); if (tile_hash2) th=g_hash_table_lookup(tile_hash2, tile); if (!th) th=g_hash_table_lookup(tile_hash, tile); if (! th) { th=malloc(sizeof(struct tile_head)+ sizeof( char* ) ); assert(th != NULL); // strcpy(th->subtiles, tile); th->num_subtiles=1; th->total_size=0; th->total_size_used=0; th->zipnum=0; th->zip_data=NULL; th->name=string_hash_lookup(tile); *th_get_subtile( th, 0 ) = th->name; if (tile_hash2) g_hash_table_insert(tile_hash2, string_hash_lookup( th->name ), th); if (tiles_list) *tiles_list=g_list_append(*tiles_list, string_hash_lookup( th->name ) ); processed_tiles++; if (debug_tile(tile)) fprintf(stderr,"new '%s'\n", tile); } th->total_size+=ib->len*4+4; if (debug_tile(tile)) fprintf(stderr,"New total size of %s(%p):%d\n", th->name, th, th->total_size); g_hash_table_insert(tile_hash, string_hash_lookup( th->name ), th); } static int tile_data_size(char *tile) { struct tile_head *th; th=g_hash_table_lookup(tile_hash, tile); if (! th) return 0; return th->total_size; } static int merge_tile(char *base, char *sub) { struct tile_head *thb, *ths; thb=g_hash_table_lookup(tile_hash, base); ths=g_hash_table_lookup(tile_hash, sub); if (! ths) return 0; if (debug_tile(base) || debug_tile(sub)) fprintf(stderr,"merging '%s'(%p) (%d) with '%s'(%p) (%d)\n", base, thb, thb ? thb->total_size : 0, sub, ths, ths->total_size); if (! thb) { thb=ths; g_hash_table_remove(tile_hash, sub); thb->name=string_hash_lookup(base); g_hash_table_insert(tile_hash, string_hash_lookup( thb->name ), thb); } else { thb=realloc(thb, sizeof(struct tile_head)+( ths->num_subtiles+thb->num_subtiles ) * sizeof( char*) ); assert(thb != NULL); memcpy( th_get_subtile( thb, thb->num_subtiles ), th_get_subtile( ths, 0 ), ths->num_subtiles * sizeof( char*) ); thb->num_subtiles+=ths->num_subtiles; thb->total_size+=ths->total_size; g_hash_table_insert(tile_hash, string_hash_lookup( thb->name ), thb); g_hash_table_remove(tile_hash, sub); g_free(ths); } return 1; } static gint get_tiles_list_cmp(gconstpointer s1, gconstpointer s2) { return strcmp((char *)s1, (char *)s2); } static void get_tiles_list_func(char *key, struct tile_head *th, GList **list) { *list=g_list_prepend(*list, key); } static GList * get_tiles_list(void) { GList *ret=NULL; g_hash_table_foreach(tile_hash, (GHFunc)get_tiles_list_func, &ret); ret=g_list_sort(ret, get_tiles_list_cmp); return ret; } #if 0 static void write_tile(char *key, struct tile_head *th, gpointer dummy) { FILE *f; char buffer[1024]; fprintf(stderr,"DEBUG: Writing %s\n", key); strcpy(buffer,"tiles/"); strcat(buffer,key); #if 0 strcat(buffer,".bin"); #endif f=fopen(buffer, "wb+"); while (th) { fwrite(th->data, th->size, 1, f); th=th->next; } fclose(f); } #endif static void write_item(char *tile, struct item_bin *ib, FILE *reference) { struct tile_head *th; int size; th=g_hash_table_lookup(tile_hash2, tile); if (debug_itembin(ib)) { fprintf(stderr,"tile head %p\n",th); } if (! th) th=g_hash_table_lookup(tile_hash, tile); if (th) { if (debug_itembin(ib)) { fprintf(stderr,"Match %s %d %s\n",tile,th->process,th->name); dump_itembin(ib); } if (th->process != 0 && th->process != 1) { fprintf(stderr,"error with tile '%s' of length %d\n", tile, (int)strlen(tile)); abort(); } if (! th->process) { if (reference) fseek(reference, 8, SEEK_CUR); return; } if (debug_tile(tile)) fprintf(stderr,"Data:Writing %d bytes to '%s' (%p,%p) 0x%x\n", (ib->len+1)*4, tile, g_hash_table_lookup(tile_hash, tile), tile_hash2 ? g_hash_table_lookup(tile_hash2, tile) : NULL, ib->type); size=(ib->len+1)*4; if (th->total_size_used+size > th->total_size) { fprintf(stderr,"Overflow in tile %s (used %d max %d item %d)\n", tile, th->total_size_used, th->total_size, size); exit(1); return; } if (reference) { int offset=th->total_size_used/4; fwrite(&th->zipnum, sizeof(th->zipnum), 1, reference); fwrite(&offset, sizeof(th->total_size_used), 1, reference); } if (th->zip_data) memcpy(th->zip_data+th->total_size_used, ib, size); th->total_size_used+=size; } else { fprintf(stderr,"no tile hash found for %s\n", tile); exit(1); } } void tile_write_item_to_tile(struct tile_info *info, struct item_bin *ib, FILE *reference, char *name) { if (info->write) write_item(name, ib, reference); else tile_extend(name, ib, info->tiles_list); } void tile_write_item_minmax(struct tile_info *info, struct item_bin *ib, FILE *reference, int min, int max) { struct rect r; char buffer[1024]; bbox((struct coord *)(ib+1), ib->clen/2, &r); buffer[0]='\0'; tile(&r, info->suffix, buffer, max, overlap, NULL); tile_write_item_to_tile(info, ib, reference, buffer); } int add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size) { struct aux_tile *at; GList *l; l=aux_tile_list; while (l) { at=l->data; if (!strcmp(at->name, name)) { return -1; } l=g_list_next(l); } at=g_new0(struct aux_tile, 1); at->name=g_strdup(name); at->filename=g_strdup(filename); at->size=size; aux_tile_list=g_list_append(aux_tile_list, at); fprintf(stderr,"Adding %s as %s\n",filename, name); return zip_add_member(zip_info); } int write_aux_tiles(struct zip_info *zip_info) { GList *l=aux_tile_list; struct aux_tile *at; char *buffer; FILE *f; int count=0; while (l) { at=l->data; buffer=malloc(at->size); assert(buffer != NULL); f=fopen(at->filename,"rb"); assert(f != NULL); fread(buffer, at->size, 1, f); fclose(f); write_zipmember(zip_info, at->name, zip_get_maxnamelen(zip_info), buffer, at->size); free(buffer); count++; l=g_list_next(l); zip_add_member(zip_info); } return count; } static int add_tile_hash(struct tile_head *th) { int idx,len,maxnamelen=0; char **data; #if 0 g_hash_table_insert(tile_hash2, string_hash_lookup( th->name ), th); #endif for( idx = 0; idx < th->num_subtiles; idx++ ) { data = th_get_subtile( th, idx ); if (debug_tile(((char *)data)) || debug_tile(th->name)) { fprintf(stderr,"Parent for '%s' is '%s'\n", *data, th->name); } g_hash_table_insert(tile_hash2, *data, th); len = strlen( *data ); if (len > maxnamelen) { maxnamelen=len; } } return maxnamelen; } int create_tile_hash(void) { struct tile_head *th; int len,maxnamelen=0; tile_hash2=g_hash_table_new(g_str_hash, g_str_equal); th=tile_head_root; while (th) { len=add_tile_hash(th); if (len > maxnamelen) maxnamelen=len; th=th->next; } return maxnamelen; } static void create_tile_hash_list(GList *list) { GList *next; struct tile_head *th; tile_hash2=g_hash_table_new(g_str_hash, g_str_equal); next=g_list_first(list); while (next) { th=g_hash_table_lookup(tile_hash, next->data); if (!th) { fprintf(stderr,"No tile found for '%s'\n", (char *)(next->data)); } add_tile_hash(th); next=g_list_next(next); } } void load_tilesdir(FILE *in) { char tile[32],subtile[32],c; int size,zipnum=0; struct tile_head **last; create_tile_hash(); tile_hash=g_hash_table_new(g_str_hash, g_str_equal); last=&tile_head_root; while (fscanf(in,"%[^:]:%d",tile,&size) == 2) { struct tile_head *th=malloc(sizeof(struct tile_head)); if (!strcmp(tile,"index")) tile[0]='\0'; th->num_subtiles=0; th->total_size=size; th->total_size_used=0; th->zipnum=zipnum++; th->zip_data=NULL; th->name=string_hash_lookup(tile); #if 0 printf("tile '%s' %d\n",tile,size); #endif while (fscanf(in,":%[^:\n]",subtile) == 1) { #if 0 printf("subtile '%s'\n",subtile); #endif th=realloc(th, sizeof(struct tile_head)+(th->num_subtiles+1)*sizeof(char*)); *th_get_subtile( th, th->num_subtiles ) = string_hash_lookup(subtile); th->num_subtiles++; } *last=th; last=&th->next; add_tile_hash(th); g_hash_table_insert(tile_hash, th->name, th); if (fread(&c, 1, 1, in) != 1 || c != '\n') { printf("syntax error\n"); } } } void write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out) { int idx,len,maxlen; GList *next,*tiles_list; char **data; struct tile_head *th,**last=NULL; tiles_list=get_tiles_list(); info->tiles_list=&tiles_list; if (! info->write) create_tile_hash_list(tiles_list); next=g_list_first(tiles_list); last=&tile_head_root; maxlen=info->maxlen; if (! maxlen) { while (next) { if (strlen(next->data) > maxlen) maxlen=strlen(next->data); next=g_list_next(next); } } len=maxlen; while (len >= 0) { #if 0 fprintf(stderr,"PROGRESS: collecting tiles with len=%d\n", len); #endif next=g_list_first(tiles_list); while (next) { if (strlen(next->data) == len) { th=g_hash_table_lookup(tile_hash, next->data); if (!info->write) { *last=th; last=&th->next; th->next=NULL; th->zipnum=zip_get_zipnum(zip_info); fprintf(out,"%s:%d",strlen((char *)next->data)?(char *)next->data:"index",th->total_size); for ( idx = 0; idx< th->num_subtiles; idx++ ){ data= th_get_subtile( th, idx ); fprintf(out,":%s", *data); } fprintf(out,"\n"); } if (th->name[strlen(info->suffix)]) index_submap_add(info, th); zip_add_member(zip_info); processed_tiles++; } next=g_list_next(next); } len--; } if (info->suffix[0] && info->write) { struct item_bin *item_bin=init_item(type_submap); item_bin_add_coord_rect(item_bin, &world_bbox); item_bin_add_attr_range(item_bin, attr_order, 0, 255); item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_get_zipnum(zip_info)-1); item_bin_write(item_bin, zip_get_index(zip_info)); } } void merge_tiles(struct tile_info *info) { struct tile_head *th; char basetile[1024]; char subtile[1024]; GList *tiles_list_sorted,*last; int i,i_min,len,size_all,size[5],size_min,work_done; long long zip_size; do { tiles_list_sorted=get_tiles_list(); fprintf(stderr,"PROGRESS: sorting %d tiles\n", g_list_length(tiles_list_sorted)); tiles_list_sorted=g_list_sort(tiles_list_sorted, (GCompareFunc)strcmp); fprintf(stderr,"PROGRESS: sorting %d tiles done\n", g_list_length(tiles_list_sorted)); last=g_list_last(tiles_list_sorted); zip_size=0; while (last) { th=g_hash_table_lookup(tile_hash, last->data); zip_size+=th->total_size; last=g_list_previous(last); } last=g_list_last(tiles_list_sorted); work_done=0; while (last) { processed_tiles++; len=tile_len(last->data); if (len >= 1) { strcpy(basetile,last->data); basetile[len-1]='\0'; strcat(basetile, info->suffix); strcpy(subtile,last->data); for (i = 0 ; i < 4 ; i++) { subtile[len-1]='a'+i; size[i]=tile_data_size(subtile); } size[4]=tile_data_size(basetile); size_all=size[0]+size[1]+size[2]+size[3]+size[4]; if (size_all < 65536 && size_all > 0 && size_all != size[4]) { for (i = 0 ; i < 4 ; i++) { subtile[len-1]='a'+i; work_done+=merge_tile(basetile, subtile); } } else { for (;;) { size_min=size_all; i_min=-1; for (i = 0 ; i < 4 ; i++) { if (size[i] && size[i] < size_min) { size_min=size[i]; i_min=i; } } if (i_min == -1) break; if (size[4]+size_min >= 65536) break; subtile[len-1]='a'+i_min; work_done+=merge_tile(basetile, subtile); size[4]+=size[i_min]; size[i_min]=0; } } } last=g_list_previous(last); } g_list_free(tiles_list_sorted); fprintf(stderr,"PROGRESS: merged %d tiles\n", work_done); } while (work_done); } struct attr map_information_attrs[32]; void index_init(struct zip_info *info, int version) { struct item_bin *item_bin; int i; map_information_attrs[0].type=attr_version; map_information_attrs[0].u.num=version; item_bin=init_item(type_map_information); for (i = 0 ; i < 32 ; i++) { if (!map_information_attrs[i].type) break; item_bin_add_attr(item_bin, &map_information_attrs[i]); } item_bin_write(item_bin, zip_get_index(info)); } void index_submap_add(struct tile_info *info, struct tile_head *th) { int tlen=tile_len(th->name); int len=tlen; char *index_tile; struct rect r; struct item_bin *item_bin; index_tile=g_alloca(len+1+strlen(info->suffix)); strcpy(index_tile, th->name); if (len > 6) len=6; else len=0; index_tile[len]=0; strcat(index_tile, info->suffix); tile_bbox(th->name, &r, overlap); item_bin=init_item(type_submap); item_bin_add_coord_rect(item_bin, &r); item_bin_add_attr_range(item_bin, attr_order, (tlen > 4)?tlen-4 : 0, 255); item_bin_add_attr_int(item_bin, attr_zipfile_ref, th->zipnum); tile_write_item_to_tile(info, item_bin, NULL, index_tile); } navit-0.5.0~svn5643+dfsg.1/navit/maptool/zip.c000066400000000000000000000224301221777731700207430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "maptool.h" #include "config.h" #include "zipfile.h" #ifdef HAVE_LIBCRYPTO #include #include #include #include #include #include #endif struct zip_info { int zipnum; int dir_size; long long offset; int compression_level; int maxnamelen; int zip64; short date; short time; char *passwd; FILE *res2; FILE *index; FILE *dir; #ifdef HAVE_LIBCRYPTO MD5_CTX md5_ctx; #endif int md5; }; static int zip_write(struct zip_info *info, void *data, int len) { if (fwrite(data, len, 1, info->res2) != 1) return 0; #ifdef HAVE_LIBCRYPTO if (info->md5) MD5_Update(&info->md5_ctx, data, len); #endif return 1; } #ifdef HAVE_ZLIB static int compress2_int(Byte *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit2(&stream, level, Z_DEFLATED, -15, 9, Z_DEFAULT_STRATEGY); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } #endif void write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size) { struct zip_lfh lfh = { 0x04034b50, 0x0a, 0x0, 0x0, zip_info->time, zip_info->date, 0x0, 0x0, 0x0, filelen, 0x0, }; struct zip_cd cd = { 0x02014b50, 0x17, 0x00, 0x0a, 0x00, 0x0000, 0x0, zip_info->time, zip_info->date, 0x0, 0x0, 0x0, filelen, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, zip_info->offset, }; struct zip_cd_ext cd_ext = { 0x1, 0x8, zip_info->offset, }; #ifdef HAVE_LIBCRYPTO struct zip_enc enc = { 0x9901, 0x7, 0x2, 'A','E', 0x1, 0x0, }; unsigned char salt[8], key[34], verify[2], mac[10]; #endif char *filename; int crc=0,len,comp_size=data_size; uLongf destlen=data_size+data_size/500+12; char *compbuffer; compbuffer = malloc(destlen); if (!compbuffer) { fprintf(stderr, "No more memory.\n"); exit (1); } #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { RAND_bytes(salt, sizeof(salt)); PKCS5_PBKDF2_HMAC_SHA1(zip_info->passwd, strlen(zip_info->passwd), salt, sizeof(salt), 1000, sizeof(key), key); verify[0]=key[32]; verify[1]=key[33]; } else { #endif crc=crc32(0, NULL, 0); crc=crc32(crc, (unsigned char *)data, data_size); #ifdef HAVE_LIBCRYPTO } #endif lfh.zipmthd=zip_info->compression_level ? 8:0; #ifdef HAVE_ZLIB if (zip_info->compression_level) { int error=compress2_int((Byte *)compbuffer, &destlen, (Bytef *)data, data_size, zip_info->compression_level); if (error == Z_OK) { if (destlen < data_size) { data=compbuffer; comp_size=destlen; } else lfh.zipmthd=0; } else { fprintf(stderr,"compress2 returned %d\n", error); } } #endif lfh.zipcrc=crc; lfh.zipsize=comp_size; lfh.zipuncmp=data_size; #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { enc.compress_method=lfh.zipmthd; lfh.zipmthd=99; lfh.zipxtraln+=sizeof(enc); lfh.zipgenfld|=1; lfh.zipsize+=sizeof(salt)+sizeof(verify)+sizeof(mac); } #endif cd.zipccrc=crc; cd.zipcsiz=lfh.zipsize; cd.zipcunc=data_size; cd.zipcmthd=lfh.zipmthd; if (zip_info->zip64) { cd.zipofst=0xffffffff; cd.zipcxtl+=sizeof(cd_ext); } #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { cd.zipcmthd=99; cd.zipcxtl+=sizeof(enc); cd.zipcflg|=1; } #endif filename=g_alloca(filelen+1); strcpy(filename, name); len=strlen(filename); while (len < filelen) { filename[len++]='_'; } filename[filelen]='\0'; zip_write(zip_info, &lfh, sizeof(lfh)); zip_write(zip_info, filename, filelen); zip_info->offset+=sizeof(lfh)+filelen; #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { unsigned char counter[16], xor[16], *datap=(unsigned char *)data; int size=comp_size; AES_KEY aeskey; zip_write(zip_info, &enc, sizeof(enc)); zip_write(zip_info, salt, sizeof(salt)); zip_write(zip_info, verify, sizeof(verify)); zip_info->offset+=sizeof(enc)+sizeof(salt)+sizeof(verify); AES_set_encrypt_key(key, 128, &aeskey); memset(counter, 0, sizeof(counter)); while (size > 0) { int i,curr_size,idx=0; do { counter[idx]++; } while (!counter[idx++]); AES_encrypt(counter, xor, &aeskey); curr_size=size; if (curr_size > sizeof(xor)) curr_size=sizeof(xor); for (i = 0 ; i < curr_size ; i++) *datap++^=xor[i]; size-=curr_size; } } #endif zip_write(zip_info, data, comp_size); zip_info->offset+=comp_size; #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { unsigned int maclen=sizeof(mac); unsigned char mactmp[maclen*2]; HMAC(EVP_sha1(), key+16, 16, (unsigned char *)data, comp_size, mactmp, &maclen); zip_write(zip_info, mactmp, sizeof(mac)); zip_info->offset+=sizeof(mac); } #endif fwrite(&cd, sizeof(cd), 1, zip_info->dir); fwrite(filename, filelen, 1, zip_info->dir); zip_info->dir_size+=sizeof(cd)+filelen; if (zip_info->zip64) { fwrite(&cd_ext, sizeof(cd_ext), 1, zip_info->dir); zip_info->dir_size+=sizeof(cd_ext); } #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { fwrite(&enc, sizeof(enc), 1, zip_info->dir); zip_info->dir_size+=sizeof(enc); } #endif free(compbuffer); } void zip_write_index(struct zip_info *info) { int size=ftell(info->index); char *buffer; buffer=g_alloca(size); fseek(info->index, 0, SEEK_SET); fread(buffer, size, 1, info->index); write_zipmember(info, "index", strlen("index"), buffer, size); info->zipnum++; } static void zip_write_file_data(struct zip_info *info, FILE *in) { size_t size; char buffer[4096]; while ((size=fread(buffer, 1, 4096, in))) zip_write(info, buffer, size); } int zip_write_directory(struct zip_info *info) { struct zip_eoc eoc = { 0x06054b50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, 0x0, 0x0, }; struct zip64_eoc eoc64 = { 0x06064b50, 0x0, 0x0, 0x0403, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; struct zip64_eocl eocl = { 0x07064b50, 0x0, 0x0, 0x0, }; fseek(info->dir, 0, SEEK_SET); zip_write_file_data(info, info->dir); if (info->zip64) { eoc64.zip64esize=sizeof(eoc64)-12; eoc64.zip64enum=info->zipnum; eoc64.zip64ecenn=info->zipnum; eoc64.zip64ecsz=info->dir_size; eoc64.zip64eofst=info->offset; zip_write(info, &eoc64, sizeof(eoc64)); eocl.zip64lofst=info->offset+info->dir_size; zip_write(info, &eocl, sizeof(eocl)); } eoc.zipenum=info->zipnum; eoc.zipecenn=info->zipnum; eoc.zipecsz=info->dir_size; eoc.zipeofst=info->offset; zip_write(info, &eoc, sizeof(eoc)); sig_alrm(0); #ifndef _WIN32 alarm(0); #endif return 0; } struct zip_info * zip_new(void) { return g_new0(struct zip_info, 1); } void zip_set_md5(struct zip_info *info, int on) { #ifdef HAVE_LIBCRYPTO info->md5=on; if (on) MD5_Init(&info->md5_ctx); #endif } int zip_get_md5(struct zip_info *info, unsigned char *out) { if (!info->md5) return 0; #ifdef HAVE_LIBCRYPTO MD5_Final(out, &info->md5_ctx); return 1; #endif return 0; } void zip_set_zip64(struct zip_info *info, int on) { info->zip64=on; } void zip_set_compression_level(struct zip_info *info, int level) { info->compression_level=level; } void zip_set_maxnamelen(struct zip_info *info, int max) { info->maxnamelen=max; } int zip_get_maxnamelen(struct zip_info *info) { return info->maxnamelen; } int zip_add_member(struct zip_info *info) { return info->zipnum++; } int zip_set_timestamp(struct zip_info *info, char *timestamp) { int year,month,day,hour,min,sec; if (sscanf(timestamp,"%d-%d-%dT%d:%d:%d",&year,&month,&day,&hour,&min,&sec) == 6) { info->date=day | (month << 5) | ((year-1980) << 9); info->time=(sec >> 1) | (min << 5) | (hour << 11); return 1; } return 0; } int zip_set_password(struct zip_info *info, char *passwd) { info->passwd=passwd; return 1; } void zip_open(struct zip_info *info, char *out, char *dir, char *index) { info->res2=fopen(out,"wb+"); info->dir=fopen(dir,"wb+"); info->index=fopen(index,"wb+"); } FILE * zip_get_index(struct zip_info *info) { return info->index; } int zip_get_zipnum(struct zip_info *info) { return info->zipnum; } void zip_set_zipnum(struct zip_info *info, int num) { info->zipnum=num; } void zip_close(struct zip_info *info) { fclose(info->index); fclose(info->dir); fclose(info->res2); } void zip_destroy(struct zip_info *info) { g_free(info); } navit-0.5.0~svn5643+dfsg.1/navit/maptype.c000066400000000000000000000025411221777731700201460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" static struct maptype *maptype_root; void maptype_register(char *name, struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro)) { struct maptype *mt; mt=g_new(struct maptype, 1); mt->name=g_strdup(name); mt->map_new=map_new; mt->next=maptype_root; maptype_root=mt; } struct maptype * maptype_get(const char *name) { struct maptype *mt=maptype_root; while (mt) { if (!g_ascii_strcasecmp(mt->name, name)) return mt; mt=mt->next; } return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/maptype.h000066400000000000000000000024071221777731700201540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAPTYPE_H #define NAVIT_MAPTYPE_H struct map_methods; enum projection; struct maptype { char *name; struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro); struct maptype *next; }; /* prototypes */ struct map_methods; struct map_priv; struct maptype; void maptype_register(char *name, struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro)); struct maptype *maptype_get(const char *name); #endif navit-0.5.0~svn5643+dfsg.1/navit/menu.c000066400000000000000000000023661221777731700174400ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "menu.h" #include "debug.h" struct menu * menu_add(struct menu *menu, char *name, enum menu_type type, struct callback *cb) { struct menu *this; if (! menu || ! menu->meth.add) return NULL; this=g_new0(struct menu, 1); this->priv=(*menu->meth.add)(menu->priv, &this->meth, name, type, cb); if (! this->priv) { g_free(this); return NULL; } return this; } void menu_popup(struct menu *menu) { if (! menu || ! menu->meth.popup) return; (*menu->meth.popup)(menu->priv); } navit-0.5.0~svn5643+dfsg.1/navit/menu.h000066400000000000000000000027201221777731700174370ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MENU_H #define NAVIT_MENU_H enum menu_type { menu_type_submenu, menu_type_menu, menu_type_toggle, }; struct container; struct menu; struct callback; struct menu_methods { struct menu_priv *(*add)(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb); void (*set_toggle)(struct menu_priv *menu, int active); int (*get_toggle)(struct menu_priv *menu); void (*popup)(struct menu_priv *menu); }; struct menu { struct menu_priv *priv; struct menu_methods meth; }; /* prototypes */ struct menu *menu_add(struct menu *menu, char *name, enum menu_type type, struct callback *cb); void menu_popup(struct menu *menu); /* end of prototypes */ #endif navit-0.5.0~svn5643+dfsg.1/navit/messages.c000066400000000000000000000062741221777731700203050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "messages.h" #include "callback.h" #include "event.h" #include "attr.h" struct messagelist { struct message *messages; /**< All the messages that can currently be shown */ int last_mid; /**< Last Message ID */ int maxage; /**< Maximum age of messages */ int maxnum; /**< Maximum number of messages */ struct callback *msg_cleanup_cb; /**< Callback to clean up the messages */ struct event_timeout *msg_cleanup_to; /**< Idle event to clean up the messages */ }; int message_new(struct messagelist *this_, const char *message) { struct message *msg; msg = g_new0(struct message, 1); msg->text = g_strdup(message); msg->id = ++(this_->last_mid); msg->time = time(NULL); msg->next = this_->messages; this_->messages = msg; return msg->id; } int message_delete(struct messagelist *this_, int mid) { struct message *msg,*last;; msg = this_->messages; last = NULL; while (msg) { if (msg->id == mid) { break; } last = msg; msg = msg->next; } if (msg) { if (last) { last->next = msg->next; } else { this_->messages = msg->next; } g_free(msg->text); g_free(msg); return 1; } else { return 0; } } static void message_cleanup(struct messagelist *this_) { struct message *msg,*next,*prev=NULL; int i; time_t now; msg = this_->messages; now = time(NULL); i = 0; while (msg && (i < this_->maxnum)) { if ((this_->maxage > 0) && (now - msg->time) > this_->maxage) { break; } i++; prev = msg; msg = msg->next; } if (prev) { prev->next = NULL; } else { this_->messages = NULL; } while (msg) { next = msg->next; g_free(msg->text); g_free(msg); msg = next; } } struct messagelist *messagelist_new(struct attr **attrs) { struct messagelist *this = g_new0(struct messagelist, 1); struct attr num_attr,age_attr; if (attr_generic_get_attr(attrs, NULL, attr_message_maxage, &age_attr, NULL)) { this->maxage = age_attr.u.num; } else { this->maxage = 10; } if (attr_generic_get_attr(attrs, NULL, attr_message_maxnum, &num_attr, NULL)) { this->maxnum = num_attr.u.num; } else { this->maxnum = 3; } return this; } void messagelist_init(struct messagelist *this_) { if (!event_system()) return; this_->msg_cleanup_cb = callback_new_1(callback_cast(message_cleanup), this_); this_->msg_cleanup_to = event_add_timeout(1000, 1, this_->msg_cleanup_cb); } struct message *message_get(struct messagelist *this_) { return this_->messages; } navit-0.5.0~svn5643+dfsg.1/navit/messages.h000066400000000000000000000023061221777731700203020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MESSAGES_H #define NAVIT_MESSAGES_H struct messagelist; struct message { struct message *next; int id; time_t time; char *text; }; /* Prototypes */ struct attr; int message_new(struct messagelist *this_, const char *message); int message_delete(struct messagelist *this_, int mid); struct messagelist *messagelist_new(struct attr **attrs); void messagelist_init(struct messagelist *this_); struct message *message_get(struct messagelist *this_); #endif navit-0.5.0~svn5643+dfsg.1/navit/navigation.c000066400000000000000000002010151221777731700206230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "debug.h" #include "profile.h" #include "navigation.h" #include "coord.h" #include "item.h" #include "xmlconfig.h" #include "route.h" #include "transform.h" #include "mapset.h" #include "projection.h" #include "map.h" #include "navit.h" #include "callback.h" #include "speech.h" #include "vehicleprofile.h" #include "plugin.h" #include "navit_nls.h" #include "util.h" /* #define DEBUG */ static int roundabout_extra_length=50; struct suffix { char *fullname; char *abbrev; int sex; } suffixes[]= { {"weg",NULL,1}, {"platz","pl.",1}, {"ring",NULL,1}, {"allee",NULL,2}, {"gasse",NULL,2}, {"straße","str.",2}, {"strasse",NULL,2}, }; struct navigation { NAVIT_OBJECT struct route *route; struct map *map; struct item_hash *hash; struct vehicleprofile *vehicleprofile; struct navigation_itm *first; struct navigation_itm *last; struct navigation_command *cmd_first; struct navigation_command *cmd_last; struct callback_list *callback_speech; struct callback_list *callback; struct navit *navit; struct speech *speech; int level_last; struct item item_last; int turn_around; int turn_around_limit; int distance_turn; struct callback *route_cb; int announce[route_item_last-route_item_first+1][3]; int tell_street_name; int delay; int curr_delay; int turn_around_count; int flags; }; int distances[]={1,2,3,4,5,10,25,50,75,100,150,200,250,300,400,500,750,-1}; struct navigation_command { struct navigation_itm *itm; struct navigation_command *next; struct navigation_command *prev; int delta; int roundabout_delta; int length; }; static void navigation_flush(struct navigation *this_); /** * @brief Calculates the delta between two angles * @param angle1 The first angle * @param angle2 The second angle * @return The difference between the angles: -179..-1=angle2 is left of angle1,0=same,1..179=angle2 is right of angle1,180=angle1 is opposite of angle2 */ static int angle_delta(int angle1, int angle2) { int delta=angle2-angle1; if (delta <= -180) delta+=360; if (delta > 180) delta-=360; return delta; } static int angle_median(int angle1, int angle2) { int delta=angle_delta(angle1, angle2); int ret=angle1+delta/2; if (ret < 0) ret+=360; if (ret > 360) ret-=360; return ret; } static int angle_opposite(int angle) { return ((angle+180)%360); } int navigation_get_attr(struct navigation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { struct map_rect *mr; struct item *item; dbg(1,"enter %s\n", attr_to_name(type)); switch (type) { case attr_map: attr->u.map=this_->map; break; case attr_item_type: case attr_length: case attr_navigation_speech: case attr_street_name: case attr_street_name_systematic: mr=map_rect_new(this_->map, NULL); while ((item=map_rect_get_item(mr))) { if (item->type != type_nav_none && item->type != type_nav_position) { if (type == attr_item_type) attr->u.item_type=item->type; else { if (!item_attr_get(item, type, attr)) item=NULL; } break; } } map_rect_destroy(mr); if (!item) return 0; break; case attr_turn_around_count: attr->u.num=this_->turn_around_count; break; default: return navit_object_get_attr((struct navit_object *)this_, type, attr, iter); } attr->type=type; return 1; } static void navigation_set_turnaround(struct navigation *this_, int val) { if (this_->turn_around_count != val) { struct attr attr=ATTR_INT(turn_around_count, val); this_->turn_around_count=val; navit_object_callbacks((struct navit_object *)this_, &attr); } } int navigation_set_attr(struct navigation *this_, struct attr *attr) { switch (attr->type) { case attr_speech: this_->speech=attr->u.speech; break; default: break; } return navit_object_set_attr((struct navit_object *)this_, attr); } struct navigation * navigation_new(struct attr *parent, struct attr **attrs) { int i,j; struct attr * attr; struct navigation *ret=(struct navigation *)navit_object_new(attrs, &navigation_func, sizeof(struct navigation)); ret->hash=item_hash_new(); ret->callback=callback_list_new(); ret->callback_speech=callback_list_new(); ret->level_last=-2; ret->distance_turn=50; ret->turn_around_limit=3; ret->navit=parent->u.navit; ret->tell_street_name=1; for (j = 0 ; j <= route_item_last-route_item_first ; j++) { for (i = 0 ; i < 3 ; i++) { ret->announce[j][i]=-1; } } if ((attr=attr_search(attrs, NULL, attr_tell_street_name))) { ret->tell_street_name = attr->u.num; } if ((attr=attr_search(attrs, NULL, attr_delay))) { ret->delay = attr->u.num; } if ((attr=attr_search(attrs, NULL, attr_flags))) { ret->flags = attr->u.num; } return ret; } int navigation_set_announce(struct navigation *this_, enum item_type type, int *level) { int i; if (type < route_item_first || type > route_item_last) { dbg(0,"street type %d out of range [%d,%d]", type, route_item_first, route_item_last); return 0; } for (i = 0 ; i < 3 ; i++) this_->announce[type-route_item_first][i]=level[i]; return 1; } static int navigation_get_announce_level(struct navigation *this_, enum item_type type, int dist) { int i; if (type < route_item_first || type > route_item_last) return -1; for (i = 0 ; i < 3 ; i++) { if (dist <= this_->announce[type-route_item_first][i]) return i; } return i; } /** * @brief Holds a way that one could possibly drive from a navigation item */ struct navigation_way { struct navigation_way *next; /**< Pointer to a linked-list of all navigation_ways from this navigation item */ short dir; /**< The direction -1 or 1 of the way */ short angle2; /**< The angle one has to steer to drive from the old item to this street */ int flags; /**< The flags of the way */ struct item item; /**< The item of the way */ char *name1; char *name2; }; struct navigation_itm { struct navigation_way way; int angle_end; struct coord start,end; int time; int length; int speed; int dest_time; int dest_length; int told; /**< Indicates if this item's announcement has been told earlier and should not be told again*/ int streetname_told; /**< Indicates if this item's streetname has been told in speech navigation*/ int dest_count; struct navigation_itm *next; struct navigation_itm *prev; }; static int is_way_allowed(struct navigation *nav, struct navigation_way *way, int mode); static int navigation_get_announce_level_cmd(struct navigation *this_, struct navigation_itm *itm, struct navigation_command *cmd, int distance) { int level2,level=navigation_get_announce_level(this_, itm->way.item.type, distance); if (this_->cmd_first->itm->prev) { level2=navigation_get_announce_level(this_, cmd->itm->prev->way.item.type, distance); if (level2 > level) level=level2; } return level; } /* 0=N,90=E */ static int road_angle(struct coord *c1, struct coord *c2, int dir) { int ret=transform_get_angle_delta(c1, c2, dir); dbg(1, "road_angle(0x%x,0x%x - 0x%x,0x%x)=%d\n", c1->x, c1->y, c2->x, c2->y, ret); return ret; } static const char *get_count_str(int n) { switch (n) { case 0: /* TRANSLATORS: the following counts refer to streets */ return _("zeroth"); // Not sure if this exists, neither if it will ever be needed case 1: return _("first"); case 2: return _("second"); case 3: return _("third"); case 4: return _("fourth"); case 5: return _("fifth"); case 6: return _("sixth"); default: return NULL; } } static const char *get_exit_count_str(int n) { switch (n) { case 0: /* TRANSLATORS: the following counts refer to roundabout exits */ return _("zeroth exit"); // Not sure if this exists, neither if it will ever be needed case 1: return _("first exit"); case 2: return _("second exit"); case 3: return _("third exit"); case 4: return _("fourth exit"); case 5: return _("fifth exit"); case 6: return _("sixth exit"); default: return NULL; } } static int round_distance(int dist) { if (dist < 100) { dist=(dist+5)/10; return dist*10; } if (dist < 250) { dist=(dist+13)/25; return dist*25; } if (dist < 500) { dist=(dist+25)/50; return dist*50; } if (dist < 1000) { dist=(dist+50)/100; return dist*100; } if (dist < 5000) { dist=(dist+50)/100; return dist*100; } if (dist < 100000) { dist=(dist+500)/1000; return dist*1000; } dist=(dist+5000)/10000; return dist*10000; } static int round_for_vocabulary(int vocabulary, int dist, int factor) { if (!(vocabulary & 256)) { if (factor != 1) dist=(dist+factor/2)/factor; } else factor=1; if (!(vocabulary & 255)) { int i=0,d=0,m=0; while (distances[i] > 0) { if (!i || abs(distances[i]-dist) <= d) { d=abs(distances[i]-dist); m=i; } if (distances[i] > dist) break; i++; } dbg(0,"converted %d to %d with factor %d\n",dist,distances[m],factor); dist=distances[m]; } return dist*factor; } static int vocabulary_last(int vocabulary) { int i=0; if (vocabulary == 65535) return 1000; while (distances[i] > 0) i++; return distances[i-1]; } static char * get_distance(struct navigation *nav, int dist, enum attr_type type, int is_length) { int imperial=0,vocabulary=65535; struct attr attr; if (type == attr_navigation_long) { if (is_length) return g_strdup_printf(_("%d m"), dist); else return g_strdup_printf(_("in %d m"), dist); } if (navit_get_attr(nav->navit, attr_imperial, &attr, NULL)) imperial=attr.u.num; if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_distances, &attr, NULL)) vocabulary=attr.u.num; if (imperial) { if (dist*FEET_PER_METER < vocabulary_last(vocabulary)) { dist=round_for_vocabulary(vocabulary, dist*FEET_PER_METER, 1); if (is_length) return g_strdup_printf(_("%d feet"), dist); else return g_strdup_printf(_("in %d feet"), dist); } } else { if (dist < vocabulary_last(vocabulary)) { dist=round_for_vocabulary(vocabulary, dist, 1); if (is_length) return g_strdup_printf(_("%d meters"), dist); else return g_strdup_printf(_("in %d meters"), dist); } } if (imperial) dist=round_for_vocabulary(vocabulary, dist*FEET_PER_METER*1000/FEET_PER_MILE, 1000); else dist=round_for_vocabulary(vocabulary, dist, 1000); if (dist < 5000) { int rem=(dist/100)%10; if (rem) { if (imperial) { if (is_length) return g_strdup_printf(_("%d.%d miles"), dist/1000, rem); else return g_strdup_printf(_("in %d.%d miles"), dist/1000, rem); } else { if (is_length) return g_strdup_printf(_("%d.%d kilometers"), dist/1000, rem); else return g_strdup_printf(_("in %d.%d kilometers"), dist/1000, rem); } } } if (imperial) { if (is_length) return g_strdup_printf(navit_nls_ngettext("one mile","%d miles", dist/1000), dist/1000); else return g_strdup_printf(navit_nls_ngettext("in one mile","in %d miles", dist/1000), dist/1000); } else { if (is_length) return g_strdup_printf(navit_nls_ngettext("one kilometer","%d kilometers", dist/1000), dist/1000); else return g_strdup_printf(navit_nls_ngettext("in one kilometer","in %d kilometers", dist/1000), dist/1000); } } /** * @brief This calculates the angle with which an item starts or ends * * This function can be used to get the angle an item (from a route graph map) * starts or ends with. Note that the angle will point towards the inner of * the item. * * This is meant to be used with items from a route graph map * With other items this will probably not be optimal... * * @param w The way which should be calculated */ static void calculate_angle(struct navigation_way *w) { struct coord cbuf[2]; struct item *ritem; // the "real" item struct coord c; struct map_rect *mr; struct attr attr; w->angle2=361; mr = map_rect_new(w->item.map, NULL); if (!mr) return; ritem = map_rect_get_item_byid(mr, w->item.id_hi, w->item.id_lo); if (!ritem) { dbg(1,"Item from segment not found on map!\n"); map_rect_destroy(mr); return; } if (ritem->type < type_line || ritem->type >= type_area) { map_rect_destroy(mr); return; } if (item_attr_get(ritem, attr_flags, &attr)) w->flags=attr.u.num; else w->flags=0; if (item_attr_get(ritem, attr_street_name, &attr)) w->name1=map_convert_string(ritem->map,attr.u.str); else w->name1=NULL; if (item_attr_get(ritem, attr_street_name_systematic, &attr)) w->name2=map_convert_string(ritem->map,attr.u.str); else w->name2=NULL; if (w->dir < 0) { if (item_coord_get(ritem, cbuf, 2) != 2) { dbg(1,"Using calculate_angle() with a less-than-two-coords-item?\n"); map_rect_destroy(mr); return; } while (item_coord_get(ritem, &c, 1)) { cbuf[0] = cbuf[1]; cbuf[1] = c; } } else { if (item_coord_get(ritem, cbuf, 2) != 2) { dbg(1,"Using calculate_angle() with a less-than-two-coords-item?\n"); map_rect_destroy(mr); return; } c = cbuf[0]; cbuf[0] = cbuf[1]; cbuf[1] = c; } map_rect_destroy(mr); w->angle2=road_angle(&cbuf[1],&cbuf[0],0); } /** * @brief Returns the time (in seconds) one will drive between two navigation items * * This function returns the time needed to drive between two items, including both of them, * in seconds. * * @param from The first item * @param to The last item * @return The travel time in seconds, or -1 on error */ static int navigation_time(struct navigation_itm *from, struct navigation_itm *to) { struct navigation_itm *cur; int time; time = 0; cur = from; while (cur) { time += cur->time; if (cur == to) { break; } cur = cur->next; } if (!cur) { return -1; } return time; } /** * @brief Clears the ways one can drive from itm * * @param itm The item that should have its ways cleared */ static void navigation_itm_ways_clear(struct navigation_itm *itm) { struct navigation_way *c,*n; c = itm->way.next; while (c) { n = c->next; map_convert_free(c->name1); map_convert_free(c->name2); g_free(c); c = n; } itm->way.next = NULL; } /** * @brief Updates the ways one can drive from itm * * This updates the list of possible ways to drive to from itm. The item "itm" is on * and the next navigation item are excluded. * * @param itm The item that should be updated * @param graph_map The route graph's map that these items are on */ static void navigation_itm_ways_update(struct navigation_itm *itm, struct map *graph_map) { struct map_selection coord_sel; struct map_rect *g_rect; // Contains a map rectangle from the route graph's map struct item *i,*sitem; struct attr sitem_attr,direction_attr; struct navigation_way *w,*l; navigation_itm_ways_clear(itm); // These values cause the code in route.c to get us only the route graph point and connected segments coord_sel.next = NULL; coord_sel.u.c_rect.lu = itm->start; coord_sel.u.c_rect.rl = itm->start; // the selection's order is ignored g_rect = map_rect_new(graph_map, &coord_sel); i = map_rect_get_item(g_rect); if (!i || i->type != type_rg_point) { // probably offroad? map_rect_destroy(g_rect); return ; } w = NULL; while (1) { i = map_rect_get_item(g_rect); if (!i) { break; } if (i->type != type_rg_segment) { continue; } if (!item_attr_get(i,attr_street_item,&sitem_attr)) { dbg(1, "Got no street item for route graph item in entering_straight()\n"); continue; } if (!item_attr_get(i,attr_direction,&direction_attr)) { continue; } sitem = sitem_attr.u.item; if (sitem->type == type_street_turn_restriction_no || sitem->type == type_street_turn_restriction_only) continue; if (item_is_equal(itm->way.item,*sitem) || ((itm->prev) && item_is_equal(itm->prev->way.item,*sitem))) { continue; } l = w; w = g_new(struct navigation_way, 1); w->dir = direction_attr.u.num; w->item = *sitem; w->next = l; calculate_angle(w); } map_rect_destroy(g_rect); itm->way.next = w; } static void navigation_destroy_itms_cmds(struct navigation *this_, struct navigation_itm *end) { struct navigation_itm *itm; struct navigation_command *cmd; dbg(2,"enter this_=%p this_->first=%p this_->cmd_first=%p end=%p\n", this_, this_->first, this_->cmd_first, end); if (this_->cmd_first) dbg(2,"this_->cmd_first->itm=%p\n", this_->cmd_first->itm); while (this_->first && this_->first != end) { itm=this_->first; dbg(3,"destroying %p\n", itm); item_hash_remove(this_->hash, &itm->way.item); this_->first=itm->next; if (this_->first) this_->first->prev=NULL; if (this_->cmd_first && this_->cmd_first->itm == itm->next) { cmd=this_->cmd_first; this_->cmd_first=cmd->next; if (cmd->next) { cmd->next->prev = NULL; } g_free(cmd); } map_convert_free(itm->way.name1); map_convert_free(itm->way.name2); navigation_itm_ways_clear(itm); g_free(itm); } if (! this_->first) this_->last=NULL; if (! this_->first && end) dbg(0,"end wrong\n"); dbg(2,"ret this_->first=%p this_->cmd_first=%p\n",this_->first, this_->cmd_first); } static void navigation_itm_update(struct navigation_itm *itm, struct item *ritem) { struct attr length, time, speed; if (! item_attr_get(ritem, attr_length, &length)) { dbg(0,"no length\n"); return; } if (! item_attr_get(ritem, attr_time, &time)) { dbg(0,"no time\n"); return; } if (! item_attr_get(ritem, attr_speed, &speed)) { dbg(0,"no time\n"); return; } dbg(1,"length=%ld time=%ld speed=%ld\n", length.u.num, time.u.num, speed.u.num); itm->length=length.u.num; itm->time=time.u.num; itm->speed=speed.u.num; } /** * @brief This check if an item is part of a roundabout * * @param itm The item to be checked * @return True if the item is part of a roundabout */ static int check_roundabout(struct navigation_itm *itm, struct map *graph_map) { struct map_selection coord_sel; struct map_rect *g_rect; // Contains a map rectangle from the route graph's map struct item *i,*sitem; struct attr sitem_attr,flags_attr; // These values cause the code in route.c to get us only the route graph point and connected segments coord_sel.next = NULL; coord_sel.u.c_rect.lu = itm->start; coord_sel.u.c_rect.rl = itm->start; // the selection's order is ignored g_rect = map_rect_new(graph_map, &coord_sel); i = map_rect_get_item(g_rect); if (!i || i->type != type_rg_point) { // probably offroad? map_rect_destroy(g_rect); return 0; } while (1) { i = map_rect_get_item(g_rect); if (!i) { break; } if (i->type != type_rg_segment) { continue; } if (!item_attr_get(i,attr_street_item,&sitem_attr)) { continue; } sitem = sitem_attr.u.item; if (item_is_equal(itm->way.item,*sitem)) { if (item_attr_get(i,attr_flags,&flags_attr) && (flags_attr.u.num & AF_ROUNDABOUT)) { map_rect_destroy(g_rect); return 1; } } } map_rect_destroy(g_rect); return 0; } static struct navigation_itm * navigation_itm_new(struct navigation *this_, struct item *ritem) { struct navigation_itm *ret=g_new0(struct navigation_itm, 1); int i=0; struct item *sitem; struct map *graph_map = NULL; struct attr street_item,direction,route_attr; struct map_rect *mr; struct attr attr; struct coord c[5]; if (ritem) { ret->streetname_told=0; if (! item_attr_get(ritem, attr_street_item, &street_item)) { dbg(1, "no street item\n"); g_free(ret); ret = NULL; return ret; } if (item_attr_get(ritem, attr_direction, &direction)) ret->way.dir=direction.u.num; else ret->way.dir=0; sitem=street_item.u.item; ret->way.item=*sitem; item_hash_insert(this_->hash, sitem, ret); mr=map_rect_new(sitem->map, NULL); if (! (sitem=map_rect_get_item_byid(mr, sitem->id_hi, sitem->id_lo))) { g_free(ret); map_rect_destroy(mr); return NULL; } if (item_attr_get(sitem, attr_street_name, &attr)) ret->way.name1=map_convert_string(sitem->map,attr.u.str); if (item_attr_get(sitem, attr_street_name_systematic, &attr)) ret->way.name2=map_convert_string(sitem->map,attr.u.str); navigation_itm_update(ret, ritem); while (item_coord_get(ritem, &c[i], 1)) { dbg(1, "coord %d 0x%x 0x%x\n", i, c[i].x ,c[i].y); if (i < 4) i++; else { c[2]=c[3]; c[3]=c[4]; } } dbg(1,"count=%d\n", i); i--; ret->way.angle2=road_angle(&c[0], &c[1], 0); ret->angle_end=road_angle(&c[i-1], &c[i], 0); ret->start=c[0]; ret->end=c[i]; item_attr_get(ritem, attr_route, &route_attr); graph_map = route_get_graph_map(route_attr.u.route); if (check_roundabout(ret, graph_map)) { ret->way.flags |= AF_ROUNDABOUT; } dbg(1,"i=%d start %d end %d '%s' '%s'\n", i, ret->way.angle2, ret->angle_end, ret->way.name1, ret->way.name2); map_rect_destroy(mr); } else { if (this_->last) ret->start=ret->end=this_->last->end; } if (! this_->first) this_->first=ret; if (this_->last) { this_->last->next=ret; ret->prev=this_->last; if (graph_map) { navigation_itm_ways_update(ret,graph_map); } } dbg(1,"ret=%p\n", ret); this_->last=ret; return ret; } /** * @brief Counts how many times a driver could turn right/left * * This function counts how many times the driver theoretically could * turn right/left between two navigation items, not counting the final * turn itself. * * @param from The navigation item which should form the start * @param to The navigation item which should form the end * @param direction Set to < 0 to count turns to the left >= 0 for turns to the right * @return The number of possibilities to turn or -1 on error */ static int count_possible_turns(struct navigation *nav, struct navigation_itm *from, struct navigation_itm *to, int direction) { int count; struct navigation_itm *curr; struct navigation_way *w; count = 0; curr = from->next; while (curr && (curr != to)) { w = curr->way.next; while (w) { if (is_way_allowed(nav, w, 4)) { if (direction < 0) { if (angle_delta(curr->prev->angle_end, w->angle2) < 0) { count++; break; } } else { if (angle_delta(curr->prev->angle_end, w->angle2) > 0) { count++; break; } } } w = w->next; } curr = curr->next; } if (!curr) { // from does not lead to to? return -1; } return count; } /** * @brief Calculates distance and time to the destination * * This function calculates the distance and the time to the destination of a * navigation. If incr is set, this is only calculated for the first navigation * item, which is a lot faster than re-calculation the whole destination, but works * only if the rest of the navigation already has been calculated. * * @param this_ The navigation whose destination / time should be calculated * @param incr Set this to true to only calculate the first item. See description. */ static void calculate_dest_distance(struct navigation *this_, int incr) { int len=0, time=0, count=0; struct navigation_itm *next,*itm=this_->last; dbg(1, "enter this_=%p, incr=%d\n", this_, incr); if (incr) { if (itm) { dbg(2, "old values: (%p) time=%d lenght=%d\n", itm, itm->dest_length, itm->dest_time); } else { dbg(2, "old values: itm is null\n"); } itm=this_->first; next=itm->next; dbg(2, "itm values: time=%d lenght=%d\n", itm->length, itm->time); dbg(2, "next values: (%p) time=%d lenght=%d\n", next, next->dest_length, next->dest_time); itm->dest_length=next->dest_length+itm->length; itm->dest_count=next->dest_count+1; itm->dest_time=next->dest_time+itm->time; dbg(2, "new values: time=%d lenght=%d\n", itm->dest_length, itm->dest_time); return; } while (itm) { len+=itm->length; time+=itm->time; itm->dest_length=len; itm->dest_time=time; itm->dest_count=count++; itm=itm->prev; } dbg(1,"len %d time %d\n", len, time); } /** * @brief Checks if two navigation items are on the same street * * This function checks if two navigation items are on the same street. It returns * true if either their name or their "systematic name" (e.g. "A6" or "B256") are the * same. * * @param old The first item to be checked * @param new The second item to be checked * @return True if both old and new are on the same street */ static int is_same_street2(char *old_name1, char *old_name2, char *new_name1, char *new_name2) { if (old_name1 && new_name1 && !strcmp(old_name1, new_name1)) { dbg(1,"is_same_street: '%s' '%s' vs '%s' '%s' yes (1.)\n", old_name2, new_name2, old_name1, new_name1); return 1; } if (old_name2 && new_name2 && !strcmp(old_name2, new_name2)) { dbg(1,"is_same_street: '%s' '%s' vs '%s' '%s' yes (2.)\n", old_name2, new_name2, old_name1, new_name1); return 1; } dbg(1,"is_same_street: '%s' '%s' vs '%s' '%s' no\n", old_name2, new_name2, old_name1, new_name1); return 0; } #if 0 /** * @brief Checks if two navigation items are on the same street * * This function checks if two navigation items are on the same street. It returns * true if the first part of their "systematic name" is equal. If the "systematic name" is * for example "A352/E3" (a german highway which at the same time is part of the international * E-road network), it would only search for "A352" in the second item's systematic name. * * @param old The first item to be checked * @param new The second item to be checked * @return True if the "systematic name" of both items matches. See description. */ static int is_same_street_systematic(struct navigation_itm *old, struct navigation_itm *new) { int slashold,slashnew; if (!old->name2 || !new->name2) return 1; slashold=strcspn(old->name2, "/"); slashnew=strcspn(new->name2, "/"); if (slashold != slashnew || strncmp(old->name2, new->name2, slashold)) return 0; return 1; } /** * @brief Check if there are multiple possibilities to drive from old * * This function checks, if there are multiple streets connected to the exit of "old". * Sometimes it happens that an item on a map is just segmented, without any other streets * being connected there, and it is not useful if navit creates a maneuver there. * * @param new The navigation item we're driving to * @return True if there are multiple streets */ static int maneuver_multiple_streets(struct navigation_itm *new) { if (new->way.next) { return 1; } else { return 0; } } /** * @brief Check if the new item is entered "straight" * * This function checks if the new item is entered "straight" from the old item, i.e. if there * is no other street one could take from the old item on with less steering. * * @param new The navigation item we're driving to * @param diff The absolute angle one needs to steer to drive to this item * @return True if the new item is entered "straight" */ static int maneuver_straight(struct navigation_itm *new, int diff) { int curr_diff; struct navigation_way *w; w = new->way.next; dbg(1,"diff=%d\n", diff); while (w) { curr_diff=abs(angle_delta(new->prev->angle_end, w->angle2)); dbg(1,"curr_diff=%d\n", curr_diff); if (curr_diff < diff) { return 0; } w = w->next; } return 1; } #endif static int maneuver_category(enum item_type type) { switch (type) { case type_street_0: return 1; case type_street_1_city: return 2; case type_street_2_city: return 3; case type_street_3_city: return 4; case type_street_4_city: return 5; case type_highway_city: return 7; case type_street_1_land: return 2; case type_street_2_land: return 3; case type_street_3_land: return 4; case type_street_4_land: return 5; case type_street_n_lanes: return 6; case type_highway_land: return 7; case type_ramp: return 0; case type_roundabout: return 0; case type_ferry: return 0; default: return 0; } } static int is_way_allowed(struct navigation *nav, struct navigation_way *way, int mode) { if (!nav->vehicleprofile) return 1; return !way->flags || ((way->flags & (way->dir >= 0 ? nav->vehicleprofile->flags_forward_mask : nav->vehicleprofile->flags_reverse_mask)) == nav->vehicleprofile->flags); } /** * @brief Checks if navit has to create a maneuver to drive from old to new * * This function checks if it has to create a "maneuver" - i.e. guide the user - to drive * from "old" to "new". * * @param old The old navigation item, where we're coming from * @param new The new navigation item, where we're going to * @param delta The angle the user has to steer to navigate from old to new * @param reason A text string explaining how the return value resulted * @return True if navit should guide the user, false otherwise */ static int maneuver_required2(struct navigation *nav, struct navigation_itm *old, struct navigation_itm *new, int *delta, char **reason) { int ret=0,d,dw,dlim; char *r=NULL; struct navigation_way *w; int cat,ncat,wcat,maxcat,left=-180,right=180,is_unambigous=0,is_same_street; int curve_limit=25; dbg(1,"enter %p %p %p\n",old, new, delta); d=angle_delta(old->angle_end, new->way.angle2); if (!new->way.next) { /* No announcement necessary */ r="no: Only one possibility"; } else if (!new->way.next->next && new->way.next->item.type == type_ramp && !is_way_allowed(nav,new->way.next,1)) { /* If the other way is only a ramp and it is one-way in the wrong direction, no announcement necessary */ r="no: Only ramp"; } if (! r) { if ((old->way.flags & AF_ROUNDABOUT) && ! (new->way.flags & AF_ROUNDABOUT)) { r="yes: leaving roundabout"; ret=1; } else if (!(old->way.flags & AF_ROUNDABOUT) && (new->way.flags & AF_ROUNDABOUT)) { r="no: entering roundabout"; } else if ((old->way.flags & AF_ROUNDABOUT) && (new->way.flags & AF_ROUNDABOUT)) r="no: staying in roundabout"; } if (!r && abs(d) > 75) { /* always make an announcement if you have to make a sharp turn */ r="yes: delta over 75"; ret=1; } cat=maneuver_category(old->way.item.type); ncat=maneuver_category(new->way.item.type); if (!r) { int dc=d; /* Check whether the street keeps its name */ is_same_street=is_same_street2(old->way.name1, old->way.name2, new->way.name1, new->way.name2); w = new->way.next; maxcat=-1; while (w) { dw=angle_delta(old->angle_end, w->angle2); if (dw < 0) { if (dw > left) left=dw; if (dw > -curve_limit && d < 0 && d > -curve_limit) dc=dw; } else { if (dw < right) right=dw; if (dw < curve_limit && d > 0 && d < curve_limit) dc=dw; } wcat=maneuver_category(w->item.type); /* If any other street has the same name but isn't a highway (a highway might split up temporarily), then we can't use the same name criterium */ if (is_same_street && is_same_street2(old->way.name1, old->way.name2, w->name1, w->name2) && (cat != 7 || wcat != 7) && is_way_allowed(nav,w,2)) is_same_street=0; /* Even if the ramp has the same name, announce it */ if (new->way.item.type == type_ramp && old->way.item.type != type_ramp) is_same_street=0; /* Mark if the street has a higher or the same category */ if (wcat > maxcat) maxcat=wcat; w = w->next; } /* get the delta limit for checking for other streets. It is lower if the street has no other streets of the same or higher category */ if (ncat < cat) dlim=80; else dlim=120; /* if the street is really straight, the others might be closer to straight */ if (abs(d) < 20) dlim/=2; if ((maxcat == ncat && maxcat == cat) || (ncat == 0 && cat == 0)) dlim=abs(d)*620/256; else if (maxcat < ncat && maxcat < cat) dlim=abs(d)*128/256; if (left < -dlim && right > dlim) is_unambigous=1; if (dc != d) { dbg(1,"d %d vs dc %d\n",d,dc); d-=(dc+d+1)/2; dbg(1,"result %d\n",d); is_unambigous=0; } if (!is_same_street && is_unambigous < 1) { ret=1; r="yes: not same street or ambigous"; } else r="no: same street and unambigous"; #ifdef DEBUG r=g_strdup_printf("yes: d %d left %d right %d dlim=%d cat old:%d new:%d max:%d unambigous=%d same_street=%d", d, left, right, dlim, cat, ncat, maxcat, is_unambigous, is_same_street); #endif } *delta=d; if (reason) *reason=r; return ret; #if 0 if (new->item.type == old->item.type || (new->item.type != type_ramp && old->item.type != type_ramp)) { if (is_same_street2(old, new)) { if (! entering_straight(new, abs(*delta))) { dbg(1, "maneuver_required: Not driving straight: yes\n"); if (reason) *reason="yes: Not driving straight"; return 1; } if (check_multiple_streets(new)) { if (entering_straight(new,abs(*delta)*2)) { if (reason) *reason="no: delta < ext_limit for same name"; return 0; } if (reason) *reason="yes: delta > ext_limit for same name"; return 1; } else { dbg(1, "maneuver_required: Staying on the same street: no\n"); if (reason) *reason="no: Staying on same street"; return 0; } } } else dbg(1, "maneuver_required: old or new is ramp\n"); #if 0 if (old->item.type == type_ramp && (new->item.type == type_highway_city || new->item.type == type_highway_land)) { dbg(1, "no_maneuver_required: old is ramp new is highway\n"); if (reason) *reason="no: old is ramp new is highway"; return 0; } #endif #if 0 if (old->crossings_end == 2) { dbg(1, "maneuver_required: only 2 connections: no\n"); return 0; } #endif dbg(1,"delta=%d-%d=%d\n", new->way.angle2, old->angle_end, *delta); if ((new->item.type == type_highway_land || new->item.type == type_highway_city || old->item.type == type_highway_land || old->item.type == type_highway_city) && (!is_same_street_systematic(old, new) || (old->name2 != NULL && new->name2 == NULL))) { dbg(1, "maneuver_required: highway changed name\n"); if (reason) *reason="yes: highway changed name"; return 1; } if (abs(*delta) < straight_limit) { if (! entering_straight(new,abs(*delta))) { if (reason) *reason="yes: not straight"; dbg(1, "maneuver_required: not driving straight: yes\n"); return 1; } dbg(1, "maneuver_required: delta(%d) < %d: no\n", *delta, straight_limit); if (reason) *reason="no: delta < limit"; return 0; } if (abs(*delta) < ext_straight_limit) { if (entering_straight(new,abs(*delta)*2)) { if (reason) *reason="no: delta < ext_limit"; return 0; } } if (! check_multiple_streets(new)) { dbg(1, "maneuver_required: only one possibility: no\n"); if (reason) *reason="no: only one possibility"; return 0; } dbg(1, "maneuver_required: delta=%d: yes\n", *delta); if (reason) *reason="yes: delta >= limit"; return 1; #endif } static struct navigation_command * command_new(struct navigation *this_, struct navigation_itm *itm, int delta) { struct navigation_command *ret=g_new0(struct navigation_command, 1); dbg(1,"enter this_=%p itm=%p delta=%d\n", this_, itm, delta); ret->delta=delta; ret->itm=itm; if (itm && itm->prev && itm->way.next && itm->prev->way.next && !(itm->way.flags & AF_ROUNDABOUT) && (itm->prev->way.flags & AF_ROUNDABOUT)) { int len=0; int angle=0; int entry_angle; struct navigation_itm *itm2=itm->prev; int exit_angle=angle_median(itm->prev->angle_end, itm->way.next->angle2); dbg(1,"exit %d median from %d,%d\n", exit_angle,itm->prev->angle_end, itm->way.next->angle2); while (itm2 && (itm2->way.flags & AF_ROUNDABOUT)) { len+=itm2->length; angle=itm2->angle_end; itm2=itm2->prev; } if (itm2 && itm2->next && itm2->next->way.next) { itm2=itm2->next; entry_angle=angle_median(angle_opposite(itm2->way.angle2), itm2->way.next->angle2); dbg(1,"entry %d median from %d(%d),%d\n", entry_angle,angle_opposite(itm2->way.angle2), itm2->way.angle2, itm2->way.next->angle2); } else { entry_angle=angle_opposite(angle); } dbg(0,"entry %d exit %d\n", entry_angle, exit_angle); ret->roundabout_delta=angle_delta(entry_angle, exit_angle); ret->length=len+roundabout_extra_length; } if (this_->cmd_last) { this_->cmd_last->next=ret; ret->prev = this_->cmd_last; } this_->cmd_last=ret; if (!this_->cmd_first) this_->cmd_first=ret; return ret; } static void make_maneuvers(struct navigation *this_, struct route *route) { struct navigation_itm *itm, *last=NULL, *last_itm=NULL; int delta; itm=this_->first; this_->cmd_last=NULL; this_->cmd_first=NULL; while (itm) { if (last) { if (maneuver_required2(this_, last_itm, itm,&delta,NULL)) { command_new(this_, itm, delta); } } else last=itm; last_itm=itm; itm=itm->next; } command_new(this_, last_itm, 0); } static int contains_suffix(char *name, char *suffix) { if (!suffix) return 0; if (strlen(name) < strlen(suffix)) return 0; return !navit_utf8_strcasecmp(name+strlen(name)-strlen(suffix), suffix); } static char * replace_suffix(char *name, char *search, char *replace) { int len=strlen(name)-strlen(search); char *ret=g_malloc(len+strlen(replace)+1); strncpy(ret, name, len); strcpy(ret+len, replace); if (isupper(name[len])) { ret[len]=toupper(ret[len]); } return ret; } static char * navigation_item_destination(struct navigation *nav, struct navigation_itm *itm, struct navigation_itm *next, char *prefix) { char *ret=NULL,*name1,*sep,*name2; char *n1,*n2; int i,sex; int vocabulary1=65535; int vocabulary2=65535; struct attr attr; if (! prefix) prefix=""; if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_name, &attr, NULL)) vocabulary1=attr.u.num; if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_name_systematic, &attr, NULL)) vocabulary2=attr.u.num; n1=itm->way.name1; n2=itm->way.name2; if (!vocabulary1) n1=NULL; if (!vocabulary2) n2=NULL; if(!n1 && !n2 && itm->way.item.type == type_ramp && vocabulary2) { dbg(1,">> Next is ramp %x current is %x \n", itm->way.item.type, next->way.item.type); if(next->way.item.type == type_ramp) return NULL; if(itm->way.item.type == type_highway_city || itm->way.item.type == type_highway_land ) return g_strdup_printf("%s%s",prefix,_("exit")); /* %FIXME Can this even be reached? */ else return g_strdup_printf("%s%s",prefix,_("into the ramp")); } if (!n1 && !n2) return NULL; if (n1) { sex=-1; name1=NULL; for (i = 0 ; i < sizeof(suffixes)/sizeof(suffixes[0]) ; i++) { if (contains_suffix(n1,suffixes[i].fullname)) { sex=suffixes[i].sex; name1=g_strdup(n1); break; } if (contains_suffix(n1,suffixes[i].abbrev)) { sex=suffixes[i].sex; name1=replace_suffix(n1, suffixes[i].abbrev, suffixes[i].fullname); break; } } if (n2) { name2=n2; sep=" "; } else { name2=""; sep=""; } switch (sex) { case -1: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name */ ret=g_strdup_printf(_("%sinto the street %s%s%s"),prefix,n1, sep, name2); break; case 1: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%sinto the %s%s%s|male form"),prefix,name1, sep, name2); break; case 2: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%sinto the %s%s%s|female form"),prefix,name1, sep, name2); break; case 3: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%sinto the %s%s%s|neutral form"),prefix,name1, sep, name2); break; } g_free(name1); } else /* TRANSLATORS: gives the name of the next road to turn into (into the E17) */ ret=g_strdup_printf(_("%sinto the %s"),prefix,n2); name1=ret; while (name1 && *name1) { switch (*name1) { case '|': *name1='\0'; break; case '/': *name1++=' '; break; default: name1++; } } return ret; } static char * show_maneuver(struct navigation *nav, struct navigation_itm *itm, struct navigation_command *cmd, enum attr_type type, int connect) { /* TRANSLATORS: right, as in 'Turn right' */ const char *dir=_("right"),*strength=""; int distance=itm->dest_length-cmd->itm->dest_length; char *d,*ret=NULL; int delta=cmd->delta; int level; int strength_needed; int skip_roads; int count_roundabout; struct navigation_itm *cur; struct navigation_way *w; if (connect) { level = -2; // level = -2 means "connect to another maneuver via 'then ...'" } else { level=1; } w = itm->next->way.next; strength_needed = 0; if (angle_delta(itm->next->way.angle2,itm->angle_end) < 0) { while (w) { if (angle_delta(w->angle2,itm->angle_end) < 0) { strength_needed = 1; break; } w = w->next; } } else { while (w) { if (angle_delta(w->angle2,itm->angle_end) > 0) { strength_needed = 1; break; } w = w->next; } } if (delta < 0) { /* TRANSLATORS: left, as in 'Turn left' */ dir=_("left"); delta=-delta; } if (strength_needed) { if (delta < 45) { /* TRANSLATORS: Don't forget the ending space */ strength=_("easily "); } else if (delta < 105) { strength=""; } else if (delta < 165) { /* TRANSLATORS: Don't forget the ending space */ strength=_("strongly "); } else if (delta < 180) { /* TRANSLATORS: Don't forget the ending space */ strength=_("really strongly "); } else { dbg(1,"delta=%d\n", delta); /* TRANSLATORS: Don't forget the ending space */ strength=_("unknown "); } } if (type != attr_navigation_long_exact) distance=round_distance(distance); if (type == attr_navigation_speech) { if (nav->turn_around && nav->turn_around == nav->turn_around_limit) { navigation_set_turnaround(nav, nav->turn_around_count+1); return g_strdup(_("When possible, please turn around")); } navigation_set_turnaround(nav, 0); if (!connect) { level=navigation_get_announce_level_cmd(nav, itm, cmd, distance-cmd->length); } dbg(1,"distance=%d level=%d type=0x%x\n", distance, level, itm->way.item.type); } if (cmd->itm->prev->way.flags & AF_ROUNDABOUT) { cur = cmd->itm->prev; count_roundabout = 0; while (cur && (cur->way.flags & AF_ROUNDABOUT)) { if (cur->next->way.next && is_way_allowed(nav,cur->next->way.next,3)) { // If the next segment has no exit or the exit isn't allowed, don't count it count_roundabout++; } cur = cur->prev; } switch (level) { case 2: return g_strdup(_("Enter the roundabout soon")); case 1: d = get_distance(nav, distance, type, 0); /* TRANSLATORS: %s is the distance to the roundabout */ ret = g_strdup_printf(_("Enter the roundabout %s"), d); g_free(d); return ret; case -2: return g_strdup_printf(_("then leave the roundabout at the %s"), get_exit_count_str(count_roundabout)); case 0: return g_strdup_printf(_("Leave the roundabout at the %s"), get_exit_count_str(count_roundabout)); } } switch(level) { case 3: d=get_distance(nav, distance, type, 1); ret=g_strdup_printf(_("Follow the road for the next %s"), d); g_free(d); return ret; case 2: d=g_strdup(_("soon")); break; case 1: d=get_distance(nav, distance, attr_navigation_short, 0); break; case 0: skip_roads = count_possible_turns(nav,cmd->prev?cmd->prev->itm:nav->first,cmd->itm,cmd->delta); if (skip_roads > 0) { if (get_count_str(skip_roads+1)) { /* TRANSLATORS: First argument is the how manieth street to take, second the direction */ ret = g_strdup_printf(_("Take the %1$s road to the %2$s"), get_count_str(skip_roads+1), dir); return ret; } else { d = g_strdup_printf(_("after %i roads"), skip_roads); } } else { d=g_strdup(_("now")); } break; case -2: skip_roads = count_possible_turns(nav,cmd->prev->itm,cmd->itm,cmd->delta); if (skip_roads > 0) { /* TRANSLATORS: First argument is the how manieth street to take, second the direction */ if (get_count_str(skip_roads+1)) { ret = g_strdup_printf(_("then take the %1$s road to the %2$s"), get_count_str(skip_roads+1), dir); return ret; } else { d = g_strdup_printf(_("after %i roads"), skip_roads); } } else { d = g_strdup(""); } break; default: d=g_strdup(_("error")); } if (cmd->itm->next) { int tellstreetname = 0; char *destination = NULL; if(type == attr_navigation_speech) { // In voice mode // In Voice Mode only tell the street name in level 1 or in level 0 if level 1 // was skipped if (level == 1) { // we are close to the intersection cmd->itm->streetname_told = 1; // remeber to be checked when we turn tellstreetname = 1; // Ok so we tell the name of the street } if (level == 0) { if(cmd->itm->streetname_told == 0) // we are right at the intersection tellstreetname = 1; else cmd->itm->streetname_told = 0; // reset just in case we come to the same street again } } else tellstreetname = 1; if(nav->tell_street_name && tellstreetname) destination=navigation_item_destination(nav, cmd->itm, itm, " "); if (level != -2) { /* TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' */ ret=g_strdup_printf(_("Turn %1$s%2$s %3$s%4$s"), strength, dir, d, destination ? destination:""); } else { /* TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination */ ret=g_strdup_printf(_("then turn %1$s%2$s %3$s%4$s"), strength, dir, d, destination ? destination:""); } g_free(destination); } else { if (!connect) { ret=g_strdup_printf(_("You have reached your destination %s"), d); } else { ret=g_strdup(_("then you have reached your destination.")); } if (type == attr_navigation_speech && (nav->flags & 1)) route_set_destination(nav->route, NULL, 0); } g_free(d); return ret; } /** * @brief Creates announcements for maneuvers, plus maneuvers immediately following the next maneuver * * This function does create an announcement for the current maneuver and for maneuvers * immediately following that maneuver, if these are too close and we're in speech navigation. * * @return An announcement that should be made */ static char * show_next_maneuvers(struct navigation *nav, struct navigation_itm *itm, struct navigation_command *cmd, enum attr_type type) { struct navigation_command *cur,*prev; int distance=itm->dest_length-cmd->itm->dest_length; int level, i, time; int speech_time,time2nav; char *ret,*old,*buf,*next; if (type != attr_navigation_speech) { return show_maneuver(nav, itm, cmd, type, 0); // We accumulate maneuvers only in speech navigation } level=navigation_get_announce_level(nav, itm->way.item.type, distance-cmd->length); if (level > 1) { return show_maneuver(nav, itm, cmd, type, 0); // We accumulate maneuvers only if they are close } if (cmd->itm->told) { return g_strdup(""); } ret = show_maneuver(nav, itm, cmd, type, 0); time2nav = navigation_time(itm,cmd->itm->prev); old = NULL; cur = cmd->next; prev = cmd; i = 0; while (cur && cur->itm) { // We don't merge more than 3 announcements... if (i > 1) { // if you change this, please also change the value below, that is used to terminate the loop break; } next = show_maneuver(nav,prev->itm, cur, type, 0); if (nav->speech) speech_time = speech_estimate_duration(nav->speech,next); else speech_time = -1; g_free(next); if (speech_time == -1) { // user didn't set cps speech_time = 30; // assume 3 seconds } time = navigation_time(prev->itm,cur->itm->prev); if (time >= (speech_time + 30)) { // 3 seconds for understanding what has been said break; } old = ret; buf = show_maneuver(nav, prev->itm, cur, type, 1); ret = g_strdup_printf("%s, %s", old, buf); g_free(buf); if (nav->speech && speech_estimate_duration(nav->speech,ret) > time2nav) { g_free(ret); ret = old; i = 2; // This will terminate the loop } else { g_free(old); } // If the two maneuvers are *really* close, we shouldn't tell the second one again, because TTS won't be fast enough if (time <= speech_time) { cur->itm->told = 1; } prev = cur; cur = cur->next; i++; } return ret; } static void navigation_call_callbacks(struct navigation *this_, int force_speech) { int distance, level = 0; void *p=this_; if (!this_->cmd_first) return; callback_list_call(this_->callback, 1, &p); dbg(1,"force_speech=%d turn_around=%d turn_around_limit=%d\n", force_speech, this_->turn_around, this_->turn_around_limit); distance=round_distance(this_->first->dest_length-this_->cmd_first->itm->dest_length); if (this_->turn_around_limit && this_->turn_around == this_->turn_around_limit) { dbg(1,"distance=%d distance_turn=%d\n", distance, this_->distance_turn); while (distance > this_->distance_turn) { this_->level_last=4; level=4; force_speech=2; if (this_->distance_turn >= 500) this_->distance_turn*=2; else this_->distance_turn=500; } } else if (!this_->turn_around_limit || this_->turn_around == -this_->turn_around_limit+1) { this_->distance_turn=50; distance-=this_->cmd_first->length; level=navigation_get_announce_level_cmd(this_, this_->first, this_->cmd_first, distance); if (level < this_->level_last) { /* only tell if the level is valid for more than 3 seconds */ int speed_distance=this_->first->speed*30/36; if (distance < speed_distance || navigation_get_announce_level_cmd(this_, this_->first, this_->cmd_first, distance-speed_distance) == level) { dbg(1,"distance %d speed_distance %d\n",distance,speed_distance); dbg(1,"level %d < %d\n", level, this_->level_last); this_->level_last=level; force_speech=3; } } if (!item_is_equal(this_->cmd_first->itm->way.item, this_->item_last)) { this_->item_last=this_->cmd_first->itm->way.item; if (this_->delay) this_->curr_delay=this_->delay; else force_speech=5; } else { if (this_->curr_delay) { this_->curr_delay--; if (!this_->curr_delay) force_speech=4; } } } if (force_speech) { this_->level_last=level; this_->curr_delay=0; dbg(1,"force_speech=%d distance=%d level=%d type=0x%x\n", force_speech, distance, level, this_->first->way.item.type); callback_list_call(this_->callback_speech, 1, &p); } } static void navigation_update(struct navigation *this_, struct route *route, struct attr *attr) { struct map *map; struct map_rect *mr; struct item *ritem; /* Holds an item from the route map */ struct item *sitem; /* Holds the corresponding item from the actual map */ struct attr street_item,street_direction; struct navigation_itm *itm; struct attr vehicleprofile; int mode=0, incr=0, first=1; if (attr->type != attr_route_status) return; dbg(1,"enter %d\n", mode); if (attr->u.num == route_status_no_destination || attr->u.num == route_status_not_found || attr->u.num == route_status_path_done_new) navigation_flush(this_); if (attr->u.num != route_status_path_done_new && attr->u.num != route_status_path_done_incremental) return; if (! this_->route) return; map=route_get_map(this_->route); if (! map) return; mr=map_rect_new(map, NULL); if (! mr) return; if (route_get_attr(route, attr_vehicleprofile, &vehicleprofile, NULL)) this_->vehicleprofile=vehicleprofile.u.vehicleprofile; else this_->vehicleprofile=NULL; dbg(1,"enter\n"); while ((ritem=map_rect_get_item(mr))) { if (ritem->type == type_route_start && this_->turn_around > -this_->turn_around_limit+1) this_->turn_around--; if (ritem->type == type_route_start_reverse && this_->turn_around < this_->turn_around_limit) this_->turn_around++; if (ritem->type != type_street_route) continue; if (first && item_attr_get(ritem, attr_street_item, &street_item)) { first=0; if (!item_attr_get(ritem, attr_direction, &street_direction)) street_direction.u.num=0; sitem=street_item.u.item; dbg(1,"sitem=%p\n", sitem); itm=item_hash_lookup(this_->hash, sitem); dbg(2,"itm for item with id (0x%x,0x%x) is %p\n", sitem->id_hi, sitem->id_lo, itm); if (itm && itm->way.dir != street_direction.u.num) { dbg(2,"wrong direction\n"); itm=NULL; } navigation_destroy_itms_cmds(this_, itm); if (itm) { navigation_itm_update(itm, ritem); break; } dbg(1,"not on track\n"); } navigation_itm_new(this_, ritem); } dbg(2,"turn_around=%d\n", this_->turn_around); if (first) navigation_destroy_itms_cmds(this_, NULL); else { if (! ritem) { navigation_itm_new(this_, NULL); make_maneuvers(this_,this_->route); } calculate_dest_distance(this_, incr); profile(0,"end"); navigation_call_callbacks(this_, FALSE); } map_rect_destroy(mr); } static void navigation_flush(struct navigation *this_) { navigation_destroy_itms_cmds(this_, NULL); } void navigation_destroy(struct navigation *this_) { navigation_flush(this_); item_hash_destroy(this_->hash); callback_list_destroy(this_->callback); callback_list_destroy(this_->callback_speech); g_free(this_); } int navigation_register_callback(struct navigation *this_, enum attr_type type, struct callback *cb) { if (type == attr_navigation_speech) callback_list_add(this_->callback_speech, cb); else callback_list_add(this_->callback, cb); return 1; } void navigation_unregister_callback(struct navigation *this_, enum attr_type type, struct callback *cb) { if (type == attr_navigation_speech) callback_list_remove(this_->callback_speech, cb); else callback_list_remove(this_->callback, cb); } struct map * navigation_get_map(struct navigation *this_) { struct attr *attrs[5]; struct attr type,navigation,data,description; type.type=attr_type; type.u.str="navigation"; navigation.type=attr_navigation; navigation.u.navigation=this_; data.type=attr_data; data.u.str=""; description.type=attr_description; description.u.str="Navigation"; attrs[0]=&type; attrs[1]=&navigation; attrs[2]=&data; attrs[3]=&description; attrs[4]=NULL; if (! this_->map) this_->map=map_new(NULL, attrs); return this_->map; } struct map_priv { struct navigation *navigation; }; struct map_rect_priv { struct navigation *nav; struct navigation_command *cmd; struct navigation_command *cmd_next; struct navigation_itm *itm; struct navigation_itm *itm_next; struct navigation_itm *cmd_itm; struct navigation_itm *cmd_itm_next; struct item item; enum attr_type attr_next; int ccount; int debug_idx; struct navigation_way *ways; int show_all; char *str; }; static int navigation_map_item_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *this=priv_data; if (this->ccount || ! count) return 0; *c=this->itm->start; this->ccount=1; return 1; } static void navigation_map_item_coord_rewind(void *priv_data) { struct map_rect_priv *this=priv_data; this->ccount=0; } static int navigation_map_item_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *this_=priv_data; struct navigation_command *cmd=this_->cmd; struct navigation_itm *itm=this_->itm; struct navigation_itm *prev=itm->prev; attr->type=attr_type; if (this_->str) { g_free(this_->str); this_->str=NULL; } if (cmd) { if (cmd->itm != itm) cmd=NULL; } switch(attr_type) { case attr_level: if (cmd) { int distance=this_->cmd_itm->dest_length-cmd->itm->dest_length; distance=round_distance(distance); attr->u.num=navigation_get_announce_level(this_->nav, this_->cmd_itm->way.item.type, distance-cmd->length); return 1; } return 0; case attr_navigation_short: this_->attr_next=attr_navigation_long; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); return 1; } return 0; case attr_navigation_long: this_->attr_next=attr_navigation_long_exact; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); return 1; } return 0; case attr_navigation_long_exact: this_->attr_next=attr_navigation_speech; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); return 1; } return 0; case attr_navigation_speech: this_->attr_next=attr_length; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, this_->cmd, attr_type); return 1; } return 0; case attr_length: this_->attr_next=attr_time; if (cmd) { attr->u.num=this_->cmd_itm->dest_length-cmd->itm->dest_length; return 1; } return 0; case attr_time: this_->attr_next=attr_destination_length; if (cmd) { attr->u.num=this_->cmd_itm->dest_time-cmd->itm->dest_time; return 1; } return 0; case attr_destination_length: attr->u.num=itm->dest_length; this_->attr_next=attr_destination_time; return 1; case attr_destination_time: attr->u.num=itm->dest_time; this_->attr_next=attr_street_name; return 1; case attr_street_name: attr->u.str=itm->way.name1; this_->attr_next=attr_street_name_systematic; if (attr->u.str) return 1; return 0; case attr_street_name_systematic: attr->u.str=itm->way.name2; this_->attr_next=attr_debug; if (attr->u.str) return 1; return 0; case attr_debug: switch(this_->debug_idx) { case 0: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("angle:%d (- %d)", itm->way.angle2, itm->angle_end); return 1; case 1: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("item type:%s", item_to_name(itm->way.item.type)); return 1; case 2: this_->debug_idx++; if (cmd) { this_->str=attr->u.str=g_strdup_printf("delta:%d", cmd->delta); return 1; } case 3: this_->debug_idx++; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev street_name:%s", prev->way.name1); return 1; } case 4: this_->debug_idx++; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev street_name_systematic:%s", prev->way.name2); return 1; } case 5: this_->debug_idx++; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev angle:(%d -) %d", prev->way.angle2, prev->angle_end); return 1; } case 6: this_->debug_idx++; this_->ways=itm->way.next; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev item type:%s", item_to_name(prev->way.item.type)); return 1; } case 7: if (this_->ways && prev) { this_->str=attr->u.str=g_strdup_printf("other item angle:%d delta:%d flags:%d dir:%d type:%s id:(0x%x,0x%x)", this_->ways->angle2, angle_delta(prev->angle_end, this_->ways->angle2), this_->ways->flags, this_->ways->dir, item_to_name(this_->ways->item.type), this_->ways->item.id_hi, this_->ways->item.id_lo); this_->ways=this_->ways->next; return 1; } this_->debug_idx++; case 8: this_->debug_idx++; if (prev) { int delta=0; char *reason=NULL; maneuver_required2(this_->nav, prev, itm, &delta, &reason); this_->str=attr->u.str=g_strdup_printf("reason:%s",reason); return 1; } default: this_->attr_next=attr_none; return 0; } case attr_any: while (this_->attr_next != attr_none) { if (navigation_map_item_attr_get(priv_data, this_->attr_next, attr)) return 1; } return 0; default: attr->type=attr_none; return 0; } } static void navigation_map_item_attr_rewind(void *priv_data) { struct map_rect_priv *priv = priv_data; priv->debug_idx=0; priv->attr_next=attr_navigation_short; } static struct item_methods navigation_map_item_methods = { navigation_map_item_coord_rewind, navigation_map_item_coord_get, navigation_map_item_attr_rewind, navigation_map_item_attr_get, }; static void navigation_map_destroy(struct map_priv *priv) { g_free(priv); } static void navigation_map_rect_init(struct map_rect_priv *priv) { priv->cmd_next=priv->nav->cmd_first; priv->cmd_itm_next=priv->itm_next=priv->nav->first; } static struct map_rect_priv * navigation_map_rect_new(struct map_priv *priv, struct map_selection *sel) { struct navigation *nav=priv->navigation; struct map_rect_priv *ret=g_new0(struct map_rect_priv, 1); ret->nav=nav; navigation_map_rect_init(ret); ret->item.meth=&navigation_map_item_methods; ret->item.priv_data=ret; #ifdef DEBUG ret->show_all=1; #endif return ret; } static void navigation_map_rect_destroy(struct map_rect_priv *priv) { g_free(priv->str); g_free(priv); } static struct item * navigation_map_get_item(struct map_rect_priv *priv) { struct item *ret=&priv->item; int delta; if (!priv->itm_next) return NULL; priv->itm=priv->itm_next; priv->cmd=priv->cmd_next; priv->cmd_itm=priv->cmd_itm_next; if (!priv->cmd) return NULL; if (!priv->show_all && priv->itm->prev != NULL) priv->itm=priv->cmd->itm; priv->itm_next=priv->itm->next; if (priv->itm->prev) ret->type=type_nav_none; else ret->type=type_nav_position; if (priv->cmd->itm == priv->itm) { priv->cmd_itm_next=priv->cmd->itm; priv->cmd_next=priv->cmd->next; if (priv->cmd_itm_next && !priv->cmd_itm_next->next) ret->type=type_nav_destination; else { if (priv->itm && priv->itm->prev && !(priv->itm->way.flags & AF_ROUNDABOUT) && (priv->itm->prev->way.flags & AF_ROUNDABOUT)) { enum item_type r=type_none,l=type_none; switch (((180+22)-priv->cmd->roundabout_delta)/45) { case 0: case 1: r=type_nav_roundabout_r1; l=type_nav_roundabout_l7; break; case 2: r=type_nav_roundabout_r2; l=type_nav_roundabout_l6; break; case 3: r=type_nav_roundabout_r3; l=type_nav_roundabout_l5; break; case 4: r=type_nav_roundabout_r4; l=type_nav_roundabout_l4; break; case 5: r=type_nav_roundabout_r5; l=type_nav_roundabout_l3; break; case 6: r=type_nav_roundabout_r6; l=type_nav_roundabout_l2; break; case 7: r=type_nav_roundabout_r7; l=type_nav_roundabout_l1; break; case 8: r=type_nav_roundabout_r8; l=type_nav_roundabout_l8; break; } dbg(1,"delta %d\n",priv->cmd->delta); if (priv->cmd->delta < 0) ret->type=l; else ret->type=r; } else { delta=priv->cmd->delta; if (delta < 0) { delta=-delta; if (delta < 45) ret->type=type_nav_left_1; else if (delta < 105) ret->type=type_nav_left_2; else if (delta < 165) ret->type=type_nav_left_3; else ret->type=type_none; } else { if (delta < 45) ret->type=type_nav_right_1; else if (delta < 105) ret->type=type_nav_right_2; else if (delta < 165) ret->type=type_nav_right_3; else ret->type=type_none; } } } } navigation_map_item_coord_rewind(priv); navigation_map_item_attr_rewind(priv); ret->id_lo=priv->itm->dest_count; dbg(1,"type=%d\n", ret->type); return ret; } static struct item * navigation_map_get_item_byid(struct map_rect_priv *priv, int id_hi, int id_lo) { struct item *ret; navigation_map_rect_init(priv); while ((ret=navigation_map_get_item(priv))) { if (ret->id_hi == id_hi && ret->id_lo == id_lo) return ret; } return NULL; } static struct map_methods navigation_map_meth = { projection_mg, "utf-8", navigation_map_destroy, navigation_map_rect_new, navigation_map_rect_destroy, navigation_map_get_item, navigation_map_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * navigation_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *ret; struct attr *navigation_attr; navigation_attr=attr_search(attrs, NULL, attr_navigation); if (! navigation_attr) return NULL; ret=g_new0(struct map_priv, 1); *meth=navigation_map_meth; ret->navigation=navigation_attr->u.navigation; return ret; } void navigation_set_route(struct navigation *this_, struct route *route) { struct attr callback; if (!this_->route_cb) this_->route_cb=callback_new_attr_1(callback_cast(navigation_update), attr_route_status, this_); callback.type=attr_callback; callback.u.callback=this_->route_cb; if (this_->route) route_remove_attr(this_->route, &callback); this_->route=route; if (this_->route) { struct attr route_status; route_add_attr(this_->route, &callback); if (route_get_attr(this_->route, attr_route_status, &route_status, NULL)) navigation_update(this_, this_->route, &route_status); } } void navigation_init(void) { plugin_register_map_type("navigation", navigation_map_new); } struct object_func navigation_func = { attr_navigation, (object_func_new)navigation_new, (object_func_get_attr)navigation_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navigation_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)navigation_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/navigation.h000066400000000000000000000035501221777731700206340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_NAVIGATION_H #define NAVIT_NAVIGATION_H #define FEET_PER_METER 3.2808399 #define FEET_PER_MILE 5280 #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; enum item_type; struct attr; struct attr_iter; struct callback; struct map; struct navigation; struct route; int navigation_get_attr(struct navigation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int navigation_set_attr(struct navigation *this_, struct attr *attr); struct navigation *navigation_new(struct attr *parent, struct attr **attrs); int navigation_set_announce(struct navigation *this_, enum item_type type, int *level); void navigation_destroy(struct navigation *this_); int navigation_register_callback(struct navigation *this_, enum attr_type type, struct callback *cb); void navigation_unregister_callback(struct navigation *this_, enum attr_type type, struct callback *cb); struct map *navigation_get_map(struct navigation *this_); void navigation_set_route(struct navigation *this_, struct route *route); void navigation_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/navit.c000066400000000000000000002670501221777731700176200ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _USE_MATH_DEFINES 1 #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include "debug.h" #include "navit.h" #include "callback.h" #include "gui.h" #include "item.h" #include "xmlconfig.h" #include "projection.h" #include "map.h" #include "mapset.h" #include "main.h" #include "coord.h" #include "point.h" #include "transform.h" #include "param.h" #include "menu.h" #include "graphics.h" #include "popup.h" #include "data_window.h" #include "route.h" #include "navigation.h" #include "speech.h" #include "track.h" #include "vehicle.h" #include "layout.h" #include "log.h" #include "attr.h" #include "event.h" #include "file.h" #include "profile.h" #include "command.h" #include "navit_nls.h" #include "map.h" #include "util.h" #include "messages.h" #include "vehicleprofile.h" #include "sunriset.h" #include "bookmarks.h" #ifdef HAVE_API_WIN32_BASE #include #include "util.h" #endif #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif /* define string for bookmark handling */ #define TEXTFILE_COMMENT_NAVI_STOPPED "# navigation stopped\n" /** * @defgroup navit the navit core instance. navit is the object containing nearly everything: A set of maps, one or more vehicle, a graphics object for rendering the map, a gui object for displaying the user interface, a route object, a navigation object and so on. Be warned that it is theoretically possible to have more than one navit object * @{ */ //! The navit_vehicule struct navit_vehicle { int follow; /*! Limit of the follow counter. See navit_add_vehicle */ int follow_curr; /*! Deprecated : follow counter itself. When it reaches 'update' counts, map is recentered*/ struct coord coord; int dir; int speed; struct coord last; /*< Position of the last update of this vehicle */ struct vehicle *vehicle; struct attr callback; int animate_cursor; }; struct navit { NAVIT_OBJECT struct attr self; GList *mapsets; GList *layouts; struct gui *gui; struct layout *layout_current; struct graphics *gra; struct action *action; struct transformation *trans, *trans_cursor; struct compass *compass; struct route *route; struct navigation *navigation; struct speech *speech; struct tracking *tracking; int ready; struct window *win; struct displaylist *displaylist; int tracking_flag; int orientation; int recentdest_count; int osd_configuration; GList *vehicles; GList *windows_items; struct navit_vehicle *vehicle; struct callback_list *attr_cbl; struct callback *nav_speech_cb, *roadbook_callback, *popup_callback, *route_cb, *progress_cb; struct datawindow *roadbook_window; struct map *former_destination; struct point pressed, last, current; int button_pressed,moved,popped,zoomed; int center_timeout; int autozoom_secs; int autozoom_min; int autozoom_max; int autozoom_active; struct event_timeout *button_timeout, *motion_timeout; struct callback *motion_timeout_callback; int ignore_button; int ignore_graphics_events; struct log *textfile_debug_log; struct pcoord destination; int destination_valid; int blocked; int w,h; int drag_bitmap; int use_mousewheel; struct messagelist *messages; struct callback *resize_callback,*button_callback,*motion_callback,*predraw_callback; struct vehicleprofile *vehicleprofile; GList *vehicleprofiles; int pitch; int follow_cursor; int prevTs; int graphics_flags; int zoom_min, zoom_max; int radius; struct bookmarks *bookmarks; int flags; /* 1=No graphics ok */ /* 2=No gui ok */ int border; int imperial; int waypoints_flag; struct coord_geo center; }; struct gui *main_loop_gui; struct attr_iter { void *iter; union { GList *list; struct mapset_handle *mapset_handle; } u; }; static void navit_vehicle_update(struct navit *this_, struct navit_vehicle *nv); static void navit_vehicle_draw(struct navit *this_, struct navit_vehicle *nv, struct point *pnt); static int navit_add_vehicle(struct navit *this_, struct vehicle *v); static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init); static int navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir); static void navit_set_cursors(struct navit *this_); static void navit_cmd_zoom_to_route(struct navit *this); static void navit_cmd_set_center_cursor(struct navit *this_); static void navit_cmd_announcer_toggle(struct navit *this_); static void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv); static int navit_set_vehicleprofile(struct navit *this_, struct vehicleprofile *vp); struct object_func navit_func; struct navit *global_navit; void navit_add_mapset(struct navit *this_, struct mapset *ms) { this_->mapsets = g_list_append(this_->mapsets, ms); } struct mapset * navit_get_mapset(struct navit *this_) { if(this_->mapsets){ return this_->mapsets->data; } else { dbg(0,"No mapsets enabled! Is it on purpose? Navit can't draw a map. Please check your navit.xml\n"); } return NULL; } struct tracking * navit_get_tracking(struct navit *this_) { return this_->tracking; } /** * @brief Get the user data directory. * @param[in] create - create the directory if it does not exist * * @return char * to the data directory string. * * returns the directory used to store user data files (center.txt, * destination.txt, bookmark.txt, ...) * */ char* navit_get_user_data_directory(int create) { char *dir; dir = getenv("NAVIT_USER_DATADIR"); if (create && !file_exists(dir)) { dbg(0,"creating dir %s\n", dir); if (file_mkdir(dir,0)) { dbg(0,"failed creating dir %s\n", dir); return NULL; } } return dir; } /* end: navit_get_user_data_directory(gboolean create) */ void navit_draw_async(struct navit *this_, int async) { if (this_->blocked) { this_->blocked |= 2; return; } transform_setup_source_rect(this_->trans); graphics_draw(this_->gra, this_->displaylist, this_->mapsets->data, this_->trans, this_->layout_current, async, NULL, this_->graphics_flags|1); } void navit_draw(struct navit *this_) { if (this_->ready == 3) navit_draw_async(this_, 0); } int navit_get_ready(struct navit *this_) { return this_->ready; } void navit_draw_displaylist(struct navit *this_) { if (this_->ready == 3) graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current, this_->graphics_flags|1); } static void navit_map_progress(struct navit *this_) { struct map *map; struct mapset *ms; struct mapset_handle *msh; struct attr attr; struct point p; if (this_->ready != 3) return; p.x=10; p.y=32; ms=this_->mapsets->data; msh=mapset_open(ms); while (msh && (map=mapset_next(msh, 0))) { if (map_get_attr(map, attr_progress, &attr, NULL)) { char *str=g_strdup_printf("%s ",attr.u.str); graphics_draw_mode(this_->gra, draw_mode_begin); graphics_draw_text_std(this_->gra, 16, str, &p); g_free(str); p.y+=32; graphics_draw_mode(this_->gra, draw_mode_end); } } mapset_close(msh); } static void navit_redraw_route(struct navit *this_, struct route *route, struct attr *attr) { int updated; if (attr->type != attr_route_status) return; updated=attr->u.num; if (this_->ready != 3) return; if (updated != route_status_path_done_new) return; if (this_->vehicle) { if (this_->vehicle->follow_curr == 1) return; if (this_->vehicle->follow_curr <= this_->vehicle->follow) this_->vehicle->follow_curr=this_->vehicle->follow; } navit_draw(this_); } void navit_handle_resize(struct navit *this_, int w, int h) { struct map_selection sel; int callback=(this_->ready == 1); this_->ready |= 2; memset(&sel, 0, sizeof(sel)); this_->w=w; this_->h=h; sel.u.p_rect.rl.x=w; sel.u.p_rect.rl.y=h; transform_set_screen_selection(this_->trans, &sel); graphics_init(this_->gra); graphics_set_rect(this_->gra, &sel.u.p_rect); if (callback) callback_list_call_attr_1(this_->attr_cbl, attr_graphics_ready, this_); if (this_->ready == 3) navit_draw_async(this_, 1); } static void navit_resize(void *data, int w, int h) { struct navit *this=data; if (!this->ignore_graphics_events) navit_handle_resize(this, w, h); } int navit_get_width(struct navit *this_) { return this_->w; } int navit_get_height(struct navit *this_) { return this_->h; } static void navit_popup(void *data) { struct navit *this_=data; popup(this_, 1, &this_->pressed); this_->button_timeout=NULL; this_->popped=1; } int navit_ignore_button(struct navit *this_) { if (this_->ignore_button) return 1; this_->ignore_button=1; return 0; } void navit_ignore_graphics_events(struct navit *this_, int ignore) { this_->ignore_graphics_events=ignore; } static int navit_restrict_to_range(int value, int min, int max){ if (value>max) { value = max; } if (valuex = navit_restrict_to_range(new_center->x, WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MAX_X); new_center->y = navit_restrict_to_range(new_center->y, WORLD_BOUNDINGBOX_MIN_Y, WORLD_BOUNDINGBOX_MAX_Y); } /** * @brief Change map center position by translating from "old" to "new". */ static void update_transformation(struct transformation *tr, struct point *old, struct point *new) { /* Code for rotation was removed in rev. 5252; see Trac #1078. */ struct coord coord_old,coord_new; struct coord center_new,*center_old; if (!transform_reverse(tr, old, &coord_old)) return; if (!transform_reverse(tr, new, &coord_new)) return; center_old=transform_get_center(tr); center_new.x=center_old->x+coord_old.x-coord_new.x; center_new.y=center_old->y+coord_old.y-coord_new.y; navit_restrict_map_center_to_world_boundingbox(tr, ¢er_new); dbg(1,"change center from 0x%x,0x%x to 0x%x,0x%x\n", center_old->x, center_old->y, center_new.x, center_new.y); transform_set_center(tr, ¢er_new); } void navit_set_timeout(struct navit *this_) { struct attr follow; follow.type=attr_follow; follow.u.num=this_->center_timeout; navit_set_attr(this_, &follow); } int navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback) { int border=16; dbg(1,"button %d %s (ignore: %d)\n",button,pressed?"pressed":"released",this_->ignore_button); callback_list_call_attr_4(this_->attr_cbl, attr_button, this_, GINT_TO_POINTER(pressed), GINT_TO_POINTER(button), p); if (this_->ignore_button) { this_->ignore_button=0; return 0; } if (pressed) { this_->pressed=*p; this_->last=*p; this_->zoomed=0; if (button == 1) { this_->button_pressed=1; this_->moved=0; this_->popped=0; if (popup_callback) this_->button_timeout=event_add_timeout(500, 0, popup_callback); } if (button == 2) navit_set_center_screen(this_, p, 1); if (button == 3) popup(this_, button, p); if (button == 4 && this_->use_mousewheel) { this_->zoomed = 1; navit_zoom_in(this_, 2, p); } if (button == 5 && this_->use_mousewheel) { this_->zoomed = 1; navit_zoom_out(this_, 2, p); } } else { this_->button_pressed=0; if (this_->button_timeout) { event_remove_timeout(this_->button_timeout); this_->button_timeout=NULL; if (! this_->moved && ! transform_within_border(this_->trans, p, border)) { navit_set_center_screen(this_, p, !this_->zoomed); } } if (this_->motion_timeout) { event_remove_timeout(this_->motion_timeout); this_->motion_timeout=NULL; } if (this_->moved) { dbg(1, "mouse drag (%d, %d)->(%d, %d)\n", this_->pressed.x, this_->pressed.y, p->x, p->y); update_transformation(this_->trans, &this_->pressed, p); graphics_draw_drag(this_->gra, NULL); transform_copy(this_->trans, this_->trans_cursor); graphics_overlay_disable(this_->gra, 0); if (!this_->zoomed) navit_set_timeout(this_); navit_draw(this_); } else return 1; } return 0; } static void navit_button(void *data, int pressed, int button, struct point *p) { struct navit *this=data; dbg(1,"enter %d %d ignore %d\n",pressed,button,this->ignore_graphics_events); if (!this->ignore_graphics_events) { if (! this->popup_callback) this->popup_callback=callback_new_1(callback_cast(navit_popup), this); navit_handle_button(this, pressed, button, p, this->popup_callback); } } static void navit_motion_timeout(struct navit *this_) { int dx, dy; if (this_->drag_bitmap) { struct point point; point.x=(this_->current.x-this_->pressed.x); point.y=(this_->current.y-this_->pressed.y); if (graphics_draw_drag(this_->gra, &point)) { graphics_overlay_disable(this_->gra, 1); graphics_draw_mode(this_->gra, draw_mode_end); this_->moved=1; this_->motion_timeout=NULL; return; } } dx=(this_->current.x-this_->last.x); dy=(this_->current.y-this_->last.y); if (dx || dy) { struct transformation *tr; this_->last=this_->current; graphics_overlay_disable(this_->gra, 1); tr=transform_dup(this_->trans); update_transformation(tr, &this_->pressed, &this_->current); #if 0 graphics_displaylist_move(this_->displaylist, dx, dy); #endif graphics_draw_cancel(this_->gra, this_->displaylist); graphics_displaylist_draw(this_->gra, this_->displaylist, tr, this_->layout_current, this_->graphics_flags|512); transform_destroy(tr); this_->moved=1; } this_->motion_timeout=NULL; return; } void navit_handle_motion(struct navit *this_, struct point *p) { int dx, dy; if (this_->button_pressed && !this_->popped) { dx=(p->x-this_->pressed.x); dy=(p->y-this_->pressed.y); if (dx < -8 || dx > 8 || dy < -8 || dy > 8) { this_->moved=1; if (this_->button_timeout) { event_remove_timeout(this_->button_timeout); this_->button_timeout=NULL; } this_->current=*p; if (! this_->motion_timeout_callback) this_->motion_timeout_callback=callback_new_1(callback_cast(navit_motion_timeout), this_); if (! this_->motion_timeout) this_->motion_timeout=event_add_timeout(100, 0, this_->motion_timeout_callback); } } } static void navit_motion(void *data, struct point *p) { struct navit *this=data; if (!this->ignore_graphics_events) navit_handle_motion(this, p); } static void navit_predraw(struct navit *this_) { GList *l; struct navit_vehicle *nv; transform_copy(this_->trans, this_->trans_cursor); l=this_->vehicles; while (l) { nv=l->data; navit_vehicle_draw(this_, nv, NULL); l=g_list_next(l); } } static void navit_scale(struct navit *this_, long scale, struct point *p, int draw) { struct coord c1, c2, *center; if (scale < this_->zoom_min) scale=this_->zoom_min; if (scale > this_->zoom_max) scale=this_->zoom_max; if (p) transform_reverse(this_->trans, p, &c1); transform_set_scale(this_->trans, scale); if (p) { transform_reverse(this_->trans, p, &c2); center = transform_center(this_->trans); center->x += c1.x - c2.x; center->y += c1.y - c2.y; } if (draw) navit_draw(this_); } /** * @brief Automatically adjusts zoom level * * This function automatically adjusts the current * zoom level according to the current speed. * * @param this_ The navit struct * @param center The "immovable" point - i.e. the vehicles position if we're centering on the vehicle * @param speed The vehicles speed in meters per second * @param dir The direction into which the vehicle moves */ static void navit_autozoom(struct navit *this_, struct coord *center, int speed, int draw) { struct point pc; int distance,w,h; double new_scale; long scale; if (! this_->autozoom_active) { return; } distance = speed * this_->autozoom_secs; transform_get_size(this_->trans, &w, &h); transform(this_->trans, transform_get_projection(this_->trans), center, &pc, 1, 0, 0, NULL); scale = transform_get_scale(this_->trans); /* We make sure that the point we want to see is within a certain range * around the vehicle. The radius of this circle is the size of the * screen. This doesn't necessarily mean the point is visible because of * perspective etc. Quite rough, but should be enough. */ if (w > h) { new_scale = (double)distance / h * 16; } else { new_scale = (double)distance / w * 16; } if (abs(new_scale - scale) < 2) { return; // Smoothing } if (new_scale > this_->autozoom_max) new_scale=this_->autozoom_max; if (new_scale < this_->autozoom_min) new_scale=this_->autozoom_min; if (new_scale != scale) navit_scale(this_, (long)new_scale, &pc, 0); } /** * Change the current zoom level, zooming closer to the ground * * @param navit The navit instance * @param factor The zoom factor, usually 2 * @param p The invariant point (if set to NULL, default to center) * @returns nothing */ void navit_zoom_in(struct navit *this_, int factor, struct point *p) { long scale=transform_get_scale(this_->trans)/factor; if (scale < 1) scale=1; navit_scale(this_, scale, p, 1); } /** * Change the current zoom level * * @param navit The navit instance * @param factor The zoom factor, usually 2 * @param p The invariant point (if set to NULL, default to center) * @returns nothing */ void navit_zoom_out(struct navit *this_, int factor, struct point *p) { long scale=transform_get_scale(this_->trans)*factor; navit_scale(this_, scale, p, 1); } void navit_zoom_in_cursor(struct navit *this_, int factor) { struct point p; if (this_->vehicle && this_->vehicle->follow_curr <= 1 && navit_get_cursor_pnt(this_, &p, 0, NULL)) { navit_zoom_in(this_, factor, &p); this_->vehicle->follow_curr=this_->vehicle->follow; } else navit_zoom_in(this_, factor, NULL); } void navit_zoom_out_cursor(struct navit *this_, int factor) { struct point p; if (this_->vehicle && this_->vehicle->follow_curr <= 1 && navit_get_cursor_pnt(this_, &p, 0, NULL)) { navit_zoom_out(this_, 2, &p); this_->vehicle->follow_curr=this_->vehicle->follow; } else navit_zoom_out(this_, 2, NULL); } static int navit_cmd_zoom_in(struct navit *this_) { navit_zoom_in_cursor(this_, 2); return 0; } static int navit_cmd_zoom_out(struct navit *this_) { navit_zoom_out_cursor(this_, 2); return 0; } static void navit_cmd_say(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) navit_say(this, in[0]->u.str); } static GHashTable *cmd_int_var_hash = NULL; static GHashTable *cmd_attr_var_hash = NULL; /** * Store key value pair for the command system (for int typed values) * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] is the key string, in[1] is the integer value to store * @param out output attributes, unused * @param valid unused * @returns nothing */ static void navit_cmd_set_int_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { char*key; struct attr*val; if(!cmd_int_var_hash) { cmd_int_var_hash = g_hash_table_new(g_str_hash, g_str_equal); } if ( (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) && (in && in[1] && ATTR_IS_NUMERIC(in[1]->type))) { val = g_new(struct attr,1); attr_dup_content(in[1],val); key = g_strdup(in[0]->u.str); g_hash_table_insert(cmd_int_var_hash, key, val); } } /** * Store key value pair for the command system (for attr typed values, can be used as opaque handles) * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] is the key string, in[1] is the attr* value to store * @param out output attributes, unused * @param valid unused * @returns nothing */ static void navit_cmd_set_attr_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { char*key; struct attr*val; if(!cmd_attr_var_hash) { cmd_attr_var_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)attr_free); } if ( (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) && (in && in[1] )) { val = attr_dup(in[1]); key = g_strdup(in[0]->u.str); g_hash_table_insert(cmd_attr_var_hash, key, val); } else { dbg(1, "Wrong parameters for set_attr_var() command function\n"); } } /** * command to toggle the active state of a named layer of the current layout * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the name of the layer * @param out output unused * @param valid unused * @returns nothing */ static void navit_cmd_toggle_layer(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { if(this->layout_current && this->layout_current->layers) { GList* layers = this->layout_current->layers; while (layers) { struct layer*l=layers->data; if(l && !strcmp(l->name,in[0]->u.str) ) { l->active ^= 1; navit_draw(this); return; } layers=g_list_next(layers); } } } } /** * adds an item with the current coordinate of the vehicle to a named map * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the name of the map * @param out output attribute, 0 on error or the id of the created item on success * @param valid unused * @returns nothing */ static void navit_cmd_map_add_curr_pos(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); struct attr*val = g_new0(struct attr,1); struct mapset* ms; struct map_selection sel; const int selection_range = 10; enum item_type item_type; struct item *it; struct map* curr_map = NULL; struct coord curr_coord; struct map_rect *mr; //return invalid item on error val->type = attr_none; val->u.item = NULL; list[0] = val; list[1] = NULL; *out = list; if ( in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str && //map name in[1] && ATTR_IS_STRING(in[1]->type) && in[1]->u.str //item type ) { if(!(ms=navit_get_mapset(this))) { dbg(0, "Command function map_add_curr_pos(): there is no active mapset\n"); return; } if((item_type = item_from_name(in[1]->u.str))==type_none) { dbg(0, "Command function map_add_curr_pos(): unknown item type\n"); return; } curr_map = mapset_get_map_by_name(ms, in[0]->u.str); //no map with the given name found if( ! curr_map) { dbg(0, "Command function map_add_curr_pos(): map not found\n"); return; } if(this->vehicle && this->vehicle->vehicle ) { struct attr pos_attr; if(vehicle_get_attr(this->vehicle->vehicle,attr_position_coord_geo,&pos_attr,NULL)) { transform_from_geo(projection_mg, pos_attr.u.coord_geo, &curr_coord); } else { dbg(0, "Command function map_add_curr_pos(): vehicle position is not accessible\n"); return; } } else { dbg(0, "Command function map_add_curr_pos(): no vehicle\n"); return; } sel.next=NULL; sel.order=18; sel.range.min=type_none; sel.range.max=type_tec_common; sel.u.c_rect.lu.x=curr_coord.x-selection_range; sel.u.c_rect.lu.y=curr_coord.y+selection_range; sel.u.c_rect.rl.x=curr_coord.x+selection_range; sel.u.c_rect.rl.y=curr_coord.y-selection_range; mr = map_rect_new(curr_map, &sel); if(mr) { it = map_rect_create_item( mr, item_type); if (it) { struct attr attr; attr.type=attr_type_item_begin; attr.u.item=it; attr_dup_content(&attr,val); item_coord_set(it,&curr_coord, 1, change_mode_modify); } } map_rect_destroy(mr); } } /** * sets an attribute (name value pair) of a map item specified by map name and item id * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] - name of the map ; in[1] - item ; in[2] - attr name ; in[3] - attr value * @param out output attribute, 0 on error, 1 on success * @param valid unused * @returns nothing */ static void navit_cmd_map_item_set_attr(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if ( in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str &&//map name in[1] && ATTR_IS_ITEM(in[1]->type) && in[2]->u.item &&//item in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str && //attr_type str in[3] && ATTR_IS_STRING(in[3]->type) && in[3]->u.str //attr_value str ) { struct attr attr_to_set; struct map* curr_map = NULL; struct mapset *ms; struct item *it; struct map_rect *mr; if(ATTR_IS_STRING(attr_from_name(in[2]->u.str))) { attr_to_set.u.str = in[3]->u.str; attr_to_set.type = attr_from_name(in[2]->u.str); } else if(ATTR_IS_INT(attr_from_name(in[2]->u.str))) { attr_to_set.u.num = atoi(in[3]->u.str); attr_to_set.type = attr_from_name(in[2]->u.str); } else if(ATTR_IS_DOUBLE(attr_from_name(in[2]->u.str))) { double* val = g_new0(double,1); *val = atof(in[3]->u.str); attr_to_set.u.numd = val; attr_to_set.type = attr_from_name(in[2]->u.str); } ms = navit_get_mapset(this); curr_map = mapset_get_map_by_name(ms, in[0]->u.str); if( ! curr_map) { return; } mr=map_rect_new(curr_map,NULL); it=in[1]->u.item; it=map_rect_get_item_byid(mr,it->id_hi,it->id_lo); if(it) { item_attr_set(it, &attr_to_set, change_mode_modify); } map_rect_destroy(mr); } else { dbg(4,"Error in command function item_set_attr()\n"); dbg(4,"Command function item_set_attr(): map cond: %d\n",(in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str)?1:0); dbg(4,"Command function item_set_attr(): item cond: %d\n",(in[1] && ATTR_IS_ITEM(in[1]->type))?1:0); dbg(4,"Command function item_set_attr(): attr type cond: %d\n",(in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str)?1:0); dbg(4,"Command function item_set_attr(): attr val cond: %d\n",(in[3] && ATTR_IS_STRING(in[3]->type) && in[3]->u.str)?1:0); } } /** * Get attr variable given a key string for the command system (for opaque usage) * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the key string * @param out output attribute, the attr for the given key string if exists or NULL * @param valid unused * @returns nothing */ static void navit_cmd_get_attr_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); list[1] = NULL; *out = list; if(!cmd_attr_var_hash) { struct attr*val = g_new0(struct attr,1); val->type = attr_type_item_begin; val->u.item = NULL; list[0] = val; return; } if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { struct attr*ret = g_hash_table_lookup(cmd_attr_var_hash, in[0]->u.str); if(ret) { list[0] = attr_dup(ret); } else { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.item = NULL; list[0] = val; } } } /** * Get value given a key string for the command system * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the key string * @param out output attribute, the value for the given key string if exists or 0 * @param valid unused * @returns nothing */ static void navit_cmd_get_int_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); list[1] = NULL; *out = list; if(!cmd_int_var_hash) { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.num = 0; list[0] = val; return; } if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { struct attr*ret = g_hash_table_lookup(cmd_int_var_hash, in[0]->u.str); if(ret) { list[0] = attr_dup(ret); } else { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.num = 0; list[0] = val; } } } GList *cmd_int_var_stack = NULL; /** * Push an integer to the stack for the command system * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the integer attibute to push * @param out output attributes, unused * @param valid unused * @returns nothing */ static void navit_cmd_push_int(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_NUMERIC(in[0]->type)) { struct attr*val = g_new(struct attr,1); attr_dup_content(in[0],val); cmd_int_var_stack = g_list_prepend(cmd_int_var_stack, val); } } /** * Pop an integer from the command system's integer stack * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes unused * @param out output attribute, the value popped if stack isn't empty or 0 * @param valid unused * @returns nothing */ static void navit_cmd_pop_int(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); if(!cmd_int_var_stack) { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.num = 0; list[0] = val; } else { list[0] = cmd_int_var_stack->data; cmd_int_var_stack = g_list_remove_link(cmd_int_var_stack,cmd_int_var_stack); } list[1] = NULL; *out = list; } /** * Get current size of command system's integer stack * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes unused * @param out output attribute, the size of stack * @param valid unused * @returns nothing */ static void navit_cmd_int_stack_size(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list; struct attr *attr = g_new0(struct attr ,1); attr->type = attr_type_int_begin; if(!cmd_int_var_stack) { attr->u.num = 0; } else { attr->u.num = g_list_length(cmd_int_var_stack); } list = g_new0(struct attr *,2); list[0] = attr; list[1] = NULL; *out = list; cmd_int_var_stack = g_list_remove_link(cmd_int_var_stack,cmd_int_var_stack); } static struct attr ** navit_get_coord(struct navit *this, struct attr **in, struct pcoord *pc) { if (!in) return NULL; if (!in[0]) return NULL; pc->pro = transform_get_projection(this->trans); if (ATTR_IS_STRING(in[0]->type)) { struct coord c; coord_parse(in[0]->u.str, pc->pro, &c); pc->x=c.x; pc->y=c.y; in++; } else if (ATTR_IS_COORD(in[0]->type)) { pc->x=in[0]->u.coord->x; pc->y=in[0]->u.coord->y; in++; } else if (ATTR_IS_PCOORD(in[0]->type)) { *pc=*in[0]->u.pcoord; in++; } else if (in[1] && in[2] && ATTR_IS_INT(in[0]->type) && ATTR_IS_INT(in[1]->type) && ATTR_IS_INT(in[2]->type)) { pc->pro=in[0]->u.num; pc->x=in[1]->u.num; pc->y=in[2]->u.num; in+=3; } else if (in[1] && ATTR_IS_INT(in[0]->type) && ATTR_IS_INT(in[1]->type)) { pc->x=in[0]->u.num; pc->y=in[1]->u.num; in+=2; } else return NULL; return in; } static void navit_cmd_set_destination(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct pcoord pc; char *description=NULL; in=navit_get_coord(this, in, &pc); if (!in) return; if (in[0] && ATTR_IS_STRING(in[0]->type)) description=in[0]->u.str; navit_set_destination(this, &pc, description, 1); } static void navit_cmd_route_remove_next_waypoint(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { navit_remove_waypoint(this); } static void navit_cmd_route_remove_last_waypoint(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { navit_remove_nth_waypoint(this, navit_get_destination_count(this)-1); } static void navit_cmd_set_center(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct pcoord pc; in=navit_get_coord(this, in, &pc); if (!in) return; navit_set_center(this, &pc, 0); } static void navit_cmd_set_position(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct pcoord pc; in=navit_get_coord(this, in, &pc); if (!in) return; navit_set_position(this, &pc); } static void navit_cmd_fmt_coordinates(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; attr.type=attr_type_string_begin; attr.u.str="Fix me"; if (out) { *out=attr_generic_add_attr(*out, &attr); } } /** * Join several string attributes into one * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] - separator, in[1..] - attributes to join * @param out output attribute joined attribute as string * @param valid unused * @returns nothing */ static void navit_cmd_strjoin(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; gchar *ret, *sep; int i; attr.type=attr_type_string_begin; attr.u.str=NULL; if(in[0] && in[1]) { sep=attr_to_text(in[0],NULL,1); ret=attr_to_text(in[1],NULL,1); for(i=2;in[i];i++) { gchar *in_i=attr_to_text(in[i],NULL,1); gchar *r=g_strjoin(sep,ret,in_i,NULL); g_free(in_i); g_free(ret); ret=r; } g_free(sep); attr.u.str=ret; if(out) { *out=attr_generic_add_attr(*out, &attr); } g_free(ret); } } /** * Call external program * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] - name of executable, in[1..] - parameters * @param out output attribute unused * @param valid unused * @returns nothing */ static void navit_cmd_spawn(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { int i,j, nparms, nvalid; char ** argv=NULL; struct spawn_process_info *pi; nparms=0; nvalid=0; if(in) { while(in[nparms]) { if (in[nparms]->type!=attr_none) nvalid++; nparms++; } } if(nvalid>0) { argv=g_new(char*,nvalid+1); for(i=0,j=0;in[i];i++) { if(in[i]->type!=attr_none ) { argv[j++]=attr_to_text(in[i],NULL,1); } else { dbg(0,"Parameter #%i is attr_none - skipping\n",i); } } argv[j]=NULL; pi=spawn_process(argv); // spawn_process() testing suite - uncomment following code to test. //sleep(3); // example of non-blocking wait //int st=spawn_process_check_status(pi,0);dbg(0,"status %i\n",st); // example of blocking wait //st=spawn_process_check_status(pi,1);dbg(0,"status %i\n",st); // example of wait after process is finished and status is // already tested //st=spawn_process_check_status(pi,1);dbg(0,"status %i\n",st); // example of wait after process is finished and status is // already tested - unblocked //st=spawn_process_check_status(pi,0);dbg(0,"status %i\n",st); // End testing suite spawn_process_info_free(pi); for(i=0;argv[i];i++) g_free(argv[i]); g_free(argv); } } static struct command_table commands[] = { {"zoom_in",command_cast(navit_cmd_zoom_in)}, {"zoom_out",command_cast(navit_cmd_zoom_out)}, {"zoom_to_route",command_cast(navit_cmd_zoom_to_route)}, {"say",command_cast(navit_cmd_say)}, {"set_center",command_cast(navit_cmd_set_center)}, {"set_center_cursor",command_cast(navit_cmd_set_center_cursor)}, {"set_destination",command_cast(navit_cmd_set_destination)}, {"route_remove_next_waypoint",command_cast(navit_cmd_route_remove_next_waypoint)}, {"route_remove_last_waypoint",command_cast(navit_cmd_route_remove_last_waypoint)}, {"set_position",command_cast(navit_cmd_set_position)}, {"announcer_toggle",command_cast(navit_cmd_announcer_toggle)}, {"fmt_coordinates",command_cast(navit_cmd_fmt_coordinates)}, {"set_int_var",command_cast(navit_cmd_set_int_var)}, {"get_int_var",command_cast(navit_cmd_get_int_var)}, {"push_int",command_cast(navit_cmd_push_int)}, {"pop_int",command_cast(navit_cmd_pop_int)}, {"int_stack_size",command_cast(navit_cmd_int_stack_size)}, {"toggle_layer",command_cast(navit_cmd_toggle_layer)}, {"strjoin",command_cast(navit_cmd_strjoin)}, {"spawn",command_cast(navit_cmd_spawn)}, {"map_add_curr_pos",command_cast(navit_cmd_map_add_curr_pos)}, {"map_item_set_attr",command_cast(navit_cmd_map_item_set_attr)}, {"set_attr_var",command_cast(navit_cmd_set_attr_var)}, {"get_attr_var",command_cast(navit_cmd_get_attr_var)}, }; void navit_command_add_table(struct navit*this_, struct command_table *commands, int count) { command_add_table(this_->attr_cbl, commands, count, this_); } struct navit * navit_new(struct attr *parent, struct attr **attrs) { struct navit *this_=g_new0(struct navit, 1); struct pcoord center; struct coord co; struct coord_geo g; enum projection pro=projection_mg; int zoom = 256; g.lat=53.13; g.lng=11.70; this_->func=&navit_func; navit_object_ref((struct navit_object *)this_); this_->attrs=attr_list_dup(attrs); this_->self.type=attr_navit; this_->self.u.navit=this_; this_->attr_cbl=callback_list_new(); this_->orientation=-1; this_->tracking_flag=1; this_->recentdest_count=10; this_->osd_configuration=-1; this_->center_timeout = 10; this_->use_mousewheel = 1; this_->autozoom_secs = 10; this_->autozoom_min = 7; this_->autozoom_active = 0; this_->zoom_min = 1; this_->zoom_max = 2097152; this_->autozoom_max = this_->zoom_max; this_->follow_cursor = 1; this_->radius = 30; this_->border = 16; transform_from_geo(pro, &g, &co); center.x=co.x; center.y=co.y; center.pro = pro; this_->trans = transform_new(¢er, zoom, (this_->orientation != -1) ? this_->orientation : 0); this_->trans_cursor = transform_new(¢er, zoom, (this_->orientation != -1) ? this_->orientation : 0); this_->bookmarks=bookmarks_new(&this_->self, NULL, this_->trans); this_->prevTs=0; for (;*attrs; attrs++) { navit_set_attr_do(this_, *attrs, 1); } this_->displaylist=graphics_displaylist_new(); command_add_table(this_->attr_cbl, commands, sizeof(commands)/sizeof(struct command_table), this_); this_->messages = messagelist_new(attrs); dbg(1,"return %p\n",this_); return this_; } static int navit_set_gui(struct navit *this_, struct gui *gui) { if (this_->gui) return 0; this_->gui=gui; if (gui_has_main_loop(this_->gui)) { if (! main_loop_gui) { main_loop_gui=this_->gui; } else { dbg(0,"gui with main loop already active, ignoring this instance"); return 0; } } return 1; } void navit_add_message(struct navit *this_, const char *message) { message_new(this_->messages, message); } struct message *navit_get_messages(struct navit *this_) { return message_get(this_->messages); } static int navit_set_graphics(struct navit *this_, struct graphics *gra) { if (this_->gra) return 0; this_->gra=gra; this_->resize_callback=callback_new_attr_1(callback_cast(navit_resize), attr_resize, this_); graphics_add_callback(gra, this_->resize_callback); this_->button_callback=callback_new_attr_1(callback_cast(navit_button), attr_button, this_); graphics_add_callback(gra, this_->button_callback); this_->motion_callback=callback_new_attr_1(callback_cast(navit_motion), attr_motion, this_); graphics_add_callback(gra, this_->motion_callback); this_->predraw_callback=callback_new_attr_1(callback_cast(navit_predraw), attr_predraw, this_); graphics_add_callback(gra, this_->predraw_callback); return 1; } struct graphics * navit_get_graphics(struct navit *this_) { return this_->gra; } struct vehicleprofile * navit_get_vehicleprofile(struct navit *this_) { return this_->vehicleprofile; } GList * navit_get_vehicleprofiles(struct navit *this_) { return this_->vehicleprofiles; } static void navit_projection_set(struct navit *this_, enum projection pro, int draw) { struct coord_geo g; struct coord *c; c=transform_center(this_->trans); transform_to_geo(transform_get_projection(this_->trans), c, &g); transform_set_projection(this_->trans, pro); transform_from_geo(pro, &g, c); if (draw) navit_draw(this_); } static void navit_mark_navigation_stopped(char *former_destination_file){ FILE *f; f=fopen(former_destination_file, "a"); if (f) { fprintf(f,"%s", TEXTFILE_COMMENT_NAVI_STOPPED); fclose(f); }else{ dbg(0, "Error setting mark in destination file %s: %s\n", former_destination_file, strerror(errno)); } } /** * Start or add a given set of coordinates for route computing * * @param navit The navit instance * @param c The coordinate to start routing to * @param description A label which allows the user to later identify this destination in the former destinations selection * @returns nothing */ void navit_set_destination(struct navit *this_, struct pcoord *c, const char *description, int async) { char *destination_file; destination_file = bookmarks_get_destination_file(TRUE); if (c) { this_->destination=*c; this_->destination_valid=1; dbg(1, "c=(%i,%i)\n", c->x,c->y); bookmarks_append_destinations(this_->former_destination, destination_file, c, 1, type_former_destination, description, this_->recentdest_count); } else { this_->destination_valid=0; bookmarks_append_destinations(this_->former_destination, destination_file, NULL, 0, type_former_destination, NULL, this_->recentdest_count); navit_mark_navigation_stopped(destination_file); } g_free(destination_file); callback_list_call_attr_0(this_->attr_cbl, attr_destination); if (this_->route) { struct attr attr; int dstcount; struct pcoord *pc; navit_get_attr(this_, attr_waypoints_flag, &attr, NULL); if (this_->waypoints_flag==0 || route_get_destination_count(this_->route)==0){ route_set_destination(this_->route, c, async); }else{ route_append_destination(this_->route, c, async); } dstcount=route_get_destination_count(this_->route); if(dstcount>0) { destination_file = bookmarks_get_destination_file(TRUE); pc=g_new(struct pcoord,dstcount); route_get_destinations(this_->route,pc,dstcount); bookmarks_append_destinations(this_->former_destination, destination_file, pc, dstcount, type_former_itinerary, description, this_->recentdest_count); g_free(pc); g_free(destination_file); } if (this_->ready == 3 && !(this_->flags & 4)) navit_draw(this_); } } /** * Add destination description to the recent dest file. Doesn't start routing. * * @param navit The navit instance * @param c The coordinate to start routing to * @param description A label which allows the user to later identify this destination in the former destinations selection * @returns nothing */ void navit_add_destination_description(struct navit *this_, struct pcoord *c, const char *description) { char *destination_file; if (c) { destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, c, 1, type_former_destination, description, this_->recentdest_count); g_free(destination_file); } } /** * Start the route computing to a given set of coordinates including waypoints * * @param this_ The navit instance * @param c The coordinate to start routing to * @param description A label which allows the user to later identify this destination in the former destinations selection * @param async If routing should be done asynchronously * @returns nothing */ void navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async) { char *destination_file; if (c && count) { this_->destination=c[count-1]; this_->destination_valid=1; destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, c, count, type_former_itinerary, description, this_->recentdest_count); g_free(destination_file); } else this_->destination_valid=0; callback_list_call_attr_0(this_->attr_cbl, attr_destination); if (this_->route) { route_set_destinations(this_->route, c, count, async); if (this_->ready == 3) navit_draw(this_); } } int navit_get_destinations(struct navit *this_, struct pcoord *pc, int count) { if(!this_->route) return 0; return route_get_destinations(this_->route, pc, count); } int navit_get_destination_count(struct navit *this_) { if(!this_->route) return 0; return route_get_destination_count(this_->route); } char* navit_get_destination_description(struct navit *this_, int n) { if(!this_->route) return NULL; return route_get_destination_description(this_->route, n); } void navit_remove_nth_waypoint(struct navit *this_, int n) { if(!this_->route) return; if (route_get_destination_count(this_->route)>1){ route_remove_nth_waypoint(this_->route, n); }else{ navit_set_destination(this_, NULL, NULL, 0); } } void navit_remove_waypoint(struct navit *this_) { if(!this_->route) return; if (route_get_destination_count(this_->route)>1){ route_remove_waypoint(this_->route); }else{ navit_set_destination(this_, NULL, NULL, 0); } } /** * @brief Checks if a route is calculated * * This function checks if a route is calculated. * * @param this_ The navit struct whose route should be checked. * @return True if the route is set, false otherwise. */ int navit_check_route(struct navit *this_) { if (this_->route) { return route_get_path_set(this_->route); } return 0; } static int navit_former_destinations_active(struct navit *this_) { char *destination_file_name = bookmarks_get_destination_file(FALSE); FILE *destination_file; int active=0; char lastline[100]; destination_file=fopen(destination_file_name,"r"); if (destination_file) { while(fgets(lastline, sizeof(lastline), destination_file)); fclose(destination_file); if ((lastline != NULL) && (strcmp(lastline, TEXTFILE_COMMENT_NAVI_STOPPED))){ active=1; } } g_free(destination_file_name); return active; } struct map* read_former_destinations_from_file(){ struct attr type, data, no_warn, flags, *attrs[5]; char *destination_file = bookmarks_get_destination_file(FALSE); struct map *m; type.type=attr_type; type.u.str="textfile"; data.type=attr_data; data.u.str=destination_file; no_warn.type=attr_no_warning_if_map_file_missing; no_warn.u.num=1; flags.type=attr_flags; flags.u.num=1; attrs[0]=&type; attrs[1]=&data; attrs[2]=&flags; attrs[3]=&no_warn; attrs[4]=NULL; m=map_new(NULL, attrs); g_free(destination_file); return m; } static void navit_add_former_destinations_from_file(struct navit *this_) { struct item *item; int i,valid=0,count=0,maxcount=1; struct coord *c=g_new(struct coord, maxcount); struct pcoord *pc; struct map_rect *mr; this_->former_destination=read_former_destinations_from_file(); if (!this_->route || !navit_former_destinations_active(this_) || !this_->vehicle) return; mr=map_rect_new(this_->former_destination, NULL); while ((item=map_rect_get_item(mr))) { if (item->type == type_former_itinerary || item->type == type_former_itinerary_part) { count=item_coord_get(item, c, maxcount); while(count==maxcount) { maxcount*=2; c=g_realloc(c, sizeof(struct coord)*maxcount); count+=item_coord_get(item, &c[count], maxcount-count); } if(count) valid=1; } } map_rect_destroy(mr); if (valid && count > 0) { pc=g_new(struct pcoord, count); for (i = 0 ; i < count ; i++) { pc[i].pro=map_projection(this_->former_destination); pc[i].x=c[i].x; pc[i].y=c[i].y; } if (count == 1) route_set_destination(this_->route, &pc[0], 1); else route_set_destinations(this_->route, pc, count, 1); this_->destination=pc[count-1]; this_->destination_valid=1; g_free(pc); } g_free(c); } void navit_textfile_debug_log(struct navit *this_, const char *fmt, ...) { va_list ap; char *str1,*str2; va_start(ap, fmt); if (this_->textfile_debug_log && this_->vehicle) { str1=g_strdup_vprintf(fmt, ap); str2=g_strdup_printf("0x%x 0x%x%s%s\n", this_->vehicle->coord.x, this_->vehicle->coord.y, strlen(str1) ? " " : "", str1); log_write(this_->textfile_debug_log, str2, strlen(str2), 0); g_free(str2); g_free(str1); } va_end(ap); } void navit_textfile_debug_log_at(struct navit *this_, struct pcoord *pc, const char *fmt, ...) { va_list ap; char *str1,*str2; va_start(ap, fmt); if (this_->textfile_debug_log && this_->vehicle) { str1=g_strdup_vprintf(fmt, ap); str2=g_strdup_printf("0x%x 0x%x%s%s\n", pc->x, pc->y, strlen(str1) ? " " : "", str1); log_write(this_->textfile_debug_log, str2, strlen(str2), 0); g_free(str2); g_free(str1); } va_end(ap); } void navit_say(struct navit *this_, const char *text) { struct attr attr; if(this_->speech) { if (!speech_get_attr(this_->speech, attr_active, &attr, NULL)) attr.u.num = 1; dbg(1, "this_.speech->active %ld\n", attr.u.num); if(attr.u.num) speech_say(this_->speech, text); } } /** * @brief Toggles the navigation announcer for navit * @param this_ The navit object */ static void navit_cmd_announcer_toggle(struct navit *this_) { struct attr attr, speechattr; // search for the speech attribute if(!navit_get_attr(this_, attr_speech, &speechattr, NULL)) return; // find out if the corresponding attribute attr_active has been set if(speech_get_attr(speechattr.u.speech, attr_active, &attr, NULL)) { // flip it then... attr.u.num = !attr.u.num; } else { // otherwise disable it because voice is enabled by default attr.type = attr_active; attr.u.num = 0; } // apply the new state if(!speech_set_attr(speechattr.u.speech, &attr)) return; // announce that the speech attribute has changed callback_list_call_attr_0(this_->attr_cbl, attr_speech); } void navit_speak(struct navit *this_) { struct navigation *nav=this_->navigation; struct map *map=NULL; struct map_rect *mr=NULL; struct item *item; struct attr attr; if (!speech_get_attr(this_->speech, attr_active, &attr, NULL)) attr.u.num = 1; dbg(1, "this_.speech->active %ld\n", attr.u.num); if(!attr.u.num) return; if (nav) map=navigation_get_map(nav); if (map) mr=map_rect_new(map, NULL); if (mr) { while ((item=map_rect_get_item(mr)) && (item->type == type_nav_position || item->type == type_nav_none)); if (item && item_attr_get(item, attr_navigation_speech, &attr)) { speech_say(this_->speech, attr.u.str); navit_add_message(this_, attr.u.str); navit_textfile_debug_log(this_, "type=announcement label=\"%s\"", attr.u.str); } map_rect_destroy(mr); } } static void navit_window_roadbook_update(struct navit *this_) { struct navigation *nav=this_->navigation; struct map *map=NULL; struct map_rect *mr=NULL; struct item *item; struct attr attr; struct param_list param[5]; int secs; dbg(1,"enter\n"); datawindow_mode(this_->roadbook_window, 1); if (nav) map=navigation_get_map(nav); if (map) mr=map_rect_new(map, NULL); dbg(0,"nav=%p map=%p mr=%p\n", nav, map, mr); if (mr) { dbg(0,"while loop\n"); while ((item=map_rect_get_item(mr))) { dbg(0,"item=%p\n", item); attr.u.str=NULL; if (item->type != type_nav_position) { item_attr_get(item, attr_navigation_long, &attr); if (attr.u.str == NULL) { continue; } dbg(2, "Command='%s'\n", attr.u.str); param[0].value=g_strdup(attr.u.str); } else param[0].value=_("Position"); param[0].name=_("Command"); item_attr_get(item, attr_length, &attr); dbg(2, "Length=%ld\n", attr.u.num); param[1].name=_("Length"); if ( attr.u.num >= 2000 ) { param[1].value=g_strdup_printf("%5.1f %s",(float)attr.u.num / 1000, _("km") ); } else { param[1].value=g_strdup_printf("%7ld %s",attr.u.num, _("m")); } item_attr_get(item, attr_time, &attr); dbg(2, "Time=%ld\n", attr.u.num); secs=attr.u.num/10; param[2].name=_("Time"); if ( secs >= 3600 ) { param[2].value=g_strdup_printf("%d:%02d:%02d",secs / 60, ( secs / 60 ) % 60 , secs % 60); } else { param[2].value=g_strdup_printf("%d:%02d",secs / 60, secs % 60); } item_attr_get(item, attr_destination_length, &attr); dbg(2, "Destlength=%ld\n", attr.u.num); param[3].name=_("Destination Length"); if ( attr.u.num >= 2000 ) { param[3].value=g_strdup_printf("%5.1f %s",(float)attr.u.num / 1000, _("km") ); } else { param[3].value=g_strdup_printf("%ld %s",attr.u.num, _("m")); } item_attr_get(item, attr_destination_time, &attr); dbg(2, "Desttime=%ld\n", attr.u.num); secs=attr.u.num/10; param[4].name=_("Destination Time"); if ( secs >= 3600 ) { param[4].value=g_strdup_printf("%d:%02d:%02d",secs / 3600, (secs / 60 ) % 60 , secs % 60); } else { param[4].value=g_strdup_printf("%d:%02d",secs / 60, secs % 60); } datawindow_add(this_->roadbook_window, param, 5); } map_rect_destroy(mr); } datawindow_mode(this_->roadbook_window, 0); } void navit_window_roadbook_destroy(struct navit *this_) { dbg(0, "enter\n"); navigation_unregister_callback(this_->navigation, attr_navigation_long, this_->roadbook_callback); callback_destroy(this_->roadbook_callback); this_->roadbook_window=NULL; this_->roadbook_callback=NULL; } void navit_window_roadbook_new(struct navit *this_) { if (!this_->gui || this_->roadbook_callback || this_->roadbook_window) { return; } this_->roadbook_callback=callback_new_1(callback_cast(navit_window_roadbook_update), this_); navigation_register_callback(this_->navigation, attr_navigation_long, this_->roadbook_callback); this_->roadbook_window=gui_datawindow_new(this_->gui, _("Roadbook"), NULL, callback_new_1(callback_cast(navit_window_roadbook_destroy), this_)); navit_window_roadbook_update(this_); } void navit_init(struct navit *this_) { struct mapset *ms; struct map *map; int callback; char *center_file; dbg(2,"enter gui %p graphics %p\n",this_->gui,this_->gra); if (!this_->gui && !(this_->flags & 2)) { dbg(0,"Warning: No GUI available.\n"); return; } if (!this_->gra && !(this_->flags & 1)) { dbg(0,"Warning: No graphics subsystem available.\n"); return; } dbg(2,"Connecting gui to graphics\n"); if (this_->gui && this_->gra && gui_set_graphics(this_->gui, this_->gra)) { struct attr attr_type_gui, attr_type_graphics; gui_get_attr(this_->gui, attr_type, &attr_type_gui, NULL); graphics_get_attr(this_->gra, attr_type, &attr_type_graphics, NULL); dbg(0,"failed to connect graphics '%s' to gui '%s'\n", attr_type_graphics.u.str, attr_type_gui.u.str); dbg(0," Please see http://wiki.navit-project.org/index.php/Failed_to_connect_graphics_to_gui\n"); dbg(0," for explanations and solutions\n"); return; } if (this_->speech && this_->navigation) { struct attr speech; speech.type=attr_speech; speech.u.speech=this_->speech; navigation_set_attr(this_->navigation, &speech); } dbg(2,"Initializing graphics\n"); dbg(2,"Setting Vehicle\n"); navit_set_vehicle(this_, this_->vehicle); dbg(2,"Adding dynamic maps to mapset %p\n",this_->mapsets); if (this_->mapsets) { struct mapset_handle *msh; ms=this_->mapsets->data; this_->progress_cb=callback_new_attr_1(callback_cast(navit_map_progress), attr_progress, this_); msh=mapset_open(ms); while (msh && (map=mapset_next(msh, 0))) { //pass new callback instance for each map in the mapset to make map callback list destruction work correctly struct callback *pcb = callback_new_attr_1(callback_cast(navit_map_progress), attr_progress, this_); map_add_callback(map, pcb); } mapset_close(msh); if (this_->route) { if ((map=route_get_map(this_->route))) { struct attr map_a; map_a.type=attr_map; map_a.u.map=map; mapset_add_attr(ms, &map_a); } if ((map=route_get_graph_map(this_->route))) { struct attr map_a,active; map_a.type=attr_map; map_a.u.map=map; active.type=attr_active; active.u.num=0; mapset_add_attr(ms, &map_a); map_set_attr(map, &active); } route_set_mapset(this_->route, ms); route_set_projection(this_->route, transform_get_projection(this_->trans)); } if (this_->tracking) { tracking_set_mapset(this_->tracking, ms); if (this_->route) tracking_set_route(this_->tracking, this_->route); } if (this_->navigation) { if ((map=navigation_get_map(this_->navigation))) { struct attr map_a,active; map_a.type=attr_map; map_a.u.map=map; active.type=attr_active; active.u.num=0; mapset_add_attr(ms, &map_a); map_set_attr(map, &active); } } if (this_->tracking) { if ((map=tracking_get_map(this_->tracking))) { struct attr map_a,active; map_a.type=attr_map; map_a.u.map=map; active.type=attr_active; active.u.num=0; mapset_add_attr(ms, &map_a); map_set_attr(map, &active); } } navit_add_former_destinations_from_file(this_); } else { dbg(0, "FATAL: No mapset available. Please add a (valid) mapset to your configuration.\n"); exit(1); } if (this_->route) { struct attr callback; this_->route_cb=callback_new_attr_1(callback_cast(navit_redraw_route), attr_route_status, this_); callback.type=attr_callback; callback.u.callback=this_->route_cb; route_add_attr(this_->route, &callback); } if (this_->navigation) { if (this_->speech) { this_->nav_speech_cb=callback_new_1(callback_cast(navit_speak), this_); navigation_register_callback(this_->navigation, attr_navigation_speech, this_->nav_speech_cb); } if (this_->route) navigation_set_route(this_->navigation, this_->route); } dbg(2,"Setting Center\n"); center_file = bookmarks_get_center_file(FALSE); bookmarks_set_center_from_file(this_->bookmarks, center_file); g_free(center_file); #if 0 if (this_->menubar) { men=menu_add(this_->menubar, "Data", menu_type_submenu, NULL); if (men) { navit_add_menu_windows_items(this_, men); } } #endif global_navit=this_; #if 0 navit_window_roadbook_new(this_); navit_window_items_new(this_); #endif messagelist_init(this_->messages); navit_set_cursors(this_); callback_list_call_attr_1(this_->attr_cbl, attr_navit, this_); callback=(this_->ready == 2); this_->ready|=1; dbg(2,"ready=%d\n",this_->ready); if (this_->ready == 3) navit_draw_async(this_, 1); if (callback) callback_list_call_attr_1(this_->attr_cbl, attr_graphics_ready, this_); #if 0 routech_test(this_); #endif } void navit_zoom_to_rect(struct navit *this_, struct coord_rect *r) { struct coord c; int w,h,scale=16; c.x=(r->rl.x+r->lu.x)/2; c.y=(r->rl.y+r->lu.y)/2; transform_set_center(this_->trans, &c); transform_get_size(this_->trans, &w, &h); dbg(0,"center 0x%x,0x%x w %d h %d\n",c.x,c.y,w,h); dbg(0,"%x,%x-%x,%x\n", r->lu.x,r->lu.y,r->rl.x,r->rl.y); while (scale < 1<<20) { struct point p1,p2; transform_set_scale(this_->trans, scale); transform_setup_source_rect(this_->trans); transform(this_->trans, transform_get_projection(this_->trans), &r->lu, &p1, 1, 0, 0, NULL); transform(this_->trans, transform_get_projection(this_->trans), &r->rl, &p2, 1, 0, 0, NULL); dbg(0,"%d,%d-%d,%d\n",p1.x,p1.y,p2.x,p2.y); if (p1.x < 0 || p2.x < 0 || p1.x > w || p2.x > w || p1.y < 0 || p2.y < 0 || p1.y > h || p2.y > h) scale*=2; else break; } dbg(0,"scale=%d (0x%x) of %d (0x%x)\n",scale,scale,1<<20,1<<20); if (this_->ready == 3) navit_draw_async(this_,0); } void navit_zoom_to_route(struct navit *this_, int orientation) { struct map *map; struct map_rect *mr=NULL; struct item *item; struct coord c; struct coord_rect r; int count=0; if (! this_->route) return; dbg(1,"enter\n"); map=route_get_map(this_->route); dbg(1,"map=%p\n",map); if (map) mr=map_rect_new(map, NULL); dbg(1,"mr=%p\n",mr); if (mr) { while ((item=map_rect_get_item(mr))) { dbg(1,"item=%s\n", item_to_name(item->type)); while (item_coord_get(item, &c, 1)) { dbg(1,"coord\n"); if (!count) r.lu=r.rl=c; else coord_rect_extend(&r, &c); count++; } } map_rect_destroy(mr); } if (! count) return; if (orientation != -1) transform_set_yaw(this_->trans, orientation); navit_zoom_to_rect(this_, &r); } static void navit_cmd_zoom_to_route(struct navit *this) { navit_zoom_to_route(this, 0); } /** * Change the current zoom level * * @param navit The navit instance * @param center The point where to center the map, including its projection * @returns nothing */ void navit_set_center(struct navit *this_, struct pcoord *center, int set_timeout) { struct coord *c=transform_center(this_->trans); struct coord c1,c2; enum projection pro = transform_get_projection(this_->trans); if (pro != center->pro) { c1.x = center->x; c1.y = center->y; transform_from_to(&c1, center->pro, &c2, pro); } else { c2.x = center->x; c2.y = center->y; } *c=c2; if (set_timeout) navit_set_timeout(this_); if (this_->ready == 3) navit_draw(this_); } static void navit_set_center_coord_screen(struct navit *this_, struct coord *c, struct point *p, int set_timeout) { int width, height; struct point po; transform_set_center(this_->trans, c); transform_get_size(this_->trans, &width, &height); po.x=width/2; po.y=height/2; update_transformation(this_->trans, &po, p); if (set_timeout) navit_set_timeout(this_); } /** * Links all vehicles to a cursor depending on the current profile. * * @param this_ A navit instance * @author Ralph Sennhauser (10/2009) */ static void navit_set_cursors(struct navit *this_) { struct attr name; struct navit_vehicle *nv; struct cursor *c; GList *v; v=g_list_first(this_->vehicles); // GList of navit_vehicles while (v) { nv=v->data; if (vehicle_get_attr(nv->vehicle, attr_cursorname, &name, NULL)) { if (!strcmp(name.u.str,"none")) c=NULL; else c=layout_get_cursor(this_->layout_current, name.u.str); } else c=layout_get_cursor(this_->layout_current, "default"); vehicle_set_cursor(nv->vehicle, c, 0); v=g_list_next(v); } return; } static int navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir) { int width, height; struct navit_vehicle *nv=this_->vehicle; float offset=this_->radius; // Cursor offset from the center of the screen (percent). #if 0 /* Better improve track.c to get that issue resolved or make it configurable with being off the default, the jumping back to the center is a bit annoying */ float min_offset = 0.; // Percent offset at min_offset_speed. float max_offset = 30.; // Percent offset at max_offset_speed. int min_offset_speed = 2; // Speed in km/h int max_offset_speed = 50; // Speed ini km/h // Calculate cursor offset from the center of the screen, upon speed. if (nv->speed <= min_offset_speed) { offset = min_offset; } else if (nv->speed > max_offset_speed) { offset = max_offset; } else { offset = (max_offset - min_offset) / (max_offset_speed - min_offset_speed) * (nv->speed - min_offset_speed); } #endif transform_get_size(this_->trans, &width, &height); if (this_->orientation == -1 || keep_orientation) { p->x=50*width/100; p->y=(50 + offset)*height/100; if (dir) *dir=keep_orientation?this_->orientation:nv->dir; } else { int mdir; if (this_->tracking && this_->tracking_flag) { mdir = tracking_get_angle(this_->tracking) - this_->orientation; } else { mdir=nv->dir-this_->orientation; } p->x=(50 - offset*sin(M_PI*mdir/180.))*width/100; p->y=(50 + offset*cos(M_PI*mdir/180.))*height/100; if (dir) *dir=this_->orientation; } return 1; } void navit_set_center_cursor(struct navit *this_, int autozoom, int keep_orientation) { int dir; struct point pn; struct navit_vehicle *nv=this_->vehicle; navit_get_cursor_pnt(this_, &pn, keep_orientation, &dir); transform_set_yaw(this_->trans, dir); navit_set_center_coord_screen(this_, &nv->coord, &pn, 0); if (autozoom) navit_autozoom(this_, &nv->coord, nv->speed, 0); } static void navit_set_center_cursor_draw(struct navit *this_) { navit_set_center_cursor(this_,1,0); if (this_->ready == 3) navit_draw_async(this_, 1); } static void navit_cmd_set_center_cursor(struct navit *this_) { navit_set_center_cursor_draw(this_); } void navit_set_center_screen(struct navit *this_, struct point *p, int set_timeout) { struct coord c; struct pcoord pc; transform_reverse(this_->trans, p, &c); pc.x = c.x; pc.y = c.y; pc.pro = transform_get_projection(this_->trans); navit_set_center(this_, &pc, set_timeout); } static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init) { int dir=0, orient_old=0, attr_updated=0; struct coord co; long zoom; GList *l; struct navit_vehicle *nv; struct layout *lay; struct attr active; active.type=attr_active; active.u.num=0; switch (attr->type) { case attr_autozoom: attr_updated=(this_->autozoom_secs != attr->u.num); this_->autozoom_secs = attr->u.num; break; case attr_autozoom_active: attr_updated=(this_->autozoom_active != attr->u.num); this_->autozoom_active = attr->u.num; break; case attr_center: transform_from_geo(transform_get_projection(this_->trans), attr->u.coord_geo, &co); dbg(1,"0x%x,0x%x\n",co.x,co.y); transform_set_center(this_->trans, &co); break; case attr_drag_bitmap: attr_updated=(this_->drag_bitmap != !!attr->u.num); this_->drag_bitmap=!!attr->u.num; break; case attr_flags: attr_updated=(this_->flags != attr->u.num); this_->flags=attr->u.num; break; case attr_flags_graphics: attr_updated=(this_->graphics_flags != attr->u.num); this_->graphics_flags=attr->u.num; break; case attr_follow: if (!this_->vehicle) return 0; attr_updated=(this_->vehicle->follow_curr != attr->u.num); this_->vehicle->follow_curr = attr->u.num; break; case attr_layout: if(this_->layout_current!=attr->u.layout) { this_->layout_current=attr->u.layout; graphics_font_destroy_all(this_->gra); navit_set_cursors(this_); if (this_->ready == 3) navit_draw(this_); attr_updated=1; } break; case attr_layout_name: l=this_->layouts; while (l) { lay=l->data; if (!strcmp(lay->name,attr->u.str)) { struct attr attr; attr.type=attr_layout; attr.u.layout=lay; return navit_set_attr_do(this_, &attr, init); } l=g_list_next(l); } return 0; case attr_map_border: if (this_->border != attr->u.num) { this_->border=attr->u.num; attr_updated=1; } break; case attr_orientation: orient_old=this_->orientation; this_->orientation=attr->u.num; if (!init) { if (this_->orientation != -1) { dir = this_->orientation; } else { if (this_->vehicle) { dir = this_->vehicle->dir; } } transform_set_yaw(this_->trans, dir); if (orient_old != this_->orientation) { #if 0 if (this_->ready == 3) navit_draw(this_); #endif attr_updated=1; } } break; case attr_osd_configuration: dbg(0,"setting osd_configuration to %ld (was %d)\n", attr->u.num, this_->osd_configuration); attr_updated=(this_->osd_configuration != attr->u.num); this_->osd_configuration=attr->u.num; break; case attr_pitch: attr_updated=(this_->pitch != attr->u.num); this_->pitch=attr->u.num; transform_set_pitch(this_->trans, this_->pitch); if (!init && attr_updated && this_->ready == 3) navit_draw(this_); break; case attr_projection: if(this_->trans && transform_get_projection(this_->trans) != attr->u.projection) { navit_projection_set(this_, attr->u.projection, !init); attr_updated=1; } break; case attr_radius: attr_updated=(this_->radius != attr->u.num); this_->radius=attr->u.num; break; case attr_recent_dest: attr_updated=(this_->recentdest_count != attr->u.num); this_->recentdest_count=attr->u.num; break; case attr_speech: if(this_->speech && this_->speech != attr->u.speech) { attr_updated=1; this_->speech = attr->u.speech; } break; case attr_timeout: attr_updated=(this_->center_timeout != attr->u.num); this_->center_timeout = attr->u.num; break; case attr_tracking: attr_updated=(this_->tracking_flag != !!attr->u.num); this_->tracking_flag=!!attr->u.num; break; case attr_transformation: this_->trans=attr->u.transformation; break; case attr_use_mousewheel: attr_updated=(this_->use_mousewheel != !!attr->u.num); this_->use_mousewheel=!!attr->u.num; break; case attr_vehicle: if (!attr->u.vehicle) { if (this_->vehicle) { vehicle_set_attr(this_->vehicle->vehicle, &active); navit_set_vehicle(this_, NULL); attr_updated=1; } break; } l=this_->vehicles; while(l) { nv=l->data; if (nv->vehicle == attr->u.vehicle) { if (!this_->vehicle || this_->vehicle->vehicle != attr->u.vehicle) { if (this_->vehicle) vehicle_set_attr(this_->vehicle->vehicle, &active); active.u.num=1; vehicle_set_attr(nv->vehicle, &active); attr_updated=1; } navit_set_vehicle(this_, nv); } l=g_list_next(l); } break; case attr_vehicleprofile: attr_updated=navit_set_vehicleprofile(this_, attr->u.vehicleprofile); break; case attr_zoom: zoom=transform_get_scale(this_->trans); attr_updated=(zoom != attr->u.num); transform_set_scale(this_->trans, attr->u.num); if (attr_updated && !init) navit_draw(this_); break; case attr_zoom_min: attr_updated=(attr->u.num != this_->zoom_min); this_->zoom_min=attr->u.num; break; case attr_zoom_max: attr_updated=(attr->u.num != this_->zoom_max); this_->zoom_max=attr->u.num; break; case attr_message: navit_add_message(this_, attr->u.str); break; case attr_follow_cursor: attr_updated=(this_->follow_cursor != !!attr->u.num); this_->follow_cursor=!!attr->u.num; break; case attr_imperial: attr_updated=(this_->imperial != attr->u.num); this_->imperial=attr->u.num; break; case attr_waypoints_flag: attr_updated=(this_->waypoints_flag != !!attr->u.num); this_->waypoints_flag=!!attr->u.num; break; default: return 0; } if (attr_updated && !init) { callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); if (attr->type == attr_osd_configuration) graphics_draw_mode(this_->gra, draw_mode_end); } return 1; } int navit_set_attr(struct navit *this_, struct attr *attr) { return navit_set_attr_do(this_, attr, 0); } int navit_get_attr(struct navit *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { struct message *msg; struct coord *c; int len,offset; int ret=1; switch (type) { case attr_message: msg = navit_get_messages(this_); if (!msg) { return 0; } len = 0; while (msg) { len += strlen(msg->text) + 1; msg = msg->next; } attr->u.str = g_malloc(len + 1); msg = navit_get_messages(this_); offset = 0; while (msg) { g_stpcpy((attr->u.str + offset), msg->text); offset += strlen(msg->text); attr->u.str[offset] = '\n'; offset++; msg = msg->next; } attr->u.str[len] = '\0'; break; case attr_imperial: attr->u.num=this_->imperial; break; case attr_bookmark_map: attr->u.map=bookmarks_get_map(this_->bookmarks); break; case attr_bookmarks: attr->u.bookmarks=this_->bookmarks; break; case attr_callback_list: attr->u.callback_list=this_->attr_cbl; break; case attr_center: c=transform_get_center(this_->trans); transform_to_geo(transform_get_projection(this_->trans), c, &this_->center); attr->u.coord_geo=&this_->center; break; case attr_destination: if (! this_->destination_valid) return 0; attr->u.pcoord=&this_->destination; break; case attr_displaylist: attr->u.displaylist=this_->displaylist; return (attr->u.displaylist != NULL); case attr_follow: if (!this_->vehicle) return 0; attr->u.num=this_->vehicle->follow_curr; break; case attr_former_destination_map: attr->u.map=this_->former_destination; break; case attr_graphics: attr->u.graphics=this_->gra; ret=(attr->u.graphics != NULL); break; case attr_gui: attr->u.gui=this_->gui; ret=(attr->u.gui != NULL); break; case attr_layer: ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter?(struct attr_iter *)&iter->iter:NULL); break; case attr_layout: if (iter) { if (iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->layouts; } if (!iter->u.list) return 0; attr->u.layout=(struct layout *)iter->u.list->data; } else { attr->u.layout=this_->layout_current; } break; case attr_map: if (iter && this_->mapsets) { if (!iter->u.mapset_handle) { iter->u.mapset_handle=mapset_open((struct mapset *)this_->mapsets->data); } attr->u.map=mapset_next(iter->u.mapset_handle, 0); if(!attr->u.map) { mapset_close(iter->u.mapset_handle); return 0; } } else { return 0; } break; case attr_mapset: attr->u.mapset=this_->mapsets->data; ret=(attr->u.mapset != NULL); break; case attr_navigation: attr->u.navigation=this_->navigation; break; case attr_orientation: attr->u.num=this_->orientation; break; case attr_osd: ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter?(struct attr_iter *)&iter->iter:NULL); break; case attr_osd_configuration: attr->u.num=this_->osd_configuration; break; case attr_pitch: attr->u.num=transform_get_pitch(this_->trans); break; case attr_projection: if(this_->trans) { attr->u.num=transform_get_projection(this_->trans); } else { return 0; } break; case attr_route: attr->u.route=this_->route; break; case attr_speech: attr->u.speech=this_->speech; break; case attr_timeout: attr->u.num=this_->center_timeout; break; case attr_tracking: attr->u.num=this_->tracking_flag; break; case attr_trackingo: attr->u.tracking=this_->tracking; break; case attr_transformation: attr->u.transformation=this_->trans; break; case attr_vehicle: if(iter) { if(iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->vehicles; } if(!iter->u.list) return 0; attr->u.vehicle=((struct navit_vehicle*)iter->u.list->data)->vehicle; } else { if(this_->vehicle) { attr->u.vehicle=this_->vehicle->vehicle; } else { return 0; } } break; case attr_vehicleprofile: if (iter) { if(iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->vehicleprofiles; } if(!iter->u.list) return 0; attr->u.vehicleprofile=iter->u.list->data; } else { attr->u.vehicleprofile=this_->vehicleprofile; } break; case attr_zoom: attr->u.num=transform_get_scale(this_->trans); break; case attr_autozoom_active: attr->u.num=this_->autozoom_active; break; case attr_follow_cursor: attr->u.num=this_->follow_cursor; break; case attr_waypoints_flag: attr->u.num=this_->waypoints_flag; break; default: return 0; } attr->type=type; return ret; } static int navit_add_log(struct navit *this_, struct log *log) { struct attr type_attr; if (!log_get_attr(log, attr_type, &type_attr, NULL)) return 0; if (!strcmp(type_attr.u.str, "textfile_debug")) { char *header = "type=track_tracked\n"; if (this_->textfile_debug_log) return 0; log_set_header(log, header, strlen(header)); this_->textfile_debug_log=log; return 1; } return 0; } static int navit_add_layout(struct navit *this_, struct layout *layout) { struct attr active; this_->layouts = g_list_append(this_->layouts, layout); layout_get_attr(layout, attr_active, &active, NULL); if(active.u.num || !this_->layout_current) { this_->layout_current=layout; return 1; } return 0; } int navit_add_attr(struct navit *this_, struct attr *attr) { int ret=1; switch (attr->type) { case attr_callback: navit_add_callback(this_, attr->u.callback); break; case attr_log: ret=navit_add_log(this_, attr->u.log); break; case attr_gui: ret=navit_set_gui(this_, attr->u.gui); break; case attr_graphics: ret=navit_set_graphics(this_, attr->u.graphics); break; case attr_layout: navit_add_layout(this_, attr->u.layout); break; case attr_route: this_->route=attr->u.route; break; case attr_mapset: this_->mapsets = g_list_append(this_->mapsets, attr->u.mapset); break; case attr_navigation: this_->navigation=attr->u.navigation; break; case attr_osd: break; case attr_recent_dest: this_->recentdest_count = attr->u.num; break; case attr_speech: this_->speech=attr->u.speech; break; case attr_trackingo: this_->tracking=attr->u.tracking; break; case attr_vehicle: ret=navit_add_vehicle(this_, attr->u.vehicle); break; case attr_vehicleprofile: this_->vehicleprofiles=g_list_append(this_->vehicleprofiles, attr->u.vehicleprofile); break; case attr_autozoom_min: this_->autozoom_min = attr->u.num; break; case attr_autozoom_max: this_->autozoom_max = attr->u.num; break; case attr_layer: case attr_script: break; default: return 0; } if (ret) this_->attrs=attr_generic_add_attr(this_->attrs, attr); callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); return ret; } int navit_remove_attr(struct navit *this_, struct attr *attr) { int ret=1; switch (attr->type) { case attr_callback: navit_remove_callback(this_, attr->u.callback); break; case attr_vehicle: case attr_osd: this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; default: return 0; } return ret; } struct attr_iter * navit_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void navit_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } void navit_add_callback(struct navit *this_, struct callback *cb) { callback_list_add(this_->attr_cbl, cb); } void navit_remove_callback(struct navit *this_, struct callback *cb) { callback_list_remove(this_->attr_cbl, cb); } static int coord_not_set(struct coord c){ return !(c.x || c.y); } /** * Toggle the cursor update : refresh the map each time the cursor has moved (instead of only when it reaches a border) * * @param navit The navit instance * @returns nothing */ static void navit_vehicle_draw(struct navit *this_, struct navit_vehicle *nv, struct point *pnt) { struct point cursor_pnt; enum projection pro; if (this_->blocked||coord_not_set(nv->coord)) return; if (pnt) cursor_pnt=*pnt; else { pro=transform_get_projection(this_->trans_cursor); if (!pro) return; transform(this_->trans_cursor, pro, &nv->coord, &cursor_pnt, 1, 0, 0, NULL); } vehicle_draw(nv->vehicle, this_->gra, &cursor_pnt, pnt ? 0:1, nv->dir-transform_get_yaw(this_->trans_cursor), nv->speed); #if 0 if (pnt) pnt2=*pnt; else { pro=transform_get_projection(this_->trans); transform(this_->trans, pro, &nv->coord, &pnt2, 1); } #if 1 cursor_draw(nv->cursor, &pnt2, nv->dir-transform_get_angle(this_->trans, 0), nv->speed > 2, pnt == NULL); #else cursor_draw(nv->cursor, &pnt2, nv->dir-transform_get_angle(this_->trans, 0), nv->speed > 2, 1); #endif #endif } static void navit_vehicle_update(struct navit *this_, struct navit_vehicle *nv) { struct attr attr_valid, attr_dir, attr_speed, attr_pos; struct pcoord cursor_pc; struct point cursor_pnt, *pnt=&cursor_pnt; struct tracking *tracking=NULL; struct pcoord *pc; enum projection pro=transform_get_projection(this_->trans_cursor); int count; int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *); void *attr_object; char *destination_file; char *description; profile(0,NULL); if (this_->ready == 3) navit_layout_switch(this_); if (this_->vehicle == nv && this_->tracking_flag) tracking=this_->tracking; if (tracking) { tracking_update(tracking, nv->vehicle, this_->vehicleprofile, pro); attr_object=tracking; get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr; } else { attr_object=nv->vehicle; get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicle_get_attr; } if (get_attr(attr_object, attr_position_valid, &attr_valid, NULL)) if (!attr_valid.u.num != attr_position_valid_invalid) return; if (! get_attr(attr_object, attr_position_direction, &attr_dir, NULL) || ! get_attr(attr_object, attr_position_speed, &attr_speed, NULL) || ! get_attr(attr_object, attr_position_coord_geo, &attr_pos, NULL)) { profile(0,"return 2\n"); return; } nv->dir=*attr_dir.u.numd; nv->speed=*attr_speed.u.numd; transform_from_geo(pro, attr_pos.u.coord_geo, &nv->coord); if (nv != this_->vehicle) { if (this_->ready == 3) navit_vehicle_draw(this_, nv, NULL); profile(0,"return 3\n"); return; } cursor_pc.x = nv->coord.x; cursor_pc.y = nv->coord.y; cursor_pc.pro = pro; if (this_->route) { if (tracking) route_set_position_from_tracking(this_->route, tracking, pro); else route_set_position(this_->route, &cursor_pc); } callback_list_call_attr_0(this_->attr_cbl, attr_position); navit_textfile_debug_log(this_, "type=trackpoint_tracked"); if (this_->ready == 3) { if (this_->gui && nv->speed > 2) navit_disable_suspend(); transform(this_->trans_cursor, pro, &nv->coord, &cursor_pnt, 1, 0, 0, NULL); if (this_->button_pressed != 1 && this_->follow_cursor && nv->follow_curr <= nv->follow && (nv->follow_curr == 1 || !transform_within_border(this_->trans_cursor, &cursor_pnt, this_->border))) navit_set_center_cursor_draw(this_); else navit_vehicle_draw(this_, nv, pnt); if (nv->follow_curr > 1) nv->follow_curr--; else nv->follow_curr=nv->follow; } callback_list_call_attr_2(this_->attr_cbl, attr_position_coord_geo, this_, nv->vehicle); /* Finally, if we reached our destination, stop navigation. */ if (this_->route) { switch(route_destination_reached(this_->route)) { case 1: description=route_get_destination_description(this_->route, 0); route_remove_waypoint(this_->route); count=route_get_destination_count(this_->route); pc=g_alloca(sizeof(*pc)*count); route_get_destinations(this_->route, pc, count); destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, pc, count, type_former_itinerary_part, description, this_->recentdest_count); g_free(destination_file); g_free(description); break; case 2: destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, NULL, 0, type_former_itinerary_part, NULL, this_->recentdest_count); navit_set_destination(this_, NULL, NULL, 0); g_free(destination_file); break; } } profile(0,"return 5\n"); } /** * Set the position of the vehicle * * @param navit The navit instance * @param c The coordinate to set as position * @returns nothing */ void navit_set_position(struct navit *this_, struct pcoord *c) { if (this_->route) { route_set_position(this_->route, c); callback_list_call_attr_0(this_->attr_cbl, attr_position); } if (this_->ready == 3) navit_draw(this_); } static int navit_set_vehicleprofile(struct navit *this_, struct vehicleprofile *vp) { if (this_->vehicleprofile == vp) return 0; this_->vehicleprofile=vp; if (this_->route) route_set_profile(this_->route, this_->vehicleprofile); return 1; } static int navit_set_vehicleprofile_name(struct navit *this_, char *name) { struct attr attr; GList *l; l=this_->vehicleprofiles; while (l) { if (vehicleprofile_get_attr(l->data, attr_name, &attr, NULL)) { if (!strcmp(attr.u.str, name)) { navit_set_vehicleprofile(this_, l->data); return 1; } } l=g_list_next(l); } return 0; } static void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv) { struct attr attr; this_->vehicle=nv; if (!nv) return; if (vehicle_get_attr(nv->vehicle, attr_profilename, &attr, NULL)) { if (navit_set_vehicleprofile_name(this_, attr.u.str)) return; } if (!navit_set_vehicleprofile_name(this_,"car")) { /* We do not have a fallback "car" profile * so lets set any profile */ GList *l; l=this_->vehicleprofiles; if (l) { this_->vehicleprofile=l->data; if (this_->route) route_set_profile(this_->route, this_->vehicleprofile); } } } /** * Register a new vehicle * * @param navit The navit instance * @param v The vehicle instance * @returns 1 for success */ static int navit_add_vehicle(struct navit *this_, struct vehicle *v) { struct navit_vehicle *nv=g_new0(struct navit_vehicle, 1); struct attr follow, active, animate; nv->vehicle=v; nv->follow=0; nv->last.x = 0; nv->last.y = 0; nv->animate_cursor=0; if ((vehicle_get_attr(v, attr_follow, &follow, NULL))) nv->follow=follow.u.num; nv->follow_curr=nv->follow; this_->vehicles=g_list_append(this_->vehicles, nv); if ((vehicle_get_attr(v, attr_active, &active, NULL)) && active.u.num) navit_set_vehicle(this_, nv); if ((vehicle_get_attr(v, attr_animate, &animate, NULL))) nv->animate_cursor=animate.u.num; nv->callback.type=attr_callback; nv->callback.u.callback=callback_new_attr_2(callback_cast(navit_vehicle_update), attr_position_coord_geo, this_, nv); vehicle_add_attr(nv->vehicle, &nv->callback); vehicle_set_attr(nv->vehicle, &this_->self); return 1; } struct gui * navit_get_gui(struct navit *this_) { return this_->gui; } struct transformation * navit_get_trans(struct navit *this_) { return this_->trans; } struct route * navit_get_route(struct navit *this_) { return this_->route; } struct navigation * navit_get_navigation(struct navit *this_) { return this_->navigation; } struct displaylist * navit_get_displaylist(struct navit *this_) { return this_->displaylist; } void navit_layout_switch(struct navit *n) { int currTs=0; struct attr iso8601_attr,geo_attr,valid_attr,layout_attr; double trise,tset,trise_actual; struct layout *l; int year, month, day; if (navit_get_attr(n,attr_layout,&layout_attr,NULL)!=1) { return; //No layout - nothing to switch } if (!n->vehicle) return; l=layout_attr.u.layout; if (l->dayname || l->nightname) { //Ok, we know that we have profile to switch //Check that we aren't calculating too fast if (vehicle_get_attr(n->vehicle->vehicle, attr_position_time_iso8601,&iso8601_attr,NULL)==1) { currTs=iso8601_to_secs(iso8601_attr.u.str); dbg(1,"currTs: %u:%u\n",currTs%86400/3600,((currTs%86400)%3600)/60); } if (currTs-(n->prevTs)<60) { //We've have to wait a little return; } if (sscanf(iso8601_attr.u.str,"%d-%02d-%02dT",&year,&month,&day) != 3) return; if (vehicle_get_attr(n->vehicle->vehicle, attr_position_valid, &valid_attr,NULL) && valid_attr.u.num==attr_position_valid_invalid) { return; //No valid fix yet } if (vehicle_get_attr(n->vehicle->vehicle, attr_position_coord_geo,&geo_attr,NULL)!=1) { //No position - no sun return; } //We calculate sunrise anyway, cause it is needed both for day and for night if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { //near the pole sun never rises/sets, so we should never switch profiles dbg(1,"trise: %u:%u, sun never visible, never switch profile\n",HOURS(trise),MINUTES(trise)); n->prevTs=currTs; return; } trise_actual=trise; dbg(1,"trise: %u:%u\n",HOURS(trise),MINUTES(trise)); if (l->dayname) { if ((HOURS(trise)*60+MINUTES(trise)==(currTs%86400)/60) || (n->prevTs==0 && ((HOURS(trise)*60+MINUTES(trise)<(currTs%86400)/60)))) { //The sun is rising now! if (strcmp(l->name,l->dayname)) { navit_set_layout_by_name(n,l->dayname); } } } if (l->nightname) { if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { //near the pole sun never rises/sets, so we should never switch profiles dbg(1,"tset: %u:%u, sun always visible, never switch profile\n",HOURS(tset),MINUTES(tset)); n->prevTs=currTs; return; } dbg(1,"tset: %u:%u\n",HOURS(tset),MINUTES(tset)); if (HOURS(tset)*60+MINUTES(tset)==((currTs%86400)/60) || (n->prevTs==0 && (((HOURS(tset)*60+MINUTES(tset)<(currTs%86400)/60)) || ((HOURS(trise_actual)*60+MINUTES(trise_actual)>(currTs%86400)/60))))) { //Time to sleep if (strcmp(l->name,l->nightname)) { navit_set_layout_by_name(n,l->nightname); } } } n->prevTs=currTs; } } int navit_set_vehicle_by_name(struct navit *n,const char *name) { struct vehicle *v; struct attr_iter *iter; struct attr vehicle_attr, name_attr; iter=navit_attr_iter_new(); while (navit_get_attr(n,attr_vehicle,&vehicle_attr,iter)) { v=vehicle_attr.u.vehicle; vehicle_get_attr(v,attr_name,&name_attr,NULL); if (name_attr.type==attr_name) { if (!strcmp(name,name_attr.u.str)) { navit_set_attr(n,&vehicle_attr); navit_attr_iter_destroy(iter); return 1; } } } navit_attr_iter_destroy(iter); return 0; } int navit_set_layout_by_name(struct navit *n,const char *name) { struct layout *l; struct attr_iter iter; struct attr layout_attr; iter.u.list=0x00; if (navit_get_attr(n,attr_layout,&layout_attr,&iter)!=1) { return 0; //No layouts - nothing to do } if (iter.u.list==NULL) { return 0; } iter.u.list=g_list_first(iter.u.list); while(iter.u.list) { l=(struct layout*)iter.u.list->data; if (!strcmp(name,l->name)) { layout_attr.u.layout=l; layout_attr.type=attr_layout; navit_set_attr(n,&layout_attr); iter.u.list=g_list_first(iter.u.list); return 1; } iter.u.list=g_list_next(iter.u.list); } iter.u.list=g_list_first(iter.u.list); return 0; } void navit_disable_suspend() { gui_disable_suspend(global_navit->gui); callback_list_call_attr_0(global_navit->attr_cbl,attr_unsuspend); } int navit_block(struct navit *this_, int block) { if (block > 0) { this_->blocked |= 1; if (graphics_draw_cancel(this_->gra, this_->displaylist)) this_->blocked |= 2; return 0; } if ((this_->blocked & 2) || block < 0) { this_->blocked=0; navit_draw(this_); return 1; } this_->blocked=0; return 0; } int navit_get_blocked(struct navit *this_) { return this_->blocked; } void navit_destroy(struct navit *this_) { dbg(0,"enter %p\n",this_); graphics_draw_cancel(this_->gra, this_->displaylist); callback_list_call_attr_1(this_->attr_cbl, attr_destroy, this_); attr_list_free(this_->attrs); if(cmd_int_var_hash) { g_hash_table_destroy(cmd_int_var_hash); cmd_int_var_hash=NULL; } if(cmd_attr_var_hash) { g_hash_table_destroy(cmd_attr_var_hash); cmd_attr_var_hash=NULL; } if(cmd_int_var_stack) { g_list_foreach(cmd_int_var_stack, (GFunc)attr_free, NULL); g_list_free(cmd_int_var_stack); cmd_int_var_stack=NULL; } if (this_->bookmarks) { char *center_file = bookmarks_get_center_file(TRUE); bookmarks_write_center_to_file(this_->bookmarks, center_file); g_free(center_file); bookmarks_destroy(this_->bookmarks); } callback_destroy(this_->nav_speech_cb); callback_destroy(this_->roadbook_callback); callback_destroy(this_->popup_callback); callback_destroy(this_->motion_timeout_callback); callback_destroy(this_->progress_cb); if(this_->gra) { graphics_remove_callback(this_->gra, this_->resize_callback); graphics_remove_callback(this_->gra, this_->button_callback); graphics_remove_callback(this_->gra, this_->motion_callback); graphics_remove_callback(this_->gra, this_->predraw_callback); } callback_destroy(this_->resize_callback); callback_destroy(this_->motion_callback); callback_destroy(this_->predraw_callback); callback_destroy(this_->route_cb); if (this_->route) route_destroy(this_->route); map_destroy(this_->former_destination); graphics_displaylist_destroy(this_->displaylist); graphics_free(this_->gra); g_free(this_); } struct object_func navit_func = { attr_navit, (object_func_new)navit_new, (object_func_get_attr)navit_get_attr, (object_func_iter_new)navit_attr_iter_new, (object_func_iter_destroy)navit_attr_iter_destroy, (object_func_set_attr)navit_set_attr, (object_func_add_attr)navit_add_attr, (object_func_remove_attr)navit_remove_attr, (object_func_init)navit_init, (object_func_destroy)navit_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; /** @} */ navit-0.5.0~svn5643+dfsg.1/navit/navit.dtd000066400000000000000000000125071221777731700201440ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/navit.h000066400000000000000000000135501221777731700176170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_NAVIT_H #define NAVIT_NAVIT_H #ifdef __cplusplus extern "C" { #endif extern struct gui *main_loop_gui; // defined in glib.h. #ifndef __G_LIST_H__ struct _GList; typedef struct _GList GList; #endif /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct callback; struct coord_rect; struct displaylist; struct graphics; struct gui; struct mapset; struct message; struct navigation; struct navit; struct pcoord; struct point; struct route; struct tracking; struct transformation; struct vehicleprofile; struct command_table; struct item; void navit_add_mapset(struct navit *this_, struct mapset *ms); struct mapset *navit_get_mapset(struct navit *this_); struct tracking *navit_get_tracking(struct navit *this_); char *navit_get_user_data_directory(int create); void navit_draw_async(struct navit *this_, int async); void navit_draw(struct navit *this_); int navit_get_ready(struct navit *this_); void navit_draw_displaylist(struct navit *this_); void navit_handle_resize(struct navit *this_, int w, int h); int navit_get_width(struct navit *this_); int navit_get_height(struct navit *this_); int navit_ignore_button(struct navit *this_); void navit_ignore_graphics_events(struct navit *this_, int ignore); void navit_set_timeout(struct navit *this_); int navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback); void navit_handle_motion(struct navit *this_, struct point *p); void navit_zoom_in(struct navit *this_, int factor, struct point *p); void navit_zoom_out(struct navit *this_, int factor, struct point *p); void navit_zoom_in_cursor(struct navit *this_, int factor); void navit_zoom_out_cursor(struct navit *this_, int factor); struct navit *navit_new(struct attr *parent, struct attr **attrs); void navit_add_message(struct navit *this_, const char *message); struct message *navit_get_messages(struct navit *this_); struct graphics *navit_get_graphics(struct navit *this_); struct vehicleprofile *navit_get_vehicleprofile(struct navit *this_); GList *navit_get_vehicleprofiles(struct navit *this_); void navit_set_destination(struct navit *this_, struct pcoord *c, const char *description, int async); void navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async); void navit_add_destination_description(struct navit *this_, struct pcoord *c, const char *description); int navit_get_destinations(struct navit *this_, struct pcoord *pc, int count); int navit_get_destination_count(struct navit *this_); char* navit_get_destination_description(struct navit *this_, int n); void navit_remove_nth_waypoint(struct navit *this_, int n); void navit_remove_waypoint(struct navit *this_); char* navit_get_coord_description(struct navit *this_, struct pcoord *c); int navit_check_route(struct navit *this_); struct map* read_former_destinations_from_file(void); void navit_textfile_debug_log(struct navit *this_, const char *fmt, ...); void navit_textfile_debug_log_at(struct navit *this_, struct pcoord *pc, const char *fmt, ...); int navit_speech_estimate(struct navit *this_, char *str); void navit_say(struct navit *this_, const char *text); void navit_speak(struct navit *this_); void navit_window_roadbook_destroy(struct navit *this_); void navit_window_roadbook_new(struct navit *this_); void navit_init(struct navit *this_); void navit_zoom_to_rect(struct navit *this_, struct coord_rect *r); void navit_zoom_to_route(struct navit *this_, int orientation); void navit_set_center(struct navit *this_, struct pcoord *center, int set_timeout); void navit_set_center_cursor(struct navit *this_, int autozoom, int keep_orientation); void navit_set_center_screen(struct navit *this_, struct point *p, int set_timeout); int navit_set_attr(struct navit *this_, struct attr *attr); int navit_get_attr(struct navit *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int navit_add_attr(struct navit *this_, struct attr *attr); int navit_remove_attr(struct navit *this_, struct attr *attr); struct attr_iter *navit_attr_iter_new(void); void navit_attr_iter_destroy(struct attr_iter *iter); void navit_add_callback(struct navit *this_, struct callback *cb); void navit_remove_callback(struct navit *this_, struct callback *cb); void navit_set_position(struct navit *this_, struct pcoord *c); struct gui *navit_get_gui(struct navit *this_); struct transformation *navit_get_trans(struct navit *this_); struct route *navit_get_route(struct navit *this_); struct navigation *navit_get_navigation(struct navit *this_); struct displaylist *navit_get_displaylist(struct navit *this_); void navit_layout_switch(struct navit *n); int navit_set_vehicle_by_name(struct navit *n, const char *name); int navit_set_layout_by_name(struct navit *n, const char *name); void navit_disable_suspend(void); int navit_block(struct navit *this_, int block); int navit_get_blocked(struct navit *this_); void navit_destroy(struct navit *this_); void navit_command_add_table(struct navit*this_, struct command_table *commands, int count); struct navit * navit_ref(struct navit *this_); void navit_unref(struct navit *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/navit_nls.c000066400000000000000000000034351221777731700204670ustar00rootroot00000000000000#include "config.h" #include "debug.h" #include #include #include #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif #ifdef USE_LIBGNUINTL #include #else #include #endif #ifdef USE_NATIVE_LANGUAGE_SUPPORT static GList *textdomains; #endif char * navit_nls_add_textdomain(const char *package, const char *dir) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT char *ret=bindtextdomain(package, dir); bind_textdomain_codeset(package, "UTF-8"); textdomains=g_list_append(textdomains, g_strdup(package)); return ret; #else return NULL; #endif } void navit_nls_remove_textdomain(const char *package) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT GList *i=textdomains; while (i) { if (!strcmp(i->data, package)) { textdomains=g_list_remove_all(textdomains, i->data); g_free(i->data); return; } i=g_list_next(i); } #endif } const char * navit_nls_gettext(const char *msgid) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT GList *i=textdomains; while (i) { const char *ret=dgettext(i->data, msgid); if (ret != msgid) return ret; i=g_list_next(i); } #endif return msgid; } const char * navit_nls_ngettext(const char *msgid, const char *msgid_plural, unsigned long int n) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT GList *i=textdomains; while (i) { const char *ret=dngettext(i->data, msgid, msgid_plural, n); if (ret != msgid && ret != msgid_plural) return ret; i=g_list_next(i); } #endif if (n == 1) { return msgid; } else { return msgid_plural; } } void navit_nls_main_init(void) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT #ifdef FORCE_LOCALE #define STRINGIFY2(x) #x #define STRINGIFY(x) STRINGIFY2(x) setlocale(LC_MESSAGES,STRINGIFY(FORCE_LOCALE)); #endif navit_nls_add_textdomain(PACKAGE, getenv("NAVIT_LOCALEDIR")); textdomain(PACKAGE); #endif } navit-0.5.0~svn5643+dfsg.1/navit/navit_nls.h000066400000000000000000000007511221777731700204720ustar00rootroot00000000000000#ifndef __NAVIT_NLS_H__ char *navit_nls_add_textdomain(const char *package, const char *dir); void navit_nls_remove_textdomain(const char *package); const char *navit_nls_gettext(const char *msgid); const char *navit_nls_ngettext(const char *msgid, const char *msgid_plural, unsigned long int n); void navit_nls_main_init(void); #define _(STRING) navit_nls_gettext(STRING) #define gettext_noop(String) String #define _n(STRING) gettext_noop(STRING) #define __NAVIT_NLS_H__ #endif navit-0.5.0~svn5643+dfsg.1/navit/navit_shipped.xml000066400000000000000000011051251221777731700217050ustar00rootroot00000000000000 Main menu Actions Show Map Settings Tools Route About Actions Bookmarks Former Destinations Town Quit Stop Navigation Settings Display Maps Vehicle Rules Display Layout Fullscreen Window Mode 3D 2D Tools Show Locale Route Description Height Profile Waypoints Drop last Waypoint Drop next Waypoint Map Point Layout Maps Vehicle Satellite Status NMEA Data ]]> navit-0.5.0~svn5643+dfsg.1/navit/osd.c000066400000000000000000000260771221777731700172660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "plugin.h" #include "item.h" #include "xmlconfig.h" #include "color.h" #include "point.h" #include "navit.h" #include "graphics.h" #include "command.h" #include "callback.h" #include "osd.h" struct osd { NAVIT_OBJECT struct osd_methods meth; struct osd_priv *priv; }; int osd_set_methods(struct osd_methods *in, int in_size, struct osd_methods *out) { return navit_object_set_methods(in, in_size, out, sizeof(struct osd_methods)); } struct osd * osd_new(struct attr *parent, struct attr **attrs) { struct osd *o; struct osd_priv *(*new)(struct navit *nav, struct osd_methods *meth, struct attr **attrs); struct attr *type=attr_search(attrs, NULL, attr_type),cbl; if (! type) return NULL; new=plugin_get_osd_type(type->u.str); if (! new) return NULL; o=g_new0(struct osd, 1); o->attrs=attr_list_dup(attrs); cbl.type=attr_callback_list; cbl.u.callback_list=callback_list_new(); o->attrs=attr_generic_prepend_attr(o->attrs, &cbl); o->priv=new(parent->u.navit, &o->meth, o->attrs); if (o->priv) { o->func=&osd_func; navit_object_ref((struct navit_object *)o); } else { attr_list_free(o->attrs); g_free(o); o=NULL; } dbg(3,"new osd %p\n",o); return o; } int osd_get_attr(struct osd *osd, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret=0; if(osd && osd->meth.get_attr) /* values for ret: -1: Not possible, 0: Ignored by driver, 1 valid */ ret=osd->meth.get_attr(osd->priv, type, attr); if (ret == -1) return 0; if (ret > 0) return 1; return navit_object_get_attr((struct navit_object *)osd, type, attr, iter); } int osd_set_attr(struct osd *osd, struct attr* attr) { int ret=0; if(osd && osd->meth.set_attr) /* values for ret: -1: Not possible, 0: Ignored by driver, 1 set and store, 2 set, don't store */ ret=osd->meth.set_attr(osd->priv, attr); if (ret == -1) return 0; if (ret == 2) return 1; return navit_object_set_attr((struct navit_object *)osd, attr); } static void osd_destroy(struct osd *osd) { if (osd && osd->meth.destroy) { osd->meth.destroy(osd->priv); } attr_list_free(osd->attrs); g_free(osd); } void osd_wrap_point(struct point *p, struct navit *nav) { if (p->x < 0) p->x += navit_get_width(nav); if (p->y < 0) p->y += navit_get_height(nav); } static void osd_evaluate_command(struct osd_item *this, struct navit *nav) { struct attr navit; navit.type=attr_navit; navit.u.navit=nav; dbg(1, "calling command '%s'\n", this->command); command_evaluate(&navit, this->command); } void osd_std_click(struct osd_item *this, struct navit *nav, int pressed, int button, struct point *p) { struct point bp = this->p; if (!this->command || !this->command[0]) return; osd_wrap_point(&bp, nav); if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + this->w || p->y > bp.y + this->h || !this->configured) && !this->pressed) return; if (button != 1) return; if (!!pressed == !!this->pressed) return; if (navit_ignore_button(nav)) return; this->pressed = pressed; if (pressed && this->command) osd_evaluate_command(this, nav); } void osd_std_resize(struct osd_item *item) { graphics_overlay_resize(item->gr, &item->p, item->w, item->h, 65535, 1); } static void osd_std_calculate_sizes(struct osd_item *item, struct osd_priv *priv, int w, int h) { struct attr vehicle_attr; if (item->rel_w) { item->w = (item->rel_w * w) / 100; } if (item->rel_h) { item->h = (item->rel_h * h) / 100; } if (item->rel_x) { item->p.x = (item->rel_x * w) / 100; } if (item->rel_y) { item->p.y = (item->rel_y * h) / 100; } osd_std_resize(item); if (item->meth.draw) { if (navit_get_attr(item->navit, attr_vehicle, &vehicle_attr, NULL)) { item->meth.draw(priv, item->navit, vehicle_attr.u.vehicle); } } } static void osd_std_keypress(struct osd_item *item, struct navit *nav, char *key) { #if 0 int i; dbg(0,"key=%s\n",key); for (i = 0 ; i < strlen(key) ; i++) { dbg(0,"key:0x%02x\n",key[i]); } for (i = 0 ; i < strlen(item->accesskey) ; i++) { dbg(0,"accesskey:0x%02x\n",item->accesskey[i]); } #endif if ( ! graphics_is_disabled(item->gr) && item->accesskey && key && !strcmp(key, item->accesskey)) osd_evaluate_command(item, nav); } static void osd_std_reconfigure(struct osd_item *item, struct command_saved *cs) { if (!command_saved_error(cs)) { item->configured = !! command_saved_get_int(cs); if (item->gr && !(item->flags & 16)) graphics_overlay_disable(item->gr, !item->configured); } else { dbg(0, "Error in saved command: %i\n", command_saved_error(cs)); } } void osd_set_std_attr(struct attr **attrs, struct osd_item *item, int flags) { struct attr *attr; item->flags=flags; item->osd_configuration=-1; item->color_white.r = 0xffff; item->color_white.g = 0xffff; item->color_white.b = 0xffff; item->color_white.a = 0xffff; item->text_color.r = 0xffff; item->text_color.g = 0xffff; item->text_color.b = 0xffff; item->text_color.a = 0xffff; if (flags & 1) { item->color_bg.r = 0x0808; item->color_bg.g = 0x0808; item->color_bg.b = 0xf8f8; item->color_bg.a = 0x0000; } else { item->color_bg.r = 0x0; item->color_bg.g = 0x0; item->color_bg.b = 0x0; item->color_bg.a = 0x5fff; } attr=attr_search(attrs, NULL, attr_osd_configuration); if (attr) item->osd_configuration = attr->u.num; attr=attr_search(attrs, NULL, attr_enable_expression); if (attr) { item->enable_cs = command_saved_new(attr->u.str, item->navit, NULL, 0); } attr = attr_search(attrs, NULL, attr_w); if (attr) { if (attr->u.num > ATTR_REL_MAXABS) { item->rel_w = attr->u.num - ATTR_REL_RELSHIFT; } else { item->rel_w = 0; item->w = attr->u.num; } } attr = attr_search(attrs, NULL, attr_h); if (attr) { if (attr->u.num > ATTR_REL_MAXABS) { item->rel_h = attr->u.num - ATTR_REL_RELSHIFT; } else { item->rel_h = 0; item->h = attr->u.num; } } attr = attr_search(attrs, NULL, attr_x); if (attr) { if (attr->u.num > ATTR_REL_MAXABS) { item->rel_x = attr->u.num - ATTR_REL_RELSHIFT; } else { item->rel_x = 0; item->p.x = attr->u.num; } } attr = attr_search(attrs, NULL, attr_y); if (attr) { if (attr->u.num > ATTR_REL_MAXABS) { item->rel_y = attr->u.num - ATTR_REL_RELSHIFT; } else { item->rel_y = 0; item->p.y = attr->u.num; } } attr = attr_search(attrs, NULL, attr_font_size); if (attr) item->font_size = attr->u.num; attr=attr_search(attrs, NULL, attr_background_color); if (attr) item->color_bg=*attr->u.color; attr = attr_search(attrs, NULL, attr_command); if (attr) item->command = g_strdup(attr->u.str); attr=attr_search(attrs, NULL, attr_text_color); if (attr) item->text_color=*attr->u.color; attr=attr_search(attrs, NULL, attr_flags); if (attr) item->attr_flags=attr->u.num; attr=attr_search(attrs, NULL, attr_accesskey); if (attr) item->accesskey = g_strdup(attr->u.str); attr=attr_search(attrs, NULL, attr_font); if (attr) item->font_name = g_strdup(attr->u.str); } void osd_std_config(struct osd_item *item, struct navit *navit) { struct attr attr; dbg(1,"enter\n"); if (item->enable_cs) { item->reconfig_cb = callback_new_1(callback_cast(osd_std_reconfigure), item); command_saved_set_cb(item->enable_cs, item->reconfig_cb); if (!command_saved_error(item->enable_cs)) { item->configured = !! command_saved_get_int(item->enable_cs); } else { dbg(0, "Error in saved command: %i.\n", command_saved_error(item->enable_cs)); } } else { if (!navit_get_attr(navit, attr_osd_configuration, &attr, NULL)) attr.u.num=-1; item->configured = !!(attr.u.num & item->osd_configuration); } if (item->gr && !(item->flags & 16)) graphics_overlay_disable(item->gr, !item->configured); } void osd_set_std_config(struct navit *nav, struct osd_item *item) { item->cb = callback_new_attr_2(callback_cast(osd_std_config), attr_osd_configuration, item, nav); navit_add_callback(nav, item->cb); osd_std_config(item, nav); } void osd_set_keypress(struct navit *nav, struct osd_item *item) { struct graphics *navit_gr = navit_get_graphics(nav); dbg(2,"accesskey %s\n",item->accesskey); if (item->accesskey) { item->keypress_cb=callback_new_attr_2(callback_cast(osd_std_keypress), attr_keypress, item, nav); graphics_add_callback(navit_gr, item->keypress_cb); } } void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv) { struct graphics *navit_gr; navit_gr = navit_get_graphics(nav); item->gr = graphics_overlay_new(navit_gr, &item->p, item->w, item->h, 65535, 1); item->graphic_bg = graphics_gc_new(item->gr); graphics_gc_set_foreground(item->graphic_bg, &item->color_bg); graphics_background_gc(item->gr, item->graphic_bg); item->graphic_fg_white = graphics_gc_new(item->gr); graphics_gc_set_foreground(item->graphic_fg_white, &item->color_white); if (item->flags & 2) { item->font = graphics_named_font_new(item->gr, item->font_name, item->font_size, 1); item->graphic_fg_text = graphics_gc_new(item->gr); graphics_gc_set_foreground(item->graphic_fg_text, &item->text_color); } osd_set_std_config(nav, item); item->resize_cb = callback_new_attr_2(callback_cast(osd_std_calculate_sizes), attr_resize, item, priv); graphics_add_callback(navit_gr, item->resize_cb); osd_set_keypress(nav, item); } void osd_std_draw(struct osd_item *item) { struct point p[2]; int flags=item->attr_flags; graphics_draw_mode(item->gr, draw_mode_begin); p[0].x=0; p[0].y=0; graphics_draw_rectangle(item->gr, item->graphic_bg, p, item->w, item->h); p[1].x=item->w-1; p[1].y=0; if (flags & 1) graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); p[0].x=item->w-1; p[0].y=item->h-1; if (flags & 2) graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); p[1].x=0; p[1].y=item->h-1; if (flags & 4) graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); p[0].x=0; p[0].y=0; if (flags & 8) graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); } struct object_func osd_func = { attr_osd, (object_func_new)osd_new, (object_func_get_attr)osd_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)osd_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)osd_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/osd.h000066400000000000000000000055211221777731700172620ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_OSD_H #define NAVIT_OSD_H struct osd_priv; struct attr; struct osd_methods { void (*osd_destroy)(struct osd_priv *osd); int (*set_attr)(struct osd_priv *osd, struct attr* attr); void (*destroy)(struct osd_priv *osd); int (*get_attr)(struct osd_priv *osd, enum attr_type type, struct attr* attr); }; #define osd_draw_cast(x) (void (*)(struct osd_priv *osd, struct navit *navit, struct vehicle *v))(x) struct osd_item_methods { void (*draw)(struct osd_priv *osd, struct navit *navit, struct vehicle *v); }; struct osd_item { struct point p; struct osd_item_methods meth; int flags, attr_flags, w, h, fg_line_width, font_size, osd_configuration, configured; int rel_w, rel_h, rel_x, rel_y; struct color color_bg, color_white, text_color; struct navit *navit; struct graphics *gr; struct graphics_gc *graphic_bg, *graphic_fg_white, *graphic_fg_text; struct graphics_font *font; char *font_name; struct callback *cb; struct callback *resize_cb; struct callback *reconfig_cb; struct callback *keypress_cb; int pressed; char *command; struct command_saved *enable_cs; char *accesskey; }; /* prototypes */ struct attr; struct navit; struct osd; struct osd *osd_new(struct attr *parent, struct attr **attrs); int osd_set_methods(struct osd_methods *in, int in_size, struct osd_methods *out); void osd_wrap_point(struct point *p, struct navit *nav); void osd_std_click(struct osd_item *this, struct navit *nav, int pressed, int button, struct point *p); void osd_set_std_attr(struct attr **attrs, struct osd_item *item, int flags); void osd_std_config(struct osd_item *item, struct navit *navit); void osd_set_keypress(struct navit *nav, struct osd_item *item); void osd_set_std_config(struct navit *nav, struct osd_item *item); void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv); void osd_std_resize(struct osd_item *item); void osd_std_draw(struct osd_item *item); int osd_set_attr(struct osd *osd, struct attr* attr); int osd_get_attr(struct osd *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); /* end of prototypes */ #endif navit-0.5.0~svn5643+dfsg.1/navit/osd/000077500000000000000000000000001221777731700171065ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/osd/Makefile.am000066400000000000000000000000761221777731700211450ustar00rootroot00000000000000SUBDIRS= DIST_SUBDIRS=core if OSD_CORE SUBDIRS+=core endif navit-0.5.0~svn5643+dfsg.1/navit/osd/core/000077500000000000000000000000001221777731700200365ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/osd/core/CMakeLists.txt000066400000000000000000000000501221777731700225710ustar00rootroot00000000000000module_add_library(osd_core osd_core.c) navit-0.5.0~svn5643+dfsg.1/navit/osd/core/Makefile.am000066400000000000000000000004711221777731700220740ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=osd_core if PLUGINS moduleosd_LTLIBRARIES = libosd_core.la else noinst_LTLIBRARIES = libosd_core.la endif libosd_core_la_SOURCES = osd_core.c libosd_core_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/osd/core/osd_core.c000066400000000000000000003134211221777731700220030ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef _MSC_VER #define _USE_MATH_DEFINES 1 #endif /* _MSC_VER */ #include #include #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include #include "item.h" #include "xmlconfig.h" #include "point.h" #include "coord.h" #include "graphics.h" #include "transform.h" #include "route.h" #include "navit.h" #include "plugin.h" #include "debug.h" #include "callback.h" #include "color.h" #include "vehicle.h" #include "navigation.h" #include "track.h" #include "map.h" #include "file.h" #include "attr.h" #include "command.h" #include "navit_nls.h" #include "messages.h" #include "vehicleprofile.h" #include "roadprofile.h" #include "osd.h" #include "speech.h" #include "event.h" #include "mapset.h" #include "util.h" #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif #ifdef _MSC_VER static double round(double x) { if (x >= 0.0) return floor(x + 0.5); else return ceil(x - 0.5); } #endif /* MSC_VER */ struct osd_priv_common { struct osd_item osd_item; struct osd_priv *data; int (*spec_set_attr_func)(struct osd_priv_common *opc, struct attr* attr); }; struct odometer; int set_std_osd_attr(struct osd_priv *priv, struct attr*the_attr); static void osd_odometer_reset(struct osd_priv_common *opc, int flags); static void osd_cmd_odometer_reset(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid); static void osd_odometer_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v); static struct osd_text_item * oti_new(struct osd_text_item * parent); int osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr); static int b_commandtable_added = 0; struct compass { int width; struct graphics_gc *green; struct callback *click_cb; }; static void transform_rotate(struct point *center, int angle, struct point *p, int count) { int i, x, y; double dx, dy; for (i = 0; i < count; i++) { dx = sin(M_PI * angle / 180.0); dy = cos(M_PI * angle / 180.0); x = dy * p->x - dx * p->y; y = dx * p->x + dy * p->y; p->x = center->x + x; p->y = center->y + y; p++; } } static void handle(struct graphics *gr, struct graphics_gc *gc, struct point *p, int r, int dir) { struct point ph[3]; int l = r * 0.4; ph[0].x = 0; ph[0].y = r; ph[1].x = 0; ph[1].y = -r; transform_rotate(p, dir, ph, 2); graphics_draw_lines(gr, gc, ph, 2); ph[0].x = -l; ph[0].y = -r + l; ph[1].x = 0; ph[1].y = -r; ph[2].x = l; ph[2].y = -r + l; transform_rotate(p, dir, ph, 3); graphics_draw_lines(gr, gc, ph, 3); } /** * * Format distance, choosing the unit (m or km) and precision depending on distance * * * * @param distance distance in meters * * @param sep separator character to be inserted between distance value and unit * * @returns a pointer to a string containing the formatted distance * */ static char * format_distance(double distance, char *sep, int imperial) { if (imperial){ distance *= FEET_PER_METER; if(distance <= 1500){ return g_strdup_printf("%.0f%sft", round(distance / 10) * 10, sep); } else { return g_strdup_printf("%.1f%smi", distance / FEET_PER_MILE, sep); } } else { if (distance >= 100000) return g_strdup_printf("%.0f%skm", distance / 1000, sep); else if (distance >= 10000) return g_strdup_printf("%.1f%skm", distance / 1000, sep); else if (distance >= 300) return g_strdup_printf("%.0f%sm", round(distance / 25) * 25, sep); else if (distance >= 50) return g_strdup_printf("%.0f%sm", round(distance / 10) * 10, sep); else if (distance >= 10) return g_strdup_printf("%.0f%sm", distance, sep); else return g_strdup_printf("%.1f%sm", distance, sep); } } /** * * Format time (duration) * * * * @param tm pointer to a tm structure specifying the time * * @param days days * * @returns a pointer to a string containing the formatted time * */ static char * format_time(struct tm *tm, int days) { if (days) return g_strdup_printf("%d+%02d:%02d", days, tm->tm_hour, tm->tm_min); else return g_strdup_printf("%02d:%02d", tm->tm_hour, tm->tm_min); } /** * * Format speed in km/h * * * * @param speed speed in km/h * * @param sep separator character to be inserted between speed value and unit * * @returns a pointer to a string containing the formatted speed * */ static char * format_speed(double speed, char *sep, char *format, int imperial) { char *unit="km/h"; if (imperial) { speed = speed*1000*FEET_PER_METER/FEET_PER_MILE; unit="mph"; } if (!format || !strcmp(format,"named")) return g_strdup_printf((speed < 10) ? "%.1f%s%s":"%.0f%s%s", speed, sep, unit); else if (!strcmp(format,"value") || !strcmp(format,"unit")) { if (!strcmp(format,"value")) return g_strdup_printf((speed < 10) ? "%.1f":"%.0f", speed); else return g_strdup(unit); } return g_strdup(""); } static char * format_float_0(double num) { return g_strdup_printf("%.0f", num); } int set_std_osd_attr(struct osd_priv *priv, struct attr*the_attr) { struct osd_priv_common *opc=(struct osd_priv_common *)priv; if(opc && the_attr && ATTR_IS_INT(the_attr->type)) { if(attr_w == the_attr->type) { opc->osd_item.w = the_attr->u.num; if(opc->osd_item.gr) { osd_std_resize(&opc->osd_item); return 1; } } else if(attr_h == the_attr->type) { opc->osd_item.h = the_attr->u.num; if(opc->osd_item.gr) { osd_std_resize(&opc->osd_item); return 1; } } else if(attr_x == the_attr->type) { opc->osd_item.p.x = the_attr->u.num; if(opc->osd_item.gr) { osd_std_resize(&opc->osd_item); return 1; } } else if(attr_y == the_attr->type) { opc->osd_item.p.y = the_attr->u.num; if(opc->osd_item.gr) { osd_std_resize(&opc->osd_item); return 1; } } else if(attr_font_size == the_attr->type) { opc->osd_item.font_size = the_attr->u.num; if(opc->osd_item.gr) { osd_std_resize(&opc->osd_item); return 1; } } } if(opc->spec_set_attr_func) { opc->spec_set_attr_func(opc, the_attr); } return 0; } struct route_guard { int coord_num; struct coord *coords; double min_dist; //distance treshold, exceeding this distance will trigger announcement double max_dist; //out of range distance, farther than this distance no warning will be given char*item_name; char*map_name; int warned; double last_time; int update_period; struct color active_color; struct graphics_gc *red; struct graphics_gc *white; int width; }; static void osd_route_guard_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { int i=0; struct vehicle* curr_vehicle = v; struct attr position_attr, vehicle_attr, imperial_attr; struct coord curr_coord; struct route_guard *this = (struct route_guard *)opc->data; double curr_time; struct timeval tv; struct point p; struct point bbox[4]; char* dist_str; struct graphics_gc *curr_color; int imperial=0; double min_dist; //do not execute for each gps update gettimeofday(&tv,NULL); curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; if ( this->last_time+this->update_period > curr_time) { return; } this->last_time = curr_time; if(nav) { navit_get_attr(nav, attr_vehicle, &vehicle_attr, NULL); if (vehicle_attr.u.vehicle) { curr_vehicle = vehicle_attr.u.vehicle; } if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) { imperial=imperial_attr.u.num; } } if(0==curr_vehicle) return; if(!vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL)) { return; } transform_from_geo(projection_mg, position_attr.u.coord_geo, &curr_coord); min_dist = 1000000; //calculate min dist if(this->coord_num > 1) { double scale = transform_scale(curr_coord.y); for( i=1 ; icoord_num ; ++i ) { struct coord proj_coord; double curr_dist; transform_distance_line_sq(&this->coords[i-1], &this->coords[i], &curr_coord, &proj_coord); curr_dist = transform_distance(projection_mg, &proj_coord, &curr_coord); curr_dist /= scale; if (curr_distwarned == 0 && this->min_dist < min_dist && min_dist < this->max_dist) { navit_say(nav, _("Return to route!")); this->warned = 1; } else if( min_dist < this->min_dist ) { this->warned = 0; } } osd_std_draw(&opc->osd_item); dist_str = format_distance(min_dist, "", imperial); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, dist_str, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; curr_color = (this->min_dist < min_dist && min_dist < this->max_dist) ? this->red : this->white; graphics_draw_text(opc->osd_item.gr, curr_color, NULL, opc->osd_item.font, dist_str, &p, 0x10000, 0); g_free(dist_str); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_route_guard_init(struct osd_priv_common *opc, struct navit *nav) { struct color red_color={0xffff,0x0000,0x0000,0xffff}; struct route_guard *this = (struct route_guard *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); //load coord data if (this->map_name && this->item_name) { struct mapset* ms; struct map_rect *mr; struct mapset_handle *msh; struct map *map = NULL; struct item *item = NULL; if(!(ms=navit_get_mapset(nav))) { return; } msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { struct attr attr; if(map_get_attr(map, attr_name, &attr, NULL)) { if( ! strcmp(this->map_name, attr.u.str) ) { mr=map_rect_new(map, NULL); if (mr) { while ((item=map_rect_get_item(mr))) { struct attr item_attr; if(item_attr_get(item, attr_name, &item_attr)) { if (!strcmp(item_attr.u.str,this->item_name)) { //item found, get coords struct coord c; this->coord_num=0; while (item_coord_get(item,&c,1)) { this->coords = g_renew(struct coord,this->coords,this->coord_num+1); this->coords[this->coord_num] = c; ++this->coord_num; } } } } } } else { continue; } } else { continue; } } mapset_close(msh); } this->red = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->red, &red_color); graphics_gc_set_linewidth(this->red, this->width); this->white = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); graphics_gc_set_linewidth(this->white, this->width); //setup draw callback navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_draw), attr_position_coord_geo, opc)); } static void osd_route_guard_destroy(struct osd_priv_common *opc) { struct route_guard *this = (struct route_guard *)opc->data; g_free(this->coords); } static struct osd_priv * osd_route_guard_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct route_guard *this = g_new0(struct route_guard, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 120; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_route_guard_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_min_dist); if (attr) { this->min_dist = attr->u.num; } else this->min_dist = 30; //default tolerance is 30m attr = attr_search(attrs, NULL, attr_max_dist); if (attr) { this->max_dist = attr->u.num; } else this->max_dist = 500; //default attr = attr_search(attrs, NULL, attr_item_name); if (attr) { this->item_name = g_strdup(attr->u.str); } else this->item_name = NULL; attr = attr_search(attrs, NULL, attr_map_name); if (attr) { this->map_name = g_strdup(attr->u.str); } else this->map_name = NULL; attr = attr_search(attrs, NULL, attr_update_period); this->update_period=attr ? attr->u.num : 10; attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_init), attr_graphics_ready, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_destroy), attr_destroy, opc)); return (struct osd_priv *) opc; } static int odometers_saved = 0; static GList* odometer_list = NULL; static struct command_table commands[] = { {"odometer_reset",command_cast(osd_cmd_odometer_reset)}, }; struct odometer { int width; struct graphics_gc *orange; struct graphics_gc *white; struct callback *click_cb; char *text; //text of label attribute for this osd char *name; //unique name of the odometer (needed for handling multiple odometers persistently) struct color idle_color; //text color when counter is idle int bDisableReset; int bAutoStart; int bActive; //counting or not int autosave_period; //autosave period in seconds double sum_dist; //sum of distance ofprevious intervals in meters double sum_time; //sum of time of previous intervals in seconds (needed for avg spd calculation) double time_all; double last_click_time; //time of last click (for double click handling) double last_start_time; //time of last start of counting double last_update_time; //time of last position update struct coord last_coord; double last_speed; double max_speed; double acceleration; }; static void osd_cmd_odometer_reset(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { GList* list = odometer_list; while(list) { if(!strcmp(((struct odometer*)((struct osd_priv_common *)(list->data))->data)->name,in[0]->u.str)) { osd_odometer_reset(list->data,3); osd_odometer_draw(list->data,this,NULL); } list = g_list_next(list); } } } static char* str_replace(char*output, char*input, char*pattern, char*replacement) { char *pos; char *pos2; if (!output || !input || !pattern || !replacement) { return NULL; } if(!strcmp(pattern,"")) { return input; } pos = &input[0]; pos2 = &input[0]; output[0] = 0; while ( (pos2=strstr(pos,pattern)) ) { strncat(output,pos,pos2-pos); strcat(output,replacement); pos = pos2 + strlen(pattern); } strcat(output,pos); return NULL; } /* * save current odometer state to string */ static char *osd_odometer_to_string(struct odometer *this_) { return g_strdup_printf("odometer %s %lf %lf %d %lf\n",this_->name,this_->sum_dist,this_->time_all,this_->bActive,this_->max_speed); } /* * load current odometer state from string */ static void osd_odometer_from_string(struct odometer *this_, char*str) { char* tok; char* name_str; char* sum_dist_str; char* sum_time_str; char* active_str; char* max_spd_str; tok = strtok(str, " "); if( !tok || strcmp("odometer",tok)) { return; } name_str = g_strdup(strtok(NULL, " ")); if(!name_str) { return; } sum_dist_str = g_strdup(strtok(NULL, " ")); if(!sum_dist_str) { g_free(name_str); return; } sum_time_str = g_strdup(strtok(NULL, " ")); if(!sum_time_str) { g_free(name_str); g_free(sum_dist_str); return; } active_str = g_strdup(strtok(NULL, " ")); if(!active_str) { g_free(name_str); g_free(sum_dist_str); g_free(sum_time_str); return; } max_spd_str = g_strdup(strtok(NULL, " ")); if(!max_spd_str) { g_free(name_str); g_free(sum_dist_str); g_free(sum_time_str); g_free(active_str); return; } this_->name = name_str; this_->sum_dist = atof(sum_dist_str); this_->sum_time = atof(sum_time_str); this_->bActive = atoi(active_str); this_->max_speed = atof(max_spd_str); this_->last_coord.x = -1; g_free(active_str); g_free(sum_dist_str); g_free(sum_time_str); g_free(max_spd_str); } static void draw_multiline_osd_text(char *buffer,struct osd_item *osd_item, struct graphics_gc *curr_color) { gchar**bufvec = g_strsplit(buffer,"\n",0); struct point p, bbox[4]; //count strings int strnum = 0; gchar**pch = bufvec; while(*pch) { ++strnum; ++pch; } if(0h / strnum; pch = bufvec; p.y = 0; while (*pch) { graphics_get_text_bbox(osd_item->gr, osd_item->font, *pch, 0x10000, 0, bbox, 0); p.x=(osd_item->w-bbox[2].x)/2; p.y += dh; graphics_draw_text(osd_item->gr, curr_color, NULL, osd_item->font, *pch, &p, 0x10000, 0); ++pch; } } g_free(bufvec); } static void osd_odometer_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct odometer *this = (struct odometer *)opc->data; struct coord curr_coord; struct graphics_gc *curr_color; char *dist_buffer=0; char *spd_buffer=0; char *max_spd_buffer=0; char *time_buffer = 0; char *acc_buffer = 0; struct attr position_attr,vehicle_attr,imperial_attr,speed_attr; enum projection pro; struct vehicle* curr_vehicle = v; double spd = 0; double curr_spd = 0; int remainder; int days; int hours; int mins; int secs; int imperial=0; char buffer [256+1]=""; char buffer2[256+1]=""; if(nav) { navit_get_attr(nav, attr_vehicle, &vehicle_attr, NULL); if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; } if (vehicle_attr.u.vehicle) { curr_vehicle = vehicle_attr.u.vehicle; } if(0==curr_vehicle) return; osd_std_draw(&opc->osd_item); if(this->bActive) { if(!vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL)) { return; } pro = projection_mg;//position_attr.u.pcoord->pro; transform_from_geo(pro, position_attr.u.coord_geo, &curr_coord); if (this->last_coord.x != -1 ) { const double cStepDistLimit = 10000; struct timeval tv; double curr_time; double dt; double dCurrDist = 0; gettimeofday(&tv,NULL); curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; //we have valid previous position dt = curr_time-this->last_update_time; dCurrDist = transform_distance(pro, &curr_coord, &this->last_coord); if(dCurrDist<=cStepDistLimit) { this->sum_dist += dCurrDist; } this->time_all = curr_time-this->last_click_time+this->sum_time; spd = 3.6*(double)this->sum_dist/(double)this->time_all; if(dt != 0) { if (curr_coord.x!=this->last_coord.x || curr_coord.y!=this->last_coord.y) { if(vehicle_get_attr(curr_vehicle, attr_position_speed,&speed_attr, NULL)) { double dv; curr_spd = *speed_attr.u.numd; dv = (curr_spd-this->last_speed)/3.6; //speed difference in m/sec this->acceleration = dv/dt; this->last_speed = curr_spd; this->last_update_time = curr_time; } } } this->max_speed = (curr_spd<=this->max_speed) ? this->max_speed : curr_spd; } this->last_coord = curr_coord; } dist_buffer = format_distance(this->sum_dist,"",imperial); spd_buffer = format_speed(spd,"","value",imperial); max_spd_buffer = format_speed(this->max_speed,"","value",imperial); acc_buffer = g_strdup_printf("%.3f m/s2",this->acceleration); remainder = (int)this->time_all; days = remainder / (24*60*60); remainder = remainder % (24*60*60); hours = remainder / (60*60); remainder = remainder % (60*60); mins = remainder / (60); remainder = remainder % (60); secs = remainder; if(0text) { str_replace(buffer,this->text,"${avg_spd}",spd_buffer); str_replace(buffer2,buffer,"${distance}",dist_buffer); str_replace(buffer,buffer2,"${time}",time_buffer); str_replace(buffer2,buffer,"${acceleration}",acc_buffer); str_replace(buffer,buffer2,"${max_spd}",max_spd_buffer); } g_free(time_buffer); curr_color = this->bActive?this->white:this->orange; draw_multiline_osd_text(buffer,&opc->osd_item, curr_color); g_free(dist_buffer); g_free(spd_buffer); g_free(max_spd_buffer); g_free(acc_buffer); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_odometer_reset(struct osd_priv_common *opc, int flags) { struct odometer *this = (struct odometer *)opc->data; if(!this->bDisableReset || (flags & 1)) { if (!(flags & 2)) this->bActive = 0; this->sum_dist = 0; this->sum_time = 0; this->max_speed = 0; this->last_start_time = 0; this->last_coord.x = -1; this->last_coord.y = -1; } } static void osd_odometer_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) { struct odometer *this = (struct odometer *)opc->data; struct point bp = opc->osd_item.p; struct timeval tv; double curr_time; const double double_click_timewin = .5; osd_wrap_point(&bp, nav); if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h || !opc->osd_item.configured ) && !opc->osd_item.pressed) return; if (button != 1) return; if (navit_ignore_button(nav)) return; if (!!pressed == !!opc->osd_item.pressed) return; gettimeofday(&tv,NULL); curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; if (pressed) { //single click handling if(this->bActive) { //being stopped this->last_coord.x = -1; this->last_coord.y = -1; this->sum_time += curr_time-this->last_click_time; } this->bActive ^= 1; //toggle active flag if (curr_time-double_click_timewin <= this->last_click_time) { //double click handling osd_odometer_reset(opc,0); } this->last_click_time = curr_time; osd_odometer_draw(opc, nav,NULL); } } static int osd_odometer_save(struct navit* nav) { //save odometers that are persistent(ie have name) FILE*f; GList* list = odometer_list; char* fn = g_strdup_printf("%s/odometer.txt",navit_get_user_data_directory(TRUE)); f = fopen(fn,"w+"); g_free(fn); if(!f) { return TRUE; } while (list) { if(((struct odometer*)((struct osd_priv_common *)(list->data))->data)->name) { char*odo_str = osd_odometer_to_string((struct odometer*)((struct osd_priv_common *)(list->data))->data); fprintf(f,"%s",odo_str); g_free(odo_str); } list = g_list_next(list); } fclose(f); return TRUE; } static void osd_odometer_init(struct osd_priv_common *opc, struct navit *nav) { struct odometer *this = (struct odometer *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->orange = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->orange, &this->idle_color); graphics_gc_set_linewidth(this->orange, this->width); this->white = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); graphics_gc_set_linewidth(this->white, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_draw), attr_position_coord_geo, opc)); navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_odometer_click), attr_button, opc)); if(this->autosave_period>0) { event_add_timeout(this->autosave_period*1000, 1, callback_new_1(callback_cast(osd_odometer_save), NULL)); } if(this->bAutoStart) { this->bActive = 1; } osd_odometer_draw(opc, nav, NULL); } static void osd_odometer_destroy(struct navit* nav) { if(!odometers_saved) { odometers_saved = 1; osd_odometer_save(NULL); } } static struct osd_priv * osd_odometer_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { FILE* f; char* fn; struct odometer *this = g_new0(struct odometer, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; struct color orange_color={0xffff,0xa5a5,0x0000,0xffff}; opc->data = (void*)this; opc->osd_item.p.x = 120; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_odometer_draw); meth->set_attr = set_std_osd_attr; this->bActive = 0; //do not count on init this->sum_dist = 0; this->max_speed = 0; this->last_click_time = time(0); this->last_coord.x = -1; this->last_coord.y = -1; attr = attr_search(attrs, NULL, attr_label); //FIXME find some way to free text!!!! if (attr) { this->text = g_strdup(attr->u.str); } else this->text = NULL; attr = attr_search(attrs, NULL, attr_name); //FIXME find some way to free text!!!! if (attr) { this->name = g_strdup(attr->u.str); } else this->name = NULL; attr = attr_search(attrs, NULL, attr_disable_reset); if (attr) this->bDisableReset = attr->u.num; else this->bDisableReset = 0; attr = attr_search(attrs, NULL, attr_autostart); if (attr) this->bAutoStart = attr->u.num; else this->bAutoStart = 0; attr = attr_search(attrs, NULL, attr_autosave_period); if (attr) this->autosave_period = attr->u.num; else this->autosave_period = -1; //disabled by default osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_idle_color); this->idle_color=attr ? *attr->u.color : orange_color; // text idle_color defaults to orange this->last_coord.x = -1; this->last_coord.y = -1; this->sum_dist = 0.0; //load state from file fn = g_strdup_printf("%s/odometer.txt",navit_get_user_data_directory(FALSE)); f = fopen(fn,"r+"); if(f) { g_free(fn); while(!feof(f)) { char str[128]; char *line; if(fgets(str,128,f)) { char *tok; line = g_strdup(str); tok = strtok(str," "); if(!strcmp(tok,"odometer")) { tok = strtok(NULL," "); if(this->name && tok && !strcmp(this->name,tok)) { osd_odometer_from_string(this,line); } } g_free(line); } } fclose(f); } if(b_commandtable_added == 0) { navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); b_commandtable_added = 1; } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_init), attr_graphics_ready, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_destroy), attr_destroy, nav)); odometer_list = g_list_append(odometer_list, opc); return (struct osd_priv *) opc; } struct cmd_interface { int width; struct graphics_gc *orange,*white; int update_period; //in sec char* text; struct graphics_image *img; char*img_filename; char* command; int bReserved; }; static void osd_cmd_interface_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct cmd_interface *this = (struct cmd_interface *)opc->data; struct point p; struct point bbox[4]; struct graphics_gc *curr_color; struct attr navit; p.x = 0; p.y = 0; navit.type=attr_navit; navit.u.navit = opc->osd_item.navit; if(0==this->bReserved) { this->bReserved = 1; command_evaluate(&navit, this->command); this->bReserved = 0; } osd_std_draw(&opc->osd_item); //display image if(this->img) { graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, this->img); } //display text graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, this->text, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; curr_color = this->white; if(this->text) draw_multiline_osd_text(this->text,&opc->osd_item, curr_color); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_cmd_interface_init(struct osd_priv_common *opc, struct navit *nav) { struct cmd_interface *this = (struct cmd_interface *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->white = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); graphics_gc_set_linewidth(this->white, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); if(this->update_period>0) { event_add_timeout(this->update_period*1000, 1, callback_new_1(callback_cast(osd_cmd_interface_draw), opc)); } navit_add_callback(nav, callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); this->text = g_strdup(""); } static int osd_cmd_interface_set_attr(struct osd_priv_common *opc, struct attr* attr) { struct cmd_interface *this_ = (struct cmd_interface *)opc->data; if(NULL==attr || NULL==this_) { return 0; } if(attr->type == attr_status_text) { if(this_->text) { g_free(this_->text); } if(attr->u.str) { this_->text = g_strdup(attr->u.str); } return 1; } if(attr->type == attr_src) { if(attr->u.str) { if((!this_->img_filename) || strcmp(this_->img_filename, graphics_icon_path(attr->u.str))) { //destroy old img, create new image if(this_->img) { graphics_image_free(opc->osd_item.gr, this_->img); } if(this_->img_filename) { g_free(this_->img_filename); } this_->img_filename = graphics_icon_path(attr->u.str); this_->img = graphics_image_new(opc->osd_item.gr, this_->img_filename); } } return 1; } return 0; } static struct osd_priv * osd_cmd_interface_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct cmd_interface *this = g_new0(struct cmd_interface, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 120; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_cmd_interface_draw); opc->spec_set_attr_func = osd_cmd_interface_set_attr; meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_update_period); this->update_period=attr ? attr->u.num : 5; //default update period is 5 seconds attr = attr_search(attrs, NULL, attr_command); this->command = attr ? g_strdup(attr->u.str) : g_strdup(""); if(b_commandtable_added == 0) { navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); b_commandtable_added = 1; } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_cmd_interface_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct stopwatch { int width; struct graphics_gc *orange,*white; struct callback *click_cb; struct color idle_color; //text color when counter is idle int bDisableReset; int bActive; //counting or not time_t current_base_time; //base time of currently measured time interval time_t sum_time; //sum of previous time intervals (except current intervals) time_t last_click_time; //time of last click (for double click handling) }; static void osd_stopwatch_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct stopwatch *this = (struct stopwatch *)opc->data; struct graphics_gc *curr_color; char buffer[32]="00:00:00"; struct point p; struct point bbox[4]; time_t total_sec,total_min,total_hours,total_days; total_sec = this->sum_time; osd_std_draw(&opc->osd_item); if(this->bActive) { total_sec += time(0)-this->current_base_time; } total_min = total_sec/60; total_hours = total_min/60; total_days = total_hours/24; if (total_days==0) { g_snprintf(buffer,32,"%02d:%02d:%02d", (int)total_hours%24, (int)total_min%60, (int)total_sec%60); } else { g_snprintf(buffer,32,"%02dd %02d:%02d:%02d", (int)total_days, (int)total_hours%24, (int)total_min%60, (int)total_sec%60); } graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; curr_color = this->bActive?this->white:this->orange; graphics_draw_text(opc->osd_item.gr, curr_color, NULL, opc->osd_item.font, buffer, &p, 0x10000, 0); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_stopwatch_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) { struct stopwatch *this = (struct stopwatch *)opc->data; struct point bp = opc->osd_item.p; osd_wrap_point(&bp, nav); if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h || !opc->osd_item.configured ) && !opc->osd_item.pressed) return; if (button != 1) return; if (navit_ignore_button(nav)) return; if (!!pressed == !!opc->osd_item.pressed) return; if (pressed) { //single click handling if(this->bActive) { this->sum_time += time(0)-this->current_base_time; this->current_base_time = 0; } else { this->current_base_time = time(0); } this->bActive ^= 1; //toggle active flag if (this->last_click_time == time(0) && !this->bDisableReset) { //double click handling this->bActive = 0; this->current_base_time = 0; this->sum_time = 0; } this->last_click_time = time(0); } osd_stopwatch_draw(opc, nav,NULL); } static void osd_stopwatch_init(struct osd_priv_common *opc, struct navit *nav) { struct stopwatch *this = (struct stopwatch *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->orange = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->orange, &this->idle_color); graphics_gc_set_linewidth(this->orange, this->width); this->white = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); graphics_gc_set_linewidth(this->white, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); event_add_timeout(500, 1, callback_new_1(callback_cast(osd_stopwatch_draw), opc)); navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_stopwatch_click), attr_button, opc)); osd_stopwatch_draw(opc, nav, NULL); } static struct osd_priv * osd_stopwatch_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct stopwatch *this = g_new0(struct stopwatch, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; struct color orange_color={0xffff,0xa5a5,0x0000,0xffff}; opc->data = (void*)this; opc->osd_item.p.x = 120; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_stopwatch_draw); meth->set_attr = set_std_osd_attr; this->bActive = 0; //do not count on init this->current_base_time = 0; this->sum_time = 0; this->last_click_time = 0; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_idle_color); this->idle_color=attr ? *attr->u.color : orange_color; // text idle_color defaults to orange attr = attr_search(attrs, NULL, attr_disable_reset); if (attr) this->bDisableReset = attr->u.num; else this->bDisableReset = 0; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_stopwatch_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } static void osd_compass_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct compass *this = (struct compass *)opc->data; struct point p,bbox[4]; struct attr attr_dir, destination_attr, position_attr, imperial_attr; double dir, vdir = 0; char *buffer; struct coord c1, c2; enum projection pro; int imperial=0; if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; osd_std_draw(&opc->osd_item); p.x = opc->osd_item.w/2; p.y = opc->osd_item.w/2; graphics_draw_circle(opc->osd_item.gr, opc->osd_item.graphic_fg_white, &p, opc->osd_item.w*5/6); if (v) { if (vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL)) { vdir = *attr_dir.u.numd; handle(opc->osd_item.gr, opc->osd_item.graphic_fg_white, &p, opc->osd_item.w/3, -vdir); } if (navit_get_attr(nav, attr_destination, &destination_attr, NULL) && vehicle_get_attr(v, attr_position_coord_geo,&position_attr, NULL)) { pro = destination_attr.u.pcoord->pro; transform_from_geo(pro, position_attr.u.coord_geo, &c1); c2.x = destination_attr.u.pcoord->x; c2.y = destination_attr.u.pcoord->y; dir = atan2(c2.x - c1.x, c2.y - c1.y) * 180.0 / M_PI; dir -= vdir; handle(opc->osd_item.gr, this->green, &p, opc->osd_item.w/3, dir); buffer=format_distance(transform_distance(pro, &c1, &c2),"",imperial); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; graphics_draw_text(opc->osd_item.gr, this->green, NULL, opc->osd_item.font, buffer, &p, 0x10000, 0); g_free(buffer); } } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_compass_init(struct osd_priv_common *opc, struct navit *nav) { struct color c; struct compass *this = (struct compass *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->green = graphics_gc_new(opc->osd_item.gr); c.r = 0; c.g = 65535; c.b = 0; c.a = 65535; graphics_gc_set_foreground(this->green, &c); graphics_gc_set_linewidth(this->green, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_compass_draw), attr_position_coord_geo, opc)); if (opc->osd_item.command) navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); osd_compass_draw(opc, nav, NULL); } static struct osd_priv * osd_compass_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct compass *this = g_new0(struct compass, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 20; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_compass_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_compass_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_button { int use_overlay; struct callback *draw_cb,*navit_init_cb; struct graphics_image *img; char *src_dir,*src; }; static void osd_button_draw(struct osd_priv_common *opc, struct navit *nav) { struct osd_button *this = (struct osd_button *)opc->data; struct point bp = opc->osd_item.p; if (!opc->osd_item.configured) return; osd_wrap_point(&bp, nav); if(this->img) graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &bp, this->img); } static void osd_button_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_button *this = (struct osd_button *)opc->data; struct graphics *gra = navit_get_graphics(nav); dbg(1, "enter\n"); this->img = graphics_image_new(gra, this->src); if (!this->img) { dbg(1, "failed to load '%s'\n", this->src); return; } if (!opc->osd_item.w) opc->osd_item.w=this->img->width; if (!opc->osd_item.h) opc->osd_item.h=this->img->height; if (this->use_overlay) { struct graphics_image *img; struct point p; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); img=graphics_image_new(opc->osd_item.gr, this->src); p.x=(opc->osd_item.w-this->img->width)/2; p.y=(opc->osd_item.h-this->img->height)/2; osd_std_draw(&opc->osd_item); graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); graphics_image_free(opc->osd_item.gr, img); } else { osd_set_std_config(nav, &opc->osd_item); osd_set_keypress(nav, &opc->osd_item); opc->osd_item.gr=gra; opc->osd_item.graphic_bg=graphics_gc_new(opc->osd_item.gr); graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_button_draw), attr_postdraw, opc, nav)); } navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); osd_button_draw(opc,nav); } static char * osd_button_icon_path(struct osd_button *this_, char *src) { if (!this_->src_dir) return graphics_icon_path(src); return g_strdup_printf("%s%s%s",this_->src_dir, G_DIR_SEPARATOR_S, src); } int osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr) { struct osd_button *this_ = (struct osd_button *)opc->data; if(NULL==attr || NULL==this_) { return 0; } if(attr->type == attr_src) { struct navit *nav; struct graphics *gra; if(this_->src) { g_free(this_->src); } if(attr->u.str) { this_->src = osd_button_icon_path(this_, attr->u.str); } nav = opc->osd_item.navit; gra = navit_get_graphics(nav); this_->img = graphics_image_new(gra, this_->src); if (!this_->img) { dbg(1, "failed to load '%s'\n", this_->src); return 0; } if (!opc->osd_item.w) opc->osd_item.w=this_->img->width; if (!opc->osd_item.h) opc->osd_item.h=this_->img->height; if(navit_get_blocked(nav)&1) return 1; if (this_->use_overlay) { struct graphics_image *img; struct point p; img=graphics_image_new(opc->osd_item.gr, this_->src); p.x=(opc->osd_item.w-this_->img->width)/2; p.y=(opc->osd_item.h-this_->img->height)/2; osd_std_draw(&opc->osd_item); graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); graphics_image_free(opc->osd_item.gr, img); } osd_button_draw(opc,nav); navit_draw(opc->osd_item.navit); return 1; } return 0; } static struct osd_priv * osd_button_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_button *this = g_new0(struct osd_button, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_button_draw); meth->set_attr = set_std_osd_attr; opc->spec_set_attr_func = osd_button_set_attr; attr=attr_search(attrs, NULL, attr_use_overlay); if (attr) this->use_overlay=attr->u.num; osd_set_std_attr(attrs, &opc->osd_item, this->use_overlay ? 1:(1|16)); if (!opc->osd_item.command) { dbg(0, "no command\n"); goto error; } attr = attr_search(attrs, NULL, attr_src_dir); if (attr) this->src_dir=graphics_icon_path(attr->u.str); else this->src_dir=NULL; attr = attr_search(attrs, NULL, attr_src); if (!attr) { dbg(0, "no src\n"); goto error; } this->src = osd_button_icon_path(this, attr->u.str); navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_button_init), attr_graphics_ready, opc)); if(b_commandtable_added == 0) { navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); b_commandtable_added = 1; } return (struct osd_priv *) opc; error: g_free(this); g_free(opc); return NULL; } static void osd_image_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_button *this = (struct osd_button *)opc->data; struct graphics *gra = navit_get_graphics(nav); dbg(1, "enter\n"); this->img = graphics_image_new(gra, this->src); if (!this->img) { dbg(1, "failed to load '%s'\n", this->src); return; } if (!opc->osd_item.w) opc->osd_item.w=this->img->width; if (!opc->osd_item.h) opc->osd_item.h=this->img->height; if (this->use_overlay) { struct graphics_image *img; struct point p; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); img=graphics_image_new(opc->osd_item.gr, this->src); p.x=(opc->osd_item.w-this->img->width)/2; p.y=(opc->osd_item.h-this->img->height)/2; osd_std_draw(&opc->osd_item); graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); graphics_image_free(opc->osd_item.gr, img); } else { opc->osd_item.configured=1; opc->osd_item.gr=gra; opc->osd_item.graphic_bg=graphics_gc_new(opc->osd_item.gr); graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_button_draw), attr_postdraw, opc, nav)); } osd_button_draw(opc,nav); } static struct osd_priv * osd_image_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_button *this = g_new0(struct osd_button, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_button_draw); meth->set_attr = set_std_osd_attr; opc->spec_set_attr_func = osd_button_set_attr; osd_set_std_attr(attrs, &opc->osd_item, 1); attr=attr_search(attrs, NULL, attr_use_overlay); if (attr) this->use_overlay=attr->u.num; attr = attr_search(attrs, NULL, attr_src); if (!attr) { dbg(0, "no src\n"); goto error; } this->src = graphics_icon_path(attr->u.str); navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_image_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; error: g_free(opc); g_free(this); return NULL; } struct nav_next_turn { char *test_text; char *icon_src; int icon_h, icon_w, active; char *last_name; int level; }; static void osd_nav_next_turn_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct nav_next_turn *this = (struct nav_next_turn *)opc->data; struct point p; int do_draw = 0; struct navigation *nav = NULL; struct map *map = NULL; struct map_rect *mr = NULL; struct item *item = NULL; struct graphics_image *gr_image; char *image; char *name = "unknown"; int level = this->level; if (navit) nav = navit_get_navigation(navit); if (nav) map = navigation_get_map(nav); if (map) mr = map_rect_new(map, NULL); if (mr) while ((item = map_rect_get_item(mr)) && (item->type == type_nav_position || item->type == type_nav_none || level-- > 0)); if (item) { name = item_to_name(item->type); dbg(1, "name=%s\n", name); if (this->active != 1 || this->last_name != name) { this->active = 1; this->last_name = name; do_draw = 1; } } else { if (this->active != 0) { this->active = 0; do_draw = 1; } } if (mr) map_rect_destroy(mr); if (do_draw) { osd_std_draw(&opc->osd_item); if (this->active) { image = g_strdup_printf(this->icon_src, name); dbg(1, "image=%s\n", image); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (!gr_image) { dbg(0,"failed to load %s in %dx%d\n",image,this->icon_w,this->icon_h); g_free(image); image = graphics_icon_path("unknown.png"); gr_image = graphics_image_new_scaled(opc-> osd_item.gr, image, this->icon_w, this-> icon_h); } dbg(1, "gr_image=%p\n", gr_image); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg_white, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } static void osd_nav_next_turn_init(struct osd_priv_common *opc, struct navit *nav) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_next_turn_draw), attr_position_coord_geo, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); osd_nav_next_turn_draw(opc, nav, NULL); } static struct osd_priv * osd_nav_next_turn_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct nav_next_turn *this = g_new0(struct nav_next_turn, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 20; opc->osd_item.p.y = -80; opc->osd_item.w = 70; opc->osd_item.navit = nav; opc->osd_item.h = 70; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_nav_next_turn_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->active = -1; this->level = 0; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = graphics_icon_path(array[0]); file_wordexp_destroy(we); } else { this->icon_src = graphics_icon_path("%s_wh.svg"); } attr = attr_search(attrs, NULL, attr_level); if (attr) this->level=attr->u.num; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_next_turn_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct nav_toggle_announcer { int w,h; struct callback *navit_init_cb; char *icon_src; int icon_h, icon_w, active, last_state; }; static void osd_nav_toggle_announcer_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct nav_toggle_announcer *this = (struct nav_toggle_announcer *)opc->data; struct point p; int do_draw = 0; struct graphics_image *gr_image; char *path; char *gui_sound_off = "gui_sound_off"; char *gui_sound_on = "gui_sound"; struct attr attr, speechattr; if (this->last_state == -1) { if (!navit_get_attr(navit, attr_speech, &speechattr, NULL) || !speech_get_attr(speechattr.u.speech, attr_active, &attr, NULL)) attr.u.num = 1; this->active = attr.u.num; } else this->active = !this->active; if(this->active != this->last_state) { this->last_state = this->active; do_draw = 1; } if (do_draw) { graphics_draw_mode(opc->osd_item.gr, draw_mode_begin); p.x = 0; p.y = 0; graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, opc->osd_item.w, opc->osd_item.h); if (this->active) path = g_strdup_printf(this->icon_src, gui_sound_on); else path = g_strdup_printf(this->icon_src, gui_sound_off); gr_image = graphics_image_new_scaled(opc->osd_item.gr, path, this->icon_w, this->icon_h); if (!gr_image) { g_free(path); path = graphics_icon_path("unknown.png"); gr_image = graphics_image_new_scaled(opc->osd_item.gr, path, this->icon_w, this->icon_h); } dbg(1, "gr_image=%p\n", gr_image); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_fg_white, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(path); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } static void osd_nav_toggle_announcer_init(struct osd_priv_common *opc, struct navit *nav) { struct nav_toggle_announcer *this = (struct nav_toggle_announcer *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_toggle_announcer_draw), attr_speech, opc)); navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); osd_nav_toggle_announcer_draw(opc, nav, NULL); } static struct osd_priv * osd_nav_toggle_announcer_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct nav_toggle_announcer *this = g_new0(struct nav_toggle_announcer, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; char *command = "announcer_toggle()"; opc->data = (void*)this; opc->osd_item.w = 48; opc->osd_item.h = 48; opc->osd_item.p.x = -64; opc->osd_item.navit = nav; opc->osd_item.p.y = 76; opc->osd_item.meth.draw = osd_draw_cast(osd_nav_toggle_announcer_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->last_state = -1; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = g_strdup(array[0]); file_wordexp_destroy(we); } else this->icon_src = graphics_icon_path("%s_32.xpm"); opc->osd_item.command = g_strdup(command); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_toggle_announcer_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } enum osd_speed_warner_eAnnounceState {eNoWarn=0,eWarningTold=1}; enum camera_t {CAM_FIXED=1, CAM_TRAFFIC_LAMP, CAM_RED, CAM_SECTION, CAM_MOBILE, CAM_RAIL, CAM_TRAFFIPAX}; char*camera_t_strs[] = {"None","Fix","Traffic lamp","Red detect","Section","Mobile","Rail","Traffipax(non persistent)"}; char*camdir_t_strs[] = {"All dir.","UNI-dir","BI-dir"}; enum cam_dir_t {CAMDIR_ALL=0, CAMDIR_ONE, CAMDIR_TWO}; struct osd_speed_cam_entry { double lon; double lat; enum camera_t cam_type; int speed_limit; enum cam_dir_t cam_dir; int direction; }; struct osd_speed_cam { int width; int flags; struct graphics_gc *white,*orange; struct graphics_gc *red; struct color idle_color; int announce_on; enum osd_speed_warner_eAnnounceState announce_state; char *text; //text of label attribute for this osd }; static double angle_diff(int firstAngle,int secondAngle) { double difference = secondAngle - firstAngle; while (difference < -180) difference += 360; while (difference > 180) difference -= 360; return difference; } static void osd_speed_cam_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct osd_speed_cam *this_ = (struct osd_speed_cam *)opc->data; struct attr position_attr,vehicle_attr,imperial_attr; struct point bbox[4]; struct attr speed_attr; struct vehicle* curr_vehicle = v; struct coord curr_coord; struct coord cam_coord; struct mapset* ms; double dCurrDist = -1; int dir_idx = -1; int dir = -1; int spd = -1; int idx = -1; double speed = -1; int bFound = 0; int dst=2000; int dstsq=dst*dst; struct map_selection sel; struct map_rect *mr; struct mapset_handle *msh; struct map *map; struct item *item; struct attr attr_dir; struct graphics_gc *curr_color; int ret_attr = 0; int imperial=0; if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; if(navit) { navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL); } else { return; } if (vehicle_attr.u.vehicle) { curr_vehicle = vehicle_attr.u.vehicle; } if(0==curr_vehicle) return; if(!(ms=navit_get_mapset(navit))) { return; } ret_attr = vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL); if(0==ret_attr) { return; } transform_from_geo(projection_mg, position_attr.u.coord_geo, &curr_coord); sel.next=NULL; sel.order=18; sel.range.min=type_tec_common; sel.range.max=type_tec_common; sel.u.c_rect.lu.x=curr_coord.x-dst; sel.u.c_rect.lu.y=curr_coord.y+dst; sel.u.c_rect.rl.x=curr_coord.x+dst; sel.u.c_rect.rl.y=curr_coord.y-dst; msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { struct attr attr; if(map_get_attr(map, attr_type, &attr, NULL)) { if( strcmp("csv", attr.u.str) && strcmp("binfile", attr.u.str)) { continue; } } else { continue; } mr=map_rect_new(map, &sel); if (!mr) continue; while ((item=map_rect_get_item(mr))) { struct coord cn; if (item->type == type_tec_common && item_coord_get(item, &cn, 1)) { int dist=transform_distance_sq(&cn, &curr_coord); if (dist < dstsq) { struct attr tec_attr; bFound = 1; dstsq=dist; dCurrDist = sqrt(dist); cam_coord = cn; idx = -1; if(item_attr_get(item,attr_tec_type,&tec_attr)) { idx = tec_attr.u.num; } dir_idx = -1; if(item_attr_get(item,attr_tec_dirtype,&tec_attr)) { dir_idx = tec_attr.u.num; } dir= 0; if(item_attr_get(item,attr_tec_direction,&tec_attr)) { dir = tec_attr.u.num; } spd= 0; if(item_attr_get(item,attr_maxspeed,&tec_attr)) { spd = tec_attr.u.num; } } } } map_rect_destroy(mr); } mapset_close(msh); if(bFound && (idx==-1 || this_->flags & (1<<(idx-1))) ) { dCurrDist = transform_distance(projection_mg, &curr_coord, &cam_coord); ret_attr = vehicle_get_attr(curr_vehicle,attr_position_speed,&speed_attr, NULL); if(0==ret_attr) { graphics_overlay_disable(opc->osd_item.gr,1); return; } if (opc->osd_item.configured) { graphics_overlay_disable(opc->osd_item.gr,0); } speed = *speed_attr.u.numd; if(dCurrDist <= speed*750.0/130.0) { //at speed 130 distance limit is 750m if(this_->announce_state==eNoWarn && this_->announce_on) { this_->announce_state=eWarningTold; //warning told navit_say(navit, _("Look out! Camera!")); } } else { this_->announce_state=eNoWarn; } if(this_->text) { char buffer [256]=""; char buffer2[256]=""; char dir_str[16]; char spd_str[16]; buffer [0] = 0; buffer2[0] = 0; osd_std_draw(&opc->osd_item); str_replace(buffer,this_->text,"${distance}",format_distance(dCurrDist,"",imperial)); str_replace(buffer2,buffer,"${camera_type}",(0<=idx && idx<=CAM_TRAFFIPAX)?camera_t_strs[idx]:""); str_replace(buffer,buffer2,"${camera_dir}",(0<=dir_idx && dir_idx<=CAMDIR_TWO)?camdir_t_strs[dir_idx]:""); sprintf(dir_str,"%d",dir); sprintf(spd_str,"%d",spd); str_replace(buffer2,buffer,"${direction}",dir_str); str_replace(buffer,buffer2,"${speed_limit}",spd_str); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); curr_color = this_->orange; //tolerance is +-20 degrees if( dir_idx==CAMDIR_ONE && dCurrDist <= speed*750.0/130.0 && vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL) && fabs(angle_diff(dir,*attr_dir.u.numd))<=20 ) { curr_color = this_->red; } //tolerance is +-20 degrees in both directions else if( dir_idx==CAMDIR_TWO && dCurrDist <= speed*750.0/130.0 && vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL) && (fabs(angle_diff(dir,*attr_dir.u.numd))<=20 || fabs(angle_diff(dir+180,*attr_dir.u.numd))<=20 )) { curr_color = this_->red; } else if(dCurrDist <= speed*750.0/130.0) { curr_color = this_->red; } draw_multiline_osd_text(buffer,&opc->osd_item, curr_color); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } else { graphics_overlay_disable(opc->osd_item.gr,1); } } static void osd_speed_cam_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_speed_cam *this = (struct osd_speed_cam *)opc->data; struct color red_color={0xffff,0x0000,0x0000,0xffff}; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->red = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->red, &red_color); graphics_gc_set_linewidth(this->red, this->width); this->orange = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->orange, &this->idle_color); graphics_gc_set_linewidth(this->orange, this->width); this->white = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); graphics_gc_set_linewidth(this->white, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_cam_draw), attr_position_coord_geo, opc)); } static struct osd_priv * osd_speed_cam_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct color default_color={0xffff,0xa5a5,0x0000,0xffff}; struct osd_speed_cam *this = g_new0(struct osd_speed_cam, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 120; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_speed_cam_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_idle_color); this->idle_color=attr ? *attr->u.color : default_color; // text idle_color defaults to orange attr = attr_search(attrs, NULL, attr_label); if (attr) { this->text = g_strdup(attr->u.str); } else this->text = NULL; attr = attr_search(attrs, NULL, attr_announce_on); if (attr) { this->announce_on = attr->u.num; } else { this->announce_on = 1; //announce by default } attr = attr_search(attrs, NULL, attr_flags); if (attr) { this->flags = attr->u.num; } else { this->flags = -1; //every cam type is on by default } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_cam_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_speed_warner { struct graphics_gc *red; struct graphics_gc *green; struct graphics_gc *grey; struct graphics_gc *black; struct graphics_gc *white; int width; int active; int d; double speed_exceed_limit_offset; double speed_exceed_limit_percent; int announce_on; enum osd_speed_warner_eAnnounceState announce_state; int bTextOnly; struct graphics_image *img_active,*img_passive,*img_off; char* label_str; }; static void osd_speed_warner_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct osd_speed_warner *this = (struct osd_speed_warner *)opc->data; struct point p,bbox[4]; char text[16]=""; struct tracking *tracking = NULL; struct graphics_gc *osd_color=this->grey; struct graphics_image *img = this->img_off; osd_std_draw(&opc->osd_item); p.x=opc->osd_item.w/2-this->d/4; p.y=opc->osd_item.h/2-this->d/4; p.x=opc->osd_item.w/2; p.y=opc->osd_item.h/2; if (navit) { tracking = navit_get_tracking(navit); } if (tracking) { struct attr maxspeed_attr,speed_attr,imperial_attr; int *flags; double routespeed = -1; double tracking_speed = -1; int osm_data = 0; struct item *item; int imperial=0; item=tracking_get_current_item(tracking); if(navit) { if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; } flags=tracking_get_current_flags(tracking); if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) { routespeed = maxspeed_attr.u.num; osm_data = 1; } if (routespeed == -1) { struct vehicleprofile *prof=navit_get_vehicleprofile(navit); struct roadprofile *rprof=NULL; if (prof && item) rprof=vehicleprofile_get_roadprofile(prof, item->type); if (rprof) { if(rprof->maxspeed!=0) routespeed=rprof->maxspeed; } } tracking_get_attr(tracking, attr_position_speed, &speed_attr, NULL); tracking_speed = *speed_attr.u.numd; if( -1 != tracking_speed && -1 != routespeed ) { char*routespeed_str = format_speed(routespeed,"","value",imperial); g_snprintf(text,16,"%s%s",osm_data ? "" : "~",routespeed_str); g_free(routespeed_str); if( this->speed_exceed_limit_offset+routespeedspeed_exceed_limit_percent)/100.0*routespeedannounce_state==eNoWarn && this->announce_on) { this->announce_state=eWarningTold; //warning told navit_say(navit,_("Please decrease your speed")); } } if( tracking_speed <= routespeed ) { this->announce_state=eNoWarn; //no warning osd_color = this->green; img = this->img_passive; } else { osd_color = this->red; img = this->img_active; } } else { osd_color = this->grey; img = this->img_off; this->announce_state = eNoWarn; } } else { //when tracking is not available display grey osd_color = this->grey; img = this->img_off; this->announce_state = eNoWarn; } if(this->img_active && this->img_passive && this->img_off) { struct point p; p.x=(opc->osd_item.w-img->width)/2; p.y=(opc->osd_item.h-img->height)/2; graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); } else if(0==this->bTextOnly) { graphics_draw_circle(opc->osd_item.gr, osd_color, &p, this->d-this->width*2 ); } graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, text, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y=(opc->osd_item.h+bbox[2].y)/2-bbox[2].y; graphics_draw_text(opc->osd_item.gr, osd_color, NULL, opc->osd_item.font, text, &p, 0x10000, 0); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_speed_warner_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_speed_warner *this = (struct osd_speed_warner *)opc->data; struct color white_color={0xffff,0xffff,0xffff,0x0000}; struct color red_color={0xffff,0,0,0xffff}; struct color green_color={0,0xffff,0,0xffff}; struct color grey_color={0x8888,0x8888,0x8888,0x8888}; struct color black_color={0x1111,0x1111,0x1111,0x9999}; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_warner_draw), attr_position_coord_geo, opc)); if(this->label_str && !strncmp("images:",this->label_str,7)) { char *tok1=NULL, *tok2=NULL, *tok3=NULL; strtok(this->label_str,":"); tok1 = strtok(NULL,":"); if(tok1) { tok2 = strtok(NULL,":"); } if(tok1 && tok2) { tok3 = strtok(NULL,":"); } if(tok1 && tok2 && tok3) { tok1 = graphics_icon_path(tok1); tok2 = graphics_icon_path(tok2); tok3 = graphics_icon_path(tok3); this->img_active = graphics_image_new(opc->osd_item.gr, tok1); this->img_passive = graphics_image_new(opc->osd_item.gr, tok2); this->img_off = graphics_image_new(opc->osd_item.gr, tok3); g_free(tok1); g_free(tok2); g_free(tok3); } } g_free(this->label_str); this->label_str = NULL; this->white=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->white, &white_color); graphics_gc_set_linewidth(this->white, this->d/2-2 /*-this->width*/ ); this->red=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->red, &red_color); graphics_gc_set_linewidth(this->red, this->width); this->green=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->green, &green_color); graphics_gc_set_linewidth(this->green, this->width-2); this->grey=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->grey, &grey_color); graphics_gc_set_linewidth(this->grey, this->width); this->black=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->black, &black_color); graphics_gc_set_linewidth(this->black, this->width); osd_speed_warner_draw(opc, nav, NULL); } static struct osd_priv * osd_speed_warner_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_speed_warner *this=g_new0(struct osd_speed_warner, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x=-80; opc->osd_item.p.y=20; opc->osd_item.w=60; opc->osd_item.navit = nav; opc->osd_item.h=60; this->active=-1; opc->osd_item.meth.draw = osd_draw_cast(osd_speed_warner_draw); meth->set_attr = set_std_osd_attr; attr = attr_search(attrs, NULL, attr_speed_exceed_limit_offset); if (attr) { this->speed_exceed_limit_offset = attr->u.num; } else this->speed_exceed_limit_offset = 15; //by default 15 km/h attr = attr_search(attrs, NULL, attr_speed_exceed_limit_percent); if (attr) { this->speed_exceed_limit_percent = attr->u.num; } else this->speed_exceed_limit_percent = 10; //by default factor of 1.1 this->bTextOnly = 0; //by default display graphics also attr = attr_search(attrs, NULL, attr_label); if (attr) { this->label_str = g_strdup(attr->u.str); if (!strcmp("text_only",attr->u.str)) { this->bTextOnly = 1; } } attr = attr_search(attrs, NULL, attr_announce_on); if (attr) this->announce_on = attr->u.num; else this->announce_on = 1; //announce by default osd_set_std_attr(attrs, &opc->osd_item, 2); this->d=opc->osd_item.w; if (opc->osd_item.h < this->d) this->d=opc->osd_item.h; this->width=this->d/10; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_warner_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_text_item { int static_text; char *text; void *prev; void *next; enum attr_type section; enum attr_type attr_typ; void *root; int offset; char *format; }; struct osd_text { int active; char *text; int align; char *last; struct osd_text_item *items; }; /** * @brief Format a text attribute * * Returns the formatted current value of an attribute as a string * * @param attr Pointer to an attr structure specifying the attribute to be formatted * @param format Pointer to a string specifying how to format the attribute. Allowed format strings depend on the attribute; this member can be NULL. * @returns Pointer to a string containing the formatted value */ static char * osd_text_format_attr(struct attr *attr, char *format, int imperial) { struct tm tm, text_tm, text_tm0; time_t textt; int days=0; char buffer[1024]; switch (attr->type) { case attr_position_speed: return format_speed(*attr->u.numd,"",format,imperial); case attr_position_height: case attr_position_direction: return format_float_0(*attr->u.numd); case attr_position_magnetic_direction: return g_strdup_printf("%ld",attr->u.num); case attr_position_coord_geo: if ((!format) || (!strcmp(format,"pos_degminsec"))) { coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"pos_degmin")) { coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"pos_deg")) { coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lat_degminsec")) { coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lat_degmin")) { coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lat_deg")) { coord_format(attr->u.coord_geo->lat,360,DEGREES_DECIMAL,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lng_degminsec")) { coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lng_degmin")) { coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lng_deg")) { coord_format(360,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); return g_strdup(buffer); } else { // fall back to pos_degminsec coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } case attr_destination_time: if (!format || (strcmp(format,"arrival") && strcmp(format,"remaining"))) break; textt = time(NULL); tm = *localtime(&textt); if (!strcmp(format,"remaining")) { textt-=tm.tm_hour*3600+tm.tm_min*60+tm.tm_sec; tm = *localtime(&textt); } textt += attr->u.num / 10; text_tm = *localtime(&textt); if (tm.tm_year != text_tm.tm_year || tm.tm_mon != text_tm.tm_mon || tm.tm_mday != text_tm.tm_mday) { text_tm0 = text_tm; text_tm0.tm_sec = 0; text_tm0.tm_min = 0; text_tm0.tm_hour = 0; tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; days = (mktime(&text_tm0) - mktime(&tm) + 43200) / 86400; } return format_time(&text_tm, days); case attr_length: case attr_destination_length: if (!format) break; if (!strcmp(format,"named")) return format_distance(attr->u.num,"",imperial); if (!strcmp(format,"value") || !strcmp(format,"unit")) { char *ret,*tmp=format_distance(attr->u.num," ",imperial); char *pos=strchr(tmp,' '); if (! pos) return tmp; *pos++='\0'; if (!strcmp(format,"value")) return tmp; ret=g_strdup(pos); g_free(tmp); return ret; } case attr_position_time_iso8601: if ((!format) || (!strcmp(format,"iso8601"))) { break; } else { if (strstr(format, "local;") == format) { textt = iso8601_to_secs(attr->u.str); memcpy ((void *) &tm, (void *) localtime(&textt), sizeof(tm)); strftime(buffer, sizeof(buffer), (char *)(format + 6), &tm); } else if ((sscanf(format, "%*c%2d:%2d;", &(text_tm.tm_hour), &(text_tm.tm_min)) == 2) && (strchr("+-", format[0]))) { if (strchr("-", format[0])) { textt = iso8601_to_secs(attr->u.str) - text_tm.tm_hour * 3600 - text_tm.tm_min * 60; } else { textt = iso8601_to_secs(attr->u.str) + text_tm.tm_hour * 3600 + text_tm.tm_min * 60; } memcpy ((void *) &tm, (void *) gmtime(&textt), sizeof(tm)); strftime(buffer, sizeof(buffer), &format[strcspn(format, ";") + 1], &tm); } else { sscanf(attr->u.str, "%4d-%2d-%2dT%2d:%2d:%2d", &(tm.tm_year), &(tm.tm_mon), &(tm.tm_mday), &(tm.tm_hour), &(tm.tm_min), &(tm.tm_sec)); // the tm structure definition is kinda weird and needs some extra voodoo tm.tm_year-=1900; tm.tm_mon--; // get weekday and day of the year mktime(&tm); strftime(buffer, sizeof(buffer), format, &tm); } return g_strdup(buffer); } default: break; } return attr_to_text(attr, NULL, 1); } /** * Parse a string of the form key.subkey or key[index].subkey into its components, where subkey can itself have its own index and further subkeys * * @param in String to parse (the part before subkey will be modified by the function); upon returning this pointer will point to a string containing key * @param index Pointer to an address that will receive a pointer to a string containing index or a null pointer if key does not have an index * @returns If the function succeeds, a pointer to a string containing subkey, i.e. everything following the first period, or a pointer to an empty string if there is nothing left to parse. If the function fails(index with missing closed bracket or passing a null pointer as index argument when an index was encountered), the return value is NULL */ static char * osd_text_split(char *in, char **index) { char *pos; int len; if (index) *index=NULL; len=strcspn(in,"[."); in+=len; switch (in[0]) { case '\0': return in; case '.': *in++='\0'; return in; case '[': if (!index) return NULL; *in++='\0'; *index=in; pos=strchr(in,']'); if (pos) { *pos++='\0'; if (*pos == '.') { *pos++='\0'; } return pos; } return NULL; } return NULL; } static void osd_text_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct osd_text *this = (struct osd_text *)opc->data; struct point p, p2[4]; char *str,*last,*next,*value,*absbegin; int do_draw = 0; struct attr attr, vehicle_attr, maxspeed_attr, imperial_attr; struct navigation *nav = NULL; struct tracking *tracking = NULL; struct map *nav_map = NULL; struct map_rect *nav_mr = NULL; struct item *item; struct osd_text_item *oti; int offset,lines; int height=opc->osd_item.font_size*13/256; int yspacing=height/2; int xspacing=height/4; int imperial=0; if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; vehicle_attr.u.vehicle=NULL; oti=this->items; str=NULL; while (oti) { item=NULL; value=NULL; if (oti->static_text) { value=g_strdup(oti->text); } else if (oti->section == attr_navigation) { if (navit && !nav) nav = navit_get_navigation(navit); if (nav && !nav_map) nav_map = navigation_get_map(nav); if (nav_map ) nav_mr = map_rect_new(nav_map, NULL); if (nav_mr) item = map_rect_get_item(nav_mr); offset=oti->offset; while (item) { if (item->type == type_nav_none) item=map_rect_get_item(nav_mr); else if (!offset) break; else { offset--; item=map_rect_get_item(nav_mr); } } if (item) { dbg(1,"name %s\n", item_to_name(item->type)); dbg(1,"type %s\n", attr_to_name(oti->attr_typ)); if (item_attr_get(item, oti->attr_typ, &attr)) value=osd_text_format_attr(&attr, oti->format, imperial); } if (nav_mr) map_rect_destroy(nav_mr); } else if (oti->section == attr_vehicle) { if (navit && !vehicle_attr.u.vehicle) { navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL); } if (vehicle_attr.u.vehicle) { if (vehicle_get_attr(vehicle_attr.u.vehicle, oti->attr_typ, &attr, NULL)) { value=osd_text_format_attr(&attr, oti->format, imperial); } } } else if (oti->section == attr_tracking) { if (navit) { tracking = navit_get_tracking(navit); } if (tracking) { item=tracking_get_current_item(tracking); if (item && (oti->attr_typ == attr_speed)) { double routespeed = -1; int *flags=tracking_get_current_flags(tracking); if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) { routespeed = maxspeed_attr.u.num; } if (routespeed == -1) { struct vehicleprofile *prof=navit_get_vehicleprofile(navit); struct roadprofile *rprof=NULL; if (prof) rprof=vehicleprofile_get_roadprofile(prof, item->type); if (rprof) { routespeed=rprof->speed; } } value = format_speed(routespeed,"", oti->format, imperial); } else if (item) { if (tracking_get_attr(tracking, oti->attr_typ, &attr, NULL)) value=osd_text_format_attr(&attr, oti->format, imperial); } } } else if (oti->section == attr_navit) { if (oti->attr_typ == attr_message) { struct message *msg; int len,offset; char *tmp; msg = navit_get_messages(navit); len = 0; while (msg) { len+= strlen(msg->text) + 2; msg = msg->next; } value = g_malloc(len +1); msg = navit_get_messages(navit); offset = 0; while (msg) { tmp = g_stpcpy((value+offset), msg->text); g_stpcpy(tmp, "\\n"); offset += strlen(msg->text) + 2; msg = msg->next; } value[len] = '\0'; } } next=g_strdup_printf("%s%s",str ? str:"",value ? value:" "); if (value) g_free(value); if (str) g_free(str); str=next; oti=oti->next; } if ( this->last && str && !strcmp(this->last, str) ) { do_draw=0; } else { do_draw=1; if (this->last) g_free(this->last); this->last = g_strdup(str); } absbegin=str; if (do_draw) { //osd_std_draw(&opc->osd_item); } if (do_draw && str) { osd_std_draw(&opc->osd_item); lines=0; next=str; last=str; while ((next=strstr(next, "\\n"))) { last = next; lines++; next++; } while (*last) { if (! g_ascii_isspace(*last)) { lines++; break; } last++; } dbg(1,"this->align=%d\n", this->align); switch (this->align & 51) { case 1: p.y=0; break; case 2: p.y=(opc->osd_item.h-lines*(height+yspacing)-yspacing); break; case 16: // Grow from top to bottom p.y = 0; if (lines != 0) { opc->osd_item.h = (lines-1) * (height+yspacing) + height; } else { opc->osd_item.h = 0; } if (do_draw) { osd_std_resize(&opc->osd_item); } default: p.y=(opc->osd_item.h-lines*(height+yspacing)-yspacing)/2; } while (str) { next=strstr(str, "\\n"); if (next) { *next='\0'; next+=2; } graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, str, 0x10000, 0x0, p2, 0); switch (this->align & 12) { case 4: p.x=xspacing; break; case 8: p.x=opc->osd_item.w-(p2[2].x-p2[0].x)-xspacing; break; default: p.x = ((p2[0].x - p2[2].x) / 2) + (opc->osd_item.w / 2); } p.y += height+yspacing; graphics_draw_text(opc->osd_item.gr, opc->osd_item.graphic_fg_text, NULL, opc->osd_item.font, str, &p, 0x10000, 0); str=next; } } if(do_draw) { graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } g_free(absbegin); } /** * @brief Create a new osd_text_item and insert it into a linked list * * @param parent Pointer to the preceding osd_text_item structure in the list. If NULL, the new osd_text_item becomes the root element of a new list. * @returns A pointer to the new osd_text_item element. */ static struct osd_text_item * oti_new(struct osd_text_item * parent) { struct osd_text_item *this; this=g_new0(struct osd_text_item, 1); this->prev=parent; if(!parent) { this->root=this; } else { parent->next=this; this->root=parent->root; } return this; } /** * @brief Prepare a text type OSD element * * Parses the label string (as specified in the XML file) for a text type OSD element into attributes and static text. * * @param this Pointer to an osd_text structure representing the OSD element. The items member of this structure will receive a pointer to a list of osd_text_item structures. * @param nav Pointer to a navit structure * @returns nothing */ static void osd_text_prepare(struct osd_priv_common *opc, struct navit *nav) { struct osd_text *this = (struct osd_text *)opc->data; char *absbegin,*str,*start,*end,*key,*subkey,*index; struct osd_text_item *oti; oti=NULL; str=g_strdup(this->text); absbegin=str; while ((start=strstr(str, "${"))) { *start='\0'; start+=2; // find plain text before if (start!=str) { oti = oti_new(oti); oti->static_text=1; oti->text=g_strdup(str); } end=strstr(start,"}"); if (! end) break; *end++='\0'; key=start; subkey=osd_text_split(key,NULL); oti = oti_new(oti); oti->section=attr_from_name(key); if (( oti->section == attr_navigation || oti->section == attr_tracking) && subkey) { key=osd_text_split(subkey,&index); if (index) oti->offset=atoi(index); subkey=osd_text_split(key,&index); if (!strcmp(key,"route_speed")) { oti->attr_typ=attr_speed; } else { oti->attr_typ=attr_from_name(key); } oti->format = g_strdup(index); } else if ((oti->section == attr_vehicle || oti->section == attr_navit) && subkey) { key=osd_text_split(subkey,&index); if (!strcmp(subkey,"messages")) { oti->attr_typ=attr_message; } else { oti->attr_typ=attr_from_name(subkey); } oti->format = g_strdup(index); } switch(oti->attr_typ) { default: navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_text_draw), attr_position_coord_geo, opc)); break; } str=(end); } if(*str!='\0'){ oti = oti_new(oti); oti->static_text=1; oti->text=g_strdup(str); } if (oti) this->items=oti->root; else this->items=NULL; g_free(absbegin); } static void osd_text_init(struct osd_priv_common *opc, struct navit *nav) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); osd_text_prepare(opc,nav); osd_text_draw(opc, nav, NULL); } static int osd_text_set_attr(struct osd_priv_common *opc, struct attr* attr) { struct osd_text *this_ = (struct osd_text *)opc->data; if(NULL==attr || NULL==this_) { return 0; } if(attr->type == attr_label) { struct navit *nav=opc->osd_item.navit; if(this_->text) g_free(this_->text); if(attr->u.str) this_->text = g_strdup(attr->u.str); else this_->text=g_strdup(""); osd_text_prepare(opc,nav); if(navit_get_blocked(nav)&1) return 1; osd_text_draw(opc,nav,NULL); navit_draw(opc->osd_item.navit); return 1; } return 0; } static struct osd_priv * osd_text_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_text *this = g_new0(struct osd_text, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = -80; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 20; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_text_draw); meth->set_attr = set_std_osd_attr; opc->spec_set_attr_func = osd_text_set_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); this->active = -1; this->last = NULL; attr = attr_search(attrs, NULL, attr_label); if (attr) this->text = g_strdup(attr->u.str); else this->text = NULL; attr = attr_search(attrs, NULL, attr_align); if (attr) this->align=attr->u.num; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_text_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct gps_status { char *icon_src; int icon_h, icon_w, active; int strength; }; static void osd_gps_status_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct gps_status *this = (struct gps_status *)opc->data; struct point p; int do_draw = 0; struct graphics_image *gr_image; char *image; struct attr attr, vehicle_attr; int strength=-1; if (navit && navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL)) { if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_fix_type, &attr, NULL)) { switch(attr.u.num) { case 1: case 2: strength=2; if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_sats_used, &attr, NULL)) { dbg(1,"num=%ld\n", attr.u.num); if (attr.u.num >= 3) strength=attr.u.num-1; if (strength > 5) strength=5; if (strength > 3) { if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_hdop, &attr, NULL)) { if (*attr.u.numd > 2.0 && strength > 4) strength=4; if (*attr.u.numd > 4.0 && strength > 3) strength=3; } } } break; default: strength=1; } } } if (this->strength != strength) { this->strength=strength; do_draw=1; } if (do_draw) { osd_std_draw(&opc->osd_item); if (this->active) { image = g_strdup_printf(this->icon_src, strength); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg_white, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } static void osd_gps_status_init(struct osd_priv_common *opc, struct navit *nav) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_draw), attr_position_coord_geo, opc)); osd_gps_status_draw(opc, nav, NULL); } static struct osd_priv * osd_gps_status_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct gps_status *this = g_new0(struct gps_status, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 20; opc->osd_item.p.y = -80; opc->osd_item.w = 60; opc->osd_item.navit = nav; opc->osd_item.h = 40; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_gps_status_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->active = -1; this->strength = -2; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = g_strdup(array[0]); file_wordexp_destroy(we); } else this->icon_src = graphics_icon_path("gui_strength_%d_32_32.png"); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct volume { char *icon_src; int icon_h, icon_w, active; int strength; struct callback *click_cb; }; static void osd_volume_draw(struct osd_priv_common *opc, struct navit *navit) { struct volume *this = (struct volume *)opc->data; struct point p; struct graphics_image *gr_image; char *image; osd_std_draw(&opc->osd_item); if (this->active) { image = g_strdup_printf(this->icon_src, this->strength); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg_white, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_volume_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) { struct volume *this = (struct volume *)opc->data; struct point bp = opc->osd_item.p; osd_wrap_point(&bp, nav); if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h) && !opc->osd_item.pressed) return; navit_ignore_button(nav); if (pressed) { if (p->y - bp.y < opc->osd_item.h/2) this->strength++; else this->strength--; if (this->strength < 0) this->strength=0; if (this->strength > 5) this->strength=5; osd_volume_draw(opc, nav); } } static void osd_volume_init(struct osd_priv_common *opc, struct navit *nav) { struct volume *this = (struct volume *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_volume_click), attr_button, opc)); osd_volume_draw(opc, nav); } static struct osd_priv * osd_volume_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct volume *this = g_new0(struct volume, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 20; opc->osd_item.p.y = -80; opc->osd_item.w = 60; opc->osd_item.navit = nav; opc->osd_item.h = 40; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_volume_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->active = -1; this->strength = -1; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = g_strdup(array[0]); file_wordexp_destroy(we); } else this->icon_src = graphics_icon_path("gui_strength_%d_32_32.png"); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_volume_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_scale { int use_overlay; struct callback *draw_cb,*navit_init_cb; struct graphics_gc *black; }; static int round_to_nice_value(double value) { double nearest_power_of10,mantissa; nearest_power_of10=pow(10,floor(log10(value))); mantissa=value/nearest_power_of10; if (mantissa >= 5) mantissa=5; else if (mantissa >= 2) mantissa=2; else mantissa=1; return mantissa*nearest_power_of10; } static void osd_scale_draw(struct osd_priv_common *opc, struct navit *nav) { struct osd_scale *this = (struct osd_scale *)opc->data; struct point item_pos,scale_line_start,scale_line_end; struct point p[10],bbox[4]; struct attr transformation,imperial_attr; int scale_x_offset,scale_length_on_map,scale_length_pixels; double distance_on_map; char *text; struct osd_item scale_item=opc->osd_item; int width_reduced=scale_item.w*9/10; int imperial=0; if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; if (!navit_get_attr(nav, attr_transformation, &transformation, NULL)) return; if (this->use_overlay) { graphics_draw_mode(scale_item.gr, draw_mode_begin); item_pos.x=0; item_pos.y=0; graphics_draw_rectangle(scale_item.gr, scale_item.graphic_bg, &item_pos, scale_item.w, scale_item.h); } else { item_pos=scale_item.p; osd_wrap_point(&item_pos, nav); } scale_line_start=item_pos; scale_line_start.y+=scale_item.h/2; scale_line_start.x+=(scale_item.w-width_reduced)/2; scale_line_end=scale_line_start; scale_line_end.x+=width_reduced; distance_on_map=transform_pixels_to_map_distance(transformation.u.transformation, width_reduced); scale_length_on_map=round_to_nice_value(distance_on_map); scale_length_pixels=scale_length_on_map/distance_on_map*width_reduced; scale_x_offset=(scale_item.w-scale_length_pixels) / 2; p[0]=scale_line_start; p[1]=scale_line_end; p[0].x+=scale_x_offset; p[1].x-=scale_x_offset; p[2]=p[0]; p[3]=p[0]; p[2].y-=scale_item.h/10; p[3].y+=scale_item.h/10; p[4]=p[1]; p[5]=p[1]; p[4].y-=scale_item.h/10; p[5].y+=scale_item.h/10; p[6]=p[2]; p[6].x-=2; p[6].y-=2; p[7]=p[0]; p[7].y-=2; p[8]=p[4]; p[8].x-=2; p[8].y-=2; graphics_draw_rectangle(scale_item.gr, scale_item.graphic_fg_white, p+6, 4,scale_item.h/5+4); graphics_draw_rectangle(scale_item.gr, scale_item.graphic_fg_white, p+7, p[1].x-p[0].x, 4); graphics_draw_rectangle(scale_item.gr, scale_item.graphic_fg_white, p+8, 4,scale_item.h/5+4); graphics_draw_lines(scale_item.gr, this->black, p, 2); graphics_draw_lines(scale_item.gr, this->black, p+2, 2); graphics_draw_lines(scale_item.gr, this->black, p+4, 2); text=format_distance(scale_length_on_map, "", imperial); graphics_get_text_bbox(scale_item.gr, scale_item.font, text, 0x10000, 0, bbox, 0); p[0].x=(scale_item.w-bbox[2].x)/2+item_pos.x; p[0].y=item_pos.y+scale_item.h-scale_item.h/10; graphics_draw_text(scale_item.gr, this->black, scale_item.graphic_fg_white, scale_item.font, text, &p[0], 0x10000, 0); g_free(text); if (this->use_overlay) graphics_draw_mode(scale_item.gr, draw_mode_end); } static void osd_scale_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_scale *this = (struct osd_scale *)opc->data; struct color color_white={COLOR_WHITE_}; struct color color_black={COLOR_BLACK_}; struct graphics *gra = navit_get_graphics(nav); dbg(1, "enter\n"); if (this->use_overlay) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); } else { opc->osd_item.configured=1; opc->osd_item.gr=gra; opc->osd_item.font = graphics_font_new(opc->osd_item.gr, opc->osd_item.font_size, 1); opc->osd_item.graphic_fg_white=graphics_gc_new(opc->osd_item.gr); opc->osd_item.color_white=color_white; graphics_gc_set_foreground(opc->osd_item.graphic_fg_white, &opc->osd_item.color_white); } this->black=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->black, &color_black); graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_scale_draw), attr_postdraw, opc, nav)); if (navit_get_ready(nav) == 3) osd_scale_draw(opc, nav); } static struct osd_priv * osd_scale_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_scale *this = g_new0(struct osd_scale, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_scale_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 3); attr=attr_search(attrs, NULL, attr_use_overlay); if (attr) this->use_overlay=attr->u.num; navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_scale_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct auxmap { struct displaylist *displaylist; struct transformation *ntrans; struct transformation *trans; struct layout *layout; struct callback *postdraw_cb; struct graphics_gc *red; struct navit *nav; }; static void osd_auxmap_draw(struct osd_priv_common *opc) { struct auxmap *this = (struct auxmap *)opc->data; int d=10; struct point p; struct attr mapset; if (!opc->osd_item.configured) return; if (!navit_get_attr(this->nav, attr_mapset, &mapset, NULL) || !mapset.u.mapset) return; p.x=opc->osd_item.w/2; p.y=opc->osd_item.h/2; transform_set_center(this->trans, transform_get_center(this->ntrans)); transform_set_scale(this->trans, 64); transform_set_yaw(this->trans, transform_get_yaw(this->ntrans)); transform_setup_source_rect(this->trans); transform_set_projection(this->trans, transform_get_projection(this->ntrans)); #if 0 graphics_displaylist_draw(opc->osd_item.gr, this->displaylist, this->trans, this->layout, 4); #endif graphics_draw(opc->osd_item.gr, this->displaylist, mapset.u.mapset, this->trans, this->layout, 0, NULL, 1); graphics_draw_circle(opc->osd_item.gr, this->red, &p, d); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_auxmap_init(struct osd_priv_common *opc, struct navit *nav) { struct auxmap *this = (struct auxmap *)opc->data; struct graphics *gra; struct attr attr; struct map_selection sel; struct pcoord center={ projection_mg, 0, 0}; struct color red={0xffff,0x0,0x0,0xffff}; this->nav=nav; if (! navit_get_attr(nav, attr_graphics, &attr, NULL)) return; gra=attr.u.graphics; graphics_add_callback(gra, callback_new_attr_1(callback_cast(osd_auxmap_draw), attr_postdraw, opc)); if (! navit_get_attr(nav, attr_transformation, &attr, NULL)) return; this->ntrans=attr.u.transformation; if (! navit_get_attr(nav, attr_displaylist, &attr, NULL)) return; this->displaylist=attr.u.displaylist; if (! navit_get_attr(nav, attr_layout, &attr, NULL)) return; this->layout=attr.u.layout; osd_set_std_graphic(nav, &opc->osd_item, NULL); graphics_init(opc->osd_item.gr); this->red=graphics_gc_new(gra); graphics_gc_set_foreground(this->red,&red); graphics_gc_set_linewidth(this->red,3); memset(&sel, 0, sizeof(sel)); sel.u.p_rect.rl.x=opc->osd_item.w; sel.u.p_rect.rl.y=opc->osd_item.h; this->trans=transform_new(¢er, 16, 0); transform_set_screen_selection(this->trans, &sel); graphics_set_rect(opc->osd_item.gr, &sel.u.p_rect); #if 0 osd_auxmap_draw(opc, nav); #endif } static struct osd_priv * osd_auxmap_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct auxmap *this = g_new0(struct auxmap, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); opc->data = (void*)this; opc->osd_item.p.x = 20; opc->osd_item.p.y = -80; opc->osd_item.w = 60; opc->osd_item.h = 40; opc->osd_item.font_size = 200; meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_auxmap_init), attr_navit, opc)); return (struct osd_priv *) opc; } void plugin_init(void) { plugin_register_osd_type("compass", osd_compass_new); plugin_register_osd_type("navigation_next_turn", osd_nav_next_turn_new); plugin_register_osd_type("button", osd_button_new); plugin_register_osd_type("toggle_announcer", osd_nav_toggle_announcer_new); plugin_register_osd_type("speed_warner", osd_speed_warner_new); plugin_register_osd_type("speed_cam", osd_speed_cam_new); plugin_register_osd_type("text", osd_text_new); plugin_register_osd_type("gps_status", osd_gps_status_new); plugin_register_osd_type("volume", osd_volume_new); plugin_register_osd_type("scale", osd_scale_new); plugin_register_osd_type("image", osd_image_new); plugin_register_osd_type("stopwatch", osd_stopwatch_new); plugin_register_osd_type("odometer", osd_odometer_new); plugin_register_osd_type("auxmap", osd_auxmap_new); plugin_register_osd_type("cmd_interface", osd_cmd_interface_new); plugin_register_osd_type("route_guard", osd_route_guard_new); } navit-0.5.0~svn5643+dfsg.1/navit/param.c000066400000000000000000000035501221777731700175700ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "param.h" void param_add_string(const char *name, const char *value, struct param_list **param, int *count) { char *param_name; char *param_value; if (*count > 0) { param_name=malloc(strlen(value)+strlen(name)+2); param_value=param_name+strlen(name)+1; strcpy(param_name, name); strcpy(param_value, value); (*param)->name=param_name; (*param)->value=param_value; (*count)--; (*param)++; } } void param_add_dec(const char *name, unsigned long value, struct param_list **param, int *count) { char buffer[1024]; sprintf(buffer, "%ld", value); param_add_string(name, buffer, param, count); } void param_add_hex(const char *name, unsigned long value, struct param_list **param, int *count) { char buffer[1024]; sprintf(buffer, "0x%lx", value); param_add_string(name, buffer, param, count); } void param_add_hex_sig(const char *name, long value, struct param_list **param, int *count) { char buffer[1024]; if (value < 0) sprintf(buffer, "-0x%lx", -value); else sprintf(buffer, "0x%lx", value); param_add_string(name, buffer, param, count); } navit-0.5.0~svn5643+dfsg.1/navit/param.h000066400000000000000000000023731221777731700175770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PARAM_H #define NAVIT_PARAM_H struct param_list { const char *name; const char *value; }; void param_add_string(const char *name, const char *value, struct param_list **param, int *count); void param_add_dec(const char *name, unsigned long value, struct param_list **param, int *count); void param_add_hex(const char *name, unsigned long value, struct param_list **param, int *count); void param_add_hex_sig(const char *name, long value, struct param_list **param, int *count); #endif navit-0.5.0~svn5643+dfsg.1/navit/phrase.c000066400000000000000000000025201221777731700177460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "coord.h" #include "item.h" #include "route.h" #include "speech.h" #include "phrase.h" void phrase_route_calc(void *speech) { #if 0 if (! speech) return; speech_say(speech,"Die Route wird berechnet\n"); #endif } void phrase_route_calculated(void *speech, void *route) { #if 0 struct tm *eta; #endif if (! speech) return; #if 0 /* FIXME */ eta=route_get_eta(route); speech_sayf(speech,"Die Route wurde berechnet, geschätzte Ankunftszeit %d Uhr %d Entfernung %4.0f Kilometer", eta->tm_hour,eta->tm_min,route_get_len(route)/1000); #endif } navit-0.5.0~svn5643+dfsg.1/navit/phrase.h000066400000000000000000000016311221777731700177550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PHRASE_H #define NAVIT_PHRASE_H void phrase_route_calc(void *speech); void phrase_route_calculated(void *speech, void *route); #endif navit-0.5.0~svn5643+dfsg.1/navit/plugin.c000066400000000000000000000206621221777731700177710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "config.h" #ifdef USE_PLUGINS #ifdef HAVE_GMODULE #include #else #ifdef HAVE_API_WIN32_BASE #include #else #include #endif #endif #endif #include "plugin.h" #include "file.h" #define PLUGIN_C #include "plugin.h" #include "item.h" #include "debug.h" #ifdef USE_PLUGINS #ifndef HAVE_GMODULE typedef void * GModule; #define G_MODULE_BIND_LOCAL 1 #define G_MODULE_BIND_LAZY 2 static int g_module_supported(void) { return 1; } #ifdef HAVE_API_WIN32_BASE static DWORD last_error; static char errormsg[64]; static void * g_module_open(char *name, int flags) { HINSTANCE handle; int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, 0, 0); wchar_t filename[len]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, filename, len) ; handle = LoadLibraryW (filename); if (!handle) last_error=GetLastError(); return handle; } static char * g_module_error(void) { sprintf(errormsg,"dll error %d",(int)last_error); return errormsg; } static int g_module_symbol(GModule *handle, char *symbol, gpointer *addr) { #ifdef HAVE_API_WIN32_CE int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, 0, 0); wchar_t wsymbol[len+1]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, wsymbol, len) ; *addr=GetProcAddress ((HANDLE)handle, wsymbol); #else *addr=GetProcAddress ((HANDLE)handle, symbol); #endif if (*addr) return 1; last_error=GetLastError(); return 0; } static void g_module_close(GModule *handle) { FreeLibrary((HANDLE)handle); } #else static void * g_module_open(char *name, int flags) { return dlopen(name, (flags & G_MODULE_BIND_LAZY ? RTLD_LAZY : RTLD_NOW) | (flags & G_MODULE_BIND_LOCAL ? RTLD_LOCAL : RTLD_GLOBAL)); } static char * g_module_error(void) { return dlerror(); } static int g_module_symbol(GModule *handle, char *symbol, gpointer *addr) { *addr=dlsym(handle, symbol); return (*addr != NULL); } static void g_module_close(GModule *handle) { dlclose(handle); } #endif #endif #endif struct plugin { int active; int lazy; int ondemand; char *name; #ifdef USE_PLUGINS GModule *mod; #endif void (*init)(void); }; struct plugins { GHashTable *hash; GList *list; } *pls; static struct plugin * plugin_new_from_path(char *plugin) { #ifdef USE_PLUGINS struct plugin *ret; if (! g_module_supported()) { return NULL; } ret=g_new0(struct plugin, 1); ret->name=g_strdup(plugin); return ret; #else return NULL; #endif } int plugin_load(struct plugin *pl) { #ifdef USE_PLUGINS gpointer init; GModule *mod; if (pl->mod) { dbg(0,"can't load '%s', already loaded\n", pl->name); return 0; } mod=g_module_open(pl->name, G_MODULE_BIND_LOCAL | (pl->lazy ? G_MODULE_BIND_LAZY : 0)); if (! mod) { dbg(0,"can't load '%s', Error '%s'\n", pl->name, g_module_error()); return 0; } if (!g_module_symbol(mod, "plugin_init", &init)) { dbg(0,"can't load '%s', plugin_init not found\n", pl->name); g_module_close(mod); return 0; } else { dbg(1, "loaded module %s\n", pl->name); pl->mod=mod; pl->init=init; } return 1; #else return 0; #endif } char * plugin_get_name(struct plugin *pl) { return pl->name; } int plugin_get_active(struct plugin *pl) { return pl->active; } void plugin_set_active(struct plugin *pl, int active) { pl->active=active; } void plugin_set_lazy(struct plugin *pl, int lazy) { pl->lazy=lazy; } #ifdef USE_PLUGINS static int plugin_get_ondemand(struct plugin *pl) { return pl->ondemand; } #endif static void plugin_set_ondemand(struct plugin *pl, int ondemand) { pl->ondemand=ondemand; } void plugin_call_init(struct plugin *pl) { pl->init(); } void plugin_unload(struct plugin *pl) { #ifdef USE_PLUGINS g_module_close(pl->mod); pl->mod=NULL; #endif } void plugin_destroy(struct plugin *pl) { g_free(pl); } struct plugins * plugins_new(void) { struct plugins *ret=g_new0(struct plugins, 1); ret->hash=g_hash_table_new(g_str_hash, g_str_equal); pls=ret; return ret; } struct plugin * plugin_new(struct attr *parent, struct attr **attrs) { #ifdef USE_PLUGINS struct attr *path_attr, *attr; struct file_wordexp *we; int active=1; // default active int lazy=0, ondemand=0; int i, count; char **array; char *name; struct plugin *pl=NULL; struct plugins *pls=NULL; if (parent) pls=parent->u.plugins; if (! (path_attr=attr_search(attrs, NULL, attr_path))) { dbg(0,"missing path\n"); return NULL; } if ( (attr=attr_search(attrs, NULL, attr_active))) { active=attr->u.num; } if ( (attr=attr_search(attrs, NULL, attr_lazy))) { lazy=attr->u.num; } if ( (attr=attr_search(attrs, NULL, attr_ondemand))) { ondemand=attr->u.num; } dbg(1, "path=\"%s\", active=%d, lazy=%d, ondemand=%d\n",path_attr->u.str, active, lazy, ondemand); we=file_wordexp_new(path_attr->u.str); count=file_wordexp_get_count(we); array=file_wordexp_get_array(we); dbg(2,"expanded to %d words\n",count); if (count != 1 || file_exists(array[0])) { for (i = 0 ; i < count ; i++) { name=array[i]; dbg(2,"found plugin module file [%d]: '%s'\n", i, name); if (! (pls && (pl=g_hash_table_lookup(pls->hash, name)))) { pl=plugin_new_from_path(name); if (! pl) { dbg(0,"failed to create plugin from file '%s'\n", name); continue; } if (pls) { g_hash_table_insert(pls->hash, plugin_get_name(pl), pl); pls->list=g_list_append(pls->list, pl); } } else { if (pls) { pls->list=g_list_remove(pls->list, pl); pls->list=g_list_append(pls->list, pl); } } plugin_set_active(pl, active); plugin_set_lazy(pl, lazy); plugin_set_ondemand(pl, ondemand); if (!pls && active) { if (!plugin_load(pl)) plugin_set_active(pl, 0); else plugin_call_init(pl); } } } file_wordexp_destroy(we); return pl; #else return 0; #endif } void plugins_init(struct plugins *pls) { #ifdef USE_PLUGINS struct plugin *pl; GList *l; l=pls->list; if (l){ while (l) { pl=l->data; if (! plugin_get_ondemand(pl)) { if (plugin_get_active(pl)) if (!plugin_load(pl)) plugin_set_active(pl, 0); if (plugin_get_active(pl)) plugin_call_init(pl); } l=g_list_next(l); } } else { dbg(0, "Warning: No plugins found. Is Navit installed correctly?\n"); } #endif } void plugins_destroy(struct plugins *pls) { GList *l; struct plugin *pl; l=pls->list; while (l) { pl=l->data; plugin_unload(pl); plugin_destroy(pl); } g_list_free(pls->list); g_hash_table_destroy(pls->hash); g_free(pls); } void * plugin_get_type(enum plugin_type type, const char *type_name, const char *name) { GList *l,*lpls; struct name_val *nv; struct plugin *pl; char *mod_name, *filename=NULL, *corename=NULL; dbg(1, "type=\"%s\", name=\"%s\"\n", type_name, name); l=plugin_types[type]; while (l) { nv=l->data; if (!g_ascii_strcasecmp(nv->name, name)) return nv->val; l=g_list_next(l); } if (!pls) return NULL; lpls=pls->list; filename=g_strjoin("", "lib", type_name, "_", name, NULL); corename=g_strjoin("", "lib", type_name, "_", "core", NULL); while (lpls) { pl=lpls->data; if ((mod_name=g_strrstr(pl->name, "/"))) mod_name++; else mod_name=pl->name; dbg(2,"compare '%s' with '%s'\n", mod_name, filename); if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) || !g_ascii_strncasecmp(mod_name, corename, strlen(corename))) { dbg(1, "Loading module \"%s\"\n",pl->name) ; if (plugin_get_active(pl)) if (!plugin_load(pl)) plugin_set_active(pl, 0); if (plugin_get_active(pl)) plugin_call_init(pl); l=plugin_types[type]; while (l) { nv=l->data; if (!g_ascii_strcasecmp(nv->name, name)) { g_free(filename); g_free(corename); return nv->val; } l=g_list_next(l); } } lpls=g_list_next(lpls); } g_free(filename); g_free(corename); return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/plugin.h000066400000000000000000000107511221777731700177740ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef PLUGIN_C #ifdef __cplusplus extern "C" { #endif struct plugin; enum plugin_type { plugin_type_graphics, plugin_type_gui, plugin_type_map, plugin_type_osd, plugin_type_speech, plugin_type_vehicle, plugin_type_event, plugin_type_font, plugin_type_last, }; #endif struct container; struct popup; struct popup_item; #undef PLUGIN_FUNC1 #undef PLUGIN_FUNC3 #undef PLUGIN_FUNC4 #undef PLUGIN_TYPE #define PLUGIN_PROTO(name,...) void name(__VA_ARGS__) #ifdef PLUGIN_C #define PLUGIN_REGISTER(name,...) \ void \ plugin_register_##name(PLUGIN_PROTO((*func),__VA_ARGS__)) \ { \ plugin_##name##_func=func; \ } #define PLUGIN_CALL(name,...) \ { \ if (plugin_##name##_func) \ (*plugin_##name##_func)(__VA_ARGS__); \ } #define PLUGIN_FUNC1(name,t1,p1) \ PLUGIN_PROTO((*plugin_##name##_func),t1 p1); \ void plugin_call_##name(t1 p1) PLUGIN_CALL(name,p1) \ PLUGIN_REGISTER(name,t1 p1) #define PLUGIN_FUNC3(name,t1,p1,t2,p2,t3,p3) \ PLUGIN_PROTO((*plugin_##name##_func),t1 p1,t2 p2,t3 p3); \ void plugin_call_##name(t1 p1,t2 p2, t3 p3) PLUGIN_CALL(name,p1,p2,p3) \ PLUGIN_REGISTER(name,t1 p1,t2 p2,t3 p3) #define PLUGIN_FUNC4(name,t1,p1,t2,p2,t3,p3,t4,p4) \ PLUGIN_PROTO((*plugin_##name##_func),t1 p1,t2 p2,t3 p3,t4 p4); \ void plugin_call_##name(t1 p1,t2 p2, t3 p3, t4 p4) PLUGIN_CALL(name,p1,p2,p3,p4) \ PLUGIN_REGISTER(name,t1 p1,t2 p2,t3 p3,t4 p4) struct name_val { char *name; void *val; }; GList *plugin_types[plugin_type_last]; #define PLUGIN_TYPE(type,newargs) \ struct type##_priv; \ struct type##_methods; \ void \ plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs) \ { \ struct name_val *nv; \ nv=g_new(struct name_val, 1); \ nv->name=g_strdup(name); \ nv->val=new_; \ plugin_types[plugin_type_##type]=g_list_append(plugin_types[plugin_type_##type], nv); \ } \ \ void * \ plugin_get_##type##_type(const char *name) \ { \ return plugin_get_type(plugin_type_##type, #type, name); \ } #else #define PLUGIN_FUNC1(name,t1,p1) \ void plugin_register_##name(void(*func)(t1 p1)); \ void plugin_call_##name(t1 p1); #define PLUGIN_FUNC3(name,t1,p1,t2,p2,t3,p3) \ void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3)); \ void plugin_call_##name(t1 p1,t2 p2,t3 p3); #define PLUGIN_FUNC4(name,t1,p1,t2,p2,t3,p3,t4,p4) \ void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3,t4 p4)); \ void plugin_call_##name(t1 p1,t2 p2,t3 p3,t4 p4); #define PLUGIN_TYPE(type,newargs) \ struct type##_priv; \ struct type##_methods; \ void plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs); \ void *plugin_get_##type##_type(const char *name); #endif #include "plugin_def.h" #ifndef USE_PLUGINS #define plugin_module_cat3(pre,mod,post) pre##mod##post #define plugin_module_cat2(pre,mod,post) plugin_module_cat3(pre,mod,post) #define plugin_module_cat(pre,post) plugin_module_cat2(pre,MODULE,post) #define plugin_init plugin_module_cat(module_,_init) #endif struct attr; /* prototypes */ void plugin_init(void); int plugin_load(struct plugin *pl); char *plugin_get_name(struct plugin *pl); int plugin_get_active(struct plugin *pl); void plugin_set_active(struct plugin *pl, int active); void plugin_set_lazy(struct plugin *pl, int lazy); void plugin_call_init(struct plugin *pl); void plugin_unload(struct plugin *pl); void plugin_destroy(struct plugin *pl); struct plugins *plugins_new(void); struct plugin *plugin_new(struct attr *parent, struct attr ** attrs); void plugins_init(struct plugins *pls); void plugins_destroy(struct plugins *pls); void *plugin_get_type(enum plugin_type type, const char *type_name, const char *name); /* end of prototypes */ #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/plugin/000077500000000000000000000000001221777731700176175ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/plugin/Makefile.am000066400000000000000000000001251221777731700216510ustar00rootroot00000000000000SUBDIRS= if PLUGIN_PEDESTRIAN SUBDIRS += pedestrian endif DIST_SUBDIRS=pedestrian navit-0.5.0~svn5643+dfsg.1/navit/plugin/pedestrian/000077500000000000000000000000001221777731700217555ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/plugin/pedestrian/CMakeLists.txt000066400000000000000000000000631221777731700245140ustar00rootroot00000000000000module_add_library(plugin_pedestrian pedestrian.c) navit-0.5.0~svn5643+dfsg.1/navit/plugin/pedestrian/Makefile.am000066400000000000000000000007011221777731700240070ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_pedestrian moduleplugin_LTLIBRARIES = libplugin_pedestrian.la libplugin_pedestrian_la_LDFLAGS=-module -avoid-version @NAVIT_MODULE_LDFLAGS@ #-Wl,--no-undefined libplugin_pedestrian_la_SOURCES = pedestrian.c android: libplugin_pedestrian.la cp .libs/libplugin_pedestrian.so ../../android/libs/armeabi xslt: cp *.xslt ../../xslt navit-0.5.0~svn5643+dfsg.1/navit/plugin/pedestrian/pedestrian.c000066400000000000000000001042711221777731700242640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #define DEMO 1 */ #ifdef HAVE_API_ANDROID #include #endif static struct map *global_map; int orientation,orientation_old; struct pedestrian { struct navit *nav; int w,h; int yaw; } pedestrian_data; int sensors_locked; struct attr initial_layout, main_layout; struct rocket { struct navit *navit; struct layout *layout; struct graphics *gra; struct transformation *trans; struct displaylist *dl; struct mapset *ms; int a,g,t,hog,v,vscale; struct callback *callback; struct event_idle *idle; }; static void pedestrian_rocket_idle(struct rocket *rocket) { struct attr follow; follow.type=attr_follow; follow.u.num=100; transform_set_hog(rocket->trans, rocket->hog); graphics_displaylist_draw(rocket->gra, rocket->dl, rocket->trans, rocket->layout, 0); rocket->v+=rocket->a-rocket->g; dbg(0,"enter v=%d\n",rocket->v); if (rocket->t > 0) rocket->t--; else rocket->a=0; rocket->hog+=rocket->v/rocket->vscale; dbg(0,"hog=%d\n",rocket->hog); if (rocket->hog < 0) { transform_set_hog(rocket->trans, 0); transform_set_order_base(rocket->trans, 14); transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); graphics_overlay_disable(rocket->gra, 0); navit_draw(rocket->navit); follow.u.num=1; event_remove_idle(rocket->idle); rocket->idle=NULL; sensors_locked=0; } navit_set_attr(rocket->navit, &follow); } static void pedestrian_cmd_pedestrian_rocket(struct rocket *rocket) { struct attr attr; int max=0; #if 0 int i,step=10; #endif rocket->a=2; rocket->g=1; rocket->t=100; rocket->hog=0; rocket->v=0; rocket->vscale=10; if (! navit_get_attr(rocket->navit, attr_graphics, &attr, NULL)) return; rocket->gra=attr.u.graphics; if (! navit_get_attr(rocket->navit, attr_transformation, &attr, NULL)) return; rocket->trans=attr.u.transformation; if (! navit_get_attr(rocket->navit, attr_displaylist, &attr, NULL)) return; rocket->dl=attr.u.displaylist; if (! navit_get_attr(rocket->navit, attr_mapset, &attr, NULL)) return; rocket->ms=attr.u.mapset; transform_set_hog(rocket->trans, max); transform_set_order_base(rocket->trans, 14); transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); transform_setup_source_rect(rocket->trans); graphics_overlay_disable(rocket->gra, 1); graphics_draw(rocket->gra, rocket->dl, rocket->ms, rocket->trans, rocket->layout, 0, NULL, 0); sensors_locked=1; if (!rocket->idle) rocket->idle=event_add_idle(50, rocket->callback); #if 0 while (hog >= 0) { transform_set_hog(trans, hog); #if 0 graphics_draw(gra, dl, ms, trans, layout, 0, NULL); #else graphics_displaylist_draw(gra, dl, trans, layout, 0); #endif v=v+a-g; if (t > 0) t--; else a=0; hog=hog+v/vscale; } #if 0 for (i = 0 ; i < max ; i+=step) { transform_set_hog(trans, i); graphics_displaylist_draw(gra, dl, trans, layout, 0); } for (i = max ; i >= 0 ; i-=step) { transform_set_hog(trans, i); graphics_displaylist_draw(gra, dl, trans, layout, 0); } #endif #endif } static struct command_table commands[] = { {"pedestrian_rocket",command_cast(pedestrian_cmd_pedestrian_rocket)}, }; static void osd_rocket_init(struct navit *nav) { struct rocket *rocket=g_new0(struct rocket, 1); struct attr attr; rocket->navit=nav; rocket->callback=callback_new_1(callback_cast(pedestrian_rocket_idle), rocket); if (navit_get_attr(nav, attr_layout, &attr, NULL)) rocket->layout=attr.u.layout; if (navit_get_attr(nav, attr_callback_list, &attr, NULL)) { dbg(0,"ok\n"); command_add_table(attr.u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), rocket); } } struct marker { struct cursor *cursor; }; static void osd_marker_draw(struct marker *this, struct navit *nav) { #if 0 struct attr graphics; struct point p; dbg(0,"enter\n"); if (!navit_get_attr(nav, attr_graphics, &graphics, NULL)) return; p.x=40; p.y=50; cursor_draw(this->cursor, graphics.u.graphics, &p, 0, 45, 0); #endif } static void osd_marker_init(struct marker *this, struct navit *nav) { struct attr cursor; struct attr itemgra,polygon,polygoncoord1,polygoncoord2,polygoncoord3; struct attr *color=attr_new_from_text("color","#ff0000"); cursor=(struct attr){attr_cursor, {(void *)cursor_new(NULL, (struct attr *[]){ &(struct attr){attr_w,{(void *)26}}, &(struct attr){attr_h,{(void *)26}}, NULL})}}; itemgra=(struct attr){attr_itemgra, {(void *)itemgra_new(&cursor, (struct attr *[]){ NULL})}}; cursor_add_attr(cursor.u.cursor, &itemgra); polygon=(struct attr){attr_polygon, {(void *)polygon_new(&itemgra, (struct attr *[]){ color, &(struct attr){attr_width,{(void *)2}}, NULL})}}; itemgra_add_attr(itemgra.u.itemgra, &polygon); polygoncoord1=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ &(struct attr){attr_x,{(void *)-7}}, &(struct attr){attr_y,{(void *)-10}}, NULL})}}; element_add_attr(polygon.u.element, &polygoncoord1); polygoncoord2=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ &(struct attr){attr_x,{(void *)0}}, &(struct attr){attr_y,{(void *)12}}, NULL})}}; element_add_attr(polygon.u.element, &polygoncoord2); polygoncoord3=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ &(struct attr){attr_x,{(void *)7}}, &(struct attr){attr_y,{(void *)-10}}, NULL})}}; element_add_attr(polygon.u.element, &polygoncoord3); attr_free(color); this->cursor=cursor.u.cursor; osd_marker_draw(this, nav); } static struct osd_priv * osd_marker_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct marker *this = g_new0(struct marker, 1); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_marker_init), attr_navit, this)); return (struct osd_priv *) this; } struct map_priv { struct navit *navit; }; struct map_rect_priv { struct map_priv *mpriv; struct item item; struct map_rect *route_map_rect; struct item *route_item; struct street_data *sd; struct coord c0; struct coord c_base; int checked; int idx_base; int idx_next; int idx; int first,last; int route_item_done; struct coord c_out; struct coord c_next; struct coord c_next_base; struct coord lseg[2]; struct coord lseg_base[2]; int lseg_done; int lseg_done_base; }; static int map_route_occluded_bbox(struct map *map, struct coord_rect *bbox) { struct coord c[128]; struct coord_rect r; int i,first=1,ccount; struct map_rect *map_rect=map_rect_new(map, NULL); struct item *item; while ((item=map_rect_get_item(map_rect))) { ccount=item_coord_get(item, c, 128); if (ccount && first) { r.lu=c[0]; r.rl=c[0]; first=0; } for (i = 0 ; i < ccount ; i++) coord_rect_extend(&r, &c[i]); } map_rect_destroy(map_rect); if (first) return 0; *bbox=r; return 1; } static struct building { struct street_data *sd; struct coord left,right; struct building *next; } *buildings; static void map_route_occluded_buildings_free(void) { struct building *next,*b=buildings; while (b) { street_data_free(b->sd); next=b->next; g_free(b); b=next; } buildings=NULL; } static void map_route_occluded_get_buildings(struct mapset *mapset, struct coord_rect *r) { struct mapset_handle *msh=mapset_open(mapset); struct map *map; struct map_selection sel; struct map_rect *mr; struct item *item; struct building *b; sel.next=NULL; sel.u.c_rect=*r; sel.order=18; sel.range.min=type_poly_building; sel.range.max=type_poly_building; map_route_occluded_buildings_free(); while ((map = mapset_next(msh, 1))) { mr=map_rect_new(map, &sel); while ((item = map_rect_get_item(mr))) { if (item->type == type_poly_building) { #if 0 if (item->id_hi != 0x1 || item->id_lo != 0x1f69) continue; #endif #if 0 if (item->id_hi != 0x8) continue; #if 1 if (item->id_lo != 0x2b3e0 && item->id_lo != 0x2ae7a && item->id_lo != 0x2af1a && item->id_lo != 0x2b348 && item->id_lo != 0x18bb5 && item->id_lo != 0x18ce5 && item->id_lo != 0x18a85) #else if (item->id_lo != 0x18bb5 && item->id_lo != 0x18ce5 && item->id_lo != 0x18a85) #endif continue; #endif b=g_new(struct building, 1); b->sd=street_get_data(item); b->next=buildings; buildings=b; } } map_rect_destroy(mr); } } FILE *debug,*debug2; /* < 0 left, > 0 right */ static int side(struct coord *l0, struct coord *l1, struct coord *p) { int dxl=l1->x-l0->x; int dyl=l1->y-l0->y; int dxp=p->x-l0->x; int dyp=p->y-l0->y; return dxp*dyl-dyp*dxl; } static void map_route_occluded_check_buildings(struct coord *c0) { struct building *b=buildings; dbg(0,"enter\n"); int i,count; struct coord *c; #if 1 FILE *bdebug,*bldebug; bdebug=fopen("tstb.txt","w"); bldebug=fopen("tstbl.txt","w"); #endif while (b) { c=b->sd->c; count=b->sd->count; if (c[count-1].x == c[0].x && c[count-1].y == c[0].y) { #if 0 dbg(0,"closed\n"); #endif count--; } for (i = 0 ; i < count ; i++) { if (!i || side(c0, &b->left, &c[i]) < 0) b->left=c[i]; if (!i || side(c0, &b->right, &c[i]) > 0) b->right=c[i]; } #if 1 if (bdebug) { fprintf(bdebug,"0x%x 0x%x type=poi_hospital\n", b->left.x, b->left.y); fprintf(bdebug,"0x%x 0x%x type=poi_hospital\n", b->right.x, b->right.y); } if (bldebug) { fprintf(bldebug,"type=street_nopass\n"); fprintf(bldebug,"0x%x 0x%x\n", c0->x, c0->y); fprintf(bldebug,"0x%x 0x%x\n", c0->x+(b->left.x-c0->x)*10, c0->y+(b->left.y-c0->y)*10); fprintf(bldebug,"type=street_nopass\n"); fprintf(bldebug,"0x%x 0x%x\n", c0->x, c0->y); fprintf(bldebug,"0x%x 0x%x\n", c0->x+(b->right.x-c0->x)*10, c0->y+(b->right.y-c0->y)*10); } #endif b=b->next; } #if 1 if (bdebug) fclose(bdebug); if (bldebug) fclose(bldebug); #endif } static int intersect(struct coord *p1, struct coord *p2, struct coord *p3, struct coord *p4, struct coord *i) { double num=(p4->x-p3->x)*(p1->y-p3->y)-(p4->y-p3->y)*(p1->x-p3->x); double den=(p4->y-p3->y)*(p2->x-p1->x)-(p4->x-p3->x)*(p2->y-p1->y); if (num < 0 && den < 0) { num=-num; den=-den; } dbg(1,"num=%f den=%f\n", num, den); if (i) { i->x=p1->x+(num/den)*(p2->x-p1->x)+0.5; i->y=p1->y+(num/den)*(p2->y-p1->y)+0.5; dbg(1,"i=0x%x,0x%x\n", i->x, i->y); if (debug2) fprintf(debug2, "0x%x 0x%x type=town_label_5e3\n", i->x, i->y); } if (num < 0 || den < 0) return -1; if (num > den) return 257; return 256*num/den; } /* return 0=Not clipped 1=Start clipped 2=End clipped 3=Both clipped 4=Invisible */ /* #define DEBUG_VISIBLE */ static int is_visible_line(struct coord *c0, struct coord *c1, struct coord *c2) { int res,ret=0; struct building *b=buildings; struct coord cn; #ifdef DEBUG_VISIBLE dbg(0,"enter\n"); #endif while (b) { if (side(&b->left, &b->right, c1) < 0 || side(&b->left, &b->right, c2) < 0) { #ifdef DEBUG_VISIBLE dbg(0,"sides left: start %d end %d right: start %d end %d\n", side(c0, &b->left, c1), side(c0, &b->left, c2), side(c0, &b->right, c1), side(c0, &b->right, c2)); #endif for (;;) { if (side(c0, &b->left, c1) <= 0) { if (side(c0, &b->left, c2) > 0) { #ifdef DEBUG_VISIBLE dbg(0,"visible: start is left of left corner and end is right of left corner, clipping end\n"); #endif res=intersect(c0, &b->left, c1, c2, &cn); if (res < 256) break; if (c1->x != cn.x || c1->y != cn.y) { *c2=cn; ret|=2; break; } } else break; } if (side(c0, &b->right, c1) >= 0) { if (side(c0, &b->right, c2) < 0) { #ifdef DEBUG_VISIBLE dbg(0,"visible: start is right of right corner and end is left of right corner, clipping end\n"); #endif res=intersect(c0, &b->right, c1, c2, &cn); if (res < 256) break; if (c1->x != cn.x || c1->y != cn.y) { *c2=cn; ret|=2; break; } } else break; } if (side(c0, &b->left, c2) <= 0) { if (side(c0, &b->left, c1) > 0) { #ifdef DEBUG_VISIBLE dbg(0,"visible: end is left of left corner and start is right of left corner, clipping start\n"); #endif res=intersect(c0, &b->left, c1, c2, &cn); if (res < 256) break; if (c2->x != cn.x || c2->y != cn.y) { *c1=cn; ret|=1; break; } } else break; } if (side(c0, &b->right, c2) >= 0) { if (side(c0, &b->right, c1) < 0) { #ifdef DEBUG_VISIBLE dbg(0,"visible: end is right of right corner and start is left of right corner, clipping start\n"); #endif res=intersect(c0, &b->right, c1, c2, &cn); if (res < 256) break; if (c2->x != cn.x || c2->y != cn.y) { *c1=cn; ret|=1; break; } } else break; } #ifdef DEBUG_VISIBLE dbg(0,"visible: not visible\n"); #endif return 4; } } b=b->next; } #ifdef DEBUG_VISIBLE dbg(0,"return %d\n",ret); #endif return ret; } static void map_route_occluded_coord_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; dbg(1,"enter\n"); mr->idx=mr->idx_base; mr->first=1; mr->lseg_done=mr->lseg_done_base; mr->c_next=mr->c_next_base; mr->lseg[0]=mr->lseg_base[0]; mr->lseg[1]=mr->lseg_base[1]; mr->last=0; item_coord_rewind(mr->route_item); } static void map_route_occluded_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; dbg(1,"enter\n"); item_attr_rewind(mr->route_item); } static int map_route_occluded_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; dbg(1,"enter\n"); return item_attr_get(mr->route_item, attr_type, attr); } static int coord_next(struct map_rect_priv *mr, struct coord *c) { if (mr->idx >= mr->sd->count) return 1; *c=mr->sd->c[mr->idx++]; return 0; } #define DEBUG_COORD_GET static int map_route_occluded_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct coord l0,l1; int vis,ret=0; char buffer[4096]; #ifdef DEBUG_COORD_GET dbg(1,"enter\n"); #endif dbg_assert(count >= 2); if (! mr->checked) { mr->c0=mr->sd->c[0]; map_route_occluded_check_buildings(&mr->c0); mr->checked=1; } while (ret < count && !mr->last) { #ifdef DEBUG_COORD_GET dbg(1,"coord first %d lseg_done %d\n",mr->first,mr->lseg_done); #endif if (mr->lseg_done) { #ifdef DEBUG_COORD_GET dbg(1,"loading %d of %d from id_lo %d\n", mr->idx, mr->sd->count, mr->sd->item.id_lo); #endif if (!mr->idx) { if (coord_next(mr, &mr->lseg[0])) { mr->route_item_done=1; mr->last=1; mr->idx_base=mr->idx=0; break; } mr->first=1; } else mr->lseg[0]=mr->lseg[1]; if (coord_next(mr, &mr->lseg[1])) { mr->route_item_done=1; mr->last=1; mr->idx_base=mr->idx=0; break; } mr->c_next=mr->lseg[0]; mr->lseg_done=0; } l0=mr->c_next; l1=mr->lseg[1]; #ifdef DEBUG_COORD_GET dbg(1,"line (0x%x,0x%x)-(0x%x,0x%x)\n", l0.x,l0.y,l1.x,l1.y); #endif vis=is_visible_line(&mr->c0, &l0, &l1); if (debug) { fprintf(debug,"type=tracking_%d debug=\"%s\"\n",vis*20,buffer); fprintf(debug,"0x%x 0x%x\n", l0.x, l0.y); fprintf(debug,"0x%x 0x%x\n", l1.x, l1.y); } #ifdef DEBUG_COORD_GET dbg(1,"vis=%d line (0x%x,0x%x)-(0x%x,0x%x)\n", vis, l0.x,l0.y,l1.x,l1.y); #endif mr->idx_base=mr->idx; mr->c_next_base=mr->c_next; mr->lseg_base[0]=mr->lseg[0]; mr->lseg_base[1]=mr->lseg[1]; mr->lseg_done_base=mr->lseg_done; switch (vis) { case 0: mr->c_next_base=mr->c_next; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->lseg_done_base=mr->lseg_done=1; mr->last=1; break; case 1: #ifdef DEBUG_COORD_GET dbg(1,"begin clipped\n"); dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->c_next_base=mr->c_next=l1; mr->last=1; break; case 2: #ifdef DEBUG_COORD_GET dbg(1,"end clipped\n"); #endif mr->c_next_base=mr->c_next; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->c_next_base=mr->c_next=l1; mr->last=1; break; case 3: #ifdef DEBUG_COORD_GET dbg(1,"both clipped\n"); #endif mr->c_next_base=mr->c_next; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->c_next_base=mr->c_next=l1; mr->last=1; break; case 4: mr->last=1; mr->lseg_done_base=mr->lseg_done=1; break; #if 0 case 2: dbg(1,"visible up to 0x%x,0x%x\n",l1.x,l1.y); if (mr->first) { mr->first=0; c[ret++]=mr->c_out; dbg(1,"out 0x%x,0x%x\n", mr->c_out.x, mr->c_out.y); } c[ret++]=mr->c_out=l1; dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); mr->last=1; mr->route_item_done=1; break; case 1: case 3: case 4: dbg(1,"invisible\n"); mr->c_out=l1; mr->idx++; mr->last=1; mr->route_item_done=1; break; } if (!vis) break; #endif } } #ifdef DEBUG_COORD_GET dbg(1,"ret=%d last=%d\n", ret, mr->last); #endif return ret; } static struct item_methods methods_route_occluded_item = { map_route_occluded_coord_rewind, map_route_occluded_coord_get, map_route_occluded_attr_rewind, map_route_occluded_attr_get, }; static void map_route_occluded_destroy(struct map_priv *priv) { g_free(priv); } static int no_recurse; static struct map_rect_priv * map_route_occluded_rect_new(struct map_priv *priv, struct map_selection *sel) { struct map_rect_priv * mr; struct attr route; struct attr route_map; struct map_rect *route_map_rect; struct coord_rect r; if (!navit_get_attr(priv->navit, attr_route, &route, NULL)) { dbg(0,"no route in navit\n"); return NULL; } if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) { dbg(0,"no map in route\n"); return NULL; } route_map_rect=map_rect_new(route_map.u.map, sel); if (!route_map_rect) { dbg(0,"no route map rect\n"); return NULL; } map_dump_file(route_map.u.map, "route.txt"); mr=g_new0(struct map_rect_priv, 1); mr->route_map_rect=route_map_rect; mr->mpriv = priv; mr->item.priv_data = mr; mr->item.meth = &methods_route_occluded_item; mr->item.id_lo = -1; mr->route_item_done=1; mr->lseg_done_base=1; mr->last=1; if (!no_recurse && map_route_occluded_bbox(route_map.u.map, &r)) { struct attr mapset; no_recurse++; if (navit_get_attr(mr->mpriv->navit, attr_mapset, &mapset, NULL)) map_route_occluded_get_buildings(mapset.u.mapset, &r); debug=fopen("tst.txt","w"); debug2=fopen("tstp.txt","w"); no_recurse--; } return mr; } static void map_route_occluded_rect_destroy(struct map_rect_priv *mr) { map_rect_destroy(mr->route_map_rect); street_data_free(mr->sd); g_free(mr); if (!no_recurse) { if (debug) { fclose(debug); debug=NULL; } if (debug2) { fclose(debug2); debug2=NULL; } } #if 0 static int in_dump; if (! in_dump) { in_dump=1; map_dump_file(global_map,"route.txt"); in_dump=0; } #endif } static struct item * map_route_occluded_get_item(struct map_rect_priv *mr) { dbg(1,"enter last=%d\n",mr->last); while (!mr->last) { struct coord c[128]; map_route_occluded_coord_get(mr, c, 128); } if (mr->route_item_done) { dbg(1,"next route item\n"); do { mr->route_item=map_rect_get_item(mr->route_map_rect); } while (mr->route_item && mr->route_item->type != type_street_route); dbg(1,"item %p\n", mr->route_item); if (!mr->route_item) return NULL; mr->item.type=type_street_route_occluded; street_data_free(mr->sd); mr->sd=street_get_data(mr->route_item); mr->route_item_done=0; } mr->item.id_lo++; #if 0 if (mr->item.id_lo > 20) return NULL; #endif map_route_occluded_coord_rewind(mr); dbg(1,"type %s\n", item_to_name(mr->route_item->type)); return &mr->item; } static struct item * map_route_occluded_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct item *ret=NULL; while (id_lo-- > 0) ret=map_route_occluded_get_item(mr); return ret; } static struct map_methods map_route_occluded_methods = { projection_mg, "utf-8", map_route_occluded_destroy, map_route_occluded_rect_new, map_route_occluded_rect_destroy, map_route_occluded_get_item, map_route_occluded_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * map_route_occluded_new(struct map_methods *meth, struct attr **attrs) { struct map_priv *ret; struct attr *navit; dbg(0,"enter\n"); navit=attr_search(attrs, NULL, attr_navit); if (! navit) return NULL; ret=g_new0(struct map_priv, 1); *meth=map_route_occluded_methods; ret->navit=navit->u.navit; dbg(0,"m=%p navit=%p\n", ret, ret->navit); return ret; } static void pedestrian_graphics_resize(struct graphics *gra, int w, int h) { #ifndef HAVE_API_ANDROID static int done; if (!done) { int id=(int)graphics_get_data(gra, "xwindow_id"); char buffer[1024]; sprintf(buffer,"testxv %d &",id); system(buffer); done=1; } #endif pedestrian_data.w=w; pedestrian_data.h=h; } static void pedestrian_draw_arrow(struct graphics *gra, char *name, int x, int y) { char *src=graphics_icon_path(name); struct graphics_image *img=graphics_image_new(gra, src); struct graphics_gc *gc=graphics_gc_new(gra); struct color col={0xffff,0xffff,0xffff,0xffff}; struct point p; graphics_gc_set_foreground(gc, &col); p.x=x; p.y=y; graphics_draw_image(gra, gc, &p, img); graphics_image_free(gra, img); graphics_gc_destroy(gc); g_free(src); } static void pedestrian_draw_arrows(struct graphics *gra) { struct attr route, route_map; struct map_rect *route_map_rect; struct item *item; if (orientation == 2) return; if (!navit_get_attr(pedestrian_data.nav, attr_route, &route, NULL)) { dbg(0,"no route in navit\n"); return; } if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) { dbg(0,"no map in route\n"); return; } route_map_rect=map_rect_new(route_map.u.map, NULL); if (!route_map_rect) { dbg(0,"no route map rect\n"); return; } while ((item=map_rect_get_item(route_map_rect))) { if (item->type == type_street_route) { struct coord c[2]; if (item_coord_get(item, c, 2) == 2) { struct coord *center=transform_get_center(navit_get_trans(pedestrian_data.nav)); int angle=transform_get_angle_delta(center, &c[1], 0); angle-=pedestrian_data.yaw; if (angle < 0) angle+=360; if (angle >= 360) angle-=360; if (angle > 180 && angle < 350) pedestrian_draw_arrow(gra,"gui_arrow_left_32_32.png",0,pedestrian_data.h/2-16); if (angle > 10 && angle <= 180) pedestrian_draw_arrow(gra,"gui_arrow_right_32_32.png",pedestrian_data.w-32,pedestrian_data.h/2-16); } break; } } map_rect_destroy(route_map_rect); } static void pedestrian_graphics_postdraw(struct graphics *gra) { #if 0 struct graphics_gc * gc = graphics_gc_new(gra); struct point p; struct color c = {0xadad,0xd8d8,0xe6e6,0xffff}; p.x=0; p.y=0; graphics_gc_set_foreground(gc, &c); graphics_gc_set_stipple(gc, NULL); graphics_draw_rectangle(gra, gc, &p, 1000, 200); graphics_gc_destroy(gc); #endif pedestrian_draw_arrows(gra); } #ifndef HAVE_API_ANDROID struct tilt_data { int len,axis; char buffer[32]; }; void pedestrian_write_tilt(int fd, int axis) { char *buffer="01"; int ret; ret=write(fd, buffer+axis, 1); if (ret != 2) { dbg(0,"ret=%d\n",ret); } } void pedestrian_read_tilt(int fd, struct navit *nav, struct tilt_data *data) { int val,ret,maxlen=3; ret=read(fd, data->buffer+data->len, maxlen-data->len); if (ret > 0) { data->len+=ret; data->buffer[data->len]='\0'; } if (data->len == 3) { struct attr attr; sscanf(data->buffer,"%02x",&val); data->len=0; if (navit_get_attr(nav, attr_transformation, &attr, NULL)) { struct transformation *trans=attr.u.transformation; dbg(0,"ok axis=%d val=0x%x\n", data->axis, val); if (data->axis != 1) { transform_set_pitch(trans, 90+(val-0x80)); } else { transform_set_roll(trans, 0x80-val); } } data->axis=1-data->axis; #if 0 pedestrian_write_tilt(fd, data->axis); #endif } } void pedestrian_write_tilt_timer(int fd, struct tilt_data *data) { pedestrian_write_tilt(fd, data->axis); } void pedestrian_setup_tilt(struct navit *nav) { int fd,on=1; struct termios t; struct callback *cb,*cbt; struct tilt_data *data=g_new0(struct tilt_data, 1); char buffer[32]; fd=open("/dev/tiltsensor",O_RDWR); if (fd == -1) { dbg(0,"Failed to set up tilt sensor, error %d\n",errno); return; } tcgetattr(fd, &t); cfmakeraw(&t); cfsetspeed(&t, B19200); tcsetattr(fd, TCSANOW, &t); ioctl(fd, FIONBIO, &on); cb=callback_new_3(callback_cast(pedestrian_read_tilt), fd, nav, data); cbt=callback_new_2(callback_cast(pedestrian_write_tilt_timer), fd, data); event_add_watch((void *)fd, event_watch_cond_read, cb); event_add_timeout(300, 1, cbt); read(fd, buffer, 32); #if 0 pedestrian_write_tilt(fd, 0); #endif } #else float sensors[2][3]; static void android_sensors(struct navit *nav, int sensor, float *x, float *y, float *z) { float yaw=0,pitch=0; struct attr attr; sensors[sensor-1][0]=*x; sensors[sensor-1][1]=*y; sensors[sensor-1][2]=*z; if (sensors_locked) return; dbg(1,"enter %d %f %f %f\n",sensor,*x,*y,*z); if (sensor == 1) { if (*x > 7.5) orientation=1; /* landscape */ if (*y > 7.5) orientation=0; /* portrait */ if (*z > 7.5) orientation=2; /* flat */ dbg(1,"orientation=%d\n",orientation); } if ((orientation_old == 2) != (orientation == 2)) { struct attr attr, flags_graphics, osd_configuration; navit_set_attr(nav, orientation == 2 ? &initial_layout:&main_layout); navit_get_attr(nav, attr_transformation, &attr, NULL); transform_set_scale(attr.u.transformation, orientation == 2 ? 64:16); flags_graphics.type=attr_flags_graphics; flags_graphics.u.num=orientation == 2 ? 0:10; navit_set_attr(nav, &flags_graphics); osd_configuration.type=attr_osd_configuration; osd_configuration.u.num=orientation == 2 ? 1:2; navit_set_attr(nav, &osd_configuration); } orientation_old=orientation; switch (orientation) { case 2: if (sensor == 2) { yaw=atan2f(-*y,-*x)*180/M_PI+180; } pitch=0; break; case 1: if (sensor == 1) { pitch=atan2f(*x,*z)*180/M_PI; } if (sensor == 2) { yaw=atan2f(-*y,*z)*180/M_PI+180; } break; case 0: if (sensor == 1) { pitch=atan2f(*y,*z)*180/M_PI; } if (sensor == 2) { yaw=atan2f(*x,*z)*180/M_PI+180; } break; } if (navit_get_attr(nav, attr_transformation, &attr, NULL)) { struct transformation *trans=attr.u.transformation; if (sensor == 1) { if (orientation != 2) pitch+=2.0; transform_set_pitch(trans, (int)pitch); dbg(1,"pich %d %f\n",orientation,pitch); } else { struct attr attr; attr.type=attr_orientation; attr.u.num=yaw-1.0; if (attr.u.num < 0) attr.u.num+=360; pedestrian_data.yaw=attr.u.num; navit_set_attr(nav, &attr); dbg(1,"yaw %d %f\n",orientation,yaw); if (orientation == 2) navit_set_center_cursor(nav, 1, 0); } } } #endif static void pedestrian_log(char **logstr) { #ifdef HAVE_API_ANDROID char *tag=g_strdup_printf( "\t\t%f\n" "\t\t%f\n" "\t\t%f\n" "\t\t%f\n" "\t\t%f\n" "\t\t%f\n", sensors[0][0],sensors[0][1],sensors[0][2], sensors[1][0],sensors[1][1],sensors[1][2]); vehicle_log_gpx_add_tag(tag, logstr); #endif } #ifdef DEMO static void vehicle_changed(struct vehicle *v, struct transformation *trans) { struct attr attr; if (vehicle_get_attr(v, attr_position_direction, &attr, NULL)) { int dir=(int)(*attr.u.numd); dbg(0,"enter %d\n",dir); transform_set_pitch(trans, 90); transform_set_yaw(trans, dir); } } #endif static void pedestrian_navit_init(struct navit *nav) { struct attr route; struct attr route_map; struct attr map; struct attr mapset; struct attr graphics,attr,flags_graphics; struct transformation *trans; struct attr_iter *iter; #ifdef HAVE_API_ANDROID struct callback *cb; jclass navitsensorsclass; jmethodID cid; jobject navitsensors; dbg(0,"enter\n"); if (android_find_class_global("org/navitproject/navit/NavitSensors", &navitsensorsclass)) { dbg(0,"class found\n"); cid = (*jnienv)->GetMethodID(jnienv, navitsensorsclass, "", "(Landroid/content/Context;I)V"); dbg(0,"cid=%p\n",cid); if (cid) { cb=callback_new_1(callback_cast(android_sensors), nav); navitsensors=(*jnienv)->NewObject(jnienv, navitsensorsclass, cid, android_activity, cb); dbg(0,"object=%p\n",navitsensors); if (navitsensors) navitsensors = (*jnienv)->NewGlobalRef(jnienv, navitsensors); } } #endif pedestrian_data.nav=nav; flags_graphics.type=attr_flags_graphics; flags_graphics.u.num=10; navit_set_attr(nav, &flags_graphics); if (navit_get_attr(nav, attr_graphics, &graphics, NULL)) { struct attr attr; struct callback *cb=callback_new_attr_1(callback_cast(pedestrian_graphics_resize),attr_resize,graphics.u.graphics); graphics_add_callback(graphics.u.graphics, cb); cb=callback_new_attr_1(callback_cast(pedestrian_graphics_postdraw),attr_postdraw,graphics.u.graphics); graphics_add_callback(graphics.u.graphics, cb); attr.type=attr_use_camera; attr.u.num=1; graphics_set_attr(graphics.u.graphics, &attr); } osd_rocket_init(nav); #if 1 #ifndef HAVE_API_ANDROID pedestrian_setup_tilt(nav); #endif trans=navit_get_trans(nav); transform_set_pitch(trans, 90); transform_set_roll(trans, 0); transform_set_hog(trans, 2); transform_set_distance(trans, 0); transform_set_scales(trans, 750, 620, 32 << 8); if (!navit_get_attr(nav, attr_route, &route, NULL)) return; if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) return; dbg(0,"enter 1\n"); #if 0 struct attr active; active.type=attr_active; active.u.num=0; if (!map_set_attr(route_map.u.map, &active)) return; dbg(0,"enter 2\n"); #endif if (!navit_get_attr(nav, attr_mapset, &mapset, NULL)) return; map.type=attr_map; map.u.map=map_new(NULL, (struct attr*[]){ &(struct attr){attr_type,{"route_occluded"}}, &(struct attr){attr_data,{""}}, &(struct attr){attr_description,{"Occluded Route"}}, &(struct attr){attr_navit,{(void *)nav}}, NULL}); global_map=map.u.map; mapset_add_attr(mapset.u.mapset, &map); #if 0 map=route_get_attr(route, attr_map); #endif #endif transform_set_scale(trans, 16); navit_get_attr(nav, attr_layout, &initial_layout, NULL); iter=navit_attr_iter_new(); while(navit_get_attr(nav, attr_layout, &attr, iter)) { if (!strcmp(attr.u.layout->name, "Route")) { dbg(0,"found %s\n",attr_to_name(attr.type)); main_layout=attr; #if 1 navit_set_attr(nav, &attr); #endif break; } } navit_attr_iter_destroy(iter); if (navit_get_attr(nav, attr_vehicle, &attr, NULL)) { struct attr cbattr; cbattr.u.callback=callback_new_attr_0(callback_cast(pedestrian_log), attr_log_gpx); cbattr.type=attr_callback; vehicle_add_attr(attr.u.vehicle, &cbattr); #ifdef DEMO cbattr.u.callback=callback_new_attr_2(callback_cast(vehicle_changed), attr_position_coord_geo, attr.u.vehicle, trans); cbattr.type=attr_callback; vehicle_add_attr(attr.u.vehicle, &cbattr); #endif } } static void pedestrian_navit(struct navit *nav, int add) { dbg(0,"enter\n"); struct attr callback; if (add) { callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit_init), attr_navit); navit_add_attr(nav, &callback); } } void plugin_init(void) { struct attr callback,navit; struct attr_iter *iter; #ifdef HAVE_API_ANDROID jclass ActivityClass; jmethodID Activity_setRequestedOrientation; if (!android_find_class_global("android/app/Activity", &ActivityClass)) dbg(0,"failed to get class android/app/Activity\n"); Activity_setRequestedOrientation = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setRequestedOrientation", "(I)V"); if (Activity_setRequestedOrientation == NULL) dbg(0,"failed to get method setRequestedOrientation from android/app/Activity\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, Activity_setRequestedOrientation, 0); #endif plugin_register_osd_type("marker", osd_marker_new); plugin_register_map_type("route_occluded", map_route_occluded_new); callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit), attr_navit); config_add_attr(config, &callback); iter=config_attr_iter_new(); while (config_get_attr(config, attr_navit, &navit, iter)) pedestrian_navit_init(navit.u.navit); config_attr_iter_destroy(iter); } navit-0.5.0~svn5643+dfsg.1/navit/plugin_def.h000066400000000000000000000031621221777731700206100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct attr; struct navit; struct callback_list; struct gui; PLUGIN_FUNC1(draw, struct container *, co) PLUGIN_FUNC3(popup, struct container *, map, struct popup *, p, struct popup_item **, list) PLUGIN_TYPE(graphics, (struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)) PLUGIN_TYPE(gui, (struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui)) PLUGIN_TYPE(map, (struct map_methods *meth, struct attr **attrs, struct callback_list *cbl)) PLUGIN_TYPE(osd, (struct navit *nav, struct osd_methods *meth, struct attr **attrs)) PLUGIN_TYPE(speech, (struct speech_methods *meth, struct attr **attrs, struct attr *parent)) PLUGIN_TYPE(vehicle, (struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs)) PLUGIN_TYPE(event, (struct event_methods *meth)) PLUGIN_TYPE(font, (void *meth)) navit-0.5.0~svn5643+dfsg.1/navit/point.h000066400000000000000000000016241221777731700176260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_POINT_H #define NAVIT_POINT_H struct point { int x; int y; }; struct point_rect { struct point lu; struct point rl; }; #endif navit-0.5.0~svn5643+dfsg.1/navit/popup.c000066400000000000000000000303251221777731700176330ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008, 2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include "popup.h" #include "debug.h" #include "navit.h" #include "coord.h" #include "gui.h" #include "menu.h" #include "point.h" #include "transform.h" #include "projection.h" #include "item.h" #include "map.h" #include "graphics.h" #include "callback.h" #include "route.h" #include "navit_nls.h" #include "bookmarks.h" #if 0 static void popup_set_no_passing(struct popup_item *item, void *param) { #if 0 struct display_list *l=param; struct segment *seg=(struct segment *)(l->data); struct street_str *str=(struct street_str *)(seg->data[0]); char log[256]; int segid=str->segid; if (segid < 0) segid=-segid; sprintf(log,"Attributes Street 0x%x updated: limit=0x%x(0x%x)", segid, 0x33, str->limit); str->limit=0x33; log_write(log, seg->blk_inf.file, str, sizeof(*str)); #endif } #endif static void popup_traffic_distortion(struct item *item, char *attr) { /* add the configuration directory to the name of the file to use */ char *dist_filename = g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/distortion.txt", NULL); if (dist_filename) /* if we built the filename */ { FILE *map=fopen(dist_filename,"a"); if (map) /* if the file was opened */ { struct coord c; struct map_rect *mr; fprintf(map,"type=traffic_distortion %s\n",attr); mr=map_rect_new(item->map,NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); while (item_coord_get(item, &c, 1)) { fprintf(map,"0x%x 0x%x\n",c.x,c.y); } fclose(map); } else { dbg(0,"could not open file for distortions !!"); } /* else - if (map) */ g_free(dist_filename); /* free the file name */ } /* if (dist_filename) */ } /* end: popup_traffic_distortion(..) */ static void popup_traffic_distortion_blocked(struct item *item) { dbg(0,"item=%p\n",item); popup_traffic_distortion(item, "maxspeed=0"); } static void popup_traffic_distortion_speed(struct item *item, int maxspeed) { char buffer[256]; sprintf(buffer,"maxspeed=%d",maxspeed); popup_traffic_distortion(item,buffer); } static void popup_traffic_distortion_delay(struct item *item, int delay) { char buffer[256]; sprintf(buffer,"delay=%d",delay*600); popup_traffic_distortion(item,buffer); } static void popup_set_destination(struct navit *nav, struct pcoord *pc) { struct coord c; struct coord_geo g; char buffer[1024]; char buffer_geo[1024]; c.x = pc->x; c.y = pc->y; transform_to_geo(transform_get_projection(navit_get_trans(nav)), &c, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); sprintf(buffer,"Map Point %s", buffer_geo); navit_set_destination(nav, pc, buffer, 1); } static void popup_set_visitbefore(struct navit *nav, struct pcoord *pc,int visitbefore) { struct pcoord *dst; char buffer[1024]; int i, dstcount_new; sprintf(buffer, _("Waypoint %d"), visitbefore+1); dstcount_new=navit_get_destination_count(nav)+1; dst=g_alloca(dstcount_new*sizeof(struct pcoord)); navit_get_destinations(nav,dst,dstcount_new); for (i=dstcount_new-1;i>visitbefore;i--){ dst[i]=dst[i-1]; } dst[visitbefore]=*pc; navit_add_destination_description(nav,pc,buffer); navit_set_destinations(nav, dst, dstcount_new, buffer, 1); } static void popup_set_bookmark(struct navit *nav, struct pcoord *pc) { struct attr attr; struct coord c; struct coord_geo g; char buffer[1024]; char buffer_geo[1024]; c.x = pc->x; c.y = pc->y; transform_to_geo(pc->pro, &c, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); sprintf(buffer,"Map Point %s", buffer_geo); if (!gui_add_bookmark(navit_get_gui(nav), pc, buffer)) { navit_get_attr(nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, pc, buffer); } } extern void *vehicle; static void popup_set_position(struct navit *nav, struct pcoord *pc) { dbg(1,"%p %p\n", nav, pc); navit_set_position(nav, pc); } #if 0 static void popup_break_crossing(struct display_list *l) { struct segment *seg=(struct segment *)(l->data); struct street_str *str=(struct street_str *)(seg->data[0]); char log[256]; int segid=str->segid; if (segid < 0) segid=-segid; sprintf(log,"Coordinates Street 0x%x updated: limit=0x%x(0x%x)", segid, 0x33, str->limit); str->limit=0x33; log_write(log, seg->blk_inf.file, str, sizeof(*str)); } #endif #define popup_printf(menu, type, ...) popup_printf_cb(menu, type, NULL, __VA_ARGS__) static void * popup_printf_cb(void *menu, enum menu_type type, struct callback *cb, const char *fmt, ...) { gchar *str,*us; int usc=0; va_list ap; void *ret; va_start(ap, fmt); str=g_strdup_vprintf(fmt, ap); dbg(0,"%s\n", str); us=str; while (*us) { if (*us == '_') usc++; us++; } if (usc) { gchar *str2=g_malloc(strlen(str)+usc+1); gchar *us2=str2; us=str; while (*us) { if (*us == '_') *us2++=*us; *us2++=*us++; } *us2='\0'; g_free(str); str=str2; } ret=menu_add(menu, str, type, cb); va_end(ap); g_free(str); return ret; } static void popup_show_visitbefore(struct navit *nav,struct pcoord *pc, void *menu) { void *menuvisitbefore; char buffer[100]; int i, dstcount; dstcount=navit_get_destination_count(nav); if (dstcount>=1){ menuvisitbefore=popup_printf(menu, menu_type_submenu, _("Visit before...")); for (i=0;itype); char *str; str=attr_to_text(attr, map, 1); popup_printf(menu, menu_type_menu, "%s: %s", attr_name, str); g_free(str); } #if 0 static void popup_show_attr(void *menu, struct item *item, enum attr_type attr_type) { struct attr attr; memset(&attr, 0, sizeof(attr)); attr.type=attr_type; if (item_attr_get(item, attr_type, &attr)) popup_show_attr_val(menu, &attr); } #endif static void popup_show_attrs(struct map *map, void *menu, struct item *item) { #if 0 popup_show_attr(menu, item, attr_debug); popup_show_attr(menu, item, attr_address); popup_show_attr(menu, item, attr_phone); popup_show_attr(menu, item, attr_phone); popup_show_attr(menu, item, attr_entry_fee); popup_show_attr(menu, item, attr_open_hours); #else struct attr attr; for (;;) { memset(&attr, 0, sizeof(attr)); if (item_attr_get(item, attr_any, &attr)) popup_show_attr_val(map, menu, &attr); else break; } #endif } static void popup_item_dump(struct item *item) { struct map_rect *mr; mr=map_rect_new(item->map,NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); dbg(0,"item=%p\n",item); item_dump_filedesc(item,item->map,stdout); map_rect_destroy(mr); } static void popup_show_item(struct navit *nav, void *popup, struct displayitem *di) { struct map_rect *mr; void *menu, *menu_item, *menu_dist; char *label; struct item *item,*diitem; int count; label=graphics_displayitem_get_label(di); diitem=graphics_displayitem_get_item(di); count=graphics_displayitem_get_coord_count(di); dbg_assert(diitem); if (label) menu=popup_printf(popup, menu_type_submenu, "%s '%s' (%d coords)", item_to_name(diitem->type), label, count); else menu=popup_printf(popup, menu_type_submenu, "%s (%d coords)", item_to_name(diitem->type), count); menu_item=popup_printf(menu, menu_type_submenu, "Item"); popup_printf(menu_item, menu_type_menu, "type: 0x%x", diitem->type); popup_printf(menu_item, menu_type_menu, "id: 0x%x 0x%x", diitem->id_hi, diitem->id_lo); if (diitem->map) { struct attr type,data; if (!map_get_attr(diitem->map, attr_type, &type, NULL)) type.u.str=""; if (!map_get_attr(diitem->map, attr_data, &data, NULL)) data.u.str=""; popup_printf(menu_item, menu_type_menu, "map: %s:%s", type.u.str, data.u.str); } if (diitem->map) { mr=map_rect_new(diitem->map,NULL); item=map_rect_get_item_byid(mr, diitem->id_hi, diitem->id_lo); dbg(1,"item=%p\n", item); if (item) { popup_show_attrs(item->map, menu_item, item); popup_printf_cb(menu_item, menu_type_menu, callback_new_1(callback_cast(popup_item_dump), diitem), "Dump"); if (item->type < type_line) { struct coord co; struct pcoord *c; if (item_coord_get(item, &co, 1)) { c=g_new(struct pcoord, 1); c->pro = transform_get_projection(navit_get_trans(nav)); c->x = co.x; c->y = co.y; popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_position), nav, c), _("Set as position")); popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_destination), nav, c), _("Set as destination")); popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_bookmark), nav, c), _("Add as bookmark")); } } } map_rect_destroy(mr); } else { popup_printf(menu, menu_type_menu, "(No map)"); } if (item_get_default_flags(diitem->type)) { int speeds[]={5,10,20,30,40,50,60,70,80,90,100}; int delays[]={1,2,3,5,10,15,20,30,45,60,75,90,120,150,180,240,300}; int i; menu_dist=popup_printf(menu, menu_type_submenu, "Traffic distortion"); popup_printf_cb(menu_dist, menu_type_menu, callback_new_1(callback_cast(popup_traffic_distortion_blocked), diitem), "Blocked"); menu_item=popup_printf(menu_dist, menu_type_submenu,"Max speed"); for (i = 0 ; i < sizeof(speeds)/sizeof(int); i++) { popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_speed), diitem, speeds[i]), "%d km/h",speeds[i]); } menu_item=popup_printf(menu_dist, menu_type_submenu,"Delay"); for (i = 0 ; i < sizeof(delays)/sizeof(int); i++) { popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_delay), diitem, delays[i]*600), "%d min",delays[i]); } } } static void popup_display(struct navit *nav, void *popup, struct point *p) { struct displaylist_handle *dlh; struct displaylist *display; struct displayitem *di; display=navit_get_displaylist(nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { if (graphics_displayitem_within_dist(display, di, p, 5)) { popup_show_item(nav, popup, di); } } graphics_displaylist_close(dlh); } static struct pcoord c; void popup(struct navit *nav, int button, struct point *p) { void *popup,*men; char buffer[1024]; struct coord_geo g; struct coord co; popup=gui_popup_new(navit_get_gui(nav)); if (! popup) return; transform_reverse(navit_get_trans(nav), p, &co); men=popup_printf(popup, menu_type_submenu, _("Point 0x%x 0x%x"), co.x, co.y); popup_printf(men, menu_type_menu, _("Screen coord : %d %d"), p->x, p->y); transform_to_geo(transform_get_projection(navit_get_trans(nav)), &co, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); popup_printf(men, menu_type_menu, "%s", buffer); popup_printf(men, menu_type_menu, "%f %f", g.lat, g.lng); dbg(1,"%p %p\n", nav, &c); c.pro = transform_get_projection(navit_get_trans(nav)); c.x = co.x; c.y = co.y; popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_position), nav, &c), _("Set as position")); popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_destination), nav, &c), _("Set as destination")); popup_show_visitbefore(nav,&c,men); popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_bookmark), nav, &c), _("Add as bookmark")); popup_display(nav, popup, p); menu_popup(popup); } navit-0.5.0~svn5643+dfsg.1/navit/popup.h000066400000000000000000000016171221777731700176420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_POPUP_H #define NAVIT_POPUP_H struct navit; struct point; void popup(struct navit *nav, int button, struct point *p); #endif navit-0.5.0~svn5643+dfsg.1/navit/profile.c000066400000000000000000000036761221777731700201410ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "profile.h" #include "debug.h" void profile_timer(int level, const char *module, const char *function, const char *fmt, ...) { #ifndef _MSC_VER va_list ap; static struct timeval last[10]; struct timeval curr; int msec,usec; char buffer[strlen(module)+20]; va_start(ap, fmt); if (level < 0) level=0; if (level > 9) level=9; if (fmt) { gettimeofday(&curr, NULL); msec=(curr.tv_usec-last[level].tv_usec)/1000+ (curr.tv_sec-last[level].tv_sec)*1000; sprintf(buffer, "profile:%s", module); debug_vprintf(1, buffer, strlen(buffer), function, strlen(function), 1, fmt, ap); if (msec >= 100) debug_printf(1, buffer, strlen(buffer), function, strlen(function), 0, " %d msec\n", msec); else { usec=(curr.tv_usec-last[level].tv_usec)+(curr.tv_sec-last[level].tv_sec)*1000*1000; debug_printf(1, buffer, strlen(buffer), function, strlen(function), 0, " %d.%d msec\n", usec/1000, usec%1000); } gettimeofday(&last[level], NULL); } else { gettimeofday(&curr, NULL); while (level < 10) last[level++]=curr; } va_end(ap); #endif /*_MSC_VER*/ } navit-0.5.0~svn5643+dfsg.1/navit/profile.h000066400000000000000000000023541221777731700201360ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PROFILE_H #define NAVIT_PROFILE_H #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #define __PRETTY_FUNCTION__ __FUNCTION__ #endif #define profile_str2(x) #x #define profile_str1(x) profile_str2(x) #define profile_module profile_str1(MODULE) #define profile(level,...) profile_timer(level,profile_module,__PRETTY_FUNCTION__,__VA_ARGS__) void profile_timer(int level, const char *module, const char *function, const char *fmt, ...); #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/profile_option.c000066400000000000000000000035031221777731700215160ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2012 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terpo of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "debug.h" #include "xmlconfig.h" struct profile_option { NAVIT_OBJECT }; static struct profile_option * profile_option_new(struct attr *parent, struct attr **attrs) { struct profile_option *po=g_new0(struct profile_option, 1); po->func=&profile_option_func; navit_object_ref((struct navit_object *)po); po->attrs=attr_list_dup(attrs); dbg(0,"return %p\n",po); return po; } static void profile_option_destroy(struct profile_option *po) { attr_list_free(po->attrs); g_free(po); } struct object_func profile_option_func = { attr_profile_option, (object_func_new)profile_option_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navit_object_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)profile_option_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/projection.c000066400000000000000000000052521221777731700206450ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "coord.h" #include "debug.h" #include "projection.h" struct projection_name { enum projection projection; char *name; }; struct projection_name projection_names[]={ {projection_none, ""}, {projection_mg, "mg"}, {projection_garmin, "garmin"}, {projection_utm, "utm"}, {projection_gk, "gk"}, }; static int utmref_letter(char l) { if (l < 'a' || l == 'i' || l == 'o') return -1; if (l < 'i') return l-'a'; if (l < 'o') return l-'a'-1; if (l <= 'z') return l-'a'-2; return -1; } enum projection projection_from_name(const char *name, struct coord *offset) { int i; int zone,baserow; char ns,zone_field,square_x,square_y; for (i=0 ; i < sizeof(projection_names)/sizeof(struct projection_name) ; i++) { if (! strcmp(projection_names[i].name, name)) return projection_names[i].projection; } if (offset) { if (sscanf(name,"utm%d%c",&zone,&ns) == 2 && zone > 0 && zone <= 60 && (ns == 'n' || ns == 's')) { offset->x=zone*1000000; offset->y=(ns == 's' ? -10000000:0); return projection_utm; } if (sscanf(name,"utmref%d%c%c%c",&zone,&zone_field,&square_x,&square_y)) { i=utmref_letter(zone_field); if (i < 2 || i > 21) { dbg(0,"invalid zone field '%c' in '%s'\n",zone_field,name); return projection_none; } i-=12; dbg(1,"zone_field %d\n",i); baserow=i*887.6/100; offset->x=zone*1000000; i=utmref_letter(square_x); offset->x+=((i%8)+1)*100000; i=utmref_letter(square_y); dbg(1,"baserow %d\n",baserow); if (!(zone % 2)) i-=5; dbg(1,"i=%d\n",i); i=(i-baserow+100)%20+baserow; offset->y=i*100000; return projection_utm; } } return projection_none; } char * projection_to_name(enum projection proj) { int i; for (i=0 ; i < sizeof(projection_names)/sizeof(struct projection_name) ; i++) { if (projection_names[i].projection == proj) return projection_names[i].name; } return NULL; } navit-0.5.0~svn5643+dfsg.1/navit/projection.h000066400000000000000000000022201221777731700206420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PROJECTION_H #define NAVIT_PROJECTION_H enum projection { projection_none, projection_mg, projection_garmin, projection_screen, projection_utm, projection_gk }; enum map_datum { map_datum_none, map_datum_wgs84, map_datum_dhdn }; struct coord; enum projection projection_from_name(const char *name, struct coord *offset); char * projection_to_name(enum projection proj); #endif navit-0.5.0~svn5643+dfsg.1/navit/roadprofile.c000066400000000000000000000063321221777731700207770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "roadprofile.h" static void roadprofile_set_attr_do(struct roadprofile *this, struct attr *attr) { switch (attr->type) { case attr_speed: this->speed=attr->u.num; break; case attr_maxspeed: this->maxspeed=attr->u.num; break; case attr_route_weight: this->route_weight=attr->u.num; break; default: break; } } struct roadprofile * roadprofile_new(struct attr *parent, struct attr **attrs) { struct roadprofile *this_; struct attr **attr; this_=g_new0(struct roadprofile, 1); this_->func=&roadprofile_func; navit_object_ref((struct navit_object *)this_); this_->attrs=attr_list_dup(attrs); for (attr=attrs;*attr; attr++) roadprofile_set_attr_do(this_, *attr); return this_; } int roadprofile_get_attr(struct roadprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int roadprofile_set_attr(struct roadprofile *this_, struct attr *attr) { roadprofile_set_attr_do(this_, attr); this_->attrs=attr_generic_set_attr(this_->attrs, attr); return 1; } int roadprofile_add_attr(struct roadprofile *this_, struct attr *attr) { this_->attrs=attr_generic_add_attr(this_->attrs, attr); return 1; } int roadprofile_remove_attr(struct roadprofile *this_, struct attr *attr) { this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; } struct attr_iter * roadprofile_attr_iter_new(void) { return (struct attr_iter *)g_new0(void *,1); } void roadprofile_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } static struct roadprofile * roadprofile_dup(struct roadprofile *this_) { struct roadprofile *ret=g_new(struct roadprofile, 1); *ret=*this_; ret->refcount=1; ret->attrs=attr_list_dup(this_->attrs); return ret; } static void roadprofile_destroy(struct roadprofile *this_) { attr_list_free(this_->attrs); g_free(this_); } struct object_func roadprofile_func = { attr_roadprofile, (object_func_new)roadprofile_new, (object_func_get_attr)roadprofile_get_attr, (object_func_iter_new)roadprofile_attr_iter_new, (object_func_iter_destroy)roadprofile_attr_iter_destroy, (object_func_set_attr)roadprofile_set_attr, (object_func_add_attr)roadprofile_add_attr, (object_func_remove_attr)roadprofile_remove_attr, (object_func_init)NULL, (object_func_destroy)roadprofile_destroy, (object_func_dup)roadprofile_dup, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/roadprofile.h000066400000000000000000000026401221777731700210020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { #endif struct roadprofile { NAVIT_OBJECT int speed; int route_weight; int maxspeed; }; struct roadprofile * roadprofile_new(struct attr *parent, struct attr **attrs); int roadprofile_get_attr(struct roadprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int roadprofile_set_attr(struct roadprofile *this_, struct attr *attr); int roadprofile_add_attr(struct roadprofile *this_, struct attr *attr); int roadprofile_remove_attr(struct roadprofile *this_, struct attr *attr); struct attr_iter *roadprofile_attr_iter_new(void); void roadprofile_attr_iter_destroy(struct attr_iter *iter); #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/route.c000066400000000000000000003317101221777731700176300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * @brief Contains code related to finding a route from a position to a destination * * Routing uses segments, points and items. Items are items from the map: Streets, highways, etc. * Segments represent such items, or parts of it. Generally, a segment is a driveable path. An item * can be represented by more than one segment - in that case it is "segmented". Each segment has an * "offset" associated, that indicates at which position in a segmented item this segment is - a * segment representing a not-segmented item always has the offset 1. * A point is located at the end of segments, often connecting several segments. * * The code in this file will make navit find a route between a position and a destination. * It accomplishes this by first building a "route graph". This graph contains segments and * points. * * After building this graph in route_graph_build(), the function route_graph_flood() assigns every * point and segment a "value" which represents the "costs" of traveling from this point to the * destination. This is done by Dijkstra's algorithm. * * When the graph is built a "route path" is created, which is a path in this graph from a given * position to the destination determined at time of building the graph. */ #include #include #include #include #if 0 #include #include #include #endif #include "navit_nls.h" #include "glib_slice.h" #include "config.h" #include "point.h" #include "graphics.h" #include "profile.h" #include "coord.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "route.h" #include "track.h" #include "transform.h" #include "plugin.h" #include "fib.h" #include "event.h" #include "callback.h" #include "vehicle.h" #include "vehicleprofile.h" #include "roadprofile.h" #include "debug.h" struct map_priv { struct route *route; }; int debug_route=0; /** * @brief A point in the route graph * * This represents a point in the route graph. A point usually connects two or more segments, * but there are also points which don't do that (e.g. at the end of a dead-end). */ struct route_graph_point { struct route_graph_point *hash_next; /**< Pointer to a chained hashlist of all route_graph_points with this hash */ struct route_graph_segment *start; /**< Pointer to a list of segments of which this point is the start. The links * of this linked-list are in route_graph_segment->start_next.*/ struct route_graph_segment *end; /**< Pointer to a list of segments of which this pointer is the end. The links * of this linked-list are in route_graph_segment->end_next. */ struct route_graph_segment *seg; /**< Pointer to the segment one should use to reach the destination at * least costs */ struct fibheap_el *el; /**< When this point is put on a Fibonacci heap, this is a pointer * to this point's heap-element */ int value; /**< The cost at which one can reach the destination from this point on */ struct coord c; /**< Coordinates of this point */ int flags; /**< Flags for this point (eg traffic distortion) */ }; #define RP_TRAFFIC_DISTORTION 1 #define RP_TURN_RESTRICTION 2 #define RP_TURN_RESTRICTION_RESOLVED 4 /** * @brief A segment in the route graph or path * * This is a segment in the route graph or path. A segment represents a driveable way. */ struct route_segment_data { struct item item; /**< The item (e.g. street) that this segment represents. */ int flags; int len; /**< Length of this segment */ /*NOTE: After a segment, various fields may follow, depending on what flags are set. Order of fields: 1.) maxspeed Maximum allowed speed on this segment. Present if AF_SPEED_LIMIT is set. 2.) offset If the item is segmented (i.e. represented by more than one segment), this indicates the position of this segment in the item. Present if AF_SEGMENTED is set. */ }; struct size_weight_limit { int width; int length; int height; int weight; int axle_weight; }; #define RSD_OFFSET(x) *((int *)route_segment_data_field_pos((x), attr_offset)) #define RSD_MAXSPEED(x) *((int *)route_segment_data_field_pos((x), attr_maxspeed)) #define RSD_SIZE_WEIGHT(x) *((struct size_weight_limit *)route_segment_data_field_pos((x), attr_vehicle_width)) #define RSD_DANGEROUS_GOODS(x) *((int *)route_segment_data_field_pos((x), attr_vehicle_dangerous_goods)) struct route_graph_segment_data { struct item *item; int offset; int flags; int len; int maxspeed; struct size_weight_limit size_weight; int dangerous_goods; }; /** * @brief A segment in the route graph * * This is a segment in the route graph. A segment represents a driveable way. */ struct route_graph_segment { struct route_graph_segment *next; /**< Linked-list pointer to a list of all route_graph_segments */ struct route_graph_segment *start_next; /**< Pointer to the next element in the list of segments that start at the * same point. Start of this list is in route_graph_point->start. */ struct route_graph_segment *end_next; /**< Pointer to the next element in the list of segments that end at the * same point. Start of this list is in route_graph_point->end. */ struct route_graph_point *start; /**< Pointer to the point this segment starts at. */ struct route_graph_point *end; /**< Pointer to the point this segment ends at. */ struct route_segment_data data; /**< The segment data */ }; /** * @brief A traffic distortion * * This is distortion in the traffic where you can't drive as fast as usual or have to wait for some time */ struct route_traffic_distortion { int maxspeed; /**< Maximum speed possible in km/h */ int delay; /**< Delay in tenths of seconds */ }; /** * @brief A segment in the route path * * This is a segment in the route path. */ struct route_path_segment { struct route_path_segment *next; /**< Pointer to the next segment in the path */ struct route_segment_data *data; /**< The segment data */ int direction; /**< Order in which the coordinates are ordered. >0 means "First * coordinate of the segment is the first coordinate of the item", <=0 * means reverse. */ unsigned ncoords; /**< How many coordinates does this segment have? */ struct coord c[0]; /**< Pointer to the ncoords coordinates of this segment */ /* WARNING: There will be coordinates following here, so do not create new fields after c! */ }; /** * @brief Usually represents a destination or position * * This struct usually represents a destination or position */ struct route_info { struct coord c; /**< The actual destination / position */ struct coord lp; /**< The nearest point on a street to c */ int pos; /**< The position of lp within the coords of the street */ int lenpos; /**< Distance between lp and the end of the street */ int lenneg; /**< Distance between lp and the start of the street */ int lenextra; /**< Distance between lp and c */ int percent; /**< ratio of lenneg to lenght of whole street in percent */ struct street_data *street; /**< The street lp is on */ int street_direction; /**< Direction of vehicle on street -1 = Negative direction, 1 = Positive direction, 0 = Unknown */ int dir; /**< Direction to take when following the route -1 = Negative direction, 1 = Positive direction */ }; /** * @brief A complete route path * * This structure describes a whole routing path */ struct route_path { int in_use; /**< The path is in use and can not be updated */ int update_required; /**< The path needs to be updated after it is no longer in use */ int updated; /**< The path has only been updated */ int path_time; /**< Time to pass the path */ int path_len; /**< Length of the path */ struct route_path_segment *path; /**< The first segment in the path, i.e. the segment one should * drive in next */ struct route_path_segment *path_last; /**< The last segment in the path */ /* XXX: path_hash is not necessery now */ struct item_hash *path_hash; /**< A hashtable of all the items represented by this route's segements */ struct route_path *next; /**< Next route path in case of intermediate destinations */ }; /** * @brief A complete route * * This struct holds all information about a route. */ struct route { struct mapset *ms; /**< The mapset this route is built upon */ unsigned flags; struct route_info *pos; /**< Current position within this route */ GList *destinations; /**< Destinations of the route */ int reached_destinations_count; /**< Used as base to calculate waypoint numbers */ struct route_info *current_dst; /**< Current destination */ struct route_graph *graph; /**< Pointer to the route graph */ struct route_path *path2; /**< Pointer to the route path */ struct map *map; struct map *graph_map; struct callback * route_graph_done_cb ; /**< Callback when route graph is done */ struct callback * route_graph_flood_done_cb ; /**< Callback when route graph flooding is done */ struct callback_list *cbl2; /**< Callback list to call when route changes */ int destination_distance; /**< Distance to the destination at which the destination is considered "reached" */ struct vehicleprofile *vehicleprofile; /**< Routing preferences */ int route_status; /**< Route Status */ int link_path; /**< Link paths over multiple waypoints together */ struct pcoord pc; struct vehicle *v; }; /** * @brief A complete route graph * * This structure describes a whole routing graph */ struct route_graph { int busy; /**< The graph is being built */ struct map_selection *sel; /**< The rectangle selection for the graph */ struct mapset_handle *h; /**< Handle to the mapset */ struct map *m; /**< Pointer to the currently active map */ struct map_rect *mr; /**< Pointer to the currently active map rectangle */ struct vehicleprofile *vehicleprofile; /**< The vehicle profile */ struct callback *idle_cb; /**< Idle callback to process the graph */ struct callback *done_cb; /**< Callback when graph is done */ struct event_idle *idle_ev; /**< The pointer to the idle event */ struct route_graph_segment *route_segments; /**< Pointer to the first route_graph_segment in the linked list of all segments */ struct route_graph_segment *avoid_seg; #define HASH_SIZE 8192 struct route_graph_point *hash[HASH_SIZE]; /**< A hashtable containing all route_graph_points in this graph */ }; #define HASHCOORD(c) ((((c)->x +(c)->y) * 2654435761UL) & (HASH_SIZE-1)) /** * @brief Iterator to iterate through all route graph segments in a route graph point * * This structure can be used to iterate through all route graph segments connected to a * route graph point. Use this with the rp_iterator_* functions. */ struct route_graph_point_iterator { struct route_graph_point *p; /**< The route graph point whose segments should be iterated */ int end; /**< Indicates if we have finished iterating through the "start" segments */ struct route_graph_segment *next; /**< The next segment to be returned */ }; struct attr_iter { union { GList *list; } u; }; static struct route_info * route_find_nearest_street(struct vehicleprofile *vehicleprofile, struct mapset *ms, struct pcoord *c); static struct route_graph_point *route_graph_get_point(struct route_graph *this, struct coord *c); static void route_graph_update(struct route *this, struct callback *cb, int async); static void route_graph_build_done(struct route_graph *rg, int cancel); static struct route_path *route_path_new(struct route_graph *this, struct route_path *oldpath, struct route_info *pos, struct route_info *dst, struct vehicleprofile *profile); static void route_process_street_graph(struct route_graph *this, struct item *item, struct vehicleprofile *profile); static void route_graph_destroy(struct route_graph *this); static void route_path_update(struct route *this, int cancel, int async); static int route_time_seg(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist); static void route_graph_flood(struct route_graph *this, struct route_info *dst, struct vehicleprofile *profile, struct callback *cb); static void route_graph_reset(struct route_graph *this); /** * @brief Returns the projection used for this route * * @param route The route to return the projection for * @return The projection used for this route */ static enum projection route_projection(struct route *route) { struct street_data *street; struct route_info *dst=route_get_dst(route); if (!route->pos && !dst) return projection_none; street = route->pos ? route->pos->street : dst->street; if (!street || !street->item.map) return projection_none; return map_projection(street->item.map); } /** * @brief Creates a new graph point iterator * * This function creates a new route graph point iterator, that can be used to * iterate through all segments connected to the point. * * @param p The route graph point to create the iterator from * @return A new iterator. */ static struct route_graph_point_iterator rp_iterator_new(struct route_graph_point *p) { struct route_graph_point_iterator it; it.p = p; if (p->start) { it.next = p->start; it.end = 0; } else { it.next = p->end; it.end = 1; } return it; } /** * @brief Gets the next segment connected to a route graph point from an iterator * * @param it The route graph point iterator to get the segment from * @return The next segment or NULL if there are no more segments */ static struct route_graph_segment *rp_iterator_next(struct route_graph_point_iterator *it) { struct route_graph_segment *ret; ret = it->next; if (!ret) { return NULL; } if (!it->end) { if (ret->start_next) { it->next = ret->start_next; } else { it->next = it->p->end; it->end = 1; } } else { it->next = ret->end_next; } return ret; } /** * @brief Checks if the last segment returned from a route_graph_point_iterator comes from the end * * @param it The route graph point iterator to be checked * @return 1 if the last segment returned comes from the end of the route graph point, 0 otherwise */ static int rp_iterator_end(struct route_graph_point_iterator *it) { if (it->end && (it->next != it->p->end)) { return 1; } else { return 0; } } static void route_path_get_distances(struct route_path *path, struct coord *c, int count, int *distances) { int i; for (i = 0 ; i < count ; i++) distances[i]=INT_MAX; while (path) { struct route_path_segment *seg=path->path; while (seg) { for (i = 0 ; i < count ; i++) { int dist=transform_distance_polyline_sq(seg->c, seg->ncoords, &c[i], NULL, NULL); if (dist < distances[i]) distances[i]=dist; } seg=seg->next; } path=path->next; } for (i = 0 ; i < count ; i++) { if (distances[i] != INT_MAX) distances[i]=sqrt(distances[i]); } } void route_get_distances(struct route *this, struct coord *c, int count, int *distances) { return route_path_get_distances(this->path2, c, count, distances); } /** * @brief Destroys a route_path * * @param this The route_path to be destroyed */ static void route_path_destroy(struct route_path *this, int recurse) { struct route_path_segment *c,*n; struct route_path *next; while (this) { next=this->next; if (this->path_hash) { item_hash_destroy(this->path_hash); this->path_hash=NULL; } c=this->path; while (c) { n=c->next; g_free(c); c=n; } this->in_use--; if (!this->in_use) g_free(this); if (!recurse) break; this=next; } } /** * @brief Creates a completely new route structure * * @param attrs Not used * @return The newly created route */ struct route * route_new(struct attr *parent, struct attr **attrs) { struct route *this=g_new0(struct route, 1); struct attr dest_attr; if (attr_generic_get_attr(attrs, NULL, attr_destination_distance, &dest_attr, NULL)) { this->destination_distance = dest_attr.u.num; } else { this->destination_distance = 50; // Default value } this->cbl2=callback_list_new(); return this; } /** * @brief Checks if a segment is part of a roundabout * * This function checks if a segment is part of a roundabout. * * @param seg The segment to be checked * @param level How deep to scan the route graph * @param direction Set this to 1 if we're entering the segment through its end, to 0 otherwise * @param origin Used internally, set to NULL * @return 1 If a roundabout was detected, 0 otherwise */ static int route_check_roundabout(struct route_graph_segment *seg, int level, int direction, struct route_graph_segment *origin) { struct route_graph_point_iterator it,it2; struct route_graph_segment *cur; int count=0; if (!level) { return 0; } if (!direction && !(seg->data.flags & AF_ONEWAY)) { return 0; } if (direction && !(seg->data.flags & AF_ONEWAYREV)) { return 0; } if (seg->data.flags & AF_ROUNDABOUT_VALID) return 0; if (!origin) { origin = seg; } if (!direction) { it = rp_iterator_new(seg->end); } else { it = rp_iterator_new(seg->start); } it2=it; while ((cur = rp_iterator_next(&it2))) count++; if (count > 3) return 0; cur = rp_iterator_next(&it); while (cur) { if (cur == seg) { cur = rp_iterator_next(&it); continue; } if (cur->data.item.type != origin->data.item.type) { // This street is of another type, can't be part of the roundabout cur = rp_iterator_next(&it); continue; } if (cur == origin) { seg->data.flags |= AF_ROUNDABOUT; return 1; } if (route_check_roundabout(cur, (level-1), rp_iterator_end(&it), origin)) { seg->data.flags |= AF_ROUNDABOUT; return 1; } cur = rp_iterator_next(&it); } return 0; } /** * @brief Sets the mapset of the route passwd * * @param this The route to set the mapset for * @param ms The mapset to set for this route */ void route_set_mapset(struct route *this, struct mapset *ms) { this->ms=ms; } /** * @brief Sets the vehicle profile of a route * * @param this The route to set the profile for * @param prof The vehicle profile */ void route_set_profile(struct route *this, struct vehicleprofile *prof) { if (this->vehicleprofile != prof) { int dest_count = g_list_length(this->destinations); struct pcoord *pc; this->vehicleprofile = prof; pc = g_alloca(dest_count*sizeof(struct pcoord)); route_get_destinations(this, pc, dest_count); route_set_destinations(this, pc, dest_count, 1); } } /** * @brief Returns the mapset of the route passed * * @param this The route to get the mapset of * @return The mapset of the route passed */ struct mapset * route_get_mapset(struct route *this) { return this->ms; } /** * @brief Returns the current position within the route passed * * @param this The route to get the position for * @return The position within the route passed */ struct route_info * route_get_pos(struct route *this) { return this->pos; } /** * @brief Returns the destination of the route passed * * @param this The route to get the destination for * @return The destination of the route passed */ struct route_info * route_get_dst(struct route *this) { struct route_info *dst=NULL; if (this->destinations) dst=g_list_last(this->destinations)->data; return dst; } /** * @brief Checks if the path is calculated for the route passed * * @param this The route to check * @return True if the path is calculated, false if not */ int route_get_path_set(struct route *this) { return this->path2 != NULL; } /** * @brief Checks if the route passed contains a certain item within the route path * * This function checks if a certain items exists in the path that navit will guide * the user to his destination. It does *not* check if this item exists in the route * graph! * * @param this The route to check for this item * @param item The item to search for * @return True if the item was found, false if the item was not found or the route was not calculated */ int route_contains(struct route *this, struct item *item) { if (! this->path2 || !this->path2->path_hash) return 0; if (item_hash_lookup(this->path2->path_hash, item)) return 1; if (! this->pos || !this->pos->street) return 0; return item_is_equal(this->pos->street->item, *item); } static struct route_info * route_next_destination(struct route *this) { if (!this->destinations) return NULL; return this->destinations->data; } /** * @brief Checks if a route has reached its destination * * @param this The route to be checked * @return True if the destination is "reached", false otherwise. */ int route_destination_reached(struct route *this) { struct street_data *sd = NULL; enum projection pro; struct route_info *dst=route_next_destination(this); if (!this->pos) return 0; if (!dst) return 0; sd = this->pos->street; if (!this->path2) { return 0; } if (!item_is_equal(this->pos->street->item, dst->street->item)) { return 0; } if ((sd->flags & AF_ONEWAY) && (this->pos->lenneg >= dst->lenneg)) { // We would have to drive against the one-way road return 0; } if ((sd->flags & AF_ONEWAYREV) && (this->pos->lenpos >= dst->lenpos)) { return 0; } pro=route_projection(this); if (pro == projection_none) return 0; if (transform_distance(pro, &this->pos->c, &dst->lp) > this->destination_distance) { return 0; } if (g_list_next(this->destinations)) return 1; else return 2; } static struct route_info * route_previous_destination(struct route *this) { GList *l=g_list_find(this->destinations, this->current_dst); if (!l) return this->pos; l=g_list_previous(l); if (!l) return this->pos; return l->data; } static void route_path_update_done(struct route *this, int new_graph) { struct route_path *oldpath=this->path2; struct attr route_status; struct route_info *prev_dst; route_status.type=attr_route_status; if (this->path2 && (this->path2->in_use>1)) { this->path2->update_required=1+new_graph; return; } route_status.u.num=route_status_building_path; route_set_attr(this, &route_status); prev_dst=route_previous_destination(this); if (this->link_path) { this->path2=route_path_new(this->graph, NULL, prev_dst, this->current_dst, this->vehicleprofile); if (this->path2) this->path2->next=oldpath; else route_path_destroy(oldpath,0); } else { this->path2=route_path_new(this->graph, oldpath, prev_dst, this->current_dst, this->vehicleprofile); if (oldpath && this->path2) { this->path2->next=oldpath->next; route_path_destroy(oldpath,0); } } if (this->path2) { struct route_path_segment *seg=this->path2->path; int path_time=0,path_len=0; while (seg) { /* FIXME */ int seg_time=route_time_seg(this->vehicleprofile, seg->data, NULL); if (seg_time == INT_MAX) { dbg(1,"error\n"); } else path_time+=seg_time; path_len+=seg->data->len; seg=seg->next; } this->path2->path_time=path_time; this->path2->path_len=path_len; if (prev_dst != this->pos) { this->link_path=1; this->current_dst=prev_dst; route_graph_reset(this->graph); route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, this->route_graph_flood_done_cb); return; } if (!new_graph && this->path2->updated) route_status.u.num=route_status_path_done_incremental; else route_status.u.num=route_status_path_done_new; } else route_status.u.num=route_status_not_found; this->link_path=0; route_set_attr(this, &route_status); } /** * @brief Updates the route graph and the route path if something changed with the route * * This will update the route graph and the route path of the route if some of the * route's settings (destination, position) have changed. * * @attention For this to work the route graph has to be destroyed if the route's * @attention destination is changed somewhere! * * @param this The route to update */ static void route_path_update(struct route *this, int cancel, int async) { dbg(1,"enter %d\n", cancel); if (! this->pos || ! this->destinations) { dbg(1,"destroy\n"); route_path_destroy(this->path2,1); this->path2 = NULL; return; } if (cancel) { route_graph_destroy(this->graph); this->graph=NULL; } /* the graph is destroyed when setting the destination */ if (this->graph) { if (this->graph->busy) { dbg(1,"busy building graph\n"); return; } // we can try to update dbg(1,"try update\n"); route_path_update_done(this, 0); } else { route_path_destroy(this->path2,1); this->path2 = NULL; } if (!this->graph || !this->path2) { dbg(1,"rebuild graph\n"); if (! this->route_graph_flood_done_cb) this->route_graph_flood_done_cb=callback_new_2(callback_cast(route_path_update_done), this, (long)1); dbg(1,"route_graph_update\n"); route_graph_update(this, this->route_graph_flood_done_cb, async); } } /** * @brief This will calculate all the distances stored in a route_info * * @param ri The route_info to calculate the distances for * @param pro The projection used for this route */ static void route_info_distances(struct route_info *ri, enum projection pro) { int npos=ri->pos+1; struct street_data *sd=ri->street; /* 0 1 2 X 3 4 5 6 pos=2 npos=3 count=7 0,1,2 3,4,5,6*/ ri->lenextra=transform_distance(pro, &ri->lp, &ri->c); ri->lenneg=transform_polyline_length(pro, sd->c, npos)+transform_distance(pro, &sd->c[ri->pos], &ri->lp); ri->lenpos=transform_polyline_length(pro, sd->c+npos, sd->count-npos)+transform_distance(pro, &sd->c[npos], &ri->lp); if (ri->lenneg || ri->lenpos) ri->percent=(ri->lenneg*100)/(ri->lenneg+ri->lenpos); else ri->percent=50; } /** * @brief This sets the current position of the route passed * * This will set the current position of the route passed to the street that is nearest to the * passed coordinates. It also automatically updates the route. * * @param this The route to set the position of * @param pos Coordinates to set as position */ void route_set_position(struct route *this, struct pcoord *pos) { if (this->pos) route_info_free(this->pos); this->pos=NULL; this->pos=route_find_nearest_street(this->vehicleprofile, this->ms, pos); // If there is no nearest street, bail out. if (!this->pos) return; this->pos->street_direction=0; dbg(1,"this->pos=%p\n", this->pos); route_info_distances(this->pos, pos->pro); route_path_update(this, 0, 1); } /** * @brief Sets a route's current position based on coordinates from tracking * * @param this The route to set the current position of * @param tracking The tracking to get the coordinates from */ void route_set_position_from_tracking(struct route *this, struct tracking *tracking, enum projection pro) { struct coord *c; struct route_info *ret; struct street_data *sd; dbg(2,"enter\n"); c=tracking_get_pos(tracking); ret=g_new0(struct route_info, 1); if (!ret) { printf("%s:Out of memory\n", __FUNCTION__); return; } if (this->pos) route_info_free(this->pos); this->pos=NULL; ret->c=*c; ret->lp=*c; ret->pos=tracking_get_segment_pos(tracking); ret->street_direction=tracking_get_street_direction(tracking); sd=tracking_get_street_data(tracking); if (sd) { ret->street=street_data_dup(sd); route_info_distances(ret, pro); } dbg(3,"position 0x%x,0x%x item 0x%x,0x%x direction %d pos %d lenpos %d lenneg %d\n",c->x,c->y,sd?sd->item.id_hi:0,sd?sd->item.id_lo:0,ret->street_direction,ret->pos,ret->lenpos,ret->lenneg); dbg(3,"c->x=0x%x, c->y=0x%x pos=%d item=(0x%x,0x%x)\n", c->x, c->y, ret->pos, ret->street?ret->street->item.id_hi:0, ret->street?ret->street->item.id_lo:0); dbg(3,"street 0=(0x%x,0x%x) %d=(0x%x,0x%x)\n", ret->street?ret->street->c[0].x:0, ret->street?ret->street->c[0].y:0, ret->street?ret->street->count-1:0, ret->street?ret->street->c[ret->street->count-1].x:0, ret->street?ret->street->c[ret->street->count-1].y:0); this->pos=ret; if (this->destinations) route_path_update(this, 0, 1); dbg(2,"ret\n"); } /* Used for debuging of route_rect, what routing sees */ struct map_selection *route_selection; /** * @brief Returns a single map selection */ struct map_selection * route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs) { int dx,dy,sx=1,sy=1,d,m; struct map_selection *sel=g_new(struct map_selection, 1); if (!sel) { printf("%s:Out of memory\n", __FUNCTION__); return sel; } sel->order=order; sel->range.min=route_item_first; sel->range.max=route_item_last; dbg(1,"%p %p\n", c1, c2); dx=c1->x-c2->x; dy=c1->y-c2->y; if (dx < 0) { sx=-1; sel->u.c_rect.lu.x=c1->x; sel->u.c_rect.rl.x=c2->x; } else { sel->u.c_rect.lu.x=c2->x; sel->u.c_rect.rl.x=c1->x; } if (dy < 0) { sy=-1; sel->u.c_rect.lu.y=c2->y; sel->u.c_rect.rl.y=c1->y; } else { sel->u.c_rect.lu.y=c1->y; sel->u.c_rect.rl.y=c2->y; } if (dx*sx > dy*sy) d=dx*sx; else d=dy*sy; m=d*rel/100+abs; sel->u.c_rect.lu.x-=m; sel->u.c_rect.rl.x+=m; sel->u.c_rect.lu.y+=m; sel->u.c_rect.rl.y-=m; sel->next=NULL; return sel; } /** * @brief Appends a map selection to the selection list. Selection list may be NULL. */ static struct map_selection * route_rect_add(struct map_selection *sel, int order, struct coord *c1, struct coord *c2, int rel, int abs) { struct map_selection *ret; ret=route_rect(order, c1, c2, rel, abs); ret->next=sel; return ret; } /** * @brief Returns a list of map selections useable to create a route graph * * Returns a list of map selections useable to get a map rect from which items can be * retrieved to build a route graph. * * @param c Array containing route points, including start, intermediate and destination ones. * @param count number of route points * @param proifle vehicleprofile */ static struct map_selection * route_calc_selection(struct coord *c, int count, struct vehicleprofile *profile) { struct map_selection *ret=NULL; int i; struct coord_rect r; char *depth, *str, *tok; if (!count) return NULL; r.lu=c[0]; r.rl=c[0]; for (i = 1 ; i < count ; i++) coord_rect_extend(&r, &c[i]); depth=profile->route_depth; if (!depth) depth="4:25%,8:40000,18:10000"; depth=str=g_strdup(depth); while((tok=strtok(str,","))!=NULL) { int order=0, dist=0; sscanf(tok,"%d:%d",&order,&dist); if(strchr(tok,'%')) ret=route_rect_add(ret, order, &r.lu, &r.rl, dist, 0); else for (i = 0 ; i < count ; i++) { ret=route_rect_add(ret, order, &c[i], &c[i], 0, dist); } str=NULL; } g_free(depth); return ret; } /** * @brief Destroys a list of map selections * * @param sel Start of the list to be destroyed */ static void route_free_selection(struct map_selection *sel) { struct map_selection *next; while (sel) { next=sel->next; g_free(sel); sel=next; } } static void route_clear_destinations(struct route *this_) { g_list_foreach(this_->destinations, (GFunc)route_info_free, NULL); g_list_free(this_->destinations); this_->destinations=NULL; } /** * @brief Sets the destination of a route * * This sets the destination of a route to the street nearest to the coordinates passed * and updates the route. * * @param this The route to set the destination for * @param dst Coordinates to set as destination * @param count: Number of destinations (last one is final) * @param async: If set, do routing asynchronously */ void route_set_destinations(struct route *this, struct pcoord *dst, int count, int async) { struct attr route_status; struct route_info *dsti; int i; route_status.type=attr_route_status; profile(0,NULL); route_clear_destinations(this); if (dst && count) { for (i = 0 ; i < count ; i++) { dsti=route_find_nearest_street(this->vehicleprofile, this->ms, &dst[i]); if(dsti) { route_info_distances(dsti, dst->pro); this->destinations=g_list_append(this->destinations, dsti); } } route_status.u.num=route_status_destination_set; } else { this->reached_destinations_count=0; route_status.u.num=route_status_no_destination; } callback_list_call_attr_1(this->cbl2, attr_destination, this); route_set_attr(this, &route_status); profile(1,"find_nearest_street"); /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ route_graph_destroy(this->graph); this->graph=NULL; this->current_dst=route_get_dst(this); route_path_update(this, 1, async); profile(0,"end"); } int route_get_destinations(struct route *this, struct pcoord *pc, int count) { int ret=0; GList *l=this->destinations; while (l && ret < count) { struct route_info *dst=l->data; pc->x=dst->c.x; pc->y=dst->c.y; pc->pro=projection_mg; /* FIXME */ pc++; ret++; l=g_list_next(l); } return ret; } /** * @brief Get the destinations count for the route * * @param this The route instance * @return destination count for the route */ int route_get_destination_count(struct route *this) { return g_list_length(this->destinations); } /** * @brief Returns a description for a waypoint as (type or street_name_systematic) + (label or WayID[osm_wayid]) * * @param this The route instance * @param n The nth waypoint * @return The description */ char* route_get_destination_description(struct route *this, int n) { struct route_info *dst; struct map_rect *mr=NULL; struct item *item; struct attr attr; char *type=NULL; char *label=NULL; char *desc=NULL; if(!this->destinations) return NULL; dst=g_list_nth_data(this->destinations,n); mr=map_rect_new(dst->street->item.map, NULL); item = map_rect_get_item_byid(mr, dst->street->item.id_hi, dst->street->item.id_lo); type=g_strdup(item_to_name(dst->street->item.type)); while(item_attr_get(item, attr_any, &attr)) { if (attr.type==attr_street_name_systematic ){ g_free(type); type=attr_to_text(&attr, item->map, 1); } else if (attr.type==attr_label){ g_free(label); label=attr_to_text(&attr, item->map, 1); } else if (attr.type==attr_osm_wayid && !label){ char *tmp=attr_to_text(&attr, item->map, 1); label=g_strdup_printf("WayID %s", tmp); g_free(tmp); } } if(!label && !type) { desc=g_strdup(_("unknown street")); } else if (!label || strcmp(type, label)==0){ desc=g_strdup(type); } else { desc=g_strdup_printf("%s %s", type, label); } g_free(label); g_free(type); if (mr) map_rect_destroy(mr); return desc; } /** * @brief Start a route given set of coordinates * * @param this The route instance * @param c The coordinate to start routing to * @param async 1 for async * @return nothing */ void route_set_destination(struct route *this, struct pcoord *dst, int async) { route_set_destinations(this, dst, dst?1:0, async); } /** * @brief Append a waypoint to the route. * * This appends a waypoint to the current route, targetting the street * nearest to the coordinates passed, and updates the route. * * @param this The route to set the destination for * @param dst Coordinates of the new waypoint * @param async: If set, do routing asynchronously */ void route_append_destination(struct route *this, struct pcoord *dst, int async) { if (dst){ struct route_info *dsti; dsti=route_find_nearest_street(this->vehicleprofile, this->ms, &dst[0]); if(dsti) { route_info_distances(dsti, dst->pro); this->destinations=g_list_append(this->destinations, dsti); } /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ route_graph_destroy(this->graph); this->graph=NULL; this->current_dst=route_get_dst(this); route_path_update(this, 1, async); }else{ route_set_destinations(this, NULL, 0, async); } } /** * @brief Remove the nth waypoint of the route * * @param this The route instance * @param n The waypoint to remove * @return nothing */ void route_remove_nth_waypoint(struct route *this, int n) { struct route_info *ri=g_list_nth_data(this->destinations, n); this->destinations=g_list_remove(this->destinations,ri); route_info_free(ri); /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ route_graph_destroy(this->graph); this->graph=NULL; this->current_dst=route_get_dst(this); route_path_update(this, 1, 1); } void route_remove_waypoint(struct route *this) { if (this->path2) { struct route_path *path = this->path2; struct route_info *ri = this->destinations->data; this->destinations = g_list_remove(this->destinations, ri); route_info_free(ri); this->path2 = this->path2->next; route_path_destroy(path, 0); if (!this->destinations) { this->route_status=route_status_no_destination; this->reached_destinations_count=0; return; } this->reached_destinations_count++; route_graph_reset(this->graph); this->current_dst = this->destinations->data; route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, this->route_graph_flood_done_cb); } } /** * @brief Gets the route_graph_point with the specified coordinates * * @param this The route in which to search * @param c Coordinates to search for * @param last The last route graph point returned to iterate over multiple points with the same coordinates * @return The point at the specified coordinates or NULL if not found */ static struct route_graph_point * route_graph_get_point_next(struct route_graph *this, struct coord *c, struct route_graph_point *last) { struct route_graph_point *p; int seen=0,hashval=HASHCOORD(c); p=this->hash[hashval]; while (p) { if (p->c.x == c->x && p->c.y == c->y) { if (!last || seen) return p; if (p == last) seen=1; } p=p->hash_next; } return NULL; } static struct route_graph_point * route_graph_get_point(struct route_graph *this, struct coord *c) { return route_graph_get_point_next(this, c, NULL); } /** * @brief Gets the last route_graph_point with the specified coordinates * * @param this The route in which to search * @param c Coordinates to search for * @return The point at the specified coordinates or NULL if not found */ static struct route_graph_point * route_graph_get_point_last(struct route_graph *this, struct coord *c) { struct route_graph_point *p,*ret=NULL; int hashval=HASHCOORD(c); p=this->hash[hashval]; while (p) { if (p->c.x == c->x && p->c.y == c->y) ret=p; p=p->hash_next; } return ret; } /** * @brief Create a new point for the route graph with the specified coordinates * * @param this The route to insert the point into * @param f The coordinates at which the point should be created * @return The point created */ static struct route_graph_point * route_graph_point_new(struct route_graph *this, struct coord *f) { int hashval; struct route_graph_point *p; hashval=HASHCOORD(f); if (debug_route) printf("p (0x%x,0x%x)\n", f->x, f->y); p=g_slice_new0(struct route_graph_point); p->hash_next=this->hash[hashval]; this->hash[hashval]=p; p->value=INT_MAX; p->c=*f; return p; } /** * @brief Inserts a point into the route graph at the specified coordinates * * This will insert a point into the route graph at the coordinates passed in f. * Note that the point is not yet linked to any segments. * * @param this The route to insert the point into * @param f The coordinates at which the point should be inserted * @return The point inserted or NULL on failure */ static struct route_graph_point * route_graph_add_point(struct route_graph *this, struct coord *f) { struct route_graph_point *p; p=route_graph_get_point(this,f); if (!p) p=route_graph_point_new(this,f); return p; } /** * @brief Frees all the memory used for points in the route graph passed * * @param this The route graph to delete all points from */ static void route_graph_free_points(struct route_graph *this) { struct route_graph_point *curr,*next; int i; for (i = 0 ; i < HASH_SIZE ; i++) { curr=this->hash[i]; while (curr) { next=curr->hash_next; g_slice_free(struct route_graph_point, curr); curr=next; } this->hash[i]=NULL; } } /** * @brief Resets all nodes * * @param this The route graph to reset */ static void route_graph_reset(struct route_graph *this) { struct route_graph_point *curr; int i; for (i = 0 ; i < HASH_SIZE ; i++) { curr=this->hash[i]; while (curr) { curr->value=INT_MAX; curr->seg=NULL; curr->el=NULL; curr=curr->hash_next; } } } /** * @brief Returns the position of a certain field appended to a route graph segment * * This function returns a pointer to a field that is appended to a route graph * segment. * * @param seg The route graph segment the field is appended to * @param type Type of the field that should be returned * @return A pointer to a field of a certain type, or NULL if no such field is present */ static void * route_segment_data_field_pos(struct route_segment_data *seg, enum attr_type type) { unsigned char *ptr; ptr = ((unsigned char*)seg) + sizeof(struct route_segment_data); if (seg->flags & AF_SPEED_LIMIT) { if (type == attr_maxspeed) return (void*)ptr; ptr += sizeof(int); } if (seg->flags & AF_SEGMENTED) { if (type == attr_offset) return (void*)ptr; ptr += sizeof(int); } if (seg->flags & AF_SIZE_OR_WEIGHT_LIMIT) { if (type == attr_vehicle_width) return (void*)ptr; ptr += sizeof(struct size_weight_limit); } if (seg->flags & AF_DANGEROUS_GOODS) { if (type == attr_vehicle_dangerous_goods) return (void*)ptr; ptr += sizeof(int); } return NULL; } /** * @brief Calculates the size of a route_segment_data struct with given flags * * @param flags The flags of the route_segment_data */ static int route_segment_data_size(int flags) { int ret=sizeof(struct route_segment_data); if (flags & AF_SPEED_LIMIT) ret+=sizeof(int); if (flags & AF_SEGMENTED) ret+=sizeof(int); if (flags & AF_SIZE_OR_WEIGHT_LIMIT) ret+=sizeof(struct size_weight_limit); if (flags & AF_DANGEROUS_GOODS) ret+=sizeof(int); return ret; } static int route_graph_segment_is_duplicate(struct route_graph_point *start, struct route_graph_segment_data *data) { struct route_graph_segment *s; s=start->start; while (s) { if (item_is_equal(*data->item, s->data.item)) { if (data->flags & AF_SEGMENTED) { if (RSD_OFFSET(&s->data) == data->offset) { return 1; } } else return 1; } s=s->start_next; } return 0; } /** * @brief Inserts a new segment into the route graph * * This function performs a check if a segment for the item specified already exists, and inserts * a new segment representing this item if it does not. * * @param this The route graph to insert the segment into * @param start The graph point which should be connected to the start of this segment * @param end The graph point which should be connected to the end of this segment * @param len The length of this segment * @param item The item that is represented by this segment * @param flags Flags for this segment * @param offset If the item passed in "item" is segmented (i.e. divided into several segments), this indicates the position of this segment within the item * @param maxspeed The maximum speed allowed on this segment in km/h. -1 if not known. */ static void route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, struct route_graph_point *end, struct route_graph_segment_data *data) { struct route_graph_segment *s; int size; size = sizeof(struct route_graph_segment)-sizeof(struct route_segment_data)+route_segment_data_size(data->flags); s = g_slice_alloc0(size); if (!s) { printf("%s:Out of memory\n", __FUNCTION__); return; } s->start=start; s->start_next=start->start; start->start=s; s->end=end; s->end_next=end->end; end->end=s; dbg_assert(data->len >= 0); s->data.len=data->len; s->data.item=*data->item; s->data.flags=data->flags; if (data->flags & AF_SPEED_LIMIT) RSD_MAXSPEED(&s->data)=data->maxspeed; if (data->flags & AF_SEGMENTED) RSD_OFFSET(&s->data)=data->offset; if (data->flags & AF_SIZE_OR_WEIGHT_LIMIT) RSD_SIZE_WEIGHT(&s->data)=data->size_weight; if (data->flags & AF_DANGEROUS_GOODS) RSD_DANGEROUS_GOODS(&s->data)=data->dangerous_goods; s->next=this->route_segments; this->route_segments=s; if (debug_route) printf("l (0x%x,0x%x)-(0x%x,0x%x)\n", start->c.x, start->c.y, end->c.x, end->c.y); } /** * @brief Gets all the coordinates of an item * * This will get all the coordinates of the item i and return them in c, * up to max coordinates. Additionally it is possible to limit the coordinates * returned to all the coordinates of the item between the two coordinates * start end end. * * @important Make sure that whatever c points to has enough memory allocated * @important to hold max coordinates! * * @param i The item to get the coordinates of * @param c Pointer to memory allocated for holding the coordinates * @param max Maximum number of coordinates to return * @param start First coordinate to get * @param end Last coordinate to get * @return The number of coordinates returned */ static int get_item_seg_coords(struct item *i, struct coord *c, int max, struct coord *start, struct coord *end) { struct map_rect *mr; struct item *item; int rc = 0, p = 0; struct coord c1; mr=map_rect_new(i->map, NULL); if (!mr) return 0; item = map_rect_get_item_byid(mr, i->id_hi, i->id_lo); if (item) { rc = item_coord_get(item, &c1, 1); while (rc && (c1.x != start->x || c1.y != start->y)) { rc = item_coord_get(item, &c1, 1); } while (rc && p < max) { c[p++] = c1; if (c1.x == end->x && c1.y == end->y) break; rc = item_coord_get(item, &c1, 1); } } map_rect_destroy(mr); return p; } /** * @brief Returns and removes one segment from a path * * @param path The path to take the segment from * @param item The item whose segment to remove * @param offset Offset of the segment within the item to remove. If the item is not segmented this should be 1. * @return The segment removed */ static struct route_path_segment * route_extract_segment_from_path(struct route_path *path, struct item *item, int offset) { int soffset; struct route_path_segment *sp = NULL, *s; s = path->path; while (s) { if (item_is_equal(s->data->item,*item)) { if (s->data->flags & AF_SEGMENTED) soffset=RSD_OFFSET(s->data); else soffset=1; if (soffset == offset) { if (sp) { sp->next = s->next; break; } else { path->path = s->next; break; } } } sp = s; s = s->next; } if (s) item_hash_remove(path->path_hash, item); return s; } /** * @brief Adds a segment and the end of a path * * @param this The path to add the segment to * @param segment The segment to add */ static void route_path_add_segment(struct route_path *this, struct route_path_segment *segment) { if (!this->path) this->path=segment; if (this->path_last) this->path_last->next=segment; this->path_last=segment; } /** * @brief Adds a two coordinate line to a path * * This adds a new line to a path, creating a new segment for it. * * @param this The path to add the item to * @param start coordinate to add to the start of the item. If none should be added, make this NULL. * @param end coordinate to add to the end of the item. If none should be added, make this NULL. * @param len The length of the item */ static void route_path_add_line(struct route_path *this, struct coord *start, struct coord *end, int len) { int ccnt=2; struct route_path_segment *segment; int seg_size,seg_dat_size; dbg(1,"line from 0x%x,0x%x-0x%x,0x%x\n", start->x, start->y, end->x, end->y); seg_size=sizeof(*segment) + sizeof(struct coord) * ccnt; seg_dat_size=sizeof(struct route_segment_data); segment=g_malloc0(seg_size + seg_dat_size); segment->data=(struct route_segment_data *)((char *)segment+seg_size); segment->ncoords=ccnt; segment->direction=0; segment->c[0]=*start; segment->c[1]=*end; segment->data->len=len; route_path_add_segment(this, segment); } /** * @brief Inserts a new item into the path * * This function does almost the same as "route_path_add_item()", but identifies * the item to add by a segment from the route graph. Another difference is that it "copies" the * segment from the route graph, i.e. if the item is segmented, only the segment passed in rgs will * be added to the route path, not all segments of the item. * * The function can be sped up by passing an old path already containing this segment in oldpath - * the segment will then be extracted from this old path. Please note that in this case the direction * parameter has no effect. * * @param this The path to add the item to * @param oldpath Old path containing the segment to be added. Speeds up the function, but can be NULL. * @param rgs Segment of the route graph that should be "copied" to the route path * @param dir Order in which to add the coordinates. See route_path_add_item() * @param pos Information about start point if this is the first segment * @param dst Information about end point if this is the last segment */ static int route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpath, struct route_graph_segment *rgs, int dir, struct route_info *pos, struct route_info *dst) { struct route_path_segment *segment=NULL; int i, ccnt, extra=0, ret=0; struct coord *c,*cd,ca[2048]; int offset=1; int seg_size,seg_dat_size; int len=rgs->data.len; if (rgs->data.flags & AF_SEGMENTED) offset=RSD_OFFSET(&rgs->data); dbg(1,"enter (0x%x,0x%x) dir=%d pos=%p dst=%p\n", rgs->data.item.id_hi, rgs->data.item.id_lo, dir, pos, dst); if (oldpath) { segment=item_hash_lookup(oldpath->path_hash, &rgs->data.item); if (segment && segment->direction == dir) { segment = route_extract_segment_from_path(oldpath, &rgs->data.item, offset); if (segment) { ret=1; if (!pos) goto linkold; } g_free(segment); } } if (pos) { if (dst) { extra=2; if (dst->lenneg >= pos->lenneg) { dir=1; ccnt=dst->pos-pos->pos; c=pos->street->c+pos->pos+1; len=dst->lenneg-pos->lenneg; } else { dir=-1; ccnt=pos->pos-dst->pos; c=pos->street->c+dst->pos+1; len=pos->lenneg-dst->lenneg; } } else { extra=1; dbg(1,"pos dir=%d\n", dir); dbg(1,"pos pos=%d\n", pos->pos); dbg(1,"pos count=%d\n", pos->street->count); if (dir > 0) { c=pos->street->c+pos->pos+1; ccnt=pos->street->count-pos->pos-1; len=pos->lenpos; } else { c=pos->street->c; ccnt=pos->pos+1; len=pos->lenneg; } } pos->dir=dir; } else if (dst) { extra=1; dbg(1,"dst dir=%d\n", dir); dbg(1,"dst pos=%d\n", dst->pos); if (dir > 0) { c=dst->street->c; ccnt=dst->pos+1; len=dst->lenpos; } else { c=dst->street->c+dst->pos+1; ccnt=dst->street->count-dst->pos-1; len=dst->lenneg; } } else { ccnt=get_item_seg_coords(&rgs->data.item, ca, 2047, &rgs->start->c, &rgs->end->c); c=ca; } seg_size=sizeof(*segment) + sizeof(struct coord) * (ccnt + extra); seg_dat_size=route_segment_data_size(rgs->data.flags); segment=g_malloc0(seg_size + seg_dat_size); segment->data=(struct route_segment_data *)((char *)segment+seg_size); segment->direction=dir; cd=segment->c; if (pos && (c[0].x != pos->lp.x || c[0].y != pos->lp.y)) *cd++=pos->lp; if (dir < 0) c+=ccnt-1; for (i = 0 ; i < ccnt ; i++) { *cd++=*c; c+=dir; } segment->ncoords+=ccnt; if (dst && (cd[-1].x != dst->lp.x || cd[-1].y != dst->lp.y)) *cd++=dst->lp; segment->ncoords=cd-segment->c; if (segment->ncoords <= 1) { g_free(segment); return 1; } /* We check if the route graph segment is part of a roundabout here, because this * only matters for route graph segments which form parts of the route path */ if (!(rgs->data.flags & AF_ROUNDABOUT)) { // We identified this roundabout earlier route_check_roundabout(rgs, 13, (dir < 1), NULL); } memcpy(segment->data, &rgs->data, seg_dat_size); linkold: segment->data->len=len; segment->next=NULL; item_hash_insert(this->path_hash, &rgs->data.item, segment); route_path_add_segment(this, segment); return ret; } /** * @brief Destroys all segments of a route graph * * @param this The graph to destroy all segments from */ static void route_graph_free_segments(struct route_graph *this) { struct route_graph_segment *curr,*next; int size; curr=this->route_segments; while (curr) { next=curr->next; size = sizeof(struct route_graph_segment)-sizeof(struct route_segment_data)+route_segment_data_size(curr->data.flags); g_slice_free1(size, curr); curr=next; } this->route_segments=NULL; } /** * @brief Destroys a route graph * * @param this The route graph to be destroyed */ static void route_graph_destroy(struct route_graph *this) { if (this) { route_graph_build_done(this, 1); route_graph_free_points(this); route_graph_free_segments(this); g_free(this); } } /** * @brief Returns the estimated speed on a segment * * This function returns the estimated speed to be driven on a segment, 0=not passable * * @param profile The routing preferences * @param over The segment which is passed * @param dist A traffic distortion if applicable * @return The estimated speed */ static int route_seg_speed(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist) { struct roadprofile *roadprofile=vehicleprofile_get_roadprofile(profile, over->item.type); int speed,maxspeed; if (!roadprofile || !roadprofile->route_weight) return 0; /* maxspeed_handling: 0=always, 1 only if maxspeed restricts the speed, 2 never */ speed=roadprofile->route_weight; if (profile->maxspeed_handling != 2) { if (over->flags & AF_SPEED_LIMIT) { maxspeed=RSD_MAXSPEED(over); if (!profile->maxspeed_handling) speed=maxspeed; } else maxspeed=INT_MAX; if (dist && maxspeed > dist->maxspeed) maxspeed=dist->maxspeed; if (maxspeed != INT_MAX && (profile->maxspeed_handling != 1 || maxspeed < speed)) speed=maxspeed; } if (over->flags & AF_DANGEROUS_GOODS) { if (profile->dangerous_goods & RSD_DANGEROUS_GOODS(over)) return 0; } if (over->flags & AF_SIZE_OR_WEIGHT_LIMIT) { struct size_weight_limit *size_weight=&RSD_SIZE_WEIGHT(over); if (size_weight->width != -1 && profile->width != -1 && profile->width > size_weight->width) return 0; if (size_weight->height != -1 && profile->height != -1 && profile->height > size_weight->height) return 0; if (size_weight->length != -1 && profile->length != -1 && profile->length > size_weight->length) return 0; if (size_weight->weight != -1 && profile->weight != -1 && profile->weight > size_weight->weight) return 0; if (size_weight->axle_weight != -1 && profile->axle_weight != -1 && profile->axle_weight > size_weight->axle_weight) return 0; } return speed; } /** * @brief Returns the time needed to drive len on item * * This function returns the time needed to drive len meters on * the item passed in item in tenth of seconds. * * @param profile The routing preferences * @param over The segment which is passed * @param dist A traffic distortion if applicable * @return The time needed to drive len on item in thenth of senconds */ static int route_time_seg(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist) { int speed=route_seg_speed(profile, over, dist); if (!speed) return INT_MAX; return over->len*36/speed+(dist ? dist->delay : 0); } static int route_get_traffic_distortion(struct route_graph_segment *seg, struct route_traffic_distortion *ret) { struct route_graph_point *start=seg->start; struct route_graph_point *end=seg->end; struct route_graph_segment *tmp,*found=NULL; tmp=start->start; while (tmp && !found) { if (tmp->data.item.type == type_traffic_distortion && tmp->start == start && tmp->end == end) found=tmp; tmp=tmp->start_next; } tmp=start->end; while (tmp && !found) { if (tmp->data.item.type == type_traffic_distortion && tmp->end == start && tmp->start == end) found=tmp; tmp=tmp->end_next; } if (found) { ret->delay=found->data.len; if (found->data.flags & AF_SPEED_LIMIT) ret->maxspeed=RSD_MAXSPEED(&found->data); else ret->maxspeed=INT_MAX; return 1; } return 0; } static int route_through_traffic_allowed(struct vehicleprofile *profile, struct route_graph_segment *seg) { return (seg->data.flags & AF_THROUGH_TRAFFIC_LIMIT) == 0; } /** * @brief Returns the "costs" of driving from point from over segment over in direction dir * * @param profile The routing preferences * @param from The point where we are starting * @param over The segment we are using * @param dir The direction of segment which we are driving * @return The "costs" needed to drive len on item */ static int route_value_seg(struct vehicleprofile *profile, struct route_graph_point *from, struct route_graph_segment *over, int dir) { int ret; struct route_traffic_distortion dist,*distp=NULL; #if 0 dbg(0,"flags 0x%x mask 0x%x flags 0x%x\n", over->flags, dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask, profile->flags); #endif if ((over->data.flags & (dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask)) != profile->flags) return INT_MAX; if (dir > 0 && (over->start->flags & RP_TURN_RESTRICTION)) return INT_MAX; if (dir < 0 && (over->end->flags & RP_TURN_RESTRICTION)) return INT_MAX; if (from && from->seg == over) return INT_MAX; if ((over->start->flags & RP_TRAFFIC_DISTORTION) && (over->end->flags & RP_TRAFFIC_DISTORTION) && route_get_traffic_distortion(over, &dist) && dir != 2 && dir != -2) { distp=&dist; } ret=route_time_seg(profile, &over->data, distp); if (ret == INT_MAX) return ret; if (!route_through_traffic_allowed(profile, over) && from && route_through_traffic_allowed(profile, from->seg)) ret+=profile->through_traffic_penalty; return ret; } static int route_graph_segment_match(struct route_graph_segment *s1, struct route_graph_segment *s2) { if (!s1 || !s2) return 0; return (s1->start->c.x == s2->start->c.x && s1->start->c.y == s2->start->c.y && s1->end->c.x == s2->end->c.x && s1->end->c.y == s2->end->c.y); } static void route_graph_set_traffic_distortion(struct route_graph *this, struct route_graph_segment *seg, int delay) { struct route_graph_point *start=NULL; struct route_graph_segment *s; while ((start=route_graph_get_point_next(this, &seg->start->c, start))) { s=start->start; while (s) { if (route_graph_segment_match(s, seg)) { if (s->data.item.type != type_none && s->data.item.type != type_traffic_distortion && delay) { struct route_graph_segment_data data; struct item item; memset(&data, 0, sizeof(data)); memset(&item, 0, sizeof(item)); item.type=type_traffic_distortion; data.item=&item; data.len=delay; s->start->flags |= RP_TRAFFIC_DISTORTION; s->end->flags |= RP_TRAFFIC_DISTORTION; route_graph_add_segment(this, s->start, s->end, &data); } else if (s->data.item.type == type_traffic_distortion && !delay) { s->data.item.type = type_none; } } s=s->start_next; } } } /** * @brief Adds a route distortion item to the route graph * * @param this The route graph to add to * @param item The item to add */ static void route_process_traffic_distortion(struct route_graph *this, struct item *item) { struct route_graph_point *s_pnt,*e_pnt; struct coord c,l; struct attr delay_attr, maxspeed_attr; struct route_graph_segment_data data; data.item=item; data.len=0; data.flags=0; data.offset=1; data.maxspeed = INT_MAX; if (item_coord_get(item, &l, 1)) { s_pnt=route_graph_add_point(this,&l); while (item_coord_get(item, &c, 1)) { l=c; } e_pnt=route_graph_add_point(this,&l); s_pnt->flags |= RP_TRAFFIC_DISTORTION; e_pnt->flags |= RP_TRAFFIC_DISTORTION; if (item_attr_get(item, attr_maxspeed, &maxspeed_attr)) { data.flags |= AF_SPEED_LIMIT; data.maxspeed=maxspeed_attr.u.num; } if (item_attr_get(item, attr_delay, &delay_attr)) data.len=delay_attr.u.num; route_graph_add_segment(this, s_pnt, e_pnt, &data); } } /** * @brief Adds a route distortion item to the route graph * * @param this The route graph to add to * @param item The item to add */ static void route_process_turn_restriction(struct route_graph *this, struct item *item) { struct route_graph_point *pnt[4]; struct coord c[5]; int i,count; struct route_graph_segment_data data; count=item_coord_get(item, c, 5); if (count != 3 && count != 4) { dbg(0,"wrong count %d\n",count); return; } if (count == 4) return; for (i = 0 ; i < count ; i++) pnt[i]=route_graph_add_point(this,&c[i]); dbg(1,"%s: (0x%x,0x%x)-(0x%x,0x%x)-(0x%x,0x%x) %p-%p-%p\n",item_to_name(item->type),c[0].x,c[0].y,c[1].x,c[1].y,c[2].x,c[2].y,pnt[0],pnt[1],pnt[2]); data.item=item; data.flags=0; data.len=0; route_graph_add_segment(this, pnt[0], pnt[1], &data); route_graph_add_segment(this, pnt[1], pnt[2], &data); #if 1 if (count == 4) { pnt[1]->flags |= RP_TURN_RESTRICTION; pnt[2]->flags |= RP_TURN_RESTRICTION; route_graph_add_segment(this, pnt[2], pnt[3], &data); } else pnt[1]->flags |= RP_TURN_RESTRICTION; #endif } /** * @brief Adds an item to the route graph * * This adds an item (e.g. a street) to the route graph, creating as many segments as needed for a * segmented item. * * @param this The route graph to add to * @param item The item to add * @param profile The vehicle profile currently in use */ static void route_process_street_graph(struct route_graph *this, struct item *item, struct vehicleprofile *profile) { #ifdef AVOID_FLOAT int len=0; #else double len=0; #endif int segmented = 0; struct roadprofile *roadp; struct route_graph_point *s_pnt,*e_pnt; struct coord c,l; struct attr attr; struct route_graph_segment_data data; data.flags=0; data.offset=1; data.maxspeed=-1; data.item=item; roadp = vehicleprofile_get_roadprofile(profile, item->type); if (!roadp) { // Don't include any roads that don't have a road profile in our vehicle profile return; } if (item_coord_get(item, &l, 1)) { int default_flags_value=AF_ALL; int *default_flags=item_get_default_flags(item->type); if (! default_flags) default_flags=&default_flags_value; if (item_attr_get(item, attr_flags, &attr)) { data.flags = attr.u.num; if (data.flags & AF_SEGMENTED) segmented = 1; } else data.flags = *default_flags; if (data.flags & AF_SPEED_LIMIT) { if (item_attr_get(item, attr_maxspeed, &attr)) data.maxspeed = attr.u.num; } if (data.flags & AF_DANGEROUS_GOODS) { if (item_attr_get(item, attr_vehicle_dangerous_goods, &attr)) data.dangerous_goods = attr.u.num; else data.flags &= ~AF_DANGEROUS_GOODS; } if (data.flags & AF_SIZE_OR_WEIGHT_LIMIT) { if (item_attr_get(item, attr_vehicle_width, &attr)) data.size_weight.width=attr.u.num; else data.size_weight.width=-1; if (item_attr_get(item, attr_vehicle_height, &attr)) data.size_weight.height=attr.u.num; else data.size_weight.height=-1; if (item_attr_get(item, attr_vehicle_length, &attr)) data.size_weight.length=attr.u.num; else data.size_weight.length=-1; if (item_attr_get(item, attr_vehicle_weight, &attr)) data.size_weight.weight=attr.u.num; else data.size_weight.weight=-1; if (item_attr_get(item, attr_vehicle_axle_weight, &attr)) data.size_weight.axle_weight=attr.u.num; else data.size_weight.axle_weight=-1; } s_pnt=route_graph_add_point(this,&l); if (!segmented) { while (item_coord_get(item, &c, 1)) { len+=transform_distance(map_projection(item->map), &l, &c); l=c; } e_pnt=route_graph_add_point(this,&l); dbg_assert(len >= 0); data.len=len; if (!route_graph_segment_is_duplicate(s_pnt, &data)) route_graph_add_segment(this, s_pnt, e_pnt, &data); } else { int isseg,rc; int sc = 0; do { isseg = item_coord_is_node(item); rc = item_coord_get(item, &c, 1); if (rc) { len+=transform_distance(map_projection(item->map), &l, &c); l=c; if (isseg) { e_pnt=route_graph_add_point(this,&l); data.len=len; if (!route_graph_segment_is_duplicate(s_pnt, &data)) route_graph_add_segment(this, s_pnt, e_pnt, &data); data.offset++; s_pnt=route_graph_add_point(this,&l); len = 0; } } } while(rc); e_pnt=route_graph_add_point(this,&l); dbg_assert(len >= 0); sc++; data.len=len; if (!route_graph_segment_is_duplicate(s_pnt, &data)) route_graph_add_segment(this, s_pnt, e_pnt, &data); } } } static struct route_graph_segment * route_graph_get_segment(struct route_graph *graph, struct street_data *sd, struct route_graph_segment *last) { struct route_graph_point *start=NULL; struct route_graph_segment *s; int seen=0; while ((start=route_graph_get_point_next(graph, &sd->c[0], start))) { s=start->start; while (s) { if (item_is_equal(sd->item, s->data.item)) { if (!last || seen) return s; if (last == s) seen=1; } s=s->start_next; } } return NULL; } /** * @brief Calculates the routing costs for each point * * This function is the heart of routing. It assigns each point in the route graph a * cost at which one can reach the destination from this point on. Additionally it assigns * each point a segment one should follow from this point on to reach the destination at the * stated costs. * * This function uses Dijkstra's algorithm to do the routing. To understand it you should have a look * at this algorithm. */ static void route_graph_flood(struct route_graph *this, struct route_info *dst, struct vehicleprofile *profile, struct callback *cb) { struct route_graph_point *p_min; struct route_graph_segment *s=NULL; int min,new,val; struct fibheap *heap; /* This heap will hold all points with "temporarily" calculated costs */ heap = fh_makekeyheap(); while ((s=route_graph_get_segment(this, dst->street, s))) { val=route_value_seg(profile, NULL, s, -1); if (val != INT_MAX) { val=val*(100-dst->percent)/100; s->end->seg=s; s->end->value=val; s->end->el=fh_insertkey(heap, s->end->value, s->end); } val=route_value_seg(profile, NULL, s, 1); if (val != INT_MAX) { val=val*dst->percent/100; s->start->seg=s; s->start->value=val; s->start->el=fh_insertkey(heap, s->start->value, s->start); } } for (;;) { p_min=fh_extractmin(heap); /* Starting Dijkstra by selecting the point with the minimum costs on the heap */ if (! p_min) /* There are no more points with temporarily calculated costs, Dijkstra has finished */ break; min=p_min->value; if (debug_route) printf("extract p=%p free el=%p min=%d, 0x%x, 0x%x\n", p_min, p_min->el, min, p_min->c.x, p_min->c.y); p_min->el=NULL; /* This point is permanently calculated now, we've taken it out of the heap */ s=p_min->start; while (s) { /* Iterating all the segments leading away from our point to update the points at their ends */ val=route_value_seg(profile, p_min, s, -1); if (val != INT_MAX && item_is_equal(s->data.item,p_min->seg->data.item)) { if (profile->turn_around_penalty2) val+=profile->turn_around_penalty2; else val=INT_MAX; } if (val != INT_MAX) { new=min+val; if (debug_route) printf("begin %d len %d vs %d (0x%x,0x%x)\n",new,val,s->end->value, s->end->c.x, s->end->c.y); if (new < s->end->value) { /* We've found a less costly way to reach the end of s, update it */ s->end->value=new; s->end->seg=s; if (! s->end->el) { if (debug_route) printf("insert_end p=%p el=%p val=%d ", s->end, s->end->el, s->end->value); s->end->el=fh_insertkey(heap, new, s->end); if (debug_route) printf("el new=%p\n", s->end->el); } else { if (debug_route) printf("replace_end p=%p el=%p val=%d\n", s->end, s->end->el, s->end->value); fh_replacekey(heap, s->end->el, new); } } if (debug_route) printf("\n"); } s=s->start_next; } s=p_min->end; while (s) { /* Doing the same as above with the segments leading towards our point */ val=route_value_seg(profile, p_min, s, 1); if (val != INT_MAX && item_is_equal(s->data.item,p_min->seg->data.item)) { if (profile->turn_around_penalty2) val+=profile->turn_around_penalty2; else val=INT_MAX; } if (val != INT_MAX) { new=min+val; if (debug_route) printf("end %d len %d vs %d (0x%x,0x%x)\n",new,val,s->start->value,s->start->c.x, s->start->c.y); if (new < s->start->value) { s->start->value=new; s->start->seg=s; if (! s->start->el) { if (debug_route) printf("insert_start p=%p el=%p val=%d ", s->start, s->start->el, s->start->value); s->start->el=fh_insertkey(heap, new, s->start); if (debug_route) printf("el new=%p\n", s->start->el); } else { if (debug_route) printf("replace_start p=%p el=%p val=%d\n", s->start, s->start->el, s->start->value); fh_replacekey(heap, s->start->el, new); } } if (debug_route) printf("\n"); } s=s->end_next; } } fh_deleteheap(heap); callback_call_0(cb); dbg(1,"return\n"); } /** * @brief Starts an "offroad" path * * This starts a path that is not located on a street. It creates a new route path * adding only one segment, that leads from pos to dest, and which is not associated with an item. * * @param this Not used * @param pos The starting position for the new path * @param dst The destination of the new path * @param dir Not used * @return The new path */ static struct route_path * route_path_new_offroad(struct route_graph *this, struct route_info *pos, struct route_info *dst) { struct route_path *ret; ret=g_new0(struct route_path, 1); ret->in_use=1; ret->path_hash=item_hash_new(); route_path_add_line(ret, &pos->c, &dst->c, pos->lenextra+dst->lenextra); ret->updated=1; return ret; } /** * @brief Returns a coordinate at a given distance * * This function returns the coordinate, where the user will be if he * follows the current route for a certain distance. * * @param this_ The route we're driving upon * @param dist The distance in meters * @return The coordinate where the user will be in that distance */ struct coord route_get_coord_dist(struct route *this_, int dist) { int d,l,i,len; int dx,dy; double frac; struct route_path_segment *cur; struct coord ret; enum projection pro=route_projection(this_); struct route_info *dst=route_get_dst(this_); d = dist; if (!this_->path2 || pro == projection_none) { return this_->pos->c; } ret = this_->pos->c; cur = this_->path2->path; while (cur) { if (cur->data->len < d) { d -= cur->data->len; } else { for (i=0; i < (cur->ncoords-1); i++) { l = d; len = (int)transform_polyline_length(pro, (cur->c + i), 2); d -= len; if (d <= 0) { // We interpolate a bit here... frac = (double)l / len; dx = (cur->c + i + 1)->x - (cur->c + i)->x; dy = (cur->c + i + 1)->y - (cur->c + i)->y; ret.x = (cur->c + i)->x + (frac * dx); ret.y = (cur->c + i)->y + (frac * dy); return ret; } } return cur->c[(cur->ncoords-1)]; } cur = cur->next; } return dst->c; } /** * @brief Creates a new route path * * This creates a new non-trivial route. It therefore needs the routing information created by route_graph_flood, so * make sure to run route_graph_flood() after changing the destination before using this function. * * @param this The route graph to create the route from * @param oldpath (Optional) old path which may contain parts of the new part - this speeds things up a bit. May be NULL. * @param pos The starting position of the route * @param dst The destination of the route * @param preferences The routing preferences * @return The new route path */ static struct route_path * route_path_new(struct route_graph *this, struct route_path *oldpath, struct route_info *pos, struct route_info *dst, struct vehicleprofile *profile) { struct route_graph_segment *s=NULL,*s1=NULL,*s2=NULL; struct route_graph_point *start; struct route_info *posinfo, *dstinfo; int segs=0,dir; int val1=INT_MAX,val2=INT_MAX; int val,val1_new,val2_new; struct route_path *ret; if (! pos->street || ! dst->street) { dbg(0,"pos or dest not set\n"); return NULL; } if (profile->mode == 2 || (profile->mode == 0 && pos->lenextra + dst->lenextra > transform_distance(map_projection(pos->street->item.map), &pos->c, &dst->c))) return route_path_new_offroad(this, pos, dst); while ((s=route_graph_get_segment(this, pos->street, s))) { val=route_value_seg(profile, NULL, s, 2); if (val != INT_MAX && s->end->value != INT_MAX) { val=val*(100-pos->percent)/100; dbg(1,"val1 %d\n",val); if (route_graph_segment_match(s,this->avoid_seg) && pos->street_direction < 0) val+=profile->turn_around_penalty; dbg(1,"val1 %d\n",val); val1_new=s->end->value+val; dbg(1,"val1 +%d=%d\n",s->end->value,val1_new); if (val1_new < val1) { val1=val1_new; s1=s; } } val=route_value_seg(profile, NULL, s, -2); if (val != INT_MAX && s->start->value != INT_MAX) { val=val*pos->percent/100; dbg(1,"val2 %d\n",val); if (route_graph_segment_match(s,this->avoid_seg) && pos->street_direction > 0) val+=profile->turn_around_penalty; dbg(1,"val2 %d\n",val); val2_new=s->start->value+val; dbg(1,"val2 +%d=%d\n",s->start->value,val2_new); if (val2_new < val2) { val2=val2_new; s2=s; } } } if (val1 == INT_MAX && val2 == INT_MAX) { dbg(0,"no route found, pos blocked\n"); return NULL; } if (val1 == val2) { val1=s1->end->value; val2=s2->start->value; } if (val1 < val2) { start=s1->start; s=s1; dir=1; } else { start=s2->end; s=s2; dir=-1; } if (pos->street_direction && dir != pos->street_direction && profile->turn_around_penalty) { if (!route_graph_segment_match(this->avoid_seg,s)) { dbg(0,"avoid current segment\n"); if (this->avoid_seg) route_graph_set_traffic_distortion(this, this->avoid_seg, 0); this->avoid_seg=s; route_graph_set_traffic_distortion(this, this->avoid_seg, profile->turn_around_penalty); route_graph_reset(this); route_graph_flood(this, dst, profile, NULL); return route_path_new(this, oldpath, pos, dst, profile); } } ret=g_new0(struct route_path, 1); ret->in_use=1; ret->updated=1; if (pos->lenextra) route_path_add_line(ret, &pos->c, &pos->lp, pos->lenextra); ret->path_hash=item_hash_new(); dstinfo=NULL; posinfo=pos; while (s && !dstinfo) { /* following start->seg, which indicates the least costly way to reach our destination */ segs++; #if 0 printf("start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); #endif if (s->start == start) { if (item_is_equal(s->data.item, dst->street->item) && (s->end->seg == s || !posinfo)) dstinfo=dst; if (!route_path_add_item_from_graph(ret, oldpath, s, 1, posinfo, dstinfo)) ret->updated=0; start=s->end; } else { if (item_is_equal(s->data.item, dst->street->item) && (s->start->seg == s || !posinfo)) dstinfo=dst; if (!route_path_add_item_from_graph(ret, oldpath, s, -1, posinfo, dstinfo)) ret->updated=0; start=s->start; } posinfo=NULL; s=start->seg; } if (dst->lenextra) route_path_add_line(ret, &dst->lp, &dst->c, dst->lenextra); dbg(1, "%d segments\n", segs); return ret; } static int route_graph_build_next_map(struct route_graph *rg) { do { rg->m=mapset_next(rg->h, 2); if (! rg->m) return 0; map_rect_destroy(rg->mr); rg->mr=map_rect_new(rg->m, rg->sel); } while (!rg->mr); return 1; } static int is_turn_allowed(struct route_graph_point *p, struct route_graph_segment *from, struct route_graph_segment *to) { struct route_graph_point *prev,*next; struct route_graph_segment *tmp1,*tmp2; if (item_is_equal(from->data.item, to->data.item)) return 0; if (from->start == p) prev=from->end; else prev=from->start; if (to->start == p) next=to->end; else next=to->start; tmp1=p->end; while (tmp1) { if (tmp1->start->c.x == prev->c.x && tmp1->start->c.y == prev->c.y && (tmp1->data.item.type == type_street_turn_restriction_no || tmp1->data.item.type == type_street_turn_restriction_only)) { tmp2=p->start; dbg(1,"found %s (0x%x,0x%x) (0x%x,0x%x)-(0x%x,0x%x) %p-%p\n",item_to_name(tmp1->data.item.type),tmp1->data.item.id_hi,tmp1->data.item.id_lo,tmp1->start->c.x,tmp1->start->c.y,tmp1->end->c.x,tmp1->end->c.y,tmp1->start,tmp1->end); while (tmp2) { dbg(1,"compare %s (0x%x,0x%x) (0x%x,0x%x)-(0x%x,0x%x) %p-%p\n",item_to_name(tmp2->data.item.type),tmp2->data.item.id_hi,tmp2->data.item.id_lo,tmp2->start->c.x,tmp2->start->c.y,tmp2->end->c.x,tmp2->end->c.y,tmp2->start,tmp2->end); if (item_is_equal(tmp1->data.item, tmp2->data.item)) break; tmp2=tmp2->start_next; } dbg(1,"tmp2=%p\n",tmp2); if (tmp2) { dbg(1,"%s tmp2->end=%p next=%p\n",item_to_name(tmp1->data.item.type),tmp2->end,next); } if (tmp1->data.item.type == type_street_turn_restriction_no && tmp2 && tmp2->end->c.x == next->c.x && tmp2->end->c.y == next->c.y) { dbg(1,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x not allowed (no)\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); return 0; } if (tmp1->data.item.type == type_street_turn_restriction_only && tmp2 && (tmp2->end->c.x != next->c.x || tmp2->end->c.y != next->c.y)) { dbg(1,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x not allowed (only)\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); return 0; } } tmp1=tmp1->end_next; } dbg(1,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x allowed\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); return 1; } static void route_graph_clone_segment(struct route_graph *this, struct route_graph_segment *s, struct route_graph_point *start, struct route_graph_point *end, int flags) { struct route_graph_segment_data data; data.flags=s->data.flags|flags; data.offset=1; data.maxspeed=-1; data.item=&s->data.item; data.len=s->data.len+1; if (s->data.flags & AF_SPEED_LIMIT) data.maxspeed=RSD_MAXSPEED(&s->data); if (s->data.flags & AF_SEGMENTED) data.offset=RSD_OFFSET(&s->data); dbg(1,"cloning segment from %p (0x%x,0x%x) to %p (0x%x,0x%x)\n",start,start->c.x,start->c.y, end, end->c.x, end->c.y); route_graph_add_segment(this, start, end, &data); } static void route_graph_process_restriction_segment(struct route_graph *this, struct route_graph_point *p, struct route_graph_segment *s, int dir) { struct route_graph_segment *tmp; struct route_graph_point *pn; struct coord c=p->c; int dx=0; int dy=0; c.x+=dx; c.y+=dy; dbg(1,"From %s %d,%d\n",item_to_name(s->data.item.type),dx,dy); pn=route_graph_point_new(this, &c); if (dir > 0) { /* going away */ dbg(1,"other 0x%x,0x%x\n",s->end->c.x,s->end->c.y); if (s->data.flags & AF_ONEWAY) { dbg(1,"Not possible\n"); return; } route_graph_clone_segment(this, s, pn, s->end, AF_ONEWAYREV); } else { /* coming in */ dbg(1,"other 0x%x,0x%x\n",s->start->c.x,s->start->c.y); if (s->data.flags & AF_ONEWAYREV) { dbg(1,"Not possible\n"); return; } route_graph_clone_segment(this, s, s->start, pn, AF_ONEWAY); } tmp=p->start; while (tmp) { if (tmp != s && tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only && !(tmp->data.flags & AF_ONEWAYREV) && is_turn_allowed(p, s, tmp)) { route_graph_clone_segment(this, tmp, pn, tmp->end, AF_ONEWAY); dbg(1,"To start %s\n",item_to_name(tmp->data.item.type)); } tmp=tmp->start_next; } tmp=p->end; while (tmp) { if (tmp != s && tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only && !(tmp->data.flags & AF_ONEWAY) && is_turn_allowed(p, s, tmp)) { route_graph_clone_segment(this, tmp, tmp->start, pn, AF_ONEWAYREV); dbg(1,"To end %s\n",item_to_name(tmp->data.item.type)); } tmp=tmp->end_next; } } static void route_graph_process_restriction_point(struct route_graph *this, struct route_graph_point *p) { struct route_graph_segment *tmp; tmp=p->start; dbg(1,"node 0x%x,0x%x\n",p->c.x,p->c.y); while (tmp) { if (tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only) route_graph_process_restriction_segment(this, p, tmp, 1); tmp=tmp->start_next; } tmp=p->end; while (tmp) { if (tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only) route_graph_process_restriction_segment(this, p, tmp, -1); tmp=tmp->end_next; } p->flags |= RP_TURN_RESTRICTION_RESOLVED; } static void route_graph_process_restrictions(struct route_graph *this) { struct route_graph_point *curr; int i; dbg(1,"enter\n"); for (i = 0 ; i < HASH_SIZE ; i++) { curr=this->hash[i]; while (curr) { if (curr->flags & RP_TURN_RESTRICTION) route_graph_process_restriction_point(this, curr); curr=curr->hash_next; } } } static void route_graph_build_done(struct route_graph *rg, int cancel) { dbg(1,"cancel=%d\n",cancel); if (rg->idle_ev) event_remove_idle(rg->idle_ev); if (rg->idle_cb) callback_destroy(rg->idle_cb); map_rect_destroy(rg->mr); mapset_close(rg->h); route_free_selection(rg->sel); rg->idle_ev=NULL; rg->idle_cb=NULL; rg->mr=NULL; rg->h=NULL; rg->sel=NULL; if (! cancel) { route_graph_process_restrictions(rg); callback_call_0(rg->done_cb); } rg->busy=0; } static void route_graph_build_idle(struct route_graph *rg, struct vehicleprofile *profile) { int count=1000; struct item *item; while (count > 0) { for (;;) { item=map_rect_get_item(rg->mr); if (item) break; if (!route_graph_build_next_map(rg)) { route_graph_build_done(rg, 0); return; } } if (item->type == type_traffic_distortion) route_process_traffic_distortion(rg, item); else if (item->type == type_street_turn_restriction_no || item->type == type_street_turn_restriction_only) route_process_turn_restriction(rg, item); else route_process_street_graph(rg, item, profile); count--; } } /** * @brief Builds a new route graph from a mapset * * This function builds a new route graph from a map. Please note that this function does not * add any routing information to the route graph - this has to be done via the route_graph_flood() * function. * * The function does not create a graph covering the whole map, but only covering the rectangle * between c1 and c2. * * @param ms The mapset to build the route graph from * @param c1 Corner 1 of the rectangle to use from the map * @param c2 Corner 2 of the rectangle to use from the map * @param done_cb The callback which will be called when graph is complete * @return The new route graph. */ static struct route_graph * route_graph_build(struct mapset *ms, struct coord *c, int count, struct callback *done_cb, int async, struct vehicleprofile *profile) { struct route_graph *ret=g_new0(struct route_graph, 1); dbg(1,"enter\n"); ret->sel=route_calc_selection(c, count, profile); ret->h=mapset_open(ms); ret->done_cb=done_cb; ret->busy=1; if (route_graph_build_next_map(ret)) { if (async) { ret->idle_cb=callback_new_2(callback_cast(route_graph_build_idle), ret, profile); ret->idle_ev=event_add_idle(50, ret->idle_cb); } } else route_graph_build_done(ret, 0); return ret; } static void route_graph_update_done(struct route *this, struct callback *cb) { route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, cb); } /** * @brief Updates the route graph * * This updates the route graph after settings in the route have changed. It also * adds routing information afterwards by calling route_graph_flood(). * * @param this The route to update the graph for */ static void route_graph_update(struct route *this, struct callback *cb, int async) { struct attr route_status; struct coord *c=g_alloca(sizeof(struct coord)*(1+g_list_length(this->destinations))); int i=0; GList *tmp; route_status.type=attr_route_status; route_graph_destroy(this->graph); this->graph=NULL; callback_destroy(this->route_graph_done_cb); this->route_graph_done_cb=callback_new_2(callback_cast(route_graph_update_done), this, cb); route_status.u.num=route_status_building_graph; route_set_attr(this, &route_status); c[i++]=this->pos->c; tmp=this->destinations; while (tmp) { struct route_info *dst=tmp->data; c[i++]=dst->c; tmp=g_list_next(tmp); } this->graph=route_graph_build(this->ms, c, i, this->route_graph_done_cb, async, this->vehicleprofile); if (! async) { while (this->graph->busy) route_graph_build_idle(this->graph, this->vehicleprofile); } } /** * @brief Gets street data for an item * * @param item The item to get the data for * @return Street data for the item */ struct street_data * street_get_data (struct item *item) { int count=0,*flags; struct street_data *ret = NULL, *ret1; struct attr flags_attr, maxspeed_attr; const int step = 128; int c; do { ret1=g_realloc(ret, sizeof(struct street_data)+(count+step)*sizeof(struct coord)); if (!ret1) { if (ret) g_free(ret); return NULL; } ret = ret1; c = item_coord_get(item, &ret->c[count], step); count += c; } while (c && c == step); ret1=g_realloc(ret, sizeof(struct street_data)+count*sizeof(struct coord)); if (ret1) ret = ret1; ret->item=*item; ret->count=count; if (item_attr_get(item, attr_flags, &flags_attr)) ret->flags=flags_attr.u.num; else { flags=item_get_default_flags(item->type); if (flags) ret->flags=*flags; else ret->flags=0; } ret->maxspeed = -1; if (ret->flags & AF_SPEED_LIMIT) { if (item_attr_get(item, attr_maxspeed, &maxspeed_attr)) { ret->maxspeed = maxspeed_attr.u.num; } } return ret; } /** * @brief Copies street data * * @param orig The street data to copy * @return The copied street data */ struct street_data * street_data_dup(struct street_data *orig) { struct street_data *ret; int size=sizeof(struct street_data)+orig->count*sizeof(struct coord); ret=g_malloc(size); memcpy(ret, orig, size); return ret; } /** * @brief Frees street data * * @param sd Street data to be freed */ void street_data_free(struct street_data *sd) { g_free(sd); } /** * @brief Finds the nearest street to a given coordinate * * @param ms The mapset to search in for the street * @param pc The coordinate to find a street nearby * @return The nearest street */ static struct route_info * route_find_nearest_street(struct vehicleprofile *vehicleprofile, struct mapset *ms, struct pcoord *pc) { struct route_info *ret=NULL; int max_dist=1000; struct map_selection *sel; int dist,mindist=0,pos; struct mapset_handle *h; struct map *m; struct map_rect *mr; struct item *item; struct coord lp; struct street_data *sd; struct coord c; struct coord_geo g; if(!vehicleprofile) return NULL; ret=g_new0(struct route_info, 1); mindist = INT_MAX; h=mapset_open(ms); while ((m=mapset_next(h,2))) { c.x = pc->x; c.y = pc->y; if (map_projection(m) != pc->pro) { transform_to_geo(pc->pro, &c, &g); transform_from_geo(map_projection(m), &g, &c); } sel = route_rect(18, &c, &c, 0, max_dist); if (!sel) continue; mr=map_rect_new(m, sel); if (!mr) { map_selection_destroy(sel); continue; } while ((item=map_rect_get_item(mr))) { if (item_get_default_flags(item->type)) { sd=street_get_data(item); if (!sd) continue; dist=transform_distance_polyline_sq(sd->c, sd->count, &c, &lp, &pos); if (dist < mindist && ( (sd->flags & vehicleprofile->flags_forward_mask) == vehicleprofile->flags || (sd->flags & vehicleprofile->flags_reverse_mask) == vehicleprofile->flags)) { mindist = dist; if (ret->street) { street_data_free(ret->street); } ret->c=c; ret->lp=lp; ret->pos=pos; ret->street=sd; dbg(1,"dist=%d id 0x%x 0x%x pos=%d\n", dist, item->id_hi, item->id_lo, pos); } else { street_data_free(sd); } } } map_selection_destroy(sel); map_rect_destroy(mr); } mapset_close(h); if (!ret->street || mindist > max_dist*max_dist) { if (ret->street) { street_data_free(ret->street); dbg(1,"Much too far %d > %d\n", mindist, max_dist); } g_free(ret); ret = NULL; } return ret; } /** * @brief Destroys a route_info * * @param info The route info to be destroyed */ void route_info_free(struct route_info *inf) { if (!inf) return; if (inf->street) street_data_free(inf->street); g_free(inf); } #include "point.h" /** * @brief Returns street data for a route info * * @param rinf The route info to return the street data for * @return Street data for the route info */ struct street_data * route_info_street(struct route_info *rinf) { return rinf->street; } #if 0 struct route_crossings * route_crossings_get(struct route *this, struct coord *c) { struct route_point *pnt; struct route_segment *seg; int crossings=0; struct route_crossings *ret; pnt=route_graph_get_point(this, c); seg=pnt->start; while (seg) { printf("start: 0x%x 0x%x\n", seg->item.id_hi, seg->item.id_lo); crossings++; seg=seg->start_next; } seg=pnt->end; while (seg) { printf("end: 0x%x 0x%x\n", seg->item.id_hi, seg->item.id_lo); crossings++; seg=seg->end_next; } ret=g_malloc(sizeof(struct route_crossings)+crossings*sizeof(struct route_crossing)); ret->count=crossings; return ret; } #endif struct map_rect_priv { struct route_info_handle *ri; enum attr_type attr_next; int pos; struct map_priv *mpriv; struct item item; unsigned int last_coord; struct route_path *path; struct route_path_segment *seg,*seg_next; struct route_graph_point *point; struct route_graph_segment *rseg; char *str; int hash_bucket; struct coord *coord_sel; /**< Set this to a coordinate if you want to filter for just a single route graph point */ struct route_graph_point_iterator it; /* Pointer to current waypoint element of route->destinations */ GList *dest; }; static void rm_coord_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; mr->last_coord = 0; } static void rm_attr_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; mr->attr_next = attr_street_item; } static int rm_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr = priv_data; struct route_path_segment *seg=mr->seg; struct route *route=mr->mpriv->route; if (mr->item.type != type_street_route && mr->item.type != type_waypoint && mr->item.type != type_route_end) return 0; attr->type=attr_type; switch (attr_type) { case attr_any: while (mr->attr_next != attr_none) { if (rm_attr_get(priv_data, mr->attr_next, attr)) return 1; } return 0; case attr_maxspeed: mr->attr_next = attr_street_item; if (seg && seg->data->flags & AF_SPEED_LIMIT) { attr->u.num=RSD_MAXSPEED(seg->data); } else { return 0; } return 1; case attr_street_item: mr->attr_next=attr_direction; if (seg && seg->data->item.map) attr->u.item=&seg->data->item; else return 0; return 1; case attr_direction: mr->attr_next=attr_route; if (seg) attr->u.num=seg->direction; else return 0; return 1; case attr_route: mr->attr_next=attr_length; attr->u.route = mr->mpriv->route; return 1; case attr_length: mr->attr_next=attr_time; if (seg) attr->u.num=seg->data->len; else return 0; return 1; case attr_time: mr->attr_next=attr_speed; if (seg) attr->u.num=route_time_seg(route->vehicleprofile, seg->data, NULL); else return 0; return 1; case attr_speed: mr->attr_next=attr_label; if (seg) attr->u.num=route_seg_speed(route->vehicleprofile, seg->data, NULL); else return 0; return 1; case attr_label: mr->attr_next=attr_none; if(mr->item.type==type_waypoint || mr->item.type == type_route_end) { if(mr->str) g_free(mr->str); mr->str=g_strdup_printf("%d",route->reached_destinations_count+g_list_position(route->destinations,mr->dest)+1); attr->u.str=mr->str; return 1; } return 0; default: mr->attr_next=attr_none; attr->type=attr_none; return 0; } return 0; } static int rm_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr = priv_data; struct route_path_segment *seg = mr->seg; int i,rc=0; struct route *r = mr->mpriv->route; enum projection pro = route_projection(r); if (pro == projection_none) return 0; if (mr->item.type == type_route_start || mr->item.type == type_route_start_reverse || mr->item.type == type_route_end || mr->item.type == type_waypoint ) { if (! count || mr->last_coord) return 0; mr->last_coord=1; if (mr->item.type == type_route_start || mr->item.type == type_route_start_reverse) c[0]=r->pos->c; else if (mr->item.type == type_waypoint) { c[0]=((struct route_info *)mr->dest->data)->c; } else { /*type_route_end*/ c[0]=route_get_dst(r)->c; } return 1; } if (! seg) return 0; for (i=0; i < count; i++) { if (mr->last_coord >= seg->ncoords) break; if (i >= seg->ncoords) break; if (pro != projection_mg) transform_from_to(&seg->c[mr->last_coord++], pro, &c[i],projection_mg); else c[i] = seg->c[mr->last_coord++]; rc++; } dbg(1,"return %d\n",rc); return rc; } static struct item_methods methods_route_item = { rm_coord_rewind, rm_coord_get, rm_attr_rewind, rm_attr_get, }; static void rp_attr_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; mr->attr_next = attr_label; } static int rp_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr = priv_data; struct route_graph_point *p = mr->point; struct route_graph_segment *seg = mr->rseg; struct route *route=mr->mpriv->route; attr->type=attr_type; switch (attr_type) { case attr_any: // works only with rg_points for now while (mr->attr_next != attr_none) { dbg(0,"querying %s\n", attr_to_name(mr->attr_next)); if (rp_attr_get(priv_data, mr->attr_next, attr)) return 1; } return 0; case attr_maxspeed: mr->attr_next = attr_label; if (mr->item.type != type_rg_segment) return 0; if (seg && (seg->data.flags & AF_SPEED_LIMIT)) { attr->type = attr_maxspeed; attr->u.num=RSD_MAXSPEED(&seg->data); return 1; } else { return 0; } case attr_label: mr->attr_next=attr_street_item; attr->type = attr_label; if (mr->str) g_free(mr->str); if (mr->item.type == type_rg_point) { if (p->value != INT_MAX) mr->str=g_strdup_printf("%d", p->value); else mr->str=g_strdup("-"); } else { int len=seg->data.len; int speed=route_seg_speed(route->vehicleprofile, &seg->data, NULL); int time=route_time_seg(route->vehicleprofile, &seg->data, NULL); if (speed) mr->str=g_strdup_printf("%dm %dkm/h %d.%ds",len,speed,time/10,time%10); else if (len) mr->str=g_strdup_printf("%dm",len); else { mr->str=NULL; return 0; } } attr->u.str = mr->str; return 1; case attr_street_item: mr->attr_next=attr_flags; if (mr->item.type != type_rg_segment) return 0; if (seg && seg->data.item.map) attr->u.item=&seg->data.item; else return 0; return 1; case attr_flags: mr->attr_next = attr_direction; if (mr->item.type != type_rg_segment) return 0; if (seg) { attr->u.num = seg->data.flags; } else { return 0; } return 1; case attr_direction: mr->attr_next = attr_debug; // This only works if the map has been opened at a single point, and in that case indicates if the // segment returned last is connected to this point via its start (1) or its end (-1) if (!mr->coord_sel || (mr->item.type != type_rg_segment)) return 0; if (seg->start == mr->point) { attr->u.num=1; } else if (seg->end == mr->point) { attr->u.num=-1; } else { return 0; } return 1; case attr_debug: mr->attr_next=attr_none; if (mr->str) g_free(mr->str); mr->str=NULL; switch (mr->item.type) { case type_rg_point: { struct route_graph_segment *tmp; int start=0; int end=0; tmp=p->start; while (tmp) { start++; tmp=tmp->start_next; } tmp=p->end; while (tmp) { end++; tmp=tmp->end_next; } mr->str=g_strdup_printf("%d %d %p (0x%x,0x%x)", start, end, p, p->c.x, p->c.y); attr->u.str = mr->str; } return 1; case type_rg_segment: if (! seg) return 0; mr->str=g_strdup_printf("len %d time %d start %p end %p",seg->data.len, route_time_seg(route->vehicleprofile, &seg->data, NULL), seg->start, seg->end); attr->u.str = mr->str; return 1; default: return 0; } default: mr->attr_next=attr_none; attr->type=attr_none; return 0; } } /** * @brief Returns the coordinates of a route graph item * * @param priv_data The route graph item's private data * @param c Pointer where to store the coordinates * @param count How many coordinates to get at a max? * @return The number of coordinates retrieved */ static int rp_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr = priv_data; struct route_graph_point *p = mr->point; struct route_graph_segment *seg = mr->rseg; int rc = 0,i,dir; struct route *r = mr->mpriv->route; enum projection pro = route_projection(r); if (pro == projection_none) return 0; for (i=0; i < count; i++) { if (mr->item.type == type_rg_point) { if (mr->last_coord >= 1) break; if (pro != projection_mg) transform_from_to(&p->c, pro, &c[i],projection_mg); else c[i] = p->c; } else { if (mr->last_coord >= 2) break; dir=0; if (seg->end->seg == seg) dir=1; if (mr->last_coord) dir=1-dir; if (dir) { if (pro != projection_mg) transform_from_to(&seg->end->c, pro, &c[i],projection_mg); else c[i] = seg->end->c; } else { if (pro != projection_mg) transform_from_to(&seg->start->c, pro, &c[i],projection_mg); else c[i] = seg->start->c; } } mr->last_coord++; rc++; } return rc; } static struct item_methods methods_point_item = { rm_coord_rewind, rp_coord_get, rp_attr_rewind, rp_attr_get, }; static void rp_destroy(struct map_priv *priv) { g_free(priv); } static void rm_destroy(struct map_priv *priv) { g_free(priv); } static struct map_rect_priv * rm_rect_new(struct map_priv *priv, struct map_selection *sel) { struct map_rect_priv * mr; dbg(1,"enter\n"); #if 0 if (! route_get_pos(priv->route)) return NULL; if (! route_get_dst(priv->route)) return NULL; #endif #if 0 if (! priv->route->path2) return NULL; #endif mr=g_new0(struct map_rect_priv, 1); mr->mpriv = priv; mr->item.priv_data = mr; mr->item.type = type_none; mr->item.meth = &methods_route_item; if (priv->route->path2) { mr->path=priv->route->path2; mr->seg_next=mr->path->path; mr->path->in_use++; } else mr->seg_next=NULL; return mr; } /** * @brief Opens a new map rectangle on the route graph's map * * This function opens a new map rectangle on the route graph's map. * The "sel" parameter enables you to only search for a single route graph * point on this map (or exactly: open a map rectangle that only contains * this one point). To do this, pass here a single map selection, whose * c_rect has both coordinates set to the same point. Otherwise this parameter * has no effect. * * @param priv The route graph map's private data * @param sel Here it's possible to specify a point for which to search. Please read the function's description. * @return A new map rect's private data */ static struct map_rect_priv * rp_rect_new(struct map_priv *priv, struct map_selection *sel) { struct map_rect_priv * mr; dbg(1,"enter\n"); if (! priv->route->graph) return NULL; mr=g_new0(struct map_rect_priv, 1); mr->mpriv = priv; mr->item.priv_data = mr; mr->item.type = type_rg_point; mr->item.meth = &methods_point_item; if (sel) { if ((sel->u.c_rect.lu.x == sel->u.c_rect.rl.x) && (sel->u.c_rect.lu.y == sel->u.c_rect.rl.y)) { mr->coord_sel = g_malloc(sizeof(struct coord)); *(mr->coord_sel) = sel->u.c_rect.lu; } } return mr; } static void rm_rect_destroy(struct map_rect_priv *mr) { if (mr->str) g_free(mr->str); if (mr->coord_sel) { g_free(mr->coord_sel); } if (mr->path) { mr->path->in_use--; if (mr->path->update_required && (mr->path->in_use==1)) route_path_update_done(mr->mpriv->route, mr->path->update_required-1); else if (!mr->path->in_use) g_free(mr->path); } g_free(mr); } static struct item * rp_get_item(struct map_rect_priv *mr) { struct route *r = mr->mpriv->route; struct route_graph_point *p = mr->point; struct route_graph_segment *seg = mr->rseg; if (mr->item.type == type_rg_point) { if (mr->coord_sel) { // We are supposed to return only the point at one specified coordinate... if (!p) { p = route_graph_get_point_last(r->graph, mr->coord_sel); if (!p) { mr->point = NULL; // This indicates that no point has been found } else { mr->it = rp_iterator_new(p); } } else { p = NULL; } } else { if (!p) { mr->hash_bucket=0; p = r->graph->hash[0]; } else p=p->hash_next; while (!p) { mr->hash_bucket++; if (mr->hash_bucket >= HASH_SIZE) break; p = r->graph->hash[mr->hash_bucket]; } } if (p) { mr->point = p; mr->item.id_lo++; rm_coord_rewind(mr); rp_attr_rewind(mr); return &mr->item; } else mr->item.type = type_rg_segment; } if (mr->coord_sel) { if (!mr->point) { /* This means that no point has been found */ return NULL; } seg = rp_iterator_next(&(mr->it)); } else { if (!seg) seg=r->graph->route_segments; else seg=seg->next; } if (seg) { mr->rseg = seg; mr->item.id_lo++; rm_coord_rewind(mr); rp_attr_rewind(mr); return &mr->item; } return NULL; } static struct item * rp_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct item *ret=NULL; while (id_lo-- > 0) ret=rp_get_item(mr); return ret; } static struct item * rm_get_item(struct map_rect_priv *mr) { struct route *route=mr->mpriv->route; void *id=0; switch (mr->item.type) { case type_none: if (route->pos && route->pos->street_direction && route->pos->street_direction != route->pos->dir) mr->item.type=type_route_start_reverse; else mr->item.type=type_route_start; if (route->pos) { id=route->pos; break; } case type_route_start: case type_route_start_reverse: mr->seg=NULL; mr->dest=mr->mpriv->route->destinations; default: if (mr->item.type == type_waypoint) mr->dest=g_list_next(mr->dest); mr->item.type=type_street_route; mr->seg=mr->seg_next; if (!mr->seg && mr->path && mr->path->next) { struct route_path *p=NULL; mr->path->in_use--; if (!mr->path->in_use) p=mr->path; mr->path=mr->path->next; mr->path->in_use++; mr->seg=mr->path->path; if (p) g_free(p); if (mr->dest) { id=mr->dest; mr->item.type=type_waypoint; mr->seg_next=mr->seg; break; } } if (mr->seg) { mr->seg_next=mr->seg->next; id=mr->seg; break; } if (mr->dest && g_list_next(mr->dest)) { id=mr->dest; mr->item.type=type_waypoint; break; } mr->item.type=type_route_end; id=&(mr->mpriv->route->destinations); if (mr->mpriv->route->destinations) break; case type_route_end: return NULL; } mr->last_coord = 0; item_id_from_ptr(&mr->item,id); rm_attr_rewind(mr); return &mr->item; } static struct item * rm_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct item *ret=NULL; do { ret=rm_get_item(mr); } while (ret && (ret->id_lo!=id_lo || ret->id_hi!=id_hi)); return ret; } static struct map_methods route_meth = { projection_mg, "utf-8", rm_destroy, rm_rect_new, rm_rect_destroy, rm_get_item, rm_get_item_byid, NULL, NULL, NULL, }; static struct map_methods route_graph_meth = { projection_mg, "utf-8", rp_destroy, rp_rect_new, rm_rect_destroy, rp_get_item, rp_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * route_map_new_helper(struct map_methods *meth, struct attr **attrs, int graph) { struct map_priv *ret; struct attr *route_attr; route_attr=attr_search(attrs, NULL, attr_route); if (! route_attr) return NULL; ret=g_new0(struct map_priv, 1); if (graph) *meth=route_graph_meth; else *meth=route_meth; ret->route=route_attr->u.route; return ret; } static struct map_priv * route_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { return route_map_new_helper(meth, attrs, 0); } static struct map_priv * route_graph_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { return route_map_new_helper(meth, attrs, 1); } static struct map * route_get_map_helper(struct route *this_, struct map **map, char *type, char *description) { struct attr *attrs[5]; struct attr a_type,navigation,data,a_description; a_type.type=attr_type; a_type.u.str=type; navigation.type=attr_route; navigation.u.route=this_; data.type=attr_data; data.u.str=""; a_description.type=attr_description; a_description.u.str=description; attrs[0]=&a_type; attrs[1]=&navigation; attrs[2]=&data; attrs[3]=&a_description; attrs[4]=NULL; if (! *map) { *map=map_new(NULL, attrs); navit_object_ref((struct navit_object *)*map); } return *map; } /** * @brief Returns a new map containing the route path * * This function returns a new map containing the route path. * * @important Do not map_destroy() this! * * @param this_ The route to get the map of * @return A new map containing the route path */ struct map * route_get_map(struct route *this_) { return route_get_map_helper(this_, &this_->map, "route","Route"); } /** * @brief Returns a new map containing the route graph * * This function returns a new map containing the route graph. * * @important Do not map_destroy() this! * * @param this_ The route to get the map of * @return A new map containing the route graph */ struct map * route_get_graph_map(struct route *this_) { return route_get_map_helper(this_, &this_->graph_map, "route_graph","Route Graph"); } void route_set_projection(struct route *this_, enum projection pro) { } int route_set_attr(struct route *this_, struct attr *attr) { int attr_updated=0; switch (attr->type) { case attr_route_status: attr_updated = (this_->route_status != attr->u.num); this_->route_status = attr->u.num; break; case attr_destination: route_set_destination(this_, attr->u.pcoord, 1); return 1; case attr_position: route_set_position(this_, attr->u.pcoord); return 1; case attr_vehicle: attr_updated = (this_->v != attr->u.vehicle); this_->v=attr->u.vehicle; if (attr_updated) { struct attr g; struct pcoord pc; struct coord c; if (vehicle_get_attr(this_->v, attr_position_coord_geo, &g, NULL)) { pc.pro=projection_mg; transform_from_geo(projection_mg, g.u.coord_geo, &c); pc.x=c.x; pc.y=c.y; route_set_position(this_, &pc); } } break; default: dbg(0,"unsupported attribute: %s\n",attr_to_name(attr->type)); return 0; } if (attr_updated) callback_list_call_attr_2(this_->cbl2, attr->type, this_, attr); return 1; } int route_add_attr(struct route *this_, struct attr *attr) { switch (attr->type) { case attr_callback: callback_list_add(this_->cbl2, attr->u.callback); return 1; default: return 0; } } int route_remove_attr(struct route *this_, struct attr *attr) { dbg(0,"enter\n"); switch (attr->type) { case attr_callback: callback_list_remove(this_->cbl2, attr->u.callback); return 1; case attr_vehicle: this_->v=NULL; return 1; default: return 0; } } int route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret=1; switch (type) { case attr_map: attr->u.map=route_get_map(this_); ret=(attr->u.map != NULL); break; case attr_destination: if (this_->destinations) { struct route_info *dst; if (iter) { if (iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->destinations; } if (!iter->u.list) { return 0; } dst = (struct route_info*)iter->u.list->data; } else { //No iter handling dst=route_get_dst(this_); } attr->u.pcoord=&this_->pc; this_->pc.pro=projection_mg; /* fixme */ this_->pc.x=dst->c.x; this_->pc.y=dst->c.y; } else ret=0; break; case attr_vehicle: attr->u.vehicle=this_->v; ret=(this_->v != NULL); dbg(0,"get vehicle %p\n",this_->v); break; case attr_vehicleprofile: attr->u.vehicleprofile=this_->vehicleprofile; ret=(this_->vehicleprofile != NULL); break; case attr_route_status: attr->u.num=this_->route_status; break; case attr_destination_time: if (this_->path2 && (this_->route_status == route_status_path_done_new || this_->route_status == route_status_path_done_incremental)) { struct route_path *path=this_->path2; attr->u.num=0; while (path) { attr->u.num+=path->path_time; path=path->next; } dbg(1,"path_time %ld\n",attr->u.num); } else ret=0; break; case attr_destination_length: if (this_->path2 && (this_->route_status == route_status_path_done_new || this_->route_status == route_status_path_done_incremental)) { struct route_path *path=this_->path2; attr->u.num=0; while (path) { attr->u.num+=path->path_len; path=path->next; } } else ret=0; break; default: return 0; } attr->type=type; return ret; } struct attr_iter * route_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void route_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } void route_init(void) { plugin_register_map_type("route", route_map_new); plugin_register_map_type("route_graph", route_graph_map_new); } void route_destroy(struct route *this_) { route_path_destroy(this_->path2,1); route_graph_destroy(this_->graph); route_clear_destinations(this_); route_info_free(this_->pos); map_destroy(this_->map); map_destroy(this_->graph_map); g_free(this_); } navit-0.5.0~svn5643+dfsg.1/navit/route.h000066400000000000000000000111121221777731700176240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains exported code for route.c * * This file contains code that works together with route.c and that is exported to * other modules. */ #ifndef NAVIT_ROUTE_H #define NAVIT_ROUTE_H #ifdef __cplusplus extern "C" { #endif enum route_status { route_status_no_destination=0, route_status_destination_set=1, route_status_not_found=1|2, route_status_building_path=1|4, route_status_building_graph=1|4|8, route_status_path_done_new=1|16, route_status_path_done_incremental=1|32, }; struct route_crossing { long segid; int dir; }; struct route_crossings { int count; struct route_crossing crossing[0]; }; /** * @brief Information about a street * * This contains information about a certain street */ struct street_data { struct item item; /**< The map item for this street */ int count; /**< Number of coordinates this street has */ int flags; int maxspeed; /**< Maximum speed allowed on this street. */ struct coord c[0]; /**< Pointer to the coordinates of this street. * DO NOT INSERT FIELDS AFTER THIS. */ }; /* prototypes */ enum attr_type; enum projection; struct attr; struct attr_iter; struct coord; struct item; struct map; struct map_selection; struct mapset; struct pcoord; struct route; struct route_info; struct street_data; struct tracking; struct vehicleprofile; struct route *route_new(struct attr *parent, struct attr **attrs); void route_set_mapset(struct route *this_, struct mapset *ms); void route_set_profile(struct route *this_, struct vehicleprofile *prof); struct mapset *route_get_mapset(struct route *this_); struct route_info *route_get_pos(struct route *this_); struct route_info *route_get_dst(struct route *this_); int route_get_path_set(struct route *this_); int route_contains(struct route *this_, struct item *item); int route_destination_reached(struct route *this_); void route_set_position(struct route *this_, struct pcoord *pos); void route_set_position_from_tracking(struct route *this_, struct tracking *tracking, enum projection pro); struct map_selection *route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs); void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async); int route_get_destinations(struct route *this_, struct pcoord *pc, int count); int route_get_destination_count(struct route *this_); void route_get_distances(struct route *this_, struct coord *c, int count, int *distances); void route_set_destination(struct route *this_, struct pcoord *dst, int async); void route_append_destination(struct route *this_, struct pcoord *dst, int async); void route_remove_nth_waypoint(struct route *this_, int n); void route_remove_waypoint(struct route *this_); char* route_get_destination_description(struct route *this_, int n); struct coord route_get_coord_dist(struct route *this_, int dist); struct street_data *street_get_data(struct item *item); struct street_data *street_data_dup(struct street_data *orig); void street_data_free(struct street_data *sd); void route_info_free(struct route_info *inf); struct street_data *route_info_street(struct route_info *rinf); struct map *route_get_map(struct route *this_); struct map *route_get_graph_map(struct route *this_); void route_set_projection(struct route *this_, enum projection pro); void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async); int route_set_attr(struct route *this_, struct attr *attr); int route_add_attr(struct route *this_, struct attr *attr); int route_remove_attr(struct route *this_, struct attr *attr); struct attr_iter * route_attr_iter_new(void); void route_attr_iter_destroy(struct attr_iter *iter); int route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); void route_init(void); void route_destroy(struct route *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/routech.c000066400000000000000000000337261221777731700201510ustar00rootroot00000000000000#include #include #include "item.h" #include "coord.h" #include "navit.h" #include "transform.h" #include "profile.h" #include "mapset.h" #include "map.h" FILE *routefile; void routech_test(struct navit *navit); struct ch_edge { int flags; int weight; struct item_id target,middle; }; struct routech_search { struct pq *pq; GHashTable *hash; int finished; int dir; unsigned int upper; struct item_id *via; }; struct pq_element { struct item_id *node_id; struct item_id *parent_node_id; int stalled; int key; int heap_element; }; struct pq_heap_element { int key; int element; }; struct pq { int capacity; int size; int step; int elements_capacity; int elements_size; int elements_step; struct pq_element *elements; struct pq_heap_element *heap_elements; }; static struct pq * pq_new(void) { struct pq *ret=g_new(struct pq, 1); ret->step=10; ret->capacity=0; ret->size=1; ret->elements_step=10; ret->elements_capacity=0; ret->elements_size=1; ret->elements=NULL; ret->heap_elements=NULL; return ret; } static int pq_insert(struct pq *pq, int key, struct item_id *node_id) { int element,i; if (pq->size >= pq->capacity) { pq->capacity += pq->step; pq->heap_elements=g_renew(struct pq_heap_element, pq->heap_elements, pq->capacity); } if (pq->elements_size >= pq->elements_capacity) { pq->elements_capacity += pq->elements_step; pq->elements=g_renew(struct pq_element, pq->elements, pq->elements_capacity); } element=pq->elements_size++; pq->elements[element].node_id=node_id; i=pq->size++; while (i > 1 && pq->heap_elements[i/2].key > key) { pq->heap_elements[i]=pq->heap_elements[i/2]; pq->elements[pq->heap_elements[i].element].heap_element=i; i/=2; } pq->heap_elements[i].key=key; pq->heap_elements[i].element=element; pq->elements[element].heap_element=i; pq->elements[element].key=key; return element; } static int pq_get_key(struct pq *pq, int element, int *key) { *key=pq->elements[element].key; return 1; } static void pq_set_parent(struct pq *pq, int element, struct item_id *node_id, int stalled) { pq->elements[element].parent_node_id=node_id; pq->elements[element].stalled=stalled; } static struct item_id * pq_get_parent_node_id(struct pq *pq, int element) { return pq->elements[element].parent_node_id; } static void pq_set_stalled(struct pq *pq, int element, int stalled) { pq->elements[element].stalled=stalled; } static int pq_get_stalled(struct pq *pq, int element) { return pq->elements[element].stalled; } static int pq_is_deleted(struct pq *pq, int element) { return (pq->elements[element].heap_element == 0); } static int pq_min(struct pq *pq) { return (pq->heap_elements[1].key); } static void pq_decrease_key(struct pq *pq, int element, int key) { int i=pq->elements[element].heap_element; while (i > 1 && pq->heap_elements[i/2].key > key) { pq->heap_elements[i]=pq->heap_elements[i/2]; pq->elements[pq->heap_elements[i].element].heap_element=i; i/=2; } pq->heap_elements[i].element=element; pq->heap_elements[i].key=key; pq->elements[element].heap_element=i; pq->elements[element].key=key; } static int pq_delete_min(struct pq *pq, struct item_id **node_id, int *key, int *element) { struct pq_heap_element min, last; int i=1,j; if (pq->size <= 1) return 0; min=pq->heap_elements[1]; if (node_id) *node_id=pq->elements[min.element].node_id; if (key) *key=min.key; if (element) *element=min.element; pq->elements[min.element].heap_element=0; min.element=0; last=pq->heap_elements[--pq->size]; while (i <= pq->size / 2) { j=2*i; if (j < pq->size && pq->heap_elements[j].key > pq->heap_elements[j+1].key) j++; if (pq->heap_elements[j].key >= last.key) break; pq->heap_elements[i]=pq->heap_elements[j]; pq->elements[pq->heap_elements[i].element].heap_element=i; i=j; } pq->heap_elements[i]=last; pq->elements[last.element].heap_element=i; return 1; } static int pq_is_empty(struct pq *pq) { return pq->size <= 1; } static void pq_check(struct pq *pq) { int i; for (i = 2 ; i < pq->size ; i++) { if (pq->heap_elements[i/2].key > pq->heap_elements[i].key) { printf("%d vs %d\n", pq->heap_elements[i/2].key, pq->heap_elements[i].key); return; } } for (i = 1 ; i < pq->size ; i++) { if (i != pq->elements[pq->heap_elements[i].element].heap_element) { printf("Error: heap_element %d points to element %d, but that points to %d\n",i,pq->heap_elements[i].element,pq->elements[pq->heap_elements[i].element].heap_element); } } } static struct routech_search * routech_search_new(int dir) { struct routech_search *ret=g_new0(struct routech_search, 1); ret->pq=pq_new(); ret->hash=g_hash_table_new_full(item_id_hash, item_id_equal, g_free, NULL); ret->upper=UINT_MAX; ret->dir=dir; return ret; } static int routech_insert_node(struct routech_search *search, struct item_id **id, int val) { struct item_id *ret; int e; if (g_hash_table_lookup_extended(search->hash, *id, (gpointer)&ret, (gpointer)&e)) { int oldval; pq_get_key(search->pq, e, &oldval); // printf("Node = %d\n",node); if (oldval > val) { pq_decrease_key(search->pq, e, val); *id=ret; return e; } return 0; } ret=g_new(struct item_id, 1); *ret=**id; e=pq_insert(search->pq, val, ret); g_hash_table_insert(search->hash, ret, GINT_TO_POINTER(e)); *id=ret; return e; } static int routech_find_nearest(struct mapset *ms, struct coord *c, struct item_id *id, struct map **map_ret) { int dst=50; int dstsq=dst*dst; int ret=0; struct map_selection sel; struct map_rect *mr; struct mapset_handle *msh; struct map *map; struct item *item; sel.next=NULL; sel.order=18; sel.range.min=type_ch_node; sel.range.max=type_ch_node; sel.u.c_rect.lu.x=c->x-dst; sel.u.c_rect.lu.y=c->y+dst; sel.u.c_rect.rl.x=c->x+dst; sel.u.c_rect.rl.y=c->y-dst; printf("0x%x,0x%x-0x%x,0x%x\n",sel.u.c_rect.lu.x,sel.u.c_rect.lu.y,sel.u.c_rect.rl.x,sel.u.c_rect.rl.y); msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { mr=map_rect_new(map, &sel); if (!mr) continue; while ((item=map_rect_get_item(mr))) { struct coord cn; if (item->type == type_ch_node && item_coord_get(item, &cn, 1)) { int dist=transform_distance_sq(&cn, c); if (dist < dstsq) { dstsq=dist; id->id_hi=item->id_hi; id->id_lo=item->id_lo; *map_ret=map; ret=1; } } } map_rect_destroy(mr); } mapset_close(msh); dbg_assert(ret==1); return ret; } static int routech_edge_valid(struct ch_edge *edge, int dir) { if (edge->flags & (1 << dir)) return 1; return 0; } static void routech_stall(struct map_rect *mr, struct routech_search *curr, struct item_id *id, int key) { struct stall_element { struct item_id id; int key; } *se; GList *list=NULL; struct item *item; struct attr edge_attr; int index=GPOINTER_TO_INT(g_hash_table_lookup(curr->hash, id)); pq_set_stalled(curr->pq, index, key); se=g_new(struct stall_element, 1); se->id=*id; se->key=key; list=g_list_append(list, se); while (list) { se=list->data; key=se->key; item=map_rect_get_item_byid(mr, se->id.id_hi, se->id.id_lo); while (item_attr_get(item, attr_ch_edge, &edge_attr)) { struct ch_edge *edge=edge_attr.u.data; if (routech_edge_valid(edge, curr->dir)) { int index=GPOINTER_TO_INT(g_hash_table_lookup(curr->hash, &edge->target)); if (index) { int newkey=key+edge->weight; int target_key; pq_get_key(curr->pq, index, &target_key); if (newkey < target_key) { if (!pq_get_stalled(curr->pq, index)) { pq_set_stalled(curr->pq, index, newkey); se=g_new(struct stall_element, 1); se->id=edge->target; se->key=newkey; list=g_list_append(list, se); } } } } } list=g_list_remove(list, se); g_free(se); } } static void routech_relax(struct map_rect **mr, struct routech_search *curr, struct routech_search *opposite) { int val,element; struct item_id *id; struct item *item; struct attr edge_attr; int opposite_element; if (!pq_delete_min(curr->pq, &id, &val, &element)) { return; } pq_check(curr->pq); opposite_element=GPOINTER_TO_INT(g_hash_table_lookup(opposite->hash, id)); if (opposite_element && pq_is_deleted(opposite->pq, opposite_element)) { int opposite_val; pq_get_key(opposite->pq, opposite_element, &opposite_val); if (val+opposite_val < curr->upper) { curr->upper=opposite->upper=val+opposite_val; printf("%d path found: 0x%x,0x%x ub = %d\n",curr->dir,id->id_hi,id->id_lo,curr->upper); curr->via=opposite->via=id; } } if (pq_get_stalled(curr->pq, element)) return; item=map_rect_get_item_byid(mr[0], id->id_hi, id->id_lo); while (item_attr_get(item, attr_ch_edge, &edge_attr)) { struct ch_edge *edge=edge_attr.u.data; struct item_id *target_id=&edge->target; int element; if (routech_edge_valid(edge, curr->dir)) { int index=GPOINTER_TO_INT(g_hash_table_lookup(curr->hash, target_id)); if (index && routech_edge_valid(edge, 1-curr->dir)) { int newkey,stallkey; stallkey=pq_get_stalled(curr->pq, index); if (stallkey) newkey=stallkey; else pq_get_key(curr->pq, index, &newkey); newkey+=edge->weight; if (newkey < val) { routech_stall(mr[1], curr, id, newkey); return; } } element=routech_insert_node(curr, &target_id, edge->weight+val); if (element) { pq_set_parent(curr->pq, element, id, 0); } } } } static void routech_print_coord(struct coord *c, FILE *out) { int x=c->x; int y=c->y; char *sx=""; char *sy=""; if (x < 0) { sx="-"; x=-x; } if (y < 0) { sy="-"; y=-y; } fprintf(out,"%s0x%x %s0x%x\n",sx,x,sy,y); } static void routech_resolve_route(struct map_rect *mr, struct item_id *id, int flags, int dir) { int i,count,max=16384; struct coord *ca=g_alloca(sizeof(struct coord)*(max)); struct item *item; int rev=0; if (!(flags & 8) == dir) rev=1; item=map_rect_get_item_byid(mr, id->id_hi, id->id_lo); dbg_assert(item->type >= type_line && item->type < type_area); item->type=type_street_route; count=item_coord_get(item, ca, max); item_dump_attr(item, item->map, routefile); fprintf(routefile,"debug=\"flags=%d dir=%d rev=%d\"",flags,dir,rev); fprintf(routefile,"\n"); if (rev) { for (i = count-1 ; i >= 0 ; i--) routech_print_coord(&ca[i], routefile); } else { for (i = 0 ; i < count ; i++) routech_print_coord(&ca[i], routefile); } } static int routech_find_edge(struct map_rect *mr, struct item_id *from, struct item_id *to, struct item_id *middle) { struct item *item=map_rect_get_item_byid(mr, from->id_hi, from->id_lo); struct attr edge_attr; dbg_assert(item->type == type_ch_node); dbg(1,"type %s\n",item_to_name(item->type)); dbg(1,"segment item=%p\n",item); while (item_attr_get(item, attr_ch_edge, &edge_attr)) { struct ch_edge *edge=edge_attr.u.data; dbg(1,"flags=%d\n",edge->flags); if (edge->target.id_hi == to->id_hi && edge->target.id_lo == to->id_lo) { *middle=edge->middle; return edge->flags; } } dbg(0,"** not found\n"); return 0; } static void routech_resolve(struct map_rect *mr, struct item_id *from, struct item_id *to, int dir) { struct item_id middle_node; int res; if (dir) res=routech_find_edge(mr, to, from, &middle_node); else res=routech_find_edge(mr, from, to, &middle_node); dbg(1,"res=%d\n",res); if (res & 4) { routech_resolve(mr, from, &middle_node, 1); routech_resolve(mr, &middle_node, to, 0); } else routech_resolve_route(mr, &middle_node, res, dir); } static void routech_find_path(struct map_rect *mr, struct routech_search *search) { struct item_id *curr_node=search->via; GList *i,*n,*list=NULL; dbg(1,"node %p\n",curr_node); for (;;) { int element=GPOINTER_TO_INT(g_hash_table_lookup(search->hash, curr_node)); struct item_id *next_node=pq_get_parent_node_id(search->pq,element); if (search->dir) list=g_list_append(list, curr_node); else list=g_list_prepend(list, curr_node); dbg(1,"element %d\n",element); dbg(1,"next node %p\n",next_node); if (!next_node) break; curr_node=next_node; } i=list; while (i && (n=g_list_next(i))) { routech_resolve(mr, i->data, n->data, search->dir); i=n; } } void routech_test(struct navit *navit) { struct attr mapset; struct coord src={0x3fd661,0x727146}; struct coord dst={0xfff07fc2,0x4754c9}; struct item_id id[2],*id_ptr; struct routech_search *search[2],*curr,*opposite; struct map *map[2]; struct map_rect *mr[2]; int element; int k; int search_id=0; int i; navit_get_attr(navit, attr_mapset, &mapset, NULL); routech_find_nearest(mapset.u.mapset, &src, &id[0], &map[0]); routech_find_nearest(mapset.u.mapset, &dst, &id[1], &map[1]); for (k = 0 ; k < 2 ; k++) { profile(0,"start\n"); search[0]=routech_search_new(0); search[1]=routech_search_new(1); printf("Start 0x%x,0x%x\n",id[0].id_hi,id[0].id_lo); printf("End 0x%x,0x%x\n",id[1].id_hi,id[1].id_lo); id_ptr=&id[0]; element=routech_insert_node(search[0], &id_ptr, 0); pq_set_parent(search[0]->pq, element, NULL, 0); id_ptr=&id[1]; element=routech_insert_node(search[1], &id_ptr, 0); pq_set_parent(search[1]->pq, element, NULL, 0); mr[0]=map_rect_new(map[0], NULL); mr[1]=map_rect_new(map[0], NULL); for (i=0 ; i < 5000 ; i++) { if (pq_is_empty(search[0]->pq) && pq_is_empty(search[1]->pq)) break; if (!pq_is_empty(search[1-search_id]->pq)) { search_id=1-search_id; } if (search[0]->finished) search_id=1; if (search[1]->finished) search_id=0; curr=search[search_id]; opposite=search[1-search_id]; if (pq_is_empty(curr->pq)) { dbg(0,"empty\n"); break; } routech_relax(mr, curr, opposite); if (pq_min(curr->pq) > curr->upper) { dbg(0,"min %d upper %d\n",pq_min(curr->pq), curr->upper); curr->finished=1; } if (curr->finished && opposite->finished) { dbg(0,"finished\n"); break; } } printf("finished %d\n",search[0]->upper); profile(0,"finished\n"); } routefile=fopen("route.txt","w"); routech_find_path(mr[0], search[0]); routech_find_path(mr[0], search[1]); fclose(routefile); printf("Heap size %d vs %d\n",search[0]->pq->size,search[1]->pq->size); printf("Element size %d vs %d\n",search[0]->pq->elements_size,search[1]->pq->elements_size); } navit-0.5.0~svn5643+dfsg.1/navit/script.c000066400000000000000000000057321221777731700200000ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2012 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terscr of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "debug.h" #include "event.h" #include "callback.h" #include "command.h" #include "xmlconfig.h" struct script { NAVIT_OBJECT struct attr parent; struct callback *cb; struct event_timeout *timeout; struct command_saved *cs; }; static void script_run(struct script *scr) { struct attr *xml_text=attr_search(scr->attrs, NULL, attr_xml_text); int error; if (!xml_text || !xml_text->u.str) { dbg(0,"no text\n"); return; } dbg(0,"running '%s'\n",xml_text->u.str); command_evaluate_to_void(&scr->parent, xml_text->u.str, &error); } static int script_set_attr_int(struct script *scr, struct attr *attr) { switch (attr->type) { case attr_refresh_cond: dbg(0,"refresh_cond\n"); if (scr->cs) command_saved_destroy(scr->cs); scr->cs=command_saved_attr_new(attr->u.str, &scr->parent, scr->cb, 0); return 1; case attr_update_period: if (scr->timeout) event_remove_timeout(scr->timeout); scr->timeout=event_add_timeout(attr->u.num, 1, scr->cb); return 1; default: return 0; } } static struct script * script_new(struct attr *parent, struct attr **attrs) { struct script *scr=g_new0(struct script, 1); scr->func=&script_func; navit_object_ref((struct navit_object *)scr); scr->attrs=attr_list_dup(attrs); attrs=scr->attrs; scr->cb=callback_new_1(callback_cast(script_run), scr); scr->parent=*parent; while (attrs && *attrs) script_set_attr_int(scr, *attrs++); dbg(0,"return %p\n",scr); return scr; } static void script_destroy(struct script *scr) { dbg(0,"enter %p\n",scr); if (scr->timeout) event_remove_timeout(scr->timeout); if (scr->cs) command_saved_destroy(scr->cs); callback_destroy(scr->cb); attr_list_free(scr->attrs); g_free(scr); } struct object_func script_func = { attr_script, (object_func_new)script_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navit_object_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)script_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/search.c000066400000000000000000000731031221777731700177360ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "coord.h" #include "transform.h" #include "search.h" #include "country.h" #include "linguistics.h" #include "geom.h" #include "util.h" #if HAVE_API_ANDROID #include "android.h" #endif #include "layout.h" static struct search_list_result *search_list_result_dup(struct search_list_result *slr); static void search_list_country_destroy(struct search_list_country *this_); static void search_list_town_destroy(struct search_list_town *this_); static void search_list_street_destroy(struct search_list_street *this_); static void search_list_house_number_destroy(struct search_list_house_number *this_); struct search_list_level { struct mapset *ms; struct search_list_common *parent; struct attr *attr; int partial; int selected; struct mapset_search *search; GHashTable *hash; GList *list,*curr,*last; }; struct interpolation { int side, mode, rev; char *first, *last, *curr; }; struct search_list { struct mapset *ms; struct item *item; int level; struct search_list_level levels[4]; struct search_list_result result; struct search_list_result last_result; int last_result_valid; char *postal; struct interpolation inter; int use_address_results; GList *address_results,*address_results_pos; }; static guint search_item_hash_hash(gconstpointer key) { const struct item *itm=key; gconstpointer hashkey=(gconstpointer)GINT_TO_POINTER(itm->id_hi^itm->id_lo); return g_direct_hash(hashkey); } static gboolean search_item_hash_equal(gconstpointer a, gconstpointer b) { const struct item *itm_a=a; const struct item *itm_b=b; if (item_is_equal_id(*itm_a, *itm_b)) return TRUE; return FALSE; } /** * @brief Create new instance of search_list to run a search. * * @param ms mapset that is to be searched * @returns new search_list */ struct search_list * search_list_new(struct mapset *ms) { struct search_list *ret; ret=g_new0(struct search_list, 1); ret->ms=ms; return ret; } static void search_list_search_free(struct search_list *sl, int level); /** * @brief Determine search list level for given attr_type. * @param attr_type attribute value * @return corresponding search list level (country=0, town=1, ...) */ int search_list_level(enum attr_type attr_type) { switch(attr_type) { case attr_country_all: case attr_country_id: case attr_country_iso2: case attr_country_iso3: case attr_country_car: case attr_country_name: return 0; case attr_town_postal: return 1; case attr_town_name: case attr_district_name: case attr_town_or_district_name: return 1; case attr_street_name: return 2; case attr_house_number: return 3; case attr_postal: return -1; default: dbg(0,"unknown search '%s'\n",attr_to_name(attr_type)); return -1; } } static void interpolation_clear(struct interpolation *inter) { inter->mode=inter->side=0; g_free(inter->first); g_free(inter->last); g_free(inter->curr); inter->first=inter->last=inter->curr=NULL; } static char * search_fix_spaces(char *str) { int i; int len=strlen(str); char c,*s,*d,*ret=g_strdup(str); for (i = 0 ; i < len ; i++) { if (ret[i] == ',' || ret[i] == ',' || ret[i] == '/') ret[i]=' '; } s=ret; d=ret; len=0; do { c=*s++; if (c != ' ' || len != 0) { *d++=c; len++; } while (c == ' ' && *s == ' ') s++; if (c == ' ' && *s == '\0') { d--; len--; } } while (c); return ret; } struct phrase { char *start; char *end; int wordcount; }; static GList * search_split_phrases(char *str) { char *s,*d; int wordcount=0; GList *ret=NULL; s=str; do { d=s; wordcount=0; do { d++; if (*d == ' ' || *d == '\0') { struct phrase *phrase=g_new(struct phrase, 1); phrase->start=s; phrase->end=d; phrase->wordcount=++wordcount; ret=g_list_append(ret, phrase); } } while (*d != '\0'); do { s++; if (*s == ' ') { s++; break; } } while (*s != '\0'); } while (*s != '\0'); return ret; } static char * search_phrase_str(struct phrase *p) { int len=p->end-p->start; char *ret=g_malloc(len+1); strncpy(ret, p->start, len); ret[len]='\0'; return ret; } static int search_phrase_used(struct phrase *p, GList *used_phrases) { while (used_phrases) { struct phrase *pu=used_phrases->data; dbg(1,"'%s'-'%s' vs '%s'-'%s'\n",p->start,p->end,pu->start,pu->end); if (p->start < pu->end && p->end > pu->start) return 1; dbg(1,"unused\n"); used_phrases=g_list_next(used_phrases); } return 0; } static gint search_by_address_compare(gconstpointer a, gconstpointer b) { const struct search_list_result *slra=a; const struct search_list_result *slrb=b; return slrb->id-slra->id; } static GList * search_by_address_attr(GList *results, struct search_list *sl, GList *phrases, GList *exclude, enum attr_type attr_type, int wordcount) { GList *tmp=phrases; struct attr attr; attr.type=attr_type; while (tmp) { if (!search_phrase_used(tmp->data, exclude)) { struct phrase *p=tmp->data; int count=0,wordcount_all=wordcount+p->wordcount; struct search_list_result *slr; attr.u.str=search_phrase_str(p); dbg(1,"%s phrase '%s'\n",attr_to_name(attr_type),attr.u.str); search_list_search(sl, &attr, 0); while ((slr=search_list_get_result(sl))) { if (attr_type != attr_country_all) { struct search_list_result *slrd=search_list_result_dup(slr); slrd->id=wordcount_all; results=g_list_insert_sorted(results, slrd, search_by_address_compare); } count++; } dbg(1,"%d results wordcount %d\n",count,wordcount_all); if (count) { GList *used=g_list_prepend(g_list_copy(exclude), tmp->data); enum attr_type new_attr_type=attr_none; switch (attr_type) { case attr_country_all: new_attr_type=attr_town_or_district_name; break; case attr_town_or_district_name: new_attr_type=attr_street_name; break; case attr_street_name: new_attr_type=attr_house_number; break; default: break; } if (new_attr_type != attr_none) results=search_by_address_attr(results, sl, phrases, used, new_attr_type, wordcount_all); g_list_free(used); } g_free(attr.u.str); } tmp=g_list_next(tmp); } return results; } static void search_by_address(struct search_list *this_, char *addr) { char *str=search_fix_spaces(addr); GList *tmp,*phrases=search_split_phrases(str); struct search_list *sl=search_list_new(this_->ms); this_->address_results=search_by_address_attr(NULL, sl, phrases, NULL, attr_country_all, 0); this_->address_results_pos=this_->address_results; search_list_destroy(sl); tmp=phrases; while (tmp) { g_free(tmp->data); tmp=g_list_next(tmp); } g_list_free(phrases); // TODO: Looks like we should g_free(str) here. But this is // currently dead code, so no way to test it. } static void search_address_results_free(struct search_list *this_) { GList *tmp; tmp=this_->address_results; while (tmp) { struct search_list_result *slr=tmp->data; if (slr->country) search_list_country_destroy(slr->country); if (slr->town) search_list_town_destroy(slr->town); if (slr->street) search_list_street_destroy(slr->street); if (slr->house_number) search_list_house_number_destroy(slr->house_number); if (slr->c) g_free(slr->c); g_free(slr); tmp=g_list_next(tmp); } g_list_free(this_->address_results); this_->address_results=this_->address_results_pos=NULL; } /** * @brief Start a search. * * @param this search_list to use for the search * @param search_attr attributes to use for the search * @param partial do partial search? (1=yes,0=no) */ void search_list_search(struct search_list *this_, struct attr *search_attr, int partial) { struct search_list_level *le; int level; search_address_results_free(this_); if (search_attr->type == attr_address) { search_by_address(this_, search_attr->u.str); this_->use_address_results=1; return; } this_->use_address_results=0; level=search_list_level(search_attr->type); this_->item=NULL; interpolation_clear(&this_->inter); //dbg(0,"level=%d\n", level); if (level != -1) { this_->result.id=0; this_->level=level; le=&this_->levels[level]; search_list_search_free(this_, level); le->attr=attr_dup(search_attr); le->partial=partial; if (level > 0) { le=&this_->levels[level-1]; le->curr=le->list; } //dbg(0,"le=%p partial=%d\n", le, partial); } else if (search_attr->type == attr_postal) { g_free(this_->postal); this_->postal=g_strdup(search_attr->u.str); } } struct search_list_common * search_list_select(struct search_list *this_, enum attr_type attr_type, int id, int mode) { int level=search_list_level(attr_type); int num=0; struct search_list_level *le; struct search_list_common *slc; GList *curr; le=&this_->levels[level]; curr=le->list; if (mode > 0 || !id) le->selected=mode; //dbg(0,"enter level=%d %d %d %p\n", level, id, mode, curr); while (curr) { num++; if (! id || num == id) { slc=curr->data; slc->selected=mode; if (id) { le->last=curr; //dbg(0,"found\n"); return slc; } } curr=g_list_next(curr); } //dbg(0,"not found\n"); return NULL; } static void search_list_common_addattr(struct attr* attr,struct search_list_common *common) { common->attrs=attr_generic_prepend_attr(common->attrs,attr); switch(attr->type) { case attr_town_name: common->town_name=common->attrs[0]->u.str; break; case attr_county_name: common->county_name=common->attrs[0]->u.str; break; case attr_district_name: common->district_name=common->attrs[0]->u.str; break; case attr_postal: common->postal=common->attrs[0]->u.str; break; case attr_town_postal: if(!common->postal) common->postal=common->attrs[0]->u.str; break; case attr_postal_mask: common->postal_mask=common->attrs[0]->u.str; break; default: break; } } static void search_list_common_new(struct item *item, struct search_list_common *common) { struct attr attr; int i; enum attr_type common_attrs[]={ attr_state_name, attr_county_name, attr_municipality_name, attr_town_name, attr_district_name, attr_postal, attr_town_postal, attr_postal_mask, attr_none }; common->town_name=NULL; common->district_name=NULL; common->county_name=NULL; common->postal=NULL; common->postal_mask=NULL; common->attrs=NULL; for(i=0;common_attrs[i];i++) { if (item_attr_get(item, common_attrs[i], &attr)) { struct attr at; at.type=attr.type; at.u.str=map_convert_string(item->map, attr.u.str); search_list_common_addattr(&at,common); map_convert_free(at.u.str); } } } static void search_list_common_dup(struct search_list_common *src, struct search_list_common *dst) { int i; if(dst->attrs) { for(i=0;dst->attrs[i];i++) search_list_common_addattr(src->attrs[i],dst); } if (src->c) { dst->c=g_new(struct pcoord, 1); *dst->c=*src->c; } else dst->c=NULL; } static void search_list_common_destroy(struct search_list_common *common) { g_free(common->c); attr_list_free(common->attrs); common->town_name=NULL; common->district_name=NULL; common->county_name=NULL; common->postal=NULL; common->postal_mask=NULL; common->c=NULL; common->attrs=NULL; } static struct search_list_country * search_list_country_new(struct item *item) { struct search_list_country *ret=g_new0(struct search_list_country, 1); struct attr attr; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_country_car, &attr)) ret->car=g_strdup(attr.u.str); if (item_attr_get(item, attr_country_iso2, &attr)) { #if HAVE_API_ANDROID ret->iso2=g_malloc(strlen(attr.u.str)+1); strtolower(ret->iso2, attr.u.str); #else ret->iso2=g_strdup(attr.u.str); #endif ret->flag=g_strdup_printf("country_%s", ret->iso2); } if (item_attr_get(item, attr_country_iso3, &attr)) ret->iso3=g_strdup(attr.u.str); if (item_attr_get(item, attr_country_name, &attr)) ret->name=g_strdup(attr.u.str); return ret; } static struct search_list_country * search_list_country_dup(struct search_list_country *this_) { struct search_list_country *ret=g_new(struct search_list_country, 1); ret->car=g_strdup(this_->car); ret->iso2=g_strdup(this_->iso2); ret->iso3=g_strdup(this_->iso3); ret->flag=g_strdup(this_->flag); ret->name=g_strdup(this_->name); return ret; } static void search_list_country_destroy(struct search_list_country *this_) { g_free(this_->car); g_free(this_->iso2); g_free(this_->iso3); g_free(this_->flag); g_free(this_->name); g_free(this_); } static struct search_list_town * search_list_town_new(struct item *item) { struct search_list_town *ret=g_new0(struct search_list_town, 1); struct attr attr; struct coord c; ret->itemt=*item; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_town_streets_item, &attr)) { dbg(1,"town_assoc 0x%x 0x%x\n", attr.u.item->id_hi, attr.u.item->id_lo); ret->common.unique=*attr.u.item; } search_list_common_new(item, &ret->common); if (item_attr_get(item, attr_county_name, &attr)) ret->county=map_convert_string(item->map,attr.u.str); else ret->county=NULL; if (item_coord_get(item, &c, 1)) { ret->common.c=g_new(struct pcoord, 1); ret->common.c->x=c.x; ret->common.c->y=c.y; ret->common.c->pro = map_projection(item->map); } return ret; } static struct search_list_town * search_list_town_dup(struct search_list_town *this_) { struct search_list_town *ret=g_new0(struct search_list_town, 1); ret->county=map_convert_dup(this_->county); search_list_common_dup(&this_->common, &ret->common); return ret; } static void search_list_town_destroy(struct search_list_town *this_) { map_convert_free(this_->county); search_list_common_destroy(&this_->common); g_free(this_); } static struct search_list_street * search_list_street_new(struct item *item) { struct search_list_street *ret=g_new0(struct search_list_street, 1); struct attr attr; struct coord p[1024]; struct coord c; int count; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_street_name, &attr)) ret->name=map_convert_string(item->map, attr.u.str); else ret->name=NULL; search_list_common_new(item, &ret->common); count=item_coord_get(item, p, sizeof(p)/sizeof(*p)); if (count) { geom_line_middle(p,count,&c); ret->common.c=g_new(struct pcoord, 1); ret->common.c->x=c.x; ret->common.c->y=c.y; ret->common.c->pro = map_projection(item->map); } return ret; } static struct search_list_street * search_list_street_dup(struct search_list_street *this_) { struct search_list_street *ret=g_new0(struct search_list_street, 1); ret->name=map_convert_dup(this_->name); search_list_common_dup(&this_->common, &ret->common); return ret; } static void search_list_street_destroy(struct search_list_street *this_) { map_convert_free(this_->name); search_list_common_destroy(&this_->common); g_free(this_); } static char * search_interpolate(struct interpolation *inter) { dbg(1,"interpolate %s-%s %s\n",inter->first,inter->last,inter->curr); if (!inter->first || !inter->last) return NULL; if (!inter->curr) inter->curr=g_strdup(inter->first); else { if (strcmp(inter->curr, inter->last)) { int next=atoi(inter->curr)+(inter->mode?2:1); g_free(inter->curr); if (next == atoi(inter->last)) inter->curr=g_strdup(inter->last); else inter->curr=g_strdup_printf("%d",next); } else { g_free(inter->curr); inter->curr=NULL; } } dbg(1,"interpolate result %s\n",inter->curr); return inter->curr; } static void search_interpolation_split(char *str, struct interpolation *inter) { char *pos=strchr(str,'-'); char *first,*last; int len; if (!pos) { inter->first=g_strdup(str); inter->last=g_strdup(str); inter->rev=0; return; } len=pos-str; first=g_malloc(len+1); strncpy(first, str, len); first[len]='\0'; last=g_strdup(pos+1); dbg(1,"%s = %s - %s\n",str, first, last); if (atoi(first) > atoi(last)) { inter->first=last; inter->last=first; inter->rev=1; } else { inter->first=first; inter->last=last; inter->rev=0; } } static int search_setup_interpolation(struct item *item, enum attr_type i0, enum attr_type i1, enum attr_type i2, struct interpolation *inter) { struct attr attr; g_free(inter->first); g_free(inter->last); g_free(inter->curr); inter->first=inter->last=inter->curr=NULL; dbg(1,"setup %s\n",attr_to_name(i0)); if (item_attr_get(item, i0, &attr)) { search_interpolation_split(attr.u.str, inter); inter->mode=0; } else if (item_attr_get(item, i1, &attr)) { search_interpolation_split(attr.u.str, inter); inter->mode=1; } else if (item_attr_get(item, i2, &attr)) { search_interpolation_split(attr.u.str, inter); inter->mode=2; } else return 0; return 1; } static int search_match(char *str, char *search, int partial) { if (!partial) return (!g_ascii_strcasecmp(str, search)); else return (!g_ascii_strncasecmp(str, search, strlen(search))); } static struct pcoord * search_house_number_coordinate(struct item *item, struct interpolation *inter) { struct pcoord *ret=g_new(struct pcoord, 1); ret->pro = map_projection(item->map); dbg(1,"%s\n",item_to_name(item->type)); if (!inter) { struct coord c; if (item_coord_get(item, &c, 1)) { ret->x=c.x; ret->y=c.y; } else { g_free(ret); ret=NULL; } } else { int count,max=1024; int hn_pos,hn_length; int step=inter->mode?2:1; struct coord *c=g_alloca(sizeof(struct coord)*max); item_coord_rewind(item); count=item_coord_get(item, c, max); hn_length=atoi(inter->last)-atoi(inter->first); if (inter->rev) hn_pos=atoi(inter->last)-atoi(inter->curr); else hn_pos=atoi(inter->curr)-atoi(inter->first); if (count) { int i,distance_sum=0,hn_distance; int *distances=g_alloca(sizeof(int)*(count-1)); dbg(1,"count=%d hn_length=%d hn_pos=%d (%s of %s-%s)\n",count,hn_length,hn_pos,inter->curr,inter->first,inter->last); if (!hn_length) { hn_length=2; hn_pos=1; } if (count == max) dbg(0,"coordinate overflow\n"); for (i = 0 ; i < count-1 ; i++) { distances[i]=navit_sqrt(transform_distance_sq(&c[i],&c[i+1])); distance_sum+=distances[i]; dbg(1,"distance[%d]=%d\n",i,distances[i]); } dbg(1,"sum=%d\n",distance_sum); #if 0 hn_distance=distance_sum*hn_pos/hn_length; #else hn_distance=(distance_sum*hn_pos+distance_sum*step/2)/(hn_length+step); #endif dbg(1,"hn_distance=%d\n",hn_distance); i=0; while (i < count-1 && hn_distance > distances[i]) hn_distance-=distances[i++]; dbg(1,"remaining distance=%d from %d\n",hn_distance,distances[i]); ret->x=(c[i+1].x-c[i].x)*hn_distance/distances[i]+c[i].x; ret->y=(c[i+1].y-c[i].y)*hn_distance/distances[i]+c[i].y; } } return ret; } static struct search_list_house_number * search_list_house_number_new(struct item *item, struct interpolation *inter, char *inter_match, int inter_partial) { struct search_list_house_number *ret=g_new0(struct search_list_house_number, 1); struct attr attr; char *hn; ret->common.item=ret->common.unique=*item; //if (item_attr_get(item, attr_street_name, &attr)) // dbg(0,"xx1 %s\n",attr.u.str); if (item_attr_get(item, attr_house_number, &attr)) ret->house_number=map_convert_string(item->map, attr.u.str); else { memset(&ret->common.unique, 0, sizeof(ret->common.unique)); //if (item_attr_get(item, attr_street_name, &attr)) // dbg(0,"xx2 %s\n",attr.u.str); for (;;) { //dbg(0,"interpolate 11"); ret->interpolation=1; switch(inter->side) { case 0: //dbg(0,"interpolate 11 0"); inter->side=-1; search_setup_interpolation(item, attr_house_number_left, attr_house_number_left_odd, attr_house_number_left_even, inter); case -1: //dbg(0,"interpolate 11 -1"); if ((hn=search_interpolate(inter))) break; inter->side=1; search_setup_interpolation(item, attr_house_number_right, attr_house_number_right_odd, attr_house_number_right_even, inter); case 1: //dbg(0,"interpolate 11 1"); if ((hn=search_interpolate(inter))) break; default: //dbg(0,"interpolate 11 default"); g_free(ret); return NULL; } if (search_match(hn, inter_match, inter_partial)) { //dbg(0,"interpolate 22"); //dbg(0,"match %s %s-%s\n",hn, inter->first, inter->last); ret->house_number=map_convert_string(item->map, hn); break; } } } //dbg(0,"interpolate 33"); search_list_common_new(item, &ret->common); ret->common.c=search_house_number_coordinate(item, ret->interpolation?inter:NULL); //dbg(0,"interpolate 44"); return ret; } static struct search_list_house_number * search_list_house_number_dup(struct search_list_house_number *this_) { struct search_list_house_number *ret=g_new0(struct search_list_house_number, 1); ret->house_number=map_convert_dup(this_->house_number); search_list_common_dup(&this_->common, &ret->common); return ret; } static void search_list_house_number_destroy(struct search_list_house_number *this_) { map_convert_free(this_->house_number); search_list_common_destroy(&this_->common); g_free(this_); } static void search_list_result_destroy(int level, void *p) { switch (level) { case 0: search_list_country_destroy(p); break; case 1: search_list_town_destroy(p); break; case 2: search_list_street_destroy(p); break; case 3: search_list_house_number_destroy(p); break; } } static struct search_list_result * search_list_result_dup(struct search_list_result *slr) { struct search_list_result *ret=g_new0(struct search_list_result, 1); ret->id=slr->id; if (slr->c) { ret->c=g_new(struct pcoord, 1); *ret->c=*slr->c; } if (slr->country) ret->country=search_list_country_dup(slr->country); if (slr->town) ret->town=search_list_town_dup(slr->town); if (slr->street) ret->street=search_list_street_dup(slr->street); if (slr->house_number) ret->house_number=search_list_house_number_dup(slr->house_number); return ret; } static void search_list_search_free(struct search_list *sl, int level) { struct search_list_level *le=&sl->levels[level]; GList *next,*curr; if (le->search) { mapset_search_destroy(le->search); le->search=NULL; } #if 0 /* FIXME */ if (le->hash) { g_hash_table_destroy(le->hash); le->hash=NULL; } #endif curr=le->list; while (curr) { search_list_result_destroy(level, curr->data); next=g_list_next(curr); curr=next; } attr_free(le->attr); g_list_free(le->list); le->list=NULL; le->curr=NULL; le->last=NULL; } char * search_postal_merge(char *mask, char *new) { int i; char *ret=NULL; dbg(1,"enter %s %s\n", mask, new); if (!new) return NULL; if (!mask) return g_strdup(new); i=0; while (mask[i] && new[i]) { if (mask[i] != '.' && mask[i] != new[i]) break; i++; } if (mask[i]) { ret=g_strdup(mask); while (mask[i]) ret[i++]='.'; } dbg(1,"merged %s with %s as %s\n", mask, new, ret); return ret; } char * search_postal_merge_replace(char *mask, char *new) { char *ret=search_postal_merge(mask, new); if (!ret) return mask; g_free(mask); return ret; } static int postal_match(char *postal, char *mask) { for (;;) { if ((*postal != *mask) && (*mask != '.')) return 0; if (!*postal) { if (!*mask) return 1; else return 0; } postal++; mask++; } } static int search_add_result(struct search_list_level *le, struct search_list_common *slc) { struct search_list_common *slo; char *merged; int unique=0; if (slc->unique.type || slc->unique.id_hi || slc->unique.id_lo) unique=1; if (unique) slo=g_hash_table_lookup(le->hash, &slc->unique); else slo=NULL; if (!slo) { if (unique) g_hash_table_insert(le->hash, &slc->unique, slc); if (slc->postal && !slc->postal_mask) { slc->postal_mask=g_strdup(slc->postal); } le->list=g_list_append(le->list, slc); return 1; } merged=search_postal_merge(slo->postal_mask, slc->postal); if (merged) { g_free(slo->postal_mask); slo->postal_mask=merged; } return 0; } /** * @brief Get (next) result from a search. * * @param this_ search_list representing the search * @return next result */ struct search_list_result * search_list_get_result(struct search_list *this_) { struct search_list_level *le,*leu; int level=this_->level; struct attr attr2; int has_street_name=0; if (this_->use_address_results) { struct search_list_result *ret=NULL; if (this_->address_results_pos) { ret=this_->address_results_pos->data; this_->address_results_pos=g_list_next(this_->address_results_pos); } return ret; } //dbg(0,"enter\n"); le=&this_->levels[level]; //dbg(0,"le=%p\n", le); for (;;) { //dbg(0,"le->search=%p\n", le->search); if (! le->search) { //dbg(0,"partial=%d level=%d\n", le->partial, level); if (! level) le->parent=NULL; else { leu=&this_->levels[level-1]; //dbg(0,"leu->curr=%p\n", leu->curr); for (;;) { //dbg(0,"*********########"); struct search_list_common *slc; if (! leu->curr) { return NULL; } le->parent=leu->curr->data; leu->last=leu->curr; leu->curr=g_list_next(leu->curr); slc=(struct search_list_common *)(le->parent); if (!slc) break; if (slc->selected == leu->selected) break; } } if (le->parent) { //dbg(0,"mapset_search_new with item(%d,%d)\n", le->parent->item.id_hi, le->parent->item.id_lo); } //dbg(0,"############## attr=%s\n", attr_to_name(le->attr->type)); le->search=mapset_search_new(this_->ms, &le->parent->item, le->attr, le->partial); le->hash=g_hash_table_new(search_item_hash_hash, search_item_hash_equal); } //dbg(0,"le->search=%p\n", le->search); if (!this_->item) { //dbg(0,"sssss 1"); this_->item=mapset_search_get_item(le->search); //dbg(0,"sssss 1 %p\n",this_->item); } if (this_->item) { void *p=NULL; //dbg(0,"id_hi=%d id_lo=%d\n", this_->item->id_hi, this_->item->id_lo); if (this_->postal) { struct attr postal; if (item_attr_get(this_->item, attr_postal_mask, &postal)) { if (!postal_match(this_->postal, postal.u.str)) continue; } else if (item_attr_get(this_->item, attr_postal, &postal)) { if (strcmp(this_->postal, postal.u.str)) continue; } } this_->result.country=NULL; this_->result.town=NULL; this_->result.street=NULL; this_->result.c=NULL; //dbg(0,"case x LEVEL start %d\n",level); switch (level) { case 0: //dbg(0,"case 0 COUNTRY"); p=search_list_country_new(this_->item); this_->result.country=p; this_->result.country->common.parent=NULL; this_->result.town=NULL; this_->result.street=NULL; this_->result.house_number=NULL; this_->item=NULL; break; case 1: //dbg(0,"case 1 TOWN"); p=search_list_town_new(this_->item); this_->result.town=p; this_->result.town->common.parent=this_->levels[0].last->data; this_->result.country=this_->result.town->common.parent; this_->result.c=this_->result.town->common.c; this_->result.street=NULL; this_->result.house_number=NULL; this_->item=NULL; break; case 2: //dbg(0,"case 2 STREET"); p=search_list_street_new(this_->item); this_->result.street=p; this_->result.street->common.parent=this_->levels[1].last->data; this_->result.town=this_->result.street->common.parent; this_->result.country=this_->result.town->common.parent; this_->result.c=this_->result.street->common.c; this_->result.house_number=NULL; this_->item=NULL; break; case 3: dbg(1,"case 3 HOUSENUMBER\n"); has_street_name=0; // if this housenumber has a streetname tag, set the name now if (item_attr_get(this_->item, attr_street_name, &attr2)) { dbg(1,"streetname: %s\n",attr2.u.str); has_street_name=1; } p=search_list_house_number_new(this_->item, &this_->inter, le->attr->u.str, le->partial); if (!p) { interpolation_clear(&this_->inter); this_->item=NULL; continue; } this_->result.house_number=p; if (!this_->result.house_number->interpolation) { this_->item=NULL; } else { dbg(0,"interpolation!\n"); } if(le->parent && has_street_name) { struct search_list_street *street=this_->levels[level-1].last->data; if(navit_utf8_strcasecmp(street->name, attr2.u.str)) { search_list_house_number_destroy(p); //this_->item=NULL; continue; } } this_->result.house_number->common.parent=this_->levels[2].last->data; this_->result.street=this_->result.house_number->common.parent; this_->result.town=this_->result.street->common.parent; this_->result.country=this_->result.town->common.parent; this_->result.c=this_->result.house_number->common.c; #if 0 if(!has_street_name) { static struct search_list_street null_street; this_->result.street=&null_street; } #endif } if (p) { if (search_add_result(le, p)) { this_->result.id++; return &this_->result; } else { search_list_result_destroy(level, p); } } } else { mapset_search_destroy(le->search); le->search=NULL; g_hash_table_destroy(le->hash); if (! level) break; } } return NULL; } void search_list_destroy(struct search_list *this_) { g_free(this_->postal); g_free(this_); } void search_init(void) { } navit-0.5.0~svn5643+dfsg.1/navit/search.h000066400000000000000000000047561221777731700177530ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_SEARCH_H #define NAVIT_SEARCH_H #ifdef __cplusplus extern "C" { #endif struct search_list_common { void *parent; struct item unique,item; int selected; struct pcoord *c; char *town_name; char *district_name; char *postal; char *postal_mask; char *county_name; struct attr **attrs; }; struct search_list_country { struct search_list_common common; char *car; char *iso2; char *iso3; char *name; char *flag; }; struct search_list_town { struct search_list_common common; struct item itemt; char *county; }; struct search_list_street { struct search_list_common common; char *name; }; struct search_list_house_number { struct search_list_common common; char *house_number; int interpolation; }; struct search_list_result { int id; struct pcoord *c; struct search_list_country *country; struct search_list_town *town; struct search_list_street *street; struct search_list_house_number *house_number; }; /* prototypes */ struct attr; struct mapset; struct search_list; struct search_list_result; struct jni_object; struct search_list *search_list_new(struct mapset *ms); int search_list_level(enum attr_type attr_type); void search_list_search(struct search_list *this_, struct attr *search_attr, int partial); char *search_postal_merge(char *mask, char *new_); char *search_postal_merge_replace(char *mask, char *new_); struct search_list_common *search_list_select(struct search_list *this_, enum attr_type attr_type, int id, int mode); char *search_list_get_unique(struct search_list *this_, char *unique); struct search_list_result *search_list_get_result(struct search_list *this_); void search_list_destroy(struct search_list *this_); void search_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/speech.c000066400000000000000000000113141221777731700177340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "item.h" #include "speech.h" #include "plugin.h" #include "xmlconfig.h" struct speech { NAVIT_OBJECT; struct speech_priv *priv; struct speech_methods meth; }; struct speech * speech_new(struct attr *parent, struct attr **attrs) { struct speech *this_; struct speech_priv *(*speech_new)(struct speech_methods *meth, struct attr **attrs, struct attr *parent); struct attr *attr; attr=attr_search(attrs, NULL, attr_type); if (! attr) { dbg(0,"type missing\n"); return NULL; } dbg(1,"type='%s'\n", attr->u.str); speech_new=plugin_get_speech_type(attr->u.str); dbg(1,"new=%p\n", speech_new); if (! speech_new) { dbg(0,"wrong type '%s'\n", attr->u.str); return NULL; } this_=(struct speech *)navit_object_new(attrs, &speech_func, sizeof(struct speech)); this_->priv=speech_new(&this_->meth, this_->attrs, parent); dbg(1, "say=%p\n", this_->meth.say); dbg(1,"priv=%p\n", this_->priv); if (! this_->priv) { speech_destroy(this_); return NULL; } dbg(1,"return %p\n", this_); return this_; } void speech_destroy(struct speech *this_) { if (this_->priv) this_->meth.destroy(this_->priv); navit_object_destroy((struct navit_object *)this_); } int speech_say(struct speech *this_, const char *text) { dbg(1, "this_=%p text='%s' calling %p\n", this_, text, this_->meth.say); return (this_->meth.say)(this_->priv, text); } struct attr active=ATTR_INT(active, 1); struct attr *speech_default_attrs[]={ &active, NULL, }; /** * @brief Gets an attribute from a speech plugin * * @param this_ The speech plugin the attribute should be read from * @param type The type of the attribute to be read * @param attr Pointer to an attrib-structure where the attribute should be written to * @param iter (NOT IMPLEMENTED) Used to iterate through all attributes of a type. Set this to NULL to get the first attribute, set this to an attr_iter to get the next attribute * @return True if the attribute type was found, false if not */ int speech_get_attr(struct speech *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, speech_default_attrs, type, attr, iter); } /** * @brief Tries to estimate how long it will take to speak a certain string * * This function tries to estimate how long it will take to speak a certain string * passed in str. It relies on the "characters per second"-value passed from the * configuration. * * @param this_ The speech whose speed should be used * @param str The string that should be estimated * @return Time in tenth of seconds or -1 on error */ int speech_estimate_duration(struct speech *this_, char *str) { int count; struct attr cps_attr; if (!speech_get_attr(this_,attr_cps,&cps_attr,NULL)) { return -1; } count = strlen(str); return (count * 10) / cps_attr.u.num; } /** * @brief Sets an attribute from an speech plugin * * This sets an attribute of a speech plugin, overwriting an attribute of the same type if it * already exists. This function also calls all the callbacks that are registred * to be called when attributes change. * * @param this_ The speech plugin to set the attribute of * @param attr The attribute to set * @return True if the attr could be set, false otherwise */ int speech_set_attr(struct speech *this_, struct attr *attr) { this_->attrs=attr_generic_set_attr(this_->attrs, attr); //callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); return 1; } struct object_func speech_func = { attr_speech, (object_func_new)speech_new, (object_func_get_attr)speech_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)speech_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)speech_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/speech.h000066400000000000000000000027361221777731700177510ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_SPEECH_H #define NAVIT_SPEECH_H struct speech_priv; struct attr_iter; struct speech_methods { void (*destroy)(struct speech_priv *this_); int (*say)(struct speech_priv *this_, const char *text); }; /* prototypes */ struct speech * speech_new(struct attr *parent, struct attr **attrs); int speech_say(struct speech *this_, const char *text); int speech_sayf(struct speech *this_, const char *format, ...); void speech_destroy(struct speech *this_); int speech_get_attr(struct speech *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int speech_set_attr(struct speech *this_, struct attr *attr); int speech_estimate_duration(struct speech *this_, char *str); /* end of prototypes */ #endif navit-0.5.0~svn5643+dfsg.1/navit/speech/000077500000000000000000000000001221777731700175705ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/speech/Makefile.am000066400000000000000000000003661221777731700216310ustar00rootroot00000000000000SUBDIRS= if SPEECH_ANDROID SUBDIRS += android endif if SPEECH_CMDLINE SUBDIRS += cmdline endif if SPEECH_DBUS SUBDIRS += dbus endif if SPEECH_ESPEAK SUBDIRS += espeak endif if SPEECH_SPEECH_DISPATCHER SUBDIRS += speech_dispatcher endif navit-0.5.0~svn5643+dfsg.1/navit/speech/cmdline/000077500000000000000000000000001221777731700212035ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/speech/cmdline/CMakeLists.txt000066400000000000000000000000641221777731700237430ustar00rootroot00000000000000module_add_library(speech_cmdline speech_cmdline.c) navit-0.5.0~svn5643+dfsg.1/navit/speech/cmdline/Makefile.am000066400000000000000000000005331221777731700232400ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_cmdline if PLUGINS modulespeech_LTLIBRARIES = libspeech_cmdline.la else noinst_LTLIBRARIES = libspeech_cmdline.la endif libspeech_cmdline_la_SOURCES = speech_cmdline.c libspeech_cmdline_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/speech/cmdline/speech_cmdline.c000066400000000000000000000150611221777731700243140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "config.h" #include "debug.h" #include "item.h" #include "plugin.h" #include "file.h" #include "speech.h" #include "util.h" #ifdef HAVE_API_WIN32_BASE #include #endif #ifdef USE_EXEC #include #include #include #endif static char *urldecode(char *str) { char *ret=g_strdup(str); char *src=ret; char *dst=ret; while (*src) { if (*src == '%') { int val; if (sscanf(src+1,"%02x",&val)) { src+=2; *dst++=val; } src++; } else *dst++=*src++; } *dst++='\0'; return ret; } static GList * speech_cmdline_search(GList *samples, int suffix_len, const char *text, int decode) { GList *loop_samples=samples,*result=NULL,*recursion_result; int shortest_result_length=INT_MAX; dbg(1,"searching samples for text: '%s'\n",text); while (loop_samples) { char *sample_name=loop_samples->data; int sample_name_len; if (decode) sample_name=urldecode(sample_name); sample_name_len=strlen(sample_name)-suffix_len; // TODO: Here we compare UTF-8 text with a filename. // It's unclear how a case-insensitive comparison should work // in general, so for now we only do it for ASCII text. if (!g_ascii_strncasecmp(text, sample_name, sample_name_len)) { const char *remaining_text=text+sample_name_len; while (*remaining_text == ' ' || *remaining_text == ',') remaining_text++; dbg(1,"sample '%s' matched; remaining text: '%s'\n",sample_name,remaining_text); if (*remaining_text) { recursion_result=speech_cmdline_search(samples, suffix_len, remaining_text, decode); if (recursion_result && g_list_length(recursion_result) < shortest_result_length) { g_list_free(result); result=recursion_result; result=g_list_prepend(result, loop_samples->data); shortest_result_length=g_list_length(result); } else { dbg(1,"no (shorter) result found for remaining text '%s', " "trying next sample\n", remaining_text); g_list_free(recursion_result); } } else { g_list_free(result); result=g_list_prepend(NULL, loop_samples->data); break; } } if (decode) g_free(sample_name); loop_samples=g_list_next(loop_samples); } return result; } #if 0 r=search(l, strlen(path)+1, suffix_len, argv[1]); while (r) { printf("%s/%s\n",path,r->data); r=g_list_next(r); } return 0; #endif struct speech_priv { char *cmdline; char *sample_dir; char *sample_suffix; int flags; GList *samples; struct spawn_process_info *spi; }; static int speechd_say(struct speech_priv *this, const char *text) { char **cmdv=g_strsplit(this->cmdline," ", -1); int variable_arg_no=-1; GList *argl=NULL; guint listlen; int samplesmode=0; int i; for(i=0;cmdv[i];i++) if(strchr(cmdv[i],'%')) { variable_arg_no=i; break; } if (this->sample_dir && this->sample_suffix) { argl=speech_cmdline_search(this->samples, strlen(this->sample_suffix), text, !!(this->flags & 1)); samplesmode=1; listlen=g_list_length(argl); dbg(1,"For text: '%s', found %d samples.\n",text,listlen); if (!listlen){ dbg(0,"No matching samples found. Cannot speak text: '%s'\n",text); } } else { listlen=1; } if(listlen>0) { dbg(1,"Speaking text '%s'\n",text); int argc; char**argv; int j; int cmdvlen=g_strv_length(cmdv); argc=cmdvlen + listlen - (variable_arg_no>0?1:0); argv=g_new(char *,argc+1); if(variable_arg_no==-1) { argv[cmdvlen]=g_strdup("%s"); variable_arg_no=cmdvlen; } for(i=0,j=0;jsample_dir,(char *)l->data); dbg(1,"new_arg %s\n",new_arg); argv[j++]=g_strdup_printf(cmdv[i],new_arg); g_free(new_arg); l=g_list_next(l); } } else { argv[j++]=g_strdup_printf(cmdv[i],text); } i++; } else { argv[j++]=g_strdup(cmdv[i++]); } } argv[j]=NULL; if (argl) // No need to free data elements here as they are // still referenced from this->samples g_list_free(argl); if(this->spi) { spawn_process_check_status(this->spi,1); // Block until previous spawned speech process is terminated. spawn_process_info_free(this->spi); } this->spi=spawn_process(argv); g_strfreev(argv); } g_strfreev(cmdv); return 0; } static void speechd_destroy(struct speech_priv *this) { GList *l=this->samples; g_free(this->cmdline); g_free(this->sample_dir); g_free(this->sample_suffix); while(l) { g_free(l->data); } g_list_free(this->samples); if(this->spi) spawn_process_info_free(this->spi); g_free(this); } static struct speech_methods speechd_meth = { speechd_destroy, speechd_say, }; static struct speech_priv * speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { struct speech_priv *this; struct attr *attr; attr=attr_search(attrs, NULL, attr_data); if (! attr) return NULL; this=g_new0(struct speech_priv,1); this->cmdline=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_sample_dir))) this->sample_dir=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_sample_suffix))) this->sample_suffix=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_flags))) this->flags=attr->u.num; if (this->sample_dir && this->sample_suffix) { void *handle=file_opendir(this->sample_dir); char *name; int suffix_len=strlen(this->sample_suffix); while((name=file_readdir(handle))) { int len=strlen(name); if (len > suffix_len) { if (!strcmp(name+len-suffix_len, this->sample_suffix)) { dbg(1,"found %s\n",name); this->samples=g_list_prepend(this->samples, g_strdup(name)); } } } file_closedir(handle); } *meth=speechd_meth; return this; } void plugin_init(void) { plugin_register_speech_type("cmdline", speechd_new); } navit-0.5.0~svn5643+dfsg.1/navit/speech/dbus/000077500000000000000000000000001221777731700205255ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/speech/dbus/CMakeLists.txt000066400000000000000000000000571221777731700232670ustar00rootroot00000000000000module_add_library(speech_dbus speech_dbus.c) navit-0.5.0~svn5643+dfsg.1/navit/speech/dbus/Makefile.am000066400000000000000000000004141221777731700225600ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_dbus modulespeech_LTLIBRARIES = libspeech_dbus.la libspeech_dbus_la_SOURCES = speech_dbus.c libspeech_dbus_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/speech/dbus/speech_dbus.c000066400000000000000000000037271221777731700231660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "config.h" #include "item.h" #include "plugin.h" #include "navit.h" #include "attr.h" #include "callback.h" #include "speech.h" struct speech_priv { struct navit *nav; }; static int speech_dbus_say(struct speech_priv *this, const char *text) { struct attr attr1,attr2,cb,*attr_list[3]; int valid=0; attr1.type=attr_type; attr1.u.str="speech"; attr2.type=attr_data; attr2.u.str=(char *)text; attr_list[0]=&attr1; attr_list[1]=&attr2; attr_list[2]=NULL; if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); return 0; } static void speech_dbus_destroy(struct speech_priv *this) { g_free(this); } static struct speech_methods speech_dbus_meth = { speech_dbus_destroy, speech_dbus_say, }; static struct speech_priv * speech_dbus_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { struct speech_priv *this; if (!parent || parent->type != attr_navit) return NULL; this=g_new(struct speech_priv,1); this->nav=parent->u.navit; *meth=speech_dbus_meth; return this; } void plugin_init(void) { plugin_register_speech_type("dbus", speech_dbus_new); } navit-0.5.0~svn5643+dfsg.1/navit/speech/espeak/000077500000000000000000000000001221777731700210405ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/speech/espeak/CMakeLists.txt000066400000000000000000000001361221777731700236000ustar00rootroot00000000000000module_add_library(speech_espeak speak.c) target_link_libraries(speech_espeak support_espeak) navit-0.5.0~svn5643+dfsg.1/navit/speech/espeak/Makefile.am000066400000000000000000000007141221777731700230760ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_espeak if PLUGINS modulespeech_LTLIBRARIES = libspeech_espeak.la else noinst_LTLIBRARIES = libspeech_espeak.la endif libspeech_espeak_la_SOURCES = speak.c libspeech_espeak_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ -L$(top_builddir)/navit/support/espeak -lsupport_espeak if !SUPPORT_WIN32CE libspeech_espeak_la_LDFLAGS += -Wl,-lwinmm endif navit-0.5.0~svn5643+dfsg.1/navit/speech/espeak/speak.c000066400000000000000000000265441221777731700223220ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _WIN32_WINNT 0x0500 #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #include #include #else #include #endif #include #include #include #include "item.h" #include "plugin.h" #include "speech.h" #include "util.h" #include "file.h" #include "debug.h" #include "support/espeak/speech.h" #include "support/espeak/speak_lib.h" #include "support/espeak/phoneme.h" #include "support/espeak/synthesize.h" #include "support/espeak/voice.h" #include "support/espeak/translate.h" #define BUFFERS 4 // ----- some stuff needed by espeak ---------------------------------- char path_home[N_PATH_HOME]; // this is the espeak-data directory int (* uri_callback)(int, const char *, const char *) = NULL; int (* phoneme_callback)(const char *) = NULL; FILE *f_wave = NULL; int GetFileLength(const char *filename) { struct stat statbuf; if(stat(filename,&statbuf) != 0) return(0); if((statbuf.st_mode & S_IFMT) == S_IFDIR) return(-2); // a directory return(statbuf.st_size); } void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) { } char *Alloc(int size) { return g_malloc(size); } void Free(void *ptr) { g_free(ptr); } // -------------------------------------------------------------------- enum speech_messages { msg_say = WM_USER, msg_exit }; enum speech_state { state_available, state_speaking_phase_1, state_speaking_phase_2, state_speaking_phase_3 }; struct speech_priv { GList *free_buffers; HWAVEOUT h_wave_out; enum speech_state state; GList *phrases; HWND h_queue; HANDLE h_message_thread; }; static void waveout_close(struct speech_priv* sp_priv) { waveOutClose(sp_priv->h_wave_out); } static BOOL waveout_open(struct speech_priv* sp_priv) { MMRESULT result = 0; HWAVEOUT hwo; static WAVEFORMATEX wmTemp; wmTemp.wFormatTag = WAVE_FORMAT_PCM; wmTemp.nChannels = 1; wmTemp.nSamplesPerSec = 22050; wmTemp.wBitsPerSample = 16; wmTemp.nBlockAlign = wmTemp.nChannels * wmTemp.wBitsPerSample / 8; wmTemp.nAvgBytesPerSec = wmTemp.nSamplesPerSec * wmTemp.nBlockAlign; wmTemp.cbSize = 0; result = waveOutOpen(&hwo, (UINT) WAVE_MAPPER, &wmTemp, (DWORD)sp_priv->h_queue, (DWORD)sp_priv, CALLBACK_WINDOW); sp_priv->h_wave_out = hwo; return (result==MMSYSERR_NOERROR); } static int wave_out(struct speech_priv* sp_priv) { int isDone; WAVEHDR *WaveHeader = g_list_first(sp_priv->free_buffers)->data; sp_priv->free_buffers = g_list_remove(sp_priv->free_buffers, WaveHeader); out_ptr = out_start = WaveHeader->lpData; out_end = WaveHeader->lpData + WaveHeader->dwBufferLength; isDone = WavegenFill(0); if ( out_ptr < out_end ) { memset ( out_ptr, 0, out_end - out_ptr ); } waveOutWrite(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); return isDone; } static BOOL initialise(void) { int param; int result; WavegenInit(22050,0); // 22050 if((result = LoadPhData()) != 1) { if(result == -1) { dbg(0, "Failed to load espeak-data\n"); return FALSE; } else dbg(0, "Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); } LoadConfig(); SetVoiceStack(NULL); SynthesizeInit(); for(param=0; paramfree_buffers && this->state != state_speaking_phase_3 ) { if(Generate(phoneme_list,&n_phoneme_list,1)==0) { if (!SpeakNextClause(NULL,NULL,1)) { this->state = state_speaking_phase_2; } } if ( wave_out(this)!= 0 && this->state == state_speaking_phase_2) { this->state = state_speaking_phase_3; } } } static void start_speaking(struct speech_priv* sp_priv) { char *phrase = g_list_first(sp_priv->phrases)->data; sp_priv->state = state_speaking_phase_1; SpeakNextClause(NULL, phrase,0); wave_out(sp_priv); fill_buffer(sp_priv); } static LRESULT CALLBACK speech_message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { dbg(1, "message_handler called\n"); switch (uMsg) { case msg_say: { struct speech_priv* sp_priv = (struct speech_priv*)wParam; sp_priv->phrases = g_list_append(sp_priv->phrases, (char*)lParam); if ( sp_priv->state == state_available ) { start_speaking(sp_priv); } } break; case MM_WOM_DONE: { WAVEHDR *WaveHeader = (WAVEHDR *)lParam; struct speech_priv* sp_priv; dbg(2, "Wave buffer done\n"); sp_priv = (struct speech_priv*)WaveHeader->dwUser; sp_priv->free_buffers = g_list_append(sp_priv->free_buffers, WaveHeader); if ( sp_priv->state != state_speaking_phase_3) { fill_buffer(sp_priv); } else if ( g_list_length(sp_priv->free_buffers) == BUFFERS && sp_priv->state == state_speaking_phase_3 ) { // remove the spoken phrase from the list char *phrase = g_list_first(sp_priv->phrases)->data; g_free( phrase ); sp_priv->phrases = g_list_remove(sp_priv->phrases, phrase); if ( sp_priv->phrases ) { start_speaking(sp_priv); } else { sp_priv->state = state_available; } } } break; case msg_exit: ExitThread(0); break; default: break; } return TRUE; } static void speech_message_dispatcher( struct speech_priv * sp_priv) { BOOL bRet; MSG msg; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { dbg(0, "Error getting message from queue\n"); break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } } static void create_buffers(struct speech_priv *sp_priv) { int buffer_counter; char *buffer_head; SYSTEM_INFO system_info; GetSystemInfo (&system_info); buffer_head = VirtualAlloc(0, system_info.dwPageSize * BUFFERS, MEM_RESERVE, PAGE_NOACCESS); for (buffer_counter = 0; buffer_counter < BUFFERS; buffer_counter++) { WAVEHDR *WaveHeader = g_new0(WAVEHDR, 1); WaveHeader->dwBufferLength = system_info.dwPageSize; WaveHeader->lpData = (char *)VirtualAlloc(buffer_head, WaveHeader->dwBufferLength, MEM_COMMIT, PAGE_READWRITE); buffer_head += WaveHeader->dwBufferLength; WaveHeader->dwUser = (DWORD)sp_priv; waveOutPrepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); sp_priv->free_buffers = g_list_append( sp_priv->free_buffers, WaveHeader ); } } static DWORD startThread( LPVOID sp_priv) { struct speech_priv *this = (struct speech_priv *) sp_priv; // Create message queue TCHAR *g_szClassName = TEXT("SpeechQueue"); WNDCLASS wc; HWND hwnd; HWND hWndParent; memset(&wc, 0 , sizeof(WNDCLASS)); wc.lpfnWndProc = speech_message_handler; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = g_szClassName; if (!RegisterClass(&wc)) { dbg(0, "Window registration for message queue failed\n"); return 1; } hWndParent = NULL; #ifndef HAVE_API_WIN32_CE hWndParent = HWND_MESSAGE; #endif // create a message only window hwnd = CreateWindow( g_szClassName, TEXT("Navit"), 0, 0, 0, 0, 0, hWndParent, NULL, GetModuleHandle(NULL), NULL); if (hwnd == NULL) { dbg(0, "Window creation failed: %d\n", GetLastError()); return 1; } this->h_queue = hwnd; this->phrases = NULL; this->state = state_available; if(!waveout_open(this)) { dbg(0, "Can't open wave output\n"); return 1; } this->free_buffers = NULL; create_buffers(this); speech_message_dispatcher(this); return 0; } static int espeak_say(struct speech_priv *this, const char *text) { char *phrase = g_strdup(text); dbg(1, "Speak: '%s'\n", text); if (!PostMessage(this->h_queue, msg_say, (WPARAM)this, (LPARAM)phrase)) { dbg(0, "PostThreadMessage 'say' failed\n"); } return 0; } static void free_list(gpointer pointer, gpointer this ) { if ( this ) { struct speech_priv *sp_priv = (struct speech_priv *)this; WAVEHDR *WaveHeader = (WAVEHDR *)pointer; waveOutUnprepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); VirtualFree(WaveHeader->lpData, WaveHeader->dwBufferLength, MEM_DECOMMIT); } g_free(pointer); } static void espeak_destroy(struct speech_priv *this) { g_list_foreach( this->free_buffers, free_list, (gpointer)this ); g_list_free( this->free_buffers ); g_list_foreach( this->phrases, free_list, 0 ); g_list_free(this->phrases); waveout_close(this); g_free(this); } static struct speech_methods espeak_meth = { espeak_destroy, espeak_say, }; static struct speech_priv * espeak_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { struct speech_priv *this = NULL; struct attr *path; struct attr *language; char *lang_str=NULL; path=attr_search(attrs, NULL, attr_path); if (path) strcpy(path_home,path->u.str); else sprintf(path_home,"%s/espeak-data",getenv("NAVIT_SHAREDIR")); dbg(0,"path_home set to %s\n",path_home); if ( !initialise() ) { return NULL; } language=attr_search(attrs, NULL, attr_language); if ( language ) { lang_str=g_strdup(language->u.str); } else { char *lang_env=getenv("LANG"); if (lang_env) { char *country,*lang,*lang_full; char *file1; char *file2; lang_full=g_strdup(lang_env); strtolower(lang_full,lang_env); lang=g_strdup(lang_full); country=strchr(lang_full,'_'); if (country) { lang[country-lang_full]='\0'; *country++='-'; } file1=g_strdup_printf("%s/voices/%s",path_home,lang_full); file2=g_strdup_printf("%s/voices/%s/%s",path_home,lang,lang_full); dbg(0,"Testing %s and %s\n",file1,file2); if (file_exists(file1) || file_exists(file2)) lang_str=g_strdup(lang_full); else lang_str=g_strdup(lang); dbg(0,"Language full %s lang %s result %s\n",lang_full,lang,lang_str); g_free(lang_full); g_free(lang); g_free(file1); g_free(file2); } } if(lang_str && SetVoiceByName(lang_str) != EE_OK) { dbg(0, "Error setting language to: '%s',falling back to default\n", lang_str); g_free(lang_str); lang_str=NULL; } if(!lang_str && SetVoiceByName("default") != EE_OK) { dbg(0, "Error setting language to default\n"); } SetParameter(espeakRATE,170,0); SetParameter(espeakVOLUME,100,0); SetParameter(espeakCAPITALS,option_capitals,0); SetParameter(espeakPUNCTUATION,option_punctuation,0); SetParameter(espeakWORDGAP,0,0); // if(pitch_adjustment != 50) // { // SetParameter(espeakPITCH,pitch_adjustment,0); // } DoVoiceChange(voice); this=g_new(struct speech_priv,1); this->h_message_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)startThread, (PVOID)this, 0, NULL); *meth=espeak_meth; return this; } void plugin_init(void) { plugin_register_speech_type("espeak", espeak_new); } navit-0.5.0~svn5643+dfsg.1/navit/speech/speech_dispatcher/000077500000000000000000000000001221777731700232455ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/speech/speech_dispatcher/CMakeLists.txt000066400000000000000000000001101221777731700257750ustar00rootroot00000000000000module_add_library(speech_speech_dispatcher speech_speech_dispatcher.c) navit-0.5.0~svn5643+dfsg.1/navit/speech/speech_dispatcher/Makefile.am000066400000000000000000000005551221777731700253060ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_speech_dispatcher modulespeech_LTLIBRARIES = libspeech_speech_dispatcher.la libspeech_speech_dispatcher_la_SOURCES = speech_speech_dispatcher.c libspeech_speech_dispatcher_la_LIBADD = @SPEECHD_LIBS@ libspeech_speech_dispatcher_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/speech/speech_dispatcher/speech_speech_dispatcher.c000066400000000000000000000035671221777731700304300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include "config.h" #include #include "plugin.h" #include "speech.h" struct speech_priv { SPDConnection *conn; }; static int speechd_say(struct speech_priv *this, const char *text) { int err; err = spd_sayf(this->conn, SPD_MESSAGE, text); if (err != 1) return 1; return 0; } static void speechd_destroy(struct speech_priv *this) { spd_close(this->conn); g_free(this); } static struct speech_methods speechd_meth = { speechd_destroy, speechd_say, }; static struct speech_priv * speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *attr) { struct speech_priv *this; SPDConnection *conn; conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE); if (! conn) return NULL; this=g_new(struct speech_priv,1); if (this) { this->conn=conn; *meth=speechd_meth; spd_set_punctuation(conn, SPD_PUNCT_NONE); } return this; } void plugin_init(void) { plugin_register_speech_type("speech_dispatcher", speechd_new); } navit-0.5.0~svn5643+dfsg.1/navit/start.c000066400000000000000000000015061221777731700176240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "start_real.h" int main(int argc, char **argv) { return main_real(argc, argv); } navit-0.5.0~svn5643+dfsg.1/navit/start_apple.m000066400000000000000000000027711221777731700210240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "start_real.h" #import #include #include int main(int argc, char **argv) { int ret; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *appFolderPath = [[NSBundle mainBundle] resourcePath]; NSString *locale = [[NSLocale currentLocale] localeIdentifier]; char *lang=g_strdup_printf("%s.UTF-8",[locale UTF8String]); dbg(0,"lang %s\n",lang); setenv("LANG",lang,0); setlocale(LC_ALL, NULL); const char *s=[appFolderPath UTF8String]; char *user=g_strdup_printf("%s/../Documents",s); chdir(s); argv[0]=g_strdup_printf("%s/bin/navit",s); setenv("NAVIT_USER_DATADIR",user,0); dbg(0,"calling main_real\n"); ret=main_real(argc, argv); g_free(argv[0]); g_free(user); [pool release]; return ret; } navit-0.5.0~svn5643+dfsg.1/navit/start_real.c000066400000000000000000000142471221777731700206350ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #ifdef HAVE_GETOPT_H #include #else #include #endif #include "config_.h" #include "version.h" #include "item.h" #include "coord.h" #include "main.h" #include "route.h" #include "navigation.h" #include "track.h" #include "debug.h" #include "event.h" #include "event_glib.h" #include "xmlconfig.h" #include "file.h" #include "search.h" #include "start_real.h" #include "linguistics.h" #include "navit_nls.h" #include "atom.h" #include "command.h" #include "geom.h" #ifdef HAVE_API_WIN32_CE #include #include #endif char *version=PACKAGE_VERSION" "SVN_VERSION""NAVIT_VARIANT; int main_argc; char * const* main_argv; static void print_usage(void) { printf("%s",_("navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n")); } #ifndef USE_PLUGINS extern void builtin_init(void); #endif /* USE_PLUGINS*/ int main_real(int argc, char * const* argv) { xmlerror *error = NULL; char *config_file = NULL, *command=NULL, *startup_file=NULL; int opt; char *cp; struct attr navit, conf; GList *list = NULL, *li; main_argc=argc; main_argv=argv; #ifdef HAVE_GLIB event_glib_init(); #else _g_slice_thread_init_nomessage(); #endif atom_init(); main_init(argv[0]); navit_nls_main_init(); debug_init(argv[0]); cp = getenv("NAVIT_LOGFILE"); if (cp) { debug_set_logfile(cp); } #ifdef HAVE_API_WIN32_CE else { debug_set_logfile("/Storage Card/navit.log"); } #endif file_init(); #ifndef USE_PLUGINS builtin_init(); #endif route_init(); navigation_init(); tracking_init(); search_init(); linguistics_init(); geom_init(); config_file=NULL; #ifdef HAVE_GETOPT_H opterr=0; //don't bomb out on errors. #endif /* _MSC_VER */ /* ingore iphone command line argument */ if (argc == 2 && !strcmp(argv[1],"-RegisterForSystemEvents")) argc=1; if (argc > 1) { /* Don't forget to update the manpage if you modify theses options */ while((opt = getopt(argc, argv, ":hvc:d:e:s:")) != -1) { switch(opt) { case 'h': print_usage(); exit(0); break; case 'v': printf("%s %s\n", "navit", version); exit(0); break; case 'c': printf("config file n is set to `%s'\n", optarg); config_file = optarg; break; case 'd': debug_set_global_level(atoi(optarg), 1); break; case 'e': command=optarg; break; case 's': startup_file=optarg; break; #ifdef HAVE_GETOPT_H case ':': fprintf(stderr, "navit: Error - Option `%c' needs a value\n", optopt); print_usage(); exit(2); break; case '?': fprintf(stderr, "navit: Error - No such option: `%c'\n", optopt); print_usage(); exit(3); #endif } } // use 1st cmd line option that is left for the config file if (optind < argc) config_file = argv[optind]; } // if config file is explicitely given only look for it, otherwise try std paths if (config_file) { list = g_list_append(list,g_strdup(config_file)); } else { list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_USER_DATADIR"), "/navit.xml" , NULL)); list = g_list_append(list,g_strdup("navit.xml.local")); list = g_list_append(list,g_strdup("navit.xml")); #ifdef HAVE_API_ANDROID // new preferred location (the new one should have priority over the legacy!) list = g_list_append(list,g_strdup("/sdcard/navit/navit.xml")); // legacy location, still supported list = g_list_append(list,g_strdup("/sdcard/navit.xml")); #endif list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml.local" , NULL)); list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml" , NULL)); #ifndef _WIN32 list = g_list_append(list,g_strdup("/etc/navit/navit.xml")); #endif } li = list; for (;;) { if (li == NULL) { // We have not found an existing config file from all possibilities dbg(0, "%s", _("No config file navit.xml, navit.xml.local found\n")); return 4; } // Try the next config file possibility from the list config_file = li->data; dbg(1,"trying %s\n",config_file); if (file_exists(config_file)) { break; } g_free(config_file); li = g_list_next(li); } dbg(0,"Loading %s\n",config_file); if (!config_load(config_file, &error)) { dbg(0, _("Error parsing config file '%s': %s\n"), config_file, error ? error->message : ""); } else { dbg(0, _("Using config file '%s'\n"), config_file); } while (li) { g_free(li->data); li = g_list_next(li); } g_list_free(list); if (! config_get_attr(config, attr_navit, &navit, NULL) && !config_empty_ok) { dbg(0, "%s", _("Internal initialization failed, exiting. Check previous error messages.\n")); exit(5); } conf.type=attr_config; conf.u.config=config; if (startup_file) { FILE *f=fopen(startup_file,"r"); if (f) { char buffer[4096]; while(fgets(buffer, sizeof(buffer), f)) { command_evaluate(&conf, buffer); } } } if (command) { command_evaluate(&conf, command); } event_main_loop_run(); /* TODO: Android actually has no event loop, so we can't free all allocated resources here. Have to find better place to * free all allocations on program exit. And don't forget to free all the stuff allocated in the code above. */ #ifndef HAVE_API_ANDROID linguistics_free(); debug_finished(); #endif return 0; } navit-0.5.0~svn5643+dfsg.1/navit/start_real.h000066400000000000000000000015261221777731700206360ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAIN_REAL_H #define NAVIT_MAIN_REAL_H int main_real(int argc, char * const* argv); #endif navit-0.5.0~svn5643+dfsg.1/navit/startonce.sh000077500000000000000000000027301221777731700206640ustar00rootroot00000000000000#!/bin/sh # This script is part of navit, a navigation system. # It can be used to make sure that navit is only started # once. If navit is already running it will be brought to # the front. # Set this to a place where a pidfile should be stored. # Make sure you have write access... PIDFILE="/var/run/navit/navit.pid" # Set this to navit's executable. NAVIT="./navit" # Optional: Set this to an alternative configuration file #CONFIG="./navit.xml" ############################################################ ### You should not need to edit anything below this line ### ############################################################ function check_wmctrl() { which wmctrl > /dev/null if [ $? -ne 0 ] ; then echo "I need the 'wmctrl' program. Exit." exit 1 fi } function start_navit() { if [ "x" != "x$CONFIG" ] ; then $NAVIT -c $CONFIG & else $NAVIT & fi pid=$! echo -n "$pid" > $PIDFILE if [ $? -eq 0 ] ; then echo "Started navit with PID $pid." else kill $pid echo "Could not create pidfile!" exit 1 fi # Waiting for navit to close... wait $pid rm $PIDFILE } function check_navit() { if [ -f $PIDFILE ] ; then pid=`cat $PIDFILE` kill -0 $pid 2>/dev/null if [ $? -eq 0 ] ; then echo "Bringing Navit to front" winid=`wmctrl -l -p | grep -e "^[^:blank:]*[:blank:]*[^:blank:]*[:blank:]*$pid[:blank:]*" | sed 's/ .*//'` wmctrl -i -R $winid exit 0 fi fi } ### Start of the main script ### check_wmctrl check_navit start_navit navit-0.5.0~svn5643+dfsg.1/navit/sunriset.c000066400000000000000000000307721221777731700203520ustar00rootroot00000000000000/* SUNRISET.C - computes Sun rise/set times, start/end of twilight, and the length of the day at any date and latitude Written as DAYLEN.C, 1989-08-16 Modified to SUNRISET.C, 1992-12-01 (c) Paul Schlyter, 1989, 1992 Released to the public domain by Paul Schlyter, December 1992 */ #include #include #include "sunriset.h" /* The "workhorse" function for sun rise/set times */ int __sunriset__( int year, int month, int day, double lon, double lat, double altit, int upper_limb, double *trise, double *tset ) /***************************************************************************/ /* Note: year,month,date = calendar date, 1801-2099 only. */ /* Eastern longitude positive, Western longitude negative */ /* Northern latitude positive, Southern latitude negative */ /* The longitude value IS critical in this function! */ /* altit = the altitude which the Sun should cross */ /* Set to -35/60 degrees for rise/set, -6 degrees */ /* for civil, -12 degrees for nautical and -18 */ /* degrees for astronomical twilight. */ /* upper_limb: non-zero -> upper limb, zero -> center */ /* Set to non-zero (e.g. 1) when computing rise/set */ /* times, and to zero when computing start/end of */ /* twilight. */ /* *rise = where to store the rise time */ /* *set = where to store the set time */ /* Both times are relative to the specified altitude, */ /* and thus this function can be used to comupte */ /* various twilight times, as well as rise/set times */ /* Return value: 0 = sun rises/sets this day, times stored at */ /* *trise and *tset. */ /* +1 = sun above the specified "horizon" 24 hours. */ /* *trise set to time when the sun is at south, */ /* minus 12 hours while *tset is set to the south */ /* time plus 12 hours. "Day" length = 24 hours */ /* -1 = sun is below the specified "horizon" 24 hours */ /* "Day" length = 0 hours, *trise and *tset are */ /* both set to the time when the sun is at south. */ /* */ /**********************************************************************/ { double d, /* Days since 2000 Jan 0.0 (negative before) */ sr, /* Solar distance, astronomical units */ sRA, /* Sun's Right Ascension */ sdec, /* Sun's declination */ sradius, /* Sun's apparent radius */ t, /* Diurnal arc */ tsouth, /* Time when Sun is at south */ sidtime; /* Local sidereal time */ int rc = 0; /* Return cde from function - usually 0 */ /* Compute d of 12h local mean solar time */ d = days_since_2000_Jan_0(year,month,day) + 0.5 - lon/360.0; /* Compute local sideral time of this moment */ sidtime = revolution( GMST0(d) + 180.0 + lon ); /* Compute Sun's RA + Decl at this moment */ sun_RA_dec( d, &sRA, &sdec, &sr ); /* Compute time when Sun is at south - in hours UT */ tsouth = 12.0 - rev180(sidtime - sRA)/15.0; /* Compute the Sun's apparent radius, degrees */ sradius = 0.2666 / sr; /* Do correction to upper limb, if necessary */ if ( upper_limb ) altit -= sradius; /* Compute the diurnal arc that the Sun traverses to reach */ /* the specified altitide altit: */ { double cost; cost = ( sind(altit) - sind(lat) * sind(sdec) ) / ( cosd(lat) * cosd(sdec) ); if ( cost >= 1.0 ) rc = -1, t = 0.0; /* Sun always below altit */ else if ( cost <= -1.0 ) rc = +1, t = 12.0; /* Sun always above altit */ else t = acosd(cost)/15.0; /* The diurnal arc, hours */ } /* Store rise and set times - in hours UT */ *trise = tsouth - t; *tset = tsouth + t; return rc; } /* __sunriset__ */ /* The "workhorse" function */ double __daylen__( int year, int month, int day, double lon, double lat, double altit, int upper_limb ) /**********************************************************************/ /* Note: year,month,date = calendar date, 1801-2099 only. */ /* Eastern longitude positive, Western longitude negative */ /* Northern latitude positive, Southern latitude negative */ /* The longitude value is not critical. Set it to the correct */ /* longitude if you're picky, otherwise set to to, say, 0.0 */ /* The latitude however IS critical - be sure to get it correct */ /* altit = the altitude which the Sun should cross */ /* Set to -35/60 degrees for rise/set, -6 degrees */ /* for civil, -12 degrees for nautical and -18 */ /* degrees for astronomical twilight. */ /* upper_limb: non-zero -> upper limb, zero -> center */ /* Set to non-zero (e.g. 1) when computing day length */ /* and to zero when computing day+twilight length. */ /**********************************************************************/ { double d, /* Days since 2000 Jan 0.0 (negative before) */ obl_ecl, /* Obliquity (inclination) of Earth's axis */ sr, /* Solar distance, astronomical units */ slon, /* True solar longitude */ sin_sdecl, /* Sine of Sun's declination */ cos_sdecl, /* Cosine of Sun's declination */ sradius, /* Sun's apparent radius */ t; /* Diurnal arc */ /* Compute d of 12h local mean solar time */ d = days_since_2000_Jan_0(year,month,day) + 0.5 - lon/360.0; /* Compute obliquity of ecliptic (inclination of Earth's axis) */ obl_ecl = 23.4393 - 3.563E-7 * d; /* Compute Sun's position */ sunpos( d, &slon, &sr ); /* Compute sine and cosine of Sun's declination */ sin_sdecl = sind(obl_ecl) * sind(slon); cos_sdecl = sqrt( 1.0 - sin_sdecl * sin_sdecl ); /* Compute the Sun's apparent radius, degrees */ sradius = 0.2666 / sr; /* Do correction to upper limb, if necessary */ if ( upper_limb ) altit -= sradius; /* Compute the diurnal arc that the Sun traverses to reach */ /* the specified altitide altit: */ { double cost; cost = ( sind(altit) - sind(lat) * sin_sdecl ) / ( cosd(lat) * cos_sdecl ); if ( cost >= 1.0 ) t = 0.0; /* Sun always below altit */ else if ( cost <= -1.0 ) t = 24.0; /* Sun always above altit */ else t = (2.0/15.0) * acosd(cost); /* The diurnal arc, hours */ } return t; } /* __daylen__ */ /* This function computes the Sun's position at any instant */ void sunpos( double d, double *lon, double *r ) /******************************************************/ /* Computes the Sun's ecliptic longitude and distance */ /* at an instant given in d, number of days since */ /* 2000 Jan 0.0. The Sun's ecliptic latitude is not */ /* computed, since it's always very near 0. */ /******************************************************/ { double M, /* Mean anomaly of the Sun */ w, /* Mean longitude of perihelion */ /* Note: Sun's mean longitude = M + w */ e, /* Eccentricity of Earth's orbit */ E, /* Eccentric anomaly */ x, y, /* x, y coordinates in orbit */ v; /* True anomaly */ /* Compute mean elements */ M = revolution( 356.0470 + 0.9856002585 * d ); w = 282.9404 + 4.70935E-5 * d; e = 0.016709 - 1.151E-9 * d; /* Compute true longitude and radius vector */ E = M + e * RADEG * sind(M) * ( 1.0 + e * cosd(M) ); x = cosd(E) - e; y = sqrt( 1.0 - e*e ) * sind(E); *r = sqrt( x*x + y*y ); /* Solar distance */ v = atan2d( y, x ); /* True anomaly */ *lon = v + w; /* True solar longitude */ if ( *lon >= 360.0 ) *lon -= 360.0; /* Make it 0..360 degrees */ } void sun_RA_dec( double d, double *RA, double *dec, double *r ) { double lon, obl_ecl; double xs, ys; double xe, ye, ze; /* Compute Sun's ecliptical coordinates */ sunpos( d, &lon, r ); /* Compute ecliptic rectangular coordinates */ xs = *r * cosd(lon); ys = *r * sind(lon); /* No zs, because the Sun is always in the ecliptic plane! */ /* Compute obliquity of ecliptic (inclination of Earth's axis) */ obl_ecl = 23.4393 - 3.563E-7 * d; /* Convert to equatorial rectangular coordinates - x is unchanged */ xe = xs; ye = ys * cosd(obl_ecl); ze = ys * sind(obl_ecl); /* Convert to spherical coordinates */ *RA = atan2d( ye, xe ); *dec = atan2d( ze, sqrt(xe*xe + ye*ye) ); } /* sun_RA_dec */ /******************************************************************/ /* This function reduces any angle to within the first revolution */ /* by subtracting or adding even multiples of 360.0 until the */ /* result is >= 0.0 and < 360.0 */ /******************************************************************/ #define INV360 ( 1.0 / 360.0 ) double revolution( double x ) /*****************************************/ /* Reduce angle to within 0..360 degrees */ /*****************************************/ { return( x - 360.0 * floor( x * INV360 ) ); } /* revolution */ double rev180( double x ) /*********************************************/ /* Reduce angle to within -180..+180 degrees */ /*********************************************/ { return( x - 360.0 * floor( x * INV360 + 0.5 ) ); } /* revolution */ /*******************************************************************/ /* This function computes GMST0, the Greenwhich Mean Sidereal Time */ /* at 0h UT (i.e. the sidereal time at the Greenwhich meridian at */ /* 0h UT). GMST is then the sidereal time at Greenwich at any */ /* time of the day. I've generelized GMST0 as well, and define it */ /* as: GMST0 = GMST - UT -- this allows GMST0 to be computed at */ /* other times than 0h UT as well. While this sounds somewhat */ /* contradictory, it is very practical: instead of computing */ /* GMST like: */ /* */ /* GMST = (GMST0) + UT * (366.2422/365.2422) */ /* */ /* where (GMST0) is the GMST last time UT was 0 hours, one simply */ /* computes: */ /* */ /* GMST = GMST0 + UT */ /* */ /* where GMST0 is the GMST "at 0h UT" but at the current moment! */ /* Defined in this way, GMST0 will increase with about 4 min a */ /* day. It also happens that GMST0 (in degrees, 1 hr = 15 degr) */ /* is equal to the Sun's mean longitude plus/minus 180 degrees! */ /* (if we neglect aberration, which amounts to 20 seconds of arc */ /* or 1.33 seconds of time) */ /* */ /*******************************************************************/ double GMST0( double d ) { double sidtim0; /* Sidtime at 0h UT = L (Sun's mean longitude) + 180.0 degr */ /* L = M + w, as defined in sunpos(). Since I'm too lazy to */ /* add these numbers, I'll let the C compiler do it for me. */ /* Any decent C compiler will add the constants at compile */ /* time, imposing no runtime or code overhead. */ sidtim0 = revolution( ( 180.0 + 356.0470 + 282.9404 ) + ( 0.9856002585 + 4.70935E-5 ) * d ); return sidtim0; } /* GMST0 */ navit-0.5.0~svn5643+dfsg.1/navit/sunriset.h000066400000000000000000000116511221777731700203520ustar00rootroot00000000000000extern const char* timezone_name; extern long int timezone_offset; #define TMOD(x) ((x)<0?(x)+24:((x)>=24?(x)-24:(x))) #define DAYSOFF(x) ((x)<0?"(-1) ":((x)>=24?"(+1) ":"")) #define HOURS(h) ((int)(floor(h))) #define MINUTES(h) ((int)(60*(h-floor(h)))) #ifndef ABS #define ABS(x) ((x)<0?-(x):(x)) #endif /* A macro to compute the number of days elapsed since 2000 Jan 0.0 */ /* (which is equal to 1999 Dec 31, 0h UT) */ /* Dan R sez: This is some pretty fucking high magic. */ #define days_since_2000_Jan_0(y,m,d) \ (367L*(y)-((7*((y)+(((m)+9)/12)))/4)+((275*(m))/9)+(d)-730530L) /* Some conversion factors between radians and degrees */ #ifndef PI #define PI 3.1415926535897932384 #endif #define RADEG ( 180.0 / PI ) #define DEGRAD ( PI / 180.0 ) /* The trigonometric functions in degrees */ #define sind(x) sin((x)*DEGRAD) #define cosd(x) cos((x)*DEGRAD) #define tand(x) tan((x)*DEGRAD) #define atand(x) (RADEG*atan(x)) #define asind(x) (RADEG*asin(x)) #define acosd(x) (RADEG*acos(x)) #define atan2d(y,x) (RADEG*atan2(y,x)) /* Following are some macros around the "workhorse" function __daylen__ */ /* They mainly fill in the desired values for the reference altitude */ /* below the horizon, and also selects whether this altitude should */ /* refer to the Sun's center or its upper limb. */ /* This macro computes the length of the day, from sunrise to sunset. */ /* Sunrise/set is considered to occur when the Sun's upper limb is */ /* 50 arc minutes below the horizon (this accounts for the refraction */ /* of the Earth's atmosphere). */ /* The original version of the program used the value of 35 arc mins, */ /* which is the accepted value in Sweden. */ #define day_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -50.0/60.0, 1 ) /* This macro computes the length of the day, including civil twilight. */ /* Civil twilight starts/ends when the Sun's center is 6 degrees below */ /* the horizon. */ #define day_civil_twilight_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -6.0, 0 ) /* This macro computes the length of the day, incl. nautical twilight. */ /* Nautical twilight starts/ends when the Sun's center is 12 degrees */ /* below the horizon. */ #define day_nautical_twilight_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -12.0, 0 ) /* This macro computes the length of the day, incl. astronomical twilight. */ /* Astronomical twilight starts/ends when the Sun's center is 18 degrees */ /* below the horizon. */ #define day_astronomical_twilight_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -18.0, 0 ) /* This macro computes times for sunrise/sunset. */ /* Sunrise/set is considered to occur when the Sun's upper limb is */ /* 35 arc minutes below the horizon (this accounts for the refraction */ /* of the Earth's atmosphere). */ #define sun_rise_set(year,month,day,lon,lat,rise,set) \ __sunriset__( year, month, day, lon, lat, -35.0/60.0, 1, rise, set ) /* This macro computes the start and end times of civil twilight. */ /* Civil twilight starts/ends when the Sun's center is 6 degrees below */ /* the horizon. */ #define civil_twilight(year,month,day,lon,lat,start,end) \ __sunriset__( year, month, day, lon, lat, -6.0, 0, start, end ) /* This macro computes the start and end times of nautical twilight. */ /* Nautical twilight starts/ends when the Sun's center is 12 degrees */ /* below the horizon. */ #define nautical_twilight(year,month,day,lon,lat,start,end) \ __sunriset__( year, month, day, lon, lat, -12.0, 0, start, end ) /* This macro computes the start and end times of astronomical twilight. */ /* Astronomical twilight starts/ends when the Sun's center is 18 degrees */ /* below the horizon. */ #define astronomical_twilight(year,month,day,lon,lat,start,end) \ __sunriset__( year, month, day, lon, lat, -18.0, 0, start, end ) /* Function prototypes */ double __daylen__( int year, int month, int day, double lon, double lat, double altit, int upper_limb ); int __sunriset__( int year, int month, int day, double lon, double lat, double altit, int upper_limb, double *rise, double *set ); void sunpos( double d, double *lon, double *r ); void sun_RA_dec( double d, double *RA, double *dec, double *r ); double revolution( double x ); double rev180( double x ); double GMST0( double d ); navit-0.5.0~svn5643+dfsg.1/navit/support/000077500000000000000000000000001221777731700200355ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/support/Makefile.am000066400000000000000000000007601221777731700220740ustar00rootroot00000000000000SUBDIRS= if SUPPORT_ESPEAK SUBDIRS+=espeak endif if SUPPORT_EZXML SUBDIRS+=ezxml endif if SUPPORT_GLIB SUBDIRS+=glib endif if SUPPORT_WORDEXP SUBDIRS+=wordexp endif if SUPPORT_WIN32 SUBDIRS+=win32 endif if SUPPORT_ZLIB SUBDIRS+=zlib endif if SUPPORT_LIBC SUBDIRS+=libc endif if SUPPORT_LIBPNG SUBDIRS+=libpng endif if SPEECH_ESPEAK SUBDIRS+=espeak endif if !HAVE_SYSTEM_SHAPEFILELIB SUBDIRS+=shapefile endif DIST_SUBDIRS=espeak ezxml glib wordexp win32 zlib libc libpng shapefile navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/000077500000000000000000000000001221777731700217755ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/CMakeLists.txt000066400000000000000000000001101221777731700245250ustar00rootroot00000000000000supportlib_add_library(support_shapefile dbfopen.c shpopen.c shptree.c) navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/Makefile.am000066400000000000000000000003511221777731700240300ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_shapefile noinst_LTLIBRARIES = libsupport_shapefile.la libsupport_shapefile_la_SOURCES = dbfopen.c shpopen.c shptree.c shapefil.h navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/dbfopen.c000066400000000000000000002017661221777731700235720ustar00rootroot00000000000000/****************************************************************************** * $Id: dbfopen.c,v 1.83 2008/11/12 14:28:15 fwarmerdam Exp $ * * Project: Shapelib * Purpose: Implementation of .dbf access API documented in dbf_api.html. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: dbfopen.c,v $ * Revision 1.83 2008/11/12 14:28:15 fwarmerdam * DBFCreateField() now works on files with records * * Revision 1.82 2008/11/11 17:47:09 fwarmerdam * added DBFDeleteField() function * * Revision 1.81 2008/01/03 17:48:13 bram * in DBFCreate, use default code page LDID/87 (= 0x57, ANSI) * instead of LDID/3. This seems to be the same as what ESRI * would be doing by default. * * Revision 1.80 2007/12/30 14:36:39 fwarmerdam * avoid syntax issue with last comment. * * Revision 1.79 2007/12/30 14:35:48 fwarmerdam * Avoid char* / unsigned char* warnings. * * Revision 1.78 2007/12/18 18:28:07 bram * - create hook for client specific atof (bugzilla ticket 1615) * - check for NULL handle before closing cpCPG file, and close after reading. * * Revision 1.77 2007/12/15 20:25:21 bram * dbfopen.c now reads the Code Page information from the DBF file, and exports * this information as a string through the DBFGetCodePage function. This is * either the number from the LDID header field ("LDID/") or as the * content of an accompanying .CPG file. When creating a DBF file, the code can * be set using DBFCreateEx. * * Revision 1.76 2007/12/12 22:21:32 bram * DBFClose: check for NULL psDBF handle before trying to close it. * * Revision 1.75 2007/12/06 13:58:19 fwarmerdam * make sure file offset calculations are done in as SAOffset * * Revision 1.74 2007/12/06 07:00:25 fwarmerdam * dbfopen now using SAHooks for fileio * * Revision 1.73 2007/09/03 19:48:11 fwarmerdam * move DBFReadAttribute() static dDoubleField into dbfinfo * * Revision 1.72 2007/09/03 19:34:06 fwarmerdam * Avoid use of static tuple buffer in DBFReadTuple() * * Revision 1.71 2006/06/22 14:37:18 fwarmerdam * avoid memory leak if dbfopen fread fails * * Revision 1.70 2006/06/17 17:47:05 fwarmerdam * use calloc() for dbfinfo in DBFCreate * * Revision 1.69 2006/06/17 15:34:32 fwarmerdam * disallow creating fields wider than 255 * * Revision 1.68 2006/06/17 15:12:40 fwarmerdam * Fixed C++ style comments. * * Revision 1.67 2006/06/17 00:24:53 fwarmerdam * Don't treat non-zero decimals values as high order byte for length * for strings. It causes serious corruption for some files. * http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 * * Revision 1.66 2006/03/29 18:26:20 fwarmerdam * fixed bug with size of pachfieldtype in dbfcloneempty * * Revision 1.65 2006/02/15 01:14:30 fwarmerdam * added DBFAddNativeFieldType * * Revision 1.64 2006/02/09 00:29:04 fwarmerdam * Changed to put spaces into string fields that are NULL as * per http://bugzilla.maptools.org/show_bug.cgi?id=316. * * Revision 1.63 2006/01/25 15:35:43 fwarmerdam * check success on DBFFlushRecord * * Revision 1.62 2006/01/10 16:28:03 fwarmerdam * Fixed typo in CPLError. * * Revision 1.61 2006/01/10 16:26:29 fwarmerdam * Push loading record buffer into DBFLoadRecord. * Implement CPL error reporting if USE_CPL defined. * * Revision 1.60 2006/01/05 01:27:27 fwarmerdam * added dbf deletion mark/fetch * * Revision 1.59 2005/03/14 15:20:28 fwarmerdam * Fixed last change. * * Revision 1.58 2005/03/14 15:18:54 fwarmerdam * Treat very wide fields with no decimals as double. This is * more than 32bit integer fields. * * Revision 1.57 2005/02/10 20:16:54 fwarmerdam * Make the pszStringField buffer for DBFReadAttribute() static char [256] * as per bug 306. * * Revision 1.56 2005/02/10 20:07:56 fwarmerdam * Fixed bug 305 in DBFCloneEmpty() - header length problem. * * Revision 1.55 2004/09/26 20:23:46 fwarmerdam * avoid warnings with rcsid and signed/unsigned stuff * * Revision 1.54 2004/09/15 16:26:10 fwarmerdam * Treat all blank numeric fields as null too. */ #include "shapefil.h" #include #include #include #include #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* DBFWriteHeader() */ /* */ /* This is called to write out the file header, and field */ /* descriptions before writing any actual data records. This */ /* also computes all the DBFDataSet field offset/size/decimals */ /* and so forth values. */ /************************************************************************/ static void DBFWriteHeader(DBFHandle psDBF) { unsigned char abyHeader[XBASE_FLDHDR_SZ]; int i; if( !psDBF->bNoHeader ) return; psDBF->bNoHeader = FALSE; /* -------------------------------------------------------------------- */ /* Initialize the file header information. */ /* -------------------------------------------------------------------- */ for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) abyHeader[i] = 0; abyHeader[0] = 0x03; /* memo field? - just copying */ /* write out a dummy date */ abyHeader[1] = 95; /* YY */ abyHeader[2] = 7; /* MM */ abyHeader[3] = 26; /* DD */ /* record count preset at zero */ abyHeader[8] = (unsigned char) (psDBF->nHeaderLength % 256); abyHeader[9] = (unsigned char) (psDBF->nHeaderLength / 256); abyHeader[10] = (unsigned char) (psDBF->nRecordLength % 256); abyHeader[11] = (unsigned char) (psDBF->nRecordLength / 256); abyHeader[29] = (unsigned char) (psDBF->iLanguageDriver); /* -------------------------------------------------------------------- */ /* Write the initial 32 byte file header, and all the field */ /* descriptions. */ /* -------------------------------------------------------------------- */ psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); psDBF->sHooks.FWrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp ); psDBF->sHooks.FWrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, psDBF->fp ); /* -------------------------------------------------------------------- */ /* Write out the newline character if there is room for it. */ /* -------------------------------------------------------------------- */ if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 ) { char cNewline; cNewline = 0x0d; psDBF->sHooks.FWrite( &cNewline, 1, 1, psDBF->fp ); } } /************************************************************************/ /* DBFFlushRecord() */ /* */ /* Write out the current record if there is one. */ /************************************************************************/ static int DBFFlushRecord( DBFHandle psDBF ) { SAOffset nRecordOffset; if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) { psDBF->bCurrentRecordModified = FALSE; nRecordOffset = psDBF->nRecordLength * (SAOffset) psDBF->nCurrentRecord + psDBF->nHeaderLength; if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ) != 0 || psDBF->sHooks.FWrite( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_FileIO, "Failure writing DBF record %d.", psDBF->nCurrentRecord ); #else fprintf( stderr, "Failure writing DBF record %d.", psDBF->nCurrentRecord ); #endif return FALSE; } } return TRUE; } /************************************************************************/ /* DBFLoadRecord() */ /************************************************************************/ static int DBFLoadRecord( DBFHandle psDBF, int iRecord ) { if( psDBF->nCurrentRecord != iRecord ) { SAOffset nRecordOffset; if( !DBFFlushRecord( psDBF ) ) return FALSE; nRecordOffset = psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, SEEK_SET ) != 0 ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_FileIO, "fseek(%ld) failed on DBF file.\n", (long) nRecordOffset ); #else fprintf( stderr, "fseek(%ld) failed on DBF file.\n", (long) nRecordOffset ); #endif return FALSE; } if( psDBF->sHooks.FRead( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_FileIO, "fread(%d) failed on DBF file.\n", psDBF->nRecordLength ); #else fprintf( stderr, "fread(%d) failed on DBF file.\n", psDBF->nRecordLength ); #endif return FALSE; } psDBF->nCurrentRecord = iRecord; } return TRUE; } /************************************************************************/ /* DBFUpdateHeader() */ /************************************************************************/ void SHPAPI_CALL DBFUpdateHeader( DBFHandle psDBF ) { unsigned char abyFileHeader[32]; if( psDBF->bNoHeader ) DBFWriteHeader( psDBF ); DBFFlushRecord( psDBF ); psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); psDBF->sHooks.FRead( abyFileHeader, 32, 1, psDBF->fp ); abyFileHeader[4] = (unsigned char) (psDBF->nRecords % 256); abyFileHeader[5] = (unsigned char) ((psDBF->nRecords/256) % 256); abyFileHeader[6] = (unsigned char) ((psDBF->nRecords/(256*256)) % 256); abyFileHeader[7] = (unsigned char) ((psDBF->nRecords/(256*256*256)) % 256); psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); psDBF->sHooks.FWrite( abyFileHeader, 32, 1, psDBF->fp ); psDBF->sHooks.FFlush( psDBF->fp ); } /************************************************************************/ /* DBFOpen() */ /* */ /* Open a .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFOpen( const char * pszFilename, const char * pszAccess ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return DBFOpenLL( pszFilename, pszAccess, &sHooks ); } /************************************************************************/ /* DBFOpen() */ /* */ /* Open a .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) { DBFHandle psDBF; SAFile pfCPG; unsigned char *pabyBuf; int nFields, nHeadLen, iField, i; char *pszBasename, *pszFullname; int nBufSize = 500; /* -------------------------------------------------------------------- */ /* We only allow the access strings "rb" and "r+". */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 && strcmp(pszAccess,"r+b") != 0 ) return( NULL ); if( strcmp(pszAccess,"r") == 0 ) pszAccess = "rb"; if( strcmp(pszAccess,"r+") == 0 ) pszAccess = "rb+"; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); psDBF->fp = psHooks->FOpen( pszFullname, pszAccess ); memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); if( psDBF->fp == NULL ) { sprintf( pszFullname, "%s.DBF", pszBasename ); psDBF->fp = psDBF->sHooks.FOpen(pszFullname, pszAccess ); } sprintf( pszFullname, "%s.cpg", pszBasename ); pfCPG = psHooks->FOpen( pszFullname, "r" ); if( pfCPG == NULL ) { sprintf( pszFullname, "%s.CPG", pszBasename ); pfCPG = psHooks->FOpen( pszFullname, "r" ); } free( pszBasename ); free( pszFullname ); if( psDBF->fp == NULL ) { free( psDBF ); if( pfCPG ) psHooks->FClose( pfCPG ); return( NULL ); } psDBF->bNoHeader = FALSE; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; /* -------------------------------------------------------------------- */ /* Read Table Header info */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) malloc(nBufSize); if( psDBF->sHooks.FRead( pabyBuf, 32, 1, psDBF->fp ) != 1 ) { psDBF->sHooks.FClose( psDBF->fp ); if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); free( pabyBuf ); free( psDBF ); return NULL; } psDBF->nRecords = pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256; psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256; psDBF->nRecordLength = pabyBuf[10] + pabyBuf[11]*256; psDBF->iLanguageDriver = pabyBuf[29]; psDBF->nFields = nFields = (nHeadLen - 32) / 32; psDBF->pszCurrentRecord = (char *) malloc(psDBF->nRecordLength); /* -------------------------------------------------------------------- */ /* Figure out the code page from the LDID and CPG */ /* -------------------------------------------------------------------- */ psDBF->pszCodePage = NULL; if( pfCPG ) { size_t n; char *buffer = (char *) pabyBuf; buffer[0] = '\0'; psDBF->sHooks.FRead( pabyBuf, nBufSize - 1, 1, pfCPG ); n = strcspn( (char *) pabyBuf, "\n\r" ); if( n > 0 ) { pabyBuf[n] = '\0'; psDBF->pszCodePage = (char *) malloc(n + 1); memcpy( psDBF->pszCodePage, pabyBuf, n + 1 ); } psDBF->sHooks.FClose( pfCPG ); } if( psDBF->pszCodePage == NULL && pabyBuf[29] != 0 ) { sprintf( (char *) pabyBuf, "LDID/%d", psDBF->iLanguageDriver ); psDBF->pszCodePage = (char *) malloc(strlen((char*)pabyBuf) + 1); strcpy( psDBF->pszCodePage, (char *) pabyBuf ); } /* -------------------------------------------------------------------- */ /* Read in Field Definitions */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); psDBF->pszHeader = (char *) pabyBuf; psDBF->sHooks.FSeek( psDBF->fp, 32, 0 ); if( psDBF->sHooks.FRead( pabyBuf, nHeadLen-32, 1, psDBF->fp ) != 1 ) { psDBF->sHooks.FClose( psDBF->fp ); free( pabyBuf ); free( psDBF->pszCurrentRecord ); free( psDBF ); return NULL; } psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); for( iField = 0; iField < nFields; iField++ ) { unsigned char *pabyFInfo; pabyFInfo = pabyBuf+iField*32; if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) { psDBF->panFieldSize[iField] = pabyFInfo[16]; psDBF->panFieldDecimals[iField] = pabyFInfo[17]; } else { psDBF->panFieldSize[iField] = pabyFInfo[16]; psDBF->panFieldDecimals[iField] = 0; /* ** The following seemed to be used sometimes to handle files with long ** string fields, but in other cases (such as bug 1202) the decimals field ** just seems to indicate some sort of preferred formatting, not very ** wide fields. So I have disabled this code. FrankW. psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; psDBF->panFieldDecimals[iField] = 0; */ } psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; if( iField == 0 ) psDBF->panFieldOffset[iField] = 1; else psDBF->panFieldOffset[iField] = psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; } return( psDBF ); } /************************************************************************/ /* DBFClose() */ /************************************************************************/ void SHPAPI_CALL DBFClose(DBFHandle psDBF) { if( psDBF == NULL ) return; /* -------------------------------------------------------------------- */ /* Write out header if not already written. */ /* -------------------------------------------------------------------- */ if( psDBF->bNoHeader ) DBFWriteHeader( psDBF ); DBFFlushRecord( psDBF ); /* -------------------------------------------------------------------- */ /* Update last access date, and number of records if we have */ /* write access. */ /* -------------------------------------------------------------------- */ if( psDBF->bUpdated ) DBFUpdateHeader( psDBF ); /* -------------------------------------------------------------------- */ /* Close, and free resources. */ /* -------------------------------------------------------------------- */ psDBF->sHooks.FClose( psDBF->fp ); if( psDBF->panFieldOffset != NULL ) { free( psDBF->panFieldOffset ); free( psDBF->panFieldSize ); free( psDBF->panFieldDecimals ); free( psDBF->pachFieldType ); } if( psDBF->pszWorkField != NULL ) free( psDBF->pszWorkField ); free( psDBF->pszHeader ); free( psDBF->pszCurrentRecord ); free( psDBF->pszCodePage ); free( psDBF ); } /************************************************************************/ /* DBFCreate() */ /* */ /* Create a new .dbf file with default code page LDID/87 (0x57) */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreate( const char * pszFilename ) { return DBFCreateEx( pszFilename, "LDID/87" ); // 0x57 } /************************************************************************/ /* DBFCreateEx() */ /* */ /* Create a new .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreateEx( const char * pszFilename, const char* pszCodePage ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return DBFCreateLL( pszFilename, pszCodePage , &sHooks ); } /************************************************************************/ /* DBFCreate() */ /* */ /* Create a new .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHooks ) { DBFHandle psDBF; SAFile fp; char *pszFullname, *pszBasename; int i, ldid = -1; char chZero = '\0'; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); /* -------------------------------------------------------------------- */ /* Create the file. */ /* -------------------------------------------------------------------- */ fp = psHooks->FOpen( pszFullname, "wb" ); if( fp == NULL ) return( NULL ); psHooks->FWrite( &chZero, 1, 1, fp ); psHooks->FClose( fp ); fp = psHooks->FOpen( pszFullname, "rb+" ); if( fp == NULL ) return( NULL ); sprintf( pszFullname, "%s.cpg", pszBasename ); if( pszCodePage != NULL ) { if( strncmp( pszCodePage, "LDID/", 5 ) == 0 ) { ldid = atoi( pszCodePage + 5 ); if( ldid > 255 ) ldid = -1; // don't use 0 to indicate out of range as LDID/0 is a valid one } if( ldid < 0 ) { SAFile fpCPG = psHooks->FOpen( pszFullname, "w" ); psHooks->FWrite( (char*) pszCodePage, strlen(pszCodePage), 1, fpCPG ); psHooks->FClose( fpCPG ); } } if( pszCodePage == NULL || ldid >= 0 ) { psHooks->Remove( pszFullname ); } free( pszBasename ); free( pszFullname ); /* -------------------------------------------------------------------- */ /* Create the info structure. */ /* -------------------------------------------------------------------- */ psDBF = (DBFHandle) calloc(1,sizeof(DBFInfo)); memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); psDBF->fp = fp; psDBF->nRecords = 0; psDBF->nFields = 0; psDBF->nRecordLength = 1; psDBF->nHeaderLength = 33; psDBF->panFieldOffset = NULL; psDBF->panFieldSize = NULL; psDBF->panFieldDecimals = NULL; psDBF->pachFieldType = NULL; psDBF->pszHeader = NULL; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; psDBF->pszCurrentRecord = NULL; psDBF->bNoHeader = TRUE; psDBF->iLanguageDriver = ldid > 0 ? ldid : 0; psDBF->pszCodePage = NULL; if( pszCodePage ) { psDBF->pszCodePage = (char * ) malloc( strlen(pszCodePage) + 1 ); strcpy( psDBF->pszCodePage, pszCodePage ); } return( psDBF ); } /************************************************************************/ /* DBFAddField() */ /* */ /* Add a field to a newly created .dbf or to an existing one */ /************************************************************************/ int SHPAPI_CALL DBFAddField(DBFHandle psDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ) { char chNativeType = 'C'; if( eType == FTLogical ) chNativeType = 'L'; else if( eType == FTString ) chNativeType = 'C'; else chNativeType = 'N'; return DBFAddNativeFieldType( psDBF, pszFieldName, chNativeType, nWidth, nDecimals ); } /************************************************************************/ /* DBFAddField() */ /* */ /* Add a field to a newly created .dbf file before any records */ /* are written. */ /************************************************************************/ int SHPAPI_CALL DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, char chType, int nWidth, int nDecimals ) { char *pszFInfo; int i; int nOldRecordLength, nOldHeaderLength; char *pszRecord; char chFieldFill; SAOffset nRecordOffset; /* -------------------------------------------------------------------- */ /* Do some checking to ensure we can add records to this file. */ /* -------------------------------------------------------------------- */ if( nWidth < 1 ) return -1; if( nWidth > 255 ) nWidth = 255; nOldRecordLength = psDBF->nRecordLength; nOldHeaderLength = psDBF->nHeaderLength; /* -------------------------------------------------------------------- */ /* SfRealloc all the arrays larger to hold the additional field */ /* information. */ /* -------------------------------------------------------------------- */ psDBF->nFields++; psDBF->panFieldOffset = (int *) SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); psDBF->panFieldSize = (int *) SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); psDBF->panFieldDecimals = (int *) SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); psDBF->pachFieldType = (char *) SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); /* -------------------------------------------------------------------- */ /* Assign the new field information fields. */ /* -------------------------------------------------------------------- */ psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; psDBF->nRecordLength += nWidth; psDBF->panFieldSize[psDBF->nFields-1] = nWidth; psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; psDBF->pachFieldType[psDBF->nFields-1] = chType; /* -------------------------------------------------------------------- */ /* Extend the required header information. */ /* -------------------------------------------------------------------- */ psDBF->nHeaderLength += 32; psDBF->bUpdated = FALSE; psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1); for( i = 0; i < 32; i++ ) pszFInfo[i] = '\0'; if( (int) strlen(pszFieldName) < 10 ) strncpy( pszFInfo, pszFieldName, strlen(pszFieldName)); else strncpy( pszFInfo, pszFieldName, 10); pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; if( chType == 'C' ) { pszFInfo[16] = (unsigned char) (nWidth % 256); pszFInfo[17] = (unsigned char) (nWidth / 256); } else { pszFInfo[16] = (unsigned char) nWidth; pszFInfo[17] = (unsigned char) nDecimals; } /* -------------------------------------------------------------------- */ /* Make the current record buffer appropriately larger. */ /* -------------------------------------------------------------------- */ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, psDBF->nRecordLength); /* we're done if dealing with new .dbf */ if( psDBF->bNoHeader ) return( psDBF->nFields - 1 ); /* -------------------------------------------------------------------- */ /* For existing .dbf file, shift records */ /* -------------------------------------------------------------------- */ /* alloc record */ pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); switch (chType) { case 'N': case 'F': chFieldFill = '*'; break; case 'D': chFieldFill = '0'; break; case 'L': chFieldFill = '?'; break; default: chFieldFill = ' '; break; } for (i = psDBF->nRecords-1; i >= 0; --i) { nRecordOffset = nOldRecordLength * (SAOffset) i + nOldHeaderLength; /* load record */ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); /* set new field's value to NULL */ memset(pszRecord + nOldRecordLength, chFieldFill, nWidth); nRecordOffset = psDBF->nRecordLength * (SAOffset) i + psDBF->nHeaderLength; /* move record to the new place*/ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); } /* free record */ free(pszRecord); /* force update of header with new header, record length and new field */ psDBF->bNoHeader = TRUE; DBFUpdateHeader( psDBF ); return( psDBF->nFields-1 ); } /************************************************************************/ /* DBFReadAttribute() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, char chReqType ) { unsigned char *pabyRec; void *pReturnField = NULL; /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( iField < 0 || iField >= psDBF->nFields ) return( NULL ); /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return NULL; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Ensure we have room to extract the target field. */ /* -------------------------------------------------------------------- */ if( psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength ) { psDBF->nWorkFieldLength = psDBF->panFieldSize[iField] + 100; if( psDBF->pszWorkField == NULL ) psDBF->pszWorkField = (char *) malloc(psDBF->nWorkFieldLength); else psDBF->pszWorkField = (char *) realloc(psDBF->pszWorkField, psDBF->nWorkFieldLength); } /* -------------------------------------------------------------------- */ /* Extract the requested field. */ /* -------------------------------------------------------------------- */ strncpy( psDBF->pszWorkField, ((const char *) pabyRec) + psDBF->panFieldOffset[iField], psDBF->panFieldSize[iField] ); psDBF->pszWorkField[psDBF->panFieldSize[iField]] = '\0'; pReturnField = psDBF->pszWorkField; /* -------------------------------------------------------------------- */ /* Decode the field. */ /* -------------------------------------------------------------------- */ if( chReqType == 'N' ) { psDBF->dfDoubleField = psDBF->sHooks.Atof(psDBF->pszWorkField); pReturnField = &(psDBF->dfDoubleField); } /* -------------------------------------------------------------------- */ /* Should we trim white space off the string attribute value? */ /* -------------------------------------------------------------------- */ #ifdef TRIM_DBF_WHITESPACE else { char *pchSrc, *pchDst; pchDst = pchSrc = psDBF->pszWorkField; while( *pchSrc == ' ' ) pchSrc++; while( *pchSrc != '\0' ) *(pchDst++) = *(pchSrc++); *pchDst = '\0'; while( pchDst != psDBF->pszWorkField && *(--pchDst) == ' ' ) *pchDst = '\0'; } #endif return( pReturnField ); } /************************************************************************/ /* DBFReadIntAttribute() */ /* */ /* Read an integer attribute. */ /************************************************************************/ int SHPAPI_CALL DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0; else return( (int) *pdValue ); } /************************************************************************/ /* DBFReadDoubleAttribute() */ /* */ /* Read a double attribute. */ /************************************************************************/ double SHPAPI_CALL DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0.0; else return( *pdValue ); } /************************************************************************/ /* DBFReadStringAttribute() */ /* */ /* Read a string attribute. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); } /************************************************************************/ /* DBFReadLogicalAttribute() */ /* */ /* Read a logical attribute. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); } /************************************************************************/ /* DBFIsAttributeNULL() */ /* */ /* Return TRUE if value for field is NULL. */ /* */ /* Contributed by Jim Matthews. */ /************************************************************************/ int SHPAPI_CALL DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) { const char *pszValue; int i; pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); if( pszValue == NULL ) return TRUE; switch(psDBF->pachFieldType[iField]) { case 'N': case 'F': /* ** We accept all asterisks or all blanks as NULL ** though according to the spec I think it should be all ** asterisks. */ if( pszValue[0] == '*' ) return TRUE; for( i = 0; pszValue[i] != '\0'; i++ ) { if( pszValue[i] != ' ' ) return FALSE; } return TRUE; case 'D': /* NULL date fields have value "00000000" */ return strncmp(pszValue,"00000000",8) == 0; case 'L': /* NULL boolean fields have value "?" */ return pszValue[0] == '?'; default: /* empty string fields are considered NULL */ return strlen(pszValue) == 0; } } /************************************************************************/ /* DBFGetFieldCount() */ /* */ /* Return the number of fields in this table. */ /************************************************************************/ int SHPAPI_CALL DBFGetFieldCount( DBFHandle psDBF ) { return( psDBF->nFields ); } /************************************************************************/ /* DBFGetRecordCount() */ /* */ /* Return the number of records in this table. */ /************************************************************************/ int SHPAPI_CALL DBFGetRecordCount( DBFHandle psDBF ) { return( psDBF->nRecords ); } /************************************************************************/ /* DBFGetFieldInfo() */ /* */ /* Return any requested information about the field. */ /************************************************************************/ DBFFieldType SHPAPI_CALL DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ) { if( iField < 0 || iField >= psDBF->nFields ) return( FTInvalid ); if( pnWidth != NULL ) *pnWidth = psDBF->panFieldSize[iField]; if( pnDecimals != NULL ) *pnDecimals = psDBF->panFieldDecimals[iField]; if( pszFieldName != NULL ) { int i; strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 ); pszFieldName[11] = '\0'; for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- ) pszFieldName[i] = '\0'; } if ( psDBF->pachFieldType[iField] == 'L' ) return( FTLogical); else if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F' ) { if( psDBF->panFieldDecimals[iField] > 0 || psDBF->panFieldSize[iField] > 10 ) return( FTDouble ); else return( FTInteger ); } else { return( FTString ); } } /************************************************************************/ /* DBFWriteAttribute() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int i, j, nRetResult = TRUE; unsigned char *pabyRec; char szSField[400], szFormat[20]; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { if( !DBFFlushRecord( psDBF ) ) return FALSE; psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return FALSE; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Translate NULL value to valid DBF file representation. */ /* */ /* Contributed by Jim Matthews. */ /* -------------------------------------------------------------------- */ if( pValue == NULL ) { switch(psDBF->pachFieldType[iField]) { case 'N': case 'F': /* NULL numeric fields have value "****************" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*', psDBF->panFieldSize[iField] ); break; case 'D': /* NULL date fields have value "00000000" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0', psDBF->panFieldSize[iField] ); break; case 'L': /* NULL boolean fields have value "?" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?', psDBF->panFieldSize[iField] ); break; default: /* empty string fields are considered NULL */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), ' ', psDBF->panFieldSize[iField] ); break; } return TRUE; } /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ switch( psDBF->pachFieldType[iField] ) { case 'D': case 'N': case 'F': if( psDBF->panFieldDecimals[iField] == 0 ) { int nWidth = psDBF->panFieldSize[iField]; if( (int) sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%dd", nWidth ); sprintf(szSField, szFormat, (int) *((double *) pValue) ); if( (int)strlen(szSField) > psDBF->panFieldSize[iField] ) { szSField[psDBF->panFieldSize[iField]] = '\0'; nRetResult = FALSE; } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } else { int nWidth = psDBF->panFieldSize[iField]; if( (int) sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%d.%df", nWidth, psDBF->panFieldDecimals[iField] ); sprintf(szSField, szFormat, *((double *) pValue) ); if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) { szSField[psDBF->panFieldSize[iField]] = '\0'; nRetResult = FALSE; } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } break; case 'L': if (psDBF->panFieldSize[iField] >= 1 && (*(char*)pValue == 'F' || *(char*)pValue == 'T')) *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue; break; default: if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) { j = psDBF->panFieldSize[iField]; nRetResult = FALSE; } else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); break; } return( nRetResult ); } /************************************************************************/ /* DBFWriteAttributeDirectly() */ /* */ /* Write an attribute record to the file, but without any */ /* reformatting based on type. The provided buffer is written */ /* as is to the field position in the record. */ /************************************************************************/ int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int i, j; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { if( !DBFFlushRecord( psDBF ) ) return FALSE; psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return FALSE; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] ) j = psDBF->panFieldSize[iField]; else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFWriteDoubleAttribute() */ /* */ /* Write a double attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, double dValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteIntegerAttribute() */ /* */ /* Write a integer attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, int nValue ) { double dValue = nValue; return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteStringAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, const char * pszValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); } /************************************************************************/ /* DBFWriteNULLAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) ); } /************************************************************************/ /* DBFWriteLogicalAttribute() */ /* */ /* Write a logical attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, const char lValue) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) ); } /************************************************************************/ /* DBFWriteTuple() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) { int i; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { if( !DBFFlushRecord( psDBF ) ) return FALSE; psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return FALSE; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFReadTuple() */ /* */ /* Read a complete record. Note that the result is only valid */ /* till the next record read for any reason. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity ) { if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( !DBFLoadRecord( psDBF, hEntity ) ) return NULL; return (const char *) psDBF->pszCurrentRecord; } /************************************************************************/ /* DBFCloneEmpty() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) { DBFHandle newDBF; newDBF = DBFCreateEx ( pszFilename, psDBF->pszCodePage ); if ( newDBF == NULL ) return ( NULL ); newDBF->nFields = psDBF->nFields; newDBF->nRecordLength = psDBF->nRecordLength; newDBF->nHeaderLength = psDBF->nHeaderLength; newDBF->pszHeader = (char *) malloc ( newDBF->nHeaderLength ); memcpy ( newDBF->pszHeader, psDBF->pszHeader, newDBF->nHeaderLength ); newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); newDBF->pachFieldType = (char *) malloc ( sizeof(char) * psDBF->nFields ); memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(char)*psDBF->nFields ); newDBF->bNoHeader = TRUE; newDBF->bUpdated = TRUE; DBFWriteHeader ( newDBF ); DBFClose ( newDBF ); newDBF = DBFOpen ( pszFilename, "rb+" ); return ( newDBF ); } /************************************************************************/ /* DBFGetNativeFieldType() */ /* */ /* Return the DBase field type for the specified field. */ /* */ /* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ /* 'N' (Numeric, with or without decimal), */ /* 'L' (Logical), */ /* 'M' (Memo: 10 digits .DBT block ptr) */ /************************************************************************/ char SHPAPI_CALL DBFGetNativeFieldType( DBFHandle psDBF, int iField ) { if( iField >=0 && iField < psDBF->nFields ) return psDBF->pachFieldType[iField]; return ' '; } /************************************************************************/ /* str_to_upper() */ /************************************************************************/ static void str_to_upper (char *string) { int len; short i = -1; len = strlen (string); while (++i < len) if (isalpha(string[i]) && islower(string[i])) string[i] = (char) toupper ((int)string[i]); } /************************************************************************/ /* DBFGetFieldIndex() */ /* */ /* Get the index number for a field in a .dbf file. */ /* */ /* Contributed by Jim Matthews. */ /************************************************************************/ int SHPAPI_CALL DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) { char name[12], name1[12], name2[12]; int i; strncpy(name1, pszFieldName,11); name1[11] = '\0'; str_to_upper(name1); for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) { DBFGetFieldInfo( psDBF, i, name, NULL, NULL ); strncpy(name2,name,11); str_to_upper(name2); if(!strncmp(name1,name2,10)) return(i); } return(-1); } /************************************************************************/ /* DBFIsRecordDeleted() */ /* */ /* Returns TRUE if the indicated record is deleted, otherwise */ /* it returns FALSE. */ /************************************************************************/ int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) { /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( iShape < 0 || iShape >= psDBF->nRecords ) return TRUE; /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, iShape ) ) return FALSE; /* -------------------------------------------------------------------- */ /* '*' means deleted. */ /* -------------------------------------------------------------------- */ return psDBF->pszCurrentRecord[0] == '*'; } /************************************************************************/ /* DBFMarkRecordDeleted() */ /************************************************************************/ int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, int bIsDeleted ) { char chNewFlag; /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( iShape < 0 || iShape >= psDBF->nRecords ) return FALSE; /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, iShape ) ) return FALSE; /* -------------------------------------------------------------------- */ /* Assign value, marking record as dirty if it changes. */ /* -------------------------------------------------------------------- */ if( bIsDeleted ) chNewFlag = '*'; else chNewFlag = ' '; if( psDBF->pszCurrentRecord[0] != chNewFlag ) { psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; psDBF->pszCurrentRecord[0] = chNewFlag; } return TRUE; } /************************************************************************/ /* DBFGetCodePage */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFGetCodePage(DBFHandle psDBF ) { if( psDBF == NULL ) return NULL; return psDBF->pszCodePage; } /************************************************************************/ /* DBFDeleteField() */ /* */ /* Remove a field from a .dbf file */ /************************************************************************/ int SHPAPI_CALL DBFDeleteField(DBFHandle psDBF, int iField) { int nOldRecordLength, nOldHeaderLength; int nDeletedFieldOffset, nDeletedFieldSize; SAOffset nRecordOffset; char* pszRecord; int i, iRecord; if (iField < 0 || iField >= psDBF->nFields) return FALSE; /* make sure that everything is written in .dbf */ if( !DBFFlushRecord( psDBF ) ) return FALSE; /* get information about field to be deleted */ nOldRecordLength = psDBF->nRecordLength; nOldHeaderLength = psDBF->nHeaderLength; nDeletedFieldOffset = psDBF->panFieldOffset[iField]; nDeletedFieldSize = psDBF->panFieldSize[iField]; /* update fields info */ for (i = iField + 1; i < psDBF->nFields; i++) { psDBF->panFieldOffset[i-1] = psDBF->panFieldOffset[i] - nDeletedFieldSize; psDBF->panFieldSize[i-1] = psDBF->panFieldSize[i]; psDBF->panFieldDecimals[i-1] = psDBF->panFieldDecimals[i]; psDBF->pachFieldType[i-1] = psDBF->pachFieldType[i]; } /* resize fields arrays */ psDBF->nFields--; psDBF->panFieldOffset = (int *) SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); psDBF->panFieldSize = (int *) SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); psDBF->panFieldDecimals = (int *) SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); psDBF->pachFieldType = (char *) SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); /* update header information */ psDBF->nHeaderLength -= 32; psDBF->nRecordLength -= nDeletedFieldSize; /* overwrite field information in header */ memcpy(psDBF->pszHeader + iField*32, psDBF->pszHeader + (iField+1)*32, sizeof(char) * (psDBF->nFields - iField)*32); psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); /* update size of current record appropriately */ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, psDBF->nRecordLength); /* we're done if we're dealing with not yet created .dbf */ if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) return TRUE; /* force update of header with new header and record length */ psDBF->bNoHeader = TRUE; DBFUpdateHeader( psDBF ); /* alloc record */ pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); /* shift records to their new positions */ for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) { nRecordOffset = nOldRecordLength * (SAOffset) iRecord + nOldHeaderLength; /* load record */ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); nRecordOffset = psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; /* move record in two steps */ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FWrite( pszRecord, nDeletedFieldOffset, 1, psDBF->fp ); psDBF->sHooks.FWrite( pszRecord + nDeletedFieldOffset + nDeletedFieldSize, nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, 1, psDBF->fp ); } /* TODO: truncate file */ /* free record */ free(pszRecord); return TRUE; } navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/shapefil.h000066400000000000000000000517471221777731700237570ustar00rootroot00000000000000#ifndef SHAPEFILE_H_INCLUDED #define SHAPEFILE_H_INCLUDED /****************************************************************************** * $Id: shapefil.h 15715 2008-11-12 15:15:21Z warmerdam $ * * Project: Shapelib * Purpose: Primary include file for Shapelib. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shapefil.h,v $ * Revision 1.46 2008/11/12 14:28:15 fwarmerdam * DBFCreateField() now works on files with records * * Revision 1.45 2008/11/11 17:47:10 fwarmerdam * added DBFDeleteField() function * * Revision 1.44 2008/01/16 20:05:19 bram * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this * is only available on the Windows platform that decodes the UTF-8 filenames to wide * character strings and feeds them to _wfopen and _wremove. * * Revision 1.43 2008/01/10 16:35:30 fwarmerdam * avoid _ prefix on #defined symbols (bug 1840) * * Revision 1.42 2007/12/18 18:28:14 bram * - create hook for client specific atof (bugzilla ticket 1615) * - check for NULL handle before closing cpCPG file, and close after reading. * * Revision 1.41 2007/12/15 20:25:32 bram * dbfopen.c now reads the Code Page information from the DBF file, and exports * this information as a string through the DBFGetCodePage function. This is * either the number from the LDID header field ("LDID/") or as the * content of an accompanying .CPG file. When creating a DBF file, the code can * be set using DBFCreateEx. * * Revision 1.40 2007/12/06 07:00:25 fwarmerdam * dbfopen now using SAHooks for fileio * * Revision 1.39 2007/12/04 20:37:56 fwarmerdam * preliminary implementation of hooks api for io and errors * * Revision 1.38 2007/11/21 22:39:56 fwarmerdam * close shx file in readonly mode (GDAL #1956) * * Revision 1.37 2007/10/27 03:31:14 fwarmerdam * limit default depth of tree to 12 levels (gdal ticket #1594) * * Revision 1.36 2007/09/10 23:33:15 fwarmerdam * Upstreamed support for visibility flag in SHPAPI_CALL for the needs * of GDAL (gdal ticket #1810). * * Revision 1.35 2007/09/03 19:48:10 fwarmerdam * move DBFReadAttribute() static dDoubleField into dbfinfo * * Revision 1.34 2006/06/17 15:33:32 fwarmerdam * added pszWorkField - bug 1202 (rso) * * Revision 1.33 2006/02/15 01:14:30 fwarmerdam * added DBFAddNativeFieldType * * Revision 1.32 2006/01/26 15:07:32 fwarmerdam * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 * * Revision 1.31 2006/01/05 01:27:27 fwarmerdam * added dbf deletion mark/fetch * * Revision 1.30 2005/01/03 22:30:13 fwarmerdam * added support for saved quadtrees * * Revision 1.29 2004/09/26 20:09:35 fwarmerdam * avoid rcsid warnings * * Revision 1.28 2003/12/29 06:02:18 fwarmerdam * added cpl_error.h option * * Revision 1.27 2003/04/21 18:30:37 warmerda * added header write/update public methods * * Revision 1.26 2002/09/29 00:00:08 warmerda * added FTLogical and logical attribute read/write calls * * Revision 1.25 2002/05/07 13:46:30 warmerda * added DBFWriteAttributeDirectly(). * * Revision 1.24 2002/04/10 16:59:54 warmerda * added SHPRewindObject * * Revision 1.23 2002/01/15 14:36:07 warmerda * updated email address * * Revision 1.22 2002/01/15 14:32:00 warmerda * try to improve SHPAPI_CALL docs */ #include #ifdef USE_DBMALLOC #include #endif #ifdef USE_CPL #include "cpl_error.h" #include "cpl_vsi.h" #endif #ifdef __cplusplus extern "C" { #endif /************************************************************************/ /* Configuration options. */ /************************************************************************/ /* -------------------------------------------------------------------- */ /* Should the DBFReadStringAttribute() strip leading and */ /* trailing white space? */ /* -------------------------------------------------------------------- */ #define TRIM_DBF_WHITESPACE /* -------------------------------------------------------------------- */ /* Should we write measure values to the Multipatch object? */ /* Reportedly ArcView crashes if we do write it, so for now it */ /* is disabled. */ /* -------------------------------------------------------------------- */ #define DISABLE_MULTIPATCH_MEASURE /* -------------------------------------------------------------------- */ /* SHPAPI_CALL */ /* */ /* The following two macros are present to allow forcing */ /* various calling conventions on the Shapelib API. */ /* */ /* To force __stdcall conventions (needed to call Shapelib */ /* from Visual Basic and/or Dephi I believe) the makefile could */ /* be modified to define: */ /* */ /* /DSHPAPI_CALL=__stdcall */ /* */ /* If it is desired to force export of the Shapelib API without */ /* using the shapelib.def file, use the following definition. */ /* */ /* /DSHAPELIB_DLLEXPORT */ /* */ /* To get both at once it will be necessary to hack this */ /* include file to define: */ /* */ /* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ /* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ /* */ /* The complexity of the situtation is partly caused by the */ /* peculiar requirement of Visual C++ that __stdcall appear */ /* after any "*"'s in the return value of a function while the */ /* __declspec(dllexport) must appear before them. */ /* -------------------------------------------------------------------- */ #ifdef SHAPELIB_DLLEXPORT # define SHPAPI_CALL __declspec(dllexport) # define SHPAPI_CALL1(x) __declspec(dllexport) x #endif #ifndef SHPAPI_CALL # if defined(USE_GCC_VISIBILITY_FLAG) # define SHPAPI_CALL __attribute__ ((visibility("default"))) # define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x # else # define SHPAPI_CALL # endif #endif #ifndef SHPAPI_CALL1 # define SHPAPI_CALL1(x) x SHPAPI_CALL #endif /* -------------------------------------------------------------------- */ /* Macros for controlling CVSID and ensuring they don't appear */ /* as unreferenced variables resulting in lots of warnings. */ /* -------------------------------------------------------------------- */ #ifndef DISABLE_CVSID # define SHP_CVSID(string) static char cpl_cvsid[] = string; \ static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : cpl_cvsid ); } #else # define SHP_CVSID(string) #endif /* -------------------------------------------------------------------- */ /* On some platforms, additional file IO hooks are defined that */ /* UTF-8 encoded filenames Unicode filenames */ /* -------------------------------------------------------------------- */ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) # define SHPAPI_WINDOWS # define SHPAPI_UTF8_HOOKS #endif /* -------------------------------------------------------------------- */ /* IO/Error hook functions. */ /* -------------------------------------------------------------------- */ typedef int *SAFile; #ifndef SAOffset typedef unsigned long SAOffset; #endif typedef struct { SAFile (*FOpen) ( const char *filename, const char *access); SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); SAOffset (*FTell) ( SAFile file ); int (*FFlush)( SAFile file ); int (*FClose)( SAFile file ); int (*Remove) ( const char *filename ); void (*Error) ( const char *message ); double (*Atof) ( const char *str ); } SAHooks; void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); #ifdef SHPAPI_UTF8_HOOKS void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); #endif /************************************************************************/ /* SHP Support. */ /************************************************************************/ typedef struct { SAHooks sHooks; SAFile fpSHP; SAFile fpSHX; int nShapeType; /* SHPT_* */ int nFileSize; /* SHP file */ int nRecords; int nMaxRecords; int *panRecOffset; int *panRecSize; double adBoundsMin[4]; double adBoundsMax[4]; int bUpdated; unsigned char *pabyRec; int nBufSize; } SHPInfo; typedef SHPInfo * SHPHandle; /* -------------------------------------------------------------------- */ /* Shape types (nSHPType) */ /* -------------------------------------------------------------------- */ #define SHPT_NULL 0 #define SHPT_POINT 1 #define SHPT_ARC 3 #define SHPT_POLYGON 5 #define SHPT_MULTIPOINT 8 #define SHPT_POINTZ 11 #define SHPT_ARCZ 13 #define SHPT_POLYGONZ 15 #define SHPT_MULTIPOINTZ 18 #define SHPT_POINTM 21 #define SHPT_ARCM 23 #define SHPT_POLYGONM 25 #define SHPT_MULTIPOINTM 28 #define SHPT_MULTIPATCH 31 /* -------------------------------------------------------------------- */ /* Part types - everything but SHPT_MULTIPATCH just uses */ /* SHPP_RING. */ /* -------------------------------------------------------------------- */ #define SHPP_TRISTRIP 0 #define SHPP_TRIFAN 1 #define SHPP_OUTERRING 2 #define SHPP_INNERRING 3 #define SHPP_FIRSTRING 4 #define SHPP_RING 5 /* -------------------------------------------------------------------- */ /* SHPObject - represents on shape (without attributes) read */ /* from the .shp file. */ /* -------------------------------------------------------------------- */ typedef struct { int nSHPType; int nShapeId; /* -1 is unknown/unassigned */ int nParts; int *panPartStart; int *panPartType; int nVertices; double *padfX; double *padfY; double *padfZ; double *padfM; double dfXMin; double dfYMin; double dfZMin; double dfMMin; double dfXMax; double dfYMax; double dfZMax; double dfMMax; int bMeasureIsUsed; } SHPObject; /* -------------------------------------------------------------------- */ /* SHP API Prototypes */ /* -------------------------------------------------------------------- */ /* If pszAccess is read-only, the fpSHX field of the returned structure */ /* will be NULL as it is not necessary to keep the SHX file open */ SHPHandle SHPAPI_CALL SHPOpen( const char * pszShapeFile, const char * pszAccess ); SHPHandle SHPAPI_CALL SHPOpenLL( const char *pszShapeFile, const char *pszAccess, SAHooks *psHooks ); SHPHandle SHPAPI_CALL SHPCreate( const char * pszShapeFile, int nShapeType ); SHPHandle SHPAPI_CALL SHPCreateLL( const char * pszShapeFile, int nShapeType, SAHooks *psHooks ); void SHPAPI_CALL SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ); SHPObject SHPAPI_CALL1(*) SHPReadObject( SHPHandle hSHP, int iShape ); int SHPAPI_CALL SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); void SHPAPI_CALL SHPDestroyObject( SHPObject * psObject ); void SHPAPI_CALL SHPComputeExtents( SHPObject * psObject ); SHPObject SHPAPI_CALL1(*) SHPCreateObject( int nSHPType, int nShapeId, int nParts, const int * panPartStart, const int * panPartType, int nVertices, const double * padfX, const double * padfY, const double * padfZ, const double * padfM ); SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject( int nSHPType, int nVertices, const double * padfX, const double * padfY, const double * padfZ ); int SHPAPI_CALL SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); void SHPAPI_CALL SHPClose( SHPHandle hSHP ); void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); const char SHPAPI_CALL1(*) SHPTypeName( int nSHPType ); const char SHPAPI_CALL1(*) SHPPartTypeName( int nPartType ); /* -------------------------------------------------------------------- */ /* Shape quadtree indexing API. */ /* -------------------------------------------------------------------- */ /* this can be two or four for binary or quad tree */ #define MAX_SUBNODE 4 /* upper limit of tree levels for automatic estimation */ #define MAX_DEFAULT_TREE_DEPTH 12 typedef struct shape_tree_node { /* region covered by this node */ double adfBoundsMin[4]; double adfBoundsMax[4]; /* list of shapes stored at this node. The papsShapeObj pointers or the whole list can be NULL */ int nShapeCount; int *panShapeIds; SHPObject **papsShapeObj; int nSubNodes; struct shape_tree_node *apsSubNode[MAX_SUBNODE]; } SHPTreeNode; typedef struct { SHPHandle hSHP; int nMaxDepth; int nDimension; int nTotalCount; SHPTreeNode *psRoot; } SHPTree; SHPTree SHPAPI_CALL1(*) SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, double *padfBoundsMin, double *padfBoundsMax ); void SHPAPI_CALL SHPDestroyTree( SHPTree * hTree ); int SHPAPI_CALL SHPWriteTree( SHPTree *hTree, const char * pszFilename ); SHPTree SHPAPI_CALL SHPReadTree( const char * pszFilename ); int SHPAPI_CALL SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject ); int SHPAPI_CALL SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); int SHPAPI_CALL SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); void SHPAPI_CALL SHPTreeTrimExtraNodes( SHPTree * hTree ); int SHPAPI_CALL1(*) SHPTreeFindLikelyShapes( SHPTree * hTree, double * padfBoundsMin, double * padfBoundsMax, int * ); int SHPAPI_CALL SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); int SHPAPI_CALL1(*) SHPSearchDiskTree( FILE *fp, double *padfBoundsMin, double *padfBoundsMax, int *pnShapeCount ); /************************************************************************/ /* DBF Support. */ /************************************************************************/ typedef struct { SAHooks sHooks; SAFile fp; int nRecords; int nRecordLength; int nHeaderLength; int nFields; int *panFieldOffset; int *panFieldSize; int *panFieldDecimals; char *pachFieldType; char *pszHeader; int nCurrentRecord; int bCurrentRecordModified; char *pszCurrentRecord; int nWorkFieldLength; char *pszWorkField; int bNoHeader; int bUpdated; double dfDoubleField; int iLanguageDriver; char *pszCodePage; } DBFInfo; typedef DBFInfo * DBFHandle; typedef enum { FTString, FTInteger, FTDouble, FTLogical, FTInvalid } DBFFieldType; #define XBASE_FLDHDR_SZ 32 DBFHandle SHPAPI_CALL DBFOpen( const char * pszDBFFile, const char * pszAccess ); DBFHandle SHPAPI_CALL DBFOpenLL( const char * pszDBFFile, const char * pszAccess, SAHooks *psHooks ); DBFHandle SHPAPI_CALL DBFCreate( const char * pszDBFFile ); DBFHandle SHPAPI_CALL DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); DBFHandle SHPAPI_CALL DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); int SHPAPI_CALL DBFGetFieldCount( DBFHandle psDBF ); int SHPAPI_CALL DBFGetRecordCount( DBFHandle psDBF ); int SHPAPI_CALL DBFAddField( DBFHandle hDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ); int SHPAPI_CALL DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, char chType, int nWidth, int nDecimals ); int SHPAPI_CALL DBFDeleteField( DBFHandle hDBF, int iField ); DBFFieldType SHPAPI_CALL DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ); int SHPAPI_CALL DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); int SHPAPI_CALL DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); double SHPAPI_CALL DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); const char SHPAPI_CALL1(*) DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); const char SHPAPI_CALL1(*) DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, int nFieldValue ); int SHPAPI_CALL DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, double dFieldValue ); int SHPAPI_CALL DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, const char * pszFieldValue ); int SHPAPI_CALL DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, const char lFieldValue); int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void * pValue ); const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity ); int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, int bIsDeleted ); DBFHandle SHPAPI_CALL DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); void SHPAPI_CALL DBFClose( DBFHandle hDBF ); void SHPAPI_CALL DBFUpdateHeader( DBFHandle hDBF ); char SHPAPI_CALL DBFGetNativeFieldType( DBFHandle hDBF, int iField ); const char SHPAPI_CALL1(*) DBFGetCodePage(DBFHandle psDBF ); #ifdef __cplusplus } #endif #endif /* ndef SHAPEFILE_H_INCLUDED */ navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/shpopen.c000066400000000000000000002450771221777731700236340ustar00rootroot00000000000000/****************************************************************************** * $Id: shpopen.c,v 1.59 2008/03/14 05:25:31 fwarmerdam Exp $ * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, 2001, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shpopen.c,v $ * Revision 1.59 2008/03/14 05:25:31 fwarmerdam * Correct crash on buggy geometries (gdal #2218) * * Revision 1.58 2008/01/08 23:28:26 bram * on line 2095, use a float instead of a double to avoid a compiler warning * * Revision 1.57 2007/12/06 07:00:25 fwarmerdam * dbfopen now using SAHooks for fileio * * Revision 1.56 2007/12/04 20:37:56 fwarmerdam * preliminary implementation of hooks api for io and errors * * Revision 1.55 2007/11/21 22:39:56 fwarmerdam * close shx file in readonly mode (GDAL #1956) * * Revision 1.54 2007/11/15 00:12:47 mloskot * Backported recent changes from GDAL (Ticket #1415) to Shapelib. * * Revision 1.53 2007/11/14 22:31:08 fwarmerdam * checks after mallocs to detect for corrupted/voluntary broken shapefiles. * http://trac.osgeo.org/gdal/ticket/1991 * * Revision 1.52 2007/06/21 15:58:33 fwarmerdam * fix for SHPRewindObject when rings touch at one vertex (gdal #976) * * Revision 1.51 2006/09/04 15:24:01 fwarmerdam * Fixed up log message for 1.49. * * Revision 1.50 2006/09/04 15:21:39 fwarmerdam * fix of last fix * * Revision 1.49 2006/09/04 15:21:00 fwarmerdam * MLoskot: Added stronger test of Shapefile reading failures, e.g. truncated * files. The problem was discovered by Tim Sutton and reported here * https://svn.qgis.org/trac/ticket/200 * * Revision 1.48 2006/01/26 15:07:32 fwarmerdam * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 * * Revision 1.47 2006/01/04 20:07:23 fwarmerdam * In SHPWriteObject() make sure that the record length is updated * when rewriting an existing record. * * Revision 1.46 2005/02/11 17:17:46 fwarmerdam * added panPartStart[0] validation * * Revision 1.45 2004/09/26 20:09:48 fwarmerdam * const correctness changes * * Revision 1.44 2003/12/29 00:18:39 fwarmerdam * added error checking for failed IO and optional CPL error reporting * * Revision 1.43 2003/12/01 16:20:08 warmerda * be careful of zero vertex shapes * * Revision 1.42 2003/12/01 14:58:27 warmerda * added degenerate object check in SHPRewindObject() * * Revision 1.41 2003/07/08 15:22:43 warmerda * avoid warning * * Revision 1.40 2003/04/21 18:30:37 warmerda * added header write/update public methods * * Revision 1.39 2002/08/26 06:46:56 warmerda * avoid c++ comments * * Revision 1.38 2002/05/07 16:43:39 warmerda * Removed debugging printf. * * Revision 1.37 2002/04/10 17:35:22 warmerda * fixed bug in ring reversal code * * Revision 1.36 2002/04/10 16:59:54 warmerda * added SHPRewindObject * * Revision 1.35 2001/12/07 15:10:44 warmerda * fix if .shx fails to open * * Revision 1.34 2001/11/01 16:29:55 warmerda * move pabyRec into SHPInfo for thread safety * * Revision 1.33 2001/07/03 12:18:15 warmerda * Improved cleanup if SHX not found, provied by Riccardo Cohen. * * Revision 1.32 2001/06/22 01:58:07 warmerda * be more careful about establishing initial bounds in face of NULL shapes * * Revision 1.31 2001/05/31 19:35:29 warmerda * added support for writing null shapes * * Revision 1.30 2001/05/28 12:46:29 warmerda * Add some checking on reasonableness of record count when opening. * * Revision 1.29 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.28 2001/02/06 22:25:06 warmerda * fixed memory leaks when SHPOpen() fails * * Revision 1.27 2000/07/18 15:21:33 warmerda * added better enforcement of -1 for append in SHPWriteObject * * Revision 1.26 2000/02/16 16:03:51 warmerda * added null shape support * * Revision 1.25 1999/12/15 13:47:07 warmerda * Fixed record size settings in .shp file (was 4 words too long) * Added stdlib.h. * * Revision 1.24 1999/11/05 14:12:04 warmerda * updated license terms * * Revision 1.23 1999/07/27 00:53:46 warmerda * added support for rewriting shapes * * Revision 1.22 1999/06/11 19:19:11 warmerda * Cleanup pabyRec static buffer on SHPClose(). * * Revision 1.21 1999/06/02 14:57:56 kshih * Remove unused variables * * Revision 1.20 1999/04/19 21:04:17 warmerda * Fixed syntax error. * * Revision 1.19 1999/04/19 21:01:57 warmerda * Force access string to binary in SHPOpen(). * * Revision 1.18 1999/04/01 18:48:07 warmerda * Try upper case extensions if lower case doesn't work. * * Revision 1.17 1998/12/31 15:29:39 warmerda * Disable writing measure values to multipatch objects if * DISABLE_MULTIPATCH_MEASURE is defined. * * Revision 1.16 1998/12/16 05:14:33 warmerda * Added support to write MULTIPATCH. Fixed reading Z coordinate of * MULTIPATCH. Fixed record size written for all feature types. * * Revision 1.15 1998/12/03 16:35:29 warmerda * r+b is proper binary access string, not rb+. * * Revision 1.14 1998/12/03 15:47:56 warmerda * Fixed setting of nVertices in SHPCreateObject(). * * Revision 1.13 1998/12/03 15:33:54 warmerda * Made SHPCalculateExtents() separately callable. * * Revision 1.12 1998/11/11 20:01:50 warmerda * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. * * Revision 1.11 1998/11/09 20:56:44 warmerda * Fixed up handling of file wide bounds. * * Revision 1.10 1998/11/09 20:18:51 warmerda * Converted to support 3D shapefiles, and use of SHPObject. * * Revision 1.9 1998/02/24 15:09:05 warmerda * Fixed memory leak. * * Revision 1.8 1997/12/04 15:40:29 warmerda * Fixed byte swapping of record number, and record length fields in the * .shp file. * * Revision 1.7 1995/10/21 03:15:58 warmerda * Added support for binary file access, the magic cookie 9997 * and tried to improve the int32 selection logic for 16bit systems. * * Revision 1.6 1995/09/04 04:19:41 warmerda * Added fix for file bounds. * * Revision 1.5 1995/08/25 15:16:44 warmerda * Fixed a couple of problems with big endian systems ... one with bounds * and the other with multipart polygons. * * Revision 1.4 1995/08/24 18:10:17 warmerda * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() * functions (such as on the Sun). * * Revision 1.3 1995/08/23 02:23:15 warmerda * Added support for reading bounds, and fixed up problems in setting the * file wide bounds. * * Revision 1.2 1995/08/04 03:16:57 warmerda * Added header. * */ #include "shapefil.h" #include #include #include #include #include #include #include typedef unsigned char uchar; #if UINT_MAX == 65535 typedef long int32; #else typedef int int32; #endif #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #define ByteCopy( a, b, c ) memcpy( b, a, c ) #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif static int bBigEndian; /************************************************************************/ /* SwapWord() */ /* */ /* Swap a 2, 4 or 8 byte word. */ /************************************************************************/ static void SwapWord( int length, void * wordP ) { int i; uchar temp; for( i=0; i < length/2; i++ ) { temp = ((uchar *) wordP)[i]; ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; ((uchar *) wordP)[length-i-1] = temp; } } /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* SHPWriteHeader() */ /* */ /* Write out a header for the .shp and .shx files as well as the */ /* contents of the index (.shx) file. */ /************************************************************************/ void SHPWriteHeader( SHPHandle psSHP ) { uchar abyHeader[100]; int i; int32 i32; double dValue; int32 *panSHX; if (psSHP->fpSHX == NULL) { psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed"); return; } /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = psSHP->nFileSize/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = psSHP->nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = psSHP->adBoundsMin[0]; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+36 ); dValue = psSHP->adBoundsMin[1]; ByteCopy( &dValue, abyHeader+44, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+44 ); dValue = psSHP->adBoundsMax[0]; ByteCopy( &dValue, abyHeader+52, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+52 ); dValue = psSHP->adBoundsMax[1]; ByteCopy( &dValue, abyHeader+60, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+60 ); dValue = psSHP->adBoundsMin[2]; /* z */ ByteCopy( &dValue, abyHeader+68, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+68 ); dValue = psSHP->adBoundsMax[2]; ByteCopy( &dValue, abyHeader+76, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+76 ); dValue = psSHP->adBoundsMin[3]; /* m */ ByteCopy( &dValue, abyHeader+84, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+84 ); dValue = psSHP->adBoundsMax[3]; ByteCopy( &dValue, abyHeader+92, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+92 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) { psSHP->sHooks.Error( "Failure writing .shp header" ); return; } /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) { psSHP->sHooks.Error( "Failure writing .shx header" ); return; } /* -------------------------------------------------------------------- */ /* Write out the .shx contents. */ /* -------------------------------------------------------------------- */ panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); for( i = 0; i < psSHP->nRecords; i++ ) { panSHX[i*2 ] = psSHP->panRecOffset[i]/2; panSHX[i*2+1] = psSHP->panRecSize[i]/2; if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); } if( (int)psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX ) != psSHP->nRecords ) { psSHP->sHooks.Error( "Failure writing .shx contents" ); } free( panSHX ); /* -------------------------------------------------------------------- */ /* Flush to disk. */ /* -------------------------------------------------------------------- */ psSHP->sHooks.FFlush( psSHP->fpSHP ); psSHP->sHooks.FFlush( psSHP->fpSHX ); } /************************************************************************/ /* SHPOpen() */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPOpen( const char * pszLayer, const char * pszAccess ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return SHPOpenLL( pszLayer, pszAccess, &sHooks ); } /************************************************************************/ /* SHPOpen() */ /* */ /* Open the .shp and .shx files based on the basename of the */ /* files or either file name. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) { char *pszFullname, *pszBasename; SHPHandle psSHP; uchar *pabyBuf; int i; double dValue; /* -------------------------------------------------------------------- */ /* Ensure the access string is one of the legal ones. We */ /* ensure the result string indicates binary to avoid common */ /* problems on Windows. */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 || strcmp(pszAccess,"r+") == 0 ) pszAccess = "r+b"; else pszAccess = "rb"; /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Initialize the info structure. */ /* -------------------------------------------------------------------- */ psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1); psSHP->bUpdated = FALSE; memcpy( &(psSHP->sHooks), psHooks, sizeof(SAHooks) ); /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ) ; psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); if( psSHP->fpSHP == NULL ) { sprintf( pszFullname, "%s.SHP", pszBasename ); psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); } if( psSHP->fpSHP == NULL ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_OpenFailed, "Unable to open %s.shp or %s.SHP.", pszBasename, pszBasename ); #endif free( psSHP ); free( pszBasename ); free( pszFullname ); return( NULL ); } sprintf( pszFullname, "%s.shx", pszBasename ); psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); if( psSHP->fpSHX == NULL ) { sprintf( pszFullname, "%s.SHX", pszBasename ); psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); } if( psSHP->fpSHX == NULL ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_OpenFailed, "Unable to open %s.shx or %s.SHX.", pszBasename, pszBasename ); #endif psSHP->sHooks.FClose( psSHP->fpSHP ); free( psSHP ); free( pszBasename ); free( pszFullname ); return( NULL ); } free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Read the file size from the SHP file. */ /* -------------------------------------------------------------------- */ pabyBuf = (uchar *) malloc(100); psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ); psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[26] * 256 + pabyBuf[27]) * 2; /* -------------------------------------------------------------------- */ /* Read SHX file Header info */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHX ) != 1 || pabyBuf[0] != 0 || pabyBuf[1] != 0 || pabyBuf[2] != 0x27 || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) { psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP ); return( NULL ); } psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256; psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8; psSHP->nShapeType = pabyBuf[32]; if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) { char szError[200]; sprintf( szError, "Record count in .shp header is %d, which seems\n" "unreasonable. Assuming header is corrupt.", psSHP->nRecords ); psSHP->sHooks.Error( szError ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP ); free(pabyBuf); return( NULL ); } /* -------------------------------------------------------------------- */ /* Read the bounds. */ /* -------------------------------------------------------------------- */ if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); memcpy( &dValue, pabyBuf+36, 8 ); psSHP->adBoundsMin[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); memcpy( &dValue, pabyBuf+44, 8 ); psSHP->adBoundsMin[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); memcpy( &dValue, pabyBuf+52, 8 ); psSHP->adBoundsMax[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); memcpy( &dValue, pabyBuf+60, 8 ); psSHP->adBoundsMax[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ memcpy( &dValue, pabyBuf+68, 8 ); psSHP->adBoundsMin[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); memcpy( &dValue, pabyBuf+76, 8 ); psSHP->adBoundsMax[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ memcpy( &dValue, pabyBuf+84, 8 ); psSHP->adBoundsMin[3] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); memcpy( &dValue, pabyBuf+92, 8 ); psSHP->adBoundsMax[3] = dValue; free( pabyBuf ); /* -------------------------------------------------------------------- */ /* Read the .shx file to get the offsets to each record in */ /* the .shp file. */ /* -------------------------------------------------------------------- */ psSHP->nMaxRecords = psSHP->nRecords; psSHP->panRecOffset = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); psSHP->panRecSize = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); if (psSHP->panRecOffset == NULL || psSHP->panRecSize == NULL || pabyBuf == NULL) { char szError[200]; sprintf(szError, "Not enough memory to allocate requested memory (nRecords=%d).\n" "Probably broken SHP file", psSHP->nRecords ); psSHP->sHooks.Error( szError ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); if (psSHP->panRecOffset) free( psSHP->panRecOffset ); if (psSHP->panRecSize) free( psSHP->panRecSize ); if (pabyBuf) free( pabyBuf ); free( psSHP ); return( NULL ); } if( (int) psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ) != psSHP->nRecords ) { char szError[200]; sprintf( szError, "Failed to read all values for %d records in .shx file.", psSHP->nRecords ); psSHP->sHooks.Error( szError ); /* SHX is short or unreadable for some reason. */ psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP->panRecOffset ); free( psSHP->panRecSize ); free( pabyBuf ); free( psSHP ); return( NULL ); } /* In read-only mode, we can close the SHX now */ if (strcmp(pszAccess, "rb") == 0) { psSHP->sHooks.FClose( psSHP->fpSHX ); psSHP->fpSHX = NULL; } for( i = 0; i < psSHP->nRecords; i++ ) { int32 nOffset, nLength; memcpy( &nOffset, pabyBuf + i * 8, 4 ); if( !bBigEndian ) SwapWord( 4, &nOffset ); memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); if( !bBigEndian ) SwapWord( 4, &nLength ); psSHP->panRecOffset[i] = nOffset*2; psSHP->panRecSize[i] = nLength*2; } free( pabyBuf ); return( psSHP ); } /************************************************************************/ /* SHPClose() */ /* */ /* Close the .shp and .shx files. */ /************************************************************************/ void SHPAPI_CALL SHPClose(SHPHandle psSHP ) { if( psSHP == NULL ) return; /* -------------------------------------------------------------------- */ /* Update the header if we have modified anything. */ /* -------------------------------------------------------------------- */ if( psSHP->bUpdated ) SHPWriteHeader( psSHP ); /* -------------------------------------------------------------------- */ /* Free all resources, and close files. */ /* -------------------------------------------------------------------- */ free( psSHP->panRecOffset ); free( psSHP->panRecSize ); if ( psSHP->fpSHX != NULL) psSHP->sHooks.FClose( psSHP->fpSHX ); psSHP->sHooks.FClose( psSHP->fpSHP ); if( psSHP->pabyRec != NULL ) { free( psSHP->pabyRec ); } free( psSHP ); } /************************************************************************/ /* SHPGetInfo() */ /* */ /* Fetch general information about the shape file. */ /************************************************************************/ void SHPAPI_CALL SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ) { int i; if( psSHP == NULL ) return; if( pnEntities != NULL ) *pnEntities = psSHP->nRecords; if( pnShapeType != NULL ) *pnShapeType = psSHP->nShapeType; for( i = 0; i < 4; i++ ) { if( padfMinBound != NULL ) padfMinBound[i] = psSHP->adBoundsMin[i]; if( padfMaxBound != NULL ) padfMaxBound[i] = psSHP->adBoundsMax[i]; } } /************************************************************************/ /* SHPCreate() */ /* */ /* Create a new shape file and return a handle to the open */ /* shape file with read/write access. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPCreate( const char * pszLayer, int nShapeType ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return SHPCreateLL( pszLayer, nShapeType, &sHooks ); } /************************************************************************/ /* SHPCreate() */ /* */ /* Create a new shape file and return a handle to the open */ /* shape file with read/write access. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) { char *pszBasename, *pszFullname; int i; SAFile fpSHP, fpSHX; uchar abyHeader[100]; int32 i32; double dValue; /* -------------------------------------------------------------------- */ /* Establish the byte order on this system. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the two files so we can write their headers. */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ); fpSHP = psHooks->FOpen(pszFullname, "wb" ); if( fpSHP == NULL ) { psHooks->Error( "Failed to create file .shp file." ); return( NULL ); } sprintf( pszFullname, "%s.shx", pszBasename ); fpSHX = psHooks->FOpen(pszFullname, "wb" ); if( fpSHX == NULL ) { psHooks->Error( "Failed to create file .shx file." ); return( NULL ); } free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = 0.0; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); ByteCopy( &dValue, abyHeader+44, 8 ); ByteCopy( &dValue, abyHeader+52, 8 ); ByteCopy( &dValue, abyHeader+60, 8 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) { psHooks->Error( "Failed to write .shp header." ); return NULL; } /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) { psHooks->Error( "Failed to write .shx header." ); return NULL; } /* -------------------------------------------------------------------- */ /* Close the files, and then open them as regular existing files. */ /* -------------------------------------------------------------------- */ psHooks->FClose( fpSHP ); psHooks->FClose( fpSHX ); return( SHPOpenLL( pszLayer, "r+b", psHooks ) ); } /************************************************************************/ /* _SHPSetBounds() */ /* */ /* Compute a bounds rectangle for a shape, and set it into the */ /* indicated location in the record. */ /************************************************************************/ static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) { ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); if( bBigEndian ) { SwapWord( 8, pabyRec + 0 ); SwapWord( 8, pabyRec + 8 ); SwapWord( 8, pabyRec + 16 ); SwapWord( 8, pabyRec + 24 ); } } /************************************************************************/ /* SHPComputeExtents() */ /* */ /* Recompute the extents of a shape. Automatically done by */ /* SHPCreateObject(). */ /************************************************************************/ void SHPAPI_CALL SHPComputeExtents( SHPObject * psObject ) { int i; /* -------------------------------------------------------------------- */ /* Build extents for this object. */ /* -------------------------------------------------------------------- */ if( psObject->nVertices > 0 ) { psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; } for( i = 0; i < psObject->nVertices; i++ ) { psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); } } /************************************************************************/ /* SHPCreateObject() */ /* */ /* Create a shape object. It should be freed with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPCreateObject( int nSHPType, int nShapeId, int nParts, const int * panPartStart, const int * panPartType, int nVertices, const double *padfX, const double *padfY, const double * padfZ, const double * padfM ) { SHPObject *psObject; int i, bHasM, bHasZ; psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); psObject->nSHPType = nSHPType; psObject->nShapeId = nShapeId; psObject->bMeasureIsUsed = FALSE; /* -------------------------------------------------------------------- */ /* Establish whether this shape type has M, and Z values. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARCM || nSHPType == SHPT_POINTM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_MULTIPOINTM ) { bHasM = TRUE; bHasZ = FALSE; } else if( nSHPType == SHPT_ARCZ || nSHPType == SHPT_POINTZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPOINTZ || nSHPType == SHPT_MULTIPATCH ) { bHasM = TRUE; bHasZ = TRUE; } else { bHasM = FALSE; bHasZ = FALSE; } /* -------------------------------------------------------------------- */ /* Capture parts. Note that part type is optional, and */ /* defaults to ring. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPATCH ) { psObject->nParts = MAX(1,nParts); psObject->panPartStart = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartType = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartStart[0] = 0; psObject->panPartType[0] = SHPP_RING; for( i = 0; i < nParts; i++ ) { psObject->panPartStart[i] = panPartStart[i]; if( panPartType != NULL ) psObject->panPartType[i] = panPartType[i]; else psObject->panPartType[i] = SHPP_RING; } if( psObject->panPartStart[0] != 0 ) psObject->panPartStart[0] = 0; } /* -------------------------------------------------------------------- */ /* Capture vertices. Note that Z and M are optional, but X and */ /* Y are not. */ /* -------------------------------------------------------------------- */ if( nVertices > 0 ) { psObject->padfX = (double *) calloc(sizeof(double),nVertices); psObject->padfY = (double *) calloc(sizeof(double),nVertices); psObject->padfZ = (double *) calloc(sizeof(double),nVertices); psObject->padfM = (double *) calloc(sizeof(double),nVertices); assert( padfX != NULL ); assert( padfY != NULL ); for( i = 0; i < nVertices; i++ ) { psObject->padfX[i] = padfX[i]; psObject->padfY[i] = padfY[i]; if( padfZ != NULL && bHasZ ) psObject->padfZ[i] = padfZ[i]; if( padfM != NULL && bHasM ) psObject->padfM[i] = padfM[i]; } if( padfM != NULL && bHasM ) psObject->bMeasureIsUsed = TRUE; } /* -------------------------------------------------------------------- */ /* Compute the extents. */ /* -------------------------------------------------------------------- */ psObject->nVertices = nVertices; SHPComputeExtents( psObject ); return( psObject ); } /************************************************************************/ /* SHPCreateSimpleObject() */ /* */ /* Create a simple (common) shape object. Destroy with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject( int nSHPType, int nVertices, const double * padfX, const double * padfY, const double * padfZ ) { return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, nVertices, padfX, padfY, padfZ, NULL ) ); } /************************************************************************/ /* SHPWriteObject() */ /* */ /* Write out the vertices of a new structure. Note that it is */ /* only possible to write vertices at the end of the file. */ /************************************************************************/ int SHPAPI_CALL SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) { int nRecordOffset, i, nRecordSize=0; uchar *pabyRec; int32 i32; psSHP->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Ensure that shape object matches the type of the file it is */ /* being written to. */ /* -------------------------------------------------------------------- */ assert( psObject->nSHPType == psSHP->nShapeType || psObject->nSHPType == SHPT_NULL ); /* -------------------------------------------------------------------- */ /* Ensure that -1 is used for appends. Either blow an */ /* assertion, or if they are disabled, set the shapeid to -1 */ /* for appends. */ /* -------------------------------------------------------------------- */ assert( nShapeId == -1 || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) nShapeId = -1; /* -------------------------------------------------------------------- */ /* Add the new entity to the in memory index. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) { psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100); psSHP->panRecOffset = (int *) SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords ); psSHP->panRecSize = (int *) SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords ); } /* -------------------------------------------------------------------- */ /* Initialize record. */ /* -------------------------------------------------------------------- */ pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + psObject->nParts * 8 + 128); /* -------------------------------------------------------------------- */ /* Extract vertices for a Polygon or Arc. */ /* -------------------------------------------------------------------- */ if( psObject->nSHPType == SHPT_POLYGON || psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARC || psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_ARCM || psObject->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i; nPoints = psObject->nVertices; nParts = psObject->nParts; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); nRecordSize = 52; /* * Write part start positions. */ ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, 4 * psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); nRecordSize += 4; } /* * Write multipatch part types if needed. */ if( psObject->nSHPType == SHPT_MULTIPATCH ) { memcpy( pabyRec + nRecordSize, psObject->panPartType, 4*psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); nRecordSize += 4; } } /* * Write the (x,y) vertex values. */ for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize + 8 ); nRecordSize += 2 * 8; } /* * Write the Z coordinates (if any). */ if( psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_MULTIPATCH ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* * Write the M values, if any. */ if( psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARCM #ifndef DISABLE_MULTIPATCH_MEASURE || psObject->nSHPType == SHPT_MULTIPATCH #endif || psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_ARCZ) ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Extract vertices for a MultiPoint. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_MULTIPOINT || psObject->nSHPType == SHPT_MULTIPOINTZ || psObject->nSHPType == SHPT_MULTIPOINTM ) { int32 nPoints; int i; nPoints = psObject->nVertices; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); ByteCopy( &nPoints, pabyRec + 44, 4 ); for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); } nRecordSize = 48 + 16 * psObject->nVertices; if( psObject->nSHPType == SHPT_MULTIPOINTZ ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } if( psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_MULTIPOINTZ || psObject->nSHPType == SHPT_MULTIPOINTM) ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Write point. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_POINT || psObject->nSHPType == SHPT_POINTZ || psObject->nSHPType == SHPT_POINTM ) { ByteCopy( psObject->padfX, pabyRec + 12, 8 ); ByteCopy( psObject->padfY, pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); nRecordSize = 28; if( psObject->nSHPType == SHPT_POINTZ ) { ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } if( psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_POINTZ || psObject->nSHPType == SHPT_POINTM) ) { ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* -------------------------------------------------------------------- */ /* Not much to do for null geometries. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_NULL ) { nRecordSize = 12; } else { /* unknown type */ assert( FALSE ); } /* -------------------------------------------------------------------- */ /* Establish where we are going to put this record. If we are */ /* rewriting and existing record, and it will fit, then put it */ /* back where the original came from. Otherwise write at the end. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) { if( nShapeId == -1 ) nShapeId = psSHP->nRecords++; psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize; psSHP->panRecSize[nShapeId] = nRecordSize-8; psSHP->nFileSize += nRecordSize; } else { nRecordOffset = psSHP->panRecOffset[nShapeId]; psSHP->panRecSize[nShapeId] = nRecordSize-8; } /* -------------------------------------------------------------------- */ /* Set the shape type, record number, and record size. */ /* -------------------------------------------------------------------- */ i32 = nShapeId+1; /* record # */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec, 4 ); i32 = (nRecordSize-8)/2; /* record size */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 4, 4 ); i32 = psObject->nSHPType; /* shape type */ if( bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 8, 4 ); /* -------------------------------------------------------------------- */ /* Write out record. */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 || psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) { psSHP->sHooks.Error( "Error in psSHP->sHooks.FSeek() or fwrite() writing object to .shp file." ); free( pabyRec ); return -1; } free( pabyRec ); /* -------------------------------------------------------------------- */ /* Expand file wide bounds based on this shape. */ /* -------------------------------------------------------------------- */ if( psSHP->adBoundsMin[0] == 0.0 && psSHP->adBoundsMax[0] == 0.0 && psSHP->adBoundsMin[1] == 0.0 && psSHP->adBoundsMax[1] == 0.0 ) { if( psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0 ) { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = 0.0; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = 0.0; psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = 0.0; psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = 0.0; } else { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0]; psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0]; } } for( i = 0; i < psObject->nVertices; i++ ) { psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); } return( nShapeId ); } /************************************************************************/ /* SHPReadObject() */ /* */ /* Read the vertices, parts, and other non-attribute information */ /* for one shape. */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPReadObject( SHPHandle psSHP, int hEntity ) { int nEntitySize, nRequiredSize; SHPObject *psShape; char pszErrorMsg[128]; /* -------------------------------------------------------------------- */ /* Validate the record/entity number. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psSHP->nRecords ) return( NULL ); /* -------------------------------------------------------------------- */ /* Ensure our record buffer is large enough. */ /* -------------------------------------------------------------------- */ nEntitySize = psSHP->panRecSize[hEntity]+8; if( nEntitySize > psSHP->nBufSize ) { psSHP->pabyRec = (uchar *) SfRealloc(psSHP->pabyRec,nEntitySize); if (psSHP->pabyRec == NULL) { char szError[200]; /* Reallocate previous successfull size for following features */ psSHP->pabyRec = malloc(psSHP->nBufSize); sprintf( szError, "Not enough memory to allocate requested memory (nBufSize=%d). " "Probably broken SHP file", psSHP->nBufSize ); psSHP->sHooks.Error( szError ); return NULL; } /* Only set new buffer size after successfull alloc */ psSHP->nBufSize = nEntitySize; } /* In case we were not able to reallocate the buffer on a previous step */ if (psSHP->pabyRec == NULL) { return NULL; } /* -------------------------------------------------------------------- */ /* Read the record. */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ) != 0 || psSHP->sHooks.FRead( psSHP->pabyRec, nEntitySize, 1, psSHP->fpSHP ) != 1 ) { /* * TODO - mloskot: Consider detailed diagnostics of shape file, * for example to detect if file is truncated. */ psSHP->sHooks.Error( "Error in fseek() or fread() reading object from .shp file." ); return NULL; } /* -------------------------------------------------------------------- */ /* Allocate and minimally initialize the object. */ /* -------------------------------------------------------------------- */ psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); psShape->nShapeId = hEntity; psShape->bMeasureIsUsed = FALSE; if ( 8 + 4 > nEntitySize ) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } memcpy( &psShape->nSHPType, psSHP->pabyRec + 8, 4 ); if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) ); /* ==================================================================== */ /* Extract vertices for a Polygon or Arc. */ /* ==================================================================== */ if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC || psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_POLYGONM || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_ARCM || psShape->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i, nOffset; if ( 40 + 8 + 4 > nEntitySize ) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* Extract part/point count, and build vertex and part arrays */ /* to proper size. */ /* -------------------------------------------------------------------- */ memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); if (nPoints < 0 || nParts < 0 || nPoints > 50 * 1000 * 1000 || nParts > 10 * 1000 * 1000) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d, nPoints=%d, nParts=%d.", hEntity, nPoints, nParts); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } /* With the previous checks on nPoints and nParts, */ /* we should not overflow here and after */ /* since 50 M * (16 + 8 + 8) = 1 600 MB */ nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; if ( psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_MULTIPATCH ) { nRequiredSize += 16 + 8 * nPoints; } if( psShape->nSHPType == SHPT_MULTIPATCH ) { nRequiredSize += 4 * nParts; } if (nRequiredSize > nEntitySize) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d, nPoints=%d, nParts=%d, nEntitySize=%d.", hEntity, nPoints, nParts, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); psShape->nParts = nParts; psShape->panPartStart = (int *) calloc(nParts,sizeof(int)); psShape->panPartType = (int *) calloc(nParts,sizeof(int)); if (psShape->padfX == NULL || psShape->padfY == NULL || psShape->padfZ == NULL || psShape->padfM == NULL || psShape->panPartStart == NULL || psShape->panPartType == NULL) { g_snprintf(pszErrorMsg, 128, "Not enough memory to allocate requested memory (nPoints=%d, nParts=%d) for shape %d. " "Probably broken SHP file", hEntity, nPoints, nParts ); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } for( i = 0; i < nParts; i++ ) psShape->panPartType[i] = SHPP_RING; /* -------------------------------------------------------------------- */ /* Copy out the part array from the record. */ /* -------------------------------------------------------------------- */ memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); /* We check that the offset is inside the vertex array */ if (psShape->panPartStart[i] < 0 || psShape->panPartStart[i] >= psShape->nVertices) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", hEntity, i, psShape->panPartStart[i], psShape->nVertices); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } if (i > 0 && psShape->panPartStart[i] <= psShape->panPartStart[i-1]) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } } nOffset = 44 + 8 + 4*nParts; /* -------------------------------------------------------------------- */ /* If this is a multipatch, we will also have parts types. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); } nOffset += 4*nParts; } /* -------------------------------------------------------------------- */ /* Copy out the vertices from the record. */ /* -------------------------------------------------------------------- */ for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX + i, psSHP->pabyRec + nOffset + i * 16, 8 ); memcpy(psShape->padfY + i, psSHP->pabyRec + nOffset + i * 16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset += 16*nPoints; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( nEntitySize >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } psShape->bMeasureIsUsed = TRUE; } } /* ==================================================================== */ /* Extract vertices for a MultiPoint. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_MULTIPOINT || psShape->nSHPType == SHPT_MULTIPOINTM || psShape->nSHPType == SHPT_MULTIPOINTZ ) { int32 nPoints; int i, nOffset; if ( 44 + 4 > nEntitySize ) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); if (nPoints < 0 || nPoints > 50 * 1000 * 1000) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nPoints = %d", hEntity, nPoints); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } nRequiredSize = 48 + nPoints * 16; if( psShape->nSHPType == SHPT_MULTIPOINTZ ) { nRequiredSize += 16 + nPoints * 8; } if (nRequiredSize > nEntitySize) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nPoints = %d, nEntitySize = %d", hEntity, nPoints, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); if (psShape->padfX == NULL || psShape->padfY == NULL || psShape->padfZ == NULL || psShape->padfM == NULL) { g_snprintf(pszErrorMsg, 128, "Not enough memory to allocate requested memory (nPoints=%d) for shape %d. " "Probably broken SHP file", hEntity, nPoints ); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset = 48 + 16*nPoints; /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPOINTZ ) { memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( nEntitySize >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } psShape->bMeasureIsUsed = TRUE; } } /* ==================================================================== */ /* Extract vertices for a point. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_POINT || psShape->nSHPType == SHPT_POINTM || psShape->nSHPType == SHPT_POINTZ ) { int nOffset; psShape->nVertices = 1; psShape->padfX = (double *) calloc(1,sizeof(double)); psShape->padfY = (double *) calloc(1,sizeof(double)); psShape->padfZ = (double *) calloc(1,sizeof(double)); psShape->padfM = (double *) calloc(1,sizeof(double)); if (20 + 8 + (( psShape->nSHPType == SHPT_POINTZ ) ? 8 : 0)> nEntitySize) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX ); if( bBigEndian ) SwapWord( 8, psShape->padfY ); nOffset = 20 + 8; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POINTZ ) { memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ ); nOffset += 8; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( nEntitySize >= nOffset + 8 ) { memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM ); psShape->bMeasureIsUsed = TRUE; } /* -------------------------------------------------------------------- */ /* Since no extents are supplied in the record, we will apply */ /* them from the single vertex. */ /* -------------------------------------------------------------------- */ psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; } return( psShape ); } /************************************************************************/ /* SHPTypeName() */ /************************************************************************/ const char SHPAPI_CALL1(*) SHPTypeName( int nSHPType ) { switch( nSHPType ) { case SHPT_NULL: return "NullShape"; case SHPT_POINT: return "Point"; case SHPT_ARC: return "Arc"; case SHPT_POLYGON: return "Polygon"; case SHPT_MULTIPOINT: return "MultiPoint"; case SHPT_POINTZ: return "PointZ"; case SHPT_ARCZ: return "ArcZ"; case SHPT_POLYGONZ: return "PolygonZ"; case SHPT_MULTIPOINTZ: return "MultiPointZ"; case SHPT_POINTM: return "PointM"; case SHPT_ARCM: return "ArcM"; case SHPT_POLYGONM: return "PolygonM"; case SHPT_MULTIPOINTM: return "MultiPointM"; case SHPT_MULTIPATCH: return "MultiPatch"; default: return "UnknownShapeType"; } } /************************************************************************/ /* SHPPartTypeName() */ /************************************************************************/ const char SHPAPI_CALL1(*) SHPPartTypeName( int nPartType ) { switch( nPartType ) { case SHPP_TRISTRIP: return "TriangleStrip"; case SHPP_TRIFAN: return "TriangleFan"; case SHPP_OUTERRING: return "OuterRing"; case SHPP_INNERRING: return "InnerRing"; case SHPP_FIRSTRING: return "FirstRing"; case SHPP_RING: return "Ring"; default: return "UnknownPartType"; } } /************************************************************************/ /* SHPDestroyObject() */ /************************************************************************/ void SHPAPI_CALL SHPDestroyObject( SHPObject * psShape ) { if( psShape == NULL ) return; if( psShape->padfX != NULL ) free( psShape->padfX ); if( psShape->padfY != NULL ) free( psShape->padfY ); if( psShape->padfZ != NULL ) free( psShape->padfZ ); if( psShape->padfM != NULL ) free( psShape->padfM ); if( psShape->panPartStart != NULL ) free( psShape->panPartStart ); if( psShape->panPartType != NULL ) free( psShape->panPartType ); free( psShape ); } /************************************************************************/ /* SHPRewindObject() */ /* */ /* Reset the winding of polygon objects to adhere to the */ /* specification. */ /************************************************************************/ int SHPAPI_CALL SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ) { int iOpRing, bAltered = 0; /* -------------------------------------------------------------------- */ /* Do nothing if this is not a polygon object. */ /* -------------------------------------------------------------------- */ if( psObject->nSHPType != SHPT_POLYGON && psObject->nSHPType != SHPT_POLYGONZ && psObject->nSHPType != SHPT_POLYGONM ) return 0; if( psObject->nVertices == 0 || psObject->nParts == 0 ) return 0; /* -------------------------------------------------------------------- */ /* Process each of the rings. */ /* -------------------------------------------------------------------- */ for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) { int bInner, iVert, nVertCount, nVertStart, iCheckRing; double dfSum, dfTestX, dfTestY; /* -------------------------------------------------------------------- */ /* Determine if this ring is an inner ring or an outer ring */ /* relative to all the other rings. For now we assume the */ /* first ring is outer and all others are inner, but eventually */ /* we need to fix this to handle multiple island polygons and */ /* unordered sets of rings. */ /* */ /* -------------------------------------------------------------------- */ /* Use point in the middle of segment to avoid testing * common points of rings. */ dfTestX = ( psObject->padfX[psObject->panPartStart[iOpRing]] + psObject->padfX[psObject->panPartStart[iOpRing] + 1] ) / 2; dfTestY = ( psObject->padfY[psObject->panPartStart[iOpRing]] + psObject->padfY[psObject->panPartStart[iOpRing] + 1] ) / 2; bInner = FALSE; for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) { int iEdge; if( iCheckRing == iOpRing ) continue; nVertStart = psObject->panPartStart[iCheckRing]; if( iCheckRing == psObject->nParts-1 ) nVertCount = psObject->nVertices - psObject->panPartStart[iCheckRing]; else nVertCount = psObject->panPartStart[iCheckRing+1] - psObject->panPartStart[iCheckRing]; for( iEdge = 0; iEdge < nVertCount; iEdge++ ) { int iNext; if( iEdge < nVertCount-1 ) iNext = iEdge+1; else iNext = 0; /* Rule #1: * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) * The rule #1 also excludes edges collinear with the ray. */ if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY && dfTestY <= psObject->padfY[iNext+nVertStart] ) || ( psObject->padfY[iNext+nVertStart] < dfTestY && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) { /* Rule #2: * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) */ double const intersect = ( psObject->padfX[iEdge+nVertStart] + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); if (intersect < dfTestX) { bInner = !bInner; } } } } /* for iCheckRing */ /* -------------------------------------------------------------------- */ /* Determine the current order of this ring so we will know if */ /* it has to be reversed. */ /* -------------------------------------------------------------------- */ nVertStart = psObject->panPartStart[iOpRing]; if( iOpRing == psObject->nParts-1 ) nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; else nVertCount = psObject->panPartStart[iOpRing+1] - psObject->panPartStart[iOpRing]; dfSum = 0.0; for( iVert = nVertStart; iVert < nVertStart+nVertCount-1; iVert++ ) { dfSum += psObject->padfX[iVert] * psObject->padfY[iVert+1] - psObject->padfY[iVert] * psObject->padfX[iVert+1]; } dfSum += psObject->padfX[iVert] * psObject->padfY[nVertStart] - psObject->padfY[iVert] * psObject->padfX[nVertStart]; /* -------------------------------------------------------------------- */ /* Reverse if necessary. */ /* -------------------------------------------------------------------- */ if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) { int i; bAltered++; for( i = 0; i < nVertCount/2; i++ ) { double dfSaved; /* Swap X */ dfSaved = psObject->padfX[nVertStart+i]; psObject->padfX[nVertStart+i] = psObject->padfX[nVertStart+nVertCount-i-1]; psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; /* Swap Y */ dfSaved = psObject->padfY[nVertStart+i]; psObject->padfY[nVertStart+i] = psObject->padfY[nVertStart+nVertCount-i-1]; psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; /* Swap Z */ if( psObject->padfZ ) { dfSaved = psObject->padfZ[nVertStart+i]; psObject->padfZ[nVertStart+i] = psObject->padfZ[nVertStart+nVertCount-i-1]; psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; } /* Swap M */ if( psObject->padfM ) { dfSaved = psObject->padfM[nVertStart+i]; psObject->padfM[nVertStart+i] = psObject->padfM[nVertStart+nVertCount-i-1]; psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; } } } } return bAltered; } navit-0.5.0~svn5643+dfsg.1/navit/support/shapefile/shptree.c000066400000000000000000001157151221777731700236250ustar00rootroot00000000000000/****************************************************************************** * $Id: shptree.c,v 1.12 2008/11/12 15:39:50 fwarmerdam Exp $ * * Project: Shapelib * Purpose: Implementation of quadtree building and searching functions. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shptree.c,v $ * Revision 1.12 2008/11/12 15:39:50 fwarmerdam * improve safety in face of buggy .shp file. * * Revision 1.11 2007/10/27 03:31:14 fwarmerdam * limit default depth of tree to 12 levels (gdal ticket #1594) * * Revision 1.10 2005/01/03 22:30:13 fwarmerdam * added support for saved quadtrees * * Revision 1.9 2003/01/28 15:53:41 warmerda * Avoid build warnings. * * Revision 1.8 2002/05/07 13:07:45 warmerda * use qsort() - patch from Bernhard Herzog * * Revision 1.7 2002/01/15 14:36:07 warmerda * updated email address * * Revision 1.6 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.5 1999/11/05 14:12:05 warmerda * updated license terms * * Revision 1.4 1999/06/02 18:24:21 warmerda * added trimming code * * Revision 1.3 1999/06/02 17:56:12 warmerda * added quad'' subnode support for trees * * Revision 1.2 1999/05/18 19:11:11 warmerda * Added example searching capability * * Revision 1.1 1999/05/18 17:49:20 warmerda * New * */ #include "shapefil.h" #include #include #include #include #ifdef USE_CPL #include #endif #if 0 SHP_CVSID("$Id: shptree.c,v 1.12 2008/11/12 15:39:50 fwarmerdam Exp $") #endif #ifndef TRUE # define TRUE 1 # define FALSE 0 #endif static int bBigEndian = 0; void SHPAPI_CALL SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, double *padfBoundsMin1, double * padfBoundsMax1, double *padfBoundsMin2, double * padfBoundsMax2 ); void SHPAPI_CALL SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount, int * pnMaxShapes, int ** ppanShapeList ); /* -------------------------------------------------------------------- */ /* If the following is 0.5, nodes will be split in half. If it */ /* is 0.6 then each subnode will contain 60% of the parent */ /* node, with 20% representing overlap. This can be help to */ /* prevent small objects on a boundary from shifting too high */ /* up the tree. */ /* -------------------------------------------------------------------- */ #define SHP_SPLIT_RATIO 0.55 /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* SHPTreeNodeInit() */ /* */ /* Initialize a tree node. */ /************************************************************************/ static SHPTreeNode *SHPTreeNodeCreate( double * padfBoundsMin, double * padfBoundsMax ) { SHPTreeNode *psTreeNode; psTreeNode = (SHPTreeNode *) malloc(sizeof(SHPTreeNode)); if( NULL == psTreeNode ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif return NULL; } psTreeNode->nShapeCount = 0; psTreeNode->panShapeIds = NULL; psTreeNode->papsShapeObj = NULL; psTreeNode->nSubNodes = 0; if( padfBoundsMin != NULL ) memcpy( psTreeNode->adfBoundsMin, padfBoundsMin, sizeof(double) * 4 ); if( padfBoundsMax != NULL ) memcpy( psTreeNode->adfBoundsMax, padfBoundsMax, sizeof(double) * 4 ); return psTreeNode; } /************************************************************************/ /* SHPCreateTree() */ /************************************************************************/ SHPTree SHPAPI_CALL1(*) SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, double *padfBoundsMin, double *padfBoundsMax ) { SHPTree *psTree; if( padfBoundsMin == NULL && hSHP == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Allocate the tree object */ /* -------------------------------------------------------------------- */ psTree = (SHPTree *) malloc(sizeof(SHPTree)); if( NULL == psTree ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif return NULL; } psTree->hSHP = hSHP; psTree->nMaxDepth = nMaxDepth; psTree->nDimension = nDimension; psTree->nTotalCount = 0; /* -------------------------------------------------------------------- */ /* If no max depth was defined, try to select a reasonable one */ /* that implies approximately 8 shapes per node. */ /* -------------------------------------------------------------------- */ if( psTree->nMaxDepth == 0 && hSHP != NULL ) { int nMaxNodeCount = 1; int nShapeCount; SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); while( nMaxNodeCount*4 < nShapeCount ) { psTree->nMaxDepth += 1; nMaxNodeCount = nMaxNodeCount * 2; } #ifdef USE_CPL CPLDebug( "Shape", "Estimated spatial index tree depth: %d", psTree->nMaxDepth ); #endif /* NOTE: Due to problems with memory allocation for deep trees, * automatically estimated depth is limited up to 12 levels. * See Ticket #1594 for detailed discussion. */ if( psTree->nMaxDepth > MAX_DEFAULT_TREE_DEPTH ) { psTree->nMaxDepth = MAX_DEFAULT_TREE_DEPTH; #ifdef USE_CPL CPLDebug( "Shape", "Falling back to max number of allowed index tree levels (%d).", MAX_DEFAULT_TREE_DEPTH ); #endif } } /* -------------------------------------------------------------------- */ /* Allocate the root node. */ /* -------------------------------------------------------------------- */ psTree->psRoot = SHPTreeNodeCreate( padfBoundsMin, padfBoundsMax ); if( NULL == psTree->psRoot ) { return NULL; } /* -------------------------------------------------------------------- */ /* Assign the bounds to the root node. If none are passed in, */ /* use the bounds of the provided file otherwise the create */ /* function will have already set the bounds. */ /* -------------------------------------------------------------------- */ assert( NULL != psTree ); assert( NULL != psTree->psRoot ); if( padfBoundsMin == NULL ) { SHPGetInfo( hSHP, NULL, NULL, psTree->psRoot->adfBoundsMin, psTree->psRoot->adfBoundsMax ); } /* -------------------------------------------------------------------- */ /* If we have a file, insert all it's shapes into the tree. */ /* -------------------------------------------------------------------- */ if( hSHP != NULL ) { int iShape, nShapeCount; SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); for( iShape = 0; iShape < nShapeCount; iShape++ ) { SHPObject *psShape; psShape = SHPReadObject( hSHP, iShape ); if( psShape != NULL ) { SHPTreeAddShapeId( psTree, psShape ); SHPDestroyObject( psShape ); } } } return psTree; } /************************************************************************/ /* SHPDestroyTreeNode() */ /************************************************************************/ static void SHPDestroyTreeNode( SHPTreeNode * psTreeNode ) { int i; assert( NULL != psTreeNode ); for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( psTreeNode->apsSubNode[i] != NULL ) SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); } if( psTreeNode->panShapeIds != NULL ) free( psTreeNode->panShapeIds ); if( psTreeNode->papsShapeObj != NULL ) { for( i = 0; i < psTreeNode->nShapeCount; i++ ) { if( psTreeNode->papsShapeObj[i] != NULL ) SHPDestroyObject( psTreeNode->papsShapeObj[i] ); } free( psTreeNode->papsShapeObj ); } free( psTreeNode ); } /************************************************************************/ /* SHPDestroyTree() */ /************************************************************************/ void SHPAPI_CALL SHPDestroyTree( SHPTree * psTree ) { SHPDestroyTreeNode( psTree->psRoot ); free( psTree ); } /************************************************************************/ /* SHPCheckBoundsOverlap() */ /* */ /* Do the given boxes overlap at all? */ /************************************************************************/ int SHPAPI_CALL SHPCheckBoundsOverlap( double * padfBox1Min, double * padfBox1Max, double * padfBox2Min, double * padfBox2Max, int nDimension ) { int iDim; for( iDim = 0; iDim < nDimension; iDim++ ) { if( padfBox2Max[iDim] < padfBox1Min[iDim] ) return FALSE; if( padfBox1Max[iDim] < padfBox2Min[iDim] ) return FALSE; } return TRUE; } /************************************************************************/ /* SHPCheckObjectContained() */ /* */ /* Does the given shape fit within the indicated extents? */ /************************************************************************/ static int SHPCheckObjectContained( SHPObject * psObject, int nDimension, double * padfBoundsMin, double * padfBoundsMax ) { if( psObject->dfXMin < padfBoundsMin[0] || psObject->dfXMax > padfBoundsMax[0] ) return FALSE; if( psObject->dfYMin < padfBoundsMin[1] || psObject->dfYMax > padfBoundsMax[1] ) return FALSE; if( nDimension == 2 ) return TRUE; if( psObject->dfZMin < padfBoundsMin[2] || psObject->dfZMax < padfBoundsMax[2] ) return FALSE; if( nDimension == 3 ) return TRUE; if( psObject->dfMMin < padfBoundsMin[3] || psObject->dfMMax < padfBoundsMax[3] ) return FALSE; return TRUE; } /************************************************************************/ /* SHPTreeSplitBounds() */ /* */ /* Split a region into two subregion evenly, cutting along the */ /* longest dimension. */ /************************************************************************/ void SHPAPI_CALL SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, double *padfBoundsMin1, double * padfBoundsMax1, double *padfBoundsMin2, double * padfBoundsMax2 ) { /* -------------------------------------------------------------------- */ /* The output bounds will be very similar to the input bounds, */ /* so just copy over to start. */ /* -------------------------------------------------------------------- */ memcpy( padfBoundsMin1, padfBoundsMinIn, sizeof(double) * 4 ); memcpy( padfBoundsMax1, padfBoundsMaxIn, sizeof(double) * 4 ); memcpy( padfBoundsMin2, padfBoundsMinIn, sizeof(double) * 4 ); memcpy( padfBoundsMax2, padfBoundsMaxIn, sizeof(double) * 4 ); /* -------------------------------------------------------------------- */ /* Split in X direction. */ /* -------------------------------------------------------------------- */ if( (padfBoundsMaxIn[0] - padfBoundsMinIn[0]) > (padfBoundsMaxIn[1] - padfBoundsMinIn[1]) ) { double dfRange = padfBoundsMaxIn[0] - padfBoundsMinIn[0]; padfBoundsMax1[0] = padfBoundsMinIn[0] + dfRange * SHP_SPLIT_RATIO; padfBoundsMin2[0] = padfBoundsMaxIn[0] - dfRange * SHP_SPLIT_RATIO; } /* -------------------------------------------------------------------- */ /* Otherwise split in Y direction. */ /* -------------------------------------------------------------------- */ else { double dfRange = padfBoundsMaxIn[1] - padfBoundsMinIn[1]; padfBoundsMax1[1] = padfBoundsMinIn[1] + dfRange * SHP_SPLIT_RATIO; padfBoundsMin2[1] = padfBoundsMaxIn[1] - dfRange * SHP_SPLIT_RATIO; } } /************************************************************************/ /* SHPTreeNodeAddShapeId() */ /************************************************************************/ static int SHPTreeNodeAddShapeId( SHPTreeNode * psTreeNode, SHPObject * psObject, int nMaxDepth, int nDimension ) { int i; /* -------------------------------------------------------------------- */ /* If there are subnodes, then consider wiether this object */ /* will fit in them. */ /* -------------------------------------------------------------------- */ if( nMaxDepth > 1 && psTreeNode->nSubNodes > 0 ) { for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( SHPCheckObjectContained(psObject, nDimension, psTreeNode->apsSubNode[i]->adfBoundsMin, psTreeNode->apsSubNode[i]->adfBoundsMax)) { return SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[i], psObject, nMaxDepth-1, nDimension ); } } } /* -------------------------------------------------------------------- */ /* Otherwise, consider creating four subnodes if could fit into */ /* them, and adding to the appropriate subnode. */ /* -------------------------------------------------------------------- */ #if MAX_SUBNODE == 4 else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) { double adfBoundsMinH1[4], adfBoundsMaxH1[4]; double adfBoundsMinH2[4], adfBoundsMaxH2[4]; double adfBoundsMin1[4], adfBoundsMax1[4]; double adfBoundsMin2[4], adfBoundsMax2[4]; double adfBoundsMin3[4], adfBoundsMax3[4]; double adfBoundsMin4[4], adfBoundsMax4[4]; SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, adfBoundsMinH1, adfBoundsMaxH1, adfBoundsMinH2, adfBoundsMaxH2 ); SHPTreeSplitBounds( adfBoundsMinH1, adfBoundsMaxH1, adfBoundsMin1, adfBoundsMax1, adfBoundsMin2, adfBoundsMax2 ); SHPTreeSplitBounds( adfBoundsMinH2, adfBoundsMaxH2, adfBoundsMin3, adfBoundsMax3, adfBoundsMin4, adfBoundsMax4 ); if( SHPCheckObjectContained(psObject, nDimension, adfBoundsMin1, adfBoundsMax1) || SHPCheckObjectContained(psObject, nDimension, adfBoundsMin2, adfBoundsMax2) || SHPCheckObjectContained(psObject, nDimension, adfBoundsMin3, adfBoundsMax3) || SHPCheckObjectContained(psObject, nDimension, adfBoundsMin4, adfBoundsMax4) ) { psTreeNode->nSubNodes = 4; psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, adfBoundsMax1 ); psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, adfBoundsMax2 ); psTreeNode->apsSubNode[2] = SHPTreeNodeCreate( adfBoundsMin3, adfBoundsMax3 ); psTreeNode->apsSubNode[3] = SHPTreeNodeCreate( adfBoundsMin4, adfBoundsMax4 ); /* recurse back on this node now that it has subnodes */ return( SHPTreeNodeAddShapeId( psTreeNode, psObject, nMaxDepth, nDimension ) ); } } #endif /* MAX_SUBNODE == 4 */ /* -------------------------------------------------------------------- */ /* Otherwise, consider creating two subnodes if could fit into */ /* them, and adding to the appropriate subnode. */ /* -------------------------------------------------------------------- */ #if MAX_SUBNODE == 2 else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) { double adfBoundsMin1[4], adfBoundsMax1[4]; double adfBoundsMin2[4], adfBoundsMax2[4]; SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, adfBoundsMin1, adfBoundsMax1, adfBoundsMin2, adfBoundsMax2 ); if( SHPCheckObjectContained(psObject, nDimension, adfBoundsMin1, adfBoundsMax1)) { psTreeNode->nSubNodes = 2; psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, adfBoundsMax1 ); psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, adfBoundsMax2 ); return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[0], psObject, nMaxDepth - 1, nDimension ) ); } else if( SHPCheckObjectContained(psObject, nDimension, adfBoundsMin2, adfBoundsMax2) ) { psTreeNode->nSubNodes = 2; psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, adfBoundsMax1 ); psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, adfBoundsMax2 ); return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[1], psObject, nMaxDepth - 1, nDimension ) ); } } #endif /* MAX_SUBNODE == 2 */ /* -------------------------------------------------------------------- */ /* If none of that worked, just add it to this nodes list. */ /* -------------------------------------------------------------------- */ psTreeNode->nShapeCount++; psTreeNode->panShapeIds = (int *) SfRealloc( psTreeNode->panShapeIds, sizeof(int) * psTreeNode->nShapeCount ); psTreeNode->panShapeIds[psTreeNode->nShapeCount-1] = psObject->nShapeId; if( psTreeNode->papsShapeObj != NULL ) { psTreeNode->papsShapeObj = (SHPObject **) SfRealloc( psTreeNode->papsShapeObj, sizeof(void *) * psTreeNode->nShapeCount ); psTreeNode->papsShapeObj[psTreeNode->nShapeCount-1] = NULL; } return TRUE; } /************************************************************************/ /* SHPTreeAddShapeId() */ /* */ /* Add a shape to the tree, but don't keep a pointer to the */ /* object data, just keep the shapeid. */ /************************************************************************/ int SHPAPI_CALL SHPTreeAddShapeId( SHPTree * psTree, SHPObject * psObject ) { psTree->nTotalCount++; return( SHPTreeNodeAddShapeId( psTree->psRoot, psObject, psTree->nMaxDepth, psTree->nDimension ) ); } /************************************************************************/ /* SHPTreeCollectShapesIds() */ /* */ /* Work function implementing SHPTreeFindLikelyShapes() on a */ /* tree node by tree node basis. */ /************************************************************************/ void SHPAPI_CALL SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount, int * pnMaxShapes, int ** ppanShapeList ) { int i; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if( !SHPCheckBoundsOverlap( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, padfBoundsMin, padfBoundsMax, hTree->nDimension ) ) return; /* -------------------------------------------------------------------- */ /* Grow the list to hold the shapes on this node. */ /* -------------------------------------------------------------------- */ if( *pnShapeCount + psTreeNode->nShapeCount > *pnMaxShapes ) { *pnMaxShapes = (*pnShapeCount + psTreeNode->nShapeCount) * 2 + 20; *ppanShapeList = (int *) SfRealloc(*ppanShapeList,sizeof(int) * *pnMaxShapes); } /* -------------------------------------------------------------------- */ /* Add the local nodes shapeids to the list. */ /* -------------------------------------------------------------------- */ for( i = 0; i < psTreeNode->nShapeCount; i++ ) { (*ppanShapeList)[(*pnShapeCount)++] = psTreeNode->panShapeIds[i]; } /* -------------------------------------------------------------------- */ /* Recurse to subnodes if they exist. */ /* -------------------------------------------------------------------- */ for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( psTreeNode->apsSubNode[i] != NULL ) SHPTreeCollectShapeIds( hTree, psTreeNode->apsSubNode[i], padfBoundsMin, padfBoundsMax, pnShapeCount, pnMaxShapes, ppanShapeList ); } } /************************************************************************/ /* SHPTreeFindLikelyShapes() */ /* */ /* Find all shapes within tree nodes for which the tree node */ /* bounding box overlaps the search box. The return value is */ /* an array of shapeids terminated by a -1. The shapeids will */ /* be in order, as hopefully this will result in faster (more */ /* sequential) reading from the file. */ /************************************************************************/ /* helper for qsort */ static int compare_ints( const void * a, const void * b) { return (*(int*)a) - (*(int*)b); } int SHPAPI_CALL1(*) SHPTreeFindLikelyShapes( SHPTree * hTree, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount ) { int *panShapeList=NULL, nMaxShapes = 0; /* -------------------------------------------------------------------- */ /* Perform the search by recursive descent. */ /* -------------------------------------------------------------------- */ *pnShapeCount = 0; SHPTreeCollectShapeIds( hTree, hTree->psRoot, padfBoundsMin, padfBoundsMax, pnShapeCount, &nMaxShapes, &panShapeList ); /* -------------------------------------------------------------------- */ /* Sort the id array */ /* -------------------------------------------------------------------- */ qsort(panShapeList, *pnShapeCount, sizeof(int), compare_ints); return panShapeList; } /************************************************************************/ /* SHPTreeNodeTrim() */ /* */ /* This is the recurve version of SHPTreeTrimExtraNodes() that */ /* walks the tree cleaning it up. */ /************************************************************************/ static int SHPTreeNodeTrim( SHPTreeNode * psTreeNode ) { int i; /* -------------------------------------------------------------------- */ /* Trim subtrees, and free subnodes that come back empty. */ /* -------------------------------------------------------------------- */ for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( SHPTreeNodeTrim( psTreeNode->apsSubNode[i] ) ) { SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); psTreeNode->apsSubNode[i] = psTreeNode->apsSubNode[psTreeNode->nSubNodes-1]; psTreeNode->nSubNodes--; i--; /* process the new occupant of this subnode entry */ } } /* -------------------------------------------------------------------- */ /* We should be trimmed if we have no subnodes, and no shapes. */ /* -------------------------------------------------------------------- */ return( psTreeNode->nSubNodes == 0 && psTreeNode->nShapeCount == 0 ); } /************************************************************************/ /* SHPTreeTrimExtraNodes() */ /* */ /* Trim empty nodes from the tree. Note that we never trim an */ /* empty root node. */ /************************************************************************/ void SHPAPI_CALL SHPTreeTrimExtraNodes( SHPTree * hTree ) { SHPTreeNodeTrim( hTree->psRoot ); } /************************************************************************/ /* SwapWord() */ /* */ /* Swap a 2, 4 or 8 byte word. */ /************************************************************************/ static void SwapWord( int length, void * wordP ) { int i; unsigned char temp; for( i=0; i < length/2; i++ ) { temp = ((unsigned char *) wordP)[i]; ((unsigned char *)wordP)[i] = ((unsigned char *) wordP)[length-i-1]; ((unsigned char *) wordP)[length-i-1] = temp; } } /************************************************************************/ /* SHPSearchDiskTreeNode() */ /************************************************************************/ static int SHPSearchDiskTreeNode( FILE *fp, double *padfBoundsMin, double *padfBoundsMax, int **ppanResultBuffer, int *pnBufferMax, int *pnResultCount, int bNeedSwap ) { int i; int offset; int numshapes, numsubnodes; double adfNodeBoundsMin[2], adfNodeBoundsMax[2]; /* -------------------------------------------------------------------- */ /* Read and unswap first part of node info. */ /* -------------------------------------------------------------------- */ fread( &offset, 4, 1, fp ); if ( bNeedSwap ) SwapWord ( 4, &offset ); fread( adfNodeBoundsMin, sizeof(double), 2, fp ); fread( adfNodeBoundsMax, sizeof(double), 2, fp ); if ( bNeedSwap ) { SwapWord( 8, adfNodeBoundsMin + 0 ); SwapWord( 8, adfNodeBoundsMin + 1 ); SwapWord( 8, adfNodeBoundsMax + 0 ); SwapWord( 8, adfNodeBoundsMax + 1 ); } fread( &numshapes, 4, 1, fp ); if ( bNeedSwap ) SwapWord ( 4, &numshapes ); /* -------------------------------------------------------------------- */ /* If we don't overlap this node at all, we can just fseek() */ /* pass this node info and all subnodes. */ /* -------------------------------------------------------------------- */ if( !SHPCheckBoundsOverlap( adfNodeBoundsMin, adfNodeBoundsMax, padfBoundsMin, padfBoundsMax, 2 ) ) { offset += numshapes*sizeof(int) + sizeof(int); fseek(fp, offset, SEEK_CUR); return TRUE; } /* -------------------------------------------------------------------- */ /* Add all the shapeids at this node to our list. */ /* -------------------------------------------------------------------- */ if(numshapes > 0) { if( *pnResultCount + numshapes > *pnBufferMax ) { *pnBufferMax = (int) ((*pnResultCount + numshapes + 100) * 1.25); *ppanResultBuffer = (int *) SfRealloc( *ppanResultBuffer, *pnBufferMax * sizeof(int) ); } fread( *ppanResultBuffer + *pnResultCount, sizeof(int), numshapes, fp ); if (bNeedSwap ) { for( i=0; inSubNodes; i++ ) { if(node->apsSubNode[i]) { offset += 4*sizeof(double) + (node->apsSubNode[i]->nShapeCount+3)*sizeof(int); offset += SHPGetSubNodeOffset(node->apsSubNode[i]); } } return(offset); } /************************************************************************/ /* SHPWriteTreeNode() */ /************************************************************************/ static void SHPWriteTreeNode( FILE *fp, SHPTreeNode *node) { int i,j; int offset; unsigned char *pabyRec = NULL; assert( NULL != node ); offset = SHPGetSubNodeOffset(node); pabyRec = (unsigned char *) malloc(sizeof(double) * 4 + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); if( NULL == pabyRec ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif assert( 0 ); } assert( NULL != pabyRec ); memcpy( pabyRec, &offset, 4); /* minx, miny, maxx, maxy */ memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); memcpy( pabyRec+36, &node->nShapeCount, 4); j = node->nShapeCount * sizeof(int); memcpy( pabyRec+40, node->panShapeIds, j); memcpy( pabyRec+j+40, &node->nSubNodes, 4); fwrite( pabyRec, 44+j, 1, fp ); free (pabyRec); for(i=0; inSubNodes; i++ ) { if(node->apsSubNode[i]) SHPWriteTreeNode( fp, node->apsSubNode[i]); } } /************************************************************************/ /* SHPWriteTree() */ /************************************************************************/ int SHPWriteTree(SHPTree *tree, const char *filename ) { char signature[4] = "SQT"; int i; char abyBuf[32]; FILE *fp; /* -------------------------------------------------------------------- */ /* Open the output file. */ /* -------------------------------------------------------------------- */ fp = fopen(filename, "wb"); if( fp == NULL ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((unsigned char *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Write the header. */ /* -------------------------------------------------------------------- */ memcpy( abyBuf+0, signature, 3 ); if( bBigEndian ) abyBuf[3] = 2; /* New MSB */ else abyBuf[3] = 1; /* New LSB */ abyBuf[4] = 1; /* version */ abyBuf[5] = 0; /* next 3 reserved */ abyBuf[6] = 0; abyBuf[7] = 0; fwrite( abyBuf, 8, 1, fp ); fwrite( &(tree->nTotalCount), 4, 1, fp ); /* write maxdepth */ fwrite( &(tree->nMaxDepth), 4, 1, fp ); /* -------------------------------------------------------------------- */ /* Write all the nodes "in order". */ /* -------------------------------------------------------------------- */ SHPWriteTreeNode( fp, tree->psRoot ); fclose( fp ); return TRUE; } navit-0.5.0~svn5643+dfsg.1/navit/track.c000066400000000000000000000743441221777731700176050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "item.h" #include "attr.h" #include "track.h" #include "xmlconfig.h" #include "debug.h" #include "transform.h" #include "coord.h" #include "route.h" #include "projection.h" #include "map.h" #include "mapset.h" #include "plugin.h" #include "vehicleprofile.h" #include "vehicle.h" #include "roadprofile.h" #include "util.h" #include "config.h" #include "callback.h" struct object_func tracking_func; struct tracking_line { struct street_data *street; struct tracking_line *next; int angle[0]; }; /** * @brief Conatins a list of previous speeds * * This structure is used to hold a list of previously reported * speeds. This data is used by the CDF. */ struct cdf_speed { struct cdf_speed *next; int speed; time_t time; }; /** * @brief Contains data for the CDF * * This structure holds all data needed by the * cumulative displacement filter. */ struct cdf_data { int extrapolating; int available; int first_pos; int poscount; int hist_size; struct cdf_speed *speed_hist; struct pcoord *pos_hist; int *dir_hist; double last_dist; struct pcoord last_out; int last_dir; }; struct tracking { NAVIT_OBJECT struct callback_list *callback_list; struct mapset *ms; struct route *rt; struct map *map; struct vehicle *vehicle; struct vehicleprofile *vehicleprofile; struct coord last_updated; struct tracking_line *lines; struct tracking_line *curr_line; int pos; struct coord curr[2], curr_in, curr_out; int curr_angle; struct coord last[2], last_in, last_out; struct cdf_data cdf; struct attr *attr; int valid; int time; double direction, direction_matched; double speed; int coord_geo_valid; struct coord_geo coord_geo; enum projection pro; int street_direction; int no_gps; int tunnel; int angle_pref; int connected_pref; int nostop_pref; int offroad_limit_pref; int route_pref; int overspeed_pref; int overspeed_percent_pref; int tunnel_extrapolation; }; static void tracking_init_cdf(struct cdf_data *cdf, int hist_size) { cdf->extrapolating = 0; cdf->available = 0; cdf->poscount = 0; cdf->last_dist = 0; cdf->hist_size = hist_size; cdf->pos_hist = g_new0(struct pcoord, hist_size); cdf->dir_hist = g_new0(int, hist_size); } // Variables for finetuning the CDF // Minimum average speed #define CDF_MINAVG 1.f // Maximum average speed #define CDF_MAXAVG 6.f // only ~ 20 km/h // We need a low value here because otherwise we would extrapolate whenever we are not accelerating // Mininum distance (square of it..), below which we ignore gps updates #define CDF_MINDIST 49 // 7 meters, I guess this value has to be changed for pedestrians. #if 0 static void tracking_process_cdf(struct cdf_data *cdf, struct pcoord *pin, struct pcoord *pout, int dirin, int *dirout, int cur_speed, time_t fixtime) { struct cdf_speed *speed,*sc,*sl; double speed_avg; int speed_num,i; if (cdf->hist_size == 0) { dbg(1,"No CDF.\n"); *pout = *pin; *dirout = dirin; return; } speed = g_new0(struct cdf_speed, 1); speed->speed = cur_speed; speed->time = fixtime; speed->next = cdf->speed_hist; cdf->speed_hist = speed; sc = speed; sl = NULL; speed_num = 0; speed_avg = 0; while (sc && ((fixtime - speed->time) < 4)) { // FIXME static maxtime speed_num++; speed_avg += sc->speed; sl = sc; sc = sc->next; } speed_avg /= (double)speed_num; if (sl) { sl->next = NULL; } while (sc) { sl = sc->next; g_free(sc); sc = sl; } if (speed_avg < CDF_MINAVG) { speed_avg = CDF_MINAVG; } else if (speed_avg > CDF_MAXAVG) { speed_avg = CDF_MAXAVG; } if (cur_speed >= speed_avg) { if (cdf->extrapolating) { cdf->poscount = 0; cdf->extrapolating = 0; } cdf->first_pos--; if (cdf->first_pos < 0) { cdf->first_pos = cdf->hist_size - 1; } if (cdf->poscount < cdf->hist_size) { cdf->poscount++; } cdf->pos_hist[cdf->first_pos] = *pin; cdf->dir_hist[cdf->first_pos] = dirin; *pout = *pin; *dirout = dirin; } else if (cdf->poscount > 0) { double mx,my; // Average position's x and y values double sx,sy; // Support vector double dx,dy; // Difference between average and current position double len; // Length of support vector double dist; mx = my = 0; sx = sy = 0; for (i = 0; i < cdf->poscount; i++) { mx += (double)cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].x / cdf->poscount; my += (double)cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].y / cdf->poscount; if (i != 0) { sx += cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].x - cdf->pos_hist[((cdf->first_pos + i - 1) % cdf->hist_size)].x; sy += cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].y - cdf->pos_hist[((cdf->first_pos + i - 1) % cdf->hist_size)].y; } } if (cdf->poscount > 1) { // Normalize the support vector len = sqrt(sx * sx + sy * sy); sx /= len; sy /= len; // Calculate the new direction *dirout = (int)rint(atan(sx / sy) / M_PI * 180 + 180); } else { // If we only have one position, we can't use differences of positions, but we have to use the reported // direction of that position sx = sin((double)cdf->dir_hist[cdf->first_pos] / 180 * M_PI); sy = cos((double)cdf->dir_hist[cdf->first_pos] / 180 * M_PI); *dirout = cdf->dir_hist[cdf->first_pos]; } dx = pin->x - mx; dy = pin->y - my; dist = dx * sx + dy * sy; if (cdf->extrapolating && (dist < cdf->last_dist)) { dist = cdf->last_dist; } cdf->last_dist = dist; cdf->extrapolating = 1; pout->x = (int)rint(mx + sx * dist); pout->y = (int)rint(my + sy * dist); pout->pro = pin->pro; } else { // We should extrapolate, but don't have an old position available *pout = *pin; *dirout = dirin; } if (cdf->available) { int dx,dy; dx = pout->x - cdf->last_out.x; dy = pout->y - cdf->last_out.y; if ((dx*dx + dy*dy) < CDF_MINDIST) { *pout = cdf->last_out; *dirout = cdf->last_dir; } } cdf->last_out = *pout; cdf->last_dir = *dirout; cdf->available = 1; } #endif int tracking_get_angle(struct tracking *tr) { return tr->curr_angle; } struct coord * tracking_get_pos(struct tracking *tr) { return &tr->curr_out; } int tracking_get_street_direction(struct tracking *tr) { return tr->street_direction; } int tracking_get_segment_pos(struct tracking *tr) { return tr->pos; } struct street_data * tracking_get_street_data(struct tracking *tr) { if (tr->curr_line) return tr->curr_line->street; return NULL; } int tracking_get_attr(struct tracking *_this, enum attr_type type, struct attr *attr, struct attr_iter *attr_iter) { struct item *item; struct map_rect *mr; struct tracking_line *tl; int result=0; dbg(1,"enter %s\n",attr_to_name(type)); if (_this->attr) { attr_free(_this->attr); _this->attr=NULL; } attr->type=type; switch (type) { case attr_position_valid: attr->u.num=_this->valid; return 1; case attr_position_direction: attr->u.numd=&_this->direction; return 1; case attr_position_direction_matched: attr->u.numd=&_this->direction_matched; return 1; case attr_position_speed: attr->u.numd=&_this->speed; return 1; case attr_directed: attr->u.num=_this->street_direction; return 1; case attr_position_coord_geo: if (!_this->coord_geo_valid) { struct coord c; c.x=_this->curr_out.x; c.y=_this->curr_out.y; transform_to_geo(_this->pro, &c, &_this->coord_geo); _this->coord_geo_valid=1; } attr->u.coord_geo=&_this->coord_geo; return 1; case attr_current_item: if (! _this->curr_line || ! _this->curr_line->street) return 0; attr->u.item=&_this->curr_line->street->item; return 1; case attr_street_count: attr->u.num=0; tl=_this->lines; while (tl) { attr->u.num++; tl=tl->next; } return 1; default: if (! _this->curr_line || ! _this->curr_line->street) return 0; item=&_this->curr_line->street->item; mr=map_rect_new(item->map,NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if (item_attr_get(item, type, attr)) { _this->attr=attr_dup(attr); *attr=*_this->attr; result=1; } map_rect_destroy(mr); return result; } } struct item * tracking_get_current_item(struct tracking *_this) { if (! _this->curr_line || ! _this->curr_line->street) return NULL; return &_this->curr_line->street->item; } int * tracking_get_current_flags(struct tracking *_this) { if (! _this->curr_line || ! _this->curr_line->street) return NULL; return &_this->curr_line->street->flags; } static void tracking_get_angles(struct tracking_line *tl) { int i; struct street_data *sd=tl->street; for (i = 0 ; i < sd->count-1 ; i++) tl->angle[i]=transform_get_angle_delta(&sd->c[i], &sd->c[i+1], 0); } static int street_data_within_selection(struct street_data *sd, struct map_selection *sel) { struct coord_rect r; struct map_selection *curr; int i; if (!sel) return 1; r.lu=sd->c[0]; r.rl=sd->c[0]; for (i = 1 ; i < sd->count ; i++) { if (r.lu.x > sd->c[i].x) r.lu.x=sd->c[i].x; if (r.rl.x < sd->c[i].x) r.rl.x=sd->c[i].x; if (r.rl.y > sd->c[i].y) r.rl.y=sd->c[i].y; if (r.lu.y < sd->c[i].y) r.lu.y=sd->c[i].y; } curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; if (r.lu.x <= sr->rl.x && r.rl.x >= sr->lu.x && r.lu.y >= sr->rl.y && r.rl.y <= sr->lu.y) return 1; curr=curr->next; } return 0; } static void tracking_doupdate_lines(struct tracking *tr, struct coord *pc, enum projection pro) { int max_dist=1000; struct map_selection *sel; struct mapset_handle *h; struct map *m; struct map_rect *mr; struct item *item; struct street_data *street; struct tracking_line *tl; struct coord_geo g; struct coord cc; dbg(1,"enter\n"); h=mapset_open(tr->ms); while ((m=mapset_next(h,2))) { cc.x = pc->x; cc.y = pc->y; if (map_projection(m) != pro) { transform_to_geo(pro, &cc, &g); transform_from_geo(map_projection(m), &g, &cc); } sel = route_rect(18, &cc, &cc, 0, max_dist); mr=map_rect_new(m, sel); if (!mr) continue; while ((item=map_rect_get_item(mr))) { if (item_get_default_flags(item->type)) { street=street_get_data(item); if (street_data_within_selection(street, sel)) { tl=g_malloc(sizeof(struct tracking_line)+(street->count-1)*sizeof(int)); tl->street=street; tracking_get_angles(tl); tl->next=tr->lines; tr->lines=tl; } else street_data_free(street); } } map_selection_destroy(sel); map_rect_destroy(mr); } mapset_close(h); dbg(1, "exit\n"); } void tracking_flush(struct tracking *tr) { struct tracking_line *tl=tr->lines,*next; dbg(1,"enter(tr=%p)\n", tr); while (tl) { next=tl->next; street_data_free(tl->street); g_free(tl); tl=next; } tr->lines=NULL; tr->curr_line = NULL; } static int tracking_angle_diff(int a1, int a2, int full) { int ret=(a1-a2)%full; if (ret > full/2) ret-=full; if (ret < -full/2) ret+=full; return ret; } static int tracking_angle_abs_diff(int a1, int a2, int full) { int ret=tracking_angle_diff(a1, a2, full); if (ret < 0) ret=-ret; return ret; } static int tracking_angle_delta(struct tracking *tr, int vehicle_angle, int street_angle, int flags) { int full=180,ret=360,fwd=0,rev=0; struct vehicleprofile *profile=tr->vehicleprofile; if (profile) { fwd=((flags & profile->flags_forward_mask) == profile->flags); rev=((flags & profile->flags_reverse_mask) == profile->flags); } if (fwd || rev) { if (!fwd || !rev) { full=360; if (rev) street_angle=(street_angle+180)%360; } ret=tracking_angle_abs_diff(vehicle_angle, street_angle, full); } return ret*ret; } static int tracking_is_connected(struct tracking *tr, struct coord *c1, struct coord *c2) { if (c1[0].x == c2[0].x && c1[0].y == c2[0].y) return 0; if (c1[0].x == c2[1].x && c1[0].y == c2[1].y) return 0; if (c1[1].x == c2[0].x && c1[1].y == c2[0].y) return 0; if (c1[1].x == c2[1].x && c1[1].y == c2[1].y) return 0; return tr->connected_pref; } static int tracking_is_no_stop(struct tracking *tr, struct coord *c1, struct coord *c2) { if (c1->x == c2->x && c1->y == c2->y) return tr->nostop_pref; return 0; } static int tracking_is_on_route(struct tracking *tr, struct route *rt, struct item *item) { #ifdef USE_ROUTING if (! rt) return 0; if (route_contains(rt, item)) return 0; return tr->route_pref; #else return 0; #endif } static int tracking_value(struct tracking *tr, struct tracking_line *t, int offset, struct coord *lpnt, int min, int flags) { int value=0; struct street_data *sd=t->street; dbg(2, "%d: (0x%x,0x%x)-(0x%x,0x%x)\n", offset, sd->c[offset].x, sd->c[offset].y, sd->c[offset+1].x, sd->c[offset+1].y); if (flags & 1) { struct coord c1, c2, cp; c1.x = sd->c[offset].x; c1.y = sd->c[offset].y; c2.x = sd->c[offset+1].x; c2.y = sd->c[offset+1].y; cp.x = tr->curr_in.x; cp.y = tr->curr_in.y; value+=transform_distance_line_sq(&c1, &c2, &cp, lpnt); } if (value >= min) return value; if (flags & 2) value += tracking_angle_delta(tr, tr->curr_angle, t->angle[offset], sd->flags)*tr->angle_pref>>4; if (value >= min) return value; if ((flags & 4) && tr->connected_pref) value += tracking_is_connected(tr, tr->last, &sd->c[offset]); if ((flags & 8) && tr->nostop_pref) value += tracking_is_no_stop(tr, lpnt, &tr->last_out); if (value >= min) return value; if ((flags & 16) && tr->route_pref) value += tracking_is_on_route(tr, tr->rt, &sd->item); if ((flags & 32) && tr->overspeed_percent_pref && tr->overspeed_pref ) { struct roadprofile *roadprofile=g_hash_table_lookup(tr->vehicleprofile->roadprofile_hash, (void *)t->street->item.type); if (roadprofile && tr->speed > roadprofile->speed * tr->overspeed_percent_pref/ 100) value += tr->overspeed_pref; } if ((flags & 64) && !!(sd->flags & AF_UNDERGROUND) != tr->no_gps) value+=200; return value; } void tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *vehicleprofile, enum projection pro) { struct tracking_line *t; int i,value,min,time; struct coord lpnt; struct coord cin; struct attr valid,speed_attr,direction_attr,coord_geo,lag,time_attr,static_speed,static_distance; double speed, direction; if (v) tr->vehicle=v; if (vehicleprofile) tr->vehicleprofile=vehicleprofile; if (! tr->vehicle) return; if (!vehicle_get_attr(tr->vehicle, attr_position_valid, &valid, NULL)) valid.u.num=attr_position_valid_valid; if (valid.u.num == attr_position_valid_invalid) { tr->valid=valid.u.num; return; } if (!vehicle_get_attr(tr->vehicle, attr_position_speed, &speed_attr, NULL) || !vehicle_get_attr(tr->vehicle, attr_position_direction, &direction_attr, NULL) || !vehicle_get_attr(tr->vehicle, attr_position_coord_geo, &coord_geo, NULL) || !vehicle_get_attr(tr->vehicle, attr_position_time_iso8601, &time_attr, NULL)) { dbg(0,"failed to get position data %d %d %d %d\n", vehicle_get_attr(tr->vehicle, attr_position_speed, &speed_attr, NULL), vehicle_get_attr(tr->vehicle, attr_position_direction, &direction_attr, NULL), vehicle_get_attr(tr->vehicle, attr_position_coord_geo, &coord_geo, NULL), vehicle_get_attr(tr->vehicle, attr_position_time_iso8601, &time_attr, NULL)); return; } if (tr->tunnel_extrapolation) { struct attr fix_type; if (!vehicle_get_attr(tr->vehicle, attr_position_fix_type, &fix_type, NULL)) fix_type.u.num=2; if (fix_type.u.num) { tr->no_gps=0; tr->tunnel=0; } else tr->no_gps=1; } if (!vehicleprofile_get_attr(vehicleprofile,attr_static_speed,&static_speed,NULL) || !vehicleprofile_get_attr(vehicleprofile,attr_static_distance,&static_distance,NULL)) { static_speed.u.num=3; static_distance.u.num=10; dbg(1,"Using defaults for static position detection\n"); } dbg(2,"Static speed: %ld, static distance: %ld\n",static_speed.u.num, static_distance.u.num); time=iso8601_to_secs(time_attr.u.str); speed=*speed_attr.u.numd; direction=*direction_attr.u.numd; tr->valid=attr_position_valid_valid; transform_from_geo(pro, coord_geo.u.coord_geo, &tr->curr_in); if ((speed < static_speed.u.num && transform_distance(pro, &tr->last_in, &tr->curr_in) < static_distance.u.num )) { dbg(1,"static speed %f coord 0x%x,0x%x vs 0x%x,0x%x\n",speed,tr->last_in.x,tr->last_in.y, tr->curr_in.x, tr->curr_in.y); tr->valid=attr_position_valid_static; tr->speed=0; return; } if (tr->tunnel) { tr->curr_in=tr->curr_out; dbg(0,"tunnel extrapolation speed %f dir %f\n",tr->speed,tr->direction); dbg(0,"old 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); speed=tr->speed; direction=tr->curr_line->angle[tr->pos]; transform_project(pro, &tr->curr_in, tr->speed*tr->tunnel_extrapolation/36, tr->direction, &tr->curr_in); dbg(0,"new 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); } else if (vehicle_get_attr(tr->vehicle, attr_lag, &lag, NULL) && lag.u.num > 0) { double espeed; int edirection; if (time-tr->time == 1) { dbg(1,"extrapolating speed from %f and %f (%f)\n",tr->speed, speed, speed-tr->speed); espeed=speed+(speed-tr->speed)*lag.u.num/10; dbg(1,"extrapolating angle from %f and %f (%d)\n",tr->direction, direction, tracking_angle_diff(direction,tr->direction,360)); edirection=direction+tracking_angle_diff(direction,tr->direction,360)*lag.u.num/10; } else { dbg(1,"no speed and direction extrapolation\n"); espeed=speed; edirection=direction; } dbg(1,"lag %ld speed %f direction %d\n",lag.u.num,espeed,edirection); dbg(1,"old 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); transform_project(pro, &tr->curr_in, espeed*lag.u.num/36, edirection, &tr->curr_in); dbg(1,"new 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); } tr->time=time; tr->pro=pro; #if 0 tracking_process_cdf(&tr->cdf, pc, &pcf, angle, &anglef, speed, fixtime); #endif tr->curr_angle=tr->direction=direction; tr->speed=speed; tr->last_in=tr->curr_in; tr->last_out=tr->curr_out; tr->last[0]=tr->curr[0]; tr->last[1]=tr->curr[1]; if (!tr->lines || transform_distance(pro, &tr->last_updated, &tr->curr_in) > 500) { dbg(1, "update\n"); tracking_flush(tr); tracking_doupdate_lines(tr, &tr->curr_in, pro); tr->last_updated=tr->curr_in; dbg(1,"update end\n"); } tr->street_direction=0; t=tr->lines; tr->curr_line=NULL; min=INT_MAX/2; while (t) { struct street_data *sd=t->street; for (i = 0; i < sd->count-1 ; i++) { value=tracking_value(tr,t,i,&lpnt,min,-1); if (value < min) { struct coord lpnt_tmp; int angle_delta=tracking_angle_abs_diff(tr->curr_angle, t->angle[i], 360); tr->curr_line=t; tr->pos=i; tr->curr[0]=sd->c[i]; tr->curr[1]=sd->c[i+1]; tr->direction_matched=t->angle[i]; dbg(1,"lpnt.x=0x%x,lpnt.y=0x%x pos=%d %d+%d+%d+%d=%d\n", lpnt.x, lpnt.y, i, transform_distance_line_sq(&sd->c[i], &sd->c[i+1], &cin, &lpnt_tmp), tracking_angle_delta(tr, tr->curr_angle, t->angle[i], 0)*tr->angle_pref, tracking_is_connected(tr, tr->last, &sd->c[i]) ? tr->connected_pref : 0, lpnt.x == tr->last_out.x && lpnt.y == tr->last_out.y ? tr->nostop_pref : 0, value ); tr->curr_out.x=lpnt.x; tr->curr_out.y=lpnt.y; tr->coord_geo_valid=0; if (angle_delta < 70) tr->street_direction=1; else if (angle_delta > 110) tr->street_direction=-1; else tr->street_direction=0; min=value; } } t=t->next; } dbg(1,"tr->curr_line=%p min=%d\n", tr->curr_line, min); if (!tr->curr_line || min > tr->offroad_limit_pref) { tr->curr_out=tr->curr_in; tr->coord_geo_valid=0; tr->street_direction=0; } if (tr->curr_line && (tr->curr_line->street->flags & AF_UNDERGROUND)) { if (tr->no_gps) tr->tunnel=1; } else if (tr->tunnel) { tr->speed=0; } dbg(1,"found 0x%x,0x%x\n", tr->curr_out.x, tr->curr_out.y); callback_list_call_attr_0(tr->callback_list, attr_position_coord_geo); } static int tracking_set_attr_do(struct tracking *tr, struct attr *attr, int initial) { switch (attr->type) { case attr_angle_pref: tr->angle_pref=attr->u.num; return 1; case attr_connected_pref: tr->connected_pref=attr->u.num; return 1; case attr_nostop_pref: tr->nostop_pref=attr->u.num; return 1; case attr_offroad_limit_pref: tr->offroad_limit_pref=attr->u.num; return 1; case attr_route_pref: tr->route_pref=attr->u.num; return 1; case attr_overspeed_pref: tr->overspeed_pref=attr->u.num; return 1; case attr_overspeed_percent_pref: tr->overspeed_percent_pref=attr->u.num; return 1; case attr_tunnel_extrapolation: tr->tunnel_extrapolation=attr->u.num; return 1; default: return 0; } } int tracking_set_attr(struct tracking *tr, struct attr *attr) { return tracking_set_attr_do(tr, attr, 0); } int tracking_add_attr(struct tracking *this_, struct attr *attr) { switch (attr->type) { case attr_callback: callback_list_add(this_->callback_list, attr->u.callback); return 1; default: return 0; } } int tracking_remove_attr(struct tracking *this_, struct attr *attr) { switch (attr->type) { case attr_callback: callback_list_remove(this_->callback_list, attr->u.callback); return 1; default: return 0; } } struct object_func tracking_func = { attr_trackingo, (object_func_new)tracking_new, (object_func_get_attr)tracking_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)tracking_set_attr, (object_func_add_attr)tracking_add_attr, (object_func_remove_attr)tracking_remove_attr, (object_func_init)tracking_init, (object_func_destroy)tracking_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; struct tracking * tracking_new(struct attr *parent, struct attr **attrs) { struct tracking *this=g_new0(struct tracking, 1); struct attr hist_size; this->func=&tracking_func; navit_object_ref((struct navit_object *)this); this->angle_pref=10; this->connected_pref=10; this->nostop_pref=10; this->offroad_limit_pref=5000; this->route_pref=300; this->callback_list=callback_list_new(); if (! attr_generic_get_attr(attrs, NULL, attr_cdf_histsize, &hist_size, NULL)) { hist_size.u.num = 0; } if (attrs) { for (;*attrs; attrs++) tracking_set_attr_do(this, *attrs, 1); } tracking_init_cdf(&this->cdf, hist_size.u.num); return this; } void tracking_set_mapset(struct tracking *this, struct mapset *ms) { this->ms=ms; } void tracking_set_route(struct tracking *this, struct route *rt) { this->rt=rt; } void tracking_destroy(struct tracking *tr) { if (tr->attr) attr_free(tr->attr); tracking_flush(tr); callback_list_destroy(tr->callback_list); g_free(tr); } struct map * tracking_get_map(struct tracking *this_) { struct attr *attrs[5]; struct attr type,navigation,data,description; type.type=attr_type; type.u.str="tracking"; navigation.type=attr_trackingo; navigation.u.tracking=this_; data.type=attr_data; data.u.str=""; description.type=attr_description; description.u.str="Tracking"; attrs[0]=&type; attrs[1]=&navigation; attrs[2]=&data; attrs[3]=&description; attrs[4]=NULL; if (! this_->map) this_->map=map_new(NULL, attrs); return this_->map; } struct map_priv { struct tracking *tracking; }; struct map_rect_priv { struct tracking *tracking; struct item item; struct tracking_line *curr,*next; int coord; enum attr_type attr_next; int ccount; int debug_idx; char *str; }; static void tracking_map_item_coord_rewind(void *priv_data) { struct map_rect_priv *this=priv_data; this->ccount=0; } static int tracking_map_item_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *this=priv_data; enum projection pro; int ret=0; dbg(1,"enter\n"); while (this->ccount < 2 && count > 0) { pro = map_projection(this->curr->street->item.map); if (projection_mg != pro) { transform_from_to(&this->curr->street->c[this->ccount+this->coord], pro, c ,projection_mg); } else *c=this->curr->street->c[this->ccount+this->coord]; dbg(1,"coord %d 0x%x,0x%x\n",this->ccount,c->x,c->y); this->ccount++; ret++; c++; count--; } return ret; } static void tracking_map_item_attr_rewind(void *priv_data) { struct map_rect_priv *this_=priv_data; this_->debug_idx=0; this_->attr_next=attr_debug; } static int tracking_map_item_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *this_=priv_data; struct coord lpnt,*c; struct tracking *tr=this_->tracking; int value; attr->type=attr_type; if (this_->str) { g_free(this_->str); this_->str=NULL; } switch(attr_type) { case attr_debug: switch(this_->debug_idx) { case 0: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("overall: %d (limit %d)",tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, -1), tr->offroad_limit_pref); return 1; case 1: this_->debug_idx++; c=&this_->curr->street->c[this_->coord]; value=tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 1); this_->str=attr->u.str=g_strdup_printf("distance: (0x%x,0x%x) from (0x%x,0x%x)-(0x%x,0x%x) at (0x%x,0x%x) %d", tr->curr_in.x, tr->curr_in.y, c[0].x, c[0].y, c[1].x, c[1].y, lpnt.x, lpnt.y, value); return 1; case 2: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("angle: %d to %d (flags %d) %d", tr->curr_angle, this_->curr->angle[this_->coord], this_->curr->street->flags & 3, tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 2)); return 1; case 3: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("connected: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 4)); return 1; case 4: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("no_stop: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 8)); return 1; case 5: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("route: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 16)); return 1; case 6: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("overspeed: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 32)); return 1; case 7: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("tunnel: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 64)); return 1; case 8: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("line %p", this_->curr); return 1; default: this_->attr_next=attr_none; return 0; } case attr_any: while (this_->attr_next != attr_none) { if (tracking_map_item_attr_get(priv_data, this_->attr_next, attr)) return 1; } return 0; default: attr->type=attr_none; return 0; } } static struct item_methods tracking_map_item_methods = { tracking_map_item_coord_rewind, tracking_map_item_coord_get, tracking_map_item_attr_rewind, tracking_map_item_attr_get, }; static void tracking_map_destroy(struct map_priv *priv) { g_free(priv); } static void tracking_map_rect_init(struct map_rect_priv *priv) { priv->next=priv->tracking->lines; priv->curr=NULL; priv->coord=0; priv->item.id_lo=0; priv->item.id_hi=0; } static struct map_rect_priv * tracking_map_rect_new(struct map_priv *priv, struct map_selection *sel) { struct tracking *tracking=priv->tracking; struct map_rect_priv *ret=g_new0(struct map_rect_priv, 1); ret->tracking=tracking; tracking_map_rect_init(ret); ret->item.meth=&tracking_map_item_methods; ret->item.priv_data=ret; ret->item.type=type_tracking_100; return ret; } static void tracking_map_rect_destroy(struct map_rect_priv *priv) { g_free(priv); } static struct item * tracking_map_get_item(struct map_rect_priv *priv) { struct item *ret=&priv->item; int value; struct coord lpnt; if (!priv->next) return NULL; if (! priv->curr || priv->coord + 2 >= priv->curr->street->count) { priv->curr=priv->next; priv->next=priv->curr->next; priv->coord=0; priv->item.id_lo=0; priv->item.id_hi++; } else { priv->coord++; priv->item.id_lo++; } value=tracking_value(priv->tracking, priv->curr, priv->coord, &lpnt, INT_MAX/2, -1); if (value < 64) priv->item.type=type_tracking_100; else if (value < 128) priv->item.type=type_tracking_90; else if (value < 256) priv->item.type=type_tracking_80; else if (value < 512) priv->item.type=type_tracking_70; else if (value < 1024) priv->item.type=type_tracking_60; else if (value < 2048) priv->item.type=type_tracking_50; else if (value < 4096) priv->item.type=type_tracking_40; else if (value < 8192) priv->item.type=type_tracking_30; else if (value < 16384) priv->item.type=type_tracking_20; else if (value < 32768) priv->item.type=type_tracking_10; else priv->item.type=type_tracking_0; dbg(1,"item %d %d points\n", priv->coord, priv->curr->street->count); tracking_map_item_coord_rewind(priv); tracking_map_item_attr_rewind(priv); return ret; } static struct item * tracking_map_get_item_byid(struct map_rect_priv *priv, int id_hi, int id_lo) { struct item *ret; tracking_map_rect_init(priv); while ((ret=tracking_map_get_item(priv))) { if (ret->id_hi == id_hi && ret->id_lo == id_lo) return ret; } return NULL; } static struct map_methods tracking_map_meth = { projection_mg, "utf-8", tracking_map_destroy, tracking_map_rect_new, tracking_map_rect_destroy, tracking_map_get_item, tracking_map_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * tracking_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *ret; struct attr *tracking_attr; tracking_attr=attr_search(attrs, NULL, attr_trackingo); if (! tracking_attr) return NULL; ret=g_new0(struct map_priv, 1); *meth=tracking_map_meth; ret->tracking=tracking_attr->u.tracking; return ret; } void tracking_init(void) { plugin_register_map_type("tracking", tracking_map_new); } navit-0.5.0~svn5643+dfsg.1/navit/track.h000066400000000000000000000046341221777731700176050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_TRACK_H #define NAVIT_TRACK_H #include #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; enum projection; struct attr; struct attr_iter; struct coord; struct item; struct map; struct mapset; struct route; struct street_data; struct tracking; struct vehicle; struct vehicleprofile; int tracking_get_angle(struct tracking *tr); struct coord *tracking_get_pos(struct tracking *tr); int tracking_get_street_direction(struct tracking *tr); int tracking_get_segment_pos(struct tracking *tr); struct street_data *tracking_get_street_data(struct tracking *tr); int tracking_get_attr(struct tracking *_this, enum attr_type type, struct attr *attr, struct attr_iter *attr_iter); struct item *tracking_get_current_item(struct tracking *_this); int *tracking_get_current_flags(struct tracking *_this); void tracking_flush(struct tracking *tr); void tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *vehicleprofile, enum projection pro); int tracking_set_attr(struct tracking *tr, struct attr *attr); struct tracking *tracking_new(struct attr *parent, struct attr **attrs); void tracking_set_mapset(struct tracking *this_, struct mapset *ms); void tracking_set_route(struct tracking *this_, struct route *rt); void tracking_destroy(struct tracking *tr); struct map *tracking_get_map(struct tracking *this_); int tracking_add_attr(struct tracking *this_, struct attr *attr); int tracking_remove_attr(struct tracking *this_, struct attr *attr); struct tracking *tracking_ref(struct tracking *this_); void tracking_unref(struct tracking *this_); void tracking_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/transform.c000066400000000000000000001115661221777731700205120ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _USE_MATH_DEFINES 1 #include #include #include #include #include #include #include #include "config.h" #include "coord.h" #include "debug.h" #include "item.h" #include "map.h" #include "transform.h" #include "projection.h" #include "point.h" #define POST_SHIFT 8 /** * @brief The parameters needed to transform a map for display. */ struct transformation { int yaw; /* Rotation angle */ int pitch; int ddd; /* 3d mode/isometric view active? (0/1) */ int m00,m01,m02; /* 3d transformation matrix */ int m10,m11,m12; int m20,m21,m22; int xscale,yscale,wscale; int xscale3d,yscale3d,wscale3d; #ifdef ENABLE_ROLL int roll; int hog; #endif navit_float im00,im01,im02; /* inverse 3d transformation matrix */ navit_float im10,im11,im12; navit_float im20,im21,im22; struct map_selection *map_sel; struct map_selection *screen_sel; struct point screen_center; int screen_dist; int offx,offy,offz; int znear,zfar; struct coord map_center; /* Center of source rectangle */ enum projection pro; navit_float scale; /* Scale factor */ int scale_shift; int order; int order_base; }; #ifdef ENABLE_ROLL #define HOG(t) ((t).hog) #else #define HOG(t) 0 #endif static void transform_set_screen_dist(struct transformation *t, int dist) { t->screen_dist=dist; t->xscale3d=dist; t->yscale3d=dist; t->wscale3d=dist << POST_SHIFT; } static void transform_setup_matrix(struct transformation *t) { navit_float det; navit_float fac; navit_float yawc=navit_cos(-M_PI*t->yaw/180); navit_float yaws=navit_sin(-M_PI*t->yaw/180); navit_float pitchc=navit_cos(-M_PI*t->pitch/180); navit_float pitchs=navit_sin(-M_PI*t->pitch/180); #ifdef ENABLE_ROLL navit_float rollc=navit_cos(M_PI*t->roll/180); navit_float rolls=navit_sin(M_PI*t->roll/180); #else navit_float rollc=1; navit_float rolls=0; #endif int scale=t->scale; int order_dir=-1; dbg(1,"yaw=%d pitch=%d center=0x%x,0x%x\n", t->yaw, t->pitch, t->map_center.x, t->map_center.y); t->znear=1 << POST_SHIFT; t->zfar=300*t->znear; t->scale_shift=0; t->order=t->order_base; if (t->scale >= 1) { scale=t->scale; } else { scale=1.0/t->scale; order_dir=1; } while (scale > 1) { if (order_dir < 0) t->scale_shift++; t->order+=order_dir; scale >>= 1; } fac=(1 << POST_SHIFT) * (1 << t->scale_shift) / t->scale; dbg(1,"scale_shift=%d order=%d scale=%f fac=%f\n", t->scale_shift, t->order,t->scale,fac); t->m00=rollc*yawc*fac; t->m01=rollc*yaws*fac; t->m02=-rolls*fac; t->m10=(pitchs*rolls*yawc-pitchc*yaws)*(-fac); t->m11=(pitchs*rolls*yaws+pitchc*yawc)*(-fac); t->m12=pitchs*rollc*(-fac); t->m20=(pitchc*rolls*yawc+pitchs*yaws)*fac; t->m21=(pitchc*rolls*yaws-pitchs*yawc)*fac; t->m22=pitchc*rollc*fac; t->offx=t->screen_center.x; t->offy=t->screen_center.y; if (t->pitch) { t->ddd=1; t->offz=t->screen_dist; dbg(1,"near %d far %d\n",t->znear,t->zfar); t->xscale=t->xscale3d; t->yscale=t->yscale3d; t->wscale=t->wscale3d; } else { t->ddd=0; t->offz=0; t->xscale=1; t->yscale=1; t->wscale=1; } det=(navit_float)t->m00*(navit_float)t->m11*(navit_float)t->m22+ (navit_float)t->m01*(navit_float)t->m12*(navit_float)t->m20+ (navit_float)t->m02*(navit_float)t->m10*(navit_float)t->m21- (navit_float)t->m02*(navit_float)t->m11*(navit_float)t->m20- (navit_float)t->m01*(navit_float)t->m10*(navit_float)t->m22- (navit_float)t->m00*(navit_float)t->m12*(navit_float)t->m21; t->im00=(t->m11*t->m22-t->m12*t->m21)/det; t->im01=(t->m02*t->m21-t->m01*t->m22)/det; t->im02=(t->m01*t->m12-t->m02*t->m11)/det; t->im10=(t->m12*t->m20-t->m10*t->m22)/det; t->im11=(t->m00*t->m22-t->m02*t->m20)/det; t->im12=(t->m02*t->m10-t->m00*t->m12)/det; t->im20=(t->m10*t->m21-t->m11*t->m20)/det; t->im21=(t->m01*t->m20-t->m00*t->m21)/det; t->im22=(t->m00*t->m11-t->m01*t->m10)/det; } struct transformation * transform_new(struct pcoord *center, int scale, int yaw) { struct transformation *this_; this_=g_new0(struct transformation, 1); transform_set_screen_dist(this_, 100); this_->order_base=14; this_->pro=center->pro; this_->map_center.x=center->x; this_->map_center.y=center->y; this_->scale=scale/16.0; transform_set_yaw(this_, yaw); return this_; } int transform_get_hog(struct transformation *this_) { return HOG(*this_); } void transform_set_hog(struct transformation *this_, int hog) { #ifdef ENABLE_ROLL this_->hog=hog; #else dbg(0,"not supported\n"); #endif } int transform_get_attr(struct transformation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { switch (type) { #ifdef ENABLE_ROLL case attr_hog: attr->u.num=this_->hog; break; #endif default: return 0; } attr->type=type; return 1; } int transform_set_attr(struct transformation *this_, struct attr *attr) { switch (attr->type) { #ifdef ENABLE_ROLL case attr_hog: this_->hog=attr->u.num; return 1; #endif default: return 0; } } int transformation_get_order_base(struct transformation *this_) { return this_->order_base; } void transform_set_order_base(struct transformation *this_, int order_base) { this_->order_base=order_base; } struct transformation * transform_dup(struct transformation *t) { struct transformation *ret=g_new0(struct transformation, 1); *ret=*t; ret->map_sel=map_selection_dup(t->map_sel); ret->screen_sel=map_selection_dup(t->screen_sel); return ret; } static const navit_float gar2geo_units = 360.0/(1<<24); static const navit_float geo2gar_units = 1/(360.0/(1<<24)); void transform_to_geo(enum projection pro, struct coord *c, struct coord_geo *g) { int x,y,northern,zone; switch (pro) { case projection_mg: g->lng=c->x/6371000.0/M_PI*180; g->lat=navit_atan(exp(c->y/6371000.0))/M_PI*360-90; break; case projection_garmin: g->lng=c->x*gar2geo_units; g->lat=c->y*gar2geo_units; break; case projection_utm: x=c->x; y=c->y; northern=y >= 0; if (!northern) { y+=10000000; } zone=(x/1000000); x=x%1000000; transform_utm_to_geo(x, y, zone, northern, g); break; default: break; } } void transform_from_geo(enum projection pro, struct coord_geo *g, struct coord *c) { switch (pro) { case projection_mg: c->x=g->lng*6371000.0*M_PI/180; c->y=log(navit_tan(M_PI_4+g->lat*M_PI/360))*6371000.0; break; case projection_garmin: c->x=g->lng*geo2gar_units; c->y=g->lat*geo2gar_units; break; default: break; } } void transform_from_to_count(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to, int count) { struct coord_geo g; int i; for (i = 0 ; i < count ; i++) { transform_to_geo(from, cfrom, &g); transform_from_geo(to, &g, cto); cfrom++; cto++; } } void transform_from_to(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to) { struct coord_geo g; transform_to_geo(from, cfrom, &g); transform_from_geo(to, &g, cto); } void transform_geo_to_cart(struct coord_geo *geo, navit_float a, navit_float b, struct coord_geo_cart *cart) { navit_float n,ee=1-b*b/(a*a); n = a/sqrtf(1-ee*navit_sin(geo->lat)*navit_sin(geo->lat)); cart->x=n*navit_cos(geo->lat)*navit_cos(geo->lng); cart->y=n*navit_cos(geo->lat)*navit_sin(geo->lng); cart->z=n*(1-ee)*navit_sin(geo->lat); } void transform_cart_to_geo(struct coord_geo_cart *cart, navit_float a, navit_float b, struct coord_geo *geo) { navit_float lat,lati,n,ee=1-b*b/(a*a), lng = navit_tan(cart->y/cart->x); lat = navit_tan(cart->z / navit_sqrt((cart->x * cart->x) + (cart->y * cart->y))); do { lati = lat; n = a / navit_sqrt(1-ee*navit_sin(lat)*navit_sin(lat)); lat = navit_atan((cart->z + ee * n * navit_sin(lat)) / navit_sqrt(cart->x * cart->x + cart->y * cart->y)); } while (fabs(lat - lati) >= 0.000000000000001); geo->lng=lng/M_PI*180; geo->lat=lat/M_PI*180; } void transform_utm_to_geo(const double UTMEasting, const double UTMNorthing, int ZoneNumber, int NorthernHemisphere, struct coord_geo *geo) { //converts UTM coords to lat/long. Equations from USGS Bulletin 1532 //East Longitudes are positive, West longitudes are negative. //North latitudes are positive, South latitudes are negative //Lat and Long are in decimal degrees. //Written by Chuck Gantz- chuck.gantz@globalstar.com double Lat, Long; double k0 = 0.99960000000000004; double a = 6378137; double eccSquared = 0.0066943799999999998; double eccPrimeSquared; double e1 = (1-sqrt(1-eccSquared))/(1+sqrt(1-eccSquared)); double N1, T1, C1, R1, D, M; double LongOrigin; double mu, phi1Rad; double x, y; double rad2deg = 180/M_PI; x = UTMEasting - 500000.0; //remove 500,000 meter offset for longitude y = UTMNorthing; if (!NorthernHemisphere) { y -= 10000000.0;//remove 10,000,000 meter offset used for southern hemisphere } LongOrigin = (ZoneNumber - 1)*6 - 180 + 3; //+3 puts origin in middle of zone eccPrimeSquared = (eccSquared)/(1-eccSquared); M = y / k0; mu = M/(a*(1-eccSquared/4-3*eccSquared*eccSquared/64-5*eccSquared*eccSquared*eccSquared/256)); phi1Rad = mu + (3*e1/2-27*e1*e1*e1/32)*sin(2*mu) + (21*e1*e1/16-55*e1*e1*e1*e1/32)*sin(4*mu) +(151*e1*e1*e1/96)*sin(6*mu); N1 = a/sqrt(1-eccSquared*sin(phi1Rad)*sin(phi1Rad)); T1 = tan(phi1Rad)*tan(phi1Rad); C1 = eccPrimeSquared*cos(phi1Rad)*cos(phi1Rad); R1 = a*(1-eccSquared)/pow(1-eccSquared*sin(phi1Rad)*sin(phi1Rad), 1.5); D = x/(N1*k0); Lat = phi1Rad - (N1*tan(phi1Rad)/R1)*(D*D/2-(5+3*T1+10*C1-4*C1*C1-9*eccPrimeSquared)*D*D*D*D/24 +(61+90*T1+298*C1+45*T1*T1-252*eccPrimeSquared-3*C1*C1)*D*D*D*D*D*D/720); Lat = Lat * rad2deg; Long = (D-(1+2*T1+C1)*D*D*D/6+(5-2*C1+28*T1-3*C1*C1+8*eccPrimeSquared+24*T1*T1) *D*D*D*D*D/120)/cos(phi1Rad); Long = LongOrigin + Long * rad2deg; geo->lat=Lat; geo->lng=Long; } static struct coord transform_correct_projection(struct transformation *t, enum projection required_projection, struct coord c) { struct coord result; struct coord_geo g; if (required_projection == t->pro) { result=c; } else { transform_to_geo(required_projection, &c, &g); transform_from_geo(t->pro, &g, &result); } return result; } static struct coord transform_shift_by_center_and_scale(struct transformation *t, struct coord c) { struct coord result; result.x = c.x - t->map_center.x; result.y = c.y - t->map_center.y; result.x >>= t->scale_shift; result.y >>= t->scale_shift; return result; } struct coord_3d { int x; int y; int z; }; static struct coord_3d transform_rotate(struct transformation *t, struct coord c) { struct coord_3d result; result.x=c.x*t->m00+c.y*t->m01+HOG(*t)*t->m02; result.y=c.x*t->m10+c.y*t->m11+HOG(*t)*t->m12; result.z=(c.x*t->m20+c.y*t->m21+HOG(*t)*t->m22); result.z+=t->offz << POST_SHIFT; dbg(3, "result: (%d,%d,%d)\n", result.x,result.y,result.z); return result; } static struct coord_3d transform_z_clip(struct coord_3d c, struct coord_3d c_old, int zlimit) { struct coord_3d result; float clip_factor = ((float)zlimit-c.z)/(c_old.z-c.z); dbg(3,"in (%d,%d,%d) - (%d,%d,%d)\n", c.x,c.y,c.z, c_old.x,c_old.y,c_old.z); result.x=c.x+(c_old.x-c.x)*clip_factor; result.y=c.y+(c_old.y-c.y)*clip_factor; result.z=zlimit; dbg(3,"clip result: (%d,%d,%d)\n", result.x, result.y, result.z); return result; } static struct point transform_project_onto_view_plane(struct transformation *t, struct coord_3d c) { struct point result; #if 0 dbg(0,"z=%d\n",c.z); #endif result.x = (long long)c.x*t->xscale/c.z; result.y = (long long)c.y*t->yscale/c.z; return result; } static int transform_points_too_close(struct point screen_point, struct point screen_point_old, int mindist) { if (!mindist){ return 0; } // approximation of Euclidean distance return (abs(screen_point.x - screen_point_old.x) + abs(screen_point.y - screen_point_old.y)) < mindist; } struct z_clip_result{ struct coord_3d clipped_coord; int visible; int process_coord_again; int skip_coord; }; static struct z_clip_result transform_z_clip_if_necessary(struct coord_3d coord, int zlimit, struct z_clip_result clip_result_old) { int visibility_changed; struct z_clip_result clip_result={{0,0}, 0, 0, 0}; clip_result.visible=(coord.z < zlimit ? 0:1); visibility_changed=(clip_result_old.visible != -1)&&(clip_result.visible != clip_result_old.visible); if (visibility_changed) { clip_result.clipped_coord=transform_z_clip(coord, clip_result_old.clipped_coord, zlimit); } else { clip_result.clipped_coord=coord; } if (clip_result.visible && visibility_changed){ // line was clipped, but current point // is visible -> process it again clip_result.process_coord_again=1; }else if (!clip_result.visible && !visibility_changed){ clip_result.skip_coord=1; } return clip_result; } int transform(struct transformation *t, enum projection required_projection, struct coord *input, struct point *result, int count, int mindist, int width, int *width_result) { struct coord projected_coord, shifted_coord; struct coord_3d rotated_coord; struct point screen_point; int zlimit=t->znear; struct z_clip_result clip_result, clip_result_old={{0,0}, -1, 0, 0}; int i,result_idx = 0,result_idx_last=0; dbg(3,"count=%d\n", count); for (i=0; i < count; i++) { dbg(3, "input coord %d: (%d, %d)\n", i, input[i].x, input[i].y); #if 0 /* doesn't work as wanted */ if (i && input[i].x == input[0].x && input[i].y == input[0].y && result_idx && !width_result) { result[result_idx++]=result[0]; continue; } #endif projected_coord = transform_correct_projection(t, required_projection, input[i]); shifted_coord = transform_shift_by_center_and_scale(t, projected_coord); rotated_coord = transform_rotate(t, shifted_coord); if (t->ddd) { clip_result=transform_z_clip_if_necessary(rotated_coord, zlimit, clip_result_old); clip_result_old=clip_result; if(clip_result.process_coord_again){ i--; } else if (clip_result.skip_coord){ continue; } #if 0 clip_result.clipped_coord.z=2000000; #endif screen_point = transform_project_onto_view_plane(t, clip_result.clipped_coord); } else { screen_point.x = rotated_coord.x>>POST_SHIFT; screen_point.y = rotated_coord.y>>POST_SHIFT; } screen_point.x+=t->offx; screen_point.y+=t->offy; dbg(3,"result: (%d, %d)\n", screen_point.x, screen_point.y); if (i != 0 && i != count-1 && (input[i+1].x != input[0].x || input[i+1].y != input[0].y)) { if (transform_points_too_close(screen_point, result[result_idx_last], mindist)){ continue; } } result[result_idx]=screen_point; if (width_result) { if (t->ddd) { dbg(3,"width %d * %d / %d\n",width,t->wscale,clip_result.clipped_coord.z); width_result[result_idx]=width*t->wscale/clip_result.clipped_coord.z; } else width_result[result_idx]=width; } result_idx_last=result_idx; result_idx++; } return result_idx; } static void transform_apply_inverse_matrix(struct transformation *t, struct coord_geo_cart *in, struct coord_geo_cart *out) { out->x=in->x*t->im00+in->y*t->im01+in->z*t->im02; out->y=in->x*t->im10+in->y*t->im11+in->z*t->im12; out->z=in->x*t->im20+in->y*t->im21+in->z*t->im22; } static int transform_zplane_intersection(struct coord_geo_cart *p1, struct coord_geo_cart *p2, navit_float z, struct coord_geo_cart *result) { navit_float dividend=z-p1->z; navit_float divisor=p2->z-p1->z; navit_float q; if (!divisor) { if (dividend) return 0; /* no intersection */ else return 3; /* identical planes */ } q=dividend/divisor; result->x=p1->x+q*(p2->x-p1->x); result->y=p1->y+q*(p2->y-p1->y); result->z=z; if (q >= 0 && q <= 1) return 1; /* intersection within [p1,p2] */ return 2; /* intersection without [p1,p2] */ } static void transform_screen_to_3d(struct transformation *t, struct point *p, navit_float z, struct coord_geo_cart *cg) { double xc,yc; double offz=t->offz << POST_SHIFT; xc=p->x - t->offx; yc=p->y - t->offy; cg->x=xc*z/t->xscale; cg->y=yc*z/t->yscale; cg->z=z-offz; } static int transform_reverse_near_far(struct transformation *t, struct point *p, struct coord *c, int near, int far) { double xc,yc; dbg(1,"%d,%d\n",p->x,p->y); if (t->ddd) { struct coord_geo_cart nearc,farc,nears,fars,intersection; transform_screen_to_3d(t, p, near, &nearc); transform_screen_to_3d(t, p, far, &farc); transform_apply_inverse_matrix(t, &nearc, &nears); transform_apply_inverse_matrix(t, &farc, &fars); if (transform_zplane_intersection(&nears, &fars, HOG(*t), &intersection) != 1) return 0; xc=intersection.x; yc=intersection.y; } else { double xcn,ycn; xcn=p->x - t->offx; ycn=p->y - t->offy; xc=(xcn*t->im00+ycn*t->im01)*(1 << POST_SHIFT); yc=(xcn*t->im10+ycn*t->im11)*(1 << POST_SHIFT); } c->x=xc*(1 << t->scale_shift)+t->map_center.x; c->y=yc*(1 << t->scale_shift)+t->map_center.y; return 1; } int transform_reverse(struct transformation *t, struct point *p, struct coord *c) { return transform_reverse_near_far(t, p, c, t->znear, t->zfar); } double transform_pixels_to_map_distance(struct transformation *transformation, int pixels) { struct point line_in_map_center[2]; struct coord c[2]; struct point screen_center=transformation->screen_center; // Generally, the scale will not be the same across the map // (for example with Mercator projection), so calculate the // conversion in the screen center for a reasonable average value. line_in_map_center[0].x=screen_center.x-pixels/2; line_in_map_center[1].x=screen_center.x+pixels/2; line_in_map_center[0].y=screen_center.y; line_in_map_center[1].y=screen_center.y; transform_reverse(transformation, &line_in_map_center[0], &c[0]); transform_reverse(transformation, &line_in_map_center[1], &c[1]); return transform_distance(transform_get_projection(transformation), &c[0], &c[1]); } enum projection transform_get_projection(struct transformation *this_) { return this_->pro; } void transform_set_projection(struct transformation *this_, enum projection pro) { this_->pro=pro; } static int min4(int v1,int v2, int v3, int v4) { int res=v1; if (v2 < res) res=v2; if (v3 < res) res=v3; if (v4 < res) res=v4; return res; } static int max4(int v1,int v2, int v3, int v4) { int res=v1; if (v2 > res) res=v2; if (v3 > res) res=v3; if (v4 > res) res=v4; return res; } struct map_selection * transform_get_selection(struct transformation *this_, enum projection pro, int order) { struct map_selection *ret,*curri,*curro; struct coord_geo g; ret=map_selection_dup(this_->map_sel); curri=this_->map_sel; curro=ret; while (curri) { if (this_->pro != pro) { transform_to_geo(this_->pro, &curri->u.c_rect.lu, &g); transform_from_geo(pro, &g, &curro->u.c_rect.lu); dbg(1,"%f,%f", g.lat, g.lng); transform_to_geo(this_->pro, &curri->u.c_rect.rl, &g); transform_from_geo(pro, &g, &curro->u.c_rect.rl); dbg(1,": - %f,%f\n", g.lat, g.lng); } dbg(1,"transform rect for %d is %d,%d - %d,%d\n", pro, curro->u.c_rect.lu.x, curro->u.c_rect.lu.y, curro->u.c_rect.rl.x, curro->u.c_rect.rl.y); curro->order+=order; #if 0 curro->u.c_rect.lu.x-=500; curro->u.c_rect.lu.y+=500; curro->u.c_rect.rl.x+=500; curro->u.c_rect.rl.y-=500; #endif curro->range=item_range_all; curri=curri->next; curro=curro->next; } return ret; } struct coord * transform_center(struct transformation *this_) { return &this_->map_center; } struct coord * transform_get_center(struct transformation *this_) { return &this_->map_center; } void transform_set_center(struct transformation *this_, struct coord *c) { this_->map_center=*c; } void transform_set_yaw(struct transformation *t,int yaw) { t->yaw=yaw; transform_setup_matrix(t); } int transform_get_yaw(struct transformation *this_) { return this_->yaw; } void transform_set_pitch(struct transformation *this_,int pitch) { this_->pitch=pitch; transform_setup_matrix(this_); } int transform_get_pitch(struct transformation *this_) { return this_->pitch; } void transform_set_roll(struct transformation *this_,int roll) { #ifdef ENABLE_ROLL this_->roll=roll; transform_setup_matrix(this_); #else dbg(0,"not supported\n"); #endif } int transform_get_roll(struct transformation *this_) { #ifdef ENABLE_ROLL return this_->roll; #else return 0; #endif } void transform_set_distance(struct transformation *this_,int distance) { transform_set_screen_dist(this_, distance); transform_setup_matrix(this_); } int transform_get_distance(struct transformation *this_) { return this_->screen_dist; } void transform_set_scales(struct transformation *this_, int xscale, int yscale, int wscale) { this_->xscale3d=xscale; this_->yscale3d=yscale; this_->wscale3d=wscale; } void transform_set_screen_selection(struct transformation *t, struct map_selection *sel) { map_selection_destroy(t->screen_sel); t->screen_sel=map_selection_dup(sel); if (sel) { t->screen_center.x=(sel->u.p_rect.rl.x-sel->u.p_rect.lu.x)/2; t->screen_center.y=(sel->u.p_rect.rl.y-sel->u.p_rect.lu.y)/2; transform_setup_matrix(t); } } void transform_set_screen_center(struct transformation *t, struct point *p) { t->screen_center=*p; } void transform_get_size(struct transformation *t, int *width, int *height) { struct point_rect *r; if (t->screen_sel) { r=&t->screen_sel->u.p_rect; *width=r->rl.x-r->lu.x; *height=r->rl.y-r->lu.y; } } void transform_setup_source_rect(struct transformation *t) { int i; struct coord screen[4]; struct point screen_pnt[4]; struct point_rect *pr; struct map_selection *ms,*msm,*next,**msm_last; ms=t->map_sel; while (ms) { next=ms->next; g_free(ms); ms=next; } t->map_sel=NULL; msm_last=&t->map_sel; ms=t->screen_sel; while (ms) { msm=g_new0(struct map_selection, 1); *msm=*ms; pr=&ms->u.p_rect; screen_pnt[0].x=pr->lu.x; /* left upper */ screen_pnt[0].y=pr->lu.y; screen_pnt[1].x=pr->rl.x; /* right upper */ screen_pnt[1].y=pr->lu.y; screen_pnt[2].x=pr->rl.x; /* right lower */ screen_pnt[2].y=pr->rl.y; screen_pnt[3].x=pr->lu.x; /* left lower */ screen_pnt[3].y=pr->rl.y; if (t->ddd) { struct coord_geo_cart tmp,cg[8]; struct coord c; int valid=0; unsigned char edgenodes[]={ 0,1, 1,2, 2,3, 3,0, 4,5, 5,6, 6,7, 7,4, 0,4, 1,5, 2,6, 3,7}; for (i = 0 ; i < 8 ; i++) { transform_screen_to_3d(t, &screen_pnt[i%4], (i >= 4 ? t->zfar:t->znear), &tmp); transform_apply_inverse_matrix(t, &tmp, &cg[i]); } msm->u.c_rect.lu.x=0; msm->u.c_rect.lu.y=0; msm->u.c_rect.rl.x=0; msm->u.c_rect.rl.y=0; for (i = 0 ; i < 12 ; i++) { if (transform_zplane_intersection(&cg[edgenodes[i*2]], &cg[edgenodes[i*2+1]], HOG(*t), &tmp) == 1) { c.x=tmp.x*(1 << t->scale_shift)+t->map_center.x; c.y=tmp.y*(1 << t->scale_shift)+t->map_center.y; dbg(1,"intersection with edge %d at 0x%x,0x%x\n",i,c.x,c.y); if (valid) coord_rect_extend(&msm->u.c_rect, &c); else { msm->u.c_rect.lu=c; msm->u.c_rect.rl=c; valid=1; } dbg(1,"rect 0x%x,0x%x - 0x%x,0x%x\n",msm->u.c_rect.lu.x,msm->u.c_rect.lu.y,msm->u.c_rect.rl.x,msm->u.c_rect.rl.y); } } } else { for (i = 0 ; i < 4 ; i++) { transform_reverse(t, &screen_pnt[i], &screen[i]); dbg(1,"map(%d) %d,%d=0x%x,0x%x\n", i,screen_pnt[i].x, screen_pnt[i].y, screen[i].x, screen[i].y); } msm->u.c_rect.lu.x=min4(screen[0].x,screen[1].x,screen[2].x,screen[3].x); msm->u.c_rect.rl.x=max4(screen[0].x,screen[1].x,screen[2].x,screen[3].x); msm->u.c_rect.rl.y=min4(screen[0].y,screen[1].y,screen[2].y,screen[3].y); msm->u.c_rect.lu.y=max4(screen[0].y,screen[1].y,screen[2].y,screen[3].y); } dbg(1,"%dx%d\n", msm->u.c_rect.rl.x-msm->u.c_rect.lu.x, msm->u.c_rect.lu.y-msm->u.c_rect.rl.y); *msm_last=msm; msm_last=&msm->next; ms=ms->next; } } long transform_get_scale(struct transformation *t) { return (int)(t->scale*16); } void transform_set_scale(struct transformation *t, long scale) { t->scale=scale/16.0; transform_setup_matrix(t); } int transform_get_order(struct transformation *t) { dbg(1,"order %d\n", t->order); return t->order; } #define TWOPI (M_PI*2) #define GC2RAD(c) ((c) * TWOPI/(1<<24)) #define minf(a,b) ((a) < (b) ? (a) : (b)) static double transform_distance_garmin(struct coord *c1, struct coord *c2) { #ifdef USE_HALVESINE static const int earth_radius = 6371*1000; //m change accordingly // static const int earth_radius = 3960; //miles //Point 1 cords navit_float lat1 = GC2RAD(c1->y); navit_float long1 = GC2RAD(c1->x); //Point 2 cords navit_float lat2 = GC2RAD(c2->y); navit_float long2 = GC2RAD(c2->x); //Haversine Formula navit_float dlong = long2-long1; navit_float dlat = lat2-lat1; navit_float sinlat = navit_sin(dlat/2); navit_float sinlong = navit_sin(dlong/2); navit_float a=(sinlat*sinlat)+navit_cos(lat1)*navit_cos(lat2)*(sinlong*sinlong); navit_float c=2*navit_asin(minf(1,navit_sqrt(a))); #ifdef AVOID_FLOAT return round(earth_radius*c); #else return earth_radius*c; #endif #else #define GMETER 2.3887499999999999 navit_float dx,dy; dx=c1->x-c2->x; dy=c1->y-c2->y; return navit_sqrt(dx*dx+dy*dy)*GMETER; #undef GMETER #endif } double transform_scale(int y) { struct coord c; struct coord_geo g; c.x=0; c.y=y; transform_to_geo(projection_mg, &c, &g); return 1/navit_cos(g.lat/180*M_PI); } #ifdef AVOID_FLOAT static int tab_sqrt[]={14142,13379,12806,12364,12018,11741,11517,11333,11180,11051,10943,10850,10770,10701,10640,10587,10540,10499,10462,10429,10400,10373,10349,10327,10307,10289,10273,10257,10243,10231,10219,10208}; static int tab_int_step = 0x20000; static int tab_int_scale[]={10000,10002,10008,10019,10033,10052,10076,10103,10135,10171,10212,10257,10306,10359,10417,10479,10546,10617,10693,10773,10858,10947,11041,11140,11243,11352,11465,11582,11705,11833,11965,12103,12246,12394,12547,12706,12870,13039,13214,13395,13581,13773,13971,14174,14384,14600,14822,15050,15285,15526,15774,16028,16289,16557,16832,17114,17404,17700,18005,18316,18636,18964,19299,19643,19995,20355,20724,21102,21489,21885,22290,22705,23129,23563,24007,24461,24926,25401,25886,26383,26891}; int transform_int_scale(int y) { int i,size = sizeof(tab_int_scale)/sizeof(int); if (y < 0) y=-y; i=y/tab_int_step; if (i < size-1) return tab_int_scale[i]+((tab_int_scale[i+1]-tab_int_scale[i])*(y-i*tab_int_step))/tab_int_step; return tab_int_scale[size-1]; } #endif double transform_distance(enum projection pro, struct coord *c1, struct coord *c2) { if (pro == projection_mg) { #ifndef AVOID_FLOAT double dx,dy,scale=transform_scale((c1->y+c2->y)/2); dx=c1->x-c2->x; dy=c1->y-c2->y; return sqrt(dx*dx+dy*dy)/scale; #else int dx,dy,f,scale=transform_int_scale((c1->y+c2->y)/2); dx=c1->x-c2->x; dy=c1->y-c2->y; if (dx < 0) dx=-dx; if (dy < 0) dy=-dy; while (dx > 20000 || dy > 20000) { dx/=10; dy/=10; scale/=10; } if (! dy) return dx*10000/scale; if (! dx) return dy*10000/scale; if (dx > dy) { f=dx*8/dy-8; if (f >= 32) return dx*10000/scale; return dx*tab_sqrt[f]/scale; } else { f=dy*8/dx-8; if (f >= 32) return dy*10000/scale; return dy*tab_sqrt[f]/scale; } #endif } else if (pro == projection_garmin) { return transform_distance_garmin(c1, c2); } else { dbg(0,"Unknown projection: %d\n", pro); return 0; } } void transform_project(enum projection pro, struct coord *c, int distance, int angle, struct coord *res) { double scale; switch (pro) { case projection_mg: scale=transform_scale(c->y); res->x=c->x+distance*sin(angle*M_PI/180)*scale; res->y=c->y+distance*cos(angle*M_PI/180)*scale; break; default: dbg(0,"Unsupported projection: %d\n", pro); return; } } double transform_polyline_length(enum projection pro, struct coord *c, int count) { double ret=0; int i; for (i = 0 ; i < count-1 ; i++) ret+=transform_distance(pro, &c[i], &c[i+1]); return ret; } static int transform_overflow_possible_if_squared(int count, ...) { va_list ap; int i, value, result = 0; va_start (ap, count); for (i = 0; i < count; i++) { value = va_arg (ap, int); if (abs(value)>32767) { result = 1; } } va_end (ap); return result; } int transform_distance_sq(struct coord *c1, struct coord *c2) { int dx=c1->x-c2->x; int dy=c1->y-c2->y; if (transform_overflow_possible_if_squared(2, dx, dy)) return INT_MAX; else return dx*dx+dy*dy; } navit_float transform_distance_sq_float(struct coord *c1, struct coord *c2) { int dx=c1->x-c2->x; int dy=c1->y-c2->y; return (navit_float)dx*dx+dy*dy; } int transform_distance_sq_pc(struct pcoord *c1, struct pcoord *c2) { struct coord p1,p2; p1.x = c1->x; p1.y = c1->y; p2.x = c2->x; p2.y = c2->y; return transform_distance_sq(&p1, &p2); } int transform_distance_line_sq(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt) { int vx,vy,wx,wy; int c1,c2; int climit=1000000; struct coord l; vx=l1->x-l0->x; vy=l1->y-l0->y; wx=ref->x-l0->x; wy=ref->y-l0->y; if (transform_overflow_possible_if_squared(4, vx, vy, wx, wy)) { return INT_MAX; } c1=vx*wx+vy*wy; if ( c1 <= 0 ) { if (lpnt) *lpnt=*l0; return transform_distance_sq(l0, ref); } c2=vx*vx+vy*vy; if ( c2 <= c1 ) { if (lpnt) *lpnt=*l1; return transform_distance_sq(l1, ref); } while (c1 > climit || c2 > climit) { c1/=256; c2/=256; } l.x=l0->x+vx*c1/c2; l.y=l0->y+vy*c1/c2; if (lpnt) *lpnt=l; return transform_distance_sq(&l, ref); } navit_float transform_distance_line_sq_float(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt) { navit_float vx,vy,wx,wy; navit_float c1,c2; struct coord l; vx=l1->x-l0->x; vy=l1->y-l0->y; wx=ref->x-l0->x; wy=ref->y-l0->y; c1=vx*wx+vy*wy; if ( c1 <= 0 ) { if (lpnt) *lpnt=*l0; return transform_distance_sq_float(l0, ref); } c2=vx*vx+vy*vy; if ( c2 <= c1 ) { if (lpnt) *lpnt=*l1; return transform_distance_sq_float(l1, ref); } l.x=l0->x+vx*c1/c2; l.y=l0->y+vy*c1/c2; if (lpnt) *lpnt=l; return transform_distance_sq_float(&l, ref); } int transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos) { int i,dist,distn; struct coord lp; if (count < 2) return INT_MAX; if (pos) *pos=0; dist=transform_distance_line_sq(&c[0], &c[1], ref, lpnt); for (i=2 ; i < count ; i++) { distn=transform_distance_line_sq(&c[i-1], &c[i], ref, &lp); if (distn < dist) { dist=distn; if (lpnt) *lpnt=lp; if (pos) *pos=i-1; } } return dist; } int transform_douglas_peucker(struct coord *in, int count, int dist_sq, struct coord *out) { int ret=0; int i,d,dmax=0, idx=0; for (i = 1; i < count-2 ; i++) { d=transform_distance_line_sq(&in[0], &in[count-1], &in[i], NULL); if (d > dmax) { idx=i; dmax=d; } } if (dmax > dist_sq) { ret=transform_douglas_peucker(in, idx, dist_sq, out)-1; ret+=transform_douglas_peucker(in+idx, count-idx, dist_sq, out+ret); } else { if (count > 0) out[ret++]=in[0]; if (count > 1) out[ret++]=in[count-1]; } return ret; } int transform_douglas_peucker_float(struct coord *in, int count, navit_float dist_sq, struct coord *out) { int ret=0; int i,idx=0; navit_float d,dmax=0; for (i = 1; i < count-2 ; i++) { d=transform_distance_line_sq_float(&in[0], &in[count-1], &in[i], NULL); if (d > dmax) { idx=i; dmax=d; } } if (dmax > dist_sq) { ret=transform_douglas_peucker_float(in, idx, dist_sq, out)-1; ret+=transform_douglas_peucker_float(in+idx, count-idx, dist_sq, out+ret); } else { if (count > 0) out[ret++]=in[0]; if (count > 1) out[ret++]=in[count-1]; } return ret; } void transform_print_deg(double deg) { printf("%2.0f:%2.0f:%2.4f", floor(deg), fmod(deg*60,60), fmod(deg*3600,60)); } #ifdef AVOID_FLOAT static int tab_atan[]={0,262,524,787,1051,1317,1584,1853,2126,2401,2679,2962,3249,3541,3839,4142,4452,4770,5095,5430,5774,6128,6494,6873,7265,7673,8098,8541,9004,9490,10000,10538}; static int atan2_int_lookup(int val) { int len=sizeof(tab_atan)/sizeof(int); int i=len/2; int p=i-1; for (;;) { i>>=1; if (val < tab_atan[p]) p-=i; else if (val < tab_atan[p+1]) return p+(p>>1); else p+=i; } } static int atan2_int(int dx, int dy) { int mul=1,add=0,ret; if (! dx) { return dy < 0 ? 180 : 0; } if (! dy) { return dx < 0 ? -90 : 90; } if (dx < 0) { dx=-dx; mul=-1; } if (dy < 0) { dy=-dy; add=180*mul; mul*=-1; } while (dx > 20000 || dy > 20000) { dx/=10; dy/=10; } if (dx > dy) { ret=90-atan2_int_lookup(dy*10000/dx); } else { ret=atan2_int_lookup(dx*10000/dy); } return ret*mul+add; } #endif int transform_get_angle_delta(struct coord *c1, struct coord *c2, int dir) { int dx=c2->x-c1->x; int dy=c2->y-c1->y; #ifndef AVOID_FLOAT double angle; angle=atan2(dx,dy); angle*=180/M_PI; #else int angle; angle=atan2_int(dx,dy); #endif if (dir == -1) angle=angle-180; if (angle < 0) angle+=360; return angle; } int transform_within_border(struct transformation *this_, struct point *p, int border) { struct map_selection *ms=this_->screen_sel; while (ms) { struct point_rect *r=&ms->u.p_rect; if (p->x >= r->lu.x+border && p->x <= r->rl.x-border && p->y >= r->lu.y+border && p->y <= r->rl.y-border) return 1; ms=ms->next; } return 0; } int transform_within_dist_point(struct coord *ref, struct coord *c, int dist) { if (c->x-dist > ref->x) return 0; if (c->x+dist < ref->x) return 0; if (c->y-dist > ref->y) return 0; if (c->y+dist < ref->y) return 0; if ((c->x-ref->x)*(c->x-ref->x) + (c->y-ref->y)*(c->y-ref->y) <= dist*dist) return 1; return 0; } int transform_within_dist_line(struct coord *ref, struct coord *c0, struct coord *c1, int dist) { int vx,vy,wx,wy; int n1,n2; struct coord lc; if (c0->x < c1->x) { if (c0->x-dist > ref->x) return 0; if (c1->x+dist < ref->x) return 0; } else { if (c1->x-dist > ref->x) return 0; if (c0->x+dist < ref->x) return 0; } if (c0->y < c1->y) { if (c0->y-dist > ref->y) return 0; if (c1->y+dist < ref->y) return 0; } else { if (c1->y-dist > ref->y) return 0; if (c0->y+dist < ref->y) return 0; } vx=c1->x-c0->x; vy=c1->y-c0->y; wx=ref->x-c0->x; wy=ref->y-c0->y; n1=vx*wx+vy*wy; if ( n1 <= 0 ) return transform_within_dist_point(ref, c0, dist); n2=vx*vx+vy*vy; if ( n2 <= n1 ) return transform_within_dist_point(ref, c1, dist); lc.x=c0->x+vx*n1/n2; lc.y=c0->y+vy*n1/n2; return transform_within_dist_point(ref, &lc, dist); } int transform_within_dist_polyline(struct coord *ref, struct coord *c, int count, int close, int dist) { int i; for (i = 0 ; i < count-1 ; i++) { if (transform_within_dist_line(ref,c+i,c+i+1,dist)) { return 1; } } if (close) return (transform_within_dist_line(ref,c,c+count-1,dist)); return 0; } int transform_within_dist_polygon(struct coord *ref, struct coord *c, int count, int dist) { int i, j, ci = 0; for (i = 0, j = count-1; i < count; j = i++) { if ((((c[i].y <= ref->y) && ( ref->y < c[j].y )) || ((c[j].y <= ref->y) && ( ref->y < c[i].y))) && (ref->x < (c[j].x - c[i].x) * (ref->y - c[i].y) / (c[j].y - c[i].y) + c[i].x)) ci = !ci; } if (! ci) { if (dist) return transform_within_dist_polyline(ref, c, count, dist, 1); else return 0; } return 1; } int transform_within_dist_item(struct coord *ref, enum item_type type, struct coord *c, int count, int dist) { if (type < type_line) return transform_within_dist_point(ref, c, dist); if (type < type_area) return transform_within_dist_polyline(ref, c, count, 0, dist); return transform_within_dist_polygon(ref, c, count, dist); } void transform_copy(struct transformation *src, struct transformation *dst) { memcpy(dst, src, sizeof(*src)); } void transform_destroy(struct transformation *t) { map_selection_destroy(t->map_sel); map_selection_destroy(t->screen_sel); g_free(t); } /* Note: there are many mathematically equivalent ways to express these formulas. As usual, not all of them are computationally equivalent. L = latitude in radians (positive north) Lo = longitude in radians (positive east) E = easting (meters) N = northing (meters) For the sphere E = r Lo N = r ln [ tan (pi/4 + L/2) ] where r = radius of the sphere (meters) ln() is the natural logarithm For the ellipsoid E = a Lo N = a * ln ( tan (pi/4 + L/2) * ( (1 - e * sin (L)) / (1 + e * sin (L))) ** (e/2) ) e - pi L 1 - e sin(L) 2 = a ln( tan( ---- + ---) (--------------) ) 4 2 1 + e sin(L) where a = the length of the semi-major axis of the ellipsoid (meters) e = the first eccentricity of the ellipsoid */ navit-0.5.0~svn5643+dfsg.1/navit/transform.h000066400000000000000000000144471221777731700205170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_TRANSFORM_H #define NAVIT_TRANSFORM_H #ifdef __cplusplus extern "C" { #endif #include "coord.h" /* prototypes */ enum attr_type; enum item_type; enum map_datum; enum projection; struct attr; struct attr_iter; struct coord; struct coord_geo; struct coord_geo_cart; struct map_selection; struct pcoord; struct point; struct transformation; struct transformation *transform_new(struct pcoord *center, int scale, int yaw); int transform_get_hog(struct transformation *this_); void transform_set_hog(struct transformation *this_, int hog); int transform_get_attr(struct transformation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int transform_set_attr(struct transformation *this_, struct attr *attr); int transformation_get_order_base(struct transformation *this_); void transform_set_order_base(struct transformation *this_, int order_base); struct transformation *transform_dup(struct transformation *t); void transform_to_geo(enum projection pro, struct coord *c, struct coord_geo *g); void transform_from_geo(enum projection pro, struct coord_geo *g, struct coord *c); void transform_from_to_count(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to, int count); void transform_from_to(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to); void transform_geo_to_cart(struct coord_geo *geo, navit_float a, navit_float b, struct coord_geo_cart *cart); void transform_cart_to_geo(struct coord_geo_cart *cart, navit_float a, navit_float b, struct coord_geo *geo); void transform_utm_to_geo(const double UTMEasting, const double UTMNorthing, int ZoneNumber, int NorthernHemisphere, struct coord_geo *geo); void transform_datum(struct coord_geo *from, enum map_datum from_datum, struct coord_geo *to, enum map_datum to_datum); int transform(struct transformation *t, enum projection pro, struct coord *c, struct point *p, int count, int mindist, int width, int *width_return); int transform_reverse(struct transformation *t, struct point *p, struct coord *c); double transform_pixels_to_map_distance(struct transformation *transformation, int pixels); enum projection transform_get_projection(struct transformation *this_); void transform_set_projection(struct transformation *this_, enum projection pro); struct map_selection *transform_get_selection(struct transformation *this_, enum projection pro, int order); struct coord *transform_center(struct transformation *this_); struct coord *transform_get_center(struct transformation *this_); void transform_set_center(struct transformation *this_, struct coord *c); void transform_set_yaw(struct transformation *t, int yaw); int transform_get_yaw(struct transformation *this_); void transform_set_pitch(struct transformation *this_, int pitch); int transform_get_pitch(struct transformation *this_); void transform_set_roll(struct transformation *this_, int roll); int transform_get_roll(struct transformation *this_); void transform_set_distance(struct transformation *this_, int distance); int transform_get_distance(struct transformation *this_); void transform_set_scales(struct transformation *this_, int xscale, int yscale, int wscale); void transform_set_screen_selection(struct transformation *t, struct map_selection *sel); void transform_set_screen_center(struct transformation *t, struct point *p); void transform_get_size(struct transformation *t, int *width, int *height); void transform_setup(struct transformation *t, struct pcoord *c, int scale, int yaw); void transform_setup_source_rect(struct transformation *t); long transform_get_scale(struct transformation *t); void transform_set_scale(struct transformation *t, long scale); int transform_get_order(struct transformation *t); double transform_scale(int y); double transform_distance(enum projection pro, struct coord *c1, struct coord *c2); void transform_project(enum projection pro, struct coord *c, int distance, int angle, struct coord *res); double transform_polyline_length(enum projection pro, struct coord *c, int count); int transform_distance_sq(struct coord *c1, struct coord *c2); navit_float transform_distance_sq_float(struct coord *c1, struct coord *c2); int transform_distance_sq_pc(struct pcoord *c1, struct pcoord *c2); int transform_distance_line_sq(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt); navit_float transform_distance_line_sq_float(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt); int transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos); int transform_douglas_peucker(struct coord *in, int count, int dist_sq, struct coord *out); int transform_douglas_peucker_float(struct coord *in, int count, navit_float dist_sq, struct coord *out); void transform_print_deg(double deg); int transform_get_angle_delta(struct coord *c1, struct coord *c2, int dir); int transform_within_border(struct transformation *this_, struct point *p, int border); int transform_within_dist_point(struct coord *ref, struct coord *c, int dist); int transform_within_dist_line(struct coord *ref, struct coord *c0, struct coord *c1, int dist); int transform_within_dist_polyline(struct coord *ref, struct coord *c, int count, int close, int dist); int transform_within_dist_polygon(struct coord *ref, struct coord *c, int count, int dist); int transform_within_dist_item(struct coord *ref, enum item_type type, struct coord *c, int count, int dist); void transform_copy(struct transformation *src, struct transformation *dst); void transform_destroy(struct transformation *t); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/types.h000066400000000000000000000021541221777731700176400ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_TYPES_H #define NAVIT_TYPES_H #include typedef int8_t s8; typedef uint8_t u8; typedef int16_t s16; typedef uint16_t u16; typedef int32_t s32; typedef uint32_t u32; #ifdef HAVE_API_WIN32_BASE #define LONGLONG_FMT "%I64d" #define LONGLONG_HEX_FMT "%I64x" #else #define LONGLONG_FMT "%lld" #define LONGLONG_HEX_FMT "%llx" #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/util.c000066400000000000000000000364611221777731700174540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #ifdef _POSIX_C_SOURCE #include #include #include #endif #ifdef _MSC_VER typedef int ssize_t ; #endif #include "util.h" #include "debug.h" #include "config.h" void strtoupper(char *dest, const char *src) { while (*src) *dest++=toupper(*src++); *dest='\0'; } void strtolower(char *dest, const char *src) { while (*src) *dest++=tolower(*src++); *dest='\0'; } int navit_utf8_strcasecmp(const char *s1, const char *s2) { char *s1_folded,*s2_folded; int cmpres; s1_folded=g_utf8_casefold(s1,-1); s2_folded=g_utf8_casefold(s2,-1); cmpres=strcmp(s1_folded,s2_folded); dbg(3,"Compared %s with %s, got %d\n",s1_folded,s2_folded,cmpres); g_free(s1_folded); g_free(s2_folded); return cmpres; } static void hash_callback(gpointer key, gpointer value, gpointer user_data) { GList **l=user_data; *l=g_list_prepend(*l, value); } GList * g_hash_to_list(GHashTable *h) { GList *ret=NULL; g_hash_table_foreach(h, hash_callback, &ret); return ret; } static void hash_callback_key(gpointer key, gpointer value, gpointer user_data) { GList **l=user_data; *l=g_list_prepend(*l, key); } GList * g_hash_to_list_keys(GHashTable *h) { GList *ret=NULL; g_hash_table_foreach(h, hash_callback_key, &ret); return ret; } gchar * g_strconcat_printf(gchar *buffer, gchar *fmt, ...) { gchar *str,*ret; va_list ap; va_start(ap, fmt); str=g_strdup_vprintf(fmt, ap); va_end(ap); if (! buffer) return str; ret=g_strconcat(buffer, str, NULL); g_free(buffer); g_free(str); return ret; } #ifndef HAVE_GLIB int g_utf8_strlen_force_link(gchar *buffer, int max); int g_utf8_strlen_force_link(gchar *buffer, int max) { return g_utf8_strlen(buffer, max); } #endif #if defined(_WIN32) || defined(__CEGCC__) #include #include #endif #if defined(_WIN32) || defined(__CEGCC__) || defined (__APPLE__) || defined(HAVE_API_ANDROID) #include char *stristr(const char *String, const char *Pattern) { char *pptr, *sptr, *start; for (start = (char *)String; *start != (int)NULL; start++) { /* find start of pattern in string */ for ( ; ((*start!=(int)NULL) && (toupper(*start) != toupper(*Pattern))); start++) ; if ((int)NULL == *start) return NULL; pptr = (char *)Pattern; sptr = (char *)start; while (toupper(*sptr) == toupper(*pptr)) { sptr++; pptr++; /* if end of pattern then pattern was found */ if ((int)NULL == *pptr) return (start); } } return NULL; } #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #if !HAVE_FLOCKFILE # undef flockfile # define flockfile(x) ((void) 0) #endif #if !HAVE_FUNLOCKFILE # undef funlockfile # define funlockfile(x) ((void) 0) #endif /* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ #ifndef EOVERFLOW # define EOVERFLOW E2BIG #endif #ifndef HAVE_GETDELIM /** * Read the part of a file up to a delimiter to a string. *

* Read up to (and including) a DELIMITER from FP into *LINEPTR (and NUL-terminate it). * @param lineptr Pointer to a pointer returned from malloc (or NULL), pointing to a buffer. It is realloc'ed as necessary and will receive the data read. * @param n Size of the buffer. * * @return Number of characters read (not including the null terminator), or -1 on error or EOF. */ ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { int result; size_t cur_len = 0; if (lineptr == NULL || n == NULL || fp == NULL) { return -1; } flockfile (fp); if (*lineptr == NULL || *n == 0) { *n = 120; *lineptr = (char *) realloc (*lineptr, *n); if (*lineptr == NULL) { result = -1; goto unlock_return; } } for (;;) { int i; i = getc (fp); if (i == EOF) { result = -1; break; } /* Make enough space for len+1 (for final NUL) bytes. */ if (cur_len + 1 >= *n) { size_t needed_max=SIZE_MAX; size_t needed = 2 * *n + 1; /* Be generous. */ char *new_lineptr; if (needed_max < needed) needed = needed_max; if (cur_len + 1 >= needed) { result = -1; goto unlock_return; } new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { result = -1; goto unlock_return; } *lineptr = new_lineptr; *n = needed; } (*lineptr)[cur_len] = i; cur_len++; if (i == delimiter) break; } (*lineptr)[cur_len] = '\0'; result = cur_len ? cur_len : result; unlock_return: funlockfile (fp); /* doesn't set errno */ return result; } #endif #ifndef HAVE_GETLINE ssize_t getline (char **lineptr, size_t *n, FILE *stream) { return getdelim (lineptr, n, '\n', stream); } #endif #if defined(_UNICODE) wchar_t* newSysString(const char *toconvert) { int newstrlen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toconvert, -1, 0, 0); wchar_t *newstring = g_new(wchar_t,newstrlen); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toconvert, -1, newstring, newstrlen) ; return newstring; } #else char * newSysString(const char *toconvert) { return g_strdup(toconvert); } #endif #endif #if defined(_MSC_VER) || (!defined(HAVE_GETTIMEOFDAY) && defined(HAVE_API_WIN32_BASE)) /** * Impements a simple incomplete version of gettimeofday. Only usefull for messuring * time spans, not the real time of day. */ int gettimeofday(struct timeval *time, void *local) { int milliseconds = GetTickCount(); time->tv_sec = milliseconds/1000; time->tv_usec = (milliseconds - (time->tv_sec * 1000)) * 1000; return 0; } #endif /** * Convert an ISO 8601-style time string into epoch time. * * @param iso8601 Pointer to a string containing the time in ISO 8601 format. * * @return An unsigned integer representing the number of seconds elapsed since January 1, 1970, 00:00:00 UTC. */ unsigned int iso8601_to_secs(char *iso8601) { int a,b,d,val[6],i=0; char *start=iso8601,*pos=iso8601; while (*pos && i < 6) { if (*pos < '0' || *pos > '9') { val[i++]=atoi(start); pos++; start=pos; } if(*pos) pos++; } a=val[0]/100; b=2-a+a/4; if (val[1] < 2) { val[0]--; val[1]+=12; } d=1461*(val[0]+4716)/4+306001*(val[1]+1)/10000+val[2]+b-2442112; return ((d*24+val[3])*60+val[4])*60+val[5]; } /** * Output local system time in ISO 8601 format. * * @return Pointer to a string containing the time in ISO 8601 format */ char * current_to_iso8601(void) { char *timep=NULL; #ifdef HAVE_API_WIN32_BASE SYSTEMTIME ST; GetSystemTime(&ST); timep=g_strdup_printf("%d-%02d-%02dT%02d:%02d:%02dZ",ST.wYear,ST.wMonth,ST.wDay,ST.wHour,ST.wMinute,ST.wSecond); #else char buffer[32]; time_t tnow; struct tm *tm; tnow = time(0); tm = gmtime(&tnow); if (tm) { strftime(buffer, sizeof(buffer), "%Y-%m-%dT%TZ", tm); timep=g_strdup(buffer); } #endif return timep; } struct spawn_process_info { #ifdef HAVE_API_WIN32_BASE PROCESS_INFORMATION pr; #else pid_t pid; // = -1 if non-blocking spawn isn't supported int status; // exit status if non-blocking spawn isn't supported #endif }; /** * Escape and quote string for shell * * @param in arg string to escape * @returns escaped string */ char * shell_escape(char *arg) { char *r; int arglen=strlen(arg); int i,j,rlen; #ifdef HAVE_API_WIN32_BASE { int bscount=0; rlen=arglen+3; r=g_new(char,rlen); r[0]='"'; for(i=0,j=1;i0) { rlen+=bscount; r=g_realloc(r,rlen); memset(r+j,'\\',bscount); j+=bscount; bscount=0; } r[j++]=arg[i]; if(i==(arglen-1)) { r[j++]='"'; } } } r[j++]=0; } #else { // Will use hard quoting for the whole string // and replace each singular quote found with a '\'' sequence. rlen=arglen+3; r=g_new(char,rlen); r[0]='\''; for(i=0,j=1;i0 - return code, -1 - error */ struct spawn_process_info* spawn_process(char **argv) { struct spawn_process_info*r=g_new(struct spawn_process_info,1); #ifdef _POSIX_C_SOURCE { pid_t pid; sigset_t set, old; dbg(1,"spawning process for '%s'\n", argv[0]); sigemptyset(&set); sigaddset(&set,SIGCHLD); spawn_process_sigmask(SIG_BLOCK,&set,&old); pid=fork(); if(pid==0) { execvp(argv[0], argv); /*Shouldn't reach here*/ exit(1); } else if(pid>0) { r->status=-1; r->pid=pid; spawn_process_children=g_list_prepend(spawn_process_children,r); } else { dbg(0,"fork() returned error."); g_free(r); r=NULL; } spawn_process_sigmask(SIG_SETMASK,&old,NULL); return r; } #else #ifdef HAVE_API_WIN32_BASE { char *cmdline; DWORD dwRet; // For [desktop] Windows it's adviceable not to use // first CreateProcess parameter because PATH is not used // if it is defined. // // On WinCE 6.0 I was unable to launch anything // without first CreateProcess parameter, also it seems that // no WinCE program has support for quoted strings in arguments. // So... #ifdef HAVE_API_WIN32_CE LPWSTR cmd,args; cmdline=g_strjoinv(" ",argv+1); args=newSysString(cmdline); cmd = newSysString(argv[0]); dwRet=CreateProcess(cmd, args, NULL, NULL, 0, 0, NULL, NULL, NULL, &(r->pr)); dbg(0, "CreateProcess(%s,%s), PID=%i\n",argv[0],cmdline,r->pr.dwProcessId); g_free(cmd); #else TCHAR* args; STARTUPINFO startupInfo; memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); cmdline=spawn_process_compose_cmdline(argv); args=newSysString(cmdline); dwRet=CreateProcess(NULL, args, NULL, NULL, 0, 0, NULL, NULL, &startupInfo, &(r->pr)); dbg(0, "CreateProcess(%s), PID=%i\n",cmdline,r->pr.dwProcessId); #endif g_free(cmdline); g_free(args); return r; } #else { char *cmdline=spawn_process_compose_cmdline(argv); int status; dbg(0,"Unblocked spawn_process isn't availiable on this platform.\n"); status=system(cmdline); g_free(cmdline); r->status=status; r->pid=0; return r; } #endif #endif } /** * Check external program status * * @param in *pi pointer to spawn_process_info structure * @param in block =0 do not block =1 block until child terminated * @returns -1 - still running, >=0 program exited, * =255 trminated abnormally or wasn't run at all. * */ int spawn_process_check_status(struct spawn_process_info *pi, int block) { if(pi==NULL) { dbg(0,"Trying to get process status of NULL, assuming process is terminated.\n"); return 255; } #ifdef HAVE_API_WIN32_BASE {int failcount=0; while(1){ DWORD dw; if(GetExitCodeProcess(pi->pr.hProcess,&dw)) { if(dw!=STILL_ACTIVE) { return dw; break; } } else { dbg(0,"GetExitCodeProcess failed. Assuming the process is terminated."); return 255; } if(!block) return -1; dw=WaitForSingleObject(pi->pr.hProcess,INFINITE); if(dw==WAIT_FAILED && failcount++==1) { dbg(0,"WaitForSingleObject failed twice. Assuming the process is terminated."); return 0; break; } } } #else #ifdef _POSIX_C_SOURCE if(pi->status!=-1) { return pi->status; } while(1) { int status; pid_t w=waitpid(pi->pid,&status,block?0:WNOHANG); if(w>0) { if(WIFEXITED(status)) pi->status=WEXITSTATUS(status); return pi->status; if(WIFSTOPPED(status)) { dbg(0,"child is stopped by %i signal\n",WSTOPSIG(status)); } else if (WIFSIGNALED(status)) { dbg(0,"child terminated by signal %i\n",WEXITSTATUS(status)); pi->status=255; return 255; } if(!block) return -1; } else if(w==0) { if(!block) return -1; } else { if(pi->status!=-1) // Signal handler has changed pi->status while in this function return pi->status; dbg(0,"waitpid() indicated error, reporting process termination.\n"); return 255; } } #else dbg(0, "Non-blocking spawn_process isn't availiable for this platform, repoting process exit status.\n"); return pi->status; #endif #endif } void spawn_process_info_free(struct spawn_process_info *pi) { if(pi==NULL) return; #ifdef HAVE_API_WIN32_BASE CloseHandle(pi->pr.hProcess); CloseHandle(pi->pr.hThread); #endif #ifdef _POSIX_C_SOURCE { sigset_t set, old; sigemptyset(&set); sigaddset(&set,SIGCHLD); spawn_process_sigmask(SIG_BLOCK,&set,&old); spawn_process_children=g_list_remove(spawn_process_children,pi); spawn_process_sigmask(SIG_SETMASK,&old,NULL); } #endif g_free(pi); } #ifdef _POSIX_C_SOURCE static void spawn_process_sigchld(int sig) { int status; pid_t pid; while ((pid=waitpid(-1, &status, WNOHANG)) > 0) { GList *el=g_list_first(spawn_process_children); while(el) { struct spawn_process_info *p=el->data; if(p->pid==pid) { p->status=status; } el=g_list_next(el); } } } #endif void spawn_process_init() { #ifdef _POSIX_C_SOURCE struct sigaction act; act.sa_handler=spawn_process_sigchld; act.sa_flags=0; sigemptyset(&act.sa_mask); sigaction(SIGCHLD, &act, NULL); #endif return; } navit-0.5.0~svn5643+dfsg.1/navit/util.h000066400000000000000000000035661221777731700174610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_types_H #define NAVIT_types_H #include #include "config.h" void strtoupper(char *dest, const char *src); void strtolower(char *dest, const char *src); int navit_utf8_strcasecmp(const char *s1, const char *s2); GList * g_hash_to_list(GHashTable *h); GList * g_hash_to_list_keys(GHashTable *h); gchar * g_strconcat_printf(gchar *buffer, gchar *fmt, ...); #if defined(_WIN32) || defined(__CEGCC__) || defined (__APPLE__) || defined(HAVE_API_ANDROID) #if defined(_UNICODE) wchar_t* newSysString(const char *toconvert); #else char * newSysString(const char *toconvert); #endif #endif unsigned int iso8601_to_secs(char *iso8601); char * current_to_iso8601(void); #if defined(_MSC_VER) || (!defined(HAVE_GETTIMEOFDAY) && defined(HAVE_API_WIN32_BASE)) #include int gettimeofday(struct timeval *time, void *); #endif struct spawn_process_info; char * shell_escape(char *arg); struct spawn_process_info* spawn_process(char **argv); int spawn_process_check_status(struct spawn_process_info *pi,int block); void spawn_process_info_free(struct spawn_process_info *pi); void spawn_process_init(void); #endif navit-0.5.0~svn5643+dfsg.1/navit/vehicle.c000066400000000000000000000530671221777731700201170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "config.h" #include "debug.h" #include "coord.h" #include "item.h" #include "xmlconfig.h" #include "log.h" #include "plugin.h" #include "transform.h" #include "util.h" #include "event.h" #include "coord.h" #include "transform.h" #include "projection.h" #include "point.h" #include "graphics.h" #include "callback.h" #include "color.h" #include "layout.h" #include "vehicle.h" #include "navit_nls.h" struct vehicle { NAVIT_OBJECT struct vehicle_methods meth; struct vehicle_priv *priv; struct callback_list *cbl; struct log *nmea_log, *gpx_log; char *gpx_desc; // cursor struct cursor *cursor; int cursor_fixed; struct callback *animate_callback; struct event_timeout *animate_timer; struct point cursor_pnt; struct graphics *gra; struct graphics_gc *bg; struct transformation *trans; int angle; int speed; int sequence; GHashTable *log_to_cb; }; struct object_func vehicle_func; static void vehicle_set_default_name(struct vehicle *this); static void vehicle_draw_do(struct vehicle *this_, int lazy); static void vehicle_log_nmea(struct vehicle *this_, struct log *log); static void vehicle_log_gpx(struct vehicle *this_, struct log *log); static void vehicle_log_textfile(struct vehicle *this_, struct log *log); static void vehicle_log_binfile(struct vehicle *this_, struct log *log); static int vehicle_add_log(struct vehicle *this_, struct log *log); /** * Creates a new vehicle */ struct vehicle * vehicle_new(struct attr *parent, struct attr **attrs) { struct vehicle *this_; struct attr *source; struct vehicle_priv *(*vehicletype_new) (struct vehicle_methods * meth, struct callback_list * cbl, struct attr ** attrs); char *type, *colon; struct pcoord center; dbg(1, "enter\n"); source = attr_search(attrs, NULL, attr_source); if (!source) { dbg(0, "incomplete vehicle definition: missing attribute 'source'\n"); return NULL; } type = g_strdup(source->u.str); colon = strchr(type, ':'); if (colon) *colon = '\0'; dbg(1, "source='%s' type='%s'\n", source->u.str, type); vehicletype_new = plugin_get_vehicle_type(type); if (!vehicletype_new) { dbg(0, "invalid source '%s': unknown type '%s'\n", source->u.str, type); g_free(type); return NULL; } g_free(type); this_ = g_new0(struct vehicle, 1); this_->func=&vehicle_func; navit_object_ref((struct navit_object *)this_); this_->cbl = callback_list_new(); this_->priv = vehicletype_new(&this_->meth, this_->cbl, attrs); if (!this_->priv) { dbg(0, "vehicletype_new failed\n"); callback_list_destroy(this_->cbl); g_free(this_); return NULL; } this_->attrs=attr_list_dup(attrs); center.pro=projection_screen; center.x=0; center.y=0; this_->trans=transform_new(¢er, 16, 0); vehicle_set_default_name(this_); dbg(1, "leave\n"); this_->log_to_cb=g_hash_table_new(NULL,NULL); return this_; } /** * Destroys a vehicle * * @param this_ The vehicle to destroy */ void vehicle_destroy(struct vehicle *this_) { dbg(0,"enter\n"); if (this_->animate_callback) { callback_destroy(this_->animate_callback); event_remove_timeout(this_->animate_timer); } transform_destroy(this_->trans); this_->meth.destroy(this_->priv); callback_list_destroy(this_->cbl); attr_list_free(this_->attrs); if (this_->bg) graphics_gc_destroy(this_->bg); if (this_->gra) graphics_free(this_->gra); g_free(this_); } /** * Creates an attribute iterator to be used with vehicles */ struct attr_iter * vehicle_attr_iter_new(void) { return (struct attr_iter *)g_new0(void *,1); } /** * Destroys a vehicle attribute iterator * * @param iter a vehicle attr_iter */ void vehicle_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } /** * Generic get function * * @param this_ Pointer to a vehicle structure * @param type The attribute type to look for * @param attr Pointer to an attr structure to store the attribute * @param iter A vehicle attr_iter */ int vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret; if (this_->meth.position_attr_get) { ret=this_->meth.position_attr_get(this_->priv, type, attr); if (ret) return ret; } if (type == attr_log_gpx_desc) { attr->u.str = this_->gpx_desc; return 1; } return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } /** * Generic set function * * @param this_ Pointer to a vehicle structure * @param attr Pointer to an attr structure for the attribute to be set * @return nonzero on success, zero on failure */ int vehicle_set_attr(struct vehicle *this_, struct attr *attr) { int ret=1; if (this_->meth.set_attr) ret=this_->meth.set_attr(this_->priv, attr); /* attr_profilename probably is never used by vehicle itself but it's used to control the routing engine. So any vehicle should allow to set and read it. */ if(attr->type == attr_profilename) ret=1; if (ret == 1 && attr->type == attr_log_gpx_desc) { g_free(this_->gpx_desc); this_->gpx_desc = attr->u.str; } if (ret == 1 && attr->type != attr_navit && attr->type != attr_pdl_gps_update) this_->attrs=attr_generic_set_attr(this_->attrs, attr); return ret != 0; } /** * Generic add function * * @param this_ A vehicle * @param attr A struct attr */ int vehicle_add_attr(struct vehicle *this_, struct attr *attr) { int ret=1; switch (attr->type) { case attr_callback: callback_list_add(this_->cbl, attr->u.callback); break; case attr_log: ret=vehicle_add_log(this_, attr->u.log); break; // currently supporting oldstyle cursor config. case attr_cursor: this_->cursor_fixed=1; vehicle_set_cursor(this_, attr->u.cursor, 1); break; default: break; } if (ret) this_->attrs=attr_generic_add_attr(this_->attrs, attr); return ret; } /** * @brief Generic remove function. * * Used to remove a callback from the vehicle. * @param this_ A vehicle * @param attr */ int vehicle_remove_attr(struct vehicle *this_, struct attr *attr) { struct callback *cb; switch (attr->type) { case attr_callback: callback_list_remove(this_->cbl, attr->u.callback); break; case attr_log: cb=g_hash_table_lookup(this_->log_to_cb, attr->u.log); if (!cb) return 0; g_hash_table_remove(this_->log_to_cb, attr->u.log); callback_list_remove(this_->cbl, cb); break; default: this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 0; } return 1; } /** * Sets the cursor of a vehicle. * * @param this_ A vehicle * @param cursor A cursor * @author Ralph Sennhauser (10/2009) */ void vehicle_set_cursor(struct vehicle *this_, struct cursor *cursor, int overwrite) { struct point sc; if (this_->cursor_fixed && !overwrite) return; if (this_->animate_callback) { event_remove_timeout(this_->animate_timer); this_->animate_timer=NULL; // dangling pointer! prevent double freeing. callback_destroy(this_->animate_callback); this_->animate_callback=NULL; // dangling pointer! prevent double freeing. } if (cursor && cursor->interval) { this_->animate_callback=callback_new_2(callback_cast(vehicle_draw_do), this_, 0); this_->animate_timer=event_add_timeout(cursor->interval, 1, this_->animate_callback); } if (cursor && this_->gra && this_->cursor) { this_->cursor_pnt.x+=(this_->cursor->w - cursor->w)/2; this_->cursor_pnt.y+=(this_->cursor->h - cursor->h)/2; graphics_overlay_resize(this_->gra, &this_->cursor_pnt, cursor->w, cursor->h, 65535, 0); } if (cursor) { sc.x=cursor->w/2; sc.y=cursor->h/2; if (!this_->cursor && this_->gra) graphics_overlay_disable(this_->gra, 0); } else { sc.x=sc.y=0; if (this_->cursor && this_->gra) graphics_overlay_disable(this_->gra, 1); } transform_set_screen_center(this_->trans, &sc); this_->cursor=cursor; } /** * Draws a vehicle on top of a graphics. * * @param this_ The vehicle * @param gra The graphics * @param pnt Screen coordinates of the vehicle. * @param lazy use lazy draw mode. * @param angle The angle relative to the map. * @param speed The speed of the vehicle. */ void vehicle_draw(struct vehicle *this_, struct graphics *gra, struct point *pnt, int lazy, int angle, int speed) { if (angle < 0) angle+=360; dbg(1,"enter this=%p gra=%p pnt=%p lazy=%d dir=%d speed=%d\n", this_, gra, pnt, lazy, angle, speed); dbg(1,"point %d,%d\n", pnt->x, pnt->y); this_->cursor_pnt=*pnt; this_->angle=angle; this_->speed=speed; if (!this_->cursor) return; this_->cursor_pnt.x-=this_->cursor->w/2; this_->cursor_pnt.y-=this_->cursor->h/2; if (!this_->gra) { struct color c; this_->gra=graphics_overlay_new(gra, &this_->cursor_pnt, this_->cursor->w, this_->cursor->h, 65535, 0); if (this_->gra) { graphics_init(this_->gra); this_->bg=graphics_gc_new(this_->gra); c.r=0; c.g=0; c.b=0; c.a=0; graphics_gc_set_foreground(this_->bg, &c); graphics_background_gc(this_->gra, this_->bg); } } vehicle_draw_do(this_, lazy); } int vehicle_get_cursor_data(struct vehicle *this, struct point *pnt, int *angle, int *speed) { *pnt=this->cursor_pnt; *angle=this->angle; *speed=this->speed; return 1; } static void vehicle_set_default_name(struct vehicle *this_) { struct attr default_name; if (!attr_search(this_->attrs, NULL, attr_name)) { default_name.type=attr_name; // Safe cast: attr_generic_set_attr does not modify its parameter. default_name.u.str=(char*)_("Unnamed vehicle"); this_->attrs=attr_generic_set_attr(this_->attrs, &default_name); dbg(0, "Incomplete vehicle definition: missing attribute 'name'. Default name set.\n"); } } static void vehicle_draw_do(struct vehicle *this_, int lazy) { struct point p; struct cursor *cursor=this_->cursor; int speed=this_->speed; int angle=this_->angle; int sequence=this_->sequence; struct attr **attr; char *label=NULL; int match=0; if (!this_->cursor || !this_->cursor->attrs || !this_->gra) return; attr=this_->attrs; while (attr && *attr) { if ((*attr)->type == attr_name) label=(*attr)->u.str; attr++; } transform_set_yaw(this_->trans, -this_->angle); graphics_draw_mode(this_->gra, draw_mode_begin); p.x=0; p.y=0; graphics_draw_rectangle(this_->gra, this_->bg, &p, cursor->w, cursor->h); attr=cursor->attrs; while (*attr) { if ((*attr)->type == attr_itemgra) { struct itemgra *itm=(*attr)->u.itemgra; dbg(1,"speed %d-%d %d\n", itm->speed_range.min, itm->speed_range.max, speed); if (speed >= itm->speed_range.min && speed <= itm->speed_range.max && angle >= itm->angle_range.min && angle <= itm->angle_range.max && sequence >= itm->sequence_range.min && sequence <= itm->sequence_range.max) { graphics_draw_itemgra(this_->gra, itm, this_->trans, label); } if (sequence < itm->sequence_range.max) match=1; } ++attr; } graphics_draw_drag(this_->gra, &this_->cursor_pnt); graphics_draw_mode(this_->gra, lazy ? draw_mode_end_lazy : draw_mode_end); if (this_->animate_callback) { ++this_->sequence; if (cursor->sequence_range && cursor->sequence_range->max < this_->sequence) this_->sequence=cursor->sequence_range->min; if (! match && ! cursor->sequence_range) this_->sequence=0; } } /** * Writes to an NMEA log. * * @param this_ Pointer to the vehicle structure of the data source * @param log Pointer to a log structure for the log file */ static void vehicle_log_nmea(struct vehicle *this_, struct log *log) { struct attr pos_attr; if (!this_->meth.position_attr_get) return; if (!this_->meth.position_attr_get(this_->priv, attr_position_nmea, &pos_attr)) return; log_write(log, pos_attr.u.str, strlen(pos_attr.u.str), 0); } void vehicle_log_gpx_add_tag(char *tag, char **logstr) { char *ext_start="\t\n"; char *ext_end="\t\n"; char *trkpt_end=""; char *start=NULL,*end=NULL; if (!*logstr) { start=g_strdup(ext_start); end=g_strdup(ext_end); } else { char *str=strstr(*logstr, ext_start); int len; if (str) { len=str-*logstr+strlen(ext_start); start=g_strdup(*logstr); start[len]='\0'; end=g_strdup(str+strlen(ext_start)); } else { str=strstr(*logstr, trkpt_end); len=str-*logstr; end=g_strdup_printf("%s%s",ext_end,str); str=g_strdup(*logstr); str[len]='\0'; start=g_strdup_printf("%s%s",str,ext_start); g_free(str); } } *logstr=g_strdup_printf("%s%s%s",start,tag,end); g_free(start); g_free(end); } /** * Writes to a GPX log. * * @param this_ Pointer to the vehicle structure of the data source * @param log Pointer to a log structure for the log file */ static void vehicle_log_gpx(struct vehicle *this_, struct log *log) { struct attr attr,*attrp, fix_attr; enum attr_type *attr_types; char *logstr; char *extensions="\t\n"; if (!this_->meth.position_attr_get) return; if (log_get_attr(log, attr_attr_types, &attr, NULL)) attr_types=attr.u.attr_types; else attr_types=NULL; if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { if ( fix_attr.u.num == 0 ) return; } if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &attr)) return; logstr=g_strdup_printf("\n",attr.u.coord_geo->lat,attr.u.coord_geo->lng); if (attr_types && attr_types_contains_default(attr_types, attr_position_time_iso8601, 0)) { if (this_->meth.position_attr_get(this_->priv, attr_position_time_iso8601, &attr)) { logstr=g_strconcat_printf(logstr,"\t\n",attr.u.str); } else { char *timep = current_to_iso8601(); logstr=g_strconcat_printf(logstr,"\t\n",timep); g_free(timep); } } if (this_->gpx_desc) { logstr=g_strconcat_printf(logstr,"\t%s\n",this_->gpx_desc); g_free(this_->gpx_desc); this_->gpx_desc = NULL; } if (attr_types_contains_default(attr_types, attr_position_height,0) && this_->meth.position_attr_get(this_->priv, attr_position_height, &attr)) logstr=g_strconcat_printf(logstr,"\t%.6f\n",*attr.u.numd); // magnetic variation in degrees; we might use position_magnetic_direction and position_direction to figure it out // Height (in meters) of geoid (mean sea level) above WGS84 earth ellipsoid. As defined in NMEA GGA message (field 11, which vehicle_wince.c ignores) // GPS name (arbitrary) // comment // Source of data // Link to additional information (URL) // Text of GPS symbol name // Type (classification) // Type of GPS fix {'none'|'2d'|'3d'|'dgps'|'pps'}, leave out if unknown. Similar to position_fix_type but more detailed. if (attr_types_contains_default(attr_types, attr_position_sats_used,0) && this_->meth.position_attr_get(this_->priv, attr_position_sats_used, &attr)) logstr=g_strconcat_printf(logstr,"\t%d\n",attr.u.num); if (attr_types_contains_default(attr_types, attr_position_hdop,0) && this_->meth.position_attr_get(this_->priv, attr_position_hdop, &attr)) logstr=g_strconcat_printf(logstr,"\t%.6f\n",*attr.u.numd); // , Vertical and position dilution of precision, no corresponding attribute if (attr_types_contains_default(attr_types, attr_position_direction,0) && this_->meth.position_attr_get(this_->priv, attr_position_direction, &attr)) logstr=g_strconcat_printf(logstr,"\t%.1f\n",*attr.u.numd); if (attr_types_contains_default(attr_types, attr_position_speed, 0) && this_->meth.position_attr_get(this_->priv, attr_position_speed, &attr)) logstr=g_strconcat_printf(logstr,"\t%.2f\n",(*attr.u.numd / 3.6)); if (attr_types_contains_default(attr_types, attr_profilename, 0) && (attrp=attr_search(this_->attrs, NULL, attr_profilename))) { logstr=g_strconcat_printf(logstr,"%s\t\t%s\n",extensions,attrp->u.str); extensions=""; } if (attr_types_contains_default(attr_types, attr_position_radius, 0) && this_->meth.position_attr_get(this_->priv, attr_position_radius, &attr)) { logstr=g_strconcat_printf(logstr,"%s\t\t%.2f\n",extensions,*attr.u.numd); extensions=""; } if (!strcmp(extensions,"")) { logstr=g_strconcat_printf(logstr,"\t\n"); } logstr=g_strconcat_printf(logstr,"\n"); callback_list_call_attr_1(this_->cbl, attr_log_gpx, &logstr); log_write(log, logstr, strlen(logstr), 0); g_free(logstr); } /** * Writes to a text log. * * @param this_ Pointer to the vehicle structure of the data source * @param log Pointer to a log structure for the log file */ static void vehicle_log_textfile(struct vehicle *this_, struct log *log) { struct attr pos_attr,fix_attr; char *logstr; if (!this_->meth.position_attr_get) return; if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { if (fix_attr.u.num == 0) return; } if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr)) return; logstr=g_strdup_printf("%f %f type=trackpoint\n", pos_attr.u.coord_geo->lng, pos_attr.u.coord_geo->lat); callback_list_call_attr_1(this_->cbl, attr_log_textfile, &logstr); log_write(log, logstr, strlen(logstr), 0); } /** * Writes to a binary log. * * @param this_ Pointer to the vehicle structure of the data source * @param log Pointer to a log structure for the log file */ static void vehicle_log_binfile(struct vehicle *this_, struct log *log) { struct attr pos_attr, fix_attr; int *buffer; int *buffer_new; int len,limit=1024,done=0,radius=25; struct coord c; enum log_flags flags; if (!this_->meth.position_attr_get) return; if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { if (fix_attr.u.num == 0) return; } if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr)) return; transform_from_geo(projection_mg, pos_attr.u.coord_geo, &c); if (!c.x || !c.y) return; while (!done) { buffer=log_get_buffer(log, &len); if (! buffer || !len) { buffer_new=g_malloc(5*sizeof(int)); buffer_new[0]=2; buffer_new[1]=type_track; buffer_new[2]=0; } else { buffer_new=g_malloc((buffer[0]+3)*sizeof(int)); memcpy(buffer_new, buffer, (buffer[0]+1)*sizeof(int)); } dbg(1,"c=0x%x,0x%x\n",c.x,c.y); buffer_new[buffer_new[0]+1]=c.x; buffer_new[buffer_new[0]+2]=c.y; buffer_new[0]+=2; buffer_new[2]+=2; if (buffer_new[2] > limit) { int count=buffer_new[2]/2; struct coord *out=g_alloca(sizeof(struct coord)*(count)); struct coord *in=(struct coord *)(buffer_new+3); int count_out=transform_douglas_peucker(in, count, radius, out); memcpy(in, out, count_out*2*sizeof(int)); buffer_new[0]+=(count_out-count)*2; buffer_new[2]+=(count_out-count)*2; flags=log_flag_replace_buffer|log_flag_force_flush|log_flag_truncate; } else { flags=log_flag_replace_buffer|log_flag_keep_pointer|log_flag_keep_buffer|log_flag_force_flush; done=1; } log_write(log, (char *)buffer_new, (buffer_new[0]+1)*sizeof(int), flags); } } /** * Register a new log to receive data. * * @param this_ Pointer to the vehicle structure of the data source * @param log Pointer to a log structure for the log file */ static int vehicle_add_log(struct vehicle *this_, struct log *log) { struct callback *cb; struct attr type_attr; if (!log_get_attr(log, attr_type, &type_attr, NULL)) return 1; if (!strcmp(type_attr.u.str, "nmea")) { cb=callback_new_attr_2(callback_cast(vehicle_log_nmea), attr_position_coord_geo, this_, log); } else if (!strcmp(type_attr.u.str, "gpx")) { char *header = "\n" "\n" "\n" "\n"; char *trailer = "\n\n\n"; log_set_header(log, header, strlen(header)); log_set_trailer(log, trailer, strlen(trailer)); cb=callback_new_attr_2(callback_cast(vehicle_log_gpx), attr_position_coord_geo, this_, log); } else if (!strcmp(type_attr.u.str, "textfile")) { char *header = "type=track\n"; log_set_header(log, header, strlen(header)); cb=callback_new_attr_2(callback_cast(vehicle_log_textfile), attr_position_coord_geo, this_, log); } else if (!strcmp(type_attr.u.str, "binfile")) { cb=callback_new_attr_2(callback_cast(vehicle_log_binfile), attr_position_coord_geo, this_, log); } else return 0; g_hash_table_insert(this_->log_to_cb, log, cb); callback_list_add(this_->cbl, cb); return 1; } struct object_func vehicle_func = { attr_vehicle, (object_func_new)vehicle_new, (object_func_get_attr)vehicle_get_attr, (object_func_iter_new)vehicle_attr_iter_new, (object_func_iter_destroy)vehicle_attr_iter_destroy, (object_func_set_attr)vehicle_set_attr, (object_func_add_attr)vehicle_add_attr, (object_func_remove_attr)vehicle_remove_attr, (object_func_init)NULL, (object_func_destroy)vehicle_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/vehicle.h000066400000000000000000000043561221777731700201210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_VEHICLE_H #define NAVIT_VEHICLE_H #ifdef __cplusplus extern "C" { #endif struct point; struct vehicle_priv; struct vehicle_methods { void (*destroy)(struct vehicle_priv *priv); int (*position_attr_get)(struct vehicle_priv *priv, enum attr_type type, struct attr *attr); int (*set_attr)(struct vehicle_priv *priv, struct attr *attr); }; /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct cursor; struct graphics; struct point; struct vehicle; struct vehicle *vehicle_new(struct attr *parent, struct attr **attrs); void vehicle_destroy(struct vehicle *this_); struct attr_iter *vehicle_attr_iter_new(void); void vehicle_attr_iter_destroy(struct attr_iter *iter); int vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int vehicle_set_attr(struct vehicle *this_, struct attr *attr); int vehicle_add_attr(struct vehicle *this_, struct attr *attr); int vehicle_remove_attr(struct vehicle *this_, struct attr *attr); void vehicle_set_cursor(struct vehicle *this_, struct cursor *cursor, int overwrite); void vehicle_draw(struct vehicle *this_, struct graphics *gra, struct point *pnt, int lazy, int angle, int speed); int vehicle_get_cursor_data(struct vehicle *this_, struct point *pnt, int *angle, int *speed); void vehicle_log_gpx_add_tag(char *tag, char **logstr); struct vehicle * vehicle_ref(struct vehicle *this_); void vehicle_unref(struct vehicle *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/vehicle/000077500000000000000000000000001221777731700177405ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/Makefile.am000066400000000000000000000007351221777731700220010ustar00rootroot00000000000000SUBDIRS= if VEHICLE_MAEMO SUBDIRS += maemo endif if VEHICLE_ANDROID SUBDIRS += android endif if VEHICLE_IPHONE SUBDIRS += iphone endif if VEHICLE_DEMO SUBDIRS += demo endif if VEHICLE_FILE SUBDIRS += file endif if VEHICLE_GPSD SUBDIRS += gpsd endif if VEHICLE_GPSD_DBUS SUBDIRS += gpsd_dbus endif if VEHICLE_GYPSY SUBDIRS += gypsy endif if VEHICLE_NULL SUBDIRS += null endif if VEHICLE_WINCE SUBDIRS += wince endif if VEHICLE_WEBOS SUBDIRS += webos endif navit-0.5.0~svn5643+dfsg.1/navit/vehicle/android/000077500000000000000000000000001221777731700213605ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/android/CMakeLists.txt000066400000000000000000000000661221777731700241220ustar00rootroot00000000000000module_add_library(vehicle_android vehicle_android.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/android/Makefile.am000066400000000000000000000004411221777731700234130ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_android modulevehicle_LTLIBRARIES = libvehicle_android.la libvehicle_android_la_SOURCES = vehicle_android.c libvehicle_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/vehicle/android/vehicle_android.c000066400000000000000000000146271221777731700246550ustar00rootroot00000000000000/** @file vehicle_android.c * @brief android uses dbus signals * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * @Author Tim Niemeyer * @date 2008-2009 */ #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "android.h" #include "vehicle.h" struct vehicle_priv { struct callback_list *cbl; struct coord_geo geo; double speed; double direction; double height; double radius; int fix_type; time_t fix_time; char fixiso8601[128]; int sats; int sats_used; int have_coords; struct attr ** attrs; struct callback *cb; jclass NavitVehicleClass; jobject NavitVehicle; jclass LocationClass; jmethodID Location_getLatitude, Location_getLongitude, Location_getSpeed, Location_getBearing, Location_getAltitude, Location_getTime, Location_getAccuracy; }; /** * @brief Free the android_vehicle * * @param priv * @returns nothing */ static void vehicle_android_destroy(struct vehicle_priv *priv) { dbg(0,"enter\n"); g_free(priv); } /** * @brief Provide the outside with information * * @param priv * @param type TODO: What can this be? * @param attr * @returns true/false */ static int vehicle_android_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { dbg(1,"enter %s\n",attr_to_name(type)); switch (type) { #if 0 case attr_position_fix_type: attr->u.num = priv->fix_type; break; #endif case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_radius: attr->u.numd = &priv->radius; break; #if 0 case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; #endif case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; if (!priv->have_coords) return 0; break; case attr_position_time_iso8601: attr->u.str=priv->fixiso8601; break; default: return 0; } dbg(1,"ok\n"); attr->type = type; return 1; } struct vehicle_methods vehicle_android_methods = { vehicle_android_destroy, vehicle_android_position_attr_get, }; static void vehicle_android_callback(struct vehicle_priv *v, jobject location) { time_t tnow; struct tm *tm; dbg(1,"enter\n"); v->geo.lat = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLatitude); v->geo.lng = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLongitude); v->speed = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getSpeed)*3.6; v->direction = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getBearing); v->height = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getAltitude); v->radius = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getAccuracy); tnow=(*jnienv)->CallLongMethod(jnienv, location, v->Location_getTime)/1000; tm = gmtime(&tnow); strftime(v->fixiso8601, sizeof(v->fixiso8601), "%Y-%m-%dT%TZ", tm); dbg(1,"lat %f lon %f time %s\n",v->geo.lat,v->geo.lng,v->fixiso8601); v->have_coords=1; callback_list_call_attr_0(v->cbl, attr_position_coord_geo); } static int vehicle_android_init(struct vehicle_priv *ret) { jmethodID cid; if (!android_find_class_global("android/location/Location", &ret->LocationClass)) return 0; if (!android_find_method(ret->LocationClass, "getLatitude", "()D", &ret->Location_getLatitude)) return 0; if (!android_find_method(ret->LocationClass, "getLongitude", "()D", &ret->Location_getLongitude)) return 0; if (!android_find_method(ret->LocationClass, "getSpeed", "()F", &ret->Location_getSpeed)) return 0; if (!android_find_method(ret->LocationClass, "getBearing", "()F", &ret->Location_getBearing)) return 0; if (!android_find_method(ret->LocationClass, "getAltitude", "()D", &ret->Location_getAltitude)) return 0; if (!android_find_method(ret->LocationClass, "getTime", "()J", &ret->Location_getTime)) return 0; if (!android_find_method(ret->LocationClass, "getAccuracy", "()F", &ret->Location_getAccuracy)) return 0; if (!android_find_class_global("org/navitproject/navit/NavitVehicle", &ret->NavitVehicleClass)) return 0; dbg(0,"at 3\n"); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "", "(Landroid/content/Context;I)V"); if (cid == NULL) { dbg(0,"no method found\n"); return 0; /* exception thrown */ } dbg(0,"at 4 android_activity=%p\n",android_activity); ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity, (int) ret->cb); dbg(0,"result=%p\n",ret->NavitVehicle); if (!ret->NavitVehicle) return 0; if (ret->NavitVehicle) ret->NavitVehicle = (*jnienv)->NewGlobalRef(jnienv, ret->NavitVehicle); return 1; } /** * @brief Create android_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_android_new_android(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; dbg(0, "enter\n"); ret = g_new0(struct vehicle_priv, 1); ret->cbl = cbl; ret->cb=callback_new_1(callback_cast(vehicle_android_callback), ret); *meth = vehicle_android_methods; vehicle_android_init(ret); dbg(0, "return\n"); return ret; } /** * @brief register vehicle_android * * @returns nothing */ void plugin_init(void) { dbg(0, "enter\n"); plugin_register_vehicle_type("android", vehicle_android_new_android); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/demo/000077500000000000000000000000001221777731700206645ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/demo/CMakeLists.txt000066400000000000000000000000601221777731700234200ustar00rootroot00000000000000module_add_library(vehicle_demo vehicle_demo.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/demo/Makefile.am000066400000000000000000000005201221777731700227150ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_demo if PLUGINS modulevehicle_LTLIBRARIES = libvehicle_demo.la else noinst_LTLIBRARIES = libvehicle_demo.la endif libvehicle_demo_la_SOURCES = vehicle_demo.c libvehicle_demo_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/vehicle/demo/vehicle_demo.c000066400000000000000000000164201221777731700234560ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #include "debug.h" #include "coord.h" #include "item.h" #include "navit.h" #include "map.h" #include "route.h" #include "callback.h" #include "transform.h" #include "plugin.h" #include "vehicle.h" #include "event.h" #include "util.h" struct vehicle_priv { int interval; int position_set; struct callback_list *cbl; struct navit *navit; struct route *route; struct coord_geo geo; struct coord last; double config_speed; double speed; double direction; struct callback *timer_callback; struct event_timeout *timer; char *timep; char *nmea; }; static void vehicle_demo_destroy(struct vehicle_priv *priv) { if (priv->timer) event_remove_timeout(priv->timer); callback_destroy(priv->timer_callback); g_free(priv->timep); g_free(priv); } static void nmea_chksum(char *nmea) { int i; if (nmea && strlen(nmea) > 3) { unsigned char csum=0; for (i = 1 ; i < strlen(nmea)-4 ; i++) csum^=(unsigned char)(nmea[i]); sprintf(nmea+strlen(nmea)-3,"%02X\n",csum); } } static int vehicle_demo_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { char ns='N',ew='E',*timep,*rmc,*gga; int hr,min,sec,year,mon,day; double lat,lng; switch (type) { case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_time_iso8601: g_free(priv->timep); priv->timep=current_to_iso8601(); attr->u.str=priv->timep; break; case attr_position_fix_type: attr->u.num = 2; break; case attr_position_sats_used: attr->u.num = 9; break; case attr_position_nmea: lat=priv->geo.lat; if (lat < 0) { lat=-lat; ns='S'; } lng=priv->geo.lng; if (lng < 0) { lng=-lng; ew='W'; } timep=current_to_iso8601(); sscanf(timep,"%d-%d-%dT%d:%d:%d",&year,&mon,&day,&hr,&min,&sec); g_free(timep); gga=g_strdup_printf("$GPGGA,%02d%02d%02d,%02.0f%07.4f,%c,%03.0f%07.4f,%c,1,08,2.5,0,M,,,,0000* \n",hr,min,sec,floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew); nmea_chksum(gga); rmc=g_strdup_printf("$GPRMC,%02d%02d%02d,A,%02.0f%07.4f,%c,%03.0f%07.4f,%c,%3.1f,%3.1f,%02d%02d%02d,,* \n",hr,min,sec,floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew,priv->speed/1.852,(double)priv->direction,day,mon,year%100); nmea_chksum(rmc); g_free(priv->nmea); priv->nmea=g_strdup_printf("%s%s",gga,rmc); g_free(gga); g_free(rmc); attr->u.str=priv->nmea; break; default: return 0; } attr->type = type; return 1; } static int vehicle_demo_set_attr_do(struct vehicle_priv *priv, struct attr *attr) { switch(attr->type) { case attr_navit: priv->navit = attr->u.navit; break; case attr_route: priv->route = attr->u.route; break; case attr_speed: priv->config_speed=attr->u.num; break; case attr_interval: priv->interval=attr->u.num; if (priv->timer) event_remove_timeout(priv->timer); priv->timer=event_add_timeout(priv->interval, 1, priv->timer_callback); break; case attr_position_coord_geo: priv->geo=*(attr->u.coord_geo); priv->position_set=1; dbg(1,"position_set %f %f\n", priv->geo.lat, priv->geo.lng); break; case attr_profilename: case attr_source: case attr_name: // Ignore; used by Navit's infrastructure, but not relevant for this vehicle. break; default: dbg(0,"unsupported attribute %s\n",attr_to_name(attr->type)); return 0; } return 1; } static int vehicle_demo_set_attr(struct vehicle_priv *priv, struct attr *attr) { return vehicle_demo_set_attr_do(priv, attr); } struct vehicle_methods vehicle_demo_methods = { vehicle_demo_destroy, vehicle_demo_position_attr_get, vehicle_demo_set_attr, }; static void vehicle_demo_timer(struct vehicle_priv *priv) { struct coord c, c2, pos, ci; int slen, len, dx, dy; struct route *route=NULL; struct map *route_map=NULL; struct map_rect *mr=NULL; struct item *item=NULL; len = (priv->config_speed * priv->interval / 1000)/ 3.6; dbg(1, "###### Entering simulation loop\n"); if (!priv->config_speed) return; if (priv->route) route=priv->route; else if (priv->navit) route=navit_get_route(priv->navit); if (route) route_map=route_get_map(route); if (route_map) mr=map_rect_new(route_map, NULL); if (mr) item=map_rect_get_item(mr); if (item && item->type == type_route_start) item=map_rect_get_item(mr); while(item && item->type!=type_street_route) item=map_rect_get_item(mr); if (item && item_coord_get(item, &pos, 1)) { priv->position_set=0; dbg(1, "current pos=0x%x,0x%x\n", pos.x, pos.y); dbg(1, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y); if (priv->last.x == pos.x && priv->last.y == pos.y) { dbg(1, "endless loop\n"); } priv->last = pos; while (item && priv->config_speed) { if (!item_coord_get(item, &c, 1)) { item=map_rect_get_item(mr); continue; } dbg(1, "next pos=0x%x,0x%x\n", c.x, c.y); slen = transform_distance(projection_mg, &pos, &c); dbg(1, "len=%d slen=%d\n", len, slen); if (slen < len) { len -= slen; pos = c; } else { if (item_coord_get(item, &c2, 1) || map_rect_get_item(mr)) { dx = c.x - pos.x; dy = c.y - pos.y; ci.x = pos.x + dx * len / slen; ci.y = pos.y + dy * len / slen; priv->direction = transform_get_angle_delta(&pos, &c, 0); priv->speed=priv->config_speed; } else { ci.x = pos.x; ci.y = pos.y; priv->speed=0; dbg(0,"destination reached\n"); } dbg(1, "ci=0x%x,0x%x\n", ci.x, ci.y); transform_to_geo(projection_mg, &ci, &priv->geo); callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); break; } } } else { if (priv->position_set) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } if (mr) map_rect_destroy(mr); } static struct vehicle_priv * vehicle_demo_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; dbg(1, "enter\n"); ret = g_new0(struct vehicle_priv, 1); ret->cbl = cbl; ret->interval=1000; ret->config_speed=40; ret->timer_callback=callback_new_1(callback_cast(vehicle_demo_timer), ret); *meth = vehicle_demo_methods; while (attrs && *attrs) vehicle_demo_set_attr_do(ret, *attrs++); if (!ret->timer) ret->timer=event_add_timeout(ret->interval, 1, ret->timer_callback); return ret; } void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("demo", vehicle_demo_new); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/000077500000000000000000000000001221777731700206575ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/CMakeLists.txt000066400000000000000000000005231221777731700234170ustar00rootroot00000000000000module_add_library(vehicle_file vehicle_file.c) set (vehicle_pipe_TYPE ${vehicle_file_TYPE}) set (vehicle_serial_TYPE ${vehicle_file_TYPE}) set (vehicle_socket_TYPE ${vehicle_file_TYPE}) module_add_library(vehicle_pipe vehicle_pipe.c) module_add_library(vehicle_serial vehicle_serial.c) module_add_library(vehicle_socket vehicle_socket.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/Makefile.am000066400000000000000000000016111221777731700227120ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit modulevehicle_LTLIBRARIES = libvehicle_file.la libvehicle_pipe.la libvehicle_socket.la libvehicle_serial.la libvehicle_file_la_CFLAGS=-DMODULE=vehicle_file libvehicle_file_la_SOURCES = vehicle_file.c libvehicle_file_la_LDFLAGS = -module -avoid-version @NAVIT_SOCKET_LDFLAGS@ @NAVIT_MODULE_LDFLAGS@ libvehicle_pipe_la_CFLAGS=-DMODULE=vehicle_pipe libvehicle_pipe_la_SOURCES = vehicle_pipe.c libvehicle_pipe_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ libvehicle_socket_la_CFLAGS=-DMODULE=vehicle_socket libvehicle_socket_la_SOURCES = vehicle_socket.c libvehicle_socket_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ libvehicle_serial_la_CFLAGS=-DMODULE=vehicle_serial libvehicle_serial_la_SOURCES = vehicle_serial.c libvehicle_serial_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/vehicle_file.c000066400000000000000000000757011221777731700234530ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #include #include #include #include #include #ifdef _WIN32 #include #else #include #endif #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "event.h" #include "vehicle.h" #include "file.h" #ifdef HAVE_SOCKET #include #include #include #include #endif #ifdef HAVE_WINSOCK #include int inet_aton(const char *cp, struct in_addr *inp); int inet_aton(const char *cp, struct in_addr *inp) { unsigned long addr = inet_addr(cp); inp->S_un.S_addr = addr; return addr!=-1; } #endif static void vehicle_file_disable_watch(struct vehicle_priv *priv); static void vehicle_file_enable_watch(struct vehicle_priv *priv); static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer); static int vehicle_file_open(struct vehicle_priv *priv); static void vehicle_file_close(struct vehicle_priv *priv); enum file_type { file_type_pipe = 1, file_type_device, file_type_file, file_type_socket, file_type_serial }; static int buffer_size = 1024; struct gps_sat { int prn; int elevation; int azimuth; int snr; }; struct vehicle_priv { char *source; struct callback_list *cbl; int fd; struct callback *cb,*cbt; char *buffer; int buffer_pos; char *nmea_data; char *nmea_data_buf; struct coord_geo geo; double speed; double direction; double height; double hdop; double vdop; char fixtime[20]; int fixyear; int fixmonth; int fixday; int status; int sats_used; int sats_visible; int sats_signal; int time; int on_eof; #ifdef _WIN32 int no_data_count; struct event_timeout * timeout; struct callback *timeout_callback; #endif enum file_type file_type; FILE *file; struct event_watch *watch; speed_t baudrate; struct attr ** attrs; char fixiso8601[128]; int checksum_ignore; int magnetic_direction; int current_count; struct gps_sat current[24]; int next_count; struct gps_sat next[24]; struct item sat_item; int valid; char *statefile; int process_statefile; }; //*************************************************************************** /** @fn static int vehicle_win32_serial_track(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Callback of the plugin ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @return always 1 ***************************************************************************** **/ #ifdef _WIN32 static int vehicle_win32_serial_track(struct vehicle_priv *priv) { static char buffer[2048] = {0,}; static int current_index = 0; const int chunk_size = 1024; int rc = 0; int dwBytes; dbg(1, "enter, *priv='%x', priv->source='%s'\n", priv, priv->source); if ( priv->no_data_count > 5 ) { vehicle_file_close( priv ); priv->no_data_count = 0; vehicle_file_open( priv ); vehicle_file_enable_watch(priv); } //if ( priv->fd <= 0 ) //{ // vehicle_file_open( priv ); //} if ( current_index >= ( sizeof( buffer ) - chunk_size ) ) { // discard current_index = 0; memset( buffer, 0 , sizeof( buffer ) ); } dwBytes = serial_io_read( priv->fd, &buffer[ current_index ], chunk_size ); if ( dwBytes > 0 ) { char* return_pos = NULL; current_index += dwBytes; while ( ( return_pos = strchr( buffer, '\n' ) ) != NULL ) { char return_buffer[1024]; int bytes_to_copy = return_pos - buffer + 1; memcpy( return_buffer, buffer, bytes_to_copy ); return_buffer[ bytes_to_copy + 1 ] = '\0'; return_buffer[ bytes_to_copy ] = '\0'; // printf( "received %d : '%s' bytes to copy\n", bytes_to_copy, return_buffer ); rc += vehicle_file_parse( priv, return_buffer ); current_index -= bytes_to_copy; memmove( buffer, &buffer[ bytes_to_copy ] , sizeof( buffer ) - bytes_to_copy ); } if (rc) { priv->no_data_count = 0; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); if (rc > 1) dbg(0, "Can not keep with gps data delay is %d seconds\n", rc - 1); } } else { priv->no_data_count++; } dbg(2, "leave, return '1', priv->no_data_count='%d'\n", priv->no_data_count); return 1; } #endif //*************************************************************************** /** @fn static int vehicle_file_open(struct vehicle_priv *priv) ***************************************************************************** * @b Description: open dialogue with the GPS ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @return 1 if ok * 0 if error ***************************************************************************** **/ static int vehicle_file_open(struct vehicle_priv *priv) { char *name; #ifndef _WIN32 struct termios tio; #else #define O_NDELAY 0 #endif name = priv->source + 5; if (!strncmp(priv->source, "file:", 5)) { priv->fd = open(name, O_RDONLY | O_NDELAY); if (priv->fd < 0) return 0; if (file_is_reg(name)) { priv->file_type = file_type_file; } #ifndef _WIN32 else { tcgetattr(priv->fd, &tio); cfmakeraw(&tio); cfsetispeed(&tio, priv->baudrate); cfsetospeed(&tio, priv->baudrate); tio.c_cc[VMIN] = 0; tio.c_cc[VTIME] = 200; tcsetattr(priv->fd, TCSANOW, &tio); priv->file_type = file_type_device; } } else if (!strncmp(priv->source,"pipe:", 5)) { priv->file = popen(name, "r"); if (!priv->file) return 0; priv->fd = fileno(priv->file); priv->file_type = file_type_pipe; #endif //!_WIN32 #if defined(HAVE_SOCKET) || defined(HAVE_WINSOCK) } else if (!strncmp(priv->source,"socket:", 7)) { #ifdef _WIN32 WSADATA wsi; WSAStartup(0x00020002,&wsi); #endif char *p,*s=g_strdup(priv->source+7); struct sockaddr_in sin; p=strchr(s,':'); if (!p) { dbg(0,"port number missing in %s\n",s); g_free(s); return 0; } *p++='\0'; sin.sin_family=AF_INET; sin.sin_port=ntohs(atoi(p)); if (!inet_aton(s, &sin.sin_addr)) { dbg(0,"failed to parse %s\n",s); g_free(s); return 0; } priv->fd = socket(PF_INET, SOCK_STREAM, 0); if (priv->fd != -1) { if (connect(priv->fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { dbg(0,"failed to connect to %s:%s\n",s,p); g_free(s); return 0; } } p=strchr(p,':'); if (p) { p++; write(priv->fd, p, strlen(p)); } priv->file_type = file_type_socket; #endif //HAVE_SOCKET } else if (!strncmp(priv->source,"serial:",7)) { #ifdef _WIN32 char* raw_setting_str = g_strdup( priv->source ); char* strport = strchr(raw_setting_str, ':' ); char* strsettings = strchr(raw_setting_str, ' ' ); if ( strport && strsettings ) { strport++; *strsettings = '\0'; strsettings++; priv->fd=serial_io_init( strport, strsettings ); } g_free( raw_setting_str ); priv->file_type = file_type_serial; // Add the callback dbg(2, "Add the callback ...\n", priv->source); priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv); #else //TODO - add linux serial #endif //!_WIN32 } return(priv->fd != -1); } //*************************************************************************** /** @fn static void vehicle_file_close(struct vehicle_priv *priv) ***************************************************************************** * @b Description: close dialogue with the GPS ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** **/ static void vehicle_file_close(struct vehicle_priv *priv) { dbg(1, "enter, priv->fd='%d'\n", priv->fd); vehicle_file_disable_watch(priv); #ifdef _WIN32 if(priv->file_type == file_type_serial) { if (priv->timeout_callback) { callback_destroy(priv->timeout_callback); priv->timeout_callback=NULL; // dangling pointer! prevent double freeing. } serial_io_shutdown( priv->fd ); } else #endif { if (priv->file) { #ifndef _MSC_VER pclose(priv->file); #endif /* _MSC_VER */ } else if (priv->fd >= 0) { close(priv->fd); } priv->file = NULL; priv->fd = -1; } } //*************************************************************************** /** @fn static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Enable watch timer to get GPS data ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @return always 0 ***************************************************************************** **/ static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv) { dbg(1, "enter\n"); vehicle_file_enable_watch(priv); return FALSE; } //*************************************************************************** /** @fn static int vehicle_file_parse( struct vehicle_priv *priv, * char *buffer) ***************************************************************************** * @b Description: Parse the buffer ***************************************************************************** * @param priv : pointer on the private data of the plugin * @param buffer : data buffer (null terminated) ***************************************************************************** * @return 1 if The GPRMC Sentence is found * 0 if not found ***************************************************************************** **/ static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer) { char *nmea_data_buf, *p, *item[32]; double lat, lng; int i, j, bcsum; int len = strlen(buffer); unsigned char csum = 0; int valid=0; int ret = 0; dbg(2, "enter: buffer='%s'\n", buffer); for (;;) { if (len < 4) { dbg(0, "'%s' too short\n", buffer); return ret; } if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { buffer[--len] = '\0'; if (buffer[len - 1] == '\r') buffer[--len] = '\0'; } else break; } if (buffer[0] != '$') { dbg(0, "no leading $ in '%s'\n", buffer); return ret; } if (buffer[len - 3] != '*') { dbg(0, "no *XX in '%s'\n", buffer); return ret; } for (i = 1; i < len - 3; i++) { csum ^= (unsigned char) (buffer[i]); } if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) { dbg(0, "no checksum in '%s'\n", buffer); return ret; } if (bcsum != csum && priv->checksum_ignore == 0) { dbg(0, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum); return ret; } if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(0, "nmea buffer overflow (len %d), discarding '%s'\n", priv->nmea_data_buf?strlen(priv->nmea_data_buf):-1,buffer); } i = 0; p = buffer; while (i < 31) { item[i++] = p; while (*p && *p != ',') p++; if (!*p) break; *p++ = '\0'; } if (!strncmp(buffer, "$GPGGA", 6)) { /* 1 1111 0 1 2 3 4 5 6 7 8 9 0 1234 $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] */ if (*item[2] && *item[3] && *item[4] && *item[5]) { lat = g_ascii_strtod(item[2], NULL); priv->geo.lat = floor(lat / 100); lat -= priv->geo.lat * 100; priv->geo.lat += lat / 60; if (!g_ascii_strcasecmp(item[3],"S")) priv->geo.lat=-priv->geo.lat; lng = g_ascii_strtod(item[4], NULL); priv->geo.lng = floor(lng / 100); lng -= priv->geo.lng * 100; priv->geo.lng += lng / 60; if (!g_ascii_strcasecmp(item[5],"W")) priv->geo.lng=-priv->geo.lng; priv->valid=attr_position_valid_valid; dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); } else priv->valid=attr_position_valid_invalid; if (*item[6]) sscanf(item[6], "%d", &priv->status); if (*item[7]) sscanf(item[7], "%d", &priv->sats_used); if (*item[8]) sscanf(item[8], "%lf", &priv->hdop); if (*item[1]) strncpy(priv->fixtime, item[1], sizeof(priv->fixtime)); if (*item[9]) sscanf(item[9], "%lf", &priv->height); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; if (priv->file_type == file_type_file) { if (priv->watch) { vehicle_file_disable_watch(priv); event_add_timeout(priv->time, 0, priv->cbt); } } } if (!strncmp(buffer, "$GPVTG", 6)) { /* 0 1 2 34 5 6 7 8 $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] */ if (item[1] && item[7]) valid = 1; if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[1], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); dbg(2,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed); } } if (!strncmp(buffer, "$GPRMC", 6)) { /* 1 1 0 1 2 3 4 5 6 7 8 9 0 1 $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], magnetic variation[10],magnetic variation direction[11] */ if (*item[2] == 'A') valid = 1; if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[8], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); priv->speed *= 1.852; sscanf(item[9], "%02d%02d%02d", &priv->fixday, &priv->fixmonth, &priv->fixyear); priv->fixyear += 2000; } ret = 1; } if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { /* 0 GSV Satellites in view 1 2 Number of sentences for full data 2 1 sentence 1 of 2 3 08 Number of satellites in view 4 01 Satellite PRN number 5 40 Elevation, degrees 6 083 Azimuth, degrees 7 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * */ if (item[3]) { sscanf(item[3], "%d", &priv->sats_visible); } j=4; while (j+4 <= i && priv->current_count < 24) { struct gps_sat *sat=&priv->next[priv->next_count++]; sat->prn=atoi(item[j]); sat->elevation=atoi(item[j+1]); sat->azimuth=atoi(item[j+2]); sat->snr=atoi(item[j+3]); j+=4; } if (!strcmp(item[1], item[2])) { priv->sats_signal=0; for (i = 0 ; i < priv->next_count ; i++) { priv->current[i]=priv->next[i]; if (priv->current[i].snr) priv->sats_signal++; } priv->current_count=priv->next_count; priv->next_count=0; } } if (!strncmp(buffer, "$GPZDA", 6)) { /* 0 1 2 3 4 5 6 $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC hhmmss HrMinSec(UTC) dd,mm,yyy Day,Month,Year xx local zone hours -13..13 yy local zone minutes 0..59 */ if (item[1] && item[2] && item[3] && item[4]) { strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); priv->fixday = atoi(item[2]); priv->fixmonth = atoi(item[3]); priv->fixyear = atoi(item[4]); } } if (!strncmp(buffer, "$IISMD", 6)) { /* 0 1 2 3 4 $IISMD,dir,press,height,temp*CC" dir Direction (0-359) press Pressure (hpa, i.e. 1032) height Barometric height above ground (meter) temp Temperature (Degree Celsius) */ if (item[1]) { priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); dbg(1,"magnetic %d\n", priv->magnetic_direction); } } return ret; } //*************************************************************************** /** @fn static void vehicle_file_io(struct vehicle_priv *priv) ***************************************************************************** * @b Description: function to get data from GPS ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @remarks ***************************************************************************** **/ static void vehicle_file_io(struct vehicle_priv *priv) { int size, rc = 0; char *str, *tok; dbg(1, "vehicle_file_io : enter\n"); if (priv->process_statefile) { unsigned char *data; priv->process_statefile=0; if (file_get_contents(priv->statefile, &data, &size)) { if (size > buffer_size) size=buffer_size; memcpy(priv->buffer, data, size); priv->buffer_pos=0; g_free(data); } else return; } else { size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); } if (size <= 0) { switch (priv->on_eof) { case 0: vehicle_file_close(priv); vehicle_file_open(priv); break; case 1: vehicle_file_disable_watch(priv); break; case 2: exit(0); break; } return; } priv->buffer_pos += size; priv->buffer[priv->buffer_pos] = '\0'; dbg(1, "size=%d pos=%d buffer='%s'\n", size, priv->buffer_pos, priv->buffer); str = priv->buffer; while ((tok = strchr(str, '\n'))) { *tok++ = '\0'; dbg(1, "line='%s'\n", str); rc +=vehicle_file_parse(priv, str); str = tok; if (priv->file_type == file_type_file && rc) break; } if (str != priv->buffer) { size = priv->buffer + priv->buffer_pos - str; memmove(priv->buffer, str, size + 1); priv->buffer_pos = size; dbg(1, "now pos=%d buffer='%s'\n", priv->buffer_pos, priv->buffer); } else if (priv->buffer_pos == buffer_size - 1) { dbg(0, "Overflow. Most likely wrong baud rate or no nmea protocol\n"); priv->buffer_pos = 0; } if (rc) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } //*************************************************************************** /** @fn static void vehicle_file_enable_watch(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Enable watch ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** **/ static void vehicle_file_enable_watch(struct vehicle_priv *priv) { dbg(1, "enter\n"); #ifdef _WIN32 // add an event : don't use glib timers and g_timeout_add if (priv->file_type == file_type_serial) { if (priv->timeout_callback != NULL) priv->timeout = event_add_timeout(500, 1, priv->timeout_callback); else dbg(1, "error : watch not enabled : priv->timeout_callback is null\n"); } else #endif { if (! priv->watch) priv->watch = event_add_watch((void *)priv->fd, event_watch_cond_read, priv->cb); } } //*************************************************************************** /** @fn static void vehicle_file_disable_watch(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Disable watch ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** **/ static void vehicle_file_disable_watch(struct vehicle_priv *priv) { dbg(1, "vehicle_file_disable_watch : enter\n"); #ifdef _WIN32 if(priv->file_type == file_type_serial) { if (priv->timeout) { event_remove_timeout(priv->timeout); priv->timeout=NULL; // dangling pointer! prevent double freeing. } } else #endif //!_WIN32 { if (priv->watch) event_remove_watch(priv->watch); priv->watch = NULL; } } //*************************************************************************** /** @fn static void vehicle_priv vehicle_file_destroy(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Function called to uninitialize the plugin ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @remarks private data is freed by this function (g_free) ***************************************************************************** **/ static void vehicle_file_destroy(struct vehicle_priv *priv) { if (priv->statefile && priv->nmea_data) { struct attr readwrite={attr_readwrite}; struct attr create={attr_create}; struct attr *attrs[]={&readwrite,&create,NULL}; struct file *f; readwrite.u.num=1; create.u.num=1; f=file_create(priv->statefile, attrs); if (f) { file_data_write(f, 0, strlen(priv->nmea_data), priv->nmea_data); file_fsync(f); file_destroy(f); } } vehicle_file_close(priv); callback_destroy(priv->cb); callback_destroy(priv->cbt); if (priv->statefile) g_free(priv->statefile); if (priv->source) g_free(priv->source); if (priv->buffer) g_free(priv->buffer); g_free(priv); } //*************************************************************************** /** @fn static int vehicle_file_position_attr_get(struct vehicle_priv *priv, * enum attr_type type, * struct attr *attr) ***************************************************************************** * @b Description: Function called to get attribute ***************************************************************************** * @param priv : pointer on the private data of the plugin * @param type : attribute type called * @param attr : structure to return the attribute value ***************************************************************************** * @return 1 if ok * 0 for unkown or invalid attribute ***************************************************************************** **/ static int vehicle_file_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_fix_type: attr->u.num = priv->status; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_magnetic_direction: attr->u.num = priv->magnetic_direction; break; case attr_position_hdop: attr->u.numd = &priv->hdop; break; case attr_position_qual: attr->u.num = priv->sats_visible; break; case attr_position_sats_signal: attr->u.num = priv->sats_signal; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_nmea: attr->u.str=priv->nmea_data; if (! attr->u.str) return 0; break; case attr_position_time_iso8601: if (!priv->fixyear || !priv->fixtime[0]) return 0; sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ", priv->fixyear, priv->fixmonth, priv->fixday, priv->fixtime, (priv->fixtime+2), (priv->fixtime+4)); attr->u.str=priv->fixiso8601; break; case attr_position_sat_item: dbg(0,"at here\n"); priv->sat_item.id_lo++; if (priv->sat_item.id_lo > priv->current_count) { priv->sat_item.id_lo=0; return 0; } attr->u.item=&priv->sat_item; break; case attr_position_valid: attr->u.num=priv->valid; break; default: return 0; } if (type != attr_position_sat_item) priv->sat_item.id_lo=0; attr->type = type; return 1; } //*************************************************************************** /** @fn static int vehicle_file_sat_attr_get(struct vehicle_priv *priv, * enum attr_type type, * struct attr *attr) ***************************************************************************** * @b Description: Function called to get satellite attribute ***************************************************************************** * @param priv : pointer on the private data of the plugin * @param type : attribute type called * @param attr : structure to return the attribute value ***************************************************************************** * @return 1 if ok * 0 for unkown attribute ***************************************************************************** **/ static int vehicle_file_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) { struct gps_sat *sat; struct vehicle_priv *priv=priv_data; if (priv->sat_item.id_lo < 1) return 0; if (priv->sat_item.id_lo > priv->current_count) return 0; sat=&priv->current[priv->sat_item.id_lo-1]; switch (type) { case attr_sat_prn: attr->u.num=sat->prn; break; case attr_sat_elevation: attr->u.num=sat->elevation; break; case attr_sat_azimuth: attr->u.num=sat->azimuth; break; case attr_sat_snr: attr->u.num=sat->snr; break; default: return 0; } attr->type = type; return 1; } static struct item_methods vehicle_file_sat_methods = { NULL, NULL, NULL, vehicle_file_sat_attr_get, }; static struct vehicle_methods vehicle_file_methods = { vehicle_file_destroy, vehicle_file_position_attr_get, }; //*************************************************************************** /** @fn static struct vehicle_priv * vehicle_file_new_file( * struct vehicle_methods *meth, * struct callback_list *cbl, * struct attr **attrs) ***************************************************************************** * @b Description: Function called to initialize the plugin ***************************************************************************** * @param meth : ? * @param cbl : ? * @param attrs : ? ***************************************************************************** * @return pointer on the private data of the plugin ***************************************************************************** * @remarks private data is allocated by this function (g_new0) ***************************************************************************** **/ static struct vehicle_priv * vehicle_file_new_file(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source; struct attr *time; struct attr *on_eof; struct attr *baudrate; struct attr *checksum_ignore; struct attr *state_file; dbg(1, "enter\n"); source = attr_search(attrs, NULL, attr_source); if(source == NULL){ dbg(0,"Missing source attribute"); return NULL; } ret = g_new0(struct vehicle_priv, 1); // allocate and initialize to 0 ret->fd = -1; ret->cbl = cbl; ret->source = g_strdup(source->u.str); ret->buffer = g_malloc(buffer_size); ret->time=1000; ret->baudrate=B4800; state_file=attr_search(attrs, NULL, attr_state_file); if (state_file) ret->statefile=g_strdup(state_file->u.str); time = attr_search(attrs, NULL, attr_time); if (time) ret->time=time->u.num; baudrate = attr_search(attrs, NULL, attr_baudrate); if (baudrate) { switch (baudrate->u.num) { case 4800: ret->baudrate=B4800; break; case 9600: ret->baudrate=B9600; break; case 19200: ret->baudrate=B19200; break; #ifdef B38400 case 38400: ret->baudrate=B38400; break; #endif #ifdef B57600 case 57600: ret->baudrate=B57600; break; #endif #ifdef B115200 case 115200: ret->baudrate=B115200; break; #endif } } checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore); if (checksum_ignore) ret->checksum_ignore=checksum_ignore->u.num; ret->attrs = attrs; on_eof = attr_search(attrs, NULL, attr_on_eof); if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "stop")) ret->on_eof=1; if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "exit")) ret->on_eof=2; dbg(0,"on_eof=%d\n", ret->on_eof); *meth = vehicle_file_methods; ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret); ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret); if (ret->statefile && file_exists(ret->statefile)) { ret->process_statefile=1; event_add_timeout(1000, 0, ret->cb); } ret->sat_item.type=type_position_sat; ret->sat_item.id_hi=ret->sat_item.id_lo=0; ret->sat_item.priv_data=ret; ret->sat_item.meth=&vehicle_file_sat_methods; #ifdef _WIN32 ret->no_data_count = 0; #endif dbg(1, "vehicle_file_new_file:open\n"); if (!vehicle_file_open(ret)) { dbg(0, "Failed to open '%s'\n", ret->source); } vehicle_file_enable_watch(ret); // vehicle_file_destroy(ret); // return NULL; dbg(1, "leave\n"); return ret; } //*************************************************************************** /** @fn void plugin_init(void) ***************************************************************************** * @b Description: Initialisation of vehicle_file plugin ***************************************************************************** **/ void plugin_init(void) { dbg(1, "vehicle_file:plugin_init:enter\n"); plugin_register_vehicle_type("file", vehicle_file_new_file); plugin_register_vehicle_type("pipe", vehicle_file_new_file); plugin_register_vehicle_type("socket", vehicle_file_new_file); plugin_register_vehicle_type("serial", vehicle_file_new_file); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/vehicle_pipe.c000066400000000000000000000015201221777731700234550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "plugin.h" void plugin_init(void) { plugin_get_vehicle_type("file"); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/vehicle_serial.c000066400000000000000000000015201221777731700237770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "plugin.h" void plugin_init(void) { plugin_get_vehicle_type("file"); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/file/vehicle_socket.c000066400000000000000000000015201221777731700240100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "plugin.h" void plugin_init(void) { plugin_get_vehicle_type("file"); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd/000077500000000000000000000000001221777731700206755ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd/CMakeLists.txt000066400000000000000000000000601221777731700234310ustar00rootroot00000000000000module_add_library(vehicle_gpsd vehicle_gpsd.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd/Makefile.am000066400000000000000000000004771221777731700227410ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @GPSBT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd modulevehicle_LTLIBRARIES = libvehicle_gpsd.la libvehicle_gpsd_la_SOURCES = vehicle_gpsd.c libvehicle_gpsd_la_LIBADD = @GPSD_LIBS@ @GPSBT_LIBS@ libvehicle_gpsd_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd/vehicle_gpsd.c000066400000000000000000000252601221777731700235020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #ifdef HAVE_GPSBT #include #include #endif #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" #include "types.h" static struct vehicle_priv { char *source; char *gpsd_query; struct callback_list *cbl; struct callback *cb, *cbt; struct event_watch *evwatch; guint retry_interval; struct gps_data_t *gps; struct coord_geo geo; double speed; double direction; double height; double hdop; int status; int fix_type; time_t fix_time; int sats; int sats_signal; int sats_used; char *nmea_data; char *nmea_data_buf; struct event_timeout *retry_timer2; struct attr ** attrs; char fixiso8601[128]; #ifdef HAVE_GPSBT gpsbt_t context; #endif } *vehicle_last; #define DEFAULT_RETRY_INTERVAL 10 // seconds #define MIN_RETRY_INTERVAL 1 // seconds static void vehicle_gpsd_io(struct vehicle_priv *priv); static void vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len) { char *pos,*nmea_data_buf; int i=0,sats_signal=0; struct vehicle_priv *priv = vehicle_last; if( len > 0 && buf[0] == '$' ) { char buffer[len+2]; buffer[len+1]='\0'; memcpy(buffer, buf, len); pos=strchr(buffer,'\n'); if(!pos) { pos=strchr(buffer,'\r'); } if (pos) { *pos ='\n'; *++pos='\0'; if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); } } } dbg(1,"data->set="LONGLONG_HEX_FMT"\n", data->set); if (data->set & SPEED_SET) { priv->speed = data->fix.speed * 3.6; if(!isnan(data->fix.speed)) callback_list_call_attr_0(priv->cbl, attr_position_speed); data->set &= ~SPEED_SET; } if (data->set & TRACK_SET) { priv->direction = data->fix.track; data->set &= ~TRACK_SET; } if (data->set & ALTITUDE_SET) { priv->height = data->fix.altitude; data->set &= ~ALTITUDE_SET; } if (data->set & SATELLITE_SET) { if(data->satellites_visible > 0) { sats_signal=0; for( i=0;isatellites_visible;i++) { if (data->ss[i] > 0) sats_signal++; } } if (priv->sats_used != data->satellites_used || priv->sats != data->satellites_visible || priv->sats_signal != sats_signal ) { priv->sats_used = data->satellites_used; priv->sats = data->satellites_visible; priv->sats_signal = sats_signal; callback_list_call_attr_0(priv->cbl, attr_position_sats); } data->set &= ~SATELLITE_SET; } if (data->set & STATUS_SET) { priv->status = data->status; data->set &= ~STATUS_SET; } if (data->set & MODE_SET) { priv->fix_type = data->fix.mode - 1; data->set &= ~MODE_SET; } if (data->set & TIME_SET) { priv->fix_time = data->fix.time; data->set &= ~TIME_SET; } if (data->set & DOP_SET) { dbg(1, "pdop : %g\n", data->dop.pdop); priv->hdop = data->dop.pdop; data->set &= ~DOP_SET; } if (data->set & LATLON_SET) { priv->geo.lat = data->fix.latitude; priv->geo.lng = data->fix.longitude; dbg(1,"lat=%f lng=%f\n", priv->geo.lat, priv->geo.lng); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; data->set &= ~LATLON_SET; } // If data->fix.speed is NAN, then the drawing gets jumpy. if (! isnan(data->fix.speed) && priv->fix_type > 0) { callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } dbg(2,"speed ok\n"); } /** * Attempt to open the gps device. * Return FALSE if retry not required * Return TRUE to try again */ static int vehicle_gpsd_try_open(struct vehicle_priv *priv) { char *source = g_strdup(priv->source); char *colon = index(source + 7, ':'); char *port=NULL; if (colon) { *colon = '\0'; port=colon+1; } dbg(0,"Trying to connect to %s:%s\n",source+7,port?port:"default"); /* gps_open returns 0 on success */ if (gps_open(source + 7, port, priv->gps)) { dbg(0,"gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?\n", priv->source, priv->retry_interval); g_free(source); return TRUE; } g_free(source); if (strchr(priv->gpsd_query,'r')) gps_stream(priv->gps, WATCH_ENABLE|WATCH_NMEA|WATCH_JSON, NULL); else gps_stream(priv->gps, WATCH_ENABLE|WATCH_JSON, NULL); priv->cb = callback_new_1(callback_cast(vehicle_gpsd_io), priv); priv->cbt = callback_new_1(callback_cast(vehicle_gpsd_try_open), priv); priv->evwatch = event_add_watch((void *)priv->gps->gps_fd, event_watch_cond_read, priv->cb); if (!priv->gps->gps_fd) { dbg(0,"Warning: gps_fd is 0, most likely you have used a gps.h incompatible to libgps"); } dbg(0,"Connected to gpsd fd=%d evwatch=%p\n", priv->gps->gps_fd, priv->evwatch); event_remove_timeout(priv->retry_timer2); priv->retry_timer2=NULL; return FALSE; } /** * Open a connection to gpsd. Will re-try the connection if it fails */ static void vehicle_gpsd_open(struct vehicle_priv *priv) { #ifdef HAVE_GPSBT char errstr[256] = ""; /* We need to start gpsd (via gpsbt) first. */ errno = 0; memset(&priv->context, 0, sizeof(gpsbt_t)); if(gpsbt_start(NULL, 0, 0, 0, errstr, sizeof(errstr), 0, &priv->context) < 0) { dbg(0,"Error connecting to GPS with gpsbt: (%d) %s (%s)\n", errno, strerror(errno), errstr); } sleep(1); /* give gpsd time to start */ dbg(1,"gpsbt_start: completed\n"); #endif priv->retry_timer2=NULL; if (vehicle_gpsd_try_open(priv)) priv->retry_timer2=event_add_timeout(priv->retry_interval*1000, 1, priv->cbt); } static void vehicle_gpsd_close(struct vehicle_priv *priv) { #ifdef HAVE_GPSBT int err; #endif if (priv->retry_timer2) { event_remove_timeout(priv->retry_timer2); priv->retry_timer2=NULL; } if (priv->evwatch) { event_remove_watch(priv->evwatch); priv->evwatch = NULL; } if (priv->cb) { callback_destroy(priv->cb); priv->cb = NULL; } if (priv->cbt) { callback_destroy(priv->cbt); priv->cbt = NULL; } if (priv->gps) { gps_close(priv->gps); g_free(priv->gps); priv->gps = NULL; } #ifdef HAVE_GPSBT err = gpsbt_stop(&priv->context); if (err < 0) { dbg(0,"Error %d while gpsbt_stop", err); } dbg(1,"gpsbt_stop: completed, (%d)",err); #endif } static void vehicle_gpsd_io(struct vehicle_priv *priv) { dbg(1, "enter\n"); if (priv->gps) { vehicle_last = priv; if(gps_read(priv->gps)==-1) { dbg(0,"gps_poll failed\n"); vehicle_gpsd_close(priv); vehicle_gpsd_open(priv); } else { const char *buf; buf = gps_data(priv->gps); vehicle_gpsd_callback(priv->gps,buf,strlen(buf)); } } } static void vehicle_gpsd_destroy(struct vehicle_priv *priv) { vehicle_gpsd_close(priv); if (priv->source) g_free(priv->source); if (priv->gpsd_query) g_free(priv->gpsd_query); g_free(priv->gps); g_free(priv); } static int vehicle_gpsd_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { struct attr * active=NULL; switch (type) { case attr_position_fix_type: attr->u.num = priv->fix_type; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_hdop: attr->u.numd = &priv->hdop; break; case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_signal: attr->u.num = priv->sats_signal; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_nmea: attr->u.str=priv->nmea_data; if (! attr->u.str) return 0; break; case attr_position_time_iso8601: { struct tm tm; if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } break; case attr_active: active = attr_search(priv->attrs,NULL,attr_active); if(active != NULL) { attr->u.num=active->u.num; return 1; } else return 0; break; default: return 0; } attr->type = type; return 1; } static struct vehicle_methods vehicle_gpsd_methods = { vehicle_gpsd_destroy, vehicle_gpsd_position_attr_get, }; static struct vehicle_priv * vehicle_gpsd_new_gpsd(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source, *query, *retry_int; dbg(1, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->gps = g_new0(struct gps_data_t, 1); ret->source = g_strdup(source->u.str); query = attr_search(attrs, NULL, attr_gpsd_query); if (query) { ret->gpsd_query = g_strconcat(query->u.str, "\n", NULL); } else { ret->gpsd_query = g_strdup("w+x\n"); } dbg(1,"Format string for gpsd_query: %s\n",ret->gpsd_query); retry_int = attr_search(attrs, NULL, attr_retry_interval); if (retry_int) { ret->retry_interval = retry_int->u.num; if (ret->retry_interval < MIN_RETRY_INTERVAL) { dbg(0, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL); ret->retry_interval = MIN_RETRY_INTERVAL; } } else { dbg(1, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL); ret->retry_interval = DEFAULT_RETRY_INTERVAL; } ret->cbl = cbl; *meth = vehicle_gpsd_methods; ret->attrs = attrs; vehicle_gpsd_open(ret); return ret; } void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("gpsd", vehicle_gpsd_new_gpsd); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd_dbus/000077500000000000000000000000001221777731700217125ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd_dbus/CMakeLists.txt000066400000000000000000000000741221777731700244530ustar00rootroot00000000000000module_add_library(vehicle_gpsd_dbus vehicle_gpsd_dbus.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd_dbus/Makefile.am000066400000000000000000000005171221777731700237510ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd_dbus modulevehicle_LTLIBRARIES = libvehicle_gpsd_dbus.la libvehicle_gpsd_dbus_la_SOURCES = vehicle_gpsd_dbus.c libvehicle_gpsd_dbus_la_LIBADD = @DBUS_LIBS@ libvehicle_gpsd_dbus_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c000066400000000000000000000141601221777731700255310ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #define DBUS_API_SUBJECT_TO_CHANGE #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" static char *vehicle_gpsd_dbus_prefix="gpsd_dbus:"; struct vehicle_priv { char *source; char *address; int flags; struct callback_list *cbl; DBusConnection *connection; double time, track, speed, altitude; time_t fix_time; struct coord_geo geo; struct attr ** attrs; char fixiso8601[128]; }; static void vehicle_gpsd_dbus_close(struct vehicle_priv *priv) { if (priv->connection) dbus_connection_unref(priv->connection); priv->connection=NULL; } static DBusHandlerResult vehicle_gpsd_dbus_filter(DBusConnection *connection, DBusMessage *message, void *user_data) { struct vehicle_priv *priv=user_data; double time,ept,latitude,longitude,eph,altitude,epv,track,epd,speed,eps,climb,epc; int mode; char *devname; if (dbus_message_is_signal(message, "org.gpsd","fix")) { dbus_message_get_args (message, NULL, DBUS_TYPE_DOUBLE, &time, DBUS_TYPE_INT32, &mode, DBUS_TYPE_DOUBLE, &ept, DBUS_TYPE_DOUBLE, &latitude, DBUS_TYPE_DOUBLE, &longitude, DBUS_TYPE_DOUBLE, &eph, DBUS_TYPE_DOUBLE, &altitude, DBUS_TYPE_DOUBLE, &epv, DBUS_TYPE_DOUBLE, &track, DBUS_TYPE_DOUBLE, &epd, DBUS_TYPE_DOUBLE, &speed, DBUS_TYPE_DOUBLE, &eps, DBUS_TYPE_DOUBLE, &climb, DBUS_TYPE_DOUBLE, &epc, DBUS_TYPE_STRING, &devname, DBUS_TYPE_INVALID); if (!isnan(latitude) && !isnan(longitude)) { priv->geo.lat=latitude; priv->geo.lng=longitude; } if (!isnan(track)) priv->track=track; if (!isnan(speed)) priv->speed=speed; if (!isnan(altitude)) priv->altitude=altitude; if (time != priv->time || (priv->flags & 1)) { priv->time=time; priv->fix_time=time; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static int vehicle_gpsd_dbus_open(struct vehicle_priv *priv) { DBusError error; dbus_error_init(&error); if (priv->address) { priv->connection = dbus_connection_open(priv->address, &error); } else { priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); } if (!priv->connection) { dbg(0,"Failed to open connection to %s message bus: %s\n", priv->address?priv->address:"session",error.message); dbus_error_free(&error); return 0; } dbus_connection_setup_with_g_main(priv->connection, NULL); dbus_bus_add_match(priv->connection,"type='signal',interface='org.gpsd'",&error); dbus_connection_flush(priv->connection); if (dbus_error_is_set(&error)) { dbg(0,"Failed to add match to connection: %s\n", error.message); vehicle_gpsd_dbus_close(priv); return 0; } if (!dbus_connection_add_filter(priv->connection, vehicle_gpsd_dbus_filter, priv, NULL)) { dbg(0,"Failed to add filter to connection\n"); vehicle_gpsd_dbus_close(priv); return 0; } return 1; } static void vehicle_gpsd_dbus_destroy(struct vehicle_priv *priv) { vehicle_gpsd_dbus_close(priv); if (priv->source) g_free(priv->source); g_free(priv); } static int vehicle_gpsd_dbus_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_height: attr->u.numd = &priv->altitude; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->track; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_time_iso8601: { struct tm tm; if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } break; default: return 0; } attr->type = type; return 1; } static int vehicle_gpsd_dbus_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) { switch (attr->type) { case attr_source: if (strncmp(vehicle_gpsd_dbus_prefix,attr->u.str,strlen(vehicle_gpsd_dbus_prefix))) { dbg(0,"source must start with '%s'\n", vehicle_gpsd_dbus_prefix); return 0; } g_free(priv->source); priv->source=g_strdup(attr->u.str); priv->address=priv->source+strlen(vehicle_gpsd_dbus_prefix); if (!priv->address[0]) priv->address=NULL; if (!init) { vehicle_gpsd_dbus_close(priv); vehicle_gpsd_dbus_open(priv); } return 1; case attr_flags: priv->flags=attr->u.num; return 1; default: return 0; } } static int vehicle_gpsd_dbus_set_attr(struct vehicle_priv *priv, struct attr *attr) { return vehicle_gpsd_dbus_set_attr_do(priv, attr, 0); } static struct vehicle_methods vehicle_gpsd_methods = { vehicle_gpsd_dbus_destroy, vehicle_gpsd_dbus_position_attr_get, vehicle_gpsd_dbus_set_attr, }; static struct vehicle_priv * vehicle_gpsd_dbus_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; ret = g_new0(struct vehicle_priv, 1); ret->attrs = attrs; ret->cbl = cbl; *meth = vehicle_gpsd_methods; while (*attrs) { vehicle_gpsd_dbus_set_attr_do(ret, *attrs, 1); attrs++; } vehicle_gpsd_dbus_open(ret); return ret; } void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("gpsd_dbus", vehicle_gpsd_dbus_new); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gypsy/000077500000000000000000000000001221777731700211135ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gypsy/CMakeLists.txt000066400000000000000000000000631221777731700236520ustar00rootroot00000000000000module_add_library(vehicle_gypsy vehicle_gypsy.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gypsy/Makefile.am000066400000000000000000000004701221777731700231500ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gypsy modulevehicle_LTLIBRARIES = libvehicle_gypsy.la libvehicle_gypsy_la_SOURCES = vehicle_gypsy.c libvehicle_gypsy_la_LIBADD = @GYPSY_LIBS@ libvehicle_gypsy_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/vehicle/gypsy/vehicle_gypsy.c000066400000000000000000000276201221777731700241400ustar00rootroot00000000000000/** @file vehicle_gypsy.c * @brief gypsy uses dbus signals * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * @Author Tim Niemeyer * @date 2008-2009 */ #include #include #include #include #include #include #ifdef USE_BINDING_DBUS #include #include #include #endif #ifdef HAVE_UNISTD_H #include #include #endif #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" static struct vehicle_priv { char *source; GypsyControl *control; GypsyPosition *position; GypsyDevice *device; GypsyCourse *course; GypsySatellite *satellite; char *path; struct callback_list *cbl; guint retry_interval; struct coord_geo geo; double speed; double direction; double height; int fix_type; time_t fix_time; char fixiso8601[128]; int sats; int sats_used; guint retry_timer; struct attr ** attrs; int have_cords; } *vehicle_last; #define DEFAULT_RETRY_INTERVAL 10 // seconds #define MIN_RETRY_INTERVAL 1 // seconds /** * @brief When the fixstatus has changed, this function get called * * fixstatus can be one of this: * GYPSY_DEVICE_FIX_STATUS_INVALID = 0 * GYPSY_DEVICE_FIX_STATUS_NONE = 1 * GYPSY_DEVICE_FIX_STATUS_2D = 2 * GYPSY_DEVICE_FIX_STATUS_3D = 3 * * Anytime this functions get called, we have to call the global * callback. * * @param device The GypsyDevice * @param fixstatus The fisstatus 0, 1, 2 or 3 * @param userdata * @returns nothing */ static void vehicle_gypsy_fixstatus_changed(GypsyDevice *device, gint fixstatus, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; if (fixstatus==GYPSY_DEVICE_FIX_STATUS_3D) priv->fix_type = 3; else if (fixstatus==GYPSY_DEVICE_FIX_STATUS_2D) priv->fix_type = 1; else priv->fix_type = 0; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } /** * @brief When the position has changed, this function get called * * The fields_set can hold: * GYPSY_POSITION_FIELDS_NONE = 1 << 0, * GYPSY_POSITION_FIELDS_LATITUDE = 1 << 1, * GYPSY_POSITION_FIELDS_LONGITUDE = 1 << 2, * GYPSY_POSITION_FIELDS_ALTITUDE = 1 << 3 * * If we get any new information, we have to call the global * callback. * * @param position The GypsyPosition * @param fields_set Bitmask indicating what field was set * @param timestamp the time since Unix Epoch * @param latitude * @param longitude * @param altitude * @param userdata * @returns nothing */ static void vehicle_gypsy_position_changed(GypsyPosition *position, GypsyPositionFields fields_set, int timestamp, double latitude, double longitude, double altitude, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; int cb = FALSE; if (timestamp > 0) priv->fix_time = timestamp; if (fields_set & GYPSY_POSITION_FIELDS_LATITUDE) { cb = TRUE; priv->geo.lat = latitude; } if (fields_set & GYPSY_POSITION_FIELDS_LONGITUDE) { cb = TRUE; priv->geo.lng = longitude; } if (fields_set & GYPSY_POSITION_FIELDS_ALTITUDE) { cb = TRUE; priv->height = altitude; } if (cb) { priv->have_cords = 1; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } } /** * @brief Everytime any Sat-Details are changed, this function get called * * Going through all Sats, counting those wich are in use. * * Anytime this functions get called, we have to call the global * callback. * * @param satellite The GypsySatellite * @param satellites An GPtrArray wich hold information of all sats * @param userdata * @returns nothing */ static void vehicle_gypsy_satellite_changed(GypsySatellite *satellite, GPtrArray *satellites, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; int i, sats, used=0; sats = satellites->len; for (i = 0; i < sats; i++) { GypsySatelliteDetails *details = satellites->pdata[i]; if (details->in_use) used++; } priv->sats_used = used; priv->sats = sats; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } /** * @brief When the course or speed has changed, this function get called * * Only speed and direction are used! * * If we get any new information, we have to call the global * callback. * * @param course The GypsyCourse * @param fields Bitmask indicating what field was set * @param timestamp the time since Unix Epoch * @param speed * @param direction * @param climb * @param userdata * @returns nothing */ static void vehicle_gypsy_course_changed (GypsyCourse *course, GypsyCourseFields fields, int timestamp, double speed, double direction, double climb, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; int cb = FALSE; if (fields & GYPSY_COURSE_FIELDS_SPEED) { priv->speed = speed*3.6; cb = TRUE; } if (fields & GYPSY_COURSE_FIELDS_DIRECTION) { priv->direction = direction; cb = TRUE; } if (cb) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } /** * @brief Attempt to open the gypsy device. * * Tells gypsy wich functions to call when anything occours. * * @param data * @returns TRUE to try again; FALSE if retry not required */ static gboolean vehicle_gypsy_try_open(gpointer *data) { struct vehicle_priv *priv = (struct vehicle_priv *)data; char *source = g_strdup(priv->source); GError *error = NULL; g_type_init(); priv->control = gypsy_control_get_default(); priv->path = gypsy_control_create(priv->control, source+8, &error); if (priv->path == NULL) { g_warning ("Error creating gypsy conrtol path for %s: %s", source+8, error->message); return TRUE; } priv->position = gypsy_position_new(priv->path); g_signal_connect(priv->position, "position-changed", G_CALLBACK (vehicle_gypsy_position_changed), NULL); priv->satellite = gypsy_satellite_new(priv->path); g_signal_connect(priv->satellite, "satellites-changed", G_CALLBACK (vehicle_gypsy_satellite_changed), NULL); priv->course = gypsy_course_new(priv->path); g_signal_connect(priv->course, "course-changed", G_CALLBACK (vehicle_gypsy_course_changed), NULL); priv->device = gypsy_device_new(priv->path); g_signal_connect(priv->device, "fix-status-changed", G_CALLBACK (vehicle_gypsy_fixstatus_changed), NULL); gypsy_device_start(priv->device, &error); if (error != NULL) { g_warning ("Error starting gypsy for %s: %s", source+8, error->message); return TRUE; } vehicle_last = priv; dbg(0,"gypsy connected to %d\n", source+8); g_free(source); return FALSE; } /** * @brief Open a connection to gypsy. Will re-try the connection if it fails * * @param priv * @returns nothing */ static void vehicle_gypsy_open(struct vehicle_priv *priv) { priv->retry_timer=0; if (vehicle_gypsy_try_open((gpointer *)priv)) { priv->retry_timer = g_timeout_add(priv->retry_interval*1000, (GSourceFunc)vehicle_gypsy_try_open, (gpointer *)priv); } } /** * @brief Stop retry timer; Free alloced memory * * @param priv * @returns nothing */ static void vehicle_gypsy_close(struct vehicle_priv *priv) { if (priv->retry_timer) { g_source_remove(priv->retry_timer); priv->retry_timer=0; } if (priv->path) g_free(priv->path); if (priv->position) g_free(priv->position); if (priv->satellite) g_free(priv->satellite); if (priv->course) g_free(priv->course); if (priv->device) g_free(priv->device); if (priv->control) g_object_unref(G_OBJECT (priv->control)); } /** * @brief Free the gypsy_vehicle * * @param priv * @returns nothing */ static void vehicle_gypsy_destroy(struct vehicle_priv *priv) { vehicle_gypsy_close(priv); if (priv->source) g_free(priv->source); g_free(priv); } /** * @brief Provide the outside with information * * @param priv * @param type TODO: What can this be? * @param attr * @returns true/false */ static int vehicle_gypsy_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { struct attr * active=NULL; switch (type) { case attr_position_fix_type: attr->u.num = priv->fix_type; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; if (!priv->have_cords) return 0; break; case attr_position_time_iso8601: { struct tm tm; if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } case attr_active: active = attr_search(priv->attrs,NULL,attr_active); if(active != NULL && active->u.num == 1) return 1; else return 0; break; default: return 0; } attr->type = type; return 1; } struct vehicle_methods vehicle_gypsy_methods = { vehicle_gypsy_destroy, vehicle_gypsy_position_attr_get, }; /** * @brief Create gypsy_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_gypsy_new_gypsy(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source, *retry_int; #if defined(USE_BINDING_DBUS) && defined(HAVE_UNISTD_H) DBusConnection *conn; DBusMessage *message; dbus_uint32_t serial,pid=getpid(); struct attr *destination,*path,*interface,*method; destination=attr_search(attrs, NULL, attr_dbus_destination); path=attr_search(attrs, NULL, attr_dbus_path); interface=attr_search(attrs, NULL, attr_dbus_interface); method=attr_search(attrs, NULL, attr_dbus_method); if (destination && path && interface && method) { conn=dbus_bus_get(DBUS_BUS_SESSION, NULL); if (conn) { message=dbus_message_new_method_call(destination->u.str,path->u.str,interface->u.str,method->u.str); dbus_message_append_args(message, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); dbus_connection_send(conn, message, &serial); dbus_message_unref(message); dbus_connection_unref(conn); } else { dbg(0,"failed to connect to session bus\n"); } } #endif dbg(1, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->have_cords = 0; ret->source = g_strdup(source->u.str); ret->attrs = attrs; retry_int = attr_search(attrs, NULL, attr_retry_interval); if (retry_int) { ret->retry_interval = retry_int->u.num; if (ret->retry_interval < MIN_RETRY_INTERVAL) { dbg(0, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL); ret->retry_interval = MIN_RETRY_INTERVAL; } } else { dbg(0, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL); ret->retry_interval = DEFAULT_RETRY_INTERVAL; } ret->cbl = cbl; *meth = vehicle_gypsy_methods; vehicle_gypsy_open(ret); return ret; } /** * @brief register vehicle_gypsy * * @returns nothing */ void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("gypsy", vehicle_gypsy_new_gypsy); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/maemo/000077500000000000000000000000001221777731700210365ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/maemo/CMakeLists.txt000066400000000000000000000000641221777731700235760ustar00rootroot00000000000000module_add_library(vehicle_maemo vehicle_maemo.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/maemo/Makefile.am000066400000000000000000000005051221777731700230720ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBLOCATION_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_maemo modulevehicle_LTLIBRARIES = libvehicle_maemo.la libvehicle_maemo_la_SOURCES = vehicle_maemo.c libvehicle_maemo_la_LIBADD = @LIBLOCATION_LIBS@ libvehicle_maemo_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/vehicle/maemo/vehicle_maemo.c000066400000000000000000000227501221777731700240050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* Plugin for new Maemo's liblocation API. source cound be on of "any","cwp","acwp","gnss","agnss" retry_interval could be one of "1","2","5","10","20","30","60","120" measured in seconds */ #include #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" static struct vehicle_priv { LocationGPSDControl *control; LocationGPSDevice *device; char *source; guint retry_interval; struct callback_list *cbl; struct attr ** attrs; int sats; // satellites_in_view int sats_used; //satellites_in_user int fix_type; //mode struct coord_geo geo; //lattigute&longittude double speed; //speed:) double direction; //track double height; //altitude double hdop; //eph time_t fix_time; //time char fixiso8601[128]; }; static void vehicle_maemo_callback(LocationGPSDevice *device, gpointer user_data) { struct vehicle_priv *priv=(struct vehicle_priv*)user_data; priv->sats=device->satellites_in_view; priv->sats_used=device->satellites_in_use; callback_list_call_attr_0(priv->cbl, attr_position_sats); dbg(1,"Got update with %u/%u satellites\n",priv->sats_used,priv->sats); if (device->fix) { switch(device->fix->mode) { case LOCATION_GPS_DEVICE_MODE_NOT_SEEN: case LOCATION_GPS_DEVICE_MODE_NO_FIX: priv->fix_type=0; break; case LOCATION_GPS_DEVICE_MODE_2D: case LOCATION_GPS_DEVICE_MODE_3D: priv->fix_type=1; break; } if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { priv->geo.lat=device->fix->latitude; priv->geo.lng=device->fix->longitude; priv->hdop=device->fix->eph/100; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); dbg(1,"Position: %f %f with error %f meters\n",priv->geo.lat,priv->geo.lng,priv->hdop); } if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) { priv->speed=device->fix->speed; callback_list_call_attr_0(priv->cbl, attr_position_speed); dbg(1,"Speed: %f\n ",priv->speed); } if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) { priv->direction=device->fix->track; dbg(1,"Direction: %f\n",priv->direction); } if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) { priv->fix_time=device->fix->time; dbg(1,"Time: %f\n",priv->fix_time); } if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) { priv->height=device->fix->altitude; dbg(1,"Elevation: %f\n",priv->height); } } return; } static void vehicle_maemo_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer user_data) { switch (error) { case LOCATION_ERROR_USER_REJECTED_DIALOG: dbg(0,"User didn't enable requested methods\n"); break; case LOCATION_ERROR_USER_REJECTED_SETTINGS: dbg(0,"User changed settings, which disabled location\n"); break; case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE: dbg(0,"Problems with BT GPS\n"); break; case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE: dbg(0,"Requested method is not allowed in offline mode\n"); break; case LOCATION_ERROR_SYSTEM: dbg(0,"System error\n"); break; } } /** * Instantiate liblocation objects */ static void vehicle_maemo_open(struct vehicle_priv *priv) { priv->control = location_gpsd_control_get_default(); priv->device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL); if (!strcasecmp(priv->source+8,"cwp")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_CWP, NULL); dbg(1,"Method set: CWP\n"); } else if (!strcasecmp(priv->source+8,"acwp")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_ACWP, NULL); dbg(1,"Method set: ACWP\n"); } else if (!strcasecmp(priv->source+8,"gnss")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_GNSS, NULL); dbg(1,"Method set: GNSS\n"); } else if (!strcasecmp(priv->source+8,"agnss")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_AGNSS, NULL); dbg(1,"Method set: AGNSS\n"); } else { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_USER_SELECTED, NULL); dbg(1,"Method set: ANY\n"); } switch (priv->retry_interval) { case 2: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_2S, NULL); dbg(1,"Interval set: 2s\n"); break; case 5: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_5S, NULL); dbg(1,"Interval set: 5s\n"); break; case 10: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_10S, NULL); dbg(1,"Interval set: 10s\n"); break; case 20: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_20S, NULL); dbg(1,"Interval set: 20s\n"); break; case 30: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_30S, NULL); dbg(1,"Interval set: 30s\n"); break; case 60: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_60S, NULL); dbg(1,"Interval set: 60s\n"); break; case 120: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_120S, NULL); dbg(1,"Interval set: 120s\n"); break; case 1: default: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_1S, NULL); dbg(1,"Interval set: 1s\n"); break; } g_signal_connect(priv->device, "changed", G_CALLBACK(vehicle_maemo_callback), priv); g_signal_connect(priv->control, "error-verbose", G_CALLBACK(vehicle_maemo_error), priv); location_gpsd_control_start(priv->control); return; } static void vehicle_maemo_destroy(struct vehicle_priv *priv) { location_gpsd_control_stop(priv->control); g_object_unref(priv->device); g_object_unref(priv->control); return; } static int vehicle_maemo_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { struct attr * active=NULL; switch (type) { case attr_position_fix_type: dbg(1,"Attr requested: position_fix_type\n"); attr->u.num = priv->fix_type; break; case attr_position_height: dbg(1,"Attr requested: position_height\n"); attr->u.numd = &priv->height; break; case attr_position_speed: dbg(1,"Attr requested: position_speed\n"); attr->u.numd = &priv->speed; break; case attr_position_direction: dbg(1,"Attr requested: position_direction\n"); attr->u.numd = &priv->direction; break; case attr_position_hdop: dbg(1,"Attr requested: position_hdop\n"); attr->u.numd = &priv->hdop; break; case attr_position_sats: dbg(1,"Attr requested: position_sats_signal\n"); attr->u.num = priv->sats; break; case attr_position_sats_used: dbg(1,"Attr requested: position_sats_used\n"); attr->u.num = priv->sats_used; break; case attr_position_coord_geo: dbg(1,"Attr requested: position_coord_geo\n"); attr->u.coord_geo = &priv->geo; break; case attr_position_time_iso8601: { struct tm tm; dbg(1,"Attr requested: position_time_iso8601\n"); if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } break; case attr_active: dbg(1,"Attr requested: position_active\n"); active = attr_search(priv->attrs,NULL,attr_active); if(active != NULL) { attr->u.num=active->u.num; return 1; } else return 0; break; default: return 0; } attr->type = type; return 1; } struct vehicle_methods vehicle_maemo_methods = { vehicle_maemo_destroy, vehicle_maemo_position_attr_get, }; static struct vehicle_priv * vehicle_maemo_new_maemo(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source, *retry_int; dbg(1, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->source = g_strdup(source->u.str); retry_int = attr_search(attrs, NULL, attr_retry_interval); if (retry_int) { ret->retry_interval = retry_int->u.num; if (ret->retry_interval !=1 && ret->retry_interval !=2 && ret->retry_interval !=5 && ret->retry_interval !=10 && ret->retry_interval !=20 && ret->retry_interval !=30 && ret->retry_interval !=60 && ret->retry_interval !=120 ) { dbg(0, "Retry interval %d invalid, setting to 1\n", ret->retry_interval,1); ret->retry_interval = 1; } } else { ret->retry_interval = 1; } dbg(1,"source: %s, interval: %u\n",ret->source,ret->retry_interval); ret->cbl = cbl; *meth = vehicle_maemo_methods; ret->attrs = attrs; vehicle_maemo_open(ret); return ret; } void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("maemo", vehicle_maemo_new_maemo); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/null/000077500000000000000000000000001221777731700207125ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/null/CMakeLists.txt000066400000000000000000000000601221777731700234460ustar00rootroot00000000000000module_add_library(vehicle_null vehicle_null.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/null/Makefile.am000066400000000000000000000005241221777731700227470ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_null if PLUGINS modulevehicle_LTLIBRARIES = libvehicle_null.la else noinst_LTLIBRARIES = libvehicle_null.la endif libvehicle_null_la_SOURCES = vehicle_null.c libvehicle_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0~svn5643+dfsg.1/navit/vehicle/null/vehicle_null.c000066400000000000000000000073341221777731700235360ustar00rootroot00000000000000/** @file vehicle_null.c * @brief null uses dbus signals * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * @Author Tim Niemeyer * @date 2008-2009 */ #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" struct vehicle_priv { struct callback_list *cbl; struct coord_geo geo; double speed; double direction; double height; double radius; int fix_type; time_t fix_time; char fixiso8601[128]; int sats; int sats_used; int have_coords; struct attr ** attrs; }; /** * @brief Free the null_vehicle * * @param priv * @returns nothing */ static void vehicle_null_destroy(struct vehicle_priv *priv) { dbg(1,"enter\n"); g_free(priv); } /** * @brief Provide the outside with information * * @param priv * @param type TODO: What can this be? * @param attr * @returns true/false */ static int vehicle_null_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { dbg(1,"enter %s\n",attr_to_name(type)); switch (type) { #if 0 case attr_position_fix_type: attr->u.num = priv->fix_type; break; #endif case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_radius: attr->u.numd = &priv->radius; break; #if 0 case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; #endif case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; if (!priv->have_coords) return 0; break; case attr_position_time_iso8601: attr->u.str=priv->fixiso8601; break; default: return 0; } dbg(1,"ok\n"); attr->type = type; return 1; } static int vehicle_null_set_attr(struct vehicle_priv *priv, struct attr *attr) { switch (attr->type) { case attr_position_speed: priv->speed=*attr->u.numd; break; case attr_position_direction: priv->direction=*attr->u.numd; break; case attr_position_coord_geo: priv->geo=*attr->u.coord_geo; priv->have_coords=1; break; default: break; } callback_list_call_attr_0(priv->cbl, attr->type); return 1; } struct vehicle_methods vehicle_null_methods = { vehicle_null_destroy, vehicle_null_position_attr_get, vehicle_null_set_attr, }; /** * @brief Create null_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_null_new_null(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; dbg(1, "enter\n"); ret = g_new0(struct vehicle_priv, 1); ret->cbl = cbl; *meth = vehicle_null_methods; dbg(1, "return\n"); return ret; } /** * @brief register vehicle_null * * @returns nothing */ void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("null", vehicle_null_new_null); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/000077500000000000000000000000001221777731700210575ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/CMakeLists.txt000066400000000000000000000000621221777731700236150ustar00rootroot00000000000000module_add_library(vehicle_webos vehicle_webos.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/Makefile.am000066400000000000000000000005121221777731700231110ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_webos modulevehicle_LTLIBRARIES = libvehicle_webos.la libvehicle_webos_la_SOURCES = vehicle_webos.c bluetooth.c cJSON.c libvehicle_webos_la_LDFLAGS = @SDL_LIBS@ @LIBPDL_LIBS@ -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/bluetooth.c000066400000000000000000000447421221777731700232430ustar00rootroot00000000000000/* vim: sw=3 ts=3 * */ #include #include #include #include #include #include #include #include #include "debug.h" #include "callback.h" #include "event.h" #include "cJSON.h" #include "vehicle_webos.h" #include "bluetooth.h" static int buffer_size = 128; static void vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int length); /********************************************************************/ static void mlPDL_ServiceCall_callback(struct callback_list *cbl, char *service, char *parameters/*, struct callback *fail_cb*/) { PDL_Err err; dbg(1,"PDL_ServiceCall(%s) parameters(%s)\n",service,parameters); err = PDL_ServiceCall(service, parameters); if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCall to (%s) with (%s) failed with (%d): (%s)\n", service, parameters, err, PDL_GetError()); } callback_list_destroy(cbl); g_free(service); g_free(parameters); } static void mlPDL_ServiceCall(const char *service, const char *parameters/*, struct callback *fail_cb = NULL*/) { struct callback *cb = NULL; struct callback_list *cbl = NULL; char *service2 = g_strdup(service); char *parameters2 = g_strdup(parameters); cbl = callback_list_new(); cb = callback_new_3(callback_cast(mlPDL_ServiceCall_callback),cbl,service2,parameters2); callback_list_add(cbl, cb); dbg(0,"event_call_callback(%p)\n",cbl); event_call_callback(cbl); } /********************************************************************/ static void mlPDL_ServiceCallWithCallback_callback(struct callback_list *cbl, char *service, char *parameters, PDL_ServiceCallbackFunc callback, void *user, PDL_bool removeAfterResponse) { PDL_Err err; dbg(1,"PDL_ServiceCallWithCallback(%s) parameters(%s)\n",service,parameters); err = PDL_ServiceCallWithCallback(service, parameters, callback, user, removeAfterResponse); if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCallWithCallback to (%s) with (%s) failed with (%d): (%s)\n", service, parameters, err, PDL_GetError()); } callback_list_destroy(cbl); g_free(service); g_free(parameters); } static void mlPDL_ServiceCallWithCallback(const char *service, const char *parameters, PDL_ServiceCallbackFunc callback, void *user, PDL_bool removeAfterResponse) { struct callback *cb = NULL; struct callback_list *cbl = NULL; char *service2 = g_strdup(service); char *parameters2 = g_strdup(parameters); cbl = callback_list_new(); cb = callback_new_args(callback_cast(mlPDL_ServiceCallWithCallback_callback),6,cbl,service2,parameters2,callback,user,removeAfterResponse); callback_list_add(cbl, cb); dbg(0,"event_call_callback(%p)\n",cbl); event_call_callback(cbl); } /********************************************************************/ static void vehicle_webos_init_pdl_locationtracking_callback(struct vehicle_priv *priv, struct callback_list *cbl, int param) { PDL_Err err; priv->gps_type = param ? GPS_TYPE_INT: GPS_TYPE_NONE; dbg(1,"Calling PDL_EnableLocationTracking(%i)\n",param); err = PDL_EnableLocationTracking(param); if (err != PDL_NOERROR) { dbg(0,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError()); // vehicle_webos_close(priv); // return 0; } callback_list_destroy(cbl); } static void vehicle_webos_init_pdl_locationtracking(struct vehicle_priv *priv, int param) { struct callback *cb = NULL; struct callback_list *cbl = NULL; cbl = callback_list_new(); cb = callback_new_3(callback_cast(vehicle_webos_init_pdl_locationtracking_callback),priv,cbl,param); callback_list_add(cbl, cb); event_call_callback(cbl); } /********************************************************************/ static int vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer) { char *nmea_data_buf, *p, *item[32]; double lat, lng; int i, bcsum; int len = strlen(buffer); unsigned char csum = 0; int valid=0; int ret = 0; dbg(2, "enter: buffer='%s'\n", buffer); for (;;) { if (len < 4) { dbg(0, "'%s' too short\n", buffer); return ret; } if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { buffer[--len] = '\0'; if (buffer[len - 1] == '\r') buffer[--len] = '\0'; } else break; } if (buffer[0] != '$') { dbg(0, "no leading $ in '%s'\n", buffer); return ret; } if (buffer[len - 3] != '*') { dbg(0, "no *XX in '%s'\n", buffer); return ret; } for (i = 1; i < len - 3; i++) { csum ^= (unsigned char) (buffer[i]); } if (!sscanf(buffer + len - 2, "%x", &bcsum) /*&& priv->checksum_ignore != 2*/) { dbg(0, "no checksum in '%s'\n", buffer); return ret; } if (bcsum != csum /*&& priv->checksum_ignore == 0*/) { dbg(0, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum); return ret; } if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); } i = 0; p = buffer; while (i < 31) { item[i++] = p; while (*p && *p != ',') p++; if (!*p) break; *p++ = '\0'; } // if (buffer[0] == '$') { // struct timeval tv; // gettimeofday(&tv,NULL); priv->delta = 0; // (unsigned int)difftime(tv.tv_sec, priv->fix_time); // priv->fix_time = tv.tv_sec; // dbg(2,"delta(%i)\n",priv->delta); // } if (!strncmp(buffer, "$GPGGA", 6)) { /* 1 1111 0 1 2 3 4 5 6 7 8 9 0 1234 $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] */ if (*item[2] && *item[3] && *item[4] && *item[5]) { lat = g_ascii_strtod(item[2], NULL); priv->geo.lat = floor(lat / 100); lat -= priv->geo.lat * 100; priv->geo.lat += lat / 60; if (!g_strcasecmp(item[3],"S")) priv->geo.lat=-priv->geo.lat; lng = g_ascii_strtod(item[4], NULL); priv->geo.lng = floor(lng / 100); lng -= priv->geo.lng * 100; priv->geo.lng += lng / 60; if (!g_strcasecmp(item[5],"W")) priv->geo.lng=-priv->geo.lng; priv->valid=attr_position_valid_valid; dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); } else priv->valid=attr_position_valid_invalid; if (*item[6]) sscanf(item[6], "%d", &priv->status); if (*item[7]) sscanf(item[7], "%d", &priv->sats_used); if (*item[8]) sscanf(item[8], "%lf", &priv->hdop); if (*item[1]) { struct tm tm; strptime(item[1],"%H%M%S",&tm); priv->fix_time = mktime(&tm); } if (*item[9]) sscanf(item[9], "%lf", &priv->altitude); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; #if 0 if (priv->file_type == file_type_file) { if (priv->watch) { vehicle_file_disable_watch(priv); event_add_timeout(priv->time, 0, priv->cbt); } } #endif ret = 1; } if (!strncmp(buffer, "$GPVTG", 6)) { /* 0 1 2 34 5 6 7 8 $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] */ if (item[1] && item[7]) valid = 1; if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) valid = 1; if (valid) { priv->track = g_ascii_strtod( item[1], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); dbg(2,"direction %lf, speed %2.1lf\n", priv->track, priv->speed); } } if (!strncmp(buffer, "$GPRMC", 6)) { /* 1 1 0 1 2 3 4 5 6 7 8 9 0 1 $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], magnetic variation[10],magnetic variation direction[11] */ if (*item[2] == 'A') valid = 1; if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) valid = 1; if (valid) { priv->track = g_ascii_strtod( item[8], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); priv->speed *= 1.852; struct tm tm; char time[13]; sprintf(time,"%s%s",item[1],item[9]); strptime(time,"%H%M%S%d%m%y",&tm); priv->fix_time = mktime(&tm); #if 0 sscanf(item[9], "%02d%02d%02d", &priv->fixday, &priv->fixmonth, &priv->fixyear); priv->fixyear += 2000; #endif } ret = 1; } if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { /* 0 GSV Satellites in view 1 2 Number of sentences for full data 2 1 sentence 1 of 2 3 08 Number of satellites in view 4 01 Satellite PRN number 5 40 Elevation, degrees 6 083 Azimuth, degrees 7 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * */ if (item[3]) { sscanf(item[3], "%d", &priv->sats_visible); } #if 0 j=4; while (j+4 <= i && priv->current_count < 24) { struct gps_sat *sat=&priv->next[priv->next_count++]; sat->prn=atoi(item[j]); sat->elevation=atoi(item[j+1]); sat->azimuth=atoi(item[j+2]); sat->snr=atoi(item[j+3]); j+=4; } if (!strcmp(item[1], item[2])) { priv->sats_signal=0; for (i = 0 ; i < priv->next_count ; i++) { priv->current[i]=priv->next[i]; if (priv->current[i].snr) priv->sats_signal++; } priv->current_count=priv->next_count; priv->next_count=0; } #endif } #if 0 if (!strncmp(buffer, "$GPZDA", 6)) { /* 0 1 2 3 4 5 6 $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC hhmmss HrMinSec(UTC) dd,mm,yyy Day,Month,Year xx local zone hours -13..13 yy local zone minutes 0..59 */ if (item[1] && item[2] && item[3] && item[4]) { strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); priv->fixday = atoi(item[2]); priv->fixmonth = atoi(item[3]); priv->fixyear = atoi(item[4]); } } #endif if (!strncmp(buffer, "$IISMD", 6)) { /* 0 1 2 3 4 $IISMD,dir,press,height,temp*CC" dir Direction (0-359) press Pressure (hpa, i.e. 1032) height Barometric height above ground (meter) temp Temperature (Degree Celsius) */ if (item[1]) { priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); dbg(1,"magnetic %d\n", priv->magnetic_direction); } } return ret; } static void vehicle_webos_spp_handle_read(PDL_ServiceParameters *params, void *user) { struct vehicle_priv *priv = user; int size, rc = 0; char *str, *tok; //PDL_Err err; size = PDL_GetParamInt(params, "dataLength"); if (size > buffer_size) { dbg(0, "read returned too much data\n"); return; } char buffer[buffer_size]; PDL_GetParamString(params,"data",buffer,buffer_size); dbg(9,"data(%s) dataLength(%i)\n",buffer,size); memmove(priv->buffer + priv->buffer_pos, buffer, size); priv->buffer_pos += size; priv->buffer[priv->buffer_pos] = '\0'; dbg(1, "size=%d pos=%d buffer='%s'\n", size, priv->buffer_pos, priv->buffer); str = priv->buffer; while ((tok = strchr(str, '\n'))) { *tok++ = '\0'; dbg(1, "line='%s'\n", str); rc += vehicle_webos_parse_nmea(priv, str); str = tok; // if (priv->file_type == file_type_file && rc) // break; } if (str != priv->buffer) { size = priv->buffer + priv->buffer_pos - str; memmove(priv->buffer, str, size + 1); priv->buffer_pos = size; dbg(1,"now pos=%d buffer='%s'\n", priv->buffer_pos, priv->buffer); } else if (priv->buffer_pos == buffer_size - 1) { dbg(0,"Overflow. Most likely wrong baud rate or no nmea protocol\n"); priv->buffer_pos = 0; } if (rc) { SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = PDL_GPS_UPDATE; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } vehicle_webos_spp_init_read(priv, buffer_size - priv->buffer_pos - 1); } static void vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int length) { //PDL_Err err; char parameters[128]; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"dataLength\":%i}", priv->spp_instance_id, length); mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/read", parameters, (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_read, priv, PDL_FALSE ); #if 0 if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCall failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return; } #endif } static void vehicle_webos_spp_handle_open(PDL_ServiceParameters *params, void *user) { struct vehicle_priv *priv = (struct vehicle_priv *)user; if (!priv->buffer) priv->buffer = g_malloc(buffer_size); dbg(1,"instanceId(%i)\n",priv->spp_instance_id); priv->gps_type = GPS_TYPE_BT; vehicle_webos_spp_init_read(priv, buffer_size-1); } static void vehicle_webos_spp_notify(PDL_ServiceParameters *params, void *user) { struct vehicle_priv *priv = user; char notification[128]; char parameters[128]; const char *params_json = PDL_GetParamJson(params); dbg(2,"params_json(%s)\n", params_json); if (PDL_ParamExists(params, "errorText")) { PDL_GetParamString(params, "errorText", notification, sizeof(notification)); dbg(0,"errorText(%s)\n",notification); return; } PDL_GetParamString(params, "notification", notification, sizeof(notification)); notification[sizeof(notification)-1] = '\0'; dbg(1,"notification(%s) %i\n",notification,PDL_ParamExists(params, "notification")); if(strcmp(notification,"notifnservicenames") == 0) { int instance_id = PDL_GetParamInt(params, "instanceId"); dbg(1,"instanceId(%i)\n", instance_id); cJSON *root = cJSON_Parse(params_json); if (!root) { dbg(0,"parsing json failed\n"); return; } cJSON *services = cJSON_GetObjectItem(root, "services"); char *service_name = cJSON_GetArrayItem(services, 0)->valuestring; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"servicename\":\"%s\"}",instance_id, service_name); mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/selectservice", parameters); cJSON_Delete(root); } else if(strcmp(notification,"notifnconnected") == 0) { if (PDL_GetParamInt(params,"error") == 0) { vehicle_webos_init_pdl_locationtracking(priv, 0); int instance_id = PDL_GetParamInt(params, "instanceId"); priv->spp_instance_id = instance_id; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", instance_id); mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/open", parameters, (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_open, priv, PDL_TRUE); } else { dbg(0,"notifnconnected error(%i)\n",PDL_GetParamInt(params,"error")); } } else if(strcmp(notification,"notifndisconnected") == 0) { priv->gps_type = GPS_TYPE_NONE; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}",priv->spp_instance_id); mlPDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters); priv->spp_instance_id = 0; vehicle_webos_init_pdl_locationtracking(priv, 1); } } static void vehicle_webos_init_bt_gps(struct vehicle_priv *priv, char *addr) { char parameters[128]; dbg(1,"subscribeNotifications\n"); mlPDL_ServiceCallWithCallback("palm://com.palm.bluetooth/spp/subscribenotifications", "{\"subscribe\":true}", (PDL_ServiceCallbackFunc)vehicle_webos_spp_notify, priv, PDL_FALSE); #if 0 if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return; } #endif snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", addr); mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/connect", parameters); #if 0 if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCall failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return; } #endif priv->spp_address = addr; } static void vehicle_webos_bt_gap_callback(PDL_ServiceParameters *params, void *param) { const char *params_json; struct vehicle_priv *priv = (struct vehicle_priv *)param; char *device_addr = NULL; cJSON *root; dbg(1,"enter\n"); PDL_Err err; err = PDL_GetParamInt(params, "errorCode"); if (err != PDL_NOERROR) { dbg(0,"BT GAP Callback errorCode %d\n", err); return /*PDL_EOTHER*/; } params_json = PDL_GetParamJson(params); dbg(2,"params_json(%s)\n",params_json); root = cJSON_Parse(params_json); if (!root) { dbg(0,"parsing json failed\n"); return; } cJSON *trusted_devices = cJSON_GetObjectItem(root, "trusteddevices"); unsigned int i,c = cJSON_GetArraySize(trusted_devices); dbg(1, "trusted_devices(%i)\n",c); for(i=0; i < c && !device_addr; i++) { cJSON *device = cJSON_GetArrayItem(trusted_devices,i); char *name = cJSON_GetObjectItem(device, "name")->valuestring; char *address = cJSON_GetObjectItem(device, "address")->valuestring; char *status = cJSON_GetObjectItem(device, "status")->valuestring; dbg(1,"i(%i) name(%s) address(%s) status(%s)\n",i,name,address,status); if (/*strncmp(status, "connected",9) == 0 && */strstr(name, "GPS") != NULL) { dbg(1,"choose name(%s) address(%s)\n",name,address); device_addr = g_strdup(address); break; } } cJSON_Delete(root); if (device_addr) { vehicle_webos_init_bt_gps(priv, device_addr); } g_free(device_addr); } int vehicle_webos_bt_open(struct vehicle_priv *priv) { // Try to connect to BT GPS, or use PDL method dbg(1,"enter\n"); PDL_Err err; err = PDL_ServiceCallWithCallback("palm://com.palm.bluetooth/gap/gettrusteddevices", "{}", (PDL_ServiceCallbackFunc)vehicle_webos_bt_gap_callback, priv, PDL_TRUE); if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return 0; } return 1; } void vehicle_webos_bt_close(struct vehicle_priv *priv) { dbg(0,"XXX\n"); char parameters[128]; if (priv->spp_instance_id) { snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", priv->spp_instance_id); PDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters); } if (priv->spp_address) { snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", priv->spp_address); PDL_ServiceCall("palm://com.palm.bluetooth.spp/disconnect", parameters); g_free(priv->spp_address); priv->spp_address = NULL; } //g_free(priv->buffer); //priv->buffer = NULL; // g_free(priv->nmea_data); // priv->nmea_data = NULL; // g_free(priv->nmea_data_buf); // priv->nmea_data_buf = NULL; } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/bluetooth.h000066400000000000000000000002041221777731700232310ustar00rootroot00000000000000 #include "cJSON.h" int vehicle_webos_bt_open(struct vehicle_priv *priv); void vehicle_webos_bt_close(struct vehicle_priv *priv); navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/cJSON.c000066400000000000000000000461121221777731700221430ustar00rootroot00000000000000/* Copyright (c) 2009 Dave Gamble Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* cJSON */ /* JSON parser in C. */ #include #include #include #include #include #include #include #include "cJSON.h" static const char *ep; const char *cJSON_GetErrorPtr() {return ep;} static int cJSON_strcasecmp(const char *s1,const char *s2) { if (!s1) return (s1==s2)?0:1;if (!s2) return 1; for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0; return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); } static void *(*cJSON_malloc)(size_t sz) = malloc; static void (*cJSON_free)(void *ptr) = free; static char* cJSON_strdup(const char* str) { size_t len; char* copy; len = strlen(str) + 1; if (!(copy = (char*)cJSON_malloc(len))) return 0; memcpy(copy,str,len); return copy; } void cJSON_InitHooks(cJSON_Hooks* hooks) { if (!hooks) { /* Reset hooks */ cJSON_malloc = malloc; cJSON_free = free; return; } cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; cJSON_free = (hooks->free_fn)?hooks->free_fn:free; } /* Internal constructor. */ static cJSON *cJSON_New_Item(void) { cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); if (node) memset(node,0,sizeof(cJSON)); return node; } /* Delete a cJSON structure. */ void cJSON_Delete(cJSON *c) { cJSON *next; while (c) { next=c->next; if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child); if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring); if (c->string) cJSON_free(c->string); cJSON_free(c); c=next; } } /* Parse the input text to generate a number, and populate the result into item. */ static const char *parse_number(cJSON *item,const char *num) { double n=0,sign=1,scale=0;int subscale=0,signsubscale=1; /* Could use sscanf for this? */ if (*num=='-') sign=-1,num++; /* Has sign? */ if (*num=='0') num++; /* is zero */ if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */ if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */ if (*num=='e' || *num=='E') /* Exponent? */ { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */ while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */ } n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ item->valuedouble=n; item->valueint=(int)n; item->type=cJSON_Number; return num; } /* Render the number nicely from the given item into a string. */ static char *print_number(cJSON *item) { char *str; double d=item->valuedouble; if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) { str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */ if (str) sprintf(str,"%d",item->valueint); } else { str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ if (str) { if (fabs(floor(d)-d)<=DBL_EPSILON) sprintf(str,"%.0f",d); else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); else sprintf(str,"%f",d); } } return str; } /* Parse the input text into an unescaped cstring, and populate item. */ static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; static const char *parse_string(cJSON *item,const char *str) { const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2; if (*str!='\"') {ep=str;return 0;} /* not a string! */ while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ if (!out) return 0; ptr=str+1;ptr2=out; while (*ptr!='\"' && *ptr) { if (*ptr!='\\') *ptr2++=*ptr++; else { ptr++; switch (*ptr) { case 'b': *ptr2++='\b'; break; case 'f': *ptr2++='\f'; break; case 'n': *ptr2++='\n'; break; case 'r': *ptr2++='\r'; break; case 't': *ptr2++='\t'; break; case 'u': /* transcode utf16 to utf8. */ sscanf(ptr+1,"%4x",&uc);ptr+=4; /* get the unicode char. */ if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid. if (uc>=0xD800 && uc<=0xDBFF) // UTF16 surrogate pairs. { if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate. sscanf(ptr+3,"%4x",&uc2);ptr+=6; if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate. uc=0x10000 | ((uc&0x3FF)<<10) | (uc2&0x3FF); } len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; switch (len) { case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 1: *--ptr2 =(uc | firstByteMark[len]); } ptr2+=len; break; default: *ptr2++=*ptr; break; } ptr++; } } *ptr2=0; if (*ptr=='\"') ptr++; item->valuestring=out; item->type=cJSON_String; return ptr; } /* Render the cstring provided to an escaped version that can be printed. */ static char *print_string_ptr(const char *str) { const char *ptr;char *ptr2,*out;int len=0;unsigned char token; if (!str) return cJSON_strdup(""); ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} out=(char*)cJSON_malloc(len+3); if (!out) return 0; ptr2=out;ptr=str; *ptr2++='\"'; while (*ptr) { if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++; else { *ptr2++='\\'; switch (token=*ptr++) { case '\\': *ptr2++='\\'; break; case '\"': *ptr2++='\"'; break; case '\b': *ptr2++='b'; break; case '\f': *ptr2++='f'; break; case '\n': *ptr2++='n'; break; case '\r': *ptr2++='r'; break; case '\t': *ptr2++='t'; break; default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */ } } } *ptr2++='\"';*ptr2++=0; return out; } /* Invote print_string_ptr (which is useful) on an item. */ static char *print_string(cJSON *item) {return print_string_ptr(item->valuestring);} /* Predeclare these prototypes. */ static const char *parse_value(cJSON *item,const char *value); static char *print_value(cJSON *item,int depth,int fmt); static const char *parse_array(cJSON *item,const char *value); static char *print_array(cJSON *item,int depth,int fmt); static const char *parse_object(cJSON *item,const char *value); static char *print_object(cJSON *item,int depth,int fmt); /* Utility to jump whitespace and cr/lf */ static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;} /* Parse an object - create a new root, and populate. */ cJSON *cJSON_Parse(const char *value) { cJSON *c=cJSON_New_Item(); ep=0; if (!c) return 0; /* memory fail */ if (!parse_value(c,skip(value))) {cJSON_Delete(c);return 0;} return c; } /* Render a cJSON item/entity/structure to text. */ char *cJSON_Print(cJSON *item) {return print_value(item,0,1);} char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0);} /* Parser core - when encountering text, process appropriately. */ static const char *parse_value(cJSON *item,const char *value) { if (!value) return 0; /* Fail on null. */ if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; } if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; } if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; } if (*value=='\"') { return parse_string(item,value); } if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); } if (*value=='[') { return parse_array(item,value); } if (*value=='{') { return parse_object(item,value); } ep=value;return 0; /* failure. */ } /* Render a value to text. */ static char *print_value(cJSON *item,int depth,int fmt) { char *out=0; if (!item) return 0; switch ((item->type)&255) { case cJSON_NULL: out=cJSON_strdup("null"); break; case cJSON_False: out=cJSON_strdup("false");break; case cJSON_True: out=cJSON_strdup("true"); break; case cJSON_Number: out=print_number(item);break; case cJSON_String: out=print_string(item);break; case cJSON_Array: out=print_array(item,depth,fmt);break; case cJSON_Object: out=print_object(item,depth,fmt);break; } return out; } /* Build an array from input text. */ static const char *parse_array(cJSON *item,const char *value) { cJSON *child; if (*value!='[') {ep=value;return 0;} /* not an array! */ item->type=cJSON_Array; value=skip(value+1); if (*value==']') return value+1; /* empty array. */ item->child=child=cJSON_New_Item(); if (!item->child) return 0; /* memory fail */ value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */ if (!value) return 0; while (*value==',') { cJSON *new_item; if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ child->next=new_item;new_item->prev=child;child=new_item; value=skip(parse_value(child,skip(value+1))); if (!value) return 0; /* memory fail */ } if (*value==']') return value+1; /* end of array */ ep=value;return 0; /* malformed. */ } /* Render an array to text */ static char *print_array(cJSON *item,int depth,int fmt) { char **entries; char *out=0,*ptr,*ret;int len=5; cJSON *child=item->child; int numentries=0,i=0,fail=0; /* How many entries in the array? */ while (child) numentries++,child=child->next; /* Allocate an array to hold the values for each */ entries=(char**)cJSON_malloc(numentries*sizeof(char*)); if (!entries) return 0; memset(entries,0,numentries*sizeof(char*)); /* Retrieve all the results: */ child=item->child; while (child && !fail) { ret=print_value(child,depth+1,fmt); entries[i++]=ret; if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; child=child->next; } /* If we didn't fail, try to malloc the output string */ if (!fail) out=(char*)cJSON_malloc(len); /* If that fails, we fail. */ if (!out) fail=1; /* Handle failure. */ if (fail) { for (i=0;itype=cJSON_Object; value=skip(value+1); if (*value=='}') return value+1; /* empty array. */ item->child=child=cJSON_New_Item(); if (!item->child) return 0; value=skip(parse_string(child,skip(value))); if (!value) return 0; child->string=child->valuestring;child->valuestring=0; if (*value!=':') {ep=value;return 0;} /* fail! */ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; while (*value==',') { cJSON *new_item; if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ child->next=new_item;new_item->prev=child;child=new_item; value=skip(parse_string(child,skip(value+1))); if (!value) return 0; child->string=child->valuestring;child->valuestring=0; if (*value!=':') {ep=value;return 0;} /* fail! */ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; } if (*value=='}') return value+1; /* end of array */ ep=value;return 0; /* malformed. */ } /* Render an object to text. */ static char *print_object(cJSON *item,int depth,int fmt) { char **entries=0,**names=0; char *out=0,*ptr,*ret,*str;int len=7,i=0,j; cJSON *child=item->child; int numentries=0,fail=0; /* Count the number of entries. */ while (child) numentries++,child=child->next; /* Allocate space for the names and the objects */ entries=(char**)cJSON_malloc(numentries*sizeof(char*)); if (!entries) return 0; names=(char**)cJSON_malloc(numentries*sizeof(char*)); if (!names) {cJSON_free(entries);return 0;} memset(entries,0,sizeof(char*)*numentries); memset(names,0,sizeof(char*)*numentries); /* Collect all the results into our arrays: */ child=item->child;depth++;if (fmt) len+=depth; while (child) { names[i]=str=print_string_ptr(child->string); entries[i++]=ret=print_value(child,depth,fmt); if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; child=child->next; } /* Try to allocate the output string */ if (!fail) out=(char*)cJSON_malloc(len); if (!out) fail=1; /* Handle failure */ if (fail) { for (i=0;ichild;int i=0;while(c)i++,c=c->next;return i;} cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} /* Utility for array list handling. */ static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} /* Utility for handling references. */ static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;} /* Add item to array/object. */ void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}} void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));} cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0; if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} /* Replace array/object items with new ones. */ void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return; newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem; if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);} void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}} /* Create basic types: */ cJSON *cJSON_CreateNull() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} cJSON *cJSON_CreateTrue() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} cJSON *cJSON_CreateFalse() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} cJSON *cJSON_CreateBool(int b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;} cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} cJSON *cJSON_CreateArray() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} cJSON *cJSON_CreateObject() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} /* Create Arrays: */ cJSON *cJSON_CreateIntArray(int *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateFloatArray(float *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateDoubleArray(double *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/cJSON.h000066400000000000000000000132521221777731700221470ustar00rootroot00000000000000/* Copyright (c) 2009 Dave Gamble Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef cJSON__h #define cJSON__h #ifdef __cplusplus extern "C" { #endif /* cJSON Types: */ #define cJSON_False 0 #define cJSON_True 1 #define cJSON_NULL 2 #define cJSON_Number 3 #define cJSON_String 4 #define cJSON_Array 5 #define cJSON_Object 6 #define cJSON_IsReference 256 /* The cJSON structure: */ typedef struct cJSON { struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ int type; /* The type of the item, as above. */ char *valuestring; /* The item's string, if type==cJSON_String */ int valueint; /* The item's number, if type==cJSON_Number */ double valuedouble; /* The item's number, if type==cJSON_Number */ char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ } cJSON; typedef struct cJSON_Hooks { void *(*malloc_fn)(size_t sz); void (*free_fn)(void *ptr); } cJSON_Hooks; /* Supply malloc, realloc and free functions to cJSON */ extern void cJSON_InitHooks(cJSON_Hooks* hooks); /* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ extern cJSON *cJSON_Parse(const char *value); /* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ extern char *cJSON_Print(cJSON *item); /* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ extern char *cJSON_PrintUnformatted(cJSON *item); /* Delete a cJSON entity and all subentities. */ extern void cJSON_Delete(cJSON *c); /* Returns the number of items in an array (or object). */ extern int cJSON_GetArraySize(cJSON *array); /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ extern cJSON *cJSON_GetArrayItem(cJSON *array,int item); /* Get item "string" from object. Case insensitive. */ extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ extern const char *cJSON_GetErrorPtr(void); /* These calls create a cJSON item of the appropriate type. */ extern cJSON *cJSON_CreateNull(void); extern cJSON *cJSON_CreateTrue(void); extern cJSON *cJSON_CreateFalse(void); extern cJSON *cJSON_CreateBool(int b); extern cJSON *cJSON_CreateNumber(double num); extern cJSON *cJSON_CreateString(const char *string); extern cJSON *cJSON_CreateArray(void); extern cJSON *cJSON_CreateObject(void); /* These utilities create an Array of count items. */ extern cJSON *cJSON_CreateIntArray(int *numbers,int count); extern cJSON *cJSON_CreateFloatArray(float *numbers,int count); extern cJSON *cJSON_CreateDoubleArray(double *numbers,int count); extern cJSON *cJSON_CreateStringArray(const char **strings,int count); /* Append item to the specified array/object. */ extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item); /* Remove/Detatch items from Arrays/Objects. */ extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which); extern void cJSON_DeleteItemFromArray(cJSON *array,int which); extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string); /* Update array items. */ extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem); extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); #define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) #define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) #define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/vehicle_webos.c000066400000000000000000000224761221777731700240540ustar00rootroot00000000000000/** * vim: sw=3 ts=3 * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" #include "vehicle_webos.h" #include "bluetooth.h" static char *vehicle_webos_prefix="webos:"; /*******************************************************************/ static void vehicle_webos_callback(PDL_ServiceParameters *params, void *priv) { PDL_Location *location; SDL_Event event; SDL_UserEvent userevent; int err; err = PDL_GetParamInt(params, "errorCode"); if (err != 0) { dbg(0,"Location Callback errorCode %d\n", err); return /*PDL_EOTHER*/; } location = g_new0 (PDL_Location, 1); location->altitude = PDL_GetParamDouble(params, "altitude"); location->velocity = PDL_GetParamDouble(params, "velocity"); location->heading = PDL_GetParamDouble(params, "heading"); location->horizontalAccuracy = PDL_GetParamDouble(params, "horizAccuracy"); location->latitude = PDL_GetParamDouble(params, "latitude"); location->longitude = PDL_GetParamDouble(params, "longitude"); userevent.type = SDL_USEREVENT; userevent.code = PDL_GPS_UPDATE; userevent.data1 = location; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); return /*PDL_NOERROR*/; } static void vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location) { if(location) { // location may be NULL if called by bluetooth-code. priv is already prefilled there struct timeval tv; gettimeofday(&tv,NULL); priv->delta = (int)difftime(tv.tv_sec, priv->fix_time); dbg(2,"delta(%i)\n",priv->delta); priv->fix_time = tv.tv_sec; priv->geo.lat = location->latitude; /* workaround for webOS GPS bug following */ priv->geo.lng = (priv->pdk_version >= 200 && location->longitude >= -1 && location->longitude <= 1) ? -location->longitude : location->longitude; dbg(2,"Location: %f %f %f %.12g %.12g +-%fm\n", location->altitude, location->velocity, location->heading, priv->geo.lat, priv->geo.lng, location->horizontalAccuracy); if (location->altitude != -1) priv->altitude = location->altitude; if (location->velocity != -1) priv->speed = location->velocity * 3.6; if (location->heading != -1) priv->track = location->heading; if (location->horizontalAccuracy != -1) priv->radius = location->horizontalAccuracy; if (priv->pdk_version <= 100) g_free(location); } callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } static void vehicle_webos_timeout_callback(struct vehicle_priv *priv) { struct timeval tv; gettimeofday(&tv,NULL); if (priv->fix_time && priv->delta) { int delta = (int)difftime(tv.tv_sec, priv->fix_time); if (delta >= priv->delta*2) { dbg(1, "GPS timeout triggered cb(%p) delta(%d)\n", priv->timeout_cb, delta); priv->delta = -1; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } } } void vehicle_webos_close(struct vehicle_priv *priv) { event_remove_timeout(priv->ev_timeout); priv->ev_timeout = NULL; callback_destroy(priv->timeout_cb); if (priv->pdk_version <= 100) PDL_UnregisterServiceCallback((PDL_ServiceCallbackFunc)vehicle_webos_callback); else { PDL_EnableLocationTracking(PDL_FALSE); vehicle_webos_bt_close(priv); } } static int vehicle_webos_open(struct vehicle_priv *priv) { PDL_Err err; priv->pdk_version = PDL_GetPDKVersion(); dbg(1,"pdk_version(%d)\n", priv->pdk_version); if (priv->pdk_version <= 100) { // Use Location Service via callback interface err = PDL_ServiceCallWithCallback("palm://com.palm.location/startTracking", "{subscribe:true}", (PDL_ServiceCallbackFunc)vehicle_webos_callback, priv, PDL_FALSE); if (err != PDL_NOERROR) { dbg(0,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return 0; } } else { PDL_Err err; err = PDL_EnableLocationTracking(PDL_TRUE); if (err != PDL_NOERROR) { dbg(0,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError()); // vehicle_webos_close(priv); // return 0; } priv->gps_type = GPS_TYPE_INT; if(!vehicle_webos_bt_open(priv)) return 0; } priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb); return 1; } static void vehicle_webos_destroy(struct vehicle_priv *priv) { vehicle_webos_close(priv); if (priv->source) g_free(priv->source); g_free(priv); } static int vehicle_webos_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_height: dbg(2,"Altitude: %f\n", priv->altitude); attr->u.numd = &priv->altitude; break; case attr_position_speed: dbg(2,"Speed: %f\n", priv->speed); attr->u.numd = &priv->speed; break; case attr_position_direction: dbg(2,"Direction: %f\n", priv->track); attr->u.numd = &priv->track; break; case attr_position_magnetic_direction: switch (priv->gps_type) { case GPS_TYPE_BT: attr->u.num = priv->magnetic_direction; break; default: return 0; break; } break; case attr_position_hdop: switch (priv->gps_type) { case GPS_TYPE_BT: attr->u.numd = &priv->hdop; break; default: return 0; break; } break; case attr_position_coord_geo: dbg(2,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng); attr->u.coord_geo = &priv->geo; break; case attr_position_radius: dbg(2,"Radius: %f\n", priv->radius); attr->u.numd = &priv->radius; break; case attr_position_time_iso8601: if (priv->fix_time) { struct tm tm; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else { priv->fix_time = 0; return 0; } dbg(2,"Fix Time: %d %s\n", priv->fix_time, priv->fixiso8601); } else { dbg(2,"Fix Time: %d\n", priv->fix_time); return 0; } break; case attr_position_fix_type: switch (priv->gps_type) { case GPS_TYPE_INT: if (priv->delta <= 0 || priv->radius == 0.0) attr->u.num = 0; // strength = 1 else if (priv->radius > 20.0) attr->u.num = 1; // strength >= 2 else attr->u.num = 2; // strength >= 2 break; case GPS_TYPE_BT: attr->u.num = priv->status; break; default: return 0; break; } break; case attr_position_sats_used: switch (priv->gps_type) { case GPS_TYPE_INT: if (priv->delta <= 0) attr->u.num = 0; else if (priv->radius <= 6.0 ) attr->u.num = 6; // strength = 5 else if (priv->radius <= 10.0 ) attr->u.num = 5; // strength = 4 else if (priv->radius <= 15.0 ) attr->u.num = 4; // strength = 3 else return 0; break; case GPS_TYPE_BT: attr->u.num = priv->sats_used; break; default: return 0; break; } break; default: return 0; } attr->type = type; return 1; } static int vehicle_webos_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) { switch (attr->type) { case attr_source: if (strncmp(vehicle_webos_prefix,attr->u.str,strlen(vehicle_webos_prefix))) { dbg(1,"source must start with '%s'\n", vehicle_webos_prefix); return 0; } g_free(priv->source); priv->source=g_strdup(attr->u.str); priv->address=priv->source+strlen(vehicle_webos_prefix); if (!priv->address[0]) priv->address=NULL; if (!init) { vehicle_webos_close(priv); vehicle_webos_open(priv); } return 1; case attr_profilename: return 1; case attr_pdl_gps_update: vehicle_webos_gps_update(priv, (PDL_Location *)attr->u.data); return 1; default: return 0; } } static int vehicle_webos_set_attr(struct vehicle_priv *priv, struct attr *attr) { return vehicle_webos_set_attr_do(priv, attr, 0); } struct vehicle_methods vehicle_webos_methods = { vehicle_webos_destroy, vehicle_webos_position_attr_get, vehicle_webos_set_attr, }; static struct vehicle_priv * vehicle_webos_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *priv; priv = g_new0(struct vehicle_priv, 1); priv->attrs = attrs; priv->cbl = cbl; priv->timeout_cb = callback_new_1(callback_cast(vehicle_webos_timeout_callback), priv); *meth = vehicle_webos_methods; while (*attrs) { vehicle_webos_set_attr_do(priv, *attrs, 1); attrs++; } vehicle_webos_open(priv); return priv; } void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("webos", vehicle_webos_new); } navit-0.5.0~svn5643+dfsg.1/navit/vehicle/webos/vehicle_webos.h000066400000000000000000000013151221777731700240460ustar00rootroot00000000000000#include "coord.h" #define GPS_TYPE_NONE 0 #define GPS_TYPE_INT 1 #define GPS_TYPE_BT 2 struct vehicle_priv { char *address; char *source; char *spp_address; char *buffer; char *nmea_data_buf; char *nmea_data; char fixiso8601[128]; double track, speed, altitude, radius; double hdop; int gps_type; int pdk_version; int spp_instance_id; int buffer_pos; int delta; int sats_used; int sats_visible; int magnetic_direction; int status; int valid; time_t fix_time; struct attr ** attrs; struct callback *event_cb; struct callback *timeout_cb; struct callback_list *cbl; struct coord_geo geo; struct event_timeout *ev_timeout; }; extern void vehicle_webos_close(struct vehicle_priv *priv); navit-0.5.0~svn5643+dfsg.1/navit/vehicle/wince/000077500000000000000000000000001221777731700210455ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/vehicle/wince/CMakeLists.txt000066400000000000000000000000621221777731700236030ustar00rootroot00000000000000module_add_library(vehicle_wince vehicle_wince.c) navit-0.5.0~svn5643+dfsg.1/navit/vehicle/wince/Makefile.am000066400000000000000000000004771221777731700231110ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_wince if PLUGINS modulevehicle_LTLIBRARIES = libvehicle_wince.la else noinst_LTLIBRARIES = libvehicle_wince.la endif libvehicle_wince_la_SOURCES = vehicle_wince.c libvehicle_wince_la_LDFLAGS = -module -avoid-version navit-0.5.0~svn5643+dfsg.1/navit/vehicle/wince/vehicle_wince.c000066400000000000000000000556111221777731700240250ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include "config.h" #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "event.h" #include "vehicle.h" #include #include #include #include #include #include #include "support/win32/ConvertUTF.h" #define SwitchToThread() Sleep(0) typedef int (WINAPI *PFN_BthSetMode)(DWORD pBthMode); typedef int (WINAPI *PFN_BthGetMode)(DWORD* pBthMode); char *_convert = NULL; wchar_t *_wconvert = NULL; #define W2A(lpw) (\ ((LPCSTR)lpw == NULL) ? NULL : (\ _convert = alloca(wcslen(lpw)+1), wcstombs(_convert, lpw, wcslen(lpw) + 1), _convert) ) #define A2W(lpa) (\ ((LPCSTR)lpa == NULL) ? NULL : (\ _wconvert = alloca(strlen(lpa)*2+1), mbstowcs(_wconvert, lpa, strlen(lpa) * 2 + 1), _wconvert) ) static void vehicle_wince_disable_watch(struct vehicle_priv *priv); static void vehicle_wince_enable_watch(struct vehicle_priv *priv); static int vehicle_wince_parse(struct vehicle_priv *priv, char *buffer); static int vehicle_wince_open(struct vehicle_priv *priv); static void vehicle_wince_close(struct vehicle_priv *priv); enum file_type { file_type_pipe = 1, file_type_device, file_type_file, file_type_socket }; static int buffer_size = 1024; struct gps_sat { int prn; int elevation; int azimuth; int snr; }; struct vehicle_priv { char *source; struct callback_list *cbl; struct callback_list *priv_cbl; int is_running; int thread_up; int fd; HANDLE m_hGPSDevice; // Handle to the device HANDLE m_hGPSThread; // Handle to the thread DWORD m_dwGPSThread; // Thread id char *buffer; int buffer_pos; char *read_buffer; int read_buffer_pos; char *nmea_data; char *nmea_data_buf; struct coord_geo geo; double speed; double direction; double height; double hdop; double vdop; char fixtime[20]; int fixyear; int fixmonth; int fixday; int status; int sats_used; int sats_visible; int sats_signal; int time; int on_eof; int baudrate; enum file_type file_type; struct attr ** attrs; char fixiso8601[128]; int checksum_ignore; HMODULE hBthDll; PFN_BthSetMode BthSetMode; int magnetic_direction; int current_count; struct gps_sat current[24]; int next_count; struct gps_sat next[24]; struct item sat_item; int valid; int has_data; GMutex lock; }; static void initBth(struct vehicle_priv *priv) { BOOL succeeded = FALSE; priv->hBthDll = LoadLibrary(TEXT("bthutil.dll")); if ( priv->hBthDll ) { DWORD bthMode; PFN_BthGetMode BthGetMode = (PFN_BthGetMode)GetProcAddress(priv->hBthDll, TEXT("BthGetMode") ); if ( BthGetMode && BthGetMode(&bthMode) == ERROR_SUCCESS && bthMode == 0 ) { priv->BthSetMode = (PFN_BthSetMode)GetProcAddress(priv->hBthDll, TEXT("BthSetMode") ); if( priv->BthSetMode && priv->BthSetMode(1) == ERROR_SUCCESS ) { dbg(1, "bluetooth activated\n"); succeeded = TRUE; } } } else { dbg(0, "Bluetooth library notfound\n"); } if ( !succeeded ) { dbg(1, "Bluetooth already enabled or failed to enable it.\n"); priv->BthSetMode = NULL; if ( priv->hBthDll ) { FreeLibrary(priv->hBthDll); } } } static int initDevice(struct vehicle_priv *priv) { COMMTIMEOUTS commTiming; HANDLE hGPS; if ( priv->m_hGPSDevice ) CloseHandle(priv->m_hGPSDevice); if ( priv->file_type == file_type_device ) { dbg(0, "Init Device\n"); /* GPD0 is the control port for the GPS driver */ hGPS = CreateFile(L"GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hGPS != INVALID_HANDLE_VALUE) { #ifndef IOCTL_SERVICE_REFRESH #define IOCTL_SERVICE_REFRESH 0x4100000C #endif DeviceIoControl(hGPS,IOCTL_SERVICE_REFRESH,0,0,0,0,0,0); #ifndef IOCTL_SERVICE_START #define IOCTL_SERVICE_START 0x41000004 #endif DeviceIoControl(hGPS,IOCTL_SERVICE_START,0,0,0,0,0,0); CloseHandle(hGPS); } while (priv->is_running && (priv->m_hGPSDevice = CreateFile(A2W(priv->source), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) { Sleep(1000); dbg(0, "Waiting to connect to %s\n", priv->source); } GetCommTimeouts (priv->m_hGPSDevice, &commTiming); commTiming.ReadIntervalTimeout = 20; commTiming.ReadTotalTimeoutMultiplier = 0; commTiming.ReadTotalTimeoutConstant = 200; commTiming.WriteTotalTimeoutMultiplier=5; commTiming.WriteTotalTimeoutConstant=5; SetCommTimeouts (priv->m_hGPSDevice, &commTiming); if (priv->baudrate) { DCB portState; if (!GetCommState(priv->m_hGPSDevice, &portState)) { MessageBox (NULL, TEXT ("GetCommState Error"), TEXT (""), MB_APPLMODAL|MB_OK); priv->thread_up = 0; return 0; } portState.BaudRate = priv->baudrate; if (!SetCommState(priv->m_hGPSDevice, &portState)) { MessageBox (NULL, TEXT ("SetCommState Error"), TEXT (""), MB_APPLMODAL|MB_OK); priv->thread_up = 0; return 0; } } } else { dbg(0, "Open File\n"); priv->m_hGPSDevice = CreateFileW( A2W(priv->source), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); if ( priv->m_hGPSDevice == INVALID_HANDLE_VALUE) { dbg(0, "Could not open %s\n", priv->source); return 0; } } return 1; } static int read_win32(struct vehicle_priv *priv, char *buffer, size_t size) { int ret_size; g_mutex_lock(&priv->lock); ret_size = MIN(size,priv->read_buffer_pos); priv->has_data = 0; memcpy(buffer, priv->read_buffer, ret_size); memmove(priv->read_buffer, priv->read_buffer + ret_size, buffer_size - ret_size); priv->read_buffer_pos -= ret_size; g_mutex_unlock(&priv->lock); return ret_size; } static DWORD WINAPI wince_reader_thread (LPVOID lParam) { struct vehicle_priv *priv = lParam; char chunk_buffer[3*82]; BOOL status; DWORD bytes_read; int waitcounter; dbg(0, "GPS Port:[%s]\n", priv->source); priv->thread_up = 1; if ( !initDevice(priv) ) { return -1; } while (priv->is_running) { dbg(1,"readfile\n"); waitcounter = 0; status = ReadFile(priv->m_hGPSDevice, chunk_buffer, sizeof(chunk_buffer), &bytes_read, NULL); if ( !status ) { dbg(0,"Error reading file/device. Try again.\n"); initDevice(priv); continue; } while ( priv->read_buffer_pos + bytes_read > buffer_size ) { /* TODO (rikky#1#): should use blocking */ if ( priv->file_type != file_type_file ) { dbg(3, "GPS data comes too fast. Have to wait here\n"); } Sleep(50); waitcounter++; if ( waitcounter % 8 == 0 ) { dbg(1, "Remind them of the data\n"); event_call_callback(priv->priv_cbl); } if(waitcounter % 200 == 0) { dbg(0,"Will main thread ever be ready for the GPS data? Already %d intervals gone.\n",waitcounter); } } if(waitcounter>2) dbg(0,"Sent GPS data to the main thread after %d intervals delay.\n",waitcounter); g_mutex_lock(&priv->lock); memcpy(priv->read_buffer + priv->read_buffer_pos , chunk_buffer, bytes_read ); priv->read_buffer_pos += bytes_read; if ( !priv->has_data ) { event_call_callback(priv->priv_cbl); priv->has_data = 1; } g_mutex_unlock(&priv->lock); } return TRUE; } static int vehicle_wince_available_ports(void) { HKEY hkResult; HKEY hkSubResult; wchar_t keyname[20]; wchar_t devicename[100]; wchar_t devicetype[100]; int index = 0; DWORD regkey_length = sizeof(keyname); DWORD regdevtype_length = sizeof(devicetype); RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Drivers\\Active"), 0, 0, &hkResult); while (RegEnumKeyEx( hkResult, index++, keyname, ®key_length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) { if (RegOpenKeyEx( hkResult, keyname, 0, 0, &hkSubResult) == ERROR_SUCCESS ) { regkey_length = sizeof(keyname); if ( RegQueryValueEx( hkSubResult, L"Name", NULL, NULL, (LPBYTE)devicename, ®key_length) == ERROR_SUCCESS ) { regdevtype_length = sizeof(devicetype); if ( RegQueryValueEx( hkSubResult, L"Key", NULL, NULL, (LPBYTE)devicetype, ®devtype_length) == ERROR_SUCCESS ) { dbg(0, "Found device '%s' (%s)\n", W2A(devicename), W2A(devicetype)); } else { dbg(0, "Found device '%s'\n", W2A(devicename)); } } RegCloseKey(hkSubResult); } regkey_length = sizeof(keyname); } RegCloseKey(hkResult); return 0; } static int vehicle_wince_open(struct vehicle_priv *priv) { char* raw_setting_str; char* strport; char* strsettings; dbg(1, "enter vehicle_wince_open, priv->source='%s'\n", priv->source); if (priv->source ) { if ( strcmp(priv->source, "list") == 0 ) { vehicle_wince_available_ports(); return 0; } raw_setting_str = g_strdup( priv->source ); strport = strchr(raw_setting_str, ':' ); strsettings = strchr(raw_setting_str, ' ' ); if (raw_setting_str && strport&&strsettings ) { strport++; *strsettings = '\0'; strsettings++; dbg(0, "serial('%s', '%s')\n", strport, strsettings ); } if (raw_setting_str) g_free( raw_setting_str ); } return 1; } static void vehicle_wince_close(struct vehicle_priv *priv) { dbg(1,"enter"); } static int vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) { char *nmea_data_buf, *p, *item[32]; double lat, lng; int i, j, bcsum; int len = strlen(buffer); unsigned char csum = 0; int valid=0; int ret = 0; dbg(2, "enter: buffer='%s'\n", buffer); for (;;) { if (len < 4) { dbg(0, "'%s' too short\n", buffer); return ret; } if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { buffer[--len] = '\0'; if (buffer[len - 1] == '\r') buffer[--len] = '\0'; } else break; } if (buffer[0] != '$') { dbg(0, "no leading $ in '%s'\n", buffer); return ret; } if (buffer[len - 3] != '*') { dbg(0, "no *XX in '%s'\n", buffer); return ret; } for (i = 1; i < len - 3; i++) { csum ^= (unsigned char) (buffer[i]); } if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) { dbg(0, "no checksum in '%s'\n", buffer); return ret; } if (bcsum != csum && priv->checksum_ignore == 0) { dbg(0, "wrong checksum in '%s'\n", buffer); return ret; } if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); } i = 0; p = buffer; while (i < 31) { item[i++] = p; while (*p && *p != ',') p++; if (!*p) break; *p++ = '\0'; } if (!strncmp(buffer, "$GPGGA", 6)) { /* 1 1111 0 1 2 3 4 5 6 7 8 9 0 1234 $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] */ if (*item[2] && *item[3] && *item[4] && *item[5]) { lat = g_ascii_strtod(item[2], NULL); priv->geo.lat = floor(lat / 100); lat -= priv->geo.lat * 100; priv->geo.lat += lat / 60; if (!g_strcasecmp(item[3],"S")) priv->geo.lat=-priv->geo.lat; lng = g_ascii_strtod(item[4], NULL); priv->geo.lng = floor(lng / 100); lng -= priv->geo.lng * 100; priv->geo.lng += lng / 60; if (!g_strcasecmp(item[5],"W")) priv->geo.lng=-priv->geo.lng; priv->valid=attr_position_valid_valid; dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); } else priv->valid=attr_position_valid_invalid; if (*item[6]) sscanf(item[6], "%d", &priv->status); if (*item[7]) sscanf(item[7], "%d", &priv->sats_used); if (*item[8]) sscanf(item[8], "%lf", &priv->hdop); if (*item[1]) strncpy(priv->fixtime, item[1], sizeof(priv->fixtime)); if (*item[9]) sscanf(item[9], "%lf", &priv->height); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; } if (!strncmp(buffer, "$GPVTG", 6)) { /* 0 1 2 34 5 6 7 8 $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] */ if (item[1] && item[7]) valid = 1; if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[1], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); dbg(2,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed); } } if (!strncmp(buffer, "$GPRMC", 6)) { /* 1 1 0 1 2 3 4 5 6 7 8 9 0 1 $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], magnetic variation[10],magnetic variation direction[11] */ if (*item[2] == 'A') valid = 1; if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[8], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); priv->speed *= 1.852; sscanf(item[9], "%02d%02d%02d", &priv->fixday, &priv->fixmonth, &priv->fixyear); priv->fixyear += 2000; } ret = 1; } if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { /* 0 GSV Satellites in view 1 2 Number of sentences for full data 2 1 sentence 1 of 2 3 08 Number of satellites in view 4 01 Satellite PRN number 5 40 Elevation, degrees 6 083 Azimuth, degrees 7 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * */ if (item[3]) { sscanf(item[3], "%d", &priv->sats_visible); } j=4; while (j+4 <= i && priv->current_count < 24) { struct gps_sat *sat=&priv->next[priv->next_count++]; sat->prn=atoi(item[j]); sat->elevation=atoi(item[j+1]); sat->azimuth=atoi(item[j+2]); sat->snr=atoi(item[j+3]); j+=4; } if (!strcmp(item[1], item[2])) { priv->sats_signal=0; for (i = 0 ; i < priv->next_count ; i++) { priv->current[i]=priv->next[i]; if (priv->current[i].snr) priv->sats_signal++; } priv->current_count=priv->next_count; priv->next_count=0; } } if (!strncmp(buffer, "$GPZDA", 6)) { /* 0 1 2 3 4 5 6 $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC hhmmss HrMinSec(UTC) dd,mm,yyy Day,Month,Year xx local zone hours -13..13 yy local zone minutes 0..59 */ if (item[1] && item[2] && item[3] && item[4]) { strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); priv->fixday = atoi(item[2]); priv->fixmonth = atoi(item[3]); priv->fixyear = atoi(item[4]); } } if (!strncmp(buffer, "$IISMD", 6)) { /* 0 1 2 3 4 $IISMD,dir,press,height,temp*CC" dir Direction (0-359) press Pressure (hpa, i.e. 1032) height Barometric height above ground (meter) temp Temperature (Degree Celsius) */ if (item[1]) { priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); dbg(1,"magnetic %d\n", priv->magnetic_direction); } } return ret; } static void vehicle_wince_io(struct vehicle_priv *priv) { int size, rc = 0; char *str, *tok; dbg(1, "vehicle_file_io : enter\n"); size = read_win32(priv, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); if (size <= 0) { switch (priv->on_eof) { case 0: vehicle_wince_close(priv); vehicle_wince_open(priv); break; case 1: vehicle_wince_disable_watch(priv); break; case 2: exit(0); break; } return; } priv->buffer_pos += size; priv->buffer[priv->buffer_pos] = '\0'; dbg(1, "size=%d pos=%d buffer='%s'\n", size, priv->buffer_pos, priv->buffer); str = priv->buffer; while ((tok = strchr(str, '\n'))) { *tok++ = '\0'; dbg(1, "line='%s'\n", str); rc +=vehicle_wince_parse(priv, str); str = tok; if (priv->file_type == file_type_file && rc) break; } if (str != priv->buffer) { size = priv->buffer + priv->buffer_pos - str; memmove(priv->buffer, str, size + 1); priv->buffer_pos = size; dbg(2, "now pos=%d buffer='%s'\n", priv->buffer_pos, priv->buffer); } else if (priv->buffer_pos == buffer_size - 1) { dbg(0, "Overflow. Most likely wrong baud rate or no nmea protocol\n"); priv->buffer_pos = 0; } if (rc) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } static void vehicle_wince_enable_watch(struct vehicle_priv *priv) { dbg(1, "enter"); vehicle_wince_disable_watch(priv); priv->is_running = 1; InitializeCriticalSection(&priv->lock); priv->m_hGPSThread = CreateThread(NULL, 0, wince_reader_thread, priv, 0, &priv->m_dwGPSThread); if (!priv->m_hGPSThread) { priv->is_running = 0; // error creating thread MessageBox (NULL, TEXT ("Can not create GPS reader thread"), TEXT (""), MB_APPLMODAL|MB_OK); } } static void vehicle_wince_disable_watch(struct vehicle_priv *priv) { int wait = 5000; dbg(1, "enter"); priv->is_running = 0; while (wait-- > 0 && priv->thread_up) { SwitchToThread(); } if (priv->m_hGPSThread) { // Terminate reader, sorry TerminateThread(priv->m_hGPSThread, -1); } } static void vehicle_wince_destroy(struct vehicle_priv *priv) { vehicle_wince_disable_watch(priv); vehicle_wince_close(priv); if (priv->BthSetMode) { (void)priv->BthSetMode(0); FreeLibrary(priv->hBthDll); } if (priv->source) g_free(priv->source); if (priv->buffer) g_free(priv->buffer); if (priv->read_buffer) g_free(priv->read_buffer); g_free(priv); } static int vehicle_wince_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_fix_type: attr->u.num = priv->status; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_magnetic_direction: attr->u.num = priv->magnetic_direction; break; case attr_position_hdop: attr->u.numd = &priv->hdop; break; case attr_position_qual: attr->u.num = priv->sats_visible; break; case attr_position_sats_signal: attr->u.num = priv->sats_signal; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_nmea: attr->u.str=priv->nmea_data; if (! attr->u.str) return 0; break; case attr_position_time_iso8601: if (!priv->fixyear || !priv->fixtime[0]) return 0; sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ", priv->fixyear, priv->fixmonth, priv->fixday, priv->fixtime, (priv->fixtime+2), (priv->fixtime+4)); attr->u.str=priv->fixiso8601; break; case attr_position_sat_item: dbg(0,"at here\n"); priv->sat_item.id_lo++; if (priv->sat_item.id_lo > priv->current_count) { priv->sat_item.id_lo=0; return 0; } attr->u.item=&priv->sat_item; break; case attr_position_valid: attr->u.num=priv->valid; break; default: return 0; } if (type != attr_position_sat_item) priv->sat_item.id_lo=0; attr->type = type; return 1; } static int vehicle_wince_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) { struct vehicle_priv *priv=priv_data; struct gps_sat *sat; if (priv->sat_item.id_lo < 1) return 0; if (priv->sat_item.id_lo > priv->current_count) return 0; sat=&priv->current[priv->sat_item.id_lo-1]; switch (type) { case attr_sat_prn: attr->u.num=sat->prn; break; case attr_sat_elevation: attr->u.num=sat->elevation; break; case attr_sat_azimuth: attr->u.num=sat->azimuth; break; case attr_sat_snr: attr->u.num=sat->snr; break; default: return 0; } attr->type = type; return 1; } static struct item_methods vehicle_wince_sat_methods = { NULL, NULL, NULL, vehicle_wince_sat_attr_get, NULL, NULL, NULL, NULL, }; struct vehicle_methods vehicle_wince_methods = { vehicle_wince_destroy, vehicle_wince_position_attr_get, NULL, }; static struct vehicle_priv * vehicle_wince_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source; struct attr *time; struct attr *on_eof; struct attr *baudrate; struct attr *checksum_ignore; struct attr *handle_bluetooth; char *cp; dbg(1, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->fd = -1; ret->cbl = cbl; ret->file_type = file_type_device; cp = strchr(source->u.str,':'); if (cp) { if ( strncmp(source->u.str, "file", 4) == 0 ) ret->file_type = file_type_file; cp++; } else cp = source->u.str; ret->source = g_strdup(cp); ret->buffer = g_malloc(buffer_size); ret->time=1000; ret->baudrate=0; // do not change the rate if not configured time = attr_search(attrs, NULL, attr_time); if (time) ret->time=time->u.num; baudrate = attr_search(attrs, NULL, attr_baudrate); if (baudrate) { ret->baudrate = baudrate->u.num; } checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore); if (checksum_ignore) ret->checksum_ignore=checksum_ignore->u.num; ret->attrs = attrs; on_eof = attr_search(attrs, NULL, attr_on_eof); if (on_eof && !g_strcasecmp(on_eof->u.str, "stop")) ret->on_eof=1; if (on_eof && !g_strcasecmp(on_eof->u.str, "exit")) ret->on_eof=2; dbg(0,"on_eof=%d\n", ret->on_eof); *meth = vehicle_wince_methods; ret->priv_cbl = callback_list_new(); callback_list_add(ret->priv_cbl, callback_new_1(callback_cast(vehicle_wince_io), ret)); ret->sat_item.type=type_position_sat; ret->sat_item.id_hi=ret->sat_item.id_lo=0; ret->sat_item.priv_data=ret; ret->sat_item.meth=&vehicle_wince_sat_methods; ret->read_buffer = g_malloc(buffer_size); handle_bluetooth = attr_search(attrs, NULL, attr_bluetooth); if ( handle_bluetooth && handle_bluetooth->u.num == 1 ) initBth(ret); if (vehicle_wince_open(ret)) { vehicle_wince_enable_watch(ret); return ret; } dbg(0, "Failed to open '%s'\n", ret->source); vehicle_wince_destroy(ret); return NULL; } void plugin_init(void) { dbg(1, "enter\n"); plugin_register_vehicle_type("wince", vehicle_wince_new); plugin_register_vehicle_type("file", vehicle_wince_new); } navit-0.5.0~svn5643+dfsg.1/navit/vehicleprofile.c000066400000000000000000000233751221777731700214770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "roadprofile.h" #include "vehicleprofile.h" #include "callback.h" static void vehicleprofile_set_attr_do(struct vehicleprofile *this_, struct attr *attr) { dbg(1,"%s:%ld\n", attr_to_name(attr->type), attr->u.num); switch (attr->type) { case attr_flags: this_->flags=attr->u.num; break; case attr_flags_forward_mask: this_->flags_forward_mask=attr->u.num; break; case attr_flags_reverse_mask: this_->flags_reverse_mask=attr->u.num; break; case attr_maxspeed_handling: this_->maxspeed_handling=attr->u.num; break; case attr_route_mode: this_->mode=attr->u.num; break; case attr_name: if(this_->name) g_free(this_->name); /* previously used strdupn not available on win32 */ this_->name = g_strdup(attr->u.str); break; case attr_route_depth: if(this_->route_depth) g_free(this_->route_depth); this_->route_depth = g_strdup(attr->u.str); break; case attr_vehicle_axle_weight: this_->axle_weight=attr->u.num; break; case attr_vehicle_dangerous_goods: this_->dangerous_goods=attr->u.num; break; case attr_vehicle_height: this_->height=attr->u.num; break; case attr_vehicle_length: this_->length=attr->u.num; break; case attr_vehicle_weight: this_->weight=attr->u.num; break; case attr_vehicle_width: this_->width=attr->u.num; break; case attr_static_speed: this_->static_speed=attr->u.num; break; case attr_static_distance: this_->static_distance=attr->u.num; break; case attr_through_traffic_penalty: this_->through_traffic_penalty=attr->u.num; break; case attr_turn_around_penalty: this_->turn_around_penalty=attr->u.num; break; case attr_turn_around_penalty2: this_->turn_around_penalty2=attr->u.num; break; default: break; } } static void vehicleprofile_free_hash_item(gpointer key, gpointer value, gpointer user_data) { struct navit_object *obj=value; obj->func->unref(obj); } static void vehicleprofile_free_hash(struct vehicleprofile *this_) { if (this_->roadprofile_hash) { g_hash_table_foreach(this_->roadprofile_hash, vehicleprofile_free_hash_item, NULL); g_hash_table_destroy(this_->roadprofile_hash); } } static void vehicleprofile_clear(struct vehicleprofile *this_) { this_->mode=0; this_->flags_forward_mask=0; this_->flags_reverse_mask=0; this_->flags=0; this_->maxspeed_handling=0; this_->static_speed=0; this_->static_distance=0; g_free(this_->name); this_->name=NULL; g_free(this_->route_depth); this_->route_depth=NULL; this_->dangerous_goods=0; this_->length=-1; this_->width=-1; this_->height=-1; this_->weight=-1; this_->axle_weight=-1; this_->through_traffic_penalty=9000; vehicleprofile_free_hash(this_); this_->roadprofile_hash=g_hash_table_new(NULL, NULL); } static void vehicleprofile_apply_roadprofile(struct vehicleprofile *this_, struct navit_object *rp, int is_option) { struct attr item_types_attr; if (rp->func->get_attr(rp, attr_item_types, &item_types_attr, NULL)) { enum item_type *types=item_types_attr.u.item_types; while (*types != type_none) { struct navit_object *oldrp; /* Maptool won't place any access flags for roads which don't have default access flags set. Warn user. */ if(!item_get_default_flags(*types)) dbg(0,"On '%s' roads used in '%s' vehicleprofile access restrictions are ignored. You might even be directed to drive in wrong direction on a one-way road. " "Please define default access flags for above road type to item.c and rebuild the map.\n", item_to_name(*types), this_->name); oldrp=g_hash_table_lookup(this_->roadprofile_hash, (void *)(long)(*types)); if (is_option && oldrp) { struct navit_object *newrp; struct attr_iter *iter=rp->func->iter_new(NULL); struct attr attr; dbg(1,"patching roadprofile\n"); newrp=oldrp->func->dup(oldrp); while (rp->func->get_attr(rp, attr_any, &attr, iter)) newrp->func->set_attr(newrp, &attr); oldrp->func->iter_destroy(iter); oldrp->func->unref(oldrp); g_hash_table_insert(this_->roadprofile_hash, (void *)(long)(*types), newrp); } else { if (oldrp) oldrp->func->unref(oldrp); g_hash_table_insert(this_->roadprofile_hash, (void *)(long)(*types), rp->func->ref(rp)); } types++; } } } static void vehicleprofile_apply_attrs(struct vehicleprofile *this_, struct navit_object *obj, int is_option) { struct attr attr; struct attr_iter *iter=obj->func->iter_new(NULL); while (obj->func->get_attr(obj, attr_any, &attr, iter)) { dbg(1,"%s\n",attr_to_name(attr.type)); if (attr.type == attr_roadprofile) vehicleprofile_apply_roadprofile(this_, attr.u.navit_object, is_option); else if (attr.type != attr_profile_option) vehicleprofile_set_attr_do(this_, &attr); } obj->func->iter_destroy(iter); } static void vehicleprofile_debug_roadprofile(gpointer key, gpointer value, gpointer user_data) { struct roadprofile *rp=value; dbg(3,"type %s avg %d weight %d max %d\n",item_to_name((int)(long)key),rp->speed,rp->route_weight,rp->maxspeed); } static void vehicleprofile_update(struct vehicleprofile *this_) { struct attr_iter *iter=vehicleprofile_attr_iter_new(); struct attr profile_option; dbg(3,"enter\n"); vehicleprofile_clear(this_); vehicleprofile_apply_attrs(this_, (struct navit_object *)this_, 0); while (vehicleprofile_get_attr(this_, attr_profile_option, &profile_option, iter)) { struct attr active, name; if (!profile_option.u.navit_object->func->get_attr(profile_option.u.navit_object, attr_active, &active, NULL)) active.u.num=0; if (profile_option.u.navit_object->func->get_attr(profile_option.u.navit_object, attr_name, &name, NULL)) dbg(3,"%p %s %ld\n",profile_option.u.navit_object,name.u.str,active.u.num); if (active.u.num) vehicleprofile_apply_attrs(this_, profile_option.u.navit_object, 1); } vehicleprofile_attr_iter_destroy(iter); dbg(3,"result l %d w %d h %d wg %d awg %d pen %d\n",this_->length,this_->width,this_->height,this_->weight,this_->axle_weight,this_->through_traffic_penalty); dbg(3,"m %d fwd 0x%x rev 0x%x flags 0x%x max %d stsp %d stdst %d dg %d\n",this_->mode,this_->flags_forward_mask,this_->flags_reverse_mask, this_->flags, this_->maxspeed_handling, this_->static_speed, this_->static_distance, this_->dangerous_goods); g_hash_table_foreach(this_->roadprofile_hash, vehicleprofile_debug_roadprofile, NULL); } struct vehicleprofile * vehicleprofile_new(struct attr *parent, struct attr **attrs) { struct vehicleprofile *this_; struct attr **attr, *type_attr; if (! (type_attr=attr_search(attrs, NULL, attr_name))) { return NULL; } this_=g_new0(struct vehicleprofile, 1); this_->func=&vehicleprofile_func; navit_object_ref((struct navit_object *)this_); this_->attrs=attr_list_dup(attrs); this_->active_callback.type=attr_callback; this_->active_callback.u.callback=callback_new_attr_1(callback_cast(vehicleprofile_update), attr_active, this_); vehicleprofile_clear(this_); for (attr=attrs;*attr; attr++) vehicleprofile_set_attr_do(this_, *attr); return this_; } struct attr_iter * vehicleprofile_attr_iter_new(void) { return (struct attr_iter *)g_new0(void *,1); } void vehicleprofile_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } int vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr) { vehicleprofile_set_attr_do(this_, attr); this_->attrs=attr_generic_set_attr(this_->attrs, attr); return 1; } int vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr) { this_->attrs=attr_generic_add_attr(this_->attrs, attr); switch (attr->type) { case attr_roadprofile: vehicleprofile_apply_roadprofile(this_, attr->u.navit_object, 0); break; case attr_profile_option: attr->u.navit_object->func->add_attr(attr->u.navit_object, &this_->active_callback); break; default: break; } return 1; } int vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr) { this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; } struct roadprofile * vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type) { return g_hash_table_lookup(this_->roadprofile_hash, (void *)(long)type); } char * vehicleprofile_get_name(struct vehicleprofile *this_) { return this_->name; } static void vehicleprofile_init(struct vehicleprofile *this_) { vehicleprofile_update(this_); } struct object_func vehicleprofile_func = { attr_vehicleprofile, (object_func_new)vehicleprofile_new, (object_func_get_attr)vehicleprofile_get_attr, (object_func_iter_new)vehicleprofile_attr_iter_new, (object_func_iter_destroy)vehicleprofile_attr_iter_destroy, (object_func_set_attr)vehicleprofile_set_attr, (object_func_add_attr)vehicleprofile_add_attr, (object_func_remove_attr)vehicleprofile_remove_attr, (object_func_init)vehicleprofile_init, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0~svn5643+dfsg.1/navit/vehicleprofile.h000066400000000000000000000055401221777731700214760ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { #endif struct vehicleprofile { NAVIT_OBJECT int mode; /**< 0 = Auto, 1 = On-Road, 2 = Off-Road */ int flags_forward_mask; /**< Flags mask for moving in positive direction */ int flags_reverse_mask; /**< Flags mask for moving in reverse direction */ int flags; /**< Required flags to move through a segment */ int maxspeed_handling; /**< 0 = Always, 1 = Only if lower, 2 = Never */ int static_speed; /**< Maximum speed of vehicle to consider it stationary */ int static_distance; /**< Maximum distance of previous position of vehicle to consider it stationary */ char *name; /**< the vehicle profile name */ char *route_depth; /**< the route depth attribute */ int width; /**< Width of the vehicle in cm */ int height; /**< Height of the vehicle in cm */ int length; /**< Length of the vehicle in cm */ int weight; /**< Weight of the vehicle in kg */ int axle_weight; /**< Axle Weight of the vehicle in kg */ int dangerous_goods; /**< Flags of dangerous goods present */ int through_traffic_penalty; /**< Penalty when driving on a through traffic limited road */ GHashTable *roadprofile_hash; struct attr active_callback; int turn_around_penalty; /**< Penalty when turning around */ int turn_around_penalty2; /**< Penalty when turning around, for planned turn arounds */ }; struct vehicleprofile * vehicleprofile_new(struct attr *parent, struct attr **attrs); struct attr_iter *vehicleprofile_attr_iter_new(void); void vehicleprofile_attr_iter_destroy(struct attr_iter *iter); int vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr); int vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr); int vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr); struct roadprofile * vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type); //! Returns the vehicle profile's name. char * vehicleprofile_get_name(struct vehicleprofile *this_); #ifdef __cplusplus } #endif navit-0.5.0~svn5643+dfsg.1/navit/version.h.in000066400000000000000000000001261221777731700205630ustar00rootroot00000000000000#cmakedefine SVN_VERSION "@SVN_VERSION@" #cmakedefine NAVIT_VARIANT "@NAVIT_VARIANT@" navit-0.5.0~svn5643+dfsg.1/navit/window.h000066400000000000000000000015501221777731700200020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct window { void *priv; int (*fullscreen)(struct window *win, int on); void (*disable_suspend)(struct window *win); }; navit-0.5.0~svn5643+dfsg.1/navit/xmlconfig.c000066400000000000000000001044311221777731700204560ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* see http://library.gnome.org/devel/glib/stable/glib-Simple-XML-Subset-Parser.html * for details on how the xml file parser works. */ #include #include #include #include #include #include "debug.h" #include "file.h" #include "coord.h" #include "item.h" #include "xmlconfig.h" #include "layout.h" #include "mapset.h" #include "projection.h" #include "map.h" #include "navigation.h" #include "navit.h" #include "plugin.h" #include "route.h" #include "speech.h" #include "track.h" #include "vehicle.h" #include "point.h" #include "graphics.h" #include "gui.h" #include "osd.h" #include "log.h" #include "announcement.h" #include "vehicleprofile.h" #include "callback.h" #include "config_.h" #if (defined __MINGW32__) || (defined _MSC_VER) /* This only works if a is a string constant, i.e. "name" */ #define unsetenv(a) putenv(a "=") #endif struct xistate { struct xistate *parent; struct xistate *child; const gchar *element; const gchar **attribute_names; const gchar **attribute_values; }; struct xmldocument { const gchar *href; const gchar *xpointer; gpointer user_data; struct xistate *first; struct xistate *last; int active; int level; }; struct xmlstate { const gchar **attribute_names; const gchar **attribute_values; struct xmlstate *parent; struct attr element_attr; const gchar *element; xmlerror **error; struct element_func *func; struct object_func *object_func; struct xmldocument *document; }; struct attr_fixme { char *element; char **attr_fixme; }; static struct attr ** convert_to_attrs(struct xmlstate *state, struct attr_fixme *fixme) { const gchar **attribute_name=state->attribute_names; const gchar **attribute_value=state->attribute_values; const gchar *name; int count=0; struct attr **ret; static int fixme_count; while (*attribute_name) { count++; attribute_name++; } ret=g_new(struct attr *, count+1); attribute_name=state->attribute_names; count=0; while (*attribute_name) { name=*attribute_name; if (fixme) { char **attr_fixme=fixme->attr_fixme; while (attr_fixme[0]) { if (! strcmp(name, attr_fixme[0])) { name=attr_fixme[1]; if (fixme_count++ < 10) dbg(0,"Please change attribute '%s' to '%s' in <%s />\n", attr_fixme[0], attr_fixme[1], fixme->element); break; } attr_fixme+=2; } } ret[count]=attr_new_from_text(name,*attribute_value); if (ret[count]) count++; else if (strcmp(*attribute_name,"enabled") && strcmp(*attribute_name,"xmlns:xi")) dbg(0,"failed to create attribute '%s' with value '%s'\n", *attribute_name,*attribute_value); attribute_name++; attribute_value++; } ret[count]=NULL; dbg(3,"ret=%p\n", ret); return ret; } static const char * find_attribute(struct xmlstate *state, const char *attribute, int required) { const gchar **attribute_name=state->attribute_names; const gchar **attribute_value=state->attribute_values; while(*attribute_name) { if(! g_ascii_strcasecmp(attribute,*attribute_name)) return *attribute_value; attribute_name++; attribute_value++; } if (required) g_set_error(state->error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "element '%s' is missing attribute '%s'", state->element, attribute); return NULL; } static int find_boolean(struct xmlstate *state, const char *attribute, int deflt, int required) { const char *value; value=find_attribute(state, attribute, required); if (! value) return deflt; if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) return 1; return 0; } /** * * Convert a string number to int * * * * @param val the string value to convert * * @returns int value of converted string * */ static int convert_number(const char *val) { if (val) return g_ascii_strtoull(val,NULL,0); else return 0; } static int xmlconfig_announce(struct xmlstate *state) { const char *type,*value; char key[32]; int level[3]; int i; enum item_type itype; char *tok, *type_str, *str; type=find_attribute(state, "type", 1); if (! type) return 0; for (i = 0 ; i < 3 ; i++) { sprintf(key,"level%d", i); value=find_attribute(state, key, 0); if (value) level[i]=convert_number(value); else level[i]=-1; } type_str=g_strdup(type); str=type_str; while ((tok=strtok(str, ","))) { itype=item_from_name(tok); if (itype!=type_none) { navigation_set_announce(state->parent->element_attr.u.data, itype, level); } else { dbg(0, "Invalid type for announcement: %s\n",tok); } str=NULL; } g_free(type_str); return 1; } /** * * Define the elements in our config * * * */ #define NEW(x) (void *(*)(struct attr *, struct attr **))(x) #define GET(x) (int (*)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter))(x) #define ITERN(x) (struct attr_iter * (*)(void *))(x) #define ITERD(x) (void (*)(struct attr_iter *iter))(x) #define SET(x) (int (*)(void *, struct attr *attr))(x) #define ADD(x) (int (*)(void *, struct attr *attr))(x) #define REMOVE(x) (int (*)(void *, struct attr *attr))(x) #define INIT(x) (int (*)(void *))(x) #define DESTROY(x) (void (*)(void *))(x) static struct object_func object_funcs[] = { { attr_announcement,NEW(announcement_new), GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) }, { attr_arrows, NEW(arrows_new)}, { attr_circle, NEW(circle_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_coord, NEW(coord_new_from_attrs)}, { attr_cursor, NEW(cursor_new), NULL, NULL, NULL, NULL, ADD(cursor_add_attr)}, { attr_debug, NEW(debug_new)}, { attr_graphics, NEW(graphics_new)}, { attr_gui, NEW(gui_new), GET(gui_get_attr), NULL, NULL, SET(gui_set_attr), ADD(gui_add_attr)}, { attr_icon, NEW(icon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_image, NEW(image_new)}, { attr_itemgra, NEW(itemgra_new), NULL, NULL, NULL, NULL, ADD(itemgra_add_attr)}, { attr_plugins, NEW(plugins_new), NULL, NULL, NULL, NULL, NULL, NULL, INIT(plugins_init)}, { attr_plugin, NEW(plugin_new)}, { attr_polygon, NEW(polygon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_polyline, NEW(polyline_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_route, NEW(route_new), GET(route_get_attr), NULL, NULL, SET(route_set_attr), ADD(route_add_attr), REMOVE(route_remove_attr)}, { attr_text, NEW(text_new)}, }; struct object_func * object_func_lookup(enum attr_type type) { int i; switch (type) { case attr_config: return &config_func; case attr_layer: return &layer_func; case attr_layout: return &layout_func; case attr_log: return &log_func; case attr_map: return &map_func; case attr_maps: return &maps_func; case attr_mapset: return &mapset_func; case attr_navigation: return &navigation_func; case attr_navit: return &navit_func; case attr_profile_option: return &profile_option_func; case attr_roadprofile: return &roadprofile_func; case attr_script: return &script_func; case attr_osd: return &osd_func; case attr_trackingo: return &tracking_func; case attr_speech: return &speech_func; case attr_vehicle: return &vehicle_func; case attr_vehicleprofile: return &vehicleprofile_func; default: for (i = 0 ; i < sizeof(object_funcs)/sizeof(struct object_func); i++) { if (object_funcs[i].type == type) return &object_funcs[i]; } return NULL; } } struct element_func { char *name; char *parent; int (*func)(struct xmlstate *state); enum attr_type type; }; struct element_func *elements; static char *attr_fixme_itemgra[]={ "type","item_types", NULL,NULL, }; static char *attr_fixme_text[]={ "label_size","text_size", NULL,NULL, }; static char *attr_fixme_circle[]={ "label_size","text_size", NULL,NULL, }; static struct attr_fixme attr_fixmes[]={ {"item",attr_fixme_itemgra}, {"itemgra",attr_fixme_itemgra}, {"text",attr_fixme_text}, {"label",attr_fixme_text}, {"circle",attr_fixme_circle}, {NULL,NULL}, }; static char *element_fixmes[]={ "item","itemgra", "label","text", NULL,NULL, }; static void initStatic(void) { elements=g_new0(struct element_func,44); //43 is a number of elements + ending NULL element elements[0].name="config"; elements[0].parent=NULL; elements[0].func=NULL; elements[0].type=attr_config; elements[1].name="announce"; elements[1].parent="navigation"; elements[1].func=xmlconfig_announce; elements[2].name="speech"; elements[2].parent="navit"; elements[2].func=NULL; elements[2].type=attr_speech; elements[3].name="tracking"; elements[3].parent="navit"; elements[3].func=NULL; elements[3].type=attr_trackingo; elements[4].name="route"; elements[4].parent="navit"; elements[4].func=NULL; elements[4].type=attr_route; elements[5].name="mapset"; elements[5].parent="navit"; elements[5].func=NULL; elements[5].type=attr_mapset; elements[6].name="map"; elements[6].parent="mapset"; elements[6].func=NULL; elements[6].type=attr_map; elements[7].name="debug"; elements[7].parent="config"; elements[7].func=NULL; elements[7].type=attr_debug; elements[8].name="osd"; elements[8].parent="navit"; elements[8].func=NULL; elements[8].type=attr_osd; elements[9].name="navigation"; elements[9].parent="navit"; elements[9].func=NULL; elements[9].type=attr_navigation; elements[10].name="navit"; elements[10].parent="config"; elements[10].func=NULL; elements[10].type=attr_navit; elements[11].name="graphics"; elements[11].parent="navit"; elements[11].func=NULL; elements[11].type=attr_graphics; elements[12].name="gui"; elements[12].parent="navit"; elements[12].func=NULL; elements[12].type=attr_gui; elements[13].name="layout"; elements[13].parent="navit"; elements[13].func=NULL; elements[13].type=attr_layout; elements[14].name="cursor"; elements[14].parent="layout"; elements[14].func=NULL; elements[14].type=attr_cursor; elements[15].name="layer"; elements[15].parent="layout"; elements[15].func=NULL; elements[15].type=attr_layer; elements[16].name="itemgra"; elements[16].parent="layer"; elements[16].func=NULL; elements[16].type=attr_itemgra; elements[17].name="circle"; elements[17].parent="itemgra"; elements[17].func=NULL; elements[17].type=attr_circle; elements[18].name="coord"; elements[18].parent="circle"; elements[18].func=NULL; elements[18].type=attr_coord; elements[19].name="icon"; elements[19].parent="itemgra"; elements[19].func=NULL; elements[19].type=attr_icon; elements[20].name="coord"; elements[20].parent="icon"; elements[20].func=NULL; elements[20].type=attr_coord; elements[21].name="image"; elements[21].parent="itemgra"; elements[21].func=NULL; elements[21].type=attr_image; elements[22].name="text"; elements[22].parent="itemgra"; elements[22].func=NULL; elements[22].type=attr_text; elements[23].name="polygon"; elements[23].parent="itemgra"; elements[23].func=NULL; elements[23].type=attr_polygon; elements[24].name="coord"; elements[24].parent="polygon"; elements[24].func=NULL; elements[24].type=attr_coord; elements[25].name="polyline"; elements[25].parent="itemgra"; elements[25].func=NULL; elements[25].type=attr_polyline; elements[26].name="coord"; elements[26].parent="polyline"; elements[26].func=NULL; elements[26].type=attr_coord; elements[27].name="arrows"; elements[27].parent="itemgra"; elements[27].func=NULL; elements[27].type=attr_arrows; elements[28].name="vehicle"; elements[28].parent="navit"; elements[28].func=NULL; elements[28].type=attr_vehicle; elements[29].name="vehicleprofile"; elements[29].parent="navit"; elements[29].func=NULL; elements[29].type=attr_vehicleprofile; elements[30].name="roadprofile"; elements[30].parent="vehicleprofile"; elements[30].func=NULL; elements[30].type=attr_roadprofile; elements[31].name="announcement"; elements[31].parent="roadprofile"; elements[31].func=NULL; elements[31].type=attr_announcement; elements[32].name="cursor"; elements[32].parent="vehicle"; elements[32].func=NULL; elements[32].type=attr_cursor; elements[33].name="itemgra"; elements[33].parent="cursor"; elements[33].func=NULL; elements[33].type=attr_itemgra; elements[34].name="log"; elements[34].parent="vehicle"; elements[34].func=NULL; elements[34].type=attr_log; elements[35].name="log"; elements[35].parent="navit"; elements[35].func=NULL; elements[35].type=attr_log; elements[36].name="plugins"; elements[36].parent="config"; elements[36].func=NULL; elements[36].type=attr_plugins; elements[37].name="plugin"; elements[37].parent="plugins"; elements[37].func=NULL; elements[37].type=attr_plugin; elements[38].name="maps"; elements[38].parent="mapset"; elements[38].func=NULL; elements[38].type=attr_maps; elements[39].name="layer"; elements[39].parent="navit"; elements[39].func=NULL; elements[39].type=attr_layer; elements[40].name="profile_option"; elements[40].parent="vehicleprofile"; elements[40].func=NULL; elements[40].type=attr_profile_option; elements[41].name="roadprofile"; elements[41].parent="profile_option"; elements[41].func=NULL; elements[41].type=attr_roadprofile; elements[42].name="script"; elements[42].parent="navit"; elements[42].func=NULL; elements[42].type=attr_script; } /** * * Parse the opening tag of a config element * * * * @param context document parse context * * @param element_name the current tag name * * @param attribute_names ptr to return the set of attribute names * * @param attribute_values ptr return the set of attribute values * * @param user_data ptr to xmlstate structure * * @param error ptr return error context * * @returns nothing * */ static void start_element(xml_context *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, xmlerror **error) { struct xmlstate *new=NULL, **parent = user_data; struct element_func *e=elements,*func=NULL; struct attr_fixme *attr_fixme=attr_fixmes; char **element_fixme=element_fixmes; int found=0; static int fixme_count; const char *parent_name=NULL; char *s,*sep="",*possible_parents; struct attr *parent_attr; dbg(2,"name='%s' parent='%s'\n", element_name, *parent ? (*parent)->element:NULL); if (!strcmp(element_name,"xml")) return; /* determine if we have to fix any attributes */ while (attr_fixme[0].element) { if (!strcmp(element_name,attr_fixme[0].element)) break; attr_fixme++; } if (!attr_fixme[0].element) attr_fixme=NULL; /* tell user to fix deprecated element names */ while (element_fixme[0]) { if (!strcmp(element_name,element_fixme[0])) { element_name=element_fixme[1]; if (fixme_count++ < 10) dbg(0,"Please change <%s /> to <%s /> in config file\n", element_fixme[0], element_fixme[1]); } element_fixme+=2; } /* validate that this element is valid * and that the element has a valid parent */ possible_parents=g_strdup(""); if (*parent) parent_name=(*parent)->element; while (e->name) { if (!g_ascii_strcasecmp(element_name, e->name)) { found=1; s=g_strconcat(possible_parents,sep,e->parent,NULL); g_free(possible_parents); possible_parents=s; sep=","; if ((parent_name && e->parent && !g_ascii_strcasecmp(parent_name, e->parent)) || (!parent_name && !e->parent)) func=e; } e++; } if (! found) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_UNKNOWN_ELEMENT, "Unknown element '%s'", element_name); g_free(possible_parents); return; } if (! func) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Element '%s' within unexpected context '%s'. Expected '%s'%s", element_name, parent_name, possible_parents, ! strcmp(possible_parents, "config") ? "\nPlease add tags at the beginning/end of your navit.xml": ""); g_free(possible_parents); return; } g_free(possible_parents); new=g_new(struct xmlstate, 1); new->attribute_names=attribute_names; new->attribute_values=attribute_values; new->parent=*parent; new->element_attr.u.data=NULL; new->element=element_name; new->error=error; new->func=func; new->object_func=NULL; *parent=new; if (!find_boolean(new, "enabled", 1, 0)) return; if (new->parent && !new->parent->element_attr.u.data) return; if (func->func) { if (!func->func(new)) { return; } } else { struct attr **attrs; new->object_func=object_func_lookup(func->type); if (! new->object_func) return; attrs=convert_to_attrs(new,attr_fixme); new->element_attr.type=attr_none; if (!new->parent || new->parent->element_attr.type == attr_none) parent_attr=NULL; else parent_attr=&new->parent->element_attr; new->element_attr.u.data = new->object_func->create(parent_attr, attrs); if (! new->element_attr.u.data) return; new->element_attr.type=attr_from_name(element_name); if (new->element_attr.type == attr_none) dbg(0,"failed to create object of type '%s'\n", element_name); if (new->element_attr.type == attr_tracking) new->element_attr.type=attr_trackingo; if (new->parent && new->parent->object_func && new->parent->object_func->add_attr) new->parent->object_func->add_attr(new->parent->element_attr.u.data, &new->element_attr); } return; } /* Called for close tags */ static void end_element (xml_context *context, const gchar *element_name, gpointer user_data, xmlerror **error) { struct xmlstate *curr, **state = user_data; if (!strcmp(element_name,"xml")) return; dbg(2,"name='%s'\n", element_name); curr=*state; if (curr->object_func && curr->object_func->init) curr->object_func->init(curr->element_attr.u.data); if (curr->object_func && curr->object_func->unref) curr->object_func->unref(curr->element_attr.u.data); *state=curr->parent; g_free(curr); } static gboolean parse_file(struct xmldocument *document, xmlerror **error); static void xinclude(xml_context *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error) { struct xmldocument doc_new; struct file_wordexp *we; int i,count; const char *href=NULL; char **we_files; if (doc_old->level >= 16) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include recursion too deep"); return; } memset(&doc_new, 0, sizeof(doc_new)); i=0; while (attribute_names[i]) { if(!g_ascii_strcasecmp("href", attribute_names[i])) { if (!href) href=attribute_values[i]; else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one href"); return; } } else if(!g_ascii_strcasecmp("xpointer", attribute_names[i])) { if (!doc_new.xpointer) doc_new.xpointer=attribute_values[i]; else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one xpointer"); return; } } else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has invalid attributes"); return; } i++; } if (!doc_new.xpointer && !href) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has neither href nor xpointer"); return; } doc_new.level=doc_old->level+1; doc_new.user_data=doc_old->user_data; if (! href) { dbg(1,"no href, using '%s'\n", doc_old->href); doc_new.href=doc_old->href; if (file_exists(doc_new.href)) { parse_file(&doc_new, error); } else { dbg(0,"Unable to include %s\n",doc_new.href); } } else { dbg(1,"expanding '%s'\n", href); we=file_wordexp_new(href); we_files=file_wordexp_get_array(we); count=file_wordexp_get_count(we); dbg(1,"%d results\n", count); if (file_exists(we_files[0])) { for (i = 0 ; i < count ; i++) { dbg(1,"result[%d]='%s'\n", i, we_files[i]); doc_new.href=we_files[i]; parse_file(&doc_new, error); } } else { dbg(0,"Unable to include %s\n",we_files[0]); } file_wordexp_destroy(we); } } static int strncmp_len(const char *s1, int s1len, const char *s2) { int ret; #if 0 char c[s1len+1]; strncpy(c, s1, s1len); c[s1len]='\0'; dbg(0,"'%s' vs '%s'\n", c, s2); #endif ret=strncmp(s1, s2, s1len); if (ret) return ret; return strlen(s2)-s1len; } static int xpointer_value(const char *test, int len, struct xistate *elem, const char **out, int out_len) { int i,ret=0; if (len <= 0 || out_len <= 0) { return 0; } if (!(strncmp_len(test,len,"name(.)"))) { out[0]=elem->element; return 1; } if (test[0] == '@') { i=0; while (elem->attribute_names[i] && out_len > 0) { if (!strncmp_len(test+1,len-1,elem->attribute_names[i])) { out[ret++]=elem->attribute_values[i]; out_len--; } i++; } return ret; } return 0; } static int xpointer_test(const char *test, int len, struct xistate *elem) { int eq,i,count,vlen,cond_req=1,cond=0; char c; const char *tmp[16]; #if 0 char test2[len+1]; strncpy(test2, test, len); test2[len]='\0'; dbg(0,"%s\n", test2); #endif if (!len) return 0; c=test[len-1]; if (c != '\'' && c != '"') return 0; eq=strcspn(test, "="); if (eq >= len || test[eq+1] != c) return 0; vlen=eq; if (eq > 0 && test[eq-1] == '!') { cond_req=0; vlen--; } count=xpointer_value(test,vlen,elem,tmp,16); for (i = 0 ; i < count ; i++) { if (!strncmp_len(test+eq+2,len-eq-3, tmp[i])) cond=1; } if (cond == cond_req) return 1; return 0; } static int xpointer_element_match(const char *xpointer, int len, struct xistate *elem) { int start,tlen; start=strcspn(xpointer, "["); if (start > len) start=len; if (strncmp_len(xpointer, start, elem->element) && (start != 1 || xpointer[0] != '*')) return 0; if (start == len) return 1; if (xpointer[len-1] != ']') return 0; for (;;) { start++; tlen=strcspn(xpointer+start,"]"); if (start + tlen > len) return 1; if (!xpointer_test(xpointer+start, tlen, elem)) return 0; start+=tlen+1; } } static int xpointer_xpointer_match(const char *xpointer, int len, struct xistate *first) { const char *c; int s; dbg(2,"%s\n", xpointer); if (xpointer[0] != '/') return 0; c=xpointer+1; len--; do { s=strcspn(c, "/"); if (s > len) s=len; if (! xpointer_element_match(c, s, first)) return 0; first=first->child; c+=s+1; len-=s+1; } while (len > 0 && first); if (len > 0) return 0; return 1; } static int xpointer_match(const char *xpointer, struct xistate *first) { char *prefix="xpointer("; int len; if (! xpointer) return 1; len=strlen(xpointer); if (strncmp(xpointer,prefix,strlen(prefix))) return 0; if (xpointer[len-1] != ')') return 0; return xpointer_xpointer_match(xpointer+strlen(prefix), len-strlen(prefix)-1, first); } static void xi_start_element(xml_context *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, xmlerror **error) { struct xmldocument *doc=user_data; struct xistate *xistate; int i,count=0; while (attribute_names[count++*XML_ATTR_DISTANCE]); xistate=g_new0(struct xistate, 1); xistate->element=element_name; xistate->attribute_names=g_new0(const char *, count); xistate->attribute_values=g_new0(const char *, count); for (i = 0 ; i < count ; i++) { if (attribute_names[i*XML_ATTR_DISTANCE] && attribute_values[i*XML_ATTR_DISTANCE]) { xistate->attribute_names[i]=g_strdup(attribute_names[i*XML_ATTR_DISTANCE]); xistate->attribute_values[i]=g_strdup(attribute_values[i*XML_ATTR_DISTANCE]); } } xistate->parent=doc->last; if (doc->last) { doc->last->child=xistate; } else doc->first=xistate; doc->last=xistate; if (doc->active > 0 || xpointer_match(doc->xpointer, doc->first)) { if(!g_ascii_strcasecmp("xi:include", element_name)) { xinclude(context, xistate->attribute_names, xistate->attribute_values, doc, error); return; } start_element(context, element_name, xistate->attribute_names, xistate->attribute_values, doc->user_data, error); doc->active++; } } /** * * Reached closing tag of a config element * * * * @param context * * @param element name * * @param user_data ptr to xmldocument * * @param error ptr to struct for error information * * @returns nothing * */ static void xi_end_element (xml_context *context, const gchar *element_name, gpointer user_data, xmlerror **error) { struct xmldocument *doc=user_data; struct xistate *xistate=doc->last; int i=0; doc->last=doc->last->parent; if (! doc->last) doc->first=NULL; else doc->last->child=NULL; if (doc->active > 0) { if(!g_ascii_strcasecmp("xi:include", element_name)) { return; } end_element(context, element_name, doc->user_data, error); doc->active--; } while (xistate->attribute_names[i]) { g_free((char *)(xistate->attribute_names[i])); g_free((char *)(xistate->attribute_values[i])); i++; } g_free(xistate->attribute_names); g_free(xistate->attribute_values); g_free(xistate); } /* Called for character data */ /* text is not nul-terminated */ static void xi_text (xml_context *context, const gchar *text, gsize text_len, gpointer user_data, xmlerror **error) { struct xmldocument *doc=user_data; int i; if (doc->active) { for (i = 0 ; i < text_len ; i++) { if (!isspace(text[i])) { struct xmldocument *doc=user_data; struct xmlstate *curr, **state = doc->user_data; struct attr attr; char *text_dup = malloc(text_len+1); curr=*state; strncpy(text_dup, text, text_len); text_dup[text_len]='\0'; attr.type=attr_xml_text; attr.u.str=text_dup; if (curr->object_func && curr->object_func->add_attr && curr->element_attr.u.data) curr->object_func->add_attr(curr->element_attr.u.data, &attr); free(text_dup); return; } } } } #if USE_EZXML static void parse_node_text(ezxml_t node, void *data, void (*start)(void *, const char *, const char **, const char **, void *, void *), void (*end)(void *, const char *, void *, void *), void (*text)(void *, const char *, int, void *, void *)) { while (node) { if (start) start(NULL, node->name, (const char **)node->attr, (const char **)(node->attr+1), data, NULL); if (text && node->txt) text(NULL, node->txt, strlen(node->txt), data, NULL); if (node->child) parse_node_text(node->child, data, start, end, text); if (end) end(NULL, node->name, data, NULL); node=node->ordered; } } #endif void xml_parse_text(const char *document, void *data, void (*start)(xml_context *, const char *, const char **, const char **, void *, GError **), void (*end)(xml_context *, const char *, void *, GError **), void (*text)(xml_context *, const char *, gsize, void *, GError **)) { #if !USE_EZXML GMarkupParser parser = { start, end, text, NULL, NULL}; xml_context *context; gboolean result; context = g_markup_parse_context_new (&parser, 0, data, NULL); if (!document){ dbg(0, "FATAL: No XML data supplied (looks like incorrect configuration for internal GUI).\n"); exit(1); } result = g_markup_parse_context_parse (context, document, strlen(document), NULL); if (!result){ dbg(0, "FATAL: Cannot parse data as XML: '%s'\n", document); exit(1); } g_markup_parse_context_free (context); #else char *str=g_strdup(document); ezxml_t root = ezxml_parse_str(str, strlen(str)); if (!root) return; parse_node_text(root, data, start, end, text); ezxml_free(root); g_free(str); #endif } #if !USE_EZXML static const GMarkupParser parser = { xi_start_element, xi_end_element, xi_text, NULL, NULL }; /** * * Parse the contents of the configuration file * * * * @param document struct holding info about the config file * * @param error info on any errors detected * * @returns boolean TRUE or FALSE * */ static gboolean parse_file(struct xmldocument *document, xmlerror **error) { xml_context *context; gchar *contents, *message; gsize len; gint line, chr; gboolean result; char *xmldir,*newxmldir,*xmlfile,*newxmlfile,*sep; dbg(1,"enter filename='%s'\n", document->href); #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 12 #define G_MARKUP_TREAT_CDATA_AS_TEXT 0 #endif context = g_markup_parse_context_new (&parser, G_MARKUP_TREAT_CDATA_AS_TEXT, document, NULL); if (!g_file_get_contents (document->href, &contents, &len, error)) { g_markup_parse_context_free (context); return FALSE; } xmldir=getenv("XMLDIR"); xmlfile=getenv("XMLFILE"); newxmlfile=g_strdup(document->href); newxmldir=g_strdup(document->href); if ((sep=strrchr(newxmldir,'/'))) *sep='\0'; else { g_free(newxmldir); newxmldir=g_strdup("."); } setenv("XMLDIR",newxmldir,1); setenv("XMLFILE",newxmlfile,1); document->active=document->xpointer ? 0:1; document->first=NULL; document->last=NULL; result = g_markup_parse_context_parse (context, contents, len, error); if (!result && error && *error) { g_markup_parse_context_get_position(context, &line, &chr); message=g_strdup_printf("%s at line %d, char %d\n", (*error)->message, line, chr); g_free((*error)->message); (*error)->message=message; } g_markup_parse_context_free (context); g_free (contents); if (xmldir) setenv("XMLDIR",xmldir,1); else unsetenv("XMLDIR"); if (xmlfile) setenv("XMLFILE",xmlfile,1); else unsetenv("XMLFILE"); g_free(newxmldir); g_free(newxmlfile); dbg(1,"return %d\n", result); return result; } #else static void parse_node(struct xmldocument *document, ezxml_t node) { while (node) { xi_start_element(NULL,node->name, node->attr, node->attr+1, document, NULL); if (node->txt) xi_text(NULL,node->txt,strlen(node->txt),document,NULL); if (node->child) parse_node(document, node->child); xi_end_element (NULL,node->name,document,NULL); node=node->ordered; } } static gboolean parse_file(struct xmldocument *document, xmlerror **error) { FILE *f; ezxml_t root; f=fopen(document->href,"rb"); if (!f) return FALSE; root = ezxml_parse_fp(f); fclose(f); if (!root) return FALSE; document->active=document->xpointer ? 0:1; document->first=NULL; document->last=NULL; parse_node(document, root); return TRUE; } #endif /** * * Load and parse the master config file * * * * @param filename FQFN of the file * * @param error ptr to error details, if any * * @returns boolean TRUE or FALSE (if error detected) * */ gboolean config_load(const char *filename, xmlerror **error) { struct xmldocument document; struct xmlstate *curr=NULL; gboolean result; attr_create_hash(); item_create_hash(); initStatic(); dbg(1,"enter filename='%s'\n", filename); memset(&document, 0, sizeof(document)); document.href=filename; document.user_data=&curr; result=parse_file(&document, error); if (result && curr) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "element '%s' not closed", curr->element); result=FALSE; } attr_destroy_hash(); item_destroy_hash(); dbg(1,"return %d\n", result); return result; } int navit_object_set_methods(void *in, int in_size, void *out, int out_size) { int ret,size=out_size; if (out_size > in_size) { ret=-1; size=in_size; memset((char *)out+in_size, 0, out_size-in_size); } else if (in_size == out_size) ret=0; else ret=1; memcpy(out, in, size); return ret; } struct navit_object * navit_object_new(struct attr **attrs, struct object_func *func, int size) { struct navit_object *ret=g_malloc0(size); ret->func=func; ret->attrs=attr_list_dup(attrs); navit_object_ref(ret); return ret; } struct navit_object * navit_object_ref(struct navit_object *obj) { obj->refcount++; dbg(1,"refcount %s %p %d\n",attr_to_name(obj->func->type),obj,obj->refcount); return obj; } void navit_object_unref(struct navit_object *obj) { if (obj) { obj->refcount--; dbg(1,"refcount %s %p %d\n",attr_to_name(obj->func->type),obj,obj->refcount); if (obj->refcount <= 0 && obj->func && obj->func->destroy) obj->func->destroy(obj); } } struct attr_iter { void *last; }; struct attr_iter * navit_object_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void navit_object_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } int navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(obj->attrs, NULL, type, attr, iter); } void navit_object_callbacks(struct navit_object *obj, struct attr *attr) { if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 0); } int navit_object_set_attr(struct navit_object *obj, struct attr *attr) { obj->attrs=attr_generic_set_attr(obj->attrs, attr); navit_object_callbacks(obj, attr); return 1; } int navit_object_add_attr(struct navit_object *obj, struct attr *attr) { if (attr->type == attr_callback) { struct callback_list *cbl; if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) cbl=obj->attrs[0]->u.callback_list; else { struct attr attr; cbl=callback_list_new(); attr.type=attr_callback_list; attr.u.callback_list=cbl; obj->attrs=attr_generic_prepend_attr(obj->attrs, &attr); } callback_list_add(cbl, attr->u.callback); return 1; } obj->attrs=attr_generic_add_attr(obj->attrs, attr); if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 1); return 1; } int navit_object_remove_attr(struct navit_object *obj, struct attr *attr) { if (attr->type == attr_callback) { if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) { callback_list_remove(obj->attrs[0]->u.callback_list, attr->u.callback); return 1; } else return 0; } obj->attrs=attr_generic_remove_attr(obj->attrs, attr); if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, -1); return 1; } void navit_object_destroy(struct navit_object *obj) { attr_list_free(obj->attrs); g_free(obj); } navit-0.5.0~svn5643+dfsg.1/navit/xmlconfig.h000066400000000000000000000116421221777731700204640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_XMLCONFIG_H #define NAVIT_XMLCONFIG_H #ifdef __cplusplus extern "C" { #endif #include "config.h" #ifndef USE_EZXML #ifdef HAVE_GLIB #define USE_EZXML 0 #else #define USE_EZXML 1 #endif #endif #if !USE_EZXML #define XML_ATTR_DISTANCE 1 typedef GMarkupParseContext xml_context; #else #include "ezxml.h" #define XML_ATTR_DISTANCE 2 #undef G_MARKUP_ERROR #undef G_MARKUP_ERROR_INVALID_CONTENT #undef G_MARKUP_ERROR_PARSE #undef G_MARKUP_ERROR_UNKNOWN_ELEMENT #define G_MARKUP_ERROR 0 #define G_MARKUP_ERROR_INVALID_CONTENT 0 #define G_MARKUP_ERROR_PARSE 0 #define G_MARKUP_ERROR_UNKNOWN_ELEMENT 0 typedef void * xml_context; #endif typedef void *(*object_func_new)(struct attr *parent, struct attr **attrs); typedef int (*object_func_get_attr)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter); typedef struct attr_iter *(*object_func_iter_new)(void *); typedef void (*object_func_iter_destroy)(struct attr_iter *); typedef int (*object_func_set_attr)(void *, struct attr *attr); typedef int (*object_func_add_attr)(void *, struct attr *attr); typedef int (*object_func_remove_attr)(void *, struct attr *attr); typedef int (*object_func_init)(void *); typedef void (*object_func_destroy)(void *); typedef void *(*object_func_dup)(void *); typedef void *(*object_func_ref)(void *); typedef void *(*object_func_unref)(void *); struct object_func { enum attr_type type; void *(*create)(struct attr *parent, struct attr **attrs); int (*get_attr)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct attr_iter *(*iter_new)(void *); void (*iter_destroy)(struct attr_iter *); int (*set_attr)(void *, struct attr *attr); int (*add_attr)(void *, struct attr *attr); int (*remove_attr)(void *, struct attr *attr); int (*init)(void *); void (*destroy)(void *); void *(*dup)(void *); void *(*ref)(void *); void *(*unref)(void *); }; extern struct object_func map_func, mapset_func, navit_func, osd_func, tracking_func, vehicle_func, maps_func, layout_func, roadprofile_func, vehicleprofile_func, layer_func, config_func, profile_option_func, script_func, log_func, speech_func, navigation_func; #define HAS_OBJECT_FUNC(x) ((x) == attr_map || (x) == attr_mapset || (x) == attr_navit || (x) == attr_osd || (x) == attr_trackingo || (x) == attr_vehicle || (x) == attr_maps || (x) == attr_layout || (x) == attr_roadprofile || (x) == attr_vehicleprofile || (x) == attr_layer || (x) == attr_config || (x) == attr_profile_option || (x) == attr_script || (x) == attr_log || (x) == attr_speech || (x) == attr_navigation) #define NAVIT_OBJECT struct object_func *func; int refcount; struct attr **attrs; struct navit_object { NAVIT_OBJECT }; int navit_object_set_methods(void *in, int in_size, void *out, int out_size); struct navit_object *navit_object_new(struct attr **attrs, struct object_func *func, int size); struct navit_object *navit_object_ref(struct navit_object *obj); void navit_object_unref(struct navit_object *obj); struct attr_iter * navit_object_attr_iter_new(void); void navit_object_attr_iter_destroy(struct attr_iter *iter); int navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter); void navit_object_callbacks(struct navit_object *obj, struct attr *attr); int navit_object_set_attr(struct navit_object *obj, struct attr *attr); int navit_object_add_attr(struct navit_object *obj, struct attr *attr); int navit_object_remove_attr(struct navit_object *obj, struct attr *attr); void navit_object_destroy(struct navit_object *obj); typedef GError xmlerror; /* prototypes */ enum attr_type; struct object_func *object_func_lookup(enum attr_type type); void xml_parse_text(const char *document, void *data, void (*start)(xml_context *, const char *, const char **, const char **, void *, GError **), void (*end)(xml_context *, const char *, void *, GError **), void (*text)(xml_context*, const char *, gsize, void *, GError **)); gboolean config_load(const char *filename, xmlerror **error); //static void xinclude(GMarkupParseContext *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0~svn5643+dfsg.1/navit/xpm/000077500000000000000000000000001221777731700171255ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/xpm/CMakeLists.txt000066400000000000000000000123351221777731700216710ustar00rootroot00000000000000macro(convert_to_png IMAGE_INPUT IMAGE_OUTPUT SCALE) get_filename_component(FILE_EXT ${IMAGE_INPUT} EXT) string(TOUPPER ${FILE_EXT} FILE_TYPE) string(REGEX REPLACE "^\\." "" FILE_TYPE ${FILE_TYPE}) if(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "rsvg-convert") if (${SCALE} GREATER 0) set(SCALE_ARGS --width=${SCALE} --height=${SCALE}) else() set(SCALE_ARGS) endif() set(COMMAND_ARGS ${SCALE_ARGS} --output ${IMAGE_OUTPUT} ${IMAGE_INPUT}) elseif(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "convert") if (${SCALE} GREATER 0) set(SCALE_ARGS -resize ${SCALE}x${SCALE}) else() set(SCALE_ARGS) endif() set(COMMAND_ARGS -background none ${IMAGE_INPUT} ${SCALE_ARGS} ${IMAGE_OUTPUT}) elseif(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "ksvgtopng") set (NEW_SCALE ${SCALE}) if (${SCALE} EQUAL 0) file(STRINGS ${IMAGE_INPUT} NEW_SCALE_LINE REGEX "[^-]width=\"[0-9pxt.]*\"") string(REGEX REPLACE ".*width=\"([0-9]*).*" "\\1" NEW_SCALE ${NEW_SCALE_LINE}) endif() set(COMMAND_ARGS ${NEW_SCALE} ${NEW_SCALE} ${IMAGE_INPUT} --output ${IMAGE_OUTPUT}) elseif(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "inkscape") if (${SCALE} GREATER 0) set(SCALE_ARGS --export-width=${SCALE} --export-height=${SCALE}) else() set(SCALE_ARGS) endif() set(COMMAND_ARGS --without-gui --export-background-opacity=0 --export-png ${IMAGE_OUTPUT} ${SCALE_ARGS} ${IMAGE_INPUT}) else() message(FATAL_ERROR "no svg2png converter defined here.") endif() add_custom_command ( OUTPUT ${IMAGE_OUTPUT} DEPENDS ${IMAGE_INPUT} COMMAND ${IMAGE_CONVERTER_${FILE_TYPE}} ${COMMAND_ARGS} ) endmacro() macro(add_scale_targets IMAGE_SRC IMAGE_NAME) string(REPLACE "," ";" SCALES "${ARGN}") set(add_scale_targets_is_first_scale 1) foreach (CURRENT_SCALE ${SCALES}) if(add_scale_targets_is_first_scale EQUAL 1) set (IMAGE_DST ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_NAME}.png) set(add_scale_targets_is_first_scale 0) elseif (${CURRENT_SCALE} EQUAL 0) set (IMAGE_DST ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_NAME}.png) message_error( "Image size value of 0 to leave image unscaled can only be given as the first value in row, e.g. -D svg2png_scaling=0,16,32 " ) else() set (IMAGE_DST ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_NAME}_${CURRENT_SCALE}_${CURRENT_SCALE}.png) endif() convert_to_png( ${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_SRC} ${IMAGE_DST} ${CURRENT_SCALE} ) list(APPEND IMAGE_TARGETS ${IMAGE_DST}) endforeach() endmacro() install(FILES desktop_icons/navit.desktop DESTINATION share/applications) install(FILES desktop_icons/22x22/navit.png DESTINATION share/icons/hicolor/22x22/apps) install(FILES desktop_icons/128x128/navit.png DESTINATION share/icons/hicolor/128x128/apps) #install(FILES bench.xpm DESTINATION ) if (USE_SVG OR SVG2PNG) FILE(GLOB SVG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.svg" "*.svgz") if(USE_SVG) list(APPEND IMAGES_TO_COPY ${SVG_FILES}) endif(USE_SVG) if(SVG2PNG) list(APPEND FILES_TO_PNG ${SVG_FILES}) endif(SVG2PNG) endif() FILE(GLOB XPM_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.xpm") if(XPM2PNG) foreach (IMAGE_SRC ${SVG_FILES}) string(REGEX REPLACE ".[a-z]*\$" "" IMAGE ${IMAGE_SRC}) list(APPEND SVG_FILES_BASENAMES ${IMAGE}) endforeach() foreach (IMAGE_SRC ${XPM_FILES}) string(REGEX REPLACE ".[a-z]*\$" "" IMAGE ${IMAGE_SRC}) list(FIND SVG_FILES_BASENAMES ${IMAGE} DUP_IMG) if ( ${DUP_IMG} LESS 0 ) list(APPEND FILES_TO_PNG ${IMAGE_SRC}) else() message(STATUS "image '${IMAGE}': XPM version skipped in favor of SVG") endif() endforeach() else() list(APPEND IMAGES_TO_COPY ${XPM_FILES}) endif(XPM2PNG) foreach (IMAGE_SRC ${FILES_TO_PNG}) string(REGEX REPLACE ".[a-z]*\$" "" IMAGE ${IMAGE_SRC}) if ( IMAGE_SRC MATCHES ".*svgz*" ) if ( DEFINED svg2png_scaling_nav AND ${IMAGE} MATCHES "^nav_") add_scale_targets(${IMAGE_SRC} ${IMAGE} ${svg2png_scaling_nav}) elseif( DEFINED svg2png_scaling_flag AND ${IMAGE} MATCHES "^country_") add_scale_targets(${IMAGE_SRC} ${IMAGE} ${svg2png_scaling_flag}) elseif( DEFINED svg2png_scaling) add_scale_targets(${IMAGE_SRC} ${IMAGE} ${svg2png_scaling}) endif() else() add_scale_targets(${IMAGE_SRC} ${IMAGE} 0) endif() endforeach() foreach (IMAGE_FILE ${IMAGES_TO_COPY}) add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_FILE}" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_FILE}" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_FILE}" ) list(APPEND IMAGE_TARGETS "${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_FILE}") endforeach() add_custom_target(images ALL DEPENDS ${IMAGE_TARGETS}) add_custom_target(images_resource COMMAND mkdir -p ../resources/share/navit/xpm COMMAND cp ${IMAGE_TARGETS} ../resources/share/navit/xpm) add_dependencies(images_resource images) install( FILES ${IMAGE_TARGETS} DESTINATION ${IMAGE_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) navit-0.5.0~svn5643+dfsg.1/navit/xpm/Makefile.am000066400000000000000000000315711221777731700211700ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc image_DATA = cemetery.xpm image_DATA += dumping_station.xpm image_DATA += highway_exit.xpm image_DATA += hunting_stand.xpm image_DATA += level_crossing.xpm image_DATA += tower.xpm image_DATA += trailerpark.xpm image_DATA += public_office.xpm ## Obsolete. Should be removed eventually... image_DATA += biergarten.xpm image_DATA += bus_halt.xpm image_DATA += car_dealer.xpm image_DATA += castle.xpm image_DATA += library.xpm image_DATA += memorial.xpm image_DATA += picnic.xpm image_DATA += potable_water.xpm image_DATA += restroom.xpm image_DATA += sport.xpm image_DATA += menu.xpm image_DATA += toggle_fullscreen.xpm ## Obsolete end image_DATA += flag_bk_tr.xpm image_DATA += flag_bk_wh.xpm image_DATA += flag_bl_wh.xpm image_DATA += flag_wh_bk.xpm image_DATA += gc_tradi.xpm image_DATA += gc_multi.xpm image_DATA += gc_mystery.xpm image_DATA += gc_event.xpm image_DATA += gc_reference.xpm image_DATA += gc_webcam.xpm image_DATA += gc_question.xpm image_DATA += gc_stages.xpm image_DATA += nav_left_1.xpm image_DATA += nav_left_2.xpm image_DATA += nav_right_1.xpm image_DATA += nav_right_2.xpm image_DATA += nav_straight.xpm image_DATA += nav_straight_32.xpm image_DATA += nav_left_1_32.xpm image_DATA += nav_left_2_32.xpm image_DATA += nav_right_1_32.xpm image_DATA += nav_right_2_32.xpm svgs = gui_about.svg svgs += gui_actions.svg svgs += gui_active.svg svgs += gui_bookmark.svg svgs += gui_formerdests.svg svgs += gui_display.svg svgs += gui_help.svg svgs += gui_home.svg svgs += gui_inactive.svg svgs += gui_map.svg svgs += gui_maps.svg svgs += gui_rules.svg svgs += gui_settings.svg svgs += gui_sound.svg svgs += gui_sound_off.svg svgs += gui_tools.svg svgs += gui_fullscreen.svg svgs += gui_leave_fullscreen.svg svgs += gui_quit.svg svgs += gui_stop.svg svgs += gui_town.svg svgs += gui_vehicle.svg svgs += gui_vehicle_pedestrian.svg svgs += gui_zoom_in.svg svgs += gui_zoom_out.svg svgs += zoom_in.svg svgs += zoom_out.svg svgs += gui_select_street.svg svgs += gui_select_town.svg svgs += gui_select_country.svg svgs += gui_arrow_left.svg svgs += gui_arrow_right.svg svgs += gui_arrow_up.svg svgs += gui_arrow_down.svg svgs += gui_menu.svg svgs += gui_strength_0.svg svgs += gui_strength_1.svg svgs += gui_strength_2.svg svgs += gui_strength_3.svg svgs += gui_strength_4.svg svgs += gui_strength_5.svg svgs += gui_minus.svg svgs += gui_plus.svg svgs += gui_log.svg svgs += gui_search.svg svgs += menu.svg svgs += toggle_fullscreen.svg svgs += airport.svg svgs += atm.svg svgs += attraction.svg svgs += bahai.svg svgs += bank.svg svgs += bar.svg svgs += beer.svg svgs += bench.svg svgs += bicycle_parking.svg svgs += bicycle_rental.svg svgs += bicycle_shop.svg svgs += biergarten.svg svgs += boat_ramp.svg svgs += boundary_stone.svg svgs += buddhist.svg svgs += bus.svg svgs += bus_stop.svg svgs += cafe.svg svgs += camping.svg svgs += car_dealer.svg svgs += car_rent.svg svgs += car_sharing.svg svgs += casino.svg svgs += castle.svg svgs += church.svg svgs += cinema.svg svgs += cursor.svg svgs += cursor225.svg svgs += cursor450.svg svgs += cursor675.svg svgs += cursor_still.svg svgs += dam.svg svgs += danger.svg svgs += daymark.svg svgs += drinking_water.svg svgs += emergency.svg svgs += exit.svg svgs += fastfood.svg svgs += firebrigade.svg svgs += fountain.svg svgs += fuel.svg svgs += golf.svg svgs += heliport.svg svgs += hindu.svg svgs += hospital.svg svgs += hotel.svg svgs += information.svg svgs += islamic.svg svgs += jain.svg svgs += jewish.svg svgs += justice.svg svgs += library.svg svgs += mark.svg svgs += memorial.svg svgs += menu.svg svgs += military.svg svgs += mini_roundabout.svg svgs += museum.svg svgs += pagan.svg svgs += parking.svg svgs += pastafarian.svg svgs += peak.svg svgs += pharmacy.svg svgs += picnic.svg svgs += police.svg svgs += post.svg svgs += repair_service.svg svgs += resort.svg svgs += restaurant.svg svgs += ruins.svg svgs += school.svg svgs += shelter.svg svgs += shinto.svg svgs += shop_apparel.svg svgs += shop_computer.svg svgs += shop_department.svg svgs += shop_grocery.svg svgs += shopping.svg svgs += sikh.svg svgs += skiing.svg svgs += sport.svg svgs += stadium.svg svgs += swimming.svg svgs += taoist.svg svgs += tec_common.svg svgs += telephone.svg svgs += theater.svg svgs += toggle_fullscreen.svg svgs += toilets.svg svgs += townhall.svg svgs += traffic_signals.svg svgs += unknown.svg svgs += viewpoint.svg svgs += wifi.svg svgs += worship.svg svgs += zoo.svg svgs += zoom_in.svg svgs += zoom_out.svg nav_svgs = nav_left_1_bk.svg nav_left_1_wh.svg nav_left_2_bk.svg nav_left_2_wh.svg nav_left_3_bk.svg nav_left_3_wh.svg nav_svgs += nav_right_1_bk.svg nav_right_1_wh.svg nav_right_2_bk.svg nav_right_2_wh.svg nav_right_3_bk.svg nav_right_3_wh.svg nav_svgs += nav_roundabout_l1_bk.svg nav_roundabout_l1_wh.svg nav_roundabout_l2_bk.svg nav_roundabout_l2_wh.svg nav_svgs += nav_roundabout_l3_bk.svg nav_roundabout_l3_wh.svg nav_roundabout_l4_bk.svg nav_roundabout_l4_wh.svg nav_svgs += nav_roundabout_l5_bk.svg nav_roundabout_l5_wh.svg nav_roundabout_l6_bk.svg nav_roundabout_l6_wh.svg nav_svgs += nav_roundabout_l7_bk.svg nav_roundabout_l7_wh.svg nav_roundabout_l8_bk.svg nav_roundabout_l8_wh.svg nav_svgs += nav_roundabout_r1_bk.svg nav_roundabout_r1_wh.svg nav_roundabout_r2_bk.svg nav_roundabout_r2_wh.svg nav_svgs += nav_roundabout_r3_bk.svg nav_roundabout_r3_wh.svg nav_roundabout_r4_bk.svg nav_roundabout_r4_wh.svg nav_svgs += nav_roundabout_r5_bk.svg nav_roundabout_r5_wh.svg nav_roundabout_r6_bk.svg nav_roundabout_r6_wh.svg nav_svgs += nav_roundabout_r7_bk.svg nav_roundabout_r7_wh.svg nav_roundabout_r8_bk.svg nav_roundabout_r8_wh.svg nav_svgs += nav_straight_bk.svg nav_straight_wh.svg nav_turnaround_left_bk.svg nav_turnaround_left_wh.svg nav_svgs += nav_turnaround_right_bk.svg nav_turnaround_right_wh.svg nav_destination_bk.svg nav_destination_wh.svg flag_svgs = country_.svgz country_AD.svgz country_AE.svgz country_AF.svgz country_AG.svgz country_AI.svgz country_AL.svgz country_AM.svgz flag_svgs += country_AN.svgz country_AO.svgz country_AQ.svgz country_AR.svgz country_AS.svgz country_AT.svgz country_AU.svgz country_AW.svgz flag_svgs += country_AX.svgz country_AZ.svgz country_BA.svgz country_BB.svgz country_BD.svgz country_BE.svgz country_BF.svgz flag_svgs += country_BG.svgz country_BH.svgz country_BI.svgz country_BJ.svgz country_BL.svgz country_BM.svgz country_BN.svgz flag_svgs += country_BO.svgz country_BR.svgz country_BS.svgz country_BT.svgz country_BV.svgz country_BW.svgz country_BY.svgz flag_svgs += country_BZ.svgz country_CA.svgz country_CC.svgz country_CD.svgz country_CF.svgz country_CG.svgz country_CH.svgz flag_svgs += country_CI.svgz country_CK.svgz country_CL.svgz country_CM.svgz country_CN.svgz country_CO.svgz country_CR.svgz flag_svgs += country_CU.svgz country_CV.svgz country_CX.svgz country_CY.svgz country_CZ.svgz country_DE.svgz country_DJ.svgz flag_svgs += country_DK.svgz country_DM.svgz country_DO.svgz country_DZ.svgz country_EC.svgz country_EE.svgz country_EG.svgz flag_svgs += country_EH.svgz country_ER.svgz country_ES.svgz country_ET.svgz country_FI.svgz country_FJ.svgz country_FK.svgz flag_svgs += country_FM.svgz country_FO.svgz country_FR.svgz country_GA.svgz country_GB.svgz country_GD.svgz country_GE.svgz flag_svgs += country_GF.svgz country_GG.svgz country_GH.svgz country_GI.svgz country_GL.svgz country_GM.svgz country_GN.svgz flag_svgs += country_GP.svgz country_GQ.svgz country_GR.svgz country_GS.svgz country_GT.svgz country_GU.svgz country_GW.svgz flag_svgs += country_GY.svgz country_HK.svgz country_HM.svgz country_HN.svgz country_HR.svgz country_HT.svgz country_HU.svgz flag_svgs += country_ID.svgz country_IE.svgz country_IL.svgz country_IM.svgz country_IN.svgz country_IO.svgz country_IQ.svgz flag_svgs += country_IR.svgz country_IS.svgz country_IT.svgz country_JE.svgz country_JM.svgz country_JO.svgz country_JP.svgz flag_svgs += country_KE.svgz country_KG.svgz country_KH.svgz country_KI.svgz country_KM.svgz country_KN.svgz country_KP.svgz flag_svgs += country_KR.svgz country_KW.svgz country_KY.svgz country_KZ.svgz country_LA.svgz country_LB.svgz country_LC.svgz flag_svgs += country_LI.svgz country_LK.svgz country_LR.svgz country_LS.svgz country_LT.svgz country_LU.svgz country_LV.svgz flag_svgs += country_LY.svgz country_MA.svgz country_MC.svgz country_MD.svgz country_ME.svgz country_MF.svgz country_MG.svgz flag_svgs += country_MH.svgz country_MK.svgz country_ML.svgz country_MM.svgz country_MN.svgz country_MO.svgz country_MP.svgz flag_svgs += country_MQ.svgz country_MR.svgz country_MS.svgz country_MT.svgz country_MU.svgz country_MV.svgz country_MW.svgz flag_svgs += country_MX.svgz country_MY.svgz country_MZ.svgz country_NA.svgz country_NC.svgz country_NE.svgz country_NF.svgz flag_svgs += country_NG.svgz country_NI.svgz country_NL.svgz country_NO.svgz country_NP.svgz country_NR.svgz country_NU.svgz flag_svgs += country_NZ.svgz country_OM.svgz country_PA.svgz country_PE.svgz country_PF.svgz country_PG.svgz country_PH.svgz flag_svgs += country_PK.svgz country_PL.svgz country_PM.svgz country_PN.svgz country_PR.svgz country_PS.svgz country_PT.svgz flag_svgs += country_PW.svgz country_PY.svgz country_QA.svgz country_RE.svgz country_RO.svgz country_RS.svgz country_RU.svgz flag_svgs += country_RW.svgz country_SA.svgz country_SB.svgz country_SC.svgz country_SD.svgz country_SE.svgz country_SG.svgz flag_svgs += country_SH.svgz country_SI.svgz country_SJ.svgz country_SK.svgz country_SL.svgz country_SM.svgz country_SN.svgz flag_svgs += country_SO.svgz country_SR.svgz country_ST.svgz country_SV.svgz country_SY.svgz country_SZ.svgz country_TC.svgz flag_svgs += country_TD.svgz country_TF.svgz country_TG.svgz country_TH.svgz country_TJ.svgz country_TK.svgz country_TL.svgz flag_svgs += country_TM.svgz country_TN.svgz country_TO.svgz country_TR.svgz country_TT.svgz country_TV.svgz country_TW.svgz flag_svgs += country_TZ.svgz country_UA.svgz country_UG.svgz country_UM.svgz country_US.svgz country_UY.svgz country_UZ.svgz flag_svgs += country_VA.svgz country_VC.svgz country_VE.svgz country_VG.svgz country_VI.svgz country_VN.svgz country_VU.svgz flag_svgs += country_WF.svgz country_WS.svgz country_YE.svgz country_YT.svgz country_ZA.svgz country_ZM.svgz country_ZW.svgz if USE_SVG image_DATA += $(svgs) $(nav_svgs) $(flag_svgs) endif if USE_SVG2PNG # Implicit rules for generating the PNG files. This only generates the # standard size; for additional sizes see below. %.png: $(srcdir)/%.svg SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" %.png: $(srcdir)/%.svgz SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" pngs = $(addsuffix .png,$(basename $(svgs))) xsize = $(word 1,$(subst x, ,$(scale))) ysize = $(word $(words $(scale)),$(subst x, ,$(scale))) comma =, # template to generate scaling rules for the various PNG sizes define scaling_rule_template %_$(1)_$(1).png: $(srcdir)/%.$(2) SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$$@" endef # template to generate scaling rules for the default PNG size define scaling_rule_template_def %.png: $(srcdir)/%.$(2) SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$$@" "$(1)" "$(1)" endef # png images of the user interface and other, sizes e.g. "8,16,32,48,96" if USE_SVG2PNG_SCALES pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(svgs)))) # create rules from template $(foreach extension,svg svgz, $(foreach size, $(subst $(comma), ,@SVG2PNG_SCALES@),$(eval $(call scaling_rule_template,$(size),$(extension))))) endif # png state flags if USE_SVG2PNG_SCALES_FLAG svg2png_scales_flag = $(subst $(comma), ,@SVG2PNG_SCALES_FLAG@) pngs += $(addsuffix .png,$(basename $(flag_svgs))) pngs += $(foreach scale, $(wordlist 2,100,$(svg2png_scales_flag)), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(flag_svgs)))) # create rules from templates $(foreach extension,svg svgz, $(foreach size, $(wordlist 2,100,$(svg2png_scales_flag)),$(eval $(call scaling_rule_template,$(size),$(extension))))) $(foreach extension,svg svgz, $(foreach size, $(firstword $(svg2png_scales_flag)),$(eval $(call scaling_rule_template_def,$(size),$(extension))))) endif # png symbols for navigation if USE_SVG2PNG_SCALES_NAV pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES_NAV@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(nav_svgs)))) # create rules from template $(foreach extension,svg svgz, $(foreach size, $(subst $(comma), ,@SVG2PNG_SCALES_NAV@),$(eval $(call scaling_rule_template,$(size),$(extension))))) endif image_DATA += $(pngs) endif if !SUPPORT_WIN32 DESKTOPFILEdir=$(datadir)/applications DESKTOPFILE_DATA = desktop_icons/navit.desktop ICON128dir=$(datadir)/icons/hicolor/128x128/apps ICON128_DATA = desktop_icons/128x128/navit.png ICON22dir=$(datadir)/icons/hicolor/22x22/apps ICON22_DATA = desktop_icons/22x22/navit.png endif EXTRA_DIST = $(image_DATA) $(DESKTOPFILE_DATA) $(ICON128_DATA) $(ICON22_DATA) navit_svg2png if USE_SVG2PNG clean: rm -f $(pngs) endif navit-0.5.0~svn5643+dfsg.1/navit/xpm/airport.svg000066400000000000000000000121311221777731700213240ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/atm.svg000066400000000000000000000216261221777731700204360ustar00rootroot00000000000000 image/svg+xml $ navit-0.5.0~svn5643+dfsg.1/navit/xpm/attraction.svg000066400000000000000000000073361221777731700220270ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/bahai.svg000066400000000000000000000317231221777731700207200ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/bank.svg000066400000000000000000000216261221777731700205700ustar00rootroot00000000000000 image/svg+xml $ navit-0.5.0~svn5643+dfsg.1/navit/xpm/bar.svg000066400000000000000000000147701221777731700204230ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/beer.svg000066400000000000000000000147701221777731700205740ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/bench.svg000066400000000000000000000606071221777731700207360ustar00rootroot00000000000000 image/svg+xmlbench g.aoi bench g.aoi navit-0.5.0~svn5643+dfsg.1/navit/xpm/bicycle_parking.svg000066400000000000000000000152541221777731700230020ustar00rootroot00000000000000 image/svg+xml P navit-0.5.0~svn5643+dfsg.1/navit/xpm/bicycle_rental.svg000066400000000000000000000166071221777731700226370ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/bicycle_shop.svg000066400000000000000000000152141221777731700223140ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/biergarten.svg000066400000000000000000000153211221777731700217720ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/biergarten.xpm000066400000000000000000000040551221777731700220010ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 92 2", "Qt c None", "#p c #745f2b", "#q c #775713", "#h c #776741", "#i c #785309", "#a c #7d653c", "#o c #7f795f", "#b c #804d02", "#r c #805f10", ".3 c #806238", "#j c #815401", ".V c #846031", ".U c #868884", "#s c #876d1c", ".4 c #884e02", ".N c #885f2a", "#t c #897a3c", "#c c #8a5400", "#k c #8a5f01", "#z c #8f876b", ".F c #916825", ".W c #925101", ".M c #92928d", ".5 c #935600", "#l c #947207", "#d c #956300", "#m c #957b18", ".# c #95948f", ".w c #967327", "#w c #998a6d", ".E c #999790", ".O c #9a5700", "#y c #9b8d6b", ".u c #9c9b93", "#x c #9d8d69", ".X c #9e5c00", ".6 c #9f6701", "#e c #9f7406", "#g c #9f8d52", "#v c #9f9a8a", "#u c #9f9b7e", "#n c #a19663", ".2 c #a2a3a0", ".n c #a3915f", "#f c #a47f15", ".v c #a5a5a1", ".P c #a66200", ".G c #a66400", ".g c #a6a49b", ".D c #a8a6a0", ".Y c #a96d00", ".7 c #aa7604", ".9 c #ab975c", ".x c #af7404", ".8 c #b08515", ".Q c #b26f00", "#. c #b3b3ac", ".H c #b46f00", ".Z c #b57d07", ".1 c #b7a062", ".y c #ba7e05", ".T c #baa059", ".f c #babab6", ".0 c #bb8916", ".R c #bf8205", ".L c #bfa457", "## c #bfc0be", ".I c #c07b00", ".a c #c0beba", ".S c #c18c0f", ".C c #c1aa60", ".t c #c1b382", ".m c #c2c1b8", ".o c #c5a660", ".e c #c5c4c0", ".z c #c68a08", ".J c #c98c08", ".K c #c9930d", ".c c #cdcbc7", ".d c #ceccc9", ".b c #cfcdca", ".p c #d0b067", ".A c #d39e22", ".B c #d4a72f", ".q c #d6b86c", ".r c #dec077", ".s c #dec37a", ".h c #e1dcd4", ".j c #e8e2d8", ".i c #e9e4db", ".l c #ece7df", ".k c #ede7df", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQt.#.a.b.c.d.e.fQtQtQtQtQt", "QtQtQtQt.g.h.i.j.k.l.mQtQtQtQtQt", "QtQtQtQt.n.o.p.q.r.s.t.u.vQtQtQt", "QtQtQtQt.w.x.y.z.A.B.CQt.D.EQtQt", "QtQtQtQt.F.G.H.I.J.K.LQtQt.MQtQt", "QtQtQtQt.N.O.P.Q.R.S.TQtQt.UQtQt", "QtQtQtQt.V.W.X.Y.Z.0.1QtQt.2QtQt", "QtQtQtQt.3.4.5.6.7.8.9#.##QtQtQt", "QtQtQtQt#a#b#c#d#e#f#gQtQtQtQtQt", "QtQtQtQt#h#i#j#k#l#m#nQtQtQtQtQt", "QtQtQtQt#o#p#q#r#s#t#uQtQtQtQtQt", "QtQtQtQtQt#v#w#x#y#zQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/boat_ramp.svg000066400000000000000000000077271221777731700216270ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/boundary_stone.svg000066400000000000000000000344661221777731700227160ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/buddhist.svg000066400000000000000000000277351221777731700214720ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/bus.svg000066400000000000000000000234451221777731700204470ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/bus_halt.xpm000066400000000000000000000015151221777731700214560ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 32 1", ". c None", "f c #009933", "e c #019933", "h c #149d33", "i c #1a9e33", "k c #1b9e33", "r c #1c9e33", "A c #2ca133", "v c #2fa233", "y c #40a533", "D c #49a733", "j c #4ea833", "d c #53a933", "z c #57aa33", "B c #68ad33", "b c #7cb133", "u c #83b333", "C c #8fb533", "m c #9bb833", "a c #9cb833", "q c #a0b933", "g c #b4bd33", "x c #b7bd33", "t c #bbbe33", "# c #c7c033", "l c #d3c333", "c c #d4c333", "s c #e4c633", "w c #ecc833", "p c #f1c933", "n c #f7ca33", "o c #ffcc33", ".....#abba#.....", "...cdeffffedc...", "..ghffijjkffhg..", ".lhfkmnoopqkfhl.", ".dfrsftoouvwrfd.", "#efxnftoouvoxfe#", "afionftoouvooifa", "bfjonfyzzAvoojfb", "bfjonfBCCDvoojfb", "afionftoouvooifa", "#efxnftoouvoxfe#", ".dfrsftoouvwrfd.", ".lhfkmnoopqkfhl.", "..ghffijjkffhg..", "...cdeffffedc...", ".....#abba#....."}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/bus_stop.svg000066400000000000000000000150111221777731700215020ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/cafe.svg000066400000000000000000000104461221777731700205510ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/camping.svg000066400000000000000000000100261221777731700212630ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/car_dealer.svg000066400000000000000000000133121221777731700217270ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/car_dealer.xpm000066400000000000000000000006501221777731700217350ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 4 1", ". c None", "a c #000000", "# c #7f7f7f", "b c #bfbfbf", "................", "................", "................", "......#aa#......", "....baaaaaab....", ".......aa.......", "....baaaaaab....", "......#aa#......", ".......aa.......", ".......aa.......", ".......aa.......", ".......aa.......", ".......aa.......", "................", "................", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/car_rent.svg000066400000000000000000000145561221777731700214560ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/car_sharing.svg000066400000000000000000000151721221777731700221340ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/casino.svg000066400000000000000000000147101221777731700211250ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/castle.svg000066400000000000000000000404521221777731700211260ustar00rootroot00000000000000 image/svg+xml en style="overflow:visible"> navit-0.5.0~svn5643+dfsg.1/navit/xpm/castle.xpm000066400000000000000000000006311221777731700211260ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 3 1", "# c None", ". c #000000", "a c #010101", ".#.#.######.#.#.", ".....######.....", ".....######.....", "#...########...#", "#...#.a..a.#...#", "#..............#", "#..............#", "#..#........#..#", "#.###......###.#", "#.###......###.#", "#......##......#", "#.....a##a.....#", "#.....####.....#", "#.....####.....#", "#.....####.....#", "################"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/cemetery.xpm000066400000000000000000000007161221777731700214740ustar00rootroot00000000000000/* XPM */ static char * cemetery_xpm[] = { "14 16 8 1", " c None", ". c #8E8E8E", "+ c #8D8D8D", "@ c #404040", "# c #8E8D8E", "$ c #8C8C8C", "% c #8F8F8F", "& c #898989", " ", " ", " ", " .++. ", " .++++++ ", " +.++++++. ", " ++++++++. ", " .+@@+++++ ", " .+++@@+++ ", " #+@@++++. ", " #.++@@+++ ", " .+++++++ ", " $%.... ", " $%.& ", " ", " "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/church.svg000066400000000000000000000134271221777731700211310ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/cinema.svg000066400000000000000000000115151221777731700211050ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_.svgz000066400000000000000000000041671221777731700217120ustar00rootroot00000000000000VKIcountry_.svgYmo__bT\ %ɇ"(KЏ\Il(R )Kʯemnsťq`rfvfv晙]zq[XaERY^ڟ?섶U7qyY]Owor}%F!k6/ŗ:wziu:"*{k9o,E=OU؊]kkD=D]U$d(xr`JDQbRꀄS&>:E}c,R <-yCuFqM?, V Tt0JPG~dw"ފz'v{ZfpwT7Aҥ ;db0Phdy>"ui56K췬&{7}86h*\6;PHŪM7Uq)\{a/oaI,ǟM;#580`BaFpxȃ{g$g3Q,w?KX3shyݡ ,~, w=.]_7U%2D 3?yPNƙ<'D=SQr&obޢp~ (Jq#I!* Q8xlLjMe>1,zhcKt(b"UŠ뜛Q/:'i8ι^ZL!sTwbQvqd8HWZ3֮(-Ԅ>ZN`QO;S;am"!6cFd̶ԯBCj e*ŏmQHm'Ya#]'~![e묈s|mڢaTT!Of($ I` 18 ٝխxgvUt3G:qk|9srtwGo- -n]/ԯzg3VT>'navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AD.svgz000066400000000000000000000402361221777731700221140ustar00rootroot00000000000000'zHcountry_AD.svg[o[WvSKRG~Xt(PvȢ@ұOREcӃ ueu_uɯzq{qw2^.o_߿?m'zv{5Y/Nn'OOV>d2afX,]]o/ՙnnOrZ\^mճWW g!2tv={}zfo*>658xqWg̛wW{\u og/櫻|ux$ ?/N뫋of'gZ,3oq;_ 1S6?JyoϻZ\ q~ܬ>l)?يOnqa0M6_Xnne{ #=֦oYɋzv5[ϴH-$m /<͟ӀOrqr=9~1[{b|.1'xl7wݢ[Tm._\k77MN&gxmlOζV;/_7k=gxyfaӭX:ር 3F].tN+ANi/.77migdwrý[,^\!_ahC`Rr.q0߽|\77nx_ljǰcpv(\ woܳ~r7/X^ߍBy/ ; ߅ij4Oν7ū~J!4s? r~9uRbrM~\Jh)ONJCli }%-'t577,!܁T!Lr,C5ij,| Ҁ` 1 XZq]Ī7\7d|]MsCj-!CM!IV٣> ^mk19|6 E,bɠs̓]wO{LzmR/WS-c-ejg.Go-> .{C;[cwXfs5S52MO=LRCFXV4q$ \;#r̢b}2͓"RZR!Hzę=8x.*Ĩ@)%MbUOYu^ 1;Cr/NL ,i6PBFH{!E⃐E(R[Ͷw C w: 5`z3ߔ\PEf#V, nVR] ezq6K( YKCQ%I[dr韆9Ko~sj]YTmÆ !f6^hMC"y7&pV"& %wloPˎ`-/shAOudP~R+⍎(po6,fu5;Hcb.6"`0>` CۜfcvDY>d؛dxѱyfwiENP\rjE1#sZ)MZ֓ơ.#}!l`UkM6q"9 M>g]8lGiJqdADSX8-c\s^sCXB+ .duJh!"7aT'{05c@l$$ia|I 豗nbaC !lI" =#^2ѡmGzhJe$ -(el؉^<b] a!T$98 V0~ v77)\4F±BI\43txo{7G|'ég-vNwz_r F ጷ-t[ή_"`p0`kquw<tu܇&@}$L\{XX/!..N^ȥ_éBn2U@\1RW*x%+SsBGy4yGyPO%N9JI| G<$^bG?Dj:2DzXC?}Daė?.]Ш $Z# Q70ft5o`VK6QZ#/9vO\-M ͰR6hL@RnʋԢ'gڸs~[QQ[kaTPkcխi*'I`9w @9)QY  ~,`M1dq4'5EQjD4Nƾ<6Mx洍 ]` S #k!g%6%hyka=2dUߐ,"BbRqslN4ۆ/U-=,$ #%bbka^!=d?¸7~qqsEl\-?(eb4̜π0sCoSJT]7;DwwJ|EN Z&-&).G@=-vӦ;?;ܸգ;<ܹ6l9ί9uOVoG.`i;i{ܴiL2vhTF?lT':8MEU24j^(ASU`Z5˵)ڈ*v)*BLll&V]O2J@Y@O 'b` aT5S #Gٚ#T٠ֱl]JjK ,TU^1mfYt%Rf. өz(IANAc$(և(5JTW ۚ~UR*NU3D?U gv`een,0֫je؁v+X=V ?N!StN6*#ˑ,'рIN*IpwSWw#-: 0 gDF:,buӝ洯%}U4L"SW\g8#BRM?T1HW$lr29Kz{@3S20cXjq %;:s z G&VQM K//DeUB堚fS J'~hUw8+$ ,PZ8VLV~ ם*[B3!'K.ܹ$ΎՋ^{MCVZK`y?eE_7a.AJ@oT⌵({VG4V\Hٵ7~lVBP8ƛQ^h7YZЪfҥX` g31/0YhĨzZh'FU;!Ial0&zQLِUBƃ%]H6WP5X02tKM #CB#[7t-&6vaFfzjlvȺt@A]eբQ'r8 6M1>æ?5:x1f ۾uE;(tGn1 FM)!!s_%5wg/\Hr-alE !ZcbCd,jwٺVQQ<01Nͦ X[kjdP!WAG5@ԋcEMƵ*ǸfKQ֢2ͥhdס@ex `JrF59ˀk72̺ ;НUiX3moNAw82IرeWXgiڨثOĚjmI8H54]kWNI mk]&6ޞ-qNzΫ/qM݉NX\+ٚ :FjF{Du5]*Y#\w>쐗OY 3`75uJ[@O ߺAR%!{ v >+W(+&F[#1E/z.m>S(F]V = Z+AvoVp%>Ţ:`}bt=c;IYSzﰰ#՝^qDZ{pJ{( *J(`=2;*SZpa{@tabzP]?- RsQMigVշEVƩDnm|{"SKG(ŋC1!Qh|]/}sYYEЖZ_QBK!'4RT ֎f|fqp v1_u72 cbKpS{SS~>LPâT[-oM]hcX?t|׿̺uڱni4&ZWҦ4 4j~wZLGұQY|gZZkqNKsG+ģ{wϧ'cs8w PE+/h. ΥHI)-ȱe;7:=p!iSu*323.o"ΪV;ઓ@>oOYSWMb!WSj)T"Mh8HȂrlJ7Ʒ?>SI|.\>hgi(Т>,6IלjεדJk柩.Wx:9 .ԼbT)khcgG+2N$ Z6|u ~%ml6?8pA-Р<ٝUI`G$K<-KvɕӐ\lbԿcЪ'P%4E`_M-hA1&膎/,KPXX`uBq9b )6d)̨SVc3i2Е0ڌD)O`?7LIok!o*JlGJ#S! THxKUVGyIM١PB&c[T6[56vƣM!7V35jxΘIQn.RdžLjZEm/xh/ t&o5 e kn:oShW@12 eы"3YԶF2:5?H~cbNѣ{%#xcb>*%@!Y e ۠eݥ`%y膴 ΢L.ܵTL('rЭU4Hm\፺4^B5J֢aofߪJJʘiAR (noqct=ʊy!M镛A u2RqW1k墲LZ<{V9j +PSQZ|RG@^5+S:2r|9|;0I ;$)lNHA"Xg714J 6y&~6J;7RY:#V B_Q0?Qgufo]<`Fj@BWvw\Y|zC}/J_(ceQ Sts׽iE*TOGY|gd**~bxPY^Փ#Io;UO5?qif^;Ko a Pc:'i/F[=i iPɜ^F)J:Oұ "`jITOWLJ^͘7~pia#)#G{ )7.Ծ^|Diu`vQ0h֬< +d" ep]tbɎR'11*;+-s!%ö,#2&O4}a Z٘zOmW5:3% b&կƩrт0"c09jLkS?Az]mQ.;JWLeXTIqSvoKo-5a/nNӺOgd%=4BOŪEBVU鶝8\d̜Y,¥uJE*F̵yGkWt4]z&IeKdGr]YƮ֝ >.91*t"tU'" mqNA`^E*.janFg:B3 _|tE") Ҫf8I_HcK9Y;CAsʤf5t95l*TMϱPû;ωUywoں1t.}[u:C 3o=R+mP&w?]t" "JU)LGReDhGh>~U$e@CH#UfM@1m^!vؾ׽s*z ((ltEI#sn^JB ʀoH]i+RxS3nLlNx-@[UIZ TYd&=a]kB~e%vf:ζE®(1 _}|PM#WfcP[&=N&EWkCdţ6⼳D2;դpXg߶oIn@c^jZlQ2/p{4б@knl+yo&fL :.! άeM{`\9:%AȀ6jw)ܽf"E69(rZ s;؃qHEv8Caw!L%ZF7D`2A5-|̠͑+x$H HdSK\UZVO7YܦWIg>0Q2Pyu EjQLRy;*^.$ W4BQͨ3H䓸۾  M9;ȟv,)9N]jXp_2Eے[)"]A Wݏ*ao7n.XT= SyF:3j2Zgm5b*T̢uD<ܵLYGW.43:j[> |OӶwb5|Ia8r3[qe/+NC g(vR\6EfY"-_檺9fߞzsaMd*.`dg'jGrb=] IQ#6B+lw7:R63g$ȡ7%tj-SlNbXB3)h6aSdɱ{_:nuTkɇ˪*'xҵ1r:M`9fꨢ Tj9t%;}k3$Y_a:|<߳6 &%ll3tQtL%:p)ܽ {W\Tz4Z1G5A>H!@pCd੃acA[N ~y[**adB&s%5GXBVXH:([rj+BއHocݣd#rDH+lHFtTg 5|3W4(#H1uG jZE 0dfslCf_$ l' e۴\9VU]R'*GMAs)3i${V\`3SZ<-z#/O{ĺ51Zyu߭,'ёі(e^Ogg҄#oݕ,qP)h5éqC×A+"Qߑ6aAeI Fs ئ]2 DyN͟`TnG>͠qJȬ@YN1G rr)W޲ǒ}-nyYH3*2fDͧX-GgZݽٓsSq9WRbj;_i"3g3Lg7`. SbA=!rRV$ӴM.Q& փg]ҮQ9-;i*\/QC={OBf2cXV/㰷ܠؚ,3OXA\r> A;wR-{CX?d2ꚶ<BTA(9KbC%4+4lNw@wѝ/-yVB`Y+o0?;rn紈(ʬ\Beʈm\.JmtpAF0ri8i^9@#sL2/rj\ghձ4Mv̸o~TW1l~~-[|I{mhC([+!4"I&zSz 1S>J9h[e(Aۆ6XމuL?ڡ{.M@Xj 4zG[mZ 3Ys Dɕ{wcŪF:e"mUlJSS3zUBv~O7+͚IvJNܹ/s{E_~lPBbƑPߑpbq^%3eޒf+}\w?O_z]j\͌X"1t r,q0LLUIikHc}4g$iM4/L٥'cZ;q}\Ӝ/nӼ>Gf·f&]m~xLwjf#~tutmʝc'Wl7y|y6RpgTiTj&WBtuP+8xVFıN4YlN.9 ~P߼T 8R0hT`[XIC yhBAcon_ =D$(W% P:tQlo.j <ȄDuŵol$]!* Mޢi@I*Y$3lBClCJmGD.%3xۮ|\钜LŒD8C+dEPSMWr54zz%#޲u*Y ݹ .yf[*jVaIDw?(8̮݋$;x8rUT nkvPcA鶕)]3+*iuSe^AfI5O)-e⩧ '}EuN8-ǖ}qL` MirAXKsy8edOq@A bC`UݞS64R~ݤ'w4S5石pP-S n>S ݷ-U@{ݼ |@bz]༘sR(mQచX\iVvEfm<9] 7twZ\JB0 M. YY>Yݠ蓪yLv2b?v7V6HT.eHd//Ug حWӜ5ɗs|PZ:n L ƵoW&c7u"j r,T+VAWRU YPJaR܀{cf=ٶ^,4bY-A!vՕ*&.r`)h,aݓeς_[QIvEP(f;S ak@n}\ TYH1E)O?Л24n}EZ)L" y3:㒝K/öɬf-׻1tP5Q|'4 "%X^LF0K/2}94tFMG)-Wz6|sDxLC!MTCt]Qܜxk4tAxț=8r0vt;i0=JOm6,Y 5*RUȑ'ݝsQkbb'ou\v>gA+>D8r<`}I fv}-)^ xjb"_ F4t:2Rh"c. b㰓(BؖGqNW4> wWMgyq6/;K/ғRG̑R3hĢ1Ng\/5 mk!!U 6Y2U@:1,˪ι2cխ=xi~ʕ1>1>v3BmՃT=l!4y{ϗö%{Q^}@[fISϵA8)-OO;7ԲT .CyT*O#gn]5Tuy 8$-V 7]N~ETӄ㚑[ m𔪨"6h!2XhW 18:}fd*?^Kr;YbgYvTIV,F ܃q;D)# gjG e#ɹgT,1# !43vOJ)?8t;L9_Y{G33Ե%navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AF.svgz000066400000000000000000001320201221777731700221070ustar00rootroot00000000000000'zHcountry_AF.svg\]o[7}U_Z>&7xsS}o$;q,CR긿y$GIۓb0>!? y^ݛ/|qy2daVlr/?ux =zO|zw }7~^_]__wMoߏꗳoF&t:MOWobyv4/oՑx|m~=-tݦݖT6##G"hq\O^ 1϶->٦yWzr>? M7[v^35UrfLdmb2*|v2ƲBNsx0\LߪFP5kfߓ݌6mϧoWӽr'^L8_N^O.ϩMfΉ>>_:~-GOOW|RW_!}|dvef'κAzq5 Tv7;b^[Nа;_ƣ*7uzzzP/n/S6^a6X|qDY_SIfϯ>oވ}zq}59^Ofbѯśw9m$y<}b{oN%w9 K6Sw37%xx1/o0=́d=~Wi/[X*ar.0c+W~8=PNǎۋb6&.W6۫uLڴ51΅XV>d:+;礔:* >z$RʧZvuz&׵7@N$e41V!KlRq4I&*-Ǣ$6](Yhê?m2);b @T{"Nƒ&t)(v[mLҤNJNpƒ툒 lEOWY; WrvdɅ4fr9՛|=_^D (cl$x`"QLg::c h&\cT:zBaz5θrHN-8>~~ٶPⷀe.9`Ulu8/$RM+JIQ9{S%&KPVJQy XA`wjo]j!YU;Ռ@Ơ E-xTqBP}WBc.$`ik:p:E,xafت5&~{. +=0xSnhi_Ȳ?yMT  ?s}4h-ϩ\ T,cK;h4 3W-ꄍ:mJ:E)(VJH䖤I:#&aը 6Z6")2 ЊG8B((QU BC[k)p $B`D́:/C ˔ ^_bw`#ͼj(戔qh&bͭE7dn43-/O/~DppN0rqV4 #Alg 0q)~XT W# #DhS4%-4C$`}g¿Sñ@)tl&AG4xq3m*-0Hi-c@\tKFVV *AuIW)`Uy\[׉=hp6X";g8 PiHcĜQ{.y6tFU {>|DڋrcoBmaJDv!9{^uRtvjzs7>WUo53KRE,64n/Mn~"`;-xjY ؂Ҷ -o9;FD/Qб1 DŽ~^:kV7lGZׂ||vF; %xA6bʈ'i myZб1-(jAV ؂-8e҆;zbƑTA͹2ZծU)jНvƪr`DU7s4:8i й4f?3?Ȍ4U{ tlXh )jSf&3J#6c„ܫ/ԭmRS5j9*= tzTAiTAgZg-16*8$`Ho:؈ 8( >2H YDAyi49ZF[# 3gsa)Zxnc;r zK8fXT2½&Y{ JM<6o#忄 3cCAA'7,phм|7<{1l)m-'B\Fy/a0YWa":x`ڏ^N.W囓zy;[ @'AW.Ta8F`-ؑ_u?8o_ n.%uGUjR r[ ,;F`[-ŗ #`wIIj Q1OvFĤ<X-4yDCZ(K*pcL:Rk8 բF)r1kr}N5n]ʱuO[ekx P٫ɛ30H5|%Sܕmx TP %HWt\ozkx h*Ih(eSjXmx- 77 -i!R f(B6 /^@٤}Uo4mGaj@bx6(^5}(TI!p @ }eY UDjebZp+O׉,5AGԻ [-;NpGzvѐ^LKyf1!R3FXmOj)O}&2ۏ|ǻwbC-|]GbS`>R+nb&@>N=@Dtp/5~ /B+ ˄^SgKv#ĔQGm-5=$klHO y|vw~@J:c`9RRBn~xVw\Ys/Y=_7hZx0R_{ T0X~0w=I ޿Sؠ~JnMl,7MyXl5Ǫ _*uB k]=mw-WL@peN6Y`"u+"9ۉv$ފ3(FV1r}GcׁPƜC]k7HT{',c].s*Gp:TdDc5*|6xqWKmaG 煅7-0 f$oSc.R2. ۈ)f]iC2sgCofIo,wӥ6#zVٔjcn;`lIN9 uiit45Ü構+c] `-OBDȊ0h$2{__i$Jxy>' 箲ӾL벖W\7׍;(b?b.KfwF+.J0oBΗ.XVO7*EȺz$AhkbW90YcP0rW;$ U7oSĚ lms$0)=Dd&7|cT j>)H;dPNﺚ1:lnM;mw9R~Ke3a[5^kH~^Vo$O;j!nДA*1@v"Rl{o>2tC OȿZ:5!\WT p$JK'҅$=<@41? M&[,=pyܗQ`&.(q-VwPIeZiwB(g&S79@04disqFVl7Kc(쓩Vҭff6^рI@/U\P^d_(;-)a\:`Ж0}F4mMӔGi,ƕK: ?ba\2iSTbp_JHҼ (C5O/NRQFF!1~IjzX猂u,9xԹ-/MKue2MEcBS 2 ÞèE{|Rżu6AiRH;k=b=Y^>,bN~;FTc-e BOe*栂gDp:yj]~a:uv5FG18v߽PDA{0 ;>传}(8'o ]r4Y}blOm7JD('o{apN$f E֩$N [ vŜTtUdB̈́ nmt1Ɣްm'JA7 Gzs/"!X2hJj^ q\+Wka T.;,Ζ-HBl ] /dTj>%+, 779؜{NzX#e[WUQcGg.f{$@,tF\9lgE_2f^.gFkbsʞ.;lT۬W1T\]sYJ3&1t,ϲ;ܚaRDJ(C*;+z0*n ے@q; c's'0RI7!M8|yډ_>%uySn)O:3~̨{%3 f]o|j-Xr.rb̬'c&`X u[M Ē׭"$&Mk徉!S73O)\>#amv%/ 6-K$3ՒjI>nT=P[K&ژoݳ ޶ yGsJJT3:,QcA5<#^^)¨Pf?MڤM'-#<[^L'WIOw\Nwn1p]Oi_c}ocLx.'vV|z?|PrO>ζJV脘{v'>bjlaZ[J;foeCؖ3g bn>>íp \[qŮKśf poXϱ?Vm}N~ 2Vs3K|և&fpj`YL's;|yZN~ذ(װH :'uJB-үj7)X: ؃X=p,/\k(YdYƃ[9ՠ퉅k7ps7+F=U}uionKH%xjyV+6YU^Wj=tڋDsmNu tZNU:AMK4|{ϺSGx DRj郛|<_EqcSGXj˟ WνGFCe}).:ʻR[qs8԰Gέ Yuv+|g$> (tYßnM>Bpve¶]==c-P=o繘L|Wh-wd 7 vg;L@eb I.A2zݏ*^C-pVSXpggg6?*w懟z~X8)1v=̅4 GgY@n3AZĩ\m|!KV/|8zkMqE"ȝ=( *&Q#h8vNc@:lw ONYhy<Œ>u>ɅOnr+O rٻ49}Ton8Dь%vD: F+`hZ3zkjޖr,Z=Fu<\=]qlIJFmJCkCB,rnF iBAq.1苚&wiKk$m1gGŰ p돿yؑ磔*B}(\B TXM7oSſr6uH!{BI Z6 kO=4܄j'WP͇j>T|Q5?*?~Ay)1>aR} Ҵ^>llFTߢ۟Jփf̪ȓ:׌\leRP˪QbnbAиДh}ИkTx|"_Γo+K-o|Ʃk3AbtY}ͤJyL ڃAsHH>FF==}S`s|1\@=V.j}[nWNm[@%(l[0n DŽ( NM,,y1-FQ|1c#XbqWFa!mG )a71Iȵƚn®7+ϏFU5$m0xq^,Qsbz^PZwE̾mzhW[ wfV+@kMy}ENސP1v?A:@nqb]zA=O{/Ws_ƴ-D@ZZC .~y4)bTF8\,ny4.A>o2;V;M{ Db HJ=V׺NcڤpE`6lƂΏ3oċʤVZY =Zl&<Z7ۦ4PC{-8K@i2~w|=`t پ+8*JB۾m6[u`g3C3Q&v]G{–3x8K|2Qj~vq_!st!Itcj"F3h uX :Ũ#so|gx}N|WHW~!ϵGqӯSoԻ n(D>G6}Ի0}PbH#xh>#:1_Iprp@k 6D>]֌ZvF9ZvF=vD;(ZvFc7m|mz@R)mmnfk]<E邍gK"Y3gIp]1>/'.f@"ܬ!q.2VY}Krj$;\vq1.1AJdLOB5d,>wy]@ͮAq1.-{kqsa sֺbx Sbx%cx%8}5{8}-&#awOto&͎.%m^ YU 6J~lM}!/8pX.X f-mலGͮ*Dt{$R̚|aЮ<ʼM:gإ܁)G-P֗#h&QKPS(EN[cXWp%Ⱥ>(/KO.(gR93[n@F沕s&o[C"P)wzpZ9vwj÷7H-~+,YEc \mF5i9sp PVX(a-Hg2uh#~kQ0)7<,+ IUW)3+er1.0]Y.t/~ڞ\Yt|G=GZX@fCKqk|"K~ݜb]@r$Kl:*6bp:7,v`pGsv_^}wjXQ5ܠib=GrVN̗c~.,Ԑsֵitg!Ϻů{lpLUS/ Ue}YW_r7{iK)XuBEXV]F2-  $d3Gm3 m#`_fwTYvgRрD,տhca)facV u &; %#F?|jO~ZlI 2e-7ޑU$Yr՜WX`3>`ikC,bȮ?c)θG8%ufnQRn7Uˁt ]eIwh^gIwg^mܩwg^iiwg^k܉wg^e)wg^o<]kܩw*{C{u 2szW\K˹}\g兟pUj  thXm! ML?I"CԎ;F] z wo ap1<*&8v7Xon rv3~7Ln $fKX)ߠx'_bcxһ!a(e3=oVP};{48ۥY/dw#HZ`.:2GR<12g͙IQpÆn~F*39f.h G{p5窣w_̳@Aܡ\Qux@oi@Esi ho1aK's#Rh]ex3v zeIG& p7WNC['m 8p&!j-R ^M4;JL*~wݡ PRlh% 3h,&LEA&j>apG%Ҩs~VWvE VD=(4 ؆Kq$\8&(4sb]+>ٻ/-2s3i^DE2 ~Wp_r<XZ1X0ouL,(ωңQ2H-}!3@@F@um `?3;~%أ%VV\Yk%oq$/ Co/"Zz_M[?5:j"/QRN:Ow6` IhJۉˆ4`<6ni3FnR@ x4.)v`jӱwt:yw&kL~g<\u0#JNK#M>:W_{MH&@e-1Ou\^> .{={/&OO^)vIwt_:j/uƉtV9RW]29it+IKQIOnhd N Zͽ>ә PU޴[SJȢ%Ho Y[!8ayv((_P0vTʸ}2_c8d )q,]k;7qIK1kNxG҇'% jWߎNd⿛,1p'$䐏,?wWJEso t|Uֻ{%bQqѕ!~0/ zKDrUWݧC\N%Z'FӅ"ТZPЄ7  Md 4Ge5.lE,;4> 'O! 2~fuH G Sa..XjgYP&3Hc=>*nZ~U d́R/ۿYE(fJ2ga"G3@*6lDMNn3셀EӂpE"@芢Hi_DLsCѹFbq[JEv܆h1E@ at ry!B~VMj$gt'֩&y(P)ĶŖO9%ݑi@ҡUjw0{tAhd13֊mW0az5#`:]k+ fVt} 7tn-;>pVღb]iMp ^iHGƎsb'X:ӱ#BłCi/َG8i@9(cNȤ vbKuIrqlH#a= 2փ/w苛h?֦<RNUQVtHh^! #[>Wx':ǹ|?C7Zl<Qfv0aDFq;ldGJt>t#Wu핺=/X+s$ҲʘsQyjeNJ Vؐ/ T]%AshQѹKkՙY'?c,-_UM$l! O锏x ٖt#1+v~%] EѨwCSPhVJ݋X= ୔l*; lp'B>ȯjЦ.)퍝"vΈmc)7'ZYR5;"eͤG1. #&񃞘6D\ ۇm:dCs2ZUUe,)9@&řt{QCytHpe92ŧ 4mcUxkpԃu(W:vW:ubzGmzN8J}|)VO-}]Iwx.Pֺs DB<gdevY<'K /|o2@sIŏ/]ï6䔵֋yO{V)`|x^HZSmy!2ڮ>>~K`J~p+G cƒ,XіI]M1\"mHsߧi hYeg>[ c[gԾp3nlyNJ[yGg2)s*Ƙq)L M=pb|ª+VwϱK;秮/nqRG s7^!Tĭӻh;sΤ^uH6S,>ɭEQ)k=zMKZ̤m`㶕q%cW[qٗg ր.y};J$]Mkۦ\)-΢֭X/أ-秭Kˮ MCO!pV_ܴ#-%̲e+2_{JVlj‚IQЩҤnMv%/Ҏz1.ig&mY@"'W\-Ot߸yhv>hw_\߭2ʷ՜g:ONe4B3ߢߘĭL~LA-_Lwse],VuNp++7E WL}-qG;:둸90 m}%m k)o[=y/+~x O;_A̟7;y_rQ{6]y+@7&y'+?ziMNyz':N_;6'r{z{:.ZЅC"Q7UVZR̈j˭.'ti]q>S> &%+N*`:c*8YU؏geEjfޤBBf61Fk|]/%0#Jޟ5fFw9V¸ yd3Rƕ`]]u1.}A7*n~9lZ\שHkZ*n^w4#gKgy_J6i #d1rYpKf@CaL׷c(J~jb&+[sQR[P=5ʻ3̓KiuԜtj|OݿSԽ吚SᘚxՠSw^o3^o8Ws7X~/>PTb7Q}1fa ށE=p{"tLQm|o"Qf\_ # XаyfKGi՜ Zºje -'D8XڄZ@l`o^o2 hr?dKIA[n#B@ Pե Dι9|[%;XY݃#;U U0Ϗ"˲|G=78h;`~û v`~u3#ȯ7|5}^c T#`ԊN*Wrb}wuAݗQ9(){Zzjb,iݚehI荘i$ͤu3h}C0?/jjy'=Kۀ+6\J$S¶BEs=P]XV E `ǯ 7wq 7,t]5y`̩eŒEKRБRl5u_mw0ͤءy1~%V=QKjq[8n9q=慗!~ $Idv°V[dENIL>Zӈo|T}Op02Kt PFzi@ߨAN|ב#)> I9嚥ܯ?xRzN)[hYGLv_)| bT;A|8bEY| 0bEq| (b"i!5:5 }Nsfz48}zqVĿa3k8:! | ]ZCBu)+Dhq>mkAw<נj 55ٓ5w'TeNVdSI`1/'oI Fh @ Qu/ٷ?oPeL8M5ߍH].z"^gB][PX*EښeѺr?Fl㝍x~q_U۵KW5WV<^_VSAHpyFtW^'j|{vSO)1TPٱ9O~\XR:,W^b3#ȲT7h-WV" "vh|n^5yp .`K!i k"'a$y .ށcp:w}}?Iϙ Ga5]1?,E\+qOe/Ts:D꺕Wa< _HuZ9#C^ڬ~])8&@;36TFc4G]O2K-W "5xsf3l+^8"g{YM;Pf+RWU:Ft:i"p7XVJ*C5}) l_Jv $TeD}03P] j;i`7cZsp9}1y?:NO-};/MG-K"*kSG/[eb}򾂓a(?&$1?{VV߸7WEJ W." ׶-#9' ϋ[򾔼-|EϩAB!:B@B6]/TJi/ܾn[y{co*: []3IxMiߚV>g45XΟOOpr \5p1f#:;iʜq%!ۧ1la 2UɄ*ԥSR߹:Mqz>>A8ϻT;IbNl&}mNaG &HN8$C=Ǵ,/%pbzOVNmg|˙?x^Cxn5xj=|w#nf~5ߧEͪ oV}o9xӦhY-' aZ *ʀXTL&1+.> :@b6{ ȯ YK˴9p6q7t9{YG2ZQ޲`8S9R 4Vy_J^f|R}J)&%+9L&dA\'6֫g Lw7u1.yqR!׽]ue+uyKdNT +P=vɻ򾘼h:Zu zA"&TfHT.ol cg8y)%qR[5x %lgB/GPr(5CetK +D犜Ea1;b+Da㳦gl_IߜxP py:| &V?Ki_\ett[buc\U17[/Bgִ,8iL`'7tNی.H>,z&]wkrldi)$g}{c8a7)#ȍ Kq A&LLu6-[S:tnhݞ'uF?JМ1N2Ek"%ÄذO;@bMD$/:́-!3'GtjBZY"m +vy ~= eR\B-f u.W[JQm'a 4h)"8F͵\yzoIU6x7 nt5IRYؙ{b=j 3Y|,]b93Ie$3lה l^@^ u 5,4j9OxOeё?՜~#<t{$=oL2;nPґ@x\ m?P ?w2v٫9b_]ّ'mٕb_AԾ?KvveҋORX꾐u tė7<[ק.&B2꺘`'*BοSs( Bds6ITbjͻՖp!U2\B:OK ;he0Tv\V WlI&_E3` j3C#!iKbsS]zd5D"~CͲG'θ긘bxvhiAī1ضmYSSBq2v1.-žʵ][LRkvUN~3Nq5NyPXNu㕘N {cطOnֻx])Nf%})t4Wyoe6o~IZ\k?훠(Y#ʷEE5+&)/ڗt`m^LKvP3wxG7PύF6EX]MZ%l'+x/@i-۲NoYZ b]vf+ysXn@h5tF AMvrE#3b 7T+mY^NiTm5UhW;p,Rs:2昢 ExQ?1/إ<[o8՗nzYGKqp'he(j@yO[FStؼax~25]j}%JopSjv#K\2 ˕vJN~ZՆd2[2褳tt]mɗ]k ЩW]kЩwDZ^'XV4Vg@ >0B ̊@w}|jCmaEqKx:iݹO=Ex~@GHǼXp&ZWqP@>8JWFz#CfL_!5߄-\ZBS_䛏CU Lٽ.H0֊]{ ں&NvN'6u!:i4\N~dX>UuiumU3eaݹd@9N0tNN]ʹ6._?X czXwPr:w屟+S%~Hٷﱳg> I֝d={nNd\3;a##c~G؀=5ߛ:@jEhbqJ WE~c~żkLY35 V a6 ƕ(>((M9seE3U++tw 4w'[X۸c#+%_r]N?ѿcb%0V:Û4vW{iѮ&r/1Wf0 q:A|Y0ϖ%XPc(S{~3"(JKMO`攚E._; l;wFV-ŕ.3s) tru񼚌rC nx'͆?'Zɦ]H8qf\r"^;OF(;dj'Mг (4gӊ ?qW@aN*iWxi=E]H*[w :L<|^W2hR|=`7-0${X ]Ϻ>7W|bp#Hx`uHG;?_{.5z4Mtu ^r1;3H7/{>=ɘaAN lzD. p&1KMh 4-~#)&_/=$bD$|N9dh(C8ERs}@ r wB f Fb$9[ֹjA ~[E [ L u =_Ԯ$ w0#ݵڧ1#29|8E {z >vH֫dwo(bb1d (M.,k i_jDo+H)HNXFc~'&C܍HY/ic#`r''nqIʻ]Vҩ J߷vHF3aM.3ǚ5ֳK1ӧ$ZDrGJԵ?;vy!NkI1S+ Rj)yrޖpW+KCu>t1f$uQ9Z麶s49g'7,Czڜ 8(Yb\&K~wuF_ d[ᨹ{5뾒Rpŝ86Z ׹G+i}S]b WdK2K]Me3Z[D)-[< P i+ցDs%{GzcE]bYCty>:pcf oRYE['3'0N9v U,,B ZP'Ѡ 5ivN-(XYX>\\pEluՅ,)Vuʧn$llXTg{}ጿ3nTrQCsLZAln[$>( ,T_/Fgst%jsQ6*oF:3q:8{iMr[ԐCm(צOESֈǧc??yK#cJD8hZQ?%qvWL+~nq-~Op#'RWC{S:3n\f'D~qlN#zcC; Jb?Mߕ!|~ ~Hk9îx _*jؚnd#KZԆ-|»g.~h 1_.raeCQѫw_h0ueNsiiJ-fѶܙ<KSهCV,b}NE Esħj+F3l~Ud_ s_{8)цxn5Ԅ(~dJnDIБ/b# 56s5c\Ch+N. ,=Gy-h]a;ɸsl5IF`ru%^5VcA$ ^y- !åH^+2lnpx3~a$/L D4k9ݣ&$JQ|$ 26ы;د/KMDT+RvsI"1ឞƜe2fėbg]oNp7Ι[ۭ̑ywr-Y !m(+YRZJ'dwA2p:܂pZt Q֜a'C |3nJvtHQDŮuO"ҝT?'YafӁ8'M8999k6BJD@^|!GohBTwD8WaX$/9gO.1&QV:;2:7Y9)sX/_g(rC#ܼ_ MA'^B=0$$l~ ӿʗVFKw Y0u'<*id̺z (+jiC5"!#^w0ŕd+u^ '?bJ6=wDlgXs{|Vj+QFx_5`ahɳY?%ޚ+UQW{!g zO{oLc%VIMk?:,RSt$yKZzi΢r66NY%5W싼E{|D!/HʫN a !?{J\[ȝn-@+W*?m<5տ`Ơm=eA|vM"I9EWK*Az>QTςMUjd"ExE*WumlE 쨤9nȩ}7ۭϭβpbdFGU{^r^hc9/~]WWw2NydFwZ^},وxn]T  2(əC^aB`A ܙA{<~tNhsN`T.:HĦZFQ/f2i¾uR㊢H}o;]㩛zo4\(tho4 X$$<j88AMU\ttrsvf, ;=ByB ލa]ܠl\\Erb"{TG0:T0 &3ڷRg W6gO؇-ufw\?W?Pk˫;xu_gt:.ơ.>d ibpCFevh¦OUz Fv3G]Ql2 。652@s4Ncbh>Ҭ+%ԟpc`ږ-BB+T .(|gOH(5T5âP8V3U} ˊ˯)c~IKveX'AEIn,DM~H*dCee&^:#}BZ͌[;1NZKhP;{DhOE]gd]|mj]O/ToMzجQh =Aik Z`rզK16VA-Ǹ* tBf^%>)N%,Fk,˭'ƒ@`YGQzu(Gri5H0#( }M (T7 *IQ\T<XͨUpn8Y+1WL#^m\aϓ΍ypS{KJQKڱ&^0O ͛b#!8s ͹uh̓3 Y>F-7ssu2Ynh>6*<)Pkя%d VK,ڥ-ʱ>kE|lwgo>Z͘P}i8wgZPuWriA.Xߚ\…vPi(_CnmH]$h Ur 77Hd<95-Tڏ%LQ67dk]juo#(!޾YirqNލcX%]:2"`]q;|/Ȅuzp~Og#Eۧ7j1ԁnOָY<@QYiMͰ ]Xq:9FBDcde#,΄Iur('5;ǭiZц lR{^ v]YcW3# C9AQ*Lf^S@T$3x" }1zft#+ K ,r ajUq|=,rܟHРHlD33,9+!@Zy;HuofE[Iqc173ʭL\-Љt ˙wY{n~{]i u`duljQFªnLQ"cHb/*)]-AvCHcq]LBZfέ{5MFr3h(pv#&;ܣvK+3ګ9F3齹{r+Րaʴ0~6AvSv0.Moȍ}ߝ{o -w-{v5bt +.cm*4ڔb6vr۵7<tFⱹuYK 1^ɽy;G~|0mQkOӐfli^1{i~{+^|?=#d,W 97@/NPWGૉv!!c=*AI (dLr kbY{1:M}FG[2'WGo&18jv9ngL</@]tcɶg֒ ʾ6B%>%fz I_ xo9BVC #~4+IAup._hթ=RSD ?Ic P-d8AFSPx4~evBOGZH Y10o-{p]M}]fQ6-"$QKM} <}6fZ80']Idꚁ[m`8O(a j2_q琍)p=ZE;r] Ԇ@| >r;ӂVZZPtYO-i>GcۭK; Sc Tlj3-*'QgБegAϛGSz86~шgVԍ| [j)eR|AD ~qngs[g`]mCY2t[vM9 ]!O+7FL#=bI E^+5٩}X8ØSplxpPܐp`!Kqʾh&u=Ms&+2A2$z' vNH3[Q< 2vL6zM!FC#Q 7 љh *nh Oؘ4T {CkNx*4y JfhYz efqLV m vSnTx)*sa1l;g=[%E1F/1j88# Dz#\GƌOj曷pVSdAL\#ЀJ30wnو@Bvh-n$(1 5(44Vٕ+Zz^ǙWhb֊?pp!f6"A_նd5OK8an k8+IG]#6zH+QhG Xn;6I뽊o{%~g^: 󺄉 w`%)Jq 5>]Kh#)w=;Uo@tRx#=UY2\Q*E]{g$~M!hG/YhMA4O-c9@i rJ*_GVD.\Ws8+7$rtX3M3gb⪦r휲P:Rh3$U=ΰ7j@AcWVX #'5ǜ5j ΩDCs4>gtF-$[3o1" 3C/2al$'(IkޚhH#~eMyoin[h:R[c2,rr] A]q'[b`Tt9vg Y=D# u #e$:8ǠS4p̅DQSNXE`eڭ ~ƚQ׳\drCRpI]Dt(A(NA 1ZG=y\H4枛vCH.-֑%f{ ̛SxAp 끉E.߂T׌z5T#C06梮E !|6 D9!]Rݩ|PԳ3]d9U#isw}(ocd Y$u%w~e} mѤ3%P}qcT[+Z׊E3sRQp2E}[;,p*}xtP>aW*GJKY.{87CFev#x@b2K®q2 Zyplбo= 5uɏ#a]?ք1Xr~%ðʨgxμæ̷H*5k]|@ lqcxkhcCA_ƼK=no:v'( jZ(fC$8i!4] m,tXj, 2J8lY٧2EIoZe+}ؚ\C:R]1O8gk+bc\'5gx4ߥ]`]9>2 EjT2ܯ d2ʂ@},CwQؐdR=6)s[T04RU*5-1JсRsg:צm`!Ʌ, rbQh^(/`;=6{#<,'378\Iϕ9!g@h'Ʋ8`1>tMd5q2܃x_+W'hU^mC tusXǾdȡ5pEC`:|(b5FWt(ƣzmqFc kh3z ^ 'qx:|fҊ?J|1:(0rn6*;/SАqʹ 7}Cqѱ3y֥h/aɹRQM,P2mנvssr];wn͙Wvͨ(8e`"N[Ys}ު|G°p_G1j[N]@[naqFlD |4ns*IG%)&Lox1x[Q8,Cf <Y;`b!Yq.SKdj vʲ25DF/tf<ʙ ))\l,\T5()kPn'z|sBJ]OoIO.e4r( ݥƹPZTuR,h; 4wIGQwjJ>f$s| dIkCUP)"qpk vJhZs:E[CT\9R@`Nmw{K}@x`lQ<;8jLIpFɽL:wOm47j䖮UԇI83˛6JUeVJLa"_(WK=PM3Ŕ2?N cHPyGW)$Mn;QSФBOhU;0%Fe6Qӓhv, [,RZ,N i#WNP?P1T ]e#ieK5-5QRU]h2ct0 $O,$auܠdNRFW &|jp֕NaV`ShiU؈`ag7_}ݜ!$F2E"ƙUV_-&" 1/Н(3=p͔Q9Bt+L0J;}0nH;+14NjnmwEM8R[÷W ;/StlD39XAbyG҇ñ4yd9{QʎyQ^a{{͒72lbpwB-)N@OLZQ0 gp(;rg42!T.0Φ@Sȴ5ֳ 1 miF@&E'((("Q4аERdw!^:Kea} ; 5RP6iMwk5, &&y,D2zΆs#qjQ^9t`>A9wH:HQaL1.^PSβ!ox45$r5XRܒ0CD[.`a' 7c<7h32Qu'npau%42kK^Aw׌YH%|+VC ^B6` X! ja$qzGgrFwEl)!$=2ltw!-[Sdrv y.Z<-X|._ hw@RT3{ a̹I ENo ~q~z" '"} $*glS{w63toNu=ΡGLG Lɽڍ s !hDM⁏T"cʥnQ;ΡҺ9V~y J WIG#؊ōbP9mԓ|Z?7Hx{9b<%Є9US X%'7pΆI=o7 N]ްڴǵq`lP,'hRˮ*I"RÍ 5;-vC4ÄAnB61et@iD-6$n~TyîMSv+ M0r 3 ʌ?Ouͪr vowP;>#۩C\lVN { L:~ȘNR"wIV|*Chq+>td"8!)kWdĥ}>4}r#Nޭ -7b yp,$q[{ӗzm;m+@Do%ij8ȸJ=SGqe1#=j'؝SmYp ,U(*۫P@-8GjNڡvC@!^آ Pu@zg" At1LX68bem4lG!Y[!^?BWwh K5:y#wM<Q*yTby/ZLO>0ω1"))qn7 )I%OJ̫yG0`sH~cSMrأ&ak^ a?bkoR^Gy-|%0z@;S&}2z`zsPvss$X@N="N]!.Gqw B1F2t܊a!BQZ_WT3avy|0G߬'fV8rUz,AϜն결ye TQ"EU1iC Vƺf7nq/]g#ZFعf# U}td>YyYXQQדv6< ge4/{㭶;ln6sSn6<}&m.iUax~DS*.KF䝊PI8@ȢWӶmBfmP,ziM=MTPR7p1)Fh5>3C<7%ZnYKX;XЅ@S`[sE]go R+i9a:jtƐ֖na9n-/;zCxev@ 7p>+C7+TfaDWI 世)k  =[P)TTƊ`T9ts,y8[EڢCk^?2~Fr@.or( ;̱3ǜ̱-Gdn)q+F~uө)bΈWDJ漅aYW:E:(.qh{v z,5FePܷɱ:26)?)8HySc!` d$\֬&iE{MH=3t%3N Rb22:Nq2DUJ-Bd:G ٺ 3܀R*Svo,.a\"Zؘ‚;zP}ޜOt+p\m(Wr̆ȹE]]ub9W8`búr.F:q[ ʊΧfY}fflyS7|<FuTqE/ vr]96Jԙ1.93\~轈mz:k:o2M:~c]ǝ;Gu:~=]ǝw:~t]ucʀmuŝo9Sf,]ǟ:Zst;o[;]*>>}y[oh_tj(=$#x4wUjK!_'Cb ![MVoq濮I`^7Y=rIqطx] ˧ZHX9@hsQ5HG7BJX>5@F G_ZvW sۙV('nU IJR v.&Cs!ȄSʎ 8`SjJs0Ҡ SK! `,^1n^_N 2!}l_h ɏ΂$JC,$7O1xܨvXTK Ea8PMHN%HN! gIhV% ;(GTIJيlRү&E!\nL+v;vEF%DbJ=|{yw3G9*CB.ۙGJY >4:;Q%tD ɀL]B88,76()um&TeWwص3a 4VV@:Tt|ږK3 ڑK(%7[ `rW"Wp#7T$/s8ɃhZ2Oė/#! Yʹj]~`O GR3o"'2;gFeᕾO6'd{4Z`OP[0\5mŻSWJ$dlsMwT"WYܽ5'zq@wE To,톄b<)17Y6@P45i`%1k$RIVN, mHk3vSߥ= -l 7|ɘ3TAb~ z8OZ '$\bLW*3b2ߺŝ]grGi^@g65g/Pi_'_yzPD$_ ?/)}}7olqOyK/_ۤ_o?4|_o~9>/O/Mn~/Joz>?|ǟ?o~۟/ϧ;?~uo'|߅7}[#y~+4`H??w?=xw?`sF_~?˿__޳ɏg6WyK<۟旿x< pK~w}7_~?<. ˣ黟 ~WCӃ7on_W0ɷ,lo~? y.1~;{富'w?rV?~_-d7~?}Gw?}?\ﰲ?=9$BelJ2e]ѿ͏??pnDmϘڈwZ-=;8Ll]i+^ۅ`-?#'P[~C9Z>nߏ~u-M!Syrj)M9ZYM^xs7Mԣcn#1wWҭrt8Ujb3ENp_17ꢹ5IO#ê0.qvvF7?}͏<t_~o},7?pv~Ϳϟ?}˟._wEn؎? 3훿}+Ç?'tpJ `ਝ'MFNɩf=ӽ} U"|Ed47o(&G`K@4hNp0:Ljf(GX@E~4kv磀q 9Ph1"a NS(Z/DdϩQX'gz6ipԿخ`rAJ9P6KTXEKIX!A-LpDħ"МOU( 9P3#>a8q8$rs# fÀ'1GU63ZwhNeCC%·_(˅CN)"<ޒC2"ځ u1B61k(ѯc/dBį^5v32HX:yu! $l CEfLZ, *by Ghk%)SvHW8+9QR'e\9a^%g\5ȡ!S %P.}0"a?R(͠Ol1 P#!N-=\cИ%""&Jk0 |tp clwߏΡh]՗^Dd M2U&& [MU,M$X]pıim ,-G P1!;%lrqؔZ/ס1 ķ0lq![dxsAr!F,ڙt<2o,O [,wAm?hez!olP^-khk} a+֭7BUX3[h@#0bZMq%fZ眏9 0sEC`KN@blw~L aŽ>;>hi١-^h\ '$؀@~R XܞA1;E; dF s8ҁYkuXWT=vPkQp`YJڨFonlgcUҩUt*%(ށtt ] =b[TMk0s-7CY$Z4`5hX}N'Ͱ3'B# M4Ė:M-_ Pep)j H_,d|Hک QJ]q?NS 嘇`h=he%0H/ʙ*kOLƻ mԿUJ"uRaYfOdC.r\bKykKߋ R0.V7"@tA?D|QHѿ#W~\JQ#(+01a8w8B_$C'$c9J_N&4G#4='(ietS5s4!KcŭoALm! hLeRʾ>3!ep*#-,++2bXyFVIv]#.yZpKe,Dԓ>,!Ϟ@l;9ڍ6 491+'̌`WlhϺ0u&IUAMO lFk~bNN];߈,Ņc\m^"am6v+]fA* ſV/Bj $|gG )vj^Zj}5֪,7^D@bX$i胋3цzĎEhCUW`+`?Ld&,l`r,ސ ]ZnחBLHmcJqt_M, )@F z.JrxālHD3Ye@чk(!42l3[#N6|~чZf!r4:; dڵV+*V_t@tŘ{bSo]dp!\ \.h¾$&#p+YUa0k+ۤ$2% W)`"3?ZdPXih׺M M0mRC4X.ۦ5߆nm-f e6u CcsTnN8XHx%ȕ551t]Km/×DS SZK4(L鬼vf+G[uw90ZRP}1Y穤GZ5Jod`D1fV$e ;;.n&)ǵEц.ȅ[6"^O6BjB..UUQC'Ni# EC^&F-,%pQ>gJCGL_VagE˨ \Ȧ5Qb69j5ı!M*P ]0_ڟKj#  )Q,QGZ؂ 2Iei]tbuEa_.m82p[_jÑS,!*4npZnTC65qh"UBxh` 7SMڽԢgI+$){: t$>憶͠a9X^x.ܲV}_f# {a6md"SG 9][֍.z>"줞jq3_c.{x,8`4Fvl mH& qRr3c=kcw[͞=c])1+;z^XR8YZ  ѣFBYNS5ef9IP?NꭄYq@wMq&n|`7!afШV+I/ f[FO8#p{^/1xFyERÙ 'YZ\|FնoRWD Sjib-7|ΉT-7,$>|A|{Ȇni2t`lrQuPnO?/JcRNc޶"܉]bH5$kҰ(ѿa=ؑbxn{XwŞ2}? 2C'+; KavبK*M nRe)P<rg3|ȹRaEG;;,$Elہ,.YVrdOZ5c%lCq){k!ۮe5hUL׻+'_[ HӺm@NA*7)Ho j1'ęy}!8Q{]I.[-y =}:nwۺ]<1X1l:yhɭDչѯqai64iSEmWP,CPYLQүbe"o<-iOPF|l`bK,S iJb'B99pbQ8z`tẇLSW&'Qк?iۿK>?+Z5c\ u><7儢;nq &/z穘EnhZ$6̼[sʪr)J-Yd_$ $E6}E.Dݙ#L-a»i{2EOCgۤ+9m_Nk\hé;Έ%3̽/( <`pY[5P=: C$1TchbNz"&.,fleZs: ʵGs:0|3"HX:fhrSA4f3a 98Ty_.ЍEoٝ5k;ⵢyɝFC= -XMWևB8+)g%.tFuܯ4BR(]a.4"%wUE NrĥEftHc S:29,`O g @#0!t%Qp8:u@[.y/U~ӈ/QwP* ,` C!d /e_hPJSU/f\l]"voaغ!bL:qc@Z?/u uޞ q{xXd(JckM0NQ*hLZqs~PӉl,N{,ہ6dn~H>ȚwC]"FI؃vlZ 6q3g":߬W>Z&NO`՘T&^8C!-n)+H 4w!7 bJ?do,h;"K?j{;}&W %1navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AG.svgz000066400000000000000000000011451221777731700221130ustar00rootroot00000000000000'zHcountry_AG.svgmo0_7RU% Jդ= nːĪO?; :u;w;%ov,/x&D](LwnͿΖ?wPX+WJ4@>' PTᎳr FN.|ŕ`{&T<نaơK,R96}r=4>(1Ak\)W 1m%l[GZ!C/ uAK5o,V9e"X@'>Ef'a돽Q5"7ib+ҺhѪFXEI5̶:)Ճ<:˟TEXz](PNtcf6bX{Q&T3&$E4Kvb 6κgz` W~l<8S9ԦzF90Mss.sZuzn6yF?9֥tfxnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AI.svgz000066400000000000000000000036401221777731700221170ustar00rootroot00000000000000'zHcountry_AI.svgWo7 a]qv4]/)!p[*b{]Hy͐zfWͲڴͰro7f؝/ze_5kMÛz;4_.M(UMޝ5/'x{ڴj՟.޿Gm^/[}vwx;Z6.0f8\//85fωZ?f a[Xkf|3w;nyq^m~n-,|,J)"na~ቲYm>oW+`Naqz;'[iL= OA}:ml.fmn~X׻a?n" M=?`7j^5J:y v|u6C)u !hS#WN)w9ig Fh.{SK( b'6%XMͼcs8F̦9u?kHw[.Țo:Gvx}mt2Y8pG=v:;s J h~r9֩`U6m>^yDrJԬաDeM^bu7]HAxu6Y!kqPrF 3R3 V9uS]Tr?&A +0.OŏxZ0IG>É1ٟ9IiƉC%ҕu)=N-܁\d!Y5ni9ٻ2*p`3=WNDy2.( ΌJP,Q.ê'l:s#+ktvN)DQ:@AGId7c,* 6]ʚ҂*C,UO3&1fc .9isd\@wɒ⒒0ή(qDbd?Q|I{AdJ]@*b Ќt5 Io"x䬀˘HmB 4aXσhhNP0 DRdzYCDUCDʒj% L<ʫ&"b!Es@ !O`PLb@St/'#l *pt0\_s` s]weJԁA-ʩl PS54jw;re"1Էw+"7IpLoW0~dk˺ߺ(1p`D  EoH BeGڥ!.$[ bUM\+##:19d FL<_ 5 H_ .k7Ӈ c/o9ff3>?)O7?=>|/}w͗O=~:m޽T_秧iplWϾ<|ymnW^=s>tL5ikc_}x||~S;iw6w__=՗'M/ǭ(X%Xbi([d1#6>4 |Calu\")YيɆ//e6_z^!I.-ԑAiTz\%̐ l&-jz$YƥY5gK &}\rKC,,duZZ[|pYjmti}uΛJl>|2g]/:oj åfmisñ髤 VScP "2mنJ9n?K?κвJXݥ) ν7]jvQ9..-Ϲn6{FnZ16~^vmx)2L6qehlmq&oN}-5z^B?gsG<3F,zj,՛m?VBV[)GjKZZck2ce56et8*Ҹ Pj?M&c-n^8'(y!' Nh3#kZc 5Ҕs1(3J! g}pf3JsE3ͦl #-Z8%%wbM-S)qle3)8poCVL,< !@ Scw6( #¤xR],q@KJa(),6<9N}ehq-"4T|rK9W@O#E4|v@.&3:Bfk" u,jا6`d1![2ZT6L ]m94ӒcWN.})>/&gKTSXk0#ٍ!.jͮڌu!o(N?jMK؍ĨM;Äq`悗2*R*x"B-o}R ڧȕl6+2 M81 pl!{,ݵMJr'δ)AICv̛(L{c .c,dd]6'8 ̸†s'qrHMxA&]3W #CYډn2͖uO q%{A, NiJ_X:Pgz/(JXzMT" mmiAv*v&g`?|&0QaK M4F`H"DFnf3ZN`ⰭdSlݶb*"8ݸM^Kƹi!-2de@ʤ&$Z'TQ+f# %4bҤ"YM{164]ZUD,Ⱦ$^e$%a^U0̟\WòKÕEnbۂz`>&|RC_:;ĘcDe=I^&t&q f3Y-f_cI6[5b3p Y5%7gPDjCA4gs@{1ng䫐T뢜EGB^`YF!v9њ{G'AwonM6YR`4k_e0B3T$a&TЬL. ma( 5 O4py?%N@y4UY ݂ ֞j6)A4Hg!(;(K8Ću9mG1 9Qx4eP;,gW_#a|ʉ)ճÖ2e6v0d|VH&b8o^Ak[kq޵|xO@T˵"ƈWbpq^]]ߩdV+!Zl[I.VӹpV=65Qd-[:cW/q~qrnj}Ԋ{egu{II}|`烕4uŪ#vۦEI7,SS$%`hݯkYƏ EW+e4JEJgEhLT*KHJ^}RY8IHX<%?4ԗuoL*3sY ٚlGhtv#y>i+عȽ׌]_Qn(kkKo\qE j.t#tju8m&,ow8?=JZb6PϕS䀸ZfvOJ uQ%*VN-WDGRVVkhS qYd[^+bܟ]s $T su`#:a > Iz|]4B=]uE,*lNt(c6s;U#dJI^բI:%q܏Vt㹓FjEExVk~EF2\ @4zV6eoao(d\/BeRcY4YB\7O&(B4uAִYâemOjg,H`RwaL\'n/uhJ*ΰn ?4VLCWZħ0b'ԧdM`ʫwlSdpVNb(NbZDyU1"*IB[ԨNqI5G~4uòxƆ|:n`KF۰nYrE=p ͦ iÌwK g9]yW"}Cm6kZ+ b+jLuW;%&GX#uc3yCsYkWlI R+!]qVV:ii{N,O CB~Q=j7 JjڇʚN59,{4Ro:g8Nb4%M,~SI{X麲8}1勆,gTFe~i $L(ܯ]`mG$\[˕P+f0ԐN6QO 됼 *`cazIwd*~C6]XzżDeQ]u=Eϓ*Gi1<%ɪt7V: zU9BHB}HFU+ˈj+ UB1dԜTnloo Z:LuiF>ʖ !_iTw2nJO|)(ac]x)ZQX%_%  (haEz 8q^%X*6^4/yl7vk*uAX j2΀tadVS0#]>K~ǢL"M2e% +|my?#HQW:|XsmT2Yǡh"Ozݒu4XSxswICo.] ɶ"Y:Y`y=*wC- JI vyeY; XUω~I#!F\I:iɐ̀1d=( fZWMuDĈP$+҂uْX1HjPܓH;fݏk5U)R34P+oP]Xj73.){1qyu+oe}`֏*l/YY-yE)p3i74Yg>ԴwdZ W MZm gOԞá&Q~uI4ڿ\O{qʹ),US[f~[%%#ŨiQUKU/d@(҈-TDWznyurzDMmQJwMk(b V^ty*f/yE 0#+,5"#) kM NGkiWȸ0 Z]C7d3{/߸!1&_ c:*BҶ]Fk};%lw9{Fo+2% r:^+E9?FrgMޱ+O~4|Tvv'fè8R}qꌦV?d*yUei-5/ܯqܺ gssRLx{ wLYC(ϓn69i>hDfvu6,[QNdџFCKkq+CSPT`K|eڙ i<="]YrݘKJ(qϫ7z^Tb= Srfzڹ!eˉ@o-fHS%i; 86(̌ɂ=xԍfw5aNO8%%3^sCi& JӲJ!"\E쇱S9o9^TEEt~EhLr)_+s'F5$DЇ~N+hQ-T{eM끆) vUSڨćI|g#Nb2ߘtFb~wjx.t/;navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AN.svgz000066400000000000000000000007561221777731700221310ustar00rootroot00000000000000"(zHcountry_AN.svgn0'f0Dm,E<`&^4>XQMG&ׅj}}ctw?Aw,ϱWRPTIUV&E98*ٿקafjU}ےpJ)TkY$dEZثNQ_)#-bEdGM.W,bHW eՁ]%"EZ,ĴYuhw g{Nu#E|SaӴ*kZ5^>u)P'\uf䆺9jsX\۪{[2s|EJyIw/x1$^9>&e E(&X$18ܧIdFaZ]t{lvto(2Uvnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AO.svgz000066400000000000000000000043301221777731700221220ustar00rootroot00000000000000'zHcountry_AO.svgY]s[ }e^r]b%n'3RIvF&=Եe{I]ROc5K. O{y3[]ϗn|qq4y\wgr1;-}Ov_?im2yѣe׽:Lnnn.W?N9xc xi7Vqsuis3.?_5_{)܌X 5 G{lNmf}s2Q1[~4rLnWp3vG ؄ew4n(OFiLg/UZˏ ]ʯVuVm6Zl 6'M=]!N$­Ly#Vgˣ˳n55{0&b,7*wW@ڋW3"{wHkVp\\wsXRbru eY/lڏ99 ;6mA0cr`"6?h`L ̫r=NvuBY"|B^BiN2 inSEH aV)l) \2h`n1Cs QM]j)-܀ z9L#-}>=#DE`i1#jc14& %ߦ"P&mBik5R$r/d:r>0OKޒZ-Auևfq-v*-#z zA@R`=gCCDeCq  zSl=U*֧Ir,1BTeNyZ&κ!x+}Vl69'> *%섯^wRM3$>Mz?G.y'.LmM'N.*VaNXS0. Hٴ: hE}Bǃrd\xbv(G0()*97d_ꑻv/$;DI G[s[2iʫN#s3E4"c WSy'ICa'0)/x8.RQ>Xޫ:gQ@VDȝt{`hE%,) $h?dMe%RShRInq'^ۘy:;u.7 ά_f!':CD`ȩLz9:zv8OJi%P6߲#|C^|q)y JXC@vlO9{}&?艢X7z*ثF_BjߎڥB[PޖZPIz%^ PmEapζTˠ+-oZC(XPBhk+q W8KBzC[P}lDȵsTBٗ{[p+v}EH%>vmxZՐR# t_,hŸ>OA)Jⅲh(ǑqZx#$+ۀWꃁ0u\L:qQA3Y\]><7Pv-be&Gy>>R7Gg_ Q{~pg,"4Eg6+B8۵O@G>|%:ˣ@Tէ#ߏzorٹ'ŴEgL x*+PAسc]([ˆ%KW?IXkgMi[ބ+Z 9"v%*n_`d93=|tڹ|60Z '?(o. ':rl-7f쀳|h;D?FH/â[kFmO%͎@Wj*X^-V۽`ܪk"]{ !MDpjockCT@C.7lmtxY_U@8:d$JqIkA9O?A#^kxHÒy?q -خ⩸~,78= liNW2navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AR.svgz000066400000000000000000000022221221777731700221230ustar00rootroot00000000000000'zHcountry_AR.svgV]oF|N~ŖE GrIZmiѧ(C $e>GR+xǽٹ٥=|/>oڢj^/j5~ OWn}yAgaxu{E7}"9aumpMvzR7Smż #BI9Yt )dvz"\ !]ʢvQiUvŢ[OFyZwSz_ R)(0֐JW]ѕ2[QfW]Qea.M>XLr{,r,[܁)ţq2_F>-8ۭn7YFSt`m|ukw /KN I |M @kF0/C\;}WU~ɪvY7ߧ^SwY=&7If @), ),&7H_FSp_Ɛƀ«d*fA7) J ޸h5L5G= Bc缮z 5h#q+dD*,=1ˠγnң9ڮR뢬 d;bUֻ#Z}cC%ў^Az`~{4/ AVA/6#VG}@|%&B_H*ѽ6dw^!fKGܵ,7\1?gӂ Fsaa|7"($G 'K DM GC~5 ~w sQm$Hkn׮%1ÿDv.:2 F 1>?orQ}wγ2_}scC?&FL navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AS.svgz000066400000000000000000000201131221777731700221230ustar00rootroot00000000000000'zHcountry_AS.svg]Ǒbn%y~?dɁ3N9s}2]jx\e寿߯g8<ntUW׫k^LJm_]酺jf{O:]5j{zmׯ|~om?vۯo?;5n@VMX.%@ 34`>ȿ{ý61_5j{{?z\6g/>9YM#iIFG>ig`aF\7`][xɋp%N=Iqyň;\\i FtƯU-E0v;)B%+J荼C-\[[$Fh3Y1,Y gZ&xO#᭦xYPzpCBG7I7BJJf?$b)yU&p|uFbm<^#Ur 7IalαmKl+%ăTxwRcb  3#"f1E)p)4A-fqXp5KA>h؈9DL9Љ'>#llm5>CtTX.xG;ƍ 1ɸ$2懶H,t3𕠘ƔDy"DČ3aD6Rin=N/h[,$19$Q*B"~<.ܷ E<&@B)a։:3=4$oRY3H5e !o@p`-:oHq̴ίOh {^`IIc>91 UinAudܼlZ Iw@``z2rPƞbT bPQI*'υ ),`YiXUQ9YFɋS"-kDaFD, "j;t.OpGw L vDv+&qfhԲ.iN + ͬQ(ɩ$ZOnIjTZ xVNZj+jy@e1p^r+1L{2@&<ç=,"+XA1G"Al`IFK x-4Gl2ڬO/^?n̓Y96;./~n{7ޮ^~wYv߯>ڭc)`")oM qha:NC#A\ Ef|1nC]1~gYdebepmB`iA"Ze5lY+gKH0qIod~@6,LH'j k(HkCR!'j$kB nTTWާ\3" ]1isM&rb2UNC䚴oD*j "&m92o"REhEGf0=:'k;n= ,WCBw㛴yZDZu4սzA6DI1p;YyzTOͭ~9@OǙ9<Z7#=9"#$YasrCFE#t3GsǧLQmoT@o W]1/mJ؁ -B%V&4l[YgOHu;Hp`{R|f/]gu*ǓS}ٯM$>h=xW)S\Mtby' 6$PRN{$Ŋ:H`pEEډ4ĊK)qOБ$ӡóa bv&;܁ 2tt8K4[# ѵTbpK|#ʙ\Av Ȟ;:PVT0%0 PfW%Uw*g~ngxYN6}= /-.2 ItjdO:{| -/{޹_N l{%$eWt٪"9LX`ea(?R&xkg%S"\]VNK&p#9#*Ma,Q2Q<~@q{HӬ>%\Ņ3$vc_x6a 2Vs@~FIgL`ъKM04n49F8R`آ0$)J!F/7P0keG`Yv r%}-DT?F1o3CNBhF-%[ \<k|G)J2ɒPe 3,&?\%krH0m76_,RUf@υ{MɫNdQ>KG1'$=N||n 0d$Tqjh捨 cQ.W LF:cw.7=#ZxװNVEOPX}VzE뒯rvDt V{Wer銨%Vž]bBie;1Suk( ` vAba%,cCIJgQr%EY=zɍ`eRb*.wiH78T ؜P@>+9yk*1dmDCLU=F4* c' BywX: dN ;q2>cdIA;۟ %/Ҍ/Eِof.dHOIT&0ֽP!\A%gݘUd$_<˝{$qZ| y_DHf=%yDK^% O=QΒs5V; a pe}\/Wr.}9ӎɆLrְSSo[p%𴻭@Cw6|"e%.auzoXM*.q׍dnwRe΋ڒX! 0IN\sg]u;bJz1VN!As tzڏ o_=sh繕TP !}zW@f=ZvsjHTK !,udou/7B1'պSՋ2RKS Xnp3B"Ҋ 2RUr YHģ =k-ɑOWjKvQ],PT\S ,Bd1RJ_>J!e'umr$Ke0(C"YW။6㾕#,LHJ/Uoa_-N7OXgd-F)@i%(g!A?^;g/AO(!쫞B>,~roۏ𽀝$X>3p'> fv$ޙ妜/gsVR<ĺcVGT|y嚓r64бBu]PlcDl[rx7S{^mtL0ίXB8KdH)лC)J rRdMUVf/}wpg x]N1w!?I}Sx,zt23a89YɤY{4?秚g'rO FF?53NAmm ԎRT'Z0y{nym<:&Z)U7+x b>K=I{4=ᢧG橃 j}Gl'+_ EZJxњ>z%ߚZ(_o'BDQw3IBh&9?HowN8uD6.?C!Cğqqi=5XD I s*ܙ@IbB҆Yjgf>s/ߗWo;L'簳 vy~BSV(<%alXtTR;df;.r7h%꺛FI.r0XgzH9NdO h.|ȮCR=U!P-8{j@|j8W6Y}BdRZ#l/ ݼ"0Ċd$L|\c䛗TbYH'K-kfČ^B M ]TFE2^.q}\ݭJݛ_LJ-x|z\_^ׇݻz/ooWϋ۾ӻ\]֏/O|~Jws^*4=Տ/ʨ0?7Un_7LJ_>նf[\F}ևm>C뿬o'`%oWCX>lݮW \v47w7߽b;WyXL~=߭x׻yǯ>>lׇ.3O^?lo g}:aCWSfuhs9Eq>3$>v^a>>hf3ÿz(ӷʚĿFX lub_/?;dt "S߉g-z.9BOܲgj{#bv'˖f}f0 @_> 1zݽo~W( 4?$VkRpz͐E@MEvRa/__ҩ#navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AT.svgz000066400000000000000000000004021221777731700221230ustar00rootroot00000000000000'zHcountry_AT.svg}AK@a:*t[0"H-5Xd!Jt߻+< {f|A[#0KA4]2ECgh,.gQWu é!Lv x~GTu{Ij 3ڔyI<S8NbOfkZ3?J7xDiZw 9_!пQ5 UhQXnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AU.svgz000066400000000000000000000026511221777731700221340ustar00rootroot00000000000000'zHcountry_AU.svgW]oX}^$?f܋EREոDKJ=:ҖRTiΙ9gdi|]3R.(Mv>G闺K}ˤ]/yv6O-B9h؄D@װb:&\/,Zp}pDΰ2N3^޲qX)X f BpD&g:Ɗlg%Z٠ґ#$8 M@A2ኊ9X \|dP۠'>bMu*_K &D<3+X;D ,HlY`N^ئ=&DMnmo5󭞤|{E -o+CFRdtAYvNWpփȠ] 0=PI@\ dYst+AXxZBCԑaprU ٠n@F~)Bvŀ^!(.8 Aeq^s ˕JYxbvb(&ˤP{s o|K(7-\gu4m;J@wc+OEOKOl6N|}0tӦjX>dIM nfmo~z:z&Lf|y:J˶'1kCOj'gOGAɋv1q݁ F!v8s/NO*0k!}1C~^Cx `4,orqCмy4T^Q`H#͘CqfUqqBCګSJAE2oQg0,7}4`[[FM!hWd,BBjYBzq yp*X&,TI"PҀ~CʼA 0P}u5LRiFphw=7yI^bQJ7 sm]Y7bM"aF QhLUG0mFuukj}֫⍛BG.u>20 T'(`!.ʵHtI#)k*@+Tc.E脩`&f&Ȱ=DF/;6C)85x@*JpH5b ֍+ KV(Ѫ)d|8\hfϏvYW ^L+Py* >LDjm8&Cڴ] Ua[[%:GUu5qy7~AQA"eJIU$b&z&0p]({䗯Zy"Uv MTGh7<m=LD|FH9R&b㓱.ZHPJBLG(0Yߌ)@ !VEVDhI8}_ġ=xonRNr#E2ŊKcR)J ᳔^= .dP)Pdр ݄ŌvEVDje(bnvCoif2n/* ߯<Znavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_AX.svgz000066400000000000000000000004771221777731700221430ustar00rootroot00000000000000'zHcountry_AX.svgJ0x^OҮ8dq!/KӦ6|2_dgC~p})aՍ@0̤F \-gBc#2@Sdx6/Sh6 ۛ1`)Mxx8 kחDmmTy 6D.@ZᣋL ĮY-\ˈ˷aq2|.get;(uZuY qt}VٮCJ^]_% y׆$o]9/~Z.a` ./Hv{FAۺ[a5R%|=G֣"0TE_b.C-K)'D"96",%V"lNxd9ڐSsK!wT5^M,fUX z{ڇ!O/m(c q-`6Ij]89hsmJdp v\# 90gaiՈ*Ҩ̭GŤUʂ{Zod0x  ɴw\APHP3He"PQ fN0'Q8N)gbsa\AHo!2p < )VBEKzHWsnƴRIk ַYm&7n9~48'B0BBN{^8=7a3m< =+navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BA.svgz000066400000000000000000000013041221777731700221030ustar00rootroot00000000000000'zHcountry_BA.svg՗n0wJ16? I&uw2ㆦOc0eJ|avpW23B1RռuL񷯟fUuR\lG2rj[m3V ֮m[wJRyl3l[5 )LhySJ`ý^)8Es[N\(,lN^k~RLEb;S 2&"@3բqI1vo[mQsM "6йxza3)nvegR%j:/k[TPBJ (߫J])(XLx2[uy1`>>lGqbYeػ$wN9l_,9~p{kY\,#FgFEqDML 4Z,'"$2R)!I$ zvг&EmR Kx=A'O?q"Ρ b'AH 8)8ޝj_QfLq@( ɚT􅕀B iDulӕ:M6;x Fvu\7.R_znavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BB.svgz000066400000000000000000000033201221777731700221040ustar00rootroot00000000000000'zHcountry_BB.svgX[۶~_*/-ENJ]o"@iq^,dȒ u~Ғ,_6gۦǹ|3rFySxOia3eZey.оvI%EU_Vw7wߘ3˻Tj}믻pۡGQZmB;/@}Zx6PoU*fcʮ "O;@imS&[ΧTv (BLCJ}%AپkcQuRs^$v ݦIm!%hT.|!.N2٘NRӎ.u7ngsRrcU"i}J<(:(CgLVt?>;SKW$j6iIV=K#F.ϺWgۇ2m Yv](m>-)7 ?,u[5IUl!9@Cϗ*L)$cV"k\Uԛ)PaJ (\/6m]^f.O@ 0V/Hy`%m@E7IG3BF^XT~%Y%s͙r%RnĿ<;`SH"F6K. s7Tm8B'R;mZ=;n&`mb=ZwKQ_]I&_,LR~YWhxlEU|4mCWy,1ig5vDEkӜXqvzzȓ{y4}c3yߛI讕e9=c~n\A "jc'w]7b4Mdel74Ug8ܜ0L&W,V)Eu0EvA?IM'YnxvW-p3}\L47} ߟrQ^OZMjT&~1uSeԾ%)+gs Soߓm']O6[5'mtl߬c[VW _Bo@Q[T}Lf[<ʲ!-'s bRw~F8%#')(D*EhL_#sVG+:CkyA ;~)8g=#q2caӳ(lói,G {0/ϘS{LRDHE\͘Jdr2c *4Sm,81!2VZ!s@H d;f}*fTp$1#£G|FD2H(ap'@J#,THCD)j)MtJI#$TQKCR0"( G3P MRR1 (YeqR: ʔvVJB"5pAF3eR ($E YdyE`OfTȹgr{Y$wXĤ} 4HG9|ѓұ& 9EֈkyHS\02 kqrx$H+nɵ u! R{ xB =pF atJp퉺5ÙOW_nCKEe>9Ǎ>x[;l7Xۀ0!3ҟC&& n5x,?[ vU#navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BD.svgz000066400000000000000000000004461221777731700221140ustar00rootroot00000000000000'zHcountry_BD.svgmPAN0WV3Dq*T`َc1M{ =y=;;3a|pV71̶A9qInS C^YW]ϰ"dIN)%?jƝn,]`d?.@"0r )xN[.Ua3D6شLk6y52F%sP%{q:@aL 7m"CɱOwn 0̧w{QEn|i#anavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BE.svgz000066400000000000000000000004601221777731700221110ustar00rootroot00000000000000'zHcountry_BE.svgm_K0G;\MZ!DnOR dacw=$? Tjg!([:m%p Z_XYg@p>ޞئ5(El2>Hifj|; P9affeY:季!n%؍,vRS}*9 FSr]2JjGkQ"dxӋ=s>cN~ŔL"aq1H+>4F˟T"T-XEZ)ehX6CM |k -'U(M-:FRʾJ;7>I's=~_WP'navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BG.svgz000066400000000000000000000005251221777731700221150ustar00rootroot00000000000000'zHcountry_BG.svgQO0IcӑE“1Q_|!um#]e-d)Xe9@:2 /cBgBU8 v+9<3$,eH[Cei.2]qt #JiF+W0&#=mE(-pciMtn2\JA&evÍ̖{l{.I 2x azb(ŬI.y[}ɑA{imJiɵ7rN`(?>h|20DN0 #t~!;Y?“gnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BH.svgz000066400000000000000000000005321221777731700221140ustar00rootroot00000000000000'zHcountry_BH.svg_O0I+  $&FIDu2+>؇nO=Sd,2㕒yRbnϫnͩaxGpEz-yBҘzJH۶A; .ViC8}DcAf2t3M#R%s%M&߽{`O+2SچC(sQ&؁xK^j.dK穁oӜ0\t'OV2C ΦVOũ-j%pjD Bl9<a9 u">W7j%/navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BI.svgz000066400000000000000000000011701221777731700221140ustar00rootroot00000000000000'zHcountry_BI.svgUMo@Wnɖť-HjH` Z6ɯ,`FJ.|0oogzVE]"r$RE! v}Cwnoܦ֧?db9d(̄󜜭[ #<>x>Srd̘uViSW, ζ{㜻D\iXmd2IV:Z#;$m^clƳ}k5eݨDԈTWFFh*\̇*yw c۷c xC1]k'Zm,=m㠪 ZTYCn 9kd10Gh;Ok_JUMOJD(_M/S:kf!ZJ.tܝ#?=N[y&8v^j]G):fynavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BL.svgz000066400000000000000000000004211221777731700221150ustar00rootroot00000000000000,(zHcountry_BL.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BM.svgz000066400000000000000000001105321221777731700221230ustar00rootroot00000000000000'zHcountry_BM.svgk]בF 6v0F`d0l&$_?k}^tj^D jկ?ן~7?^}շן7㗿o_}x?+~ٿw>_Ozޥ/^/>w?>3<_y/_yow_/>/__+|ͯ򧬋󋐾H闸݇WOw?M!/wU_Q.߆~o͇7ۼꇷ.ݫ߿}ëo޾>‹$~ןMc=7߿{<}_.?~5|֯?O߾xmi9Ŧӻ7~/3J{{?|ob a|Mop_Wo^}xśو-I ?OO ^}G}o|~&9]?/_?Bo2~7w_w%a|_,|w}N1yJ~w0o8N=Na|4ݷ~x//MW߾?"zoޑ}M_iT7>LGu5CՇ߼߾ {ywu)o^oo>};{N}Ӿ}o'w0vG-mn^}?@Ӽ~^S= ??o mW-Gn^_XJ^fTPvn+?𻵝YE+"ǚ_/2-lNE+u?^0.|g u,_vqx|?/Kd5ǁ^{3SՃ/HbﹾxoxB ^3u{_~4kV'||RyQzrwX25 [Tm!~u 8Eoyn f65O_}ۋF[Z6BQ?Y߾ÿ,K߽W>=d{yԳJHiEMֲpdXa-"}F'}3I::/}fSJƗqa4\?5"Z UE=g.Gȹ}4-zF,xJ{[EES1xi/p=eOT%ibְ[|w'Ϊ+5èC>Fp0+ ,ܻ[ecyE=8an"\0.5N{wmTx육+*)+#u_]l Y~F8Pp'´>#t<k=󭚾#͙t)&U}k3f.4a;]j㡇۵'ET]Zk2hMz/0\i.)ߗ~CĐi*R,nZ{z%?`KSI4b x_X_7N,6 a3⯛}.?Hb1r*H'%P9jehScF[lh XjΛ 3JrqS=WQ;a|0$ㄋ&CwsRt|h795eX8 `ScsiaW`I0) 8_8i7G<}"92A#)ITrQ4-``Sq2ᜂAȏq^_u>ʺ->-Cl18R:4<k n0Ik\3E)0ZkaE0YK&,Q"W']s'*7rf񾓧~ ޯfM>8pc<-58=`*fH/!GƆ2,t!!^6C+`QXH(@w2uH1F#RFl a\d*\5ÇgX@+ mђBefC"jrMtB؀}xl\{Wkc:.RYm~*Xdp׎ƒ&(Z38X˳)IW2TNg6#;>(b]9C1MF 0'znR`Lffd;C f609 3Fp*)'0}C@si۹IA-_54Drg&ǰ9N#i8bkDe^\ZkТٿMN&.+T776#VռH66iХiµ-NRbXRx'͌y_KGڇEZr:i'"~̔}enHF`^5e JZlEpsTIag,t \k .Y!s\M:EAuLdfGQum;^ƛAd:oH+ ml V<䆬ܙmV\a-؎U: &L] s#Rv"8 &Ov:]a^cC,^YudJaLGt_c G_Uac0;m?%yFq44c:{ΕN6 Mgn`cVG抆Aϓ9%f"iNBl/Բ)o* 9}>D4lJFI[5/wF3\iuX]:¿Zn-M. }Ȁ8V4wbZ u&0zdditaӱ&¤L,`K ET!&nWl"8A%8r`̬ L~J%- A;jA mJx^jR<Lw8*4S2sWXeFq'&;0D)νPSn*XLҾmҎ 0Ttfh;n'j'Ga@Ao* ^ye~'#céHο .S+Qvʂ$),fM/Í&abd,8|H1pL Ϟ8n[&@:? c8|ZcGJMwWءt|񆱑}>Y;%J7%8n@xDC38Hc$RrF.Wnݴ <0ȍ>_ A)V]a5ђ8Z"%0()"+uāvo<;[_>6 ugŸAEm G6CL.5Xܠ0,t AQɗ N]Reo>㙹1~mmmp}t%cn\0Ic?HǴ!)|/h^0X]3N521qf,LB%o)ֳVCU__A 5 u[LcN+P XH[9ӵx^'\3$}X_Ӛ qN"줃h&`gxeI4NؗDlPkhU`g)M<,݆7%zWjnG)eC%OW(X3jf2Fߓ+s. 6i] WwbbA ~d=0ӊ2ђKD(BdP.XDcfͥ~X8`u&!BvIURH8WUolp+fDC2zASDsX5;$+HYϛ0Pba/% ?bMHRRGW'3Sd>O T6VHMcT| ɏ#<7>ܹMLK~_jWckOuMl&q&:l ௛$ H{@ +ɴo+\'ƆXDInzfX#NRgê;XKc˰Pg)<3" 4ȮRjbp4*{qŲY\ tA^՛UY(HiŨW4g(٢s:- - P2ǿ1Vw4%r)+ 뷌d'ԙC nA]neHd7ݙAP$cb]]ͪ:K;6+ -QݦMSXCVXOs-xĐh8\j"T++Iˬ T (vj86VfΒ8VnX:;0StJ8_ɴ }C)U!)GxWl/33+?YV|WGhP0Qnǔa7Z > k1|ilҗ҃iȗNhx4OA9h;c9 v1\A8?|>V.L6 _)툮RJf=3(qy0g#i%&va&ZL haΖYlt[g)76I |fh\VLVq=b¨AIG%tI ,NU\%,uUauV-t XĒ@2]oѰ-\]u+=:`$~5X8J3{B#obyU Fjͳ,=U9Y24ͪ1V`'x&DCuvC nab'۱Lҋ0M:teG^ cC Ul}H$[^#^47Y/RHX+Tx<*ÕD "3`~I⚸H<$vwN7{;kZf! wj`іe>QA ܨEoyOPU.S CXJ 6՘aֽe-]6˶<]L*xvVJ(ZvꏈCQKLbʢō>qKE<,Tj0ʤr֤b6E*d G}^ ۑ.Xp:4=Ҭzt*׳N:O[&Zrc9?}zTJAVHS_؛Lf̏9xN 9MhF+k,˨}UmkVL)i A8$N|9K\ey]`QPǐ Vr9*pbL' Up2leUAIke CE]C`db<bhR.excKl_> G(8 3,4BnQ!}ara#J"J5cQe,6 EUX%4/6=]' Ust 6"X+3sX8gQK:zpiʮIUV;aeUw s|cxwh++iU<˚bL\i7G91ݒr(@ntvܒw`cN2J+$avYPː} W7|DczijFt"aC&m4 -đYJmwct ]R枴9.TIv%ET&^7$&cZ;8! ;lX9kG"Fq}f 3c0andM‘ӆkUMAW+j$[r?  6ѴC"sMb>(}/yl{#a r{&^f'rc'ۛ->/\YGN.ued'*, ߔ,](˄k ђ$Lұ:$dE%ZPcDN`٣lKcmN0MV|LYQtXUBLpWFC>KU-8X%tZ*.*^yf. ,7kyv5hU:IIxaLM:Ss)ȣtA[DEa839EfcӉښ%$[/R-'+O -cU! тwWsUMBHYєqfNŔ8?TVaS ==ֳaV?fMaО d9 xQIFr93: V50l1#aYq (${LcXrPn(\c6bdELo+'B ϙK6X%OLK\JH38,Z4E|EH0UF>됃 NȗW ϳNif]IH<KmNa?0CVe+.°tS=i}?b3+`SP(6r2 .MYðmděTk+=4/O(o51F ;1j$\`ت+mۜ<߀4{VF\-̻yJ(byX[; rP8j1aZӂI-[![*D:8[Nڭ>hҮT҆" w!%9"C d?1y$b!'aBL*2Br-;Ajt$q->H0qi&QO#\؝ڏZR7: (78مKm~94F")qU$g1ВI fZR8}ьHAo]_KI}heYY,ĽZ 2fYwM[/߁|ɍ%05˒`\ތpޜ8 <ժ!#z9jdXKPN)CR$G%^CۼN7Vn@biYqdd ]ņcǁQ;7iQDcu4i&BͤW_7cՆ"ljcjY櫝d$Nc9_MYa3β V4g0I-"+}k> ^]DJ3LSpmuҭ;N,::P>5#դ%޵Ğ 6zWF%*<N>T0V۫鵊f;V/^)~QL9 UT]bv 6{p^gq'=2{i_ !N%1MA]?˦-'_.S}cʞu6KNSlt&#&g!iMULCkZK 8I)㪷7i,{>͐'rI>!u o5A Lk4t߈4ԦB(u&G}Tpɬm]1Yf?i7֟uرiX>EQr6SɎ~UTyHN֧ţ';{l5i{',&g?Em ^I=9%-/R]}Y|8U<ǵ^]#v1x0a^ӎJE׳v~"{h"!{>*3$%;OJLM.*q"=<7`18ZV0㇇dJ@ĩ4aE`N GTFgsXu.%/(u0oY5R? UgvR!<-0;!'/!CXJ1㮩R=Τ[(ֹzyRO`m6[ WD)ca9Q/%;VlM&Alܔ=9ڑl5  t! #eŖ*I+ɡlOl`r)ummabl*>ikYZ9GKTKrVăzvZ<:.T& {\M 6Ҽ wbp"9LE2<ϙgM_#r=$WR NlnG M BCy:;&sZde%/ޣ2Adx"zRf?LwqI`i_SNqJSueLDrL[-/_Ԋ/ܖ6YgUċedP:`aggZ WNGYϣLٵ#(mv1}&rK*P$v[4"i`1my{)zV[[8@]IWv9_+@"ET0Q19 95o ]%U)ٔ`WxV=lKE:iV887S,A ǓI)s9,e ,JY;e Gi5SVL-,{Hkf Ah5-=ޫ6s3:7scH]|k> ]\By:Yk?{w{1o):朆Sb=Ue<٥Ϥ;JADq]ALE 3H";c7Ym;Ow)LZt6a%mun˔wc6|2vJrSɡ$AʹaS:4 j$#4㤷?$e .Mh! =#j4s$w?2i 'k6N.Ă>Ɂ؞ut~X.C'%9H`]!c mЉ/UW Rj^; oVM:e`9.ҫ Ή:LO9 ʧ܀M?,Ee$N\"6+Rmъ^9̍bqX\F׃=) pN9jOu١` 9^H X/j2S6RlxƖGEg!y2q D)#RU/[4F% ՉQ#cXw)Bϴce4^a}ȱx<Kt~8[G,Qŋ)s$_B\&`n=*D mrMgeeAHjOJ{j$rTK9SϗbyQlP|W+A`;?;\?fZNkR?NVJ˹[s|ic8=^,o60Hm~@;ɬ;, )Ik{ga? ۧSZ,pwHef? y7~7+>J,OIw.:uR(ϝC3͇ؐ͏JK\oh:sms`/g$迣g'qA[ x1vtjw_$ݎHq^=-v0'O̧f?v-o [o~Dtǰ.jj\X(&i])cb$ Rk]L'|JG,șd +P e8ȟrmP,$/n T JL2z%(SM]o,cOdhY˜ݢe9p5{0Iq|N[RDIsfl.$ƀPܑ41*RLLIQ !1`0 =Xhg,YfP#26;aHdNz/1&򝇞Z!Bǀ,XsiUmM)č3t0C];l 5B*{ In! TfZӆ"O*V!Tk՚̔J_\@Ő!{)/Ǫ8GixSw+F"QGYoR sr3OQe7.ng8 o Y3i>6 Ř2F1amd4oi{DN ml[cb+,3𺃧wxSJ36QS]䭨"RU K Y,zIؘb-[u`WmEݪ:"%)*ſn4dWZ a$vI[.6\,M b`5 n4uW:'f5k5zz[)1pkI5e]NR[ =ht)˽[`9}um`ڀ?0,(,(Hi4{C,\o]f F893Y˺;%מ$ NӾ[ VFVp]QCTh@ s~d/qVLZv<4gZ`sF}hUߡґJyTtP_Czi-"U+TσN=L4>et@T]&Y`I^iÂ]yӴp66~'%%<dgfp7E"~Vfib,+ÂAj$uXsOpZH˹ +|4Pk ɤi:cB7(U58)h1&)r"3b`9se 1qRN.3I+ܠ~gBNeu/yN}ntGNA|͙ۤa73f?:С錧2ΰpgE'X|$ZG*KO$"+X3S\R~?\7*2n7Jd)xŦX O۵1@_ e8 ԋľЄUJR* R'y\_cPNTɊȣ^y͂.ՋN Ea69yxBGbw#1 Ȣc)F; ~6%\ jDRϋ]ॏ fگegXk{xB1US{QJh}T_b!4(Qmښaf񃱜+vƔO-VdJJrxFs!/eei!id׀2qȌϰ{a .}kTT7Y w6QE<݀M ߓ@'[ RN^zPͽ$\"֋xFfm^@}l<3ى`.S8v¤c-O˪0^M/^6'AfF/-1z+C oGYD %/}ll!Y.Ǝdr:g?4u4ggp޺Urf`/YOBPxHK$qu1%W+\Eqy,jⶉS{RW[F/}}o^.< c>m^,4NjչJz w`0 d jRƗEʞ60lLdcXMN,%Fe 2mɃ9õCc2'43BZ7cVyݱHeb&&10{Nfn"V/![ݜZ2+M29HU&9YTK}eY֝QshN/6yeb E#F :EwF;C^^A rX=zpu[w l cUMwY^2m&`ÈPNB5WR\`P3t<' + j6/RfSY Ul FM j``62U?CUڃ=5EJ+&,S=ms㠜]hƉT* .ېkX-o Ҹ2]\z=GL+8;pT-r0i7n%KpNS"w8qEBVdvx_U؈mA4KO|xsDbih fheCC4U"_8DBR d(8‰n.*J^`b7\l+܂@ -n 3'<Ec0c%4Rd4S5H5D f|'I _3-9;JI2mYlZ&jqk)h&{-#8M룩# zu98N{ H;^w/ϺRZ }f4I-Zd{孔U3\UYt_ZglvuyG7VZ$ީp_^C^uh. O I$_JtpIVfqRz?8%HVRO-nߘ#aeNi{S<_Oƚ$%ʖ-jD-&qˉU@x.j`1[f $|eza|:EW*Run#o[:aX{ Bs56dR+%4 %m4 [)q$wd+d%GHJE@eOxP9EL`0ov>츅x#ߌ5HaCq]tQո(@(x5&$#xUbhH.^ܴcN" [ &R)e%nҏ ^HaL4"]'J`a{tՙ)qXgjK94,;ĕ+uaB㲤0ꚛf:,!` )ɬڧzuw2Ӷzc^#l\?3Oң{0ռ -Ӷ>68IbN`X" [UtVdU}'&{)ieJNo%Y"Nf83VTŊ#Ȃ z#Q Y.H$$f֓9[k`)/a.MP29 C81ļ`>T/J,:X-gIWUx$r$j $5jW5>3L5"&+檩8*iEjY'ocN!vo$eVpK̋B3$t]guAޟvV d܊=`'pUN,1P&- 2؎WXm: &VިsOyTC>E>Ga+#i{ajL\maeDwhBi0Nѿȸ˖%VOۮFIfd[7RRi 1Q(cOdE'),@J,Ue#8l+b(i]3OR_[mKYJ]o:>f ^7|OmȜ7C g^6Q'Q&8ECJEc! - ssLUl(r4:3\ɳ%ؚX*s:xhj+b3$ =ޓ5_Xmban0;nes<7!|!3)h ՉfL*teLpTTd:Z L85})iV34f4'#saz 3e&)el0Nyc*9 AEAL~g]+ ְ{aU܈HX"R<+&WRi PN^_rw,I{Yd@l5B_Gf<վU]K1S!2FaAZ C~GR"<_racmVTCfg8%8%%r7`od_wIR kU6 K 3 0.k Q, n҅o4VVE\CDy4]( t awS"Xcmas('l^: ;T;.Ȳ83UO;5H#@)J/ὶUOF^,(دZ^f=˪Ƅ #rݣC \+/CxE3®Vڪsi ZW :6B*̼{7gFq 7b j!؝N5de2w*ʈvj#t\y{kp=B,7nqnb)tu- {\E/TW̰QwNbt1q+4' rwLQS;xJ[KeJ2a*T7+ |LXV^gKZKN z'}u2_J$Fy_B:v^]U"&mbKjiDZ|So>\K#dvAX)}&FR@[Y-mGݵi"93l|+FYgLxIS9.ˇimiH#{.Xjf]ZeoN, (_ğոa6;:czK:Ŧ4;؉1k("<×6\zsG>ӫjANL_wX>fYExͰMпyON@QأP~BGlۏ^e s$ 1_n&ͶpzQ8M,qkVRhdң-K' oֲdcS3:l*pOb7qXoE1%ԛ9MER'{_IJЗ]/9 >2O?xٟ%ٜ7WD Zdc71l8-vN*s*A`l䭘Ts]N^v307ޟtַхaͫ'Hi`G g\*U X[pFNKdUSl 7ՒdKvx/GǠ]f>nՄ'=cYo7~Ĩ޾m?ip,*ӭdE$ i(J86OUUz\ITAq.n;/\A"Y#ϵ6o4A09>n4UK6yκI#տƒN䭶cfMɜYh kMv86.a)@)|ΑJaw%̾:T[>꒕-,(@x{|";qJq)a^.*%Sn 0| }~3t|Vʚ| p;`I֛6㈭0[9]Va VS\׷VZn(2VD>5yߪʫa5xcSQXyH͑1Nj +:4Y^BT}i3X~|Fx^.UIjҫy1Jj6b1E5 T<jbJA mUȀr'neni)XAW`/rʓ[MQW;8 ~':ؼ肉'hBW۶/M1AE(P)*ٽǣJ9Z}j)a-VOxqbBtFYuB!'*YL)Mg],#/>,E66D5ؒLifG"lǭK6a{z~$1>HarI1ђ!7#1CWo_LEuN,Jު{&[ld4۲fxLJOtx|UAp 4(L‡ $]7?>>_"D;j4#ͳ3ygFQs}sљç8:%qC=BaQn4ۅᠪ5͚~vO^80-~|`'90=d̻lQ&'R5',f %cV|sRn&~kWHT!ApMX8,d 4ڧ"<*mD'°o=6Gq#lu*HH; ):񅻈j^ըvh"zpZtOe 0~2YZ;:ì-3G7#Î#i"y]82 Ip_1,|j2BokӅF髴 'Ji#Crn֒7U#EtUEi 0b56}QaVY bSjFXg >` =,i͊ ykr4c1>IbJ%Pue4< ڝ%U8yn.X`Z5BRghΫ3oiR뉱PV5/%saQd9Ff:|y1ELjF Wyn;Y%=P Yj]Y6\kdZV5JǺhC )NVL1D ϊ軪ԴHg;IjΥ䏐LLĚ1u*qd-ݫ;TxDžITaDmћ_W$L\3y* ?k0l(Qkխ^gkV؍pP܋úvk@b gTgIvx0N sg0|"_ڒ [4mJ#&,(HI+d xv6䲆9dSz2H:;J*)[PՕ,m8Ǣ5e/[xS*l٣T}ՓJҺa=js> H_:Uv 7e80[f>'I7 G#wJ|zfU!9d5"A yŪx 䤱]DYp)euP6eS۠U >\K)cmo>d>'ohht2yfS&%es( rNrjY[k؜JbRc\BzJs68W np2T/GR6t6;D?'زe$ٚ V #V [ZHzݚ7rhy'8h\;tC&,ᙩ#+,=gq5E1N~{~mCl~B3z/N.ށCo>~7pMjЃit&3NN@߇%kv3noI5\ZMushj$bhtc^fM~Me)BtSG֖}ծ{a1,K.5%KSPxGLW5qBGu[Y-TY*\ nœ[1Ͼ @f?HUZG363[t{fvZȦw? `&ًª|(z)a3:V$q䬇Kc|{\ Y$'h 0a^y6fZ%-ٲ@UUU|3|2P?зΜaHaI!hw>&P ŧj&D˵f] 8:[f/}6K 1r@7ZdvMoZH"jF9/m7Mrb_7x>X %RO t/K_M*Kη|Go'EHݦjê٥ѱ-S9Rr -kqI6T;?Yy1Fh/K#I4dF}H)Bؤ}lWc֞u1FΓ ,-e"ݢtX%`P[7c3u= qMկa ;[s8JX-HjXm~(\6+׉ZyPlJ\Ia_Hb8;4ŶIWVhyR cBAJ|/O v-psכ1{Z}#]aŤ>^]m^bٶS4hlތٳ Z1P|ߤO2$={DMtE2X#bj.eg"iT~zߛQK:j$i\i-x+$p7cVu̘YS1{J!g_[IZRҷ%q#]{3jIGmu/jS6TEr1ֻ&?]|76uԊ }ոP;A.lג.X.RJo8jYreܻ٥-(=H)Pz7Ā uNP bQT\ڑ<XS7ؤ7VtШp/х-HI);]o=됉ۭ_?S1h=Ԥ0E]X*s76u6ݸ(Bl8=z7p㐕CF>LotVyvN>'Ke$S oYπ߮g'a(ֻh 7C'\p0 %W1%k|cVin0ڵ4XVw7g@'@m6qL'Nc yE+YrQ/ #6 &$Zt7X+x/tWfèԟÖ-q ,ö`%Ւڈ Q82I$/T&^BnYeȫ)$U(XjMN*GyFVT+f,ejq,O}R79_>@֠0~c) ϯ0IhͤMʆ6?TzxۛA{ay&RI8TZ]l<`ƱajvEwy{%{ӌ^^ MXe84fckoƲ=3-yYjg);Ƈm8 o{3hJ?qXj䨛i{,:;>GK?ACfyA[L?ofҳfko[Σ͋-Hmo<렱'Ni ؤӹ.b7Ǝ:{${cNͥi7cٞwƩ:VtKhO6cT~jEJaRDԱ'Hr1ؼبX+ x:SCw1gÜf2edgM`׾j&JF,+sKIjO/Z)} Ih/zۗ>9Uvf5y #/l9ݖnj|DH)df՚;_=X;fX+JVPz~x?M ϻC!Cg:#-6~3-(jûs`gZV) /%0lT>,fUXoe,&TGJs,;{%{yʧ+AvOϻ3 I+G:R.gO4ux 1V Uu]=dG)t!;/jM[{dB2:[3l@Os}kp;H v}v3yWZ;t#- +āsɳa gKEqތ;)6j1vgaoV-խ8`ŜK/}7vْL| eek ^ e^R C8Ɋb \5ͤCAӈ[7#Į:ej6|9'y|YfuPFުi7cYw`#~=l`j"Es=Gk݌d{Uɞ 0Jqx/ٷ"|Y7C9wQz+a3fV#^ +;{R vAO{XIհ kl8=l}ĴK7Kg3ٗگ$#^%w3- "?KӅLlVrΉ7pfYEڗScӋdںH'>e̴#\KĶ Qyc#d(T걠h16u9^5[雷n8|HIt5fIs4ENdJgb j\mkOOˏX2\I4ӨՋg>a0ocmŘw[wβ}m 9+s# L0hB}]D Ǚ?18$l9w JwKC/)'(Jg!k\miقo6绑#T<ݓAU5F='izp$475HhVfoze뿺q2ܫ4ra $5L)EH)}v.ZtղF6O+JM zyö69`,X݄ 2LxYoo1q3b7i[cCߜٟx:8;#5Öb)QU_J)99cN뙣t)]V^\BfoT͍28Mwp?٭WA:d4ִf*=xW1ca`+Sd5"~-ku:]KnogoRm*38icHǐ)n$KN0ښ܋P3^Ud'iĄq9"FqA qr7fT MWnk% ahv>@\MWy#XCr䬍 SF2֛7g $Ej0Ega3Uk.%Kt5&':G7[{#z& k$(. i'6 .Fc^"k܄력 #Ĩںo{@ʁ-pXPxU6ss}I3FP8+[;ln2="r䥤pZWj)9$#%m7ir2hHن.Z&ev|u73GHŒcG՝}.ZQl˗ͥYgnFjdU::* |d|Y`HAz> Y3^f(YSD'2d_ +mn >qi:vܺPW3x뻇'=bϻ㱴 +H0xu6׶-5PΨ7V:by] rH7;MVeZ%#%E Xf ,d֐=6aj"kLByEhK _GMm)8H@vߛQkϻtI$|Wb=蟥a}l;lCbk_o{3hO|0PVX갇i@Z)n9w}U.7}w<$BThWFg`!]eۯO܄9LN'ʾ}ϛYxڣj 9x/uUG)̧rq3>J"6c~juߛ|'u.J`Ya@U0_]JDv#l` P3=b>~H8I]Ź#o(J]SD_~BVvAhffc- )*Oqk,:H3QYjKjZrU`aYlHf8 Thhm_v\2SLyߧa>ZnfnHyFd8o#@g3Y̤}L?7~45[/2{e{ EE~C|h7Pfp߼Ky?}_g f_C (_}cJ6^٥LTa߸Hle>Xd${/75ƫ~:+ؚ0z;L1@Z5z/E}b0ͺ~`%VJ64p8j^RR%藀lHI#^X%8o2_:u;2;p*ņN i/ 'ffA~6D򄌔e#DZ?ؖ_} 1ql#u;0,yrqY/X&ty5cKo20Oױ_ljv?f\ӕ$١/ =E I`+Bv[IsOL8~>__2-kCaMsccCP4558!pEaʘ^M7C[ԓ(b{P'ukPIFx8&xXֲO'ׯx=navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BN.svgz000066400000000000000000000304171221777731700221270ustar00rootroot00000000000000'zHcountry_BN.svg[ksu__ 8J)W9ש|٪-Ei}ιw0WQ[b>On'M\^ƜM|X_߿/|rfζn&v9]͖|׉Lifշ|vN~v_^\<>>6˾Yo/t_L&.W [_]vgOOwͦ?,^e^w9FwWهU Tg?neaQ0mVM.1ճ^~6o]_f&6Ҽi7Wgi/@q YJ qG˯߮" 5n뷳nϛ }UϛH/og߬bj=zOP7I/L ak|xyngvAʁ] 9[a~-\oٻyz~_nevy`O.?uηO=a_̮׳n9{y7NxX-߬f$殽{n#;80=QwnV8| /=MY.g-lD y|?bٯOtv~L<\7hCw~s1af˻uKϰw@P>޷/F޹d1[rW_]u?)Rhv|ݮDChQ-_Ԝrxv&t?|k7Ü&qdnY{n7͐3//vN@Z{ZЕ5?㯏bxޓSfFXr8"a8}l7AzC]n\W[J>kX쩛aPUO\a34vlyDx 8rklm{Zk7?BJW]&]Z0fi7Ksv}Yw3lf(c G=nA~=+gۛVo@o߷b=ǿ0><,vRx1qi~_x%oՇA%daena}.ͿR]'{V]0b,XMOoK4V{AK2&\M.ġbm/0|8EO5ӃFAyߘcqڭcF[~^ZX^eW8|z*伩 ;T+QS%ipI{:}?`(<{۸\<&Rov@8=E7-)y7O7?8=HǚT zBS&کqLcM`^6 Әh!NcMrCfu (puLjLX7ٲm!fdp: p&`e=F3?  +8R*lL:n6XWQZ9e1khsؐ ecDZ}c=DXTObJж~!5ocoEtT,1lSc Xb +h-#X}(Ygɀ~1*"\Ex"7%et R!!sJB1F=Dc! d1 @dXiDf& [z0Z~]O"M,9$`a̍&+%ր=bTj(*hݏ"wDKXE[ "MCs/LJ'"ĊQ [%qq0H#DHj ~7bbMŃ- F9L-kkUa{,;-$bN :z 暟F > `(kO$F8$e {gta8%\ &6RFb{F\܉A0a(p^pe>CmրDc˞b;s4I;*,rnGgpІ/QlnyNCl"T]rMF8 IV\;D$TJ!z\4?ݕ+:$K5oÎh%1)j)M`M8À6)aXמL‰#M )\1 d ̀ޤ|[zNډ#c\8l +{p ?HbXir%Q-)a ,rJc ,wrIԱcP`]ރ`{DI6Q@?(q`զ㣣B$Eq>-߶ zl(!±PvDG+đgni|!IЊpeX B-ܾ4@ 4Ơ!F 1a-A!"C4ry'?G@(1B$gk2ŠeaM1Iӄh1,0|ɊGrZ ƒP0H=,+ G40f)ܔ6s:Ū6-L$MCX(, Xeց4qCeH$]wB$P$tAgA}eA=!Er{!:k.fP FT&Ty*pAXk-n A~t2&PfNqtL ER7J˲+$#O)DtV2 HE9p N,dfX*sJӀ=d{0mx`"4NvDFH۹oc # AgK41JPh"] ?IkNb`x+; ІgbRBL TqGU#!O(պ5*9*8FCS0(@iQaѓ ?(6 .\?1&MFaI~hjF6H1=!Wr{JNMLRXFZG !iƧ\$ B89Qz0( ,V8JiBHQ!7,Wr6X:-ILf͊FTj ? Qa!3b˾j;.> 휥ΪIÒ ۑ,,xȌĪf fjRG b, 2=R# ̚ p}V(!'b`QZVc=% ɲ$Z;(>;*oYȖHy#j1pI4kD)wEU vF&FĢAa)yڬ HC]kⒼL0=OZGA菴_*qGz(Rk)I9.JR8B^$ 𺄅QBH$"B3 Ud +"zb2Od#"yZ@] Tl +^aG̈jEiU+oת*@,U$D+˒.!U2{έu\,ҮRҦZ y&Xz&B+s,'Т3gYjhN֫.j3dFj{j9N? %3 m1 rMݴ8-c 32FGaȐX22z1꣺Th/ 3p4yCU o|h`n-i!@nd&fr+s{$+2;$:*f <|\bv@Г;b΋G%~G^zo?'G|a;K,ä=Eʥ Y RN] F.>U%c7#W"$/W0d_fyL^dG ZȄsF7Nh4RST VUqS`:0}FH% g@܍mR9bqɘ2)SQ Ē53\e6Za꜓\[*xGթ;ԱBbB-we+Df|5mGG[Vѝ6VT.`Fo9R@kUl5JqxjٸR12 JgV•"dWffgۋ 6*yg%dj_3VC-粜Z׻7\=7X 7i om;$vJ>U:pA#Ԭ t ړ=&P-S|&,˨8AmxB]Unxb"8Ƚ@_t+4d6ȂQ׊L&FI/9B^`19{DBA\K#!@dv0(VG'BUk7uIbYrwr-)6FWEmgJe F{`iUU٩| F3 . B9WIi䅓n!Ò֫/cFڴJ$F+c\|VIkaIy#o<Pi`9" N|oŐ+ܸ M=-F 0J颗=bbvD J5~BsnAھDž># Rea,ӝ S-b[HrhVDQUzܗȣ${?%z`q+-ji+ L\(&)h2}8TK%]-Ƈ g]IFUqLicyb^L&Bqzu)<򹔦&j%`W ėn)yqǙ1{p&SEêen}-AibGkK.ka0sq#DRf}ħ%vPWCVF a(d?RZūCls5GK!&>ĒrV"z| B˓#y)%?Pw3ī\ZrW3hPV%eyq(/R9r>C =*\̸NtỨ4q, H_$!Fyl"н<gX %%l]WK.&Ru"v/bgPc_ $y_O 3s0y]qj 2ď[HU 88Bz%^|dpw=@bS[Kˬ|z9b<E~RQ?HPՀ I!(u[V6s ͒$n~YzKMo mYUҌtu=SjmFd )~a+}lyϵǂ%?ߘ[p Z*]?i5:MxBmroc=bi}<Wn5?_/GRh8\3 QJ|R%!M e )!#8ڎu(e 1ӂ\UAIa2q- 鼃K.+l*%,dRŭ](/TSVJ&]RLPG 9)e?\)S۩K\CkyGrm:@?CzSfZ^R2.mK6aRɓF&(v܄nԇΕ.i ]J C޴O b:ѐݦ5&Ş;̡w?(N\~z`[;@XtŕՂ_9GL 5-^aw~V$^^|db$ z.cEأvc'5͚ܴ xž-.}db|~$cBbHP|q+8q67Ue*)?qtV<`I F_ qbL@Bȟ*=u&G1 77y'5G[yS,.l="@T|S+0xqIgBvA૧J&H-s[ם}uRܐWxU'4 p_m⾊V<*_XȄb*qa/CJ1c#/8Y.w`guc~=DizjPzLWDGehw  2P5?]Hel aZ[Zًy|v@ZO܌ +-XB"]bVA)XFv+4U%XD1!V90iSH(2@ACqf 4" D.Ү_P1EBJseDg*MDtsjZjGfήgMalcNUDbMY# {DPa}~rܝ>(565{ ҿ9 ܔ97kЧ%t}2ĦEM6%+T+|wZ \U2|ǰ,cEri.@tyd 6I1|~ !(cٗcbiYKD>AY0c<*> 8n[a*ח.WV ,@laƌٲڬr XEW r PXw'Q p ˕:b @s)3 UWo CGO+`0DFQHMrUD[Ih$nw/9[@gyvskLn`:1II!8eLkKZ`8. -d3 ۄU=P](az@r(aURC4"'RMCj{8Dj=D3 rɘqT1Pv%09u+?6 s^:Ά~Mq{]IXl(*~ +dn'X#4麛14jsr?ߊhC3_Lw鮿)uϾswh @ɢ}A>h67q:< 9qW E@JWG zPKt:2Z﬛PtLziH/]My֟H]l5\VZ`8A6@hY̫Z q?-.$ x 9A+|'+J9=`xF%Y}I{)JiL m=JWe/wƅ)̍Bq{ _)S6|g03A#Ih+JuGׅaT[J6JZoLA܀}R"G4%O^>tk0 K^*J)|*ӭw508 9NwZc]LJ$mQ|KBENղs =?&->\@^EaYj B=z], R^G8kB21'  lj\USJB*[YEM$rj#^ShƬs;Ě ?:QSf}(5+D9f[͎a|u@*rJ^ m%,tsRE2^:UX0AFc)3(œE+Oh{$L90ό D] .Puo 1^\ GhDE Q[?G8?)Hyp*3]UjV]#M|g)Sk*wq[DŽ}4ƚW&d)2iՎ=yNh)Xj}I8تr_kS` *-vgQ#<2t ӈ0 J!gӵRǎW aM)nmޅV /*6*Ez3R8:1FbPN^S01߆ c0]) !!mq61_A M黋-X?i8(+`!kCWv;j ruC;sC:ʼ^p*f;&!Ρ2Oppv5_P 䃀jpW^e#Axk%izQ_@CQӢf?w(Qv];է,BԄSQQ]*>ڕ[e+hm$NKE8)vQxO ؑ.y41ʢӝ}",f B:#K,0$83 -ԺM] EnwK1?iZ&"i Z%:2b*NBỴRp^(av"~>F[Mq^E~wJ%*,fz!eȄm*<گ*x1ę JR!~ubh4["!a/uT`]1u6oʡ,~k4yky(@t`EKEpJw!%sr;Hu"j:zHeaJx,HgJ 0E˝Ѽs!S8mAԮ~ fջR@(F[T'mpȅewxrS=h-uo.8}A[*`%߳E1[[$b7Dky%A>}LCmοrJDJdCx H_\,GyvJ*冐 ŊV`(m2圥QJu `"R%Gٸ)IaCL 9>zF}I{1gi%!ZJS"o\$Z} P&qz(R(vtR)V"X#?g(v)B;u-SETN*zRD Y_Q6-LնQk> *؆SMj@ZPCV0!;f˕J^p\~)8⸝hHATpKͯ&-w5ˣ<]T`۔[J:ƅ;AXe(x (E86vÐGR|.0O%,/-Z5lU<ȠXFo' <nkTq0 W8yp\DE;Z?[?yS.p".i?P䠭(㙼N}nji6t;CKNmLt0t &g™DnՇzۧd<R*[+*vkX&S5cK\)msLٌ(h]x܉bEJͭ7e嫌])Y濇 mےLng|V?>uP?>ם>*gs>[C)=6p﫝~Յ22gO鬈nB7vq~$3@7Mi0~1[.Av/\Qf*LPr0C7t狎ߧmQ^;'ò4 \ cLnۍv`#o5 5w}<żY*`? Ay\\.i-Un 3*ֿڐKY7@mS$*g%X5*h!'$Xϗ*xD_9K6RѰKT‹~+vD@PGhPW1F0Eٶh(8K5u Rn%m"$O;I8뇳SX35 %ޔgԂo }! UBѓ*EݤDJ0㯭ģ#\qvV^|mDP$SrOgY)h8r(Bh\HGb* 7,H. 5vsj;:=| 'J^ t]HHFkБYbdɄ(bxdkPۚdP)y I{M] }(776MBg-E@2wʢ *+,Vs#uKCu:aC.\ ^v'FFɪ}mU#I޺ $(?y@嘤Fr7p3 w3Dlf,sZ9-4w?ƣi" E9쮴X%wAP>fseu2%e& 8Fi_ 37ƇT-\J[z7[{SmJ=:cA5k xj'VBNufNP} V}}Оes|}પɹs$J)\q1U2r2bj wJgu$ D$X;;>G2#?Gc8oKȖgu)s9óYM?=g~x߾/o=navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BO.svgz000066400000000000000000000015201221777731700221210ustar00rootroot00000000000000'zHcountry_BO.svgT]6} WXlN2q0B:Qǖ'{xa9HoEBeV)xRRGx2%XDiyؙeV"uˆm[4}d,{󕹛bsqcHJ ha$T/e܊`J?n0Vq>gaWSg9Sx2DͅYBDޠZG@pŖZN-&r#(;TY(HV|uF=&NgfpR X©Zwٕg@8<_Y:h|Z_mӻ: /̬̄)1`h>!s=kQf /2T8ɳO`&$FS J:J ֪g#"^'li #:IJ>TcRPj0jT"Q fARU⼊˺ ȓ zUq> ͊4୨ʞ %]ʢ6u% |g@S&mEjHWkmuq^D8VB9< :N]rNmOt|;em$Fi e#Koe'1YR$rL夘X[Q8`tpq*z[ha%zAZ24$>pK r!&NBS*%K_ G@W4c0R]ͼ@;Z"<`Hja~|,]o⺟Uqo&p~[+\u~yxt}32mhT/u> PrvfPV)iݡ[GVzNչE[=88sۺ"ގ(WZ-P'DE.{:{dI|ۏt~{E5/,ӭ}QKek zLp{7{T/2cpm˰>Y&Rn_vހ=Ӭ_1ek:NFi(z\ rP{6<Ƞ^ 3"|)6#qo%K\ߊW<{<sbsm@o-^gsr簌U)w]pZ1™lY_.L[.;u+xqY ˔qVwE#LM`FַDMFg@L_Sol1Nt)}z摧?2?AOg_9Lsm 4t 8K s+e闽1navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BS.svgz000066400000000000000000000006241221777731700221310ustar00rootroot00000000000000'zHcountry_BS.svg]O0z ۺ( MLLN@2e+ $zӜ=}6g8l3cQ %#⻔X%B#Je3%1"Rż7qx*kL:)c#ܥZrEkX{8f_`eɌŅjPRiϩQD i#STGdQ"B)27j઴n[^nz-gLqWsIHAwGK P7S[:*G7epR%ɴԅ fک2??tF&$b˝֗ާmƢsOp6 7{_navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BT.svgz000066400000000000000000000603021221777731700221310ustar00rootroot00000000000000'zHcountry_BT.svg[][Ǒ}ϯ ],ukqH1v< !5HJ{/9$.b"BWUWW.ݏ'zu3Nau3_yQnZ׫t߼~d2zqw3}}qح7Wr^_M?/tvqsaww=7?wu+'W"/n๡✻·}_z |cۻevjzWC[ :NŵWr;.a??,vn9#-n7SXu}<~8#T$r|h=L]vP?-ܽ{~m?-//w|7RS.So懞vY_/w8K\^^?l\jӨQ<ŧ^ t3Rjo+e{z bŠ`Q3=z1wMCP0f܌чzs3*ٟ>?ӽP39SXy~l/?-7=kr|ݯIJ-}? Ͽl֟ZLFM<7~,~F7Nc]=`¶w<ߵCңO7X?ya{`?'n&,/7rOcPp[nrB&& ?+!pNDI%^CÖvjK9m~RznoߔrO$rp\$dqB~N_LLJ7OCI?e^ ]lOk/*e +.C"`@kW5ϴt.;GgZc2hEE:wN߫hV}"3?_&Dc$r^T6Kt)hFRXAj)^>]L)_ۄ!sē5/- 'LuBjG\\fzuqF3{ɩd`t&e=Y⒐(]~7YB'ВQ#D,PFa@$+D!w'K^\(`k⥎tu%pY $h.% %]='.dKUm.ѷ#+%Gkb8 Wy Bj!^3YrN3) H`v0E2KKbd$RMFG\hpط'k^\-pap36WRM,*` Y`nQ  iߟ6pJԌ,;M97f+ Zmk$βtqyfrFz>^]ԅQΒF;*lM +jQ*(ݣF*VK$ ]({͇;;K% JْaYCluX3F)MuqisZ}J,~CȻ6N 5rZ6ТDx*6 ͭdS 56s.00T|O Z<ɞ..)}=PF:\߾Ň(55 2^ӠUx ͂.=Yx#pfʢvpC^+PPk9ؔ 6ol)7YCQsfMq3@H צ0*B 1 f ; [GsDnO({N+`nS/^ Kl 7tdw#D:,xe,EJO_ͪ8Wh8v#>1(hĠ6 _ruX"Wm|ÃjߞsX[v 18+@"5qʤDդkq.CS_X9GPUpQ!XUEBǫ^\gyS@hIVI%.j>8q!1Ș]ŒٙrzɢY[^ዃ7[gSd)*3'nL 7 l[* 6h | 6>#r57TKZ 3;lG>s1WYgQ-c΄V {kGhx /fRYhH7h2:W3Mho 2dK vp9&"59jLf`HnA_El/׼$cos$Zkc9?)٠b~gp7vMzG,ʒ!,_/.80{l`I ]<)nV4X4!'0 RM o F.YË]\Q\gAq_qqTߌ`h k1 !Y ; dAICuut0KI9%XQ4Ǜ\:fA|U`2s8r&@G Џd_D$_#'k\|Z;9MCd*SkI"DqufVeEd(OF U1B "{ɜ;6:T;PtyƼX=9'T- ~ϟȌXmWL'R@labJ#8cth*:P `%fup ph`86GZz .2Iq$͌33frfNH8 pPJ(&l ҷ-!p5vrY' 'AX<#sVZ-6g_ڒpGa CKX&j _5PSeG')O9P|pQb 4z0c8%u52Cg fR{|[|C Z@Br-Je F$[n3wk+Kkc8R.)B90N2jVφlJ("ᦫLE-j=3Q^(lfR`+®εDu)@$I_C7DF g~.VҖ % Ķ4L@f,t߅k2v",^ eavnG j0AMx̅AMtaț8hWy|uVO" Q\$%$J/]z@'7H/0ǜߞzqY|-b'ɢ( #V6 M1JUZ`3nfd4!-pۓU/.@{Y쑙 ,4x߰qx?fh1\DJB6&N3_,1)49LϤzdђD9ְrj@- NFjL&5D!A5ƘIJ:8Ѕ*%njߞ,zqQQRg=j" S)xDsIBf>v-iSfhS7@{g4"4T%Xn5=Cw Ke.L?Lh!,4,z 6:romXYh|peMOkmMyOvtq9g2@ve0P:MJRBdnl:j)Wөk"pqGƔH4(ɗ$Kb|D dr5X ]&`B"-CEZ\m?>9HVPaS`B0>e&n~HSH!}`Mcam 4'ZQtO]jz^-)1 lk/`E뀘T+l3y[90,{q%d-={(:[WHh M$>(0 eDhwXQQ-VDK#y+*+X co{i"HS[+=ܥaM?WV2 qP)JAZa gJn2)ĄGe &,8b1o||sQ4' 걔K+鲷 FSrF{$UӁ#i_\3H's k/٠aeJHZZTA:@Ⱦ}V#Gdh)!>1F'$^؟-ɵ-xO2*uJZ B6OShr9վ{W|FQ5Ps_30cL. }.3 XiRyA P ,6C:q(dh J倄`h1 P@s@g2l@ k%Z^" {k '#SK=YL1O2cg|ɪFGVG0 V4(5NʤhK1 8@[M3<ҦW? @b~K; B y_ͪ|sZz skchBaHW*aZB,rd-W* %'Sg~[2h P#1}AU;&5KGC")ofa,1 (jⲨjWHZW L+GmW,M,6Q gI; &2jϔkt_¯jFs:clHd3UwJ؛M*i`b{[h@󁤝TIc_Z_igگ0434 P VMăXQi|l12c6K|8|QNLY lѵ#ګ 2٤v=_O.I/|!6XDرȠN4z W7kJA\qܙb`EocƗ~״?~@jil'BQ6;)!2y|ϕF((M~ -ؽdkiHY%U`sWפVm" !"|kc]xL m֨cwu@9p>9^@`@\2vHt9{ň#TPYYڦZW]|ERxR:B(@N90!Jjf6 uߑT&WXUJT!"VH[~z.)"#\\mZ&vCȢ%0 \UP҇[ݩА.ܸX93\ϊHs1Bd?1/C*d3fM "٘c = . 94OU#Y3eLCM6Kq:a'7w{X?k6IZSLg_}ѱԂz?ki{7˵`\k C֯LbZCVBIM}R?'OgQ&ȵ\=5 (HZpMժ̵ؔOiFg1IPn}B l aY+sOҘھf/M_ԇ*]vuae5% w#hfgneL6CS<(d]˝Gq6$A\ (RSϓft+Z8*^9cx 55EG >ߟUŐGlh̫EwDZN9E?җGZ$~ߑKf?3VzTeΒo:OA~{S,1 k׵Y.O`F0 7^ol(q?OP2?"EfZ0wa{G#KJySj!үe Vڍ8(R՝ uίD2\W`lzhIZDҏ6xqE>Z" ZS4({d9m _aF.dBx*XhPUAD²;!tlT +EJuxx^RcRʄn uJA[Dm^C2)R`k>&#|d;CDarA8&b<J<Ok`.PU!,5B5K0IA+ͤ%Vma ^ @,됳f#VrYXYd7ڴ^H _\+G @%M%W>u>sZxKGf~İogw\H\ ϨfJ2BwR-h2P϶f؈~VN/<ɶloY 'ʦ*+Y_08VJ߈PzH:H]9XY8\otRKKvNqв @ +(-N\m[Zv':ʹrhТz((X|(^&"Χ.L3;l❓0Ǫ2Tfq `xp̨v4HKq!ϯc5H "Z:"aU:㯬ؓVRjV|HTOfa!~"jθC{;(y`IE{D_檑 ZT6f:N^FT@F'?b'oqu>G}Wl8JܹZ[مj$1=ZʯLMn??wlgj_ܦUT#OT7 睊NЕxaduũfإI/3 .H )BA% |t6$Ak oqOPST063!@[}XAT@<9X$b X_(5Z/AgXd` ~բf]);.^ OucR0gQLtn\2 1sSwH5)\j )0+sRfWgtm/61Tun `TqRB.fw?Q&|jIJ@9U<*qL[>`<BaNX ТQܷ>79oQr=' gg#jhg2JnԿ @em$<#yeX 'lӨEd\hfG{Lj Ûbc0O3R=yipZ9uQDjTMbng<.D{Vr0JomU/*z޺&o8y>QߘmjY;g .3L7'~ d9/):eeuE~)n78w`Zv4da%ȦR|T&RtE3>C0NRULQD__? 8=zݨ ҊvR;"8nf55)Iuk\Ww9PTbS+e7!:DM4E_v?ܥe1᠌TKNNl&Im [A3.jJr? * FAWrofqz{JCBx.v֣uuJ|ZաCb=Wu>T6EmUPPvzYx+~ҡWjވΛ=jIj|N: &Ⱥ3BFnJ9~6}X:'@F 9l9Óh(XkSHQ>-} P@UmhKԤX\߿rb"jcXdwuOԥYyDz0Kagb6b}oHFj وc<ۇb=}$,E)u}聘-逢}`jp mC⤪n/Պ/.Z[fuH!IVRfYH %DK5;rrʡf\8XIPWMc|j> N+|}Sw,3`"JBiί2%"@]Z5+JN[,e dLs bc?>*NWE8P` G2\U`sLv, $mo{ZD0Ğ:PP1U-v{"4w* VH++Rj|1g|͵MO%c|Gp6ԍCh/VQ)v_[w|<"58WOs;VU`,l=7_#T4pkb/|89hUIB_wGvTwDpG#!~3C{%!jY )H1^=s {08PU B!~`MFO<;EQM;cxSmN!;d곟^1WE'U[غ64ۨ<4%訹H WE8s5W}ˤNv: ru>]in;N3MRNj+WE8ʍcӧ+D"k8v'dd[jl cKj cjNW(:0{;+ ] b$)SllΔV#JRK⯪gH)ěo%vRD3e9ͨ"ӅhG3 V{x +WuQH'E0]Z^9n޻lЫxu+^p.pcbu2Gq[V{Df.cdE]Qj}vSNnY{c|EpW[e~t=Ze;xt[, j9nKPib̟Xru2*8uv^U 5^o_5J BvU Orn$~I͸a:dF 0? iWLĠ0f}9{+3Q nUM<4L" qJ$Jqr|讫w%x>ɰȘ;h J-D";] 1Y4žQKWgxXX^IXϫ"N2LLy^FïoPnֱԫA9Ci'O)$腚kZ[Jp8Ȱy$N8ufW C"Y WAӂZxkB) B? 7CSJwU5[8>O섔74+I~Sڀi|jOV[:u_tlw=`+Ѐ!oe oR;a76 $a&qj+T`W3k+>Ç0_ȮniՃ4"腭"8{WOsFIҞT)~#Jki6MN@yND_wZݐAɷ0WE';DP\IUrDKWd~X: *Y}6NPr lrlal퀶p+ztqfnc~ H|Ւ:IX pζsEeWgl F Sx \|# O:DW0`t?,D4+fxLHq{JW K<ʩ,j)xXa{ggQw*KΞW%h'C+'`xsq~36otnM NFw;g44}7yNW=*QjM( blE 6LX{럃V|xTWHzXt6yy]D3wCv)U n"r; A^t)WU4U Ƶ$-a`D{n9ʪE"$Bҕ)-G"Ykt]Ǎu0vY{b& dAY/ݜ{<ާΩ7jRBZtU#?* L!XtZޯl8.D9-8Ya^nh :$5ԫS1;̜O0b\{k*A8&J\rnЀ,hRŇSO|٢8qE;$ |e <3c^P^tK{ ]S<Pc?DXMJ.i(Wh2R[ 8HunW63ӕ]r;:$;ڻB۽w[gC\dKZ';ëae$H)5lXE2_ȍguŝ">xT)dOw|pJ]"Eis(B|SaF)A*WtPP3.8t^xeiZ]|UvR=}4uSa2/mRt=xṢl;da&BA&d}*|xjVuBԿx10j+:UV[Q'Y^s'yrNM}0jtue_iJO Zy(f*vBw=H;JTy`qϊ{RtUW_> w d"źlf1YUD:Bpjr^+񈲏BAhz:f?כHZ~j"AM:'q8Ma=S6-cm\MS7d +$ k^yy+!*@; m%p ۚ'WzgIڒD @jc,E!&70y8\_VUG:@ƌHtV4tk'<.yGTmLW sFpx.5 smqݵg3Zon*]r୪?Iآ~J>ƮV")v$6uњC2>:Μfř8O}G 7ڻ~tFrq&b$L!7EٜW R]!Z o밦_mT ۢS)j?Ou!]IW( :YI r&Y~-k]Qٓ܌ h~!诒bC6(Mos>4l`C^r*)vb٪ c 5q,F>Xz^.p\S{%m\p؏!ks\ŵp:Z 9Ш1DqG6 _5]v@P$ڱ NfU}ʚp:MpMW"[[LsҰ1[3(hV*CaRVE)CkˉX0?cPA 1(3+, Tż9l,92l`Vk7`,+dٮ63\ S6kmߨPLQ[p1;Q>5^Cy:u%ơg8"y${3+.Nj^$`j/>cD(HQd2#iV ^Ozv!?Ϛ\Y}8T`d)jO~Qn5]6M^nS댎(P z5՝hz0M75fho"۶.;Ǔ uil&[qw)R Ue?FbWDfz; RNE$1īu{v%}ձ9[ .vʓ.U i.'Zᬤ'·D1eV[cf ]s[}Zeӥ,{zWt8h]R-4/0HDExv&8ݸ3V=\ ]fsPIt T+A"Uײ]]+b@+GwQ0e߯34_`. òđKwZ^ZpN )@WooߡCYi񨠋54=__?ӇT]ډ ࠉ˞s ÷7Y7^^Cȕ4e(3'*$֩VD#=U?YUibS,<9G%ҧ}fNluL]'B%_jf_Z欄Ғa)Uү.L[awj6"D4&?_Qq>TjGb)QID[OZ7ArUd?ϑ^<ɦ>X؋r\3J _?p)NedxD/&@6=xnU(W@~܄oHD!9UKoԫrҒ:F"X'Rɱo#Y5Y= }MͨIƄoP X[(t"Jnhjcv4(Ui-oVn5ۛ,1${'CT&Ld6T¨m+Q}Vku}'h%]43~(U 2  hDFݼOW]rmPgjUX5[߳O^63MNoJXiU|MQEIzF5 YN.RJIn8FŮcX bkJȺL鈃_,o=` ,iA& OܵLJrR9"l>3;,V#EH5s)q` ]}xW%xb<_`w9aMB66aRf$(scI2WPf7ϳz…"-;}K+C7#R߻HU!S2Ґ׍ԝR\nw3J`F.Ԭ cCn 2-v*]/l Dk)#¾b nvG(y ֝Vb27%Mz.1 +tUay| ,k9=\~Ԭ_ͳ &n„ TX`Q>b&}\v*dZd7ً֏>1dV>*@=GLy_t9 q_wΑm# j>窺DSeneTTK0W-s!Rvx| F@S(!N7r&]VyAɦ%TW_"5E0_Vr4LHδ`l9ޢQ3']t ZGɢDjbGrW%-Wl&[%NðAXi] fom{6@*Cc5 GkkB񽦫cK1FPEPi12K>]-^T+uȢdʡs(=gƘ٦C}v_i/({9Mw6mk=:9a]mWE8678 5!';`;|TV_P"5<g9;X0S#L>`O߀J.I^dyb "P {he C{5^Y-<"cj8leM"xDIy6nB*Koo"CL- Ti*PDq#v9]eвk"YQ**kr<%PiBӾabf4u`{2>>E8}icHnQ^AvQػ:ei|@UzlWcՅ_5Z5Yt&Hԛ,(S~5Atϊ)P Ngwc2 iuFfNŖ1z(:4 {:bJfx)RucCuS75]%U6Wi wY.*zvb{W%|eWf/7 '׾sWWQ<^̺w`7sNβ}$ۯJ~$s\!E&)|H *kW= 0%AQ'+4TοW,VZNtnPΌ#p$ASJI7`RiF9.=7moᭇk8F?ߣ7P"CcH0k%^ڦ] MUɴyc6-ݺhƩ8]W%8Y ै+n. 㴙-|3"bֻ!C9,o1V}zǝW@BzM;˒`b,aQIo 9d>rմ;t1 -qzCt$-lJPNf٧yKXĽn9WP5y''S"|ѧFCܫL̬8c=G$s UySCOOmBHЊUcl G__^x_-ꩇN:E>ѡVG.o7`gC{0Gnmksy{?05 pHo0?-ZŻpeWx<#m>YdҗQl5÷4<1zeՒ%F)"d.Y:Bfudj&BJTQbΛMHk69i^i+VX+ab dO".n.\gvcceʜ= =Ī2VCouàf|}>!v:3Ynb,7ucu`G!RU`j"õ]ayӥi5!Ѡ7a4[K*BGXf9kMU WE8].k(C]4_ sF Ƕ*^RC#V@` ]..ڔvOft/\ 75g5à+ۈi" V+duH@l깦FKҖG(]媍7l]AHzӸA; 6bWNӵM>xQ.g*7wZV[+5L827{c'MB0+8F@x{ļ뿽=_|o-M'YL#mM_rÄ]az|(=vW V: Aq@eWvo$_O.İ&Zaf;`a  2,8ds1.-3=DW n~0/.|!ЍZ5Q!%Tߙ[_Bȩ U;L}2hiYAS}} OP?Tgء܅0RI& &-;z]#O/404;DB!j N]}P{.tB̨/b\.;n UB gծeMe"O!.jn. 2U )ckݟp3>cP "٫rtc9ȥJՓIR럸/x: X9~1Uo24ı婵|9[qߠ_tzΰZ(LLoл/\vH>B3\;Y@] Wf]ؠ>"$zArO*9"S[7奭1+qMpDq"#3[.CE߳MĔb8OvUGp)6Zv?BȞ*ufA퉌]Sr2t3 1TfW/^L(NwUF{ |x+6h@BeQ ٚAMMR̲&r{r:6Mi@r4q\+NWM~ 1Mf~pGQ#thoF{Wu\n\X+?G Qkyz0 [76^+n*DN[@BO$ @ IxMM@z)6)*^r\㹩 sp-jx8&LcM%B)HQcM\`r("{ݬTZBkTeN;rCz~ݯ m! $CTKF)V5f 85GXMC1b9CUHcMC2F2/&<>%*m`Ƌ2E NPv6j@w$U|؍*m"a$cи03j9{ok1h2H YZ78Ng^ |У~p֫Fi)oJIwdAUs{@\?9 hUk مܐ<mTtf(ɛ1*DUoI-5"~7?V| ,_3_ -xTK/&Nҏ"jAE!:"#Mvx3|LJCCf"\~EEA9cyl({NPOvxR; bPUYQV.%DWPrI?L%kj_Z 0lV ꍗV̅os4nurKEx1Y+|Zn66'4osyO!8#a,4p&y҆H~#SV.oPA h_s<:oۉ$Q }5'4't^.2s#pj4O<'|`h7qiV=JцI=Қ4)?_z] Y&Z">}Psxi6s%qâ $8q_`*8 l~SЦ~-% ҺvoD! 5$~G{rZIgYrN%%+ɠ=ϵ=X7Ohφ$ ؼ :4R9_iv%r^G/0$-ub cr0;r'dY%*jSg%zKT4o0˪e,NSYF "WsyjY>~8)Ŋ;7RehEzU\dU? \Ht df#9XCzi: UR=&Yͪ,*b~v}N {.0|Ĝ^֧p~uR$b;aķg8PuiU) ߊ rphDBYzv)lFA.ƀ͙1ݲgv[_<Y7;=P0F`|]01$|ׯ,ʠCfA m|pC #.8-Sr/*8s}_e*u2r4`w8Tk~jPHeYrUe ov0xH>N0^p( :Uguꪓ{]Q=EwTLOS}//+)Y B`8kO{nԪwg]-M4t 6ߦR SV& 뤐}Beo昼@?Zϫ]h&R&Ea 1mSEa%kJR KܨK-.^rIp2uqz+>)$dٺSN6ږLN#ԐeE)U=bμM[}^Lb"ʶѤY¶5"xDfhI U\[6mZ+ܴWZҏhEKu 7g  Y_C)8I==F*Ss|B9*O). Iy천g^"N*rц9 )w-Vf{hGtzjntQ|϶dg Rg@0%- l"{cou_Jީmx1*Ƿ\޲n2v׿AF(\8@izN$NJp$f`rvUE(ܛE㲲\=FLǣrTſܺ * uʺT-k yiF׋RG?h k$w|, J͔ Vл9C~Jek)yu\ɫ6N-J\^ʿk5,&wJ_N͎7[ 'Sho5uZٮܷ(G\~q芠2gevEկf`afs ['ۂ=&\VL`f`=( h[sZ%PxY$FoX FS&߫xoEQMUFRKFNoBoe]& *aAx jUĭAH`$X܈f~NXܷ~CvrZl\n,5+-Z^UUT+Rbxb{mTsA@S<9\ՕC |h6?D,Y]ºɍ~}z6D~m XY^l;t'#T~ߤ>?_3wkC navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BV.svgz000066400000000000000000000004321221777731700221310ustar00rootroot00000000000000'zHcountry_BV.svgJ0xE)t`; :p*^&i5M\7dU;I:߽d+{;Á4U'9;5KXWQ< ҳ>_nkz XiIXw@qns8 C8a׸M+>cC cX>G13 3%u8$~r'm\5?q@)ٱ6)8PFe}&t,3t*navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BW.svgz000066400000000000000000000004651221777731700221400ustar00rootroot00000000000000'zHcountry_BW.svgMK@ q<'*mA`UϼL4JdӪ} T Kho9GΉ6Xh 2&&U ddӎ$kӖ3bU+1!BօTy)ifu/p i/FT&0)g&aRmg $*V7NzZPZ4:2NwGS0"ꔢnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BY.svgz000066400000000000000000000042471221777731700221440ustar00rootroot00000000000000'zHcountry_BY.svgY[o6~ހMѼdÚ^\4 vv~$)eP\>2~kt.SFh4fww~8o,K^7>wwMfpmt5y?wݶy'{=5 j7z961]Y3VO#^3pˡ953`y)V)Z|9c>t1$L:bgذY6l ELTPq>TT%z{VB3)xeT'&fbɨ]InX4lcZ"62 yh9J«ºL& Z'U-#`[J()+#})3Y \-Y捎lddkS'R2WFR`Q\ Ek fB=olSރY 6 fCEYyf G]U$IxcQc2ra8l%xɺ0?Ɠ6)2W+ww2b;NȾ֋'zK,x@3'0Yi\?)O"G1fDTXr)4sZN@+6⫔i}JZm::pulOY5pZ%AyU1!-DBϬbGϙ:C̫ٱ^S.켷9\JB);c{Ϛ*5d)Y(bkP~&>WSk^PB)dɅ#ۼv`}Y64IaO!uD*D,!㶥Uƭ{QY?@C1d5# j宧q25QM}avGĈK8&UU|IcsvZ;F,dX7@9YLD PurET)-+[f^m!,ոoڮpc*R֊RHUH<תję$yj |\Mġ=5ZESt1bL9xF3 w0riepAwgdB<3$/ J6%MF㙩I'H7@VgʊO{X }1C 1JZBwgD7]Gi RUp_-!cvRMNd$INlrSg (|4"gއ-d!B҂G"\).E$+t9~ P5J@UW᨝_C(\XT;qZxT;\"ԈjLλ(SIk*'Rgh[ mrL=tI]/nYIߑƘ[1\tuJo(r.,m(HެG |)sq.d9T6+ ҝI&w_ \6gѸjx(#)+@N;3 O@-$C}UpNxTXqf *}ZJKD;,:=+cV+jVDH_|twz}պK+:̽azN6:⑃7|v< e倿1Ϳ*A'q GCQ h;}@>V(jdcis#WpzDh`gA*ʶ%ԜU<Dݡ}`Ѻ@%Y㹊E?oBKFB*cVf! n3mmttxﱐD,y~* :_?;7jnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_BZ.svgz000066400000000000000000002010731221777731700221410ustar00rootroot00000000000000'zHcountry_BZ.svg]ksƒ_Ԃ(b^r>]Yױ ! uT%eП.^ԪJq{+u0O{xJfU^ "+:B"˳?>[l֚Yj[5ŽObqEE]=#D/z!/=g\z6 K`*b-~}(&bەt-13'ջd .XȴEϙKF b;ʘnB+E><1XYy b9]ˏl2PHAs]oSg6- H_hQT/9{~odYިYs_(%)F #L?-KE*rLa=٩d2Ӗ'22uj'NEʟ_m xV UL$ڈg^z^j/@?{`nʡC&{n#Xaß oau'y *A}/oI rl8G %öKK.8 cqw QM>\⢗-gU[e[PEghb9V2A _7mb=d!'"oCL|mn4SdmA M"y࿸H>%5w-ph"2 m:|ܶxJR<+<-v2qMgn| nQr_NtLw/ㇿ|$Sd\$e!Je@B~۫c&]r @LjreGeRz9_K1v#Zo3[ &$5QXz));j-;gy3ky.S _n[vk W)yٱ[d/R6[vZvmR?EY.vjuöl˜R.P)۝ֲlL86ܗg<#O26>Y\L u.gJEf2A*ܨNeHrsM|&4fx:)}@5a'H #X-Py,%ڛbe㚢BXO?^Xo0;p^E_ΗxU.@kB̰X % Kykqs qUNƯFjluZd/wx?]t1~]>[|y?i6sw&/[ξ#]y3Gt|Yl|j|_7Fӯ?laۺ <܌x2wOƃb|m&2x=ӆ[{9I>oi{uM&_ l(g[-b/Iφwƒ_1k}}(XFX-aZVjŮ *.w^rA.\.}mQ!)SE_MP#xwO!#hcJmX^FT))Cчf3`\5XL?nB[Fm-) !aҘ;MS2^]3o/[bT-8*6_vmU &ZzT@WOKZm1ip"JcS-U0$Q&$OeWi_9k$DAa}^2iz"Ru>nc{&lYP`\\Q +hZJJI+l\&$\F>57V ԩqJ&GjMu} 3L("`a_&PP*X`|!pڠG-+P[k>,4ުoYO!*?C !:`$q v:QhKgW>*}ڋL@N4)- [Ҙeh, 5&k,2Z(s$>pm:^Yup}P eXZs^(Iȹ{$4صhO-u}RxDC?_ ,k#E/ AT ^>)VDV׭>zE@iT[pXUTp 0 7 %tK"'ݒaȗDxh蔗1Fm8nM=HA@v =%rZeu)BibT޺rID;AI:4e@/1?k-a[>1x薰Kǽh@Zڈ dC|/~7C@\;خCO !B؇ QWZ M &*J ރ V.d_m;Dtێvt¸2&ŗmG @zm)ݶci.Vwێ'VwێvJo8ѥ\`C`+ʜ'MǕPxZAݦa7VR"\nkJxUjL.[nqm.ݮCxX8]GrNHg 4Iqӑ -mJ}s\Kxb9>8j*oː+ ULK3B};nq<,}tJ/8q;H+t|mƪLhˇ@l9v?Um9@t[rtP^&1VJj3M0}s\Lw!KGV..aKIYAε|Έd|i}t'ݦaO>OyS~(gtynH&SVa?JXm;Btێ'9&o<χ}&fF{()J>{᪕t{'ݞaPJG6 W>"܁?A\T g;]ns<,}RP[v:*kQa60h6Wӝzbѝz`8U!sbk+BH*GކLx\> l9vVm9QNfP hOgZF2bZolXmg>H5pܵG<$ $.4SirBUW|D h.FZ,Hy7 M$oQY(#3 7Nb Etk)ÈnjI4+Ku{n%juahŰ&yA>7)Q7!.3-?!=9 (ǽH=ihW^0 "ȃvђ(Kz( O8-tTACRP{x+0CmTR;/BXFyX?T"Mf2 ~񒍗lh]$ 笎Z $Ov{W6@&2R:JRHv1. _.)əڻ!a$rJ%dOekh = +#Rr2&ͬ2r&9!Ђ ^ P&@ṼK2lLkPn(<v6dY{J2KYC@G]RFm?UmSRX{CՈV2 d@g CހS蔘i0ƏTFIBeϒMg @,&De*ր@PYUrF2`֑;ؠxަ m? RnbX`. f4x1:JVfQGWAOoP 9?ў5\b/ɖ^ަuWbДY T]F屈Sڨ%(GPk4+oQ 粁b})/hMiЃDUÚZiV'&bZbl^R ܰ*Õ(҉-KK: TzF+%gNU3%-}JdT%oBNk/U˫kaB7uCJw ϜD4mcf}}^ô[Q}R#G ž vШ\KKXRȮrl[ao5yeTifmPX"`J5ӢC&bOQe p A.%-'*$=ꪃɘ  :>ռ|*ӓqпDW4uE=cת'@!$+iZPH'O4m KpġN=CglZEEء%҂T-`bpʪHcւ {,k αN'sA.b!L3X\Աɋuܻ^ۀpGg'&MG1qEo&sآxɑM%#so~Ôy;D!$JO7Sԗu?'G!*;'=_ ?2iCtGghV_ aAyH:? Hofu=Tj(\5tF!ܣms4E(O8G]) ; Hxs&zV 稧]Q:G#sIQ^;*jQ;wGEkrnQ) *NkGhR9u݄SƯQtvpM^J|GWTݣ940tGckNO &:\Gu8ԬkA?b;6%\ٍ>KTBҳ"ZjrlQzFŖ^3S, k#E^ᖣos~#+5QTRQцk;Q=C_.V{޺Oz<}-/}1۠t֒K Qdy;:<JFyRΨZXoخo4S7Bo4to4{j )^JkWT.߫ỹZuS4uOE(R{3D!]QzHEf Mec3Ѷ:V."N?k tڇ?!)Syx}:0F'zzHWTwXszfQNC .N͘GK33{4sz\{4A[V0-;n fJ Q_آUGs ѤSo9lhnbNüU(1g ћ޼A9-tVmۈ}:GWT,lZ ՓZk漶owTOsj;zC;usTWpFh}OnP8GE\2/~:G9a-mpcz:G xFEդA9zC9Z8HV99NTx1*zG黁{˂6g -vi hy`t|%o_R= #Fua`]Qu4{T~3VD+OKCdYlwԲwT$"w+|15W t. ](=Q_MbZ yQlPWרXM]M=yb *ӧ-e}Þʓqk [\5}hoO;xy2+bwaw}?zFqSa7Ued:K5 طnraX7ap9s2(V9K졚sԅ3fZŠNZ8HeMK!m9/4;T=C*}aOT=FzCqiސPHtVŽ;TOJ'| oz3]B6URh;-/P T8~4P[zC-qRJ[Rw u^CYRP4f-[*_n+]*VZ\vr.-i]N+آ/S7*bMձE2=U>ˌۡp^û Lcԡ?0Uqq?`$N>vHE?R oӷm*0W!$_&ݧS;<ykjaBoUWrε5@"9yu.1ӿIA|M6\ADXɿ\a8ݙ<5 H&H|Ø=+m<֭G&x1b˿ rX 31s%3mMKw|V.@1Ѫa TW,!Dz]#?` vlEܺpu>-&nX5鲰˺7-F>L_#̻hI hWrӉ@&L;xƈb}rVW&;-k6OKL4UT꣟'GdmfaǛp7Eo- BqoZf^/ٟKXw,,K,-)uoZy $"ܫU*Y""3a@E|bǾe'j_ S奃_'vi)R xh!ݡ[ËҠ*X6(BeA' )u9 p_} xoPOj?Q$* "1g3W+gꔿ{r̢YU5xjo:*3 cШr REyԛ^KE\MAi.Oe5ZA˳8 \&n\Հ'm+C)=AiXcA]ҁ͵>Lן+&Mf[SV8B2c>Į3&v^ьMkEE|D mi uV9avjlP0s1aC Z4:a ;\'qEڎݟߔg8`6K8~@0(p%_DQM]+U+BEJIEz+n]bY,. Lp\Fz7kB!LV{7Au N+.**~Zzu?a/Q_r?*FWqk]]m^)[&R0O+^4elPe"U{=~!"$家.;IϢƸJJڭ[J*hWy<F%]Eᳫa޻zBzOjqn;B?8NWqjL / "S9v"OoN mO`_|:\O w& ]/J3!T9nEN%mEcUR40(W]"oXnEoiˏ?iOT?)OJeE4ۯn~( i:Y-{j\dwlίOoPX1ണH ~imZ==P\i#iuVS۠p!OãאYa<.)oxEuCȏv^Q`7p=Ke;Ċ>_3#tJV U\N:=A#SJjDO0ljAln'$MKt뵁]oZc9;: zcsO7/zU]#Ώ'8M$$p21ruEbjZOƴΧ]D t 0OPeͳOTڜ;^N;$]Uݾgl[ΡCKTZYꛡ]YEyu^qr~i,$=d~(gCl7`/!g}4&:6DNxɈw}b +-KQ`te3@vhX$N_~\'>騼SՔzDxm9)/b鎑O{,X.ELE)io]j]/n̔ܡGw]Q]GΏy>K}cfOt'x^LaO0tiVĜ˓OVMMldk%NNFagt.3Aq&c<kպ=˼Y:m#t{6j%]Vk^q D5 >* DZE!kφn27hxƹ4z$-I!x/ :|_]Nآȟz9Ƴ}Ӻnltu]k>+~t1+;'9HBKv"wݠsݵJi u}xrC3b3ئ.X,˸_(@t yD>V~`ՈO1u~BFBga4'[݉eR}m?QI vPap!8-\7Ӂ kuk_CWgX*E(A"3*ZaROط#Mq8Z ceHU'gI:K{oﻼe3db E?2_;޴|3jgG-Q+pk?G~_9_* ຌ=WE|_jlPHͦd}Ȓx)s>GǿGzvÖB|އ?6fVTQx e!a[:uz<ػ\TVQd!p5  ˦E3^Lܐcߒy,dKAj53^rcղC6ȱk9S41It+Np/>M’2ܦ/veA![ʗRyU7x*X#S _R״ʐ$#lŎ7-[Ę6j休z3RBi viykmoVZK0%@ 1I<3b ԐkEU,4GZ ?UA 3Rp5wg0VnC25delw 3 s&rMkl gctSW6Mibkabsc L9> ȃ0˺Vu+⺕V51p>Q njMTDY+W JOГjqFŸAIL$w &ooF)(u17#b~`W65dx& (+-kU zE^=_X! ~ u,e Ɨ(۠$w@&bd{Tn]~#L ؤ6jQM,!!%.ޠtBnizAؑ1Ss[yr[_;.wl催,rS4& Kwj*p Άx}Q.lXEq =rvȪ(MɆ%T/AYbL@n ;DU uE-Qa"J}Iug[MQsۦ1l)BwSZfVTHcցxyaNvj^.8-Z9h4w ]pr݄3c&Quӫ%@\P"BIZD'Cw Y>`~rej(lE7(F-d,&<ɘ)?~0g|يsY?>9vղG)'9z:kg%5D9k}xgmEu2L۬Pֱ܌#&lm|9>(sg7"Z;Fc ?JtiO[2S}B4K>E9*b`ͨU% PW(D!@ol8_Q}2 WƊ -X>Ev?xf6GF}{z .ʧG~I@M w;ODhv,O5U¹B-<o(@ {$EQ-Tj((m"vzBUŎ7-Œ 1YP}˳Ѯ~@0i@\-#ը7-+ 7j[4+6/ B-viX`S@EzPoC)0@Rv`ǾY'1ߪ@$^|4hrocC@ޕ{Jyz=;޴\]> agܓwՠtE"BUUZAC,y}t48Ŏ7->dbp K@t-Nլph} ;PՇL _óV2xrba<,jŎ7-4ZrH6AjQ ~]-W;޴\\E8~?PӄVP|[xrP?-bԇVrbǾM`C(ZjAyoZ6Vl@P]K=l4}z c;޴Z_jr?^3~;g( Q] (.aPܫµG5%wK^ +;.BOؿu_Q b"6؛ '=i\rۏ,.5I59:Q@ lB8/GދdzD5#`r1;`5y+aNN8shNPWƆA!iع2& IGltyy2žk87NJsjK SkǍNjW&$ P#=Af}ᮚ9SsjXdW߉>+<0Pe>pTIYG=ic&yoM#x! G30-u= 4,)Ift0?EHv$TvaX3Xa5D\[X1>G֣2rЉus{<ܬ̯En7#kȥm䨘act9֑6ȥّ#fx~^G&hN,_X3"(tF4 (5K/GE$MNDVU+A==4`V p:*#vX FYOCL,䰨3f$V&N0Q {8J@sCZ$ B1TCġob_.*Ѱ;;Zޅ[Tcmn( "C^jGo.`mno}+ ҵNJA4ue;ӆ{LX ͷw*ˏe;Zve².b۪CP"m.b+A19]߉l)7t:<\BFZCH ٷz;\ĵQ,W0 r"Q_t.>/fe=uQy "t+Euwk*|S#4/Ohѝ_rx7=>#~7X-@ UgM> .|H"L@WM?nMN_<8=7ˑWi2fEkəUksL^c䪌#_[ Cw;QH!hO;:"Ubs\_俿7$gIu|^3 Ck +cɠpfƔ6BOTS`2h"}zEy-)0=7Ȕ+\" bf6.U◴6_j޾p#}r))Np̣\#h<bD0Ƀ KW01\ p9>gvM‹.$($"R4\02!~97%̝E.JT4_aOKK*~}wk"xQ궰>!4 Nw [=m48{K>t~H;M=*Qs f*q%׼"ه5s? !pƛe|\E9/Gvf,RAU64Ցb^b"9"W/b=߃-!PޜP}/ &ʥ^#@QmnHu-I%R .\(XLaHƄlېG`];h@gq_yU)i* GzL%YNIh^OpwTSEBInO]^6ד'$X=1u#II` ,IWxLUhA Q"›P-m0O;xӲ@=w1ZrdǰX>!ў.)c2FGH*j¢}_] 'lBg.@l#LbTkbYEр Hg Y:1+|}Ȑ0˧Jtl[OEl4Z[Բve+k,ކKfz&W8I:+=L뤀AqXYw(,QdfzUk=[Tp]âeOuϼ>if7VG,F[Tŋɔ]jYThR 2PGVÎ N˪'H:ea=#e9+`=?SelXfTƼf씍~Ȉ玪*)a&(bgA ү-@+xJ^'as WV$1.;(ZE̱ÂNc?U9DdZ +x^ Tv5jU]TKIesѮ/Xfi> :gSNE>`fhWgW vus7!vumjzhXsnf-Ѱ~e=5uэ&x-dbö^5'7=j#¯=lk:Դx͐ZlhFu2T9# ú,"$ҰI|( 몛L 8`ðFuOZ,~AciW4%K>:`$'hT+њL6?L~ZݞD28#v@Mƒ!oaQ\EZRw d[#+4KfQMyQ7lX-3 EZԵ&ZIaR8uAр fFug,lt^`Wm[e)w3mŬz>]a.jzx:Ŭ\#vu,FFF[1) `vu֫ .g_t\ur@ӗfcus٫aݩMV*ܭΥI6֢K-G@òΔ8A~Dڨ`^Z֙q#?QwVAd nX'$^QEJVmh}@ U]xE7sUdY/3Z6O ¦Bd6WZ2 aRwBǤiFt&uâZMFͤtpMjdMjTMjҤw3 ûIMumJ-75/?4':]+}SQ}7APA}Ե'i+͠%t7Q)l~:2dŐKGâFEW/E-:JR.VtRb,\iQ{uN`dbO;{~?5ψ=E& ,B Թ[lfT$3]w"NeH;"oASg3* JSP*q++x5v AcyQ2,sK,'jՠC8PMovRF32J)bUK]eT'/ X]E+hr<'@@Ou "]~w$kfI/*^j:̎yQB' qܦWwNzF+'pt>kf>/ Q d]~IE.BUK'b.;zn+ʉLJfp'sD0d%}ṿvcoWs,^nu,E :,_ڠWoGEr+),S[4*:,%(uoz]&}G#41:Ha/6q zT6ܽ1ы\Jl=eNm2=ƒ-͸Z6G]w6lI<Q8e'κ^]Q/ZIv_"w(чp/|IP[$.k(6Al@Jy-)pL }9:V Ac8-W>vVeAˢr_@<߻,x%. ,R2-"ѽMAKXtNXp5ej*g%C ܀W+ͺrOcuvO ooqC2s<*ۡGĥd#|׮G^8glslы-ѾԤP`ntJ'{dOu(VSealFzmyw|IuU035a;}7m2H 'hjU܃9, v$m0 #FVԤߝ ]^'zlQ`b 4# #bsT5Q=b }e~S<Lo`*=SCpզ3=RFL ?}72˲5.$ѩa@f}-Wm=d΁65ݶ}&UP堹5f "ՏȷU<h`^o_jYHo1N S1.|!*Wb11HEjOSWQW3W>E]9D@zyY rN֐֘CY>آ) 2صvhIUBҧOu4-_<uȠ%.s a<0"ϖf!?Kz4hm+}2PlmrRb vi0_@CĎ-ʧEyn5VЌ uLTx7=D"F1|IaoZP{g#UWd !IJFܼlMK$vtHp(АS`6/;ؐ: DdƩUo3;kv"T=+9JKwLTRМ '7!Ÿ` @ )Dc~I9f`baȨ@vk*doPh1V%@I5D5H)ܹ{9z)f3'6K5us-ge+pVp*NKLgWQacB5k!!:/>CCSrT1tkWI{ȹm '54^ d _Q' Wd\XI~l1lb:VMN.!`rvv}MvM]7(TÜj] K>&65ܠU0TU0.9So6 NP#6eRdpIv,'yO6:JY 2%-v[$Ţ!WhM2~B?'y(VNK> Պ$v[biIb8} @=;޴ CPְ[q`]miO#I>`ln~P0C@ج~D 1?0NEDl wLj.m=vi)=O)d1EУy.dyჂ-m1%N^GCd>Ď7-G-[` R8è}DW^ REض NQFՖ@3p!f;viA#iFV((N%ވєrD rSk.UeFPD?GC`Ǜgi̘,}EZ*s5j%͕RJtR6en+QrA/5Hd'D P<ԟvVN 6N7?:??˿O7T*%';y7:ƈZFx\D- TL(=k ժT[c'YVZvu8Y}V K^BխAU["cg=Ԭ5 V.PHzx0\رEU$^* []Wf, x%gLd4<AƘ*p54r؝1uՁH;jk3~s`j5#.OLc3!h9EIݠ: d+ZiH'bbğ(!Z^VA`x iRa{Fwpw~DUJft}GB p --u`/YZ+u<0,k;tqrz?E5LQVs<4;&#>|cg!Entrb0͵'Cy:-<[cM:~v`k+=NٴBjtH׽?ŝGCey ґhϷ482{q-^/#ky `bxYF|xG#BĄ˓'ْƾx"B*miw@OطCC;3AԁNwi]!oT'tk'֝鈕D6D_LO0Y߭\ |[@ c %pP<@*1L0Yz.94עVzhpEXb*{?p*Y^4az -Y?/Gʦ|/b8DrU;Yf/C*-5@ϥw@?2g2 y Ah+SD1Y5Tilb$xTEPnxwaj`By2‘KLVĉ-uh N[x$dAsuGSwDAɶlt egEf]odΧ\-, nĆq}Otd^.hՎ*u!%^ x1iˊAZŅʨ2u/T8eR=Qd`!Zlf;$xcK%>ZK3<-_ּ],^% r4Q /T! J,2ޠH zw #Tvk2}-mK۠[jv4' Qў~<>/(Z9D9hK77h=A g%D bHN9{n*lvϧkʪmY8 Vʇ0Jl(T`FZN^,lPOu`,W7PHzeJiGa2ji{Fņmmw, vx[-w;޴q"kU'M'a;YA $ [4b\z myn 0h`KO4jK"W `1((sG DJrڝAT4:7d75 9@ʙ:rR Y>%iƁ0 Gvn'*y/F?Q<]U=#?y;B3ٶA#ܳ \q"j症?.B, Wطt[ u5~2>M!<"N/@Otq)3u p*NaNB2e(|{mc`/f zHl$ۿAr3C \KTP6 5Z㜱ihDGO Oq,tnuRH [2zĒekE s(ֵ|WzpV雩0v@;aCO'шRtBvМ>[ )ҘHYtd4l@fʣ,9}:dž-1OƝbAn~qjqoPLGEL_>"RWL UJM/ T/5e@0cy65_ ZAÓ,Geu' 1^İT<ȱ*#q_,I`Pl09FB&o0]!5֊ UZ2Ao68ІP)EEYN҈) iْ$^jf"z$t_-µ^j:^&l|Gr㏂`/EPK, `Ǿ ~!q ~㔰ߙ oDh898W Wf!*_ !.3RR>17'i 1OC9nNko_KW6N*LHQ_\ ݑ EܑZ "|XS2rT%Km viyAloppUf!{(<oa/{TD]GÅ3DJ4gaLjzUGRgS cjGs:MS1LtѫrwB5.ObYv32,(H@Ek#p*#yˋjzU#*ŕŕ \"^]6VjU_f,q;*A_F#I= *4S~wМMl$rZv ǎi|F63WiEF?%D|D(mm,ho CFr=3{T`3%ȋQ+UJ*K+aƘQ_ډ t1Nwf. zT.(nޘjյ6Ռ9S&bpngSAr}IxmEf:t0w8'K'IaR-0 o_ahNe͟,/;S,bqlQPnɟia]r䧖%?Ď7-_$*_ȴS<:?vܳ%vLT0*gb=-Cp0\\k/:CPYZZbZ^;׌E):MR (xKRFtb-7 \aꩬΘH"gC b"=AгVY0O};5T;LyW܇mDmUw$B=Q ,5ԤMXp6\«݌@:I=fbJɔ"94n4{SE7XE%7z2ZucʊB,u`L)`woRl6ETKc)J  x=]gc* }x8SPdO 5[2k#DK&9LexЊnvzݏx]ojgC!QX@vtgJY,ids~\=)2[dge@D:g˄۠< Ccġk Es0.v+`"kv 1_f@V; Is8;6*"g@3Jw/(*>wOxR̴>W}i^/ '$_)35gEUOor1iƍsiiya/>MKBrFE6|QѻY]YC ;yy S;*L& (= 5p eUMK&jq:cA-4epXji:Fq_3 vi X&m,$GY>Eu}P.B`ؑϚὋC Q ʼnbDl!gEaTK8ij.eUhiNsڔ2P̡ʃRᝨRw"Ւ:&"^-CK05"W1JC!I4&&..yX:X /NIr&8b*& kR/#KUiY0N;1B{4׿oz1W{ʵGC+\Qf299yY7W@o;&:g2 hfzBbg̉=wT#3zlQe{C8k}&(w a|i kA^Yp|F{&[ZG1jT/by ugc'vFMzDrAJ  &VVz5 TҼgVҀPXW|Og8NPb,}hXp={9%_w'T+Aq![vq~4W6JPB5^JP)ӈ7c)'#R8vD[e޳97)f%CZ?=w]DheDl){R81Rf1YGsT2, u2l|U{`[,{ד<(/,-i5[Ɂ;2Cjvu^3PO%w~lE v3u}/RT^7E>3ԱN-~\\k3 ^]8Qԃrz& +6GC/ȑݽ]A/ۿ_Gd77S/r_/vCJ׃\ J>Q+Jjz]gU eHcfeAHV~\ŮhuBCkLCǻv[ dTPpuPP->!lB"I>|/Vhi ~ v^ tYo!It{S{PDUBtJm'y@Xt &fNs|\eW( V'p shҠv9ڑi RJQuC%/sSʛ.})i|+QDw#&3m zգOKP6y~>@*-븨[[:"Giҋ܀(& s;ضc$ (5ʥ@J+{&ث//mlnQP gmz?4H5FDB%UZ={]a=-#bz AG-[jM/t@9̑qCQ c.`*QuS'x.27lST P*t?SaCiM;0BB;A1(:RQAx(+e1O|P=O$0lQl[SA+\;}QC/G8#,Z\1 v4$бo,$d5g!!'t"縴Cc˶}j.d:FKz62-kz="0qX:{ SeV\@;MyV#,n ~Ә')QM$yLjHd lb޸Jӛ[D\8^P*9rx)`gzO^snՇ([62 Ly*Kt{jhrWGM`!8<dUl7Ύ z:侀|+yu}Eڨ34lL.7>t9-u<Ӝin[f$uWNYΠq>A-Q!IqDq_8$%:~}s(9v YIQlfqH~XHay2(rLQCanȳ|vug)RE}7oKW>m\eTDZ06 B^e~6`5toiD)˶^Qucd̽([ıbue Ef.Q %b`_ JA]L0b߀ƥ6-b$rN~ xvB8V]KT<36tqeIڒD]a(P$G^+cK~p>vZpUO_ & ]º '+hѻ-D&i܀4!Ϻ"ycu [+j(54jɍ|'Fn.6ՂzE9"X}x23]B*<& Y?sfYbjҝ=xy^:g7~z!:353 HܖWu9r@O4k#72\ \U@_w0˞1rQ{\84~;3 mx2Κ#$a#{0 ^Xb12/$ɇh+BpyOk9Y(ҙ{48xuA7;#"/>rl@l|uC-$#ףCQ) ɖyOHBT0Q؏h9<{O#` qs'҄<HPj*'WP?V茖%}Sj <[{KU[f F\;\`W{Jm9y yɜr@Q%vh3t"7P_rQC*_.?ؕ%!L*7c.XVUV%CW"ٰ6%G5O:ہp>Z:ܡS8ގ* };rx%"ϔ# nv G-: )"BoJʨ;\eu6 Q_9n>Kչ39+%DYQ'B6j5rA1'L4)=8ǡpeF6_Фv%}.`^TGۋ=j_PyCVʼnqp \g{%h]mB1`ܝpe۞ RƄ!gSsYYkjwUFGz 빺sAg7G~t GNx?qd0K`ӏqyyA Y:7Q5ϟ\>|}+ѝn㙾{ˀ9U7 ?@3,Wg,۪hb{vWD9GM &5W}n@yB!y4|g%b|G~uorT}qvie2mb$w#wHcF:&9Fvz4=~JVLf5&.eHx.4NcuT~3 c&ѲLH&l7 b|i#=9jI"бo_[H3y6&?ّ#*1g *-R_PGI[ΔȃKؐNj|&g2wΨX~s/-kfK,;'RZlLq^FO&?QfHNJ/Sli=U/WQ u1QT5#K#XHAձl@[͠a jiIP3JB dQ*BTi(OȹiϳhSynX_?e=6b#Dvo7T7`a*D4ZK 8R ?2,C1C =zxQY3y|P@|azGc-PDZiVYH>Z14&,720 h1hEVE凒B33 .c:"4=_^hBGbqƊمO_ KD4;طXT▿GɎCkU(qNUҀ;zHylQ<2"{)e7Dָ&;L P1/1PٶlAiKMVik[/ָjG"fqu+P6Pm@5D. ;zʾ=_Fʆ-^)cQ.cU249SƢ*]ڱAQ "U"e,&Lel)ceUEaEڇ24owؐ(*j dl' eM)B6!bǸ!бoȴuWQSfn|u|EirJ,sd0h6SРcN䫫\+ ՅlʠlJu6 lʞ{&l|ftX:\<9R3 ])F/i#h#?36`տ l,cC'1qg΂YZXݪ/T7}Yݾiu=*#C[,GoVw4yW6#|ӟz;LNT#|~Z/z`1&(,M6T#8dw85Ms.Z"*`3t6V=slK Ȼ0Mo]L;[ PoOǪ n2oU5Zn,bkäNIevDdl,EmvrhNlIQ}/<>ʏ&䢵7 :T:л!ti@/)jm׻63?Na;m}1 ɶE1/7k FAl-TR0]KeN (^v-NH*FܨWt0)D7|HZvMnH}TKMjfWD>IDVLX@΅r |ķZMۏ |e ~AV>[ =`+Kt5ܸ/(B:W gN)~Gm,#3{2~, X%k]T猢*pDCL .b@t(P>8\AС\??QlWNk>/ ^Yb]> . ÛBx?xPF^p(S㻂:ܷED<L{ᡭ!~CtԛKnT@皈|i@?]$TPӉb8{i!gz! 5pw~um4J^*ue/>ݯi.\ !/UۓDqȼ?ݯ,?/ކkL7"QV{\x<9HCJhMN0Npr!g%Xhur2&${%wxG:9ПةН2woef iqQ-E+[ MGJ _Rӗf"f>;}V6;s{ gfǼ#:;-TYv$?.St}wÂ5.Ïv~ 2%itZehm`xN%HRθs?F tb+k4\C45‡)/Jbsau\_^SgXP0= &%R[~-6w-S%取േf 7,Aa3@ƖV`W`Yos p-n~oN".bpɱ,fƹL59wߒɦ>8YY8%LD-3iY| .`26 gLWMNcK}lɱgyȔt\=6X}+owkm^O:}dߍj֟~*ΚPqE4ݘ+)73%M~7>w-9X`䲧\3w7 ]γx,Y"tNM&Mlnv߷v"7<djeNmPоN1 *1_hX zH~N]xy,;WVM)5;ξ0y,ufB/ }yۏWEI`QcG)Ds^=qC11 j+ rx+9͂XQ].eA>/;LwfN6rwn_ܠuҾʎZ_]Y0it*,{D5՜DUVg%':,w#U^7a'w==d{@CmdyNڢ3Z;!E6SR47HVqNKjrlM t{ӘOhpA@`m34Nv,R=d_(:saK#@,2;i"{ӐQ(nYEUoM:;y .NXqDf~MgAZ Vkd b _zs4Vt@T~S!L ; 7 A+={?M~QǬu]x>x;13{n.q1˭ +Q{dyR#51 >+rL:rѶ* R>2:t|kI?7_5Dr[%e eSS'Әk.($RFnoUmͻrfEPٝ) >]:s5/GK]>iu50P42=@2_?&kޏt$Y}m]C|+Tj_aN)Ē{E]vz~Z/21]:KȊ_ć\'o+3ebw4 ӓ!Sױ3`]\tF{*x)&Q#"/,ݤ|Ez#&^CNK1h@i.+5=:i^(RyA Kϑ!:+t1Fc쐍}fKa[>= Lm7>+{ IPj#fh?/l#,PC3)0SnypA@b^*r#[vf ?m%9Z.&"ޖNt!1 XTN6܁8Й֛lX"j8w]?AՄ/gz19b2)J2cn=p0D.oAaE9{'î'1m[őQPL> r*D2=bh-9~-*Wn91X!%Iq~}Jh榿)e~9bwڭ%uSN G}2-BYxȤs#9P!Y@Tr]"{D`ɣjZcUkЖķnar}Gҿlw,q /2nky7Bhg}|mőRGr6*\@Dpxxb)cirU!7劲1Lq=BFV-j (l:slЁQEu 9?OQԨDP]o`pbF}Y,=)%Iُ [˩4\bwId@?Vu!UAY"X]fh$`b{(x[+]T:y [$wT]Y$IGF'O=|R DchTFVxLU#g{eQB'H ~R3 HQ Lq (`'b^ /9ӃZ/6qm(bCe`WJLmeNYQw(tisIk%OjXq>jnH%? }:.5ۼ1R(Ө J]SEʡ""yTzԟyѩ Z{zv=@~S>yTp-1P-Z <5ș0)j%O3+Hde6ÿD4} TUrW8ŚkXd xЖ&6VvgQ,ź)-`8T&`QGr$n伱G ~L]1YQu:DDp<^GXEȦaPO뤳@+7 ۔C)C&k8iЎr>B)'bAjՖӉ|w]"90 9e?Db>LÖp% ܐHe(bJ΋ pMXq0p\8js&GQbSx2=rL 4"]d%[$0̃+^H׆9b=1KRJZTՊjjW$X(R\(o׈QTJv<)úbSQ'ٟPY/c#gi׺CC3R_0UFR\-ӣQljNj˃hUEMZTA\-zC$pu,w݆sS4;|݂LzeP2ow=OS 6[`zAn:9A_{65@,4SEıϠ8ͮS3g$q\ ɥ44W^)j},۟DJZAv%JXo[Rcr^6ORچc:fxF]@L3Ac WEx=Z5ѩ3'rjh@a& bQ[-S[Vgq`#/O_ 9%]16EԿl(M k$xKzI m+bxP>X{f́͛OH.coRctzN1[&f<-3z˗-(zevw9X-Fa!!/KC#ξ+bbrT.exNٿ .u/xd5񺁚9I*}Գ)]K 're CuQEp <*ŠZ*m@^K+NOѓMj }=_Q<'OnD 4 B zFjv0ɷwYi 6de^D[f#߆ldއ9Zdg <.{dwnFa8_V ?@fU➶q/vQ./ sat!-|F*N*zb[zM$j /SDvܕ<]ܼwwf?fd֓by~.BkX˃`vZt_HK!S& PD(0N.Za4V;e.,hu& 6ae_]Aʰ1A$z89i_vi)@@\U ҾHQ8^⓺y<ƨ%EKJ$kbEȥSkd̀S+K282>g7<\$:Sa2Yq%?i;8i1t49TKf=ɋ\$=kNN@FfWQYm}^ S޳Tvv/-G sb D㗃gźXEqVs<0-&C"5 NHWY'MMHqCļS]o)i\wYYtTxYŪl0ml.T9[ZG8ʏatV(!M>Y슞Ir]%ol19#ܓ{prYsHeuī2+=Y$'‰鍨-o,:\dEd0ZYQ~s6c/QĜid'KK6VM=yzFߤG5&1'By} ԆSEqsB8j പeSi=“U"̺e{!gv]' k}6C%[mtA% uBbFSH5郠BLѤUpVK}fD.Y!_KBH,@_ ^[JBPϦJ&X^UX,/vKjlBO_}sNTUXInnpcdc&/ sׂ!h<WN6dnj$p'юf "{KKOg] \L2 ={U &DjH*3X)> TѨ~82*EL/*b^Ɉд:漱c]=-(w%ճ}ce換`Ӄ7ax=33εqC\&ZoIFe4L@E͵_ IVҷ9Yߴpol=xdhL:] IVIMSaQp$O=In-C@X[!Dq-4亘]p%IGwe@(>0T|ua(ą[4 ೢd XP@"{@m!avGv,F AvK2D?V$]3n<¤%tkymA\ݻ+KWV'}e!@PW?XYq+ T{_Z-ڂ.UCz.W "Vitu5ޟt.RD95n%Az7Kr7eMD䷳UmЫVcU Z tm_:7M}T򘲆ޏ]]Q|cw=8l6]6HWO_)ӽ |"~`0" LFХz78R!XOdi+ Er 2A4v:+~7p~qbS0q{)ӞF;uuD_퐞G=ߓq׃$b"z%M.YR|!J7:e9g]|:"8*xM*ۉV2UZ!79uk,*3DBl۽t QL"1 *#ai[`@U57 n@Wu} ????/Zo?q/^m;Ak{<{<Hlq,(8H[<}lqQ+[W-A-^8O->yśV}H0~{/\={<@)=ˆf{㴲!UljY/ +HL.[/ps_n}WEbiX > 4vV#JL3+<LpJMׂ(Cbb.Q"^%&CMP n@65qj->J@pld Yevj~cur h.5+6|5.9L:uZ1Ҟz(C"ҏ!^+XL o1Kl{7mr$pVg;Ҷ8ZPp)F+ SO'  Y2Şd8p߲hoMKಉMNi˲Ae_5JҒ7[YWi /yb[GDbhֽhs*IDiV dGOᑻ'K['TpmoIWB~臻۷|)׽v?ݬomķƱ#N [;On\vOk3<63ܷv̭帵=}k[Nek߰M˳6g+8AM[;soR9;[w~egGcFL}gע&޴߷4oŖfb{i:-۝hTDܜh~~)ra9B<2G4eEebi]ԔЕ}aloؠspUepx|^Tm||W}/.{gX6͘b%2}\.(/bfKm5/ȯQW{BhbQ8Xڅ`hCF-M}IWCg$ ofbM;{+.I_k4Pٲ_ m_`GmoZ&r vMd`5]iá%!XF_Oʝ*"Pt/@%y&#_' kUt[ٸx΅ ?tLXahÝ'{Bod% A  pbN|ZyBFu/ js@4|N- n`ʜs`[edF@ooA ,0)X+H[t8rLvϘ+F ЀںQKn?ipxbSO7Y xg _Dh#\#_ ȧ{Y # 3QV>h=X,"PU+ H6 u%\X&P] 5pn:Ddn"ʏbp#!ce/&&f|6` PbPUc\h\_ *B2]\$bbA ri]d,fU! L ȇL꫒Z9Аd}l4;x9L@VI%}lgEU:rd粐fZDx;p?˔zd%-QnE^U(6S&ViVQp1f=vÊh7P{JC(TE#WTmVX){zHv =}G`ElR\S˳ oZFǹebC=9ĉsbf m+ndېV5`2hSE4`94{zTYx%9t4j^v*tRxUZXdZ~-k@sAd\fHկ_\'ɥ J kAF|` d^tx{:"xE:^ D5yԽm|:h[!?N1P*:=aPϕh^LW lZ2rqEAQuEeAlDg; eW= w\4?pє~x_@/"Y6f EB߽?LH2ܪAuk6 ŀ{n@lP|(7K&MˡɨD  H0Aa>DC{/ӂ}ܵZM 7PEY :^^v>-y&z6}P4m4%JW ;-=vtA'$d 7򦄦D|E[P4 )МNs9ѬxrU V0'2*u H 8ќͧQWcN9wE6aPD}lQBp A!0(: A {)I v"r>%'5VuH]ӲԢ@o(DE2(T1)0pژv {5(z-fP _KaKpk.(͠@> 4(p6 o5(Buh&,A!f CbUntȈgmggUQT;&c.-DG:EĤE!x7;sfHMK P}0,BBmՐ6Z,jDR”ƄЊbLfLpQP-9`ҜJGsTI&G\JZs!QB6XQ !+3$:'0Dp1!͌(m~ O]S˧tAu dFD[Վwˋ7ŇcfEYV4#fij@ʴzKiDj8MF`է 3!3Nf"75 J6Av׈L㒝f> ]r$w4pzhi0/z,0^8FZZH'Q롚0N b:v(("޵hF:SD B>W9-ΧaC6w7[FKԆH Q5hɓ=EFg9UEv0UoUjAT.ݹDw,0i; Rog*r*e, 7ۮu?#nN8i^ UDVN`jㇻ#*\MN eZ }"|ȆD Ch{zoGwAUG8D~Zh? ̹z!&Л3P0t bO X.pF[#M/# >~$aLO B9D 'Xƕ1\ǽ R\H4c瓮/٥ kfi2evmnS FrӦyv5nZ;L%t"އ'V\#hjŲH1L8{mK];Kf^ O_*L&բ0@EG Bc,3d]8X)(X>~GɸR [p,ވJp{=c? 42 u̟'f3k SR54PwjDR5FM襖u4}Ar3|zL%l3vB^qwOa#1¾O}[NpIDq8֖۫=صc_7Z2= E)kgDϤ?(<9T)I:I$ @Aj`8BvluzJ =g(8P/0ũOYu9Q`(БZ= ί'a >i=? ƒ"0v7/vn/t"B ˂c%3zMbf:_wNI ai9߻/&%'.Vm:ŽS13$TNr(J2m^$fLΠ & Gc!2j&-Y\T+:bPTrO-Q%_d<4Y%zs䌫|vY/0\81s~zՖb%U52%50Si.q9 q:%aCo^mr>S4]i9$t8q)Ovu=1 qRX+Sr$cMOl]+ l?2?DQa5K^d(0c򹢺i0KIҚKL.u.B^pԇ|㻿IJ7#WXޏN(#I'F h2ˀ2xZ#H") K$Qdw62-y5Xjx fҞ^4sܡre)QӍ;?rQw:Y@r |PVU OZc8aߢX#:"ui9rXɜcԘ`Co]3KDx {5:x oO&{N?A~zpx䷝rȈ!E\eI?ڍ_<(0qaf%iYݑs bAz/b&SgآEǢi zhI/*m}T"ۺ?Z\Rֹ|Y^jȹ_X;%krdNd]IXg߶re}+nec/X2vLc+GJu+ʖͿHm'ol䬣\nCnd<}nY4رEu#kI$mdr##O7s]ycgIO'%(_|FEADž-ޖgr^!Z6{`r:ixb]ʨ# M);ޅ_Q%:h/a? ,xʮO !HdDjũp[֡;0g6F2r%?U%- Q58eEm,Eb Ƶ U!|Q?ĤzhlP*4xL0XbrvBNkMW`Be~ēֳoL@sxQ&>ӫw%ӼH”+DX^O@ s9fKbEΊq 2D: 1AT@Z(5c)~rT:鍷ZuNN;\ ƘK1tF8Gp~ i5h@],~J{, 4[ڙ갢W P 3Mo!KuރaЌ_2 NePjQ`/:JAyHٮW݂R*;6Rё)N8;d+3 qHG>Ta1,+UApxbbI'`g.f-nbQd%P Ns@T@ o(mmK9,_8/4dG%3E԰MP9pSP˘ˏEފĎ<ѫ47H!Iq\Z; "#󤌉w%c!=JEHIDĘ& SNr:X1 N !$KEz($ϠqC~7*fpF2 Qt;lm,Fjfdr;%uZ7r U$dYVS`x&4j"vإVBL>0{:S}–Y?}9 eTϚ u\ۜ+MOzZw2jIۀR)ՋzwtRV[L2-fQ&UОP#9pLS;u:og͜`w]bǛ>"_5q.' !RLkKgrLΖ8~;~ǒBrBҥ2ͿI9Ya?^["Ë7,2u!rIUF*S}!BʒyeY*Yd+:in׺Yd`}/J϶ȢT"qXdĹfߖ>N|,j ~u󄼘*oJ^`m}Kx>MN9TqfJ'xɘ=kь2-k53_A$:о'|֩mE}@7TLqnP2uugO hqPZB!(8:J/J\R3 AqaAKd˹ #xW Z=xlRYnb%墾 )rK6w(2Anu ;ԬIVӠr.6FaEQ XFRtS#ԤA MKTq䭿(["DiP"J4"VpcǛڑ^ދK=oQٳ悰[b5wTs)vA*rB6="E[SB@CRR͌?5nq_(SQwضO`ޠuB.5sLl %}HSNitb)@f;2UqH$/MYySòe]dzfp<|,RD 5xA#kw8ii}2Oﰃhc0U1adI$G9KR2s($Id_xMew=T|wb!L0J-Bba: mxXB PߘD,LCݎ82.ETYk]FAY8{ 𨖅CP cFb6#"X3rD(W KƒޟZϿ'+yW6<{Z߻{ ub{V{z ݃i{=@'[v}'JC[wtwwPD.&=꿲uT4vb:tz[O@v>m임d&9{pw*AXnQXj`-%'p[+; D(x>ݯ'ٯx)Tg%Kl%5u(=IWtM.,`VC7\IHF덌zp9%B)EdK"p7 n@u Gx4ɩxJBYE:$Ȗ/e˜ٴol" kȖceJ1!ϲ8yY  `j%/+KO/ьJ<3G EsɠD 'C'jnt0U9&f(6.I=  BJk ʧT"F_O7OKb8*+  sfJ,t *rp1U90,16092Z$JH u1ܩ)J[ee7=ɲ>p'%\k(=)xP o`#xN$Ɂ$TBskЇp4ܻ`:={a5ۼ Y\BC>wlT.Øa)K/r"zxfi"aǛ$@i[sQ| RV10}Z5pv~+ahH/]*NFMB;qh(I')!^ ,뾇܉/fõp" j0XJZgBYo=ޕlMU윂SLvtJ|Wߡ)}G!Ʃ6@!xRu( &jUٔHuآKUNTd&|L9I^2+9uPkv vi D sՖ4Q cpd|2B-%=/@@@/[ m{Խf|L2A`⤙sǂR""PBM1#c@YGfʙ[ ;Y2odJ~)/,Ϲ3䑓U.XAר']XqeUdV4@֕j!n1)[00kV, 5c-:i; jQl4!FE| x Jr1h{n6$d #%:a$ÌPd!RFhQc:co%16;1zV!&v#Adϵxh/Bc)#J1?%"}Aycpˁ!TVPyZo6@rA Z@-K ;hʍa:2I! 1`(yyt +jCC1K\@1QpF#76;޴t JԎUQU'; 㰋~}ե5y !l 9p! /cc o5^UEL1P7 Z$dYWO-6("]PkV swz(K-½@z 0rDkIK=}G9*t}PҐ,qy³| .?Ǝ#,9d riى"Aň:N3:ގuG]lb '#R=&F>M`A?+2Sd/bED1(ِ?(Fuϴ\)(,YpF4\L/ 4ʲisnIj:sM@S-GAKVPZR(~fuP⻢:'{S #Sc(՞(o`@1ęCYYI\H,;jV4f6'j&rׇO:;'?F1z| 슆p*j3 vuPZF-:e~D5ie\SM (4-?M8UaXղ27Bp[[jY8k15,sͰl~hYDe۔쫆E.i4O"% u㚮a /5,<kO"G vEE~*+^C,iW>*rTL:) 72 HjӮȠɾ[  viɅ;nWT*G " "U#^X4w)6SզPfQ P-Df[(s쒏(+~Xp-`A711t(PK,H=5Y] [h9XxY`f@ÞQ8Cr%?aP:wQWo` SK,9{=̘0:Ӂz3%ƐX 'WCBY4#PCfDpь]nJ3#N͌v3#. ~M((?+7̈^Χ̈Ќ5x73I}3_͈}e5#|Q7͌h4G/NcA]AQ^"Lf3"jWlVe3=ݸc~vaDdyш]w2?Oq^rFc:${yBٱZPPun:9yQpeֲb<%>:kTEEYz¹ELe\(~:*^z=)j3I8'QK[WT"J儈nQ PŤAȖ)FΘd`3FrT *Nn tMç~Ϋ6! ^xq%18[ (N@`>,Kǔ\@"j R4 M`: ENZGA ci{OI\Z }%xt`|4CՂ߅$*qK Τ@ 0KgpiJdb ݞ9LB]I.]zQ uםOlaz'((积RB;4X,тxV:}R?=vwC{+(jjhǾ{4 rBBۚ^CG})U/bq:hk:8DDJ^{tqZW #;CuM Z&f;׸>=[w)5c1p˪+j'_9,bbӃp^1Oq{Y;5YToIBPE3v9&e/s/Hx4Mg:Ĥ5 ؇;΅>:2g۽N[Ӄr5pˁk^U8/& hB!O?=8 QQ,5:B#beZf}?yÂG8oP*&u)B/OqsYAHnK5+>S4u"tROu*a8˓EBh0fz-z"ty9?ohI=v'$'PS %MݔO{1r`'qkUsdKj1vjoP+nq.ԊWމ&4o sZKy3[L3Q/;uʽxFW8t,Gx{. <4iljtO1#7 u\嶇:oXA&yݜ>xv]#K#׻vA<%$a4 4JmTuUO:تR5QnO;]js:`⮰{Dh wR,dB0 ׏o{)5mq(>iG>W:Ch7PJ?$<~cvbnؑ5✾-\xpL01 j@-atd]37swײ.lCwxuI"1na{\GX+#5 LŒ5 &J%&jS6ybbnBoΐ`qj/yf2L6,?X2;.+_C WtҬ5T$1UNGkz5yKN1Џa"@cV>ӐbůAh@VPA$mK^Q)?LOC&j0y5{RtFGqCu|Lp<]xRk$ W7y>>e=Uˌmx*ˏc_e@b)ꌦ̴?"tURE x2={ʡ=[\k7Čf/(3탿½\džVwׇmFۃt /O5 j)Ml]D)Ҭtס0 LG>󭥨]Ы/N_omzG|yWFqh7FfSMИS/ЪbtΦ|/xA>ෘ7:8SULL2Kf7fvIDw]ƴk~<ZSuXy t\ؤo.l,ReZ6Ya|KKBzk=Va3یp1'D}wzFq W9x1a yOiE$TO(u<( ngP༳oA+T .H"s@ ?ӝY>/`Ǜƅ2h1dHbel LjewH? @_2Wdž§8ppnKͅ^W+R {Vl@ㄡu[j`טcV1$Vw*Pn։EAJp1ȲT2O4~DZYĸ0y4赪y^0T?:K. UoR7B@_PP~|p";M*ڜ_޽7-!b* i0/ڃ@YZHX{t^^ZX4".ybqEߊEkb7`+we;{>O!ڑ{_ '7sBI1DÀsg!R, g鮭NX"\f!>)bbEXĢv∪X,qlNFS*VJTTt5R16cF!%"(˓ -x4)h?bE|nT, bQtyTxq|U٢U=kven2h3*4$Т*(*FMe^lf9+2h|xqEv)洵_u|E/hW/`9lʣ/'o}/@0((H؛ +EY|u~^F<Z d+,#t<[WrD7ړBmHDM % N_0!UR88ںfjiм-?=&pܩW#C[ioÍ A6@U -6'*H65>YFfI<"^Oկn \'rcgXKkgQ{>ڦ#:{Tˠ#^gO 6kVӌvi,FD˔:zETdYTZM"}7Ni_`cy|WXрU:2Z@fu0`TP|hdn+ڥs:Oҫss$т14*[^6{oJf4A%3p|!m/-R{?!8TZ-^(uUb¼Z^"0bĔf0ho5&P~=pehgZe+= M:*cPwJ*&05N ޣ 3~TtiGƟe}-f^ ׉5F޷6-14&?/q&x&dK,V-e.+5mݬʲNkX\cR2ɟ5|\Ώ/ ,b1ם,;i "ƧE\ m'Id]`7 /%|/б o}[|NQ^nJchW>M@ЬO>Aаٻ啁yEEh6L%_aX'j.a76kI'h_as'?A\-u;F޳L@E*ic)`ח . ;=KMܓp7x]<ɕ/ PK4*Fz6j o2I :b:܏.kY8sv*[LY:HsAklԷ+2|EvER8&" J e0PO]:HJq\dլ7QS!P>}x???|甁]Rп^ȿePI0{;tV"Le n = ~:b2(΂ud[lQH?3.V)5 NBa+}+m@-T:]$ԫ޷i=gvF3Vt2,;CeVKjQk# zۆr }lQ%|-zwB`4jz굋o]dF]7tg]"EY놘 hJycQ .ˢﳺ|E5<` -7ylћLʌ~<\[ArA6i/ř<@m3={cvբtDQ[Q)2/9Ǐ(GR~cgO,q4R _=!Z0-/~ B]yMT'96a_kƔ.;QۼQ,h;=6,h e fAk)hOqɮIЪe> Z>Jښ`N;ڢm)jSڨ{E*jsMƐ7vDw/j y/jpz/j-kcrg7'O FԎp|<`nPGakK}ƍu!.6[wG7[_l~܏rҗBrԩgOk ztףbEx cjSY@Zb֪Ջ,l؛pD!SzE ..,#UR|_qLeہy&anÄ0\qŎRg=sFMmqڽ tlǡ-U ˮ9ꆑ]n#m® :Қo_#_:efʆ-vøё/ džF_xdZGb". ײ$|NWxAbR2 f(-F+'5lq\OtX<^QOc3pA(+E475U;:@C{?h6ewtsz`g|.`bH\\9N#Fb;;7èRyxSE r<Q/`0+a׬.~ 3FnC;F"JOU(}NHIPk\ur :;xp vGvׅבQF}3yQ a(Soi睙YCoӎi9ArF1IxvcpՃwDU/U-Nf η*Pk uZ)lbD}5Ai{3_N]dQ) kH2"sر)Vẅ, ϳ޻V~+ر vRb7\FB'HQp#NOip87tOZJݖ5gv#:7q)jxs3eU՘8O%D6p$٭?>·쎶A?f>M*&b[ ʡɛm-07jl 4I!;z{#憑Svq<W؏*Qt-'ro51iPw)<ޮvGPQ-hrd~\Dz+v"C782yz𜉩ݧE]!/ 9痿_~?N>?> Ǐ6,Q ͣEo3D*nNm?AArCǭUxD䦊bfX^ ,[.gÐ-v|0 gǛ&\d2al;㝍[\_,oWzz,}}D{.\pΈ(xjjp]0uƘ5ۿ~{}fhݬ'>1r0^[͛}}y:﷋34ε6rn]QI=Yf~5_]]3N͆8[b˻?=^}\֌+Wgo&ד͛z|k}5~}뙜 _,ZfTrm=/oc0Y^VWg_WqߓG+Hޞ?\ltvC?|lG Zrl>=o v_xfo$15^~\#̾֗m@_r~yZ,^oW?-/)%#>J/QջXK|I-L;bN<>?=Bd{-vquܣ iTPIפ fj_k?_<7oܡu6>;iׯ,߇uC=Bgˉش̇NurbB~!/{˿2|>Mo[(}ckYs5#˓R6)',uWRhb69jr^E&4!ق J:S]\v٩!Vϡ I|lp[fI"&yP? [2q(8̨GB=X;[ nw'K[zSi됎3@N-Ȉ`,KZҎy_NS]y?|#K l7pX2ÔlAJ6R 눳bArp @5l$6bRZ @2qʴktBe˯KAUc$͸%EAMQ"dt< #U&)E9H[)Z%HR,ȚRo5)CTtyϠL&7JЊrEiߊ#pD5X`" T`2z]>eAP<,Yt910dEHL"E3S][1L^t \E#80ę>H36 1h?4(mrf!dNrLMv[P-II61dTB FD&DʳwP#lr0TYxӉVi Qm?UyqJRP : [Xgߺ# XV0 u[7j  0քF[GpT C 2LA'v)U/YB2Z,gs~L2`\NRGQRΥ8&,h f4$Ҙ+*B01%FF5mk"ۥ,iś+uZUȤ3dW!F o>- ػOlY\4tM;(YU*AiɣAASLRLYSpQV3Ǩw ȜEf^)f!H|-9SM.Le9O&Y!)Bc]GܥdS>0sA2@-G[TUTuq-kkEb:Im5iEE艝^Hoo %$1s&c<@/Mޡƒoo p&-np,m_efFEF C99!0[@c%3%BƑ>޵ٲ(ƍJx#GHm;(PjTsػI #BauT2$|eE8(%"u[z7=$7HݛM:d@rR!׊.3U%)5[ݡn!K՜E#Ѩ EsC"QU뺯Ru4EnvG#A!uUېz^w B g|4>Ck܍H/r! S&[-l~MM/w[S0IGMI q$nyclrE!2ˊ3oc0NQmh)֙*TNTػDU_ۚ|k$Rg@$in愐 !16KΈkTbP0(k6r2Hؒ!5%@n{Fk/og 6CXO;I-3 $Ȧ(i > Fz 3hOѻGƺE[w&+usFiE[x FIA;PHOӊ v 9)ZDf6TcSu'42&Op 1Nq NThz>f|owwZ:S*I?!.K4Iz&6V9 ٠S3&N>h'|U8Ed:Խϓٜ0Kݵm"TFr}SCtX?ҵtN߼}:DD~=b,o ƴ,)['qߡ Oȵѓ폍N\[#_go_2navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CD.svgz000066400000000000000000000012471221777731700221150ustar00rootroot00000000000000'zHcountry_CD.svgTMs0W%%:әδH#3mN`jzo-xz6^δJiUƮϯLVMku6}z[|ӵ*9InYtr~Wf[<;.IPveUz@T !߬H*pm_|FUi˨L^("?DXŬ_tzwuCUz oaT2 2R?6a+4gkԩ!)lA0 i (-@#V HD >G&l1Qefb zJ( 3S`F\1CfXy.Pi]@5K F7  O\f$r>Y"pp A(dH`H (ު ,p7႞{M(X(sKȊI? yWnպmnk= Q`E)&,I(E(#"Ü}P^,KK׶Ujy>҆+hXBNDcM.?x=k7 q.7'֨ VM*R 8Uwڹ8ɌlZuڗĽܛ6M}2ݮ "mVM{8rǻ>RTnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CF.svgz000066400000000000000000000011411221777731700221100ustar00rootroot00000000000000'zHcountry_CF.svgk04ؾ;.q K2[aM liu-d=tNg/+P]Թ(E,U.oofoߌMLn~\_a%o?|82ɲjeӛJ`YvY YmtҦ]eW|.]ƎYt䠌a_ʘ#YN'Rlef#ź(W> f!mE"weUPIr˟կOrS\E0"l߳WmQԇlr="{WTU=n_O A=-=[xVMSVM=`~Jѷk\j'!MTtyU8"埻n`R@J },v -pٍ3>xg `H@VN4i4:d0[@c k2f&'JGWVC,&sgT*}^{mJ+kQz7dXiZ Yo!1XB2eBѨ0aMȯB.؀CHr\Eq˙oXP/navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CG.svgz000066400000000000000000000004731221777731700221200ustar00rootroot00000000000000'zHcountry_CG.svgmJ07;kʲmSvWRj;Ld2ċN2>*nUSsdE)T]r\gNƃ,}L ڮzKD !iX= 4f{C6Q,tjW$ d)pS>>= #9^Rc|v8RAWk1 ~˵G"xNE!67rjv]a醂۾~i:o((Nȑ0L33RQ`3dm~6ɣA"\ 64U6U =*(Ved %xhiNs63MIkpF.A o!Se%sZBg luzP6|/g~8wNOxj2p'Gjذ?pgf^S,?2-ޟ,|DUD0$G|Gu z1zpe~15aGngǘ`N&mӆhy)zn=+~_?Nclv?7BkWV{navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CM.svgz000066400000000000000000000007241221777731700221250ustar00rootroot00000000000000'zHcountry_CM.svg]o0rHml#knҀIt .I,RrLSq>(U<؉Vh,R'&U:*'t*J%Gmjy~^Xm<@ pHf ? !7 v BqhlN*WF) SbI銟GFdq(zJ9iW)CU  q4^8R06O*dy[L+٫A#k*Ko(S@C';HFѯ\O.KRz.A֝ʌrl_Kd:Db4G4}l+Y%t^r~xG N`5tUk[Vf>Mj,H~$7OgL^HXRb6뉮Lnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CN.svgz000066400000000000000000000021711221777731700221240ustar00rootroot00000000000000'zHcountry_CN.svgV[o8~﯈܇m炀vJ#HYK*8b{r-0Zm'Ri|n9yT1CȑPiVf9$E䪐3T(a~3/q ГTژ2wUR\ndaG\.\t{pKծJY.tw "q{z!bIBRKc쁯oQC?6Sy谁[k{u -?1vS@Q-6 H6Ro!ثމʐ3$Yos|fW6r8!s]YyrODRn"jQK4tmZGM2dԅ_ho4jmUIg~Y` [# ~l <1evn n/c[6XM3T}@՗d]J25z#ݘޠ١ 9h{վ`WU*y>RC8ZuWT'zKzZ>j˷G`hԧ|ٮ.gSpr;5WCs Sܻl8Rwvz^M%ICnC^s7{[vkګrl1,gSⓐ0 {#0L0e'ab`QpU9x>'܅+~ŔF0aJ 9v][l#Qn紣bc1NI=s7cZ navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CO.svgz000066400000000000000000000003221221777731700221210ustar00rootroot00000000000000'zHcountry_CO.svgA 0Ebk&*bQ'h 5`7RnJ`㤌CB6ҝz&[iz[<3 ]c1O~#8^`J>KV`b)$ f|U )߬OQF<4և 0U40navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CR.svgz000066400000000000000000000004501221777731700221260ustar00rootroot00000000000000'zHcountry_CR.svg_K0볽I'vAt̩5ihdU؃o9{dj`/;&E1FmdMxeaxu{=O2|xĉw*vD}G$j]SHy$p'}Ʀ?cXq`kᔯAI]+44Zxm ? ֺ,%H:Y_6&SE5M4"|߰^i'ԡ7+bGJy<hk@%f navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CU.svgz000066400000000000000000000011771221777731700221400ustar00rootroot00000000000000'zHcountry_CU.svgT]o0}^;%ۄ4$ MJk7rV F 鿟m ml9\`~]L ^r),Aw~Nn\@ _3o+k]0n&hFTREZcӈmaCFiKdg胑S|Hmm Q>kmnR QEEm9 )I Q0X&⩆+4.Dm0O!jK`(xe:iLJ>5u3#0ЯAno?$^䂞2;鶦X|+](|h53|65o@+V+ֆEj`DΥ( #ځ8kr^蜛K3Q S 26B?ۣ-W.+Y;RL0Zf'<&Cn;wtw,0ɘ4iO|@񰳱%MeۄHϙ,]e6߆ۘأM<sƽ6W,W|eVSGY$aDvksY Ɵnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CV.svgz000066400000000000000000000016201221777731700221320ustar00rootroot00000000000000'zHcountry_CV.svg]o6+8&,kt(mEnإj1E2$&Gȶ@sxx=~sw[[YY$@iVPvI&yY8(`o>v>| (&Qtvq~gE ;ErKe5.>F}<6l SJpҠ hR-37Gz,,:sm+~w3@ :~b>&ib;]=eK1QZX;<&Vey[qn}5KY>B^֍֛(jfzl;*;u]` ]\h eU3MA2w,8N\ݝqm7nSQv.k=iY~$M#,4sݮZnr;*⋭׵ʫi7aUVQUwulgcw7}&ˣJSJ$VVY`M+s^weX=2QL鷬x "+H|k ~A6L*=p/A8B 1Qګ~ȁ ͤdCLp*1h֭h xl(ro@4X1*@>}A* H מiJ3ر(A=siy! ̀ yABDS _=!/GN| eB`n{BpAОcTTI:@ y9B~swH.\6tIO1ICOQv=!'gOBRJ3 U*4y}AUjb=fq756nnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CX.svgz000066400000000000000000000075171221777731700221470ustar00rootroot00000000000000'zHcountry_CX.svg[koّ_| d`V,~h-ح_s)uv&1vgݪS^x*~rRz=̗$jYWf717ۺjyl1ݵtT6}k9OG 6?-E|v5Lxxܮv1Ϧm3եϞ?mlZf#۫}U 92Sc&1i>dno*<7({u.+iyuۿuNT9o{,?6>uh}ConNϛ=U Qc:}J 4:t52.jw\7O.|_yX}v LVէz{5Z8(8XslmngjˏsT6 LFE) hFq_M)9: @fo20 D ݉U}QT7v}<)]`gvYkӳT9]‡JؘRzv =fͼn?= ;8u®m)469xi)]9!;XiѥiE1|h덉%nb}ӳPƟBX+ǟ藉_ڡGauq9tsΌenKѢC-eqlcC1 ZsFTkhyL+gY )r*Zli.Ve4^f8 o|2TaqVVSҟP0 -tNe][4ىh e IVDn|TєY&zC {d/CjHw㓌!5i[h_e3fheF.ua\x*PZC%gJ1s<RNI NΖNk@y-3dE}=262BG-n'H P6́3, *{jXX .Ɍsy5}~0\t9QnlM(4:eq7PmLeQ6eL4~΀rIĚJ0%PcvDX9鷩C4 k"(>pyDLrLFD8u#{@o-jdhp"sF(G!dFn(m Hz/Y ,uv, YH 2cw <nb7 nÆĻ -~OtB僕"k0]'#e"3XȄϳNpde 3Įʉ GHMtAQ#> B^x<Ӆ|.kìmyD)3X|[ [C裕ߌ6O@me| EF*­lXDDl%Œܘt$eԁU,=s,BbA8RPΗAD('Pn3qluBLb]n&$ld`č;U"绂$y(QC”SRW$N"QXsB\>|Bosq=vURz?Q9|Bզ|ЅCk>xC"iiυ7 ?E{qW#H\HM.χ'K\U8 nwkk$ॶxG=]Q}>ZB)>Dr!y!6" >`H} > C ?~}q|Cv:L3`s9I.F-GcVh+,_J .m*ϡ⛘P)4#0)XVDH>{RS( Њ*^먖V1˕he,oP@[}y^HHriv`ϯ y*@Ŋ?%PԨ_bm>BT| QKd] G0#<:{<Xp{̚őr9ך7V3s`'. 5?f@U4n &l۫z|9]vU64\]n]ㇿճ?~[ߺZ^ofu^V^>;h1|6aȇ8 (.w\$AdTU\!g{|tq~zx_޾{w_ap?鏷;nO79?|Or<_^>|s:}Ƿ'.Ħy޽Ap|}u\%|~~z/-Ow/ x<|zcwJv|xxx9cQ[ϱڜrԦL]tm6kq89 v&_ھ)`ٷ|2sa嶏aѻre"ƁXqmp3 pߦ:m0Tæ\U/sCϩr%@>\H'X |c;À]/&m9l!iy;FF@P \_̟I6ާTGD91{;|}N-@:i(Ey#O_;Xjq7kpJ+5H&/ ~/Vh=haTU؆,pnI[Ŝװ3 F|K$"3Ggpͣi8Q+\9a!1yCHš7Z+ pVʵB@UA'&i4v l(pM;!Dch勣lDQwm3켾FQCY"ƚ~od7=;PIPNN%CAَTiUщVPE$ %2XbτHXrRJp(jG}1\ Ra||)\(^Ypi?M܅r#Ө'9T3PXjRf1  %(yQH#ԎI&-/M5g$'ʃEwl|PM+ߨ"k*s|*:$ԋj6*@&{Yq2c;F_YmU%O ]凉6{EBc$ '_|1'*M Վ.F˓[j(ՄV'p'ny0C"j֑@jhiՠD?WLwY}'Kb/zjn$v:Jo;"q mFyR3|_>/jNP"qi@^`yqaWluQ,j[GߩW+N_Ňk{蔵ƮJ4[wm3% vuM48ޜB먴n󪳱+u53 u[u[u;ed --%^ڝR uPZ(3eMٍ\ )Zhb(aZK^6&aڝɊxz3hNnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_CZ.svgz000066400000000000000000000006461221777731700221450ustar00rootroot00000000000000(zHcountry_CZ.svgmQO0ɯ8x/qS6%E%4chM{4-q˦ul|;W.Ξv Fƶ%aiFZaim/mUIZKΖQqRm\`kܝo>U voW`)⚀h纏NӔNyj^F izaIa/Ye!N3HK!{hejJѨ>$Cp$Jۇu,V^Шl+b`¡'HMv'\lczgDǸU$rlx p^t; #K2i?} zq&a1Nr<$g'F9P/aM^UXF?͵COnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_DE.svgz000066400000000000000000000005051221777731700221130ustar00rootroot00000000000000 (zHcountry_DE.svg}_k0glXc4 Vc Ӎ=mXL V26/ ?;O;Q7h4. dYg[hPN*]&C >%@JVi6h%YEC\)񥮍8Ҁ[~݂a0rۻB%dYY7q#BC^ESL2`.קtQEaAr*/>[˽2!pέT߂j/0gL)9Y̿?Yjnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_DJ.svgz000066400000000000000000000022271221777731700221230ustar00rootroot00000000000000(zHcountry_DJ.svgUn6}W/]bv]+m>4Ki[,$m{)Тkf g9Ϳo+tJb׹Y mXY%k;tՆji rcl#ߡ2 -n [ -. I~ۉS{esvͶBX!c&w"q#NɇR﹃F$DUWjH^O v{*vjݴuE4v HgTӪxF;߃8]N⯕?:Ey0a?1 ڀXQ($WXd_²z]{X4}TX[B߄C}[{dώM6 hfɎ҈uֱ,#AԒP|Y 9ٽL3[^eYgI] 9"|/?l+cBصč"Là 6}HlQ{C }Mԃ-srZw*X^6Pgj5Jɂ^l&,e[6 =}nKU E\)iMHjGviej N31ȿaY}@+V]o4%ucPbܖScC仄X&~L8ϕ4ĘCIߺqQĠO4J&JΑ!iL~~+RNXzo c navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_DK.svgz000066400000000000000000000004641221777731700221250ustar00rootroot00000000000000(zHcountry_DK.svgQK0+׵7Yl`;EP7f8k:M }<$Ϗ :մem!(ei &"vg䮪hj\̃"[z mWz{}D/qJ<=8fD}G}MAƌŴYKsz8x90瑴sN8]M;sB6-<&L퍾V UYh+p 1|}rS;9:{]ZpFoO@navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_DM.svgz000066400000000000000000000155761221777731700221410ustar00rootroot00000000000000(zHcountry_DM.svg]koȒ~We'..X 0P$1Ʊ I$&)rӑĖ=D<&OW?\,Vو*5*׳leFz3O׋r?bZL7yrfQz9=9y]uـruqsߊkק٨Ivug'śf}Bvg/b|Տͺ)WW(;QD )כNV0R'KyX5y[K bs_/7ǪoǴ콵'f:[OZ<w9߼nQtzqyzs6rl"Gf"nBUs(YQAtON}M-`T? Lm/W__,ֿo7rKF\M/~[lZkvsvfq]H)ݖl[l3|x+HnK"ŘqxK+՗7Ӌly\~x/brwk ]n>$ש+Q"X.M)+T 7 2Q1seZCBWYlO|)}"06IS\iC.ya >vzUŭjK0埋S?Entz9M<]o]h0O1Xä)eJMИ-ćH9lihǘj9{E[ bهCt&ix0@ylO kAB( KGj )&tuñl(V7&LcžrS t;g՜1hr7i+ON JRf8y}C'$:c+Y cö%Mn ي{sJAyl2;/T+J,Yl2/K,z Cb|J'Ө`z)Jm`V&AAW}OYۘnޞbHzFUxxJ'ct'$B =-Qmr. &d %(Ŗq4̦F'A*0!&.p0'4I F^B;uaJܕyVu& #+*QIE5!VU[.Mt^=x.$u[y)Jk k c&)A|2B̃c2M( AKH;ft,&YԂ+c i(;h@_S*@yV%W}9C_-^htO5d(X8Ew&mI2l\m:67 /Ex b|JTZsW$[q^j_ cc$i"lcBZlP4BvC5%Az'm4^NCj/-XIs9L|Cߦ$~=ɢ!`="+PmK$B+Fc$/Tпˌ+W*2-'jAs$ xUdxKl R'e@KEOb`穋#z=i|<Ŷ23 3='WEF6@](1,&!!ܓ, ?=',mzhV¨plpI>MRqaQ_>at֔fIs$|h9 &tL〙?[lP^J4(MS &|ժ'llԸ2Z[MiN{AFkAgCd"Ew3Or : C'myzh4Z $NT 5\"ZQa 2 ݙ*T`]dQ'hz:O{6IhK)bT&7S<?=('@h&ūYBS@TtT=ְ]Iu0bmzhDaZ)ylO!ܢL.)hP #Spga1Eb|J caTk]#~BR{[ E,2jyVyvꁙww\V$zSQ(*D ށVfsk.eUJh Y^vpJ`AKYZU+aicL]}J7G% *Y~ZD}Ö S쪑YaM?ӳj2C/ D?)KRkAjŸJoʴ.|j A晌7MaqPYF{}iK᎕S$=[Z9kEkh+dΛg۵λ7 ɰjY|LZ]k/ w-ZFN8Xu)XЌ1Fml=vquuy-.Nfst=Ӳz޽-mUpw`ϼO?:cy46DG{x9ӑ0rle -ƺF [e_`P0Jvͳ4HqHC/rJuڃ#j8=Z:Gv./HWԽMcOHDZLd'ww7aCÝW"^i׏tZL2zR|2dݴ-cu"p?UQB$eģLuUGk]hҕL&D4EAt3ᑍ3NwB[oB-bqBa ?\Fbx)(8& @,V$gӼY#f)jkmRBVhzV sIEܓl'xtuZYi> >ܷI`ct)s4wg}c`ALP#!$,rdb,Fp!|_ܼ1lNgJcIʕXK3K#6m Rf/Y^dFJZ?}8w$ڴi~uk՝`j ОL LI\ֺ%2xIP=l9QUP+WrOʽP+V5QOʽ@kR\~vx@dcC`9d)11 B>/mT 5`qhH m8Xk %CZg̏es9FLơR}l pZ(PY[hEwY^^=nd3Pv:tFFQ8x#V:?&{7tY $;(+]?pۘ"?F oĥ)wm9cY-QJerϛe.e!^R9b-ǫe-ؠ=7v20qH|ZuE鱂 ~|?ߏUF}Q(r Ul TE88+sN&(lò*-_z{zr;Oeyv2ƒ6qbSB<qV%~7~ 8/kY .XjPABNc0kj&>x_e#=u<8Y+IQ^lS3HȂBF8ۧ8+<ǧt9>8)ձ >FOQFM|)(T+]SLaĄ2Oe$)*-|)إ ӗ{U&C0g=m =B@9vf #3&"G;5#tG,#g.Wx+AV=mgSu^~{{ZA~4hP FV=Rjܽئk943X|k9e:!:Y妆v[ @h0ݫ>iZ,<:ĩh9HxeMZE N?a ;}[W߮Zg|Z7R+5)MjIj%XnXhU6Iph]aq=Z ,[(]وk9<^-*-cԦ鈵wC3x^D;d)?S0ܺ! >1}?*nE(Isʑ#Vy]2H5Yh91kY?Vo-R*WEuLvi9V#غ! ˭IyH[S~eV[C\|:#Y.O?9wrT9 ˲]&mEv}YɄ⃧?,w99 SsƖfb//'Ul Fvk#GPuZֆ=*7drTj6x{ IjWV=db-ہ 0%f)3%wȂ Lz(+;?{J(B #o R\f@=uyؑ)#= % _GpL[zVp21E9 ;YڕS:m`6~EL9jD9LjkA\cY?~w.6sGFمO e$X9A jú>e,OQ7r|ٓZOFNg[z-UH4 ,nHĆfLdY 5=nz\l';J>@/"w{Wܸ C(* 9 :=VYqv'He G+Ņ*3 v1(Lbci=֣n3Kѣe&еAX$BT:Z2M7{zt#t&#.b;`2-9vg{B2)zK&[(T;)iЋ=+Ht^Z{h]1JَyoLLTjV'a X=TF<າ9 2ppg4n n8&CJ}=Tg3y/78a2HaBTS_p&9blGV:s )G'i:#S (UKSǓ3l:Fq$#1Bi{؇FzOUDSaKF&,(dk:`wIpnxarEf//oW##T )og 1]2U2 V ݌/a:;r45 I9x?MK@d?9SSNin`Bx`toPoËra(>A=nt6%aZ2Sq"Y%|R5w=`[LlɝG3mQp1?XbԜT{c:0l<LJW0~ɛvi<'@(<  Qs7d03Pg#Ԥ`(ȷ EJcka(/,x}i{+g ź> Ba$$cbJbwf%fU#qkK ;D}z}'-yGz12B[g^wr헻S1#u*76933Մõֻ`}`%dlD냻KK棨{>֥).֞L*ώ(:3fbn)Pەg` E|fr%v#_*&2.3n/ͤYL;u[(kHgNgG+ʍ$y9H+*dU\zdh+Ib\:=3Fo)VoXaIتat341f7 >Zpl(&Pf\U&/F \xoq66"XOآ 4Ti:ǣ?_豎Vw`ƨk.fqÕAld}R$Xn9lrnCϹ5;w>~V-w'g;  P =9gV3vO5;??navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_DO.svgz000066400000000000000000000633431221777731700221360ustar00rootroot00000000000000(zHcountry_DO.svg\ko[u>e$(uugr5`y @1A3)eϯZKeqk{*.~gxw;mWrq9d9-/3֛b:/pwlbՎ7t0 q=ߵl6wͬw3\n0`b:vWs7]l綱Ujդ.?\M<IsΝ;ÈflTTg9w#?m¼?=ӿY}4tg^{ x1mwI>qήo6~M/8b2N?ٮ){Aa6#Wt94xخe_wOUݟ7]NxMvMƋnIK{wx/.~xܫ) `ƒ {-W/ݦ]A;֯>϶ӷ,0[Lg6Jwv}3ƨˡ;ʜm2ﯖi~a,7It_q7 Crykh_O`/Ѥ'[á|M))>SMW+l>~߮r|^&};nx:ތ#ޖ:(D?|U?dr#p Vr9>Ϧl3oo x{zm`_N6`w_b:߁/fcn~}^gݷ'LƫU;^|||`[~|8Gg'7uUGTv4o0}wշfwȉxavy{5rjOi=83r S?!v+ 7S?8tq_#u}{~w:팓&ýp\䇟_OO{Dl1<|ǎۅh1ƠOsŽ kWt?Drz?aT9/YlA #ZE|R띵UܝxpYB?M7OɄ>ìLY.JҞDZ!BڼokOuw~&z%ip֥ [?E],C~J1.NRl='s) `? o$;;8pc>}KRpaZ/G78x,_^]R9mYIe}}.ğUƚ) dr8Fkr66/Ҙȁ#w;{^c-[ƠFw-Eƺ])&~EMMwnPL.SImz`>[ {?B{f݃<5}O}#1MI1.QIɈe׸=FϷ({B:60"-BF,j2J'K nrM(H㏑o_:tb92m(҉0#3S|(2 9Qwȷ/B:o$䲥tr{xD'.AMzajR#߾t &)e$)M b('\Ivh>DS |>F}cbnd>0)­ADM)zx!9Ii ;O&K_ xPS."oBebxo(xStlQ(g qٵu 5FN Ei%O?bLJ@F8<\F 9z2FJ! DezQ5 0b "-gT&(]9K:!ٟÜXnK~='S>w ЁҀ ";J* z4^ RilLbG0"6j6Gi3HHV dZf@*#F/&'PCˡ\()#P { 7ZTb8XrK.%$гdj `c3Z+n!,4FzKahCosFH>|0@PV5B[\d~wur,ak=RyDNI-G ܕ(irS"2y XF+ X,waW<9R } .R(,U};9cdOg[FePQh6[jɆ "~APj HDW#DX" uu^x:@rv8Gbz\R"{!SdJ9(UOR`P~A(~҈r%Q@`XkeTwIQFk2"+:A8Z2mUi=/: j4 >"FjtH۵6>6,yTSqO݊ '<5+>,^GZ%#S)b2OFjTO}'}"M+`ԥxR|! ʛ*ǣjv+Ć%*SfJļ]ԗG&eidgj)r(8ȋXD!0IIO ME-7 PΈXXI[/NAc,ZE@# B N ̼c͂zrCL'$2νϻ_7z?̣3_ܴf6;g  ΙDmA(\1Pؔb]7砎Xi6 PxnQ@uѶ_ܑI،Hk!;uǫA≁Uz!z_ kbXw+dj.HF('6$?a.@Ctu[\C(ynHE:xcvsZMaQZJ$ଉDwXEs8b5 ;vlp MJNEEH0."3N$p#@N(QMsj :!7T(Ek!SW!"rct|l3K JtXpu\@ $V"):K!wiC"I +?:7*-M]ʂxE`!Sz(n%Mhn#"II)뼌) CHˁerlf3D , 9U+@^QWm jA;gK)b==Gi @5pPQ3$֏4ӠA:{bD w9E(;}8wV[mzѥ<^p>KwD!bB?)&I*-dy>!^ƠPH?iTͥ_4 VoHVokK,.98*UR O#{("LDR 5EkQtvWCU 4:~dE* f Ltj.^=%s*P5p=OA]T> uA #RKAFGZfC!s$4Ǫ?tޥ8c)d/Vz/! Iq\r ?%.-^7FET6f;R Qo<\  pβp;C1+CUݹB#@W 2(O]aܦΐ!9Q!ڠ]Ⱦ(n2mKhRVlx8Jeq;fMь77]V`$FH"X+!#P0] Q!M"l) CVa TAdxݼ콚.u"*Qk$%jWQwF( xș*rW ቯX0At6@6̴l+uUGA]:8D[%&#4t!j8`TwM'UŊo |@4T^\]H%(j*eD%4'&%V.t 꾫zJ٪!jxRKhVB:J2Z#i%4׭H87b>>Rɪg}^2ӄ<(b8#)@^s"eMqYC BbHE?QzWP&"HLJCe?2fIp6FEroE(mJ   a"`E@\NS;&!Yr%{ku;p9)<|P^LԌm43/Q,g#ώ8qAlF%`Z1%<A_H i~ήƖvuHd@fi&ip}K(xpVDaG iS*K| c: 䫁$ f7`QHd-$cHi͋(fİZHb`5PП7vCVE! .$@)TGtI&5:_:/bXkLEI0BDP,}P|Ll"rjHpr#E=G &,zߓ,IZa&:wNKGU!0Eӽ31(j+Z~b</%D vD>ԧrpB[5OJ+ki8(nic/ NaIð *]uÝ:G939Շf,Xudx"*ڭ" ,;;>}Ҟ,,773nSu(p}dYpUqvlzO,!1 cc'ymӨƅn>ӃB&hըah\U蟫Oj,(Hk LT+Q˕幔{( ;Jw' S4,Uw!/iu1jUz/ʼn%AʢFb|BT(YEdْH)BЛ*B٫`5 ]"(Rj>yO 3 D55ՖD&9/'t@LŒ B:Ł=toꇁ(jMdZثe}-@ʎLR8QQŨ`εvgM8\?FOݦѠ-ոw{_%?΋uCh%X@Ё-lbҝZ3ތo#;B&b,!;~r2\0yjT!Q̘] ١ kA|D0}&ETu$GDuidsÙ)&ڱ~ oջöf\Yٰ\įy|tAy67jڅeB4\*Ԏ dMNo5HşQ0QN/N#5WI2_M mqPyorpR8>")\Dٿ(m0:+:`0u"Kmћ3>vΈ0J3;ʙehBSȍ5PLv|fj RI >ɍeEF!mE@V_̲H^_-UB~'O;ʜVF{^f#NMHI#Q`+5(yZ];|RD -޶.xp vތE&sR&]2`0_mm+D#DhZf c3)k^*ނlpmy5q04q+SqCXt4lFjypbk;V&"ѱ~~.q0c#B/6}.ޕ?T1Bb[`eD˹k-_&<(y&?&:{ZeGiт* bb곱)(&GӤ0=DS[FL4X5쨱01$Z>My;PІ4q5YNVthi]JPgcؠLS!brK6 <Mc 'Zᯅ4lM@J0nRQ^cdzB8`}~tWWX>AD@芩 $ ʭLIC!/|쮖H#(VZDyC9 f2urc*BDz&.<$|-|єS AE5N{A vLB=Nz͖LC6<@D!n**m11GW+%ֽȘC3wVR@VLǔ%uЎOu, \Vo LtZbSܶ&a4mIf3 ~),wnd : mfALdfv]&S  lرzVt3CP L>eS"'i6Euy׊C^T S09124D=W;[uzjM0ζMccr$6;ÉS$2K) 7vPۄk! x^D&rivy˽%j%X/r ¹ZVy! w3CSiB:Hc ߛ>E$4fxXDNW+ ,ĸrG-)_F{x1RlRv M6n\E!.q`SinӎN>?Ew (H&Iv!ˎKX}OUYRAB"LP6Fnfѕm +  _n+X@\SFYu}kv2쇣"eK:{ZNc4z)Cϧ%1qW1׵1?(,f%Cmb"U6ypy>ȀG dLh IѠG`K.N Ϭ0k8]GWÛd*aIVbN S&%+aaSy̾ Pg6P˚H@v,rat4KpW(IdE^;zlXT> Q=jH(؄4Uvb%.O%zt$Nʅp:ZGFcI6"ӓB.۲5 ]&9i)w ˒Tzhim=/ ISK&CR1zqe9Qy`NljϦ}W6kk=>,7ڨ݉FDTI?3k%:z SQWx&yp䬒e#˙m=ˎWYx)&j ^JLiLTdvs3ہJlƯkz]翪_`ߜbyD(iX/Uk ?yD=g=*vZ`Jqbbɱ("w`1 ix'WORSnK웢y8-(n6܂ֵZY<]++ߴ eivD]\_Y__wQַү:vd>/r+W[L+ZnۦbXfOaN<[Fvyo/lgUCy CE责O)؆R/<է0TWz;1Nv[DFjbΟ+8s̟\i~.>~^~rh3G!^^=P5Ȍ"%Ы\|?~bZi_ڻ}qKqΟIb  \yNV?l'Yݩ;;rT>*dc~&jNO:W!hk@Vd<^w:-ɾɸyRO*nI|Wz)BFk/x'!Kk!!BHBB[S9€[Ǒ? qa!)-=BSn,^a!( qB7sa!6~cZ{ ./-=Y{?,ִsa!GX2凅[Y{?,Ŀ qj!6E$!Z[& mU*DՂ̻Pz)#XEsWrUp-xoXՕOF1*['a8Ư)'KӫGɈP"a=Z%Uߣ\ W[HF8{h3ެbkvl43AL, mO(am^Q;cUpy>Bq45-AVl˪*Rz|1>HB >^kWD#[zowroIڣ7ޕMY`TTyY o@ism,Jk-B8HAYOOJ_SmKZ-#jVj㣫XEIwo(Bl3FH'"Q S'v:bR.k@6lbX'(5S_EE{7-FаE8(\F_WT[v=#oufnUW CzKAue4uulP6!#P6ul"KՓ&{ Jbݡyx9)TMmd TuJ':P3;^`fz<,ZLN!.kA\TѻY^rިx!JT~S5x:"#rMI:Rʺ #ΝQژn\.Őh*}y"&X%,O_`4P0IQ~R)Cĉ13GfjwCI| h]7wM~hQ}ߍT.MZ`.j,ϼ_֦či\;T1u K%p_z+i8( 6I4 zRRBNKB=)6nr׭_SsRJ[lb34EyHثT%ʿjN׃z}mzIK=nH2b$wS h8ֿII;"u~p>\4Jѥ4ZIh]~-g||t  \]Lsz,rv5)-/]cf.!wyqlHuiDi:%/0CZudj!a~5ߢ\$)A1siNQd2 GJN3{?I?I7椣J|$~]OeG} {BDFe~QYS ۧ/ jFO BRb{49؈ M%?p o'Lݝ ZUƠuP@+>GL:_~w`vv2my/QʹWqTa|&:{Ͽc<56N^>EEM/m#jQ8=3[y>דZ~BچA!QK0YIDž&hLb` ogl̎+Fnއ3 (R Kcʓt53#mNZLO~cM )6$zO{$}Ѹ=R脅(I] P"l,:C$151"VZ9DW,Hƚ@m76GPSIceLͨ}jNhg &8a b']v4 N  46+5ZqjAOR!_ebjRтP졘LvL+-?]LɞddFb0CSd>=8&@ )ҧq1fu;v%\,c_)HC8b0$/(%e`$֩zB]Svщ$36A Af^*S2tp+{ /p[)wBNTvz z<[βg^1_Dm!{C|K.%Dqw!2᢬MxT г;>{Jj<Mϼ|>*c=9laX?I0cfA8ItTod+O:g)WwEOukp#?3Q:<;EmOknNt$IxĎ-Fqr)[LSI{{;MN[M13L3wXP'oVZg_3;:rbC="YoJ4MYN8Ըk]FcrSU4g5^SXjs1 gb*PY=ZaS՚NsƐ r"yl;hݧ zTo~^jc 9ՀCKK0:_CH !xOD_f)wzOlmkvؗ^sVEYxZ\>3G4YBϋgFR|N_Jc7˱cf^"zx<_UNK^ 1!T2) D=m$^ FrCTVa] n֯ܫf:džT,(5і$'rhW~4> zscA}(DgR=MK 7)圙84 XDw+=FG Q K7|w-G>v=\!'=V ʷ%2̺UHw6ݫx`DcB~?|e-!)pE 5cRrBHL)jCbkľNTtF4Q~#HN$KF8i$)d|]F$Nڼ"<뽋;c2oS _=.&Sd;YĞ^ ,Neg!6|5՘=;4/O]Xcc#, UMRMl#]U$DH0YWk\Q)ZJpssL6q^UeFznfl| C\\g*ao-yBc$+nCJ-nPnxEMI|Dn)+pjfMDbㆰ H{PXYVaO|ԋ_ aKrrTamvd7fbL3m+ʉ7yeC|;<2GէSsˮʃoy]7u, i+ab(P:|A>x"W)Bb(ί@N_"؍F46 qɣht#,!x"7F5=JeyͰ╣bbIuuGEοG>x"Nu>V&R&9S+w"vn7$LO ӟ&" QUqOlfG>x"7ftѲ{GMlQ(ٛh#KW'rcQ}.Kuol+cV w՘N$^ވ‘ rvʲy4dJI(PЍNdy-?SmEfqjWdQhD9=OcB 4nira.VxER2?g6M% $%՚7˔&MU 91K$GJ*za2Ǟġ$8 N1{Nz!$CM(7) Rh{)/1^S="zHƂius 1͆#bU=0eI(_r0=pAwOE{1>DT@sKY]!ve[6))I1eVyґf6yBp#ypaVzq)QrE7BU/J!px#AMUiJ^xK%qEFZ y[F{CC=p4b3fjbDT'҉"hI/l|hS")x xZ9CkGljE:mۆ)D~XMZ{Ŋju lg?<}k$:wi=oS@An Ә8mO?: d_3,鄐ħsG̷ɬq v9Oz9#E-VO$ 7!OmOG>d~AwO9 qw݄DehcE,$DC-2h|QX-iR  럲”lALVVnL }Zp8?R꼰 &c3z!&I5% dLWQ# l_n̬\Xwq:wSJ%I/``"ovo8U6~2[T1N±^=-W\晝WM?|b[כ񔼗:m6SC3r`D"Zsb\w)$tL"/gD^++2 vXHMגQIqQ$<ڄIwȣx+ÐG5 6Kx{Uc/P, `+^l,!-]C&nh ʂUTӿVOtQ혊:(}GwOQiR#>ZU)v gmvOQ}]Ҋ, #IՁsuϦn[YZn5FRlբU!(RRi'601\ry۫gLU_S~$=t"*~U;z7'ƱUy0< \)#w\nOF Q9 &b9'H[/N äر] M 1eeMSѓ1O#*# ɸ0o+fF$c'}R]E3Mv9)';fr џ)cLXVO&mOΆL`QvڭP}<9(} ~KĖ.ߺb)U+prI yf[IfVd_-AA`H-{WqnD^IrqV ^ #Gi* .A [U/WDqS CkQ~Ƈ%<` ' 嬺l2y=%.N_T[I qų H y`%='恭e}QJ_A8x|ܾx: 0UUUDo=4g?#^Hv6 ;Dq1\3![}LINۘ'.qJی}m%7b!HNy/}͘`!MkىUWIlS!ةBÇ`S3fʄT!v@mو/dW.oSNLF̴6֕`2n >DO$}겝URK!O ;d`Bx%H}<U'TuIk.u8_u =_razniy`NDxa5jIG'B$V$tpEgo-.yPjx~1;C6bd'"? f&݈h)w8(uY6JAk'`O-1ұ^X'z=EqO9!Sm?UYqw`H{ϞfG85xF86 Ówh9Vo~)eL#V'SIcUlR3)򦍪웒 Ub;/JQ?{caYSkF[z)_ZD[嬒zrM-+lOCN홳et| W튽|%Pal}#7f6m#E45y\M|`V )5| ~I.ֱUgM( -_z!?[%iz'}c!%0 jn#D\MV [Zn8=97k Pˢ8]7gvN`bwn1Tb?5M?L1_D^?KPI[7c =3iy.l.vmw/vH9惘q(YLqY^횝Y5DQvI]$>]{Gl!,y." s{j04R6f ]kH!~jhP8`z܀S&P baX[VS"5Z Rlo0ey/G.$sGV!E5QQzOَeS*Ŝp#pp 93e<\Q bPCod{~/)΍W< ڮѼ-8EUGٗmt9N{h뼅a[y\D#o{`GL5\8S|~E68gr"$j^Wl^sRbԞA;Gz~nWzOٝw18,q{5N;бy.")b+lģ˧cv2(vyA^&Yg:*QӷrE^?}iI/PX"(%^?vr@ W? #gqml1+rN-{ٻX1l#E$淜ô#~۷vn;b?3==]OEp9X9eώi$~nXI mfZ| Z{:# DS5ґ*آ=E&}kiE㽧\BME l+¼cBOAi[K6Ĩ Զ/ء>|F*rA^IkM,id׏m]O䏬o?O۸E^/E@;.0,yRӍG~nWm׿ZP?.4H?s@F4miKl*3򜀡 7-܂Dò'l'z2l,àjDZq _Kt3h#Ӗng[ǞC%c^O,]%%6v߄~:6 Y򖭛 x7ѧ_%R9PĈ=3OxccFi'ٜx3_??.?%:7H?(g2F~U)L]?vjPߙnʋ65oˀchO={Jсg|=W]Ǯ~]Mh{؎*[TkMnmjpSS7GJ~ѮUŚǟc lcǏ=o`I1>6K}p_8OO](k ~6?z\=eڍT*܁0&սv5I r:܋9u!>+tv,ɨ,fZ0f%RyAɗ/L>.M~ ڦD3D SC-R?i<仞{'>ӇtWTh1B'߾0F9*"gh*j)frA/L~?IMsA0CxAɏ/L~? FT_!0O? q셈e@+]O~~aMHD6*"+e(yO Ud$6p)cSψzɤSy7]J?bLy)hTB%59H|O.|]!=q贋KK&U:{VLz{mE}!ь +N=&a)Qvxk&`}GnrFL@5ne+UxT=Ƙ4LH aednKA+P?E-I73KDĆ~OJO鎞yD 1׮A=FG,rጏjZ #ddUVMI^dפ2BLզʔt>U!MnUD S2N8#QQJ'L U.Pi|F y AdOmKh.5e2#nc([;47,%l_}h3-DY Z5=ˤᔕzuS?:<ΒNWf"~ PRs{}XJi |yzP:~<-=-M2׻oT3hihcn:҆{ pܤ qFwoM5Aj+ΠI3IT^j5mPA/%tZM({{51=eMkd})jYgXz(SVbeIA{`.I0(T}8ixѼ|MNUU3O>nT@@3Ytj?ѴȆmFU%ޖ LeMإc֛NGarYWRoj4ZӢguEoθH)4S*գkنe0д-ZHچlc4_2O> g6~j<ԣi}}**ho7tsׯ51t-3{8]InI;7,u]a/]q-8i}O̘M`ﰛW7襓v$&L2nco5/.ϫԍ1Ⱦ&uy-HSاg:&:lb?^#,JE8RTͱ#0_W>i*mkj˻gZtQG6!N{љR)g\L,e5OڬcXY)}#@qyk,VSr77tz~XI 3_ŒyAI@}*$'_6IUXI頩6* #jQH뵵uus +Xb;?Eu !<*Ek"@ZM1pSdžΠD&N5;0ژ'q qwLXDuQdT=ЉC%GFWP9 ݕ.Pm/ Y Oٶ%S)>L"*TF[gPl7KfEC>u5m߄Eg 9S2 S˨dRhZD!gRF/S儤101Y󸚪cy6)烆owK}~./&nvX[ [ {)M\k~]EQۋM52:-cxkhRѥZ݄7ke@LHB]5(8)tZ.;zMޮL(Zt! +, 5ӧpC)U ϑ70k@8*%BeNtvvr/uM1$d:${jm -SA;$_1pc귂eiUE|.e!$얺8)Omgkݻ>}H 6z~ѹD9jCψaZ\}S h Jqmz ږiJt"͐sm;c4&fȴ ؑANH̋zvei!-ds|fv0bJӲeE.*7 V䪝{CE78Rɛ-2yјbX֡CPvYV5x^ ǰ?[ J=[BAZhLjA#_d_Y)c4%ݙ2jBUi =@\rH\$^w "M4e]T⊪mb*g򪑜5!g\n/j4"^*`iӴqvbB=Wo7jtd(S.Y `,g˻J!o6aG 1M@w٥v뒌 I7J{-ݥ 3G٨=zjΡQEUpև0ݧ16yKwϓ]|ĤnG(8?BbsLMϦ4&*¼#N.-5c/lp_K)R)ۗZW`wQz6݅{uItW;>%Ur!kND0$V+%+h[6 %Aj~9$ z]_6M8FE%L飌m$kK#8=Ll~d~Pgh]v]W2vבԎ'ڭ?qEN$#&e*TL=,Y4ץ,旗0i+|T'DNXs3 `7D1Pl{ɮ&~!ռ:t)5I]Mj^+/Zrp1d$2=' dIƛ@'GgsSK/Mmc`ns;TMx&#d7RW.Ƹl.e$3ijl E&P={\7.eP}Q)zpjerQX4S7pݼi})ѹQiLTW+*{v5(+e%VĽ'>)eA_zpM fqjQ$3*h4iX@9 ~#H !*ɑ͔5 j7ܖ)~(Đ2yx&՟}q> ,N`#Wuf>ԶGj]ZT+; 8%ه^lסP0)Dl)^2}.7}]~\1BjmKP!n¶ޛmu?.z) /𸤙=ºM-,.ٖ"慫;̶L/һ`|iEB(Ү qyϹ8}&߭D]d9*$n~t9K BAsl*spd0YpĤuaƺUܨRSghaBC_f|iX<אh~dR ֡:c6,$4rt2m1uwgQ2{a۰mΌK߆$?mD_l>>P YFqmĊ067BG`j[ ~DIGsv|IcޙX,DlsnW^Kck2k3as32KXj~Hx+ KS$ <[[=_1f_ڟ6ˡ˷۷/[;&Sbg[ HBڜM]L"<|>ǐ$"sbzE}NbLe_b',ex: ѷ;g+,Yaq.S_2`GvDتϛn8W4z\T('[')DUR>/ZmcLhjVT~@R$+n={܃]SH[QAHMk<&qdnHBJ|X@jΦ^o0gLr.v#PކS!nVD PnfQOZEq092%@R ˙sa$W5:Ȩ/epYQӍ͆UYYݰcV\ڹάCLp(x:ϔqM9 BΝ^VE/8rpf!3%76zj5űz:D4my寷kyϭ1\͚քZ 9Jw:a#ά˅st=XMzeUf[A8q[>m@bR66LR6ӵk7{c(Wr~E%Ohthm;$oCАE=SBcgTG. k¾Xy2kS|}WLUK[Nph>Fj^.+Q&cp,Nj䱹BY1X55qCM[iJ2jWfQ Aʒdd@b@+?(5D#zAea6^z?WPNMf Y](88mluaN͖klS:PZLRgۂGh?6;kqʘwqd.jfے|kߨ+nb4Cbm~%v3Я\Q tl ?CSE]09=:vxLتu䤄Z6 %APR7&`/]@](ZUWs^(B>)}tEOkNwSHUܞGH,Y U*{{M,=dܮzP{LCBrSnuJHXDEPVyN|*LDyv%ڵcH[Γ܈HbMiZ%Bu%dy,eB n77]zlºչ>P{/\N2"UKI!Gݾ}|'w>u2تSdg=,A$iV~aA#,xi#ϲ,QF* _M?Yܙm G9 iiԫ31d/3Tv&w8#7AdApoK_ú`_@JaHRh%UD bęP\ r"8.8_pE@q z <9^~voir+~ǂ13BZSz3Pc\ed*c1&!\ǚgh'dߒkEk+׎lV @&\Iasc=?sy70ޓeݙ iЕcN?n"o4v5I+ ^̥|俻?ytx'.0navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_EC.svgz000066400000000000000000001673001221777731700221210ustar00rootroot00000000000000(zHcountry_EC.svg[ێG}Wذ:I]j@ٝEZdd%~؞"E^iәYy8q"3OVnY?ԍhb}z*]^bڬۧ埞}߮.&vo~s} 7wח_]\]zw?:?lWf{{_]w׺חcUmwnyrxʣF:|̵1Whq_wbc]R;yn]84_ٿFY{~ݵRbzzݵټ>ߴ7^)yxz)ژ7l|{tx?1lvW o,}_]~jua=ϓi}5}yb}% l~tvqKXÿY* ~TeiјKh^>D[[C6v fsGNg2=M4yN~)Yr6_>.׋a9ƝiѝeTL \c?l8ӫCYahaɎ^ڼ/]wǽlR/l1ώ :jh yOy>f?`jݸ|v,7~>+aM~y{xC;2XAWg~~ #.'m ߿MK݇WEԣ<t{n?O->DzɧttVݛv}ӵIT$GL[-g=`Vfmnj&}v09Ұs _8NAnHv܆`D<$lly7m)~_ }` Xݒ:]_V\fٯvqǔ̟ofuoG{}Z]s{֮y퇟zK֬b8/S-kډaNltş2n]zށ=ߵjlA 事k&,Zwa :?7ܿkX^Zja޴f#6eeqǨKQV%Pfl'Y)9;esFsZϰ欍|{l{ ~;[ f_"2:Ǹ\d&W,^v9\lԀ B|\Pb7h֙lFcٹh<9Z32Bۇ&`840c< st6Ad;ZÝ wfz !^o>EWNIfdsb&ϫvXW꾣՞1{0w{ǤvKJ[\lxD|V|ca␔fLi!f 0Og\%yFPp:3`}ma?ZPxill?Ma2:Ә1ku(1gX)̄ABoS6ځl`FS1lrÀd \"`-f]Y )sg|GX V+އlr%pKhB˲|#8Q :)HkQ)2']yzy 'SRLx";N6-Q`r*揩D96Gnzq`1Z[fzpl(?xu&U:ϟ9 k-;ڤkbuN*Q%cm- Tca6Fq"\㲣M?)/1c1$SEYǘFN/O2&s 8@+Z.i3p7-r )I[SoGi0vȂXWu!aAnFq<&BbԇVrHO5a+3d+< c# 91ꑵNhwa2>jO000U+#LL3BP2
KohjJF` h&W"28Ql22SAfKŌ)B%9:`P2$I$0%L3 Qi}[0:[Wp QiE*3{~pigף20UOxiK퇩#kX6a *I&gZ",h1! ,Bm霌"mOB'U)T$he'%XDO;N/2Z'\{I@'}15H[3W`hF1Ո#{ ]aRy(h `"$HzΖ$}>I8!hƮ5lCdE@H[Yu")jKs`mh961V98|WE (Tez1}zMδ: =EU#RZR$)fkl%񑧘\ãR*CZOȇ_g k ?KnEdx8O Bx{ɠʔ nD,KEky&\Tʮl;Xa1&'LgnyT_X2t4 Y/9DeO}F1QdHeuʿMEOY?)2L CEM_9BɱVt/mIO /zzlMꤿ|(pCHzez,9ևs+_驱.W0vo|T8d ̏L[BVXt|WHX=Q|P&V+$eo C:»{N)tLYzSdnz<;X"%,K)§XBSufoGNA IWFوH&rg_p:E',9;fYU5'(U4ȷUhNn|Tbւ),:R[*:0u1iΎ+T׆(HED. *X=qo:=sNeg$5HuۜE+B*VQU8Ei0"S-zt^1< C9xyVe1 %0EI6_Jʖ{چHVf3eJޙJMF[&(%dZ%OS90vM&Sc"%ARIɆ()sȗYTV Uo,ӧp,!ODRR_ߒעtRT(씅W@vllWAor`: n1Ej%H,h퐒`"?~Uoxby(VIT-݌v9jVP"8Io%*3ʑs9|hx+eL1JΈOItk2*(Mee ᒂ*(8zA3;z36_eFXP)!H4ݳ`:BJoTTGsWr/TQ /,?ZV^b)$rҚXm#` Fpa!5:NjT>$5ʺL,/8C=ɑm5?g2)W 9+˸<',G|zIdϽI)f);VH${0tX/)']vݓ.?=KzVz;R\ەK""rIO&ؘ5֕׽wc'¯zO(W- QGWՒAoΑñW-9zTJeإTK"(Gi0eJIKޖZ"?S%=Y0iUm>k Wk=q M^"tlO-&gZ9Tb+)+HbRUFcd%QR%azI MPW9Jއ1L&n3Wc8OAFZ{(s2:Ͻ9>69^b)]qS)nϢC<{g/O3*׉"h_W@rUF++fi^:V,u2཯LshA^ث]'Fu~gy坫j׉IWV?=ó``Lx\uJT.qSV* jD݊)$tܭxvt{NjT!nRE6ػ} 88s|^ ѭq^ {[H2zݪ'P5yҍYw>jB:ץCw$h/:L7x˩ ?+ڋlbl[r%aY׭vkaChq9^3RP팱ծWen.jJP-[+ڕJM/Pnl1SV`Q.,Լ-_^^2I|V.S&^%2Ē"z'C,ʌU_^^iu+YeKed]j4 l-T.SխbSź 1T.C̜zX 3\!-X *e O:*eru:ӯh ;P'&Y)mgmau\I5+a#+}Xn[ViavG#lhI~2¦Wc>Ӆ#7#l=Жn"plG+WVd;<`lMlŴ`es쭚Vf=Ж fe#Z%bw6XLj?`h=Ж 6?`#Ql0"K1h @sS&)Uzl*Wm%?'쁶l3d`wQ.,vfɲjcʕ ]O땳u`v/XZYV.lNtB?>ZagҲÌU'; [U~Ee-O{Qf񤞊铣XjTVéZ]!`iVrҒju{E&Ե{:YiQqK }ʻ JKBݪյp^y(eR*?g*.$[:ۻ{Keu&\K5o|dn)S-%[:U_Q/Q%QiqT'SWT3>0f*eJu~ĩSUy([ ^R_Qj}T-U?aW:V|o9S?"{rp~v<-w+Uu>*VAm[ݓV{mbW:h›+B'k,!Fs]TՔ '[1Jc֢eSV9QJc,g {(8[ RV.z$S0v /Z_O5:woyI3T(UL ykҡ!+dI 2֊-6U1f%_B7 ܝ2Ψ.Y(6 t3w]^C#Yu;e-`0T"SƳ蔰`[{b!K0;%͙#1G$&{6pí,0U>t=3Ug\!_P{@϶g37rAm%ܭAM<yr<{WIN6NP]e @[{ aډ7V،_UM: *FeJ}pn`'7f'QpO3y *Wp*d`0QȞN  $~ҖP%dL?mRݼȹ^ ʺI. f-0nG*3a~]mV*3a2'湲6x`Y4[y</@e,Q4~1{ ۳Zh:zF%mhSĪȖDҸ#U/$xS謯VV/H}9Q&;R%UUc)U6tfX"rJK-=Ru 0s i=D:ލk>S;E;y.2侠nGkyTnule+Wk柇H.K|z89H+M"fTn?|A{yʩ>ٸ9n*5s4n+fTJeMdž Gau݀Ҭ'Y^PlqR]N DK1r|IxH hwo6D^N bI9滷(a=WoCKKT(ZAWTm+n0KDܧ^.k yuڢuҾDJ 1-S˯ZR7rzIF{iz 0[S TLgP/H;9=Ϩ&N'7"Je̍f!-|M39FYŒjҵ6UܚbLAHI_2AÌ2He?q< hFf6sgyTYаqw{%2f?($5U&SeSp.6G& {i9 !gff,`V[ԵyX3`EsI:Y>/w8C̷ٝsO *6B}Mf%2~ %wkBᖖN܂c}$WܡŖT^Rf酦ml WB1S*0#irS ?~,"o\$2ϋg1E 4V+CUy~ǯ|߉n]OK=.J%Y[t'}dөK0N{g,5JUx"T$+S9&A(}Nj*]k]KHU:lʓvD?^mZ%gV C]'v;EDC~fùqV?N+X|VW Lߧl)/2Rs49/U9ά`-pVJ˹VM:^U'"/7v~wv4Roy%[O+mfBivʃjoM|hް{I}n4_& IM߆$g6>&%-d"pMJkuߣɔ1ԙUs7xWAxWv w&%܂9 i/sc7lq7!97nfԏmMCOM I$:e9?=`5i/7B>Cah~ooR ꩼ .GOHiMﱭwN.{T^C}ϴa+ oe1Gl;rLK>{E>9m牭D$6qL4퐶֋$ͺ<ƕŸq#U`|A>_ 4h}!+"m&Tܽ3.+Sbt/:R{齖jo/nT6pXƱL P>[Ilk53d~V;}r4MgЬ֧y?}X[p0;9Gԇ' Bzs&8OQϧOܧcf2Q):3eau^PNa=4y}A=? e;Nu[{=*ҿ\Rchu6^ }E}8n4Ӭ;5/* Q%u.Al}c f!gPdp/i,j})ȱKNsB-wD'pڔ炪3u: %UGWΠvSWkj^> [+UMnSTݲ~= c#'joUp[7Ar[e+{v\,H݌AaL4́yJyx g)n !% a&S$ dG+;6U3@TLၰwyjf'b- i)h·FߡeWlJe;*2 yf䩩!++5Ȭ+iyΫvQeGbб0&R Q? _Lyl63bY &!1&jh^^/?}mc2#uE}[rIT~ sRqSS~i-NQu2՞j~n>BՏ_NԸsU΢Ձ""qᒩq\ogA,ߗ_@qq'2;0F&8j7Em@q *+V{_#[zeLjLĮ>Wo-PwaWKJL~\PwZ10'i DSTW:@;#PFdRraiô{*+]FV^"7Sb;̓|ROY(H=[.oظ*3a;{f"i09J[!G +xD<艜 炪Ԅ]D"zJ?r9rIHfPf"9n42F"iqA`T-dѭ;v֐1ȣ3nTÜ+9nt.y҉{]kM /T'$E>纐t߶!EKanzKB6%%h-7%Um"7aWN :FZx{wz㞰*gT%rg+Q[}Kڎ~xT2gXwjxq.}E|]yu!2Aլ ,8ʦ-wӦy~Gє|zLև]kmsQr!iq^@anG*a $6,ԫYPx>wn]1BR`#Qaff`,T@Aje^AF!گt䱞Uh> vR5n@ [O} Mhc1~g·?|m4^6OwϿoozo~㵞"?+* ioB.@{}WW04+|7NU*~̿\_~@t/Ħ5vGZrjǯɃ3_+b~~Mj1{~.9~_9cLQ,?ǿ}&TAR7$}bz%w;DBBCʼDm'sz34 R]5-|N%& ܟx#z,4;@r> jr_h&j=?c|/'7c9f-kKH+zZZ2g]kigr'HanilJIi(~DEo#R[b _w{wE ;>˦Ob%s ƀt UaܕҘ\Vn8G^CsDt-fk` eJteaoB/bL?A(ESk!sTfę Fs\Li4wosꉅ&\#HsӪHyJ.uw9?Y.}υ#>H TjNU a4$ٞ5߼nhJ4{S}?\|OG0]5fW~aCQpf tЅX߃D7W;ӹxgDxX;gs`Pk!S9xSʷ-Ar;|z:0w׸ 9#($ {#lD-!f(pY|9W6~v_|?  EPu6G;cUg78Ne1O07[s\ۏoh- `봯{{<'#&׳'d7{OUο{dEb8v{o`-Φ|RP6sol3 *-12&^q1ܻFfR.(2U4f2Yh,A*JWVxT4ieT7qaPL(7F4ǀZLG2kN-H2Ԡ5.3'YЩ${+Vh0XmW'V132}zbP&0!Nȡi3pOp?qhX Ik=^R~J;O̿3sb=VeKs c5΄RSsGE70ZU$P"ߧ# ыz| ar'T1rAZiA v44eI[d6x!&#b4"($OObY5Ɇ.;8`'I-7Ǖ%pfZzQF3Z(9;Nڭ_ "339,dz M(n0BA9L*N8NhQI+^%QM`׈@~w[od0- >Nn\Q Vys#0/ y3e.F@aGa7 8Tm! f /S̀1 ţF̀S)x -= 3"oe9[9^bPoϚfҐ5"Dg&35=-Szfu 3y| !2JOEtfG\>i+*UV@ږTw+V!dfHˏ< (}$ `` ^ [/I RZص p@?vo f}Q2?>mE@@#!5"1a}j{ڵƀi1f{P&}(#TNyUzdLmo{iQIt ;oWjÿ_q1$r׫budM̻^ak&._v61R1NI+u_~4("lʋwgWBivv3ZV* JZsԟ fɭ^ARasFz+~@2q`3vYA\`%Yŕ~PϧŝkCw>l. ~ zV8 hleQB_0 MX|ޛݖdF ugmEI޸xA;io Nm/ZrQ_g" 'YG^}q5p+.;L$;zd"*4Iu]MmǥoЌkAxޚ[i;윝#o(YIUJv}Zȯ%'^e,u->[Evko[Qޟ'!i54A:Z(F16Q$5^n! LwL]:i&3g#0lӺV#ib N/1{Ⱦ)^~H`q_ !7t #c@d)`1">}w9̷20۹ξ5u܃A{y`Or>Gʕ^P@E8GL,Y3SP0 @4xƔ~if P0#O\P52~锋*0~b"戭N&{dfl`p %+f{|AN# .Ji@|L$qfoLDyfڎE M:hooPhϾboϐdCd8%?$V3IYfi҄D+ [5J6aI͋ɱm]@[T,2:'u"=_|/@jX_ aZIB՛悊2ՉJER1l1_!ě&u& Қ郐LXr%ަGddv꺘ݻԠDC 5MՀBMK9j3 RSl#+;8n/S2ja sfWkB}Y4%1'73Q3i|&\_ꄍk!id Tr9T {u&,W,0%P9 7΁)@9|&xؿ0_:#ii<3e}:j &FvJsira1 W(zc@>ζvqKK9:hlK;[D@ȣgRUH!%o4ӗ=tP1 ĵP#|2Ѻ4/9Y;LՍaóȋFH )2,ܠl %i&r涷G,ٳI=mzRnu}iINfߕO*jb,\̎'9}<~rh.g&Q<8˙}}<;Y(>Y\YrQΪld?KZlQ@"v&j]~YԂmU ,?o]BǕ6J|hyTq֮|\3w5Ӳ:L 0"AiYP-j f`k&5v|4'I( @\iI{.\zWmTͥv [cR5$4j8.Mhh-G'Z|Iyy*e^Ys@}%h$U6bʼn|GdC,Rra躼e{A{y K MdL}>U($UFA$瑪.أ+ K;r.lՑbOS^;Y@gƑH 9oM1aپ3aq=P!TvfS.߮;gQwS!C'7H=vYK(o.0Df8sJHGg"& SMQak:O/՛}r'z*w_I& C^AT9>'1xQkz'J42,:kozk+ݍ o3o_iGZhK i YǡܙK~oRuA9XDX$F^{_Ϗu[^d6~̢CcD]YTQo Ie|e| \_w7ߋq)e%`=@b*HQS 2'14q%_R(NfeaY;$6[XcaP];idžjگNO:ݕfPP(8R^>F;y`;6-%Nz<@@IT;Sl#ϴ뎏KfTbG ?I g>4hX'M95gfۤ-w>^CG95R= KIG>i5LB~X\]bF~UiLbm2E؜zI{>@~hWrbi]L;5Ik4$SŌ sA-oc6oc1;,5Ӛ}_L_W+Eww`>a MOh7{$`TXɴhASjYlDC Hl~sU(TlhQPy " Hڷۥ Ju4  _y8=mf|C qPO\f7hY8,QZǍ ۟k4D/vjZAPJ0%)d6L&8Q̋>.LMS%hA,F=B`S–PيT3(ǮB DX l}-"sҦ6^#ԯp]vښ FCDVqVН@)ت^ukI7krEu=5jq-q7--gb6hP_88Xg_fXY7k^MH|{VQYz[3]&h6f'Ruhs#gRRW2O#jGg ILiq~1l~{(V<.Z@ v3mrVۍ)zYv51P<8$lڑ楎&Bfdơ"2BHtNu9ѿ%igжIlt;cc$ZxfKʭOlB(qMI#tţΚ=O'[bbbQRKTZ>Ly`#ۉZ ԴkHpSMطF1'IP4"ӑiSdVXLQ?|U\oTǷ$&\dMDJb[f$_>a3feEL J)Ñ0CN.@X#6G;brIUg;"LS18M;GRݢNj,+ePs36M¶M>A<:Ƨwn< 9]|/WhwOf̆ƛR8Q(* xf/Xߜ0&y@}Ə+Ƨ5;x1ZՐ\ :/_}ըi{5_9.eoN3Zv$ eb|w(FL@⻉qpLɐ!~"{,Db8A/ k5\qT&e?RÌv' ,Z@Ik F&v?C:8uq= H;VN5§Jy⻝ l.S_a$K+TκхQ~i}I1aj,U}HdЛW7w1~/ e; s)o~A-ܝ;xjȾ+l^7CTصq%.i=*WBO˞Qj|_:Rii&a0̑#*&ǔb+gs]VF΂oAB!chn5+9?>,.@/~~p: z '+7JCUxpC,-J s͒ƹJl,{AB`)!Zti:9=3.)̬1]㠵IY ~gi>TAvpq>+zp`+x>휯e]Py*͹gs϶:FXV.P}2^-xgH67 Ҵ K{M6ڽRW/1!hu9Nz2M)ɟه> U,0,FРHeP2NSRՎ\NH=&Wi&>>nnEwט p<)i 5o\i'ga&G̙v[Kb6 kfoXF3WѸ1%$U\7{ ]d6pۆ'dgF5*…-5`bl)N+{^3P2\6ޛ)o'I%}J[^vji!z&,OJc(@jwUن&RWRZ0;h٫rO.A[>θo&{y0ǣGn1m`a Ayb~jjDaz (W72~+QR'=rs yda5B7WR锻njls47? mV %> 1bYO'lM;P iʹΰ}dw,!F$IeeyoVnۮ|E{O}}֕شHմP*iIbTN̤}GJmé$HR:;`TŊM(e/oe/PM) ?$!ih:5ƺoQ28}pe?ǪmƓ| MȻop;BvڷK#o,]Hxֶ-.j#>\q;" ~QE-6-2m na` QHSe* q T[$y`{.v3w G:4?/L1Fs^ x_?񴿰vr) ` ͕w7#9cs؂2VPN=lH1XBY=siKsnfV; 4.7Xط^]yo}ۢRL;NmÉFIP&HB:ffl<xW2Iho'q+Χ15 e^PA :[0aq -Ԙ䛝 :W[3ݥ[ wC^ы@b;oѽ$0^Ȅ ˊC AAAmIS(\amY[-G$hvnv Wm\on{=Tm|WT+F%Z7lv&oveTNluˍd"qt87Ŏq˅}m=X~$Aʇ)ާ?cu`V3inޜB+ڛxov]AS*WaTM_5,zϨuz;,3yec}V`wѤ @h^1u 8-}} B{iϮMwՋ`>odM-c[d"^ ђG)2퍼sCֶG@s9Lz[eTv:b;1_%Ug{=̯ *6eMwF,;";5D{V@Hh6YQu-!XX =1 p`0?1烀4osNl㡁=Wn\-^P +{Ù[Hݝxߩ~'ao;ehڈmkBcRBO+C<ͤ {+ax F.2nԉBn5y;Mf&B+ڛX?kGb}s)ϰN>P&[qö́&|3+.}mf-GJrac{ 4{I}Wdչ^C%W˷%85i ;9 \U%CYuo'ͼqef_ÙgNBmϺgYiQX^-Cy3 & vXNcM}ICX7M{*U붯_TNԐRGy\m)NZ"22&LWɫ^Eߨ)&wJAa=ˋ+˝gyO|wRg%iG{YA=zigr n .̄~8gFɧT-Bc&Nx쥛T<WQ s= SZv_|U4 PO^zoq YyJܧ#3ñgSTH-({ܫ"av$4ݵZJ6yo}CN=rr@:'!vl{3M>0Mi e6n^" ϺR}9fʂuy;} ݺ Agu,۸Oo)Iفwsnu6*wsޝ vj3T' ^*];lCz#'#%RK'H"_ޗ<Χo2ӹ/sv_ O=J0u 9d+O鼟"[Չ]Ӟgx+dBOo;|d^,@R4Faim+&~jkde!~k|@7K sXSgOhU%|}nn>J]- PStNU[Vk4Mi?xh0y<g>_& h?cGVlvo('i4U(RPG M$4o\r :zI{@UQftDO(~%UR_Ux 2Lckif1RKim#΁ H@uE}zG `5O6u]  QԸLiMrQM ǰ?@'v%ԄKW-r)H }G{wJ@2:L96":&+])Q;{t~)K6@-Ck*3C0gxJo|I%n. ؙVN0/w1牦[rQ)9IXIs`jVa rH]%Bh=hF.QDa=|UP M5p52,n,nC)7%y=}T U-8`*7ٛ -xu.α~;T9<`L{yBwwߥ;[~Ft1qBC 47QE{6-.mvgiY̺o.mUUH[%u(l\i+IںJ8,m̨}E{6%ega#,lBgasm@{yJ A27a;`e&<)#p+yve-c܌9 5lPօ8|M0IDhz&)ݚV{ ieՑxcPs; 24i;t匂߼(=%)A+ BAǙ$cviF|GUKP8p۪dWOTs/W\8qcM'\G,\}j Y³pNpS$\~Y։ ]9(]g8o;-hg$@6 ;z&^3>Wڃ,DOZ<]>a~L?hg pA]PjUwL6]D{)JwnrphF>ߤ^rYS)FkAǎEt2%ϼQgݮ{w}ԝS54i_Dzvo PQH0dg]%9L驡+XX|6XD@5#ȭL?XN 3 L\ڞ%ێJ:Wp &+Mײo}R.i/\Y(ZMI o3e{;Zcz5I ]5\g$᧾ ds8t૧J;vZyU jhE.Ub`g69%Lh^"v;1~P1]lǒ?,v "Ƽ,?Z׉wE}/1<95*@࢚׾G7\ 1QCl:OfWPdbѼZAҬ>R4n' JKf޻467iʕw̒TCC~~[MPWF""ۅ"5#-wɤ}@r)-o?hCKE3MUkwJ?U_U|);0f#tc{R'q2ks/v|'~}V=h?D[]KOqmE;uD{-.ڦebDE{&E3bBBQ]mN$tKVFAREePwfk=pZ5(՟6~?|˟_W@LRB__}i~mYTYsSܿ~?돿;*߉skwxh?Z|8?}ݷϿi?k& g A\RO8>o [\ aMMf4iK6!S2xMH^Key6et}B5#O<e{F^@\^h&JR3X*|@O=k!TVRU֚暌Zxk"mbhU BEɱf?oT#쟷Œ2"*Q>$ͦǡ4'f.[ fnH[ I#.Q!`]Y<+`"&ͅ, -SgOBkU[>}*?OԜ}({J@ؾrKTkgh)84 L&E/b=C9{YjV³4sbFKOc2AN}vE#Y"/ =РXQm2,1Ь{B^Civ&݊ 0 ~&Z cz4TICW*f!&._Li sq%+o(5x-Fz kfT{"vڍZ:vdhTFdmL k)(.Y+jSD2oeM-m^ce*%k%kOlϲ}5m(>H[lI ++Wĭ -|6*BM?E\lGEJ2z_rzoNCwx7bߍv"%Ys\^%$䲙F>Zm.TG"`!e__|d +3jeQ u]Ɨ  J"4y47o0 + Js3'>]b>'DԪa z[?sL7mio|CcJ{3a^|6__gƖ0 _E< ԙ;~㯯sƁM;M^$7׮u{W//\5]HW1/"~ӱfȏHB^EӬk!Qhb ҴY$j7iŷk7k7k7i/) UnLy52_ڽp}IB,$B4%ӓ_ !>59f_ה奛Q//Xz0B^!jd6mu(p?m~k>8Y'_vWJwG^? ͜&]r " TT3WϽɩz/!som/?Rȓ ^>>666yʶy߽{l/hQiq+fm{+} !]d +Ҁnz%AJnu"9H/&CݳaȓHL =&AMA#G{3*nb=CL(UU4 } GDM­֛ϟ}aE+_dշH8tyB8(Jɚ5xDG$Od\U^KV'5G ]!UuBv.ZJҮAizjTK.-Gt>s\w73%28|i6q^ט0qu(Db`2:O `~:|ITA˧OZxV "m KA {¾T=h")oJ ,N]YJR.:Auv=ʱĮWY]۫QE 2M} M>&l:ɩTוu?T/Mb youe>qr׆qaȋڣu:Lv-*ies?d"ݎظSY4ZEV5Ƕ\I_YI,Yafwo?(G|˳O|—LϤ~?mK}3y|3Ɨ\{"#6E*іupD-AZy a;Grpߤ/C5N,t ?vjEؑ>ֵ+3 0!Q+Fk' {ׅꀉ1Y,2g~*3HN;M<@k_/1e0?Wz:O4$lY{x Jehdg&PTE 0R贞1+<%..@GE5ŦSfOWr ŤS}P{IEɟa䏗#}ƃuzd|pۼd`hP5.P@S"6&vI KX-݇ssl/үZQt!$'RV"XRj4A*:~<  /tڳ%`V:Hg)z/H՞\|%o_^){$f,?'r"鷗VpC`+Ӈc߁7o؏ިA?jc}z#:E\݈"cCcCwC4bIxL^^_;}핏'G޼?7>yTҮ7Ņ_v(t(С@1)_' !Q?[-iʍr\ύ(_ğ7[6!9/QdWI"xj7y*H q F=yu2 stU&g8|D&QG??פ(@D 5˟1y2ga՜˜|Barut3@i>A: ' `1q-7ՂUNٱ.K˫W%ZgGǣaigQp o  fAZԴ܂2zx]X=ճݨwq`(fJ~ZNNwsUZ yKh` "E\`W'LUeWd_ j-SrԈs}:/f[J*0 xtGXrywlg]m=K3߉A ÕUjv3c/] bLM^u{Pґ}߷N Bdzk'%'fWDmk~["H*N5Nb:]9%;V㠭P0q]ogzw3G0~ƫ W>m+E(MոZ|TUMe$b}@z%U,=t>V{h-njG a>\Sd A?R% AA-ٚw /`wh&.5^#_G|ys#YlQgt?f޵,&Fͪ>9&}1NRSUSB0B.ە|ݜ\h9Z(wT`Z7ݮ,GohTxefsfh} лFeVLǹoHRy{T\@7fT?T[5O嘱(N*sVOgqο~׿_J1!dҐB/?|_y`l9yʾf ԏlmedGg{O~}J 24qI=A`!qc-J%4V'B{fhNp`Fzuy +0YlFIFQ7+P8+(\f0 8! .bj2"'=o[yifŎi̺}uȘ%)nK7,r3},^u $Fw̋F(e(13t342nZUH(/Oyk._Qԁ%EB(̹PӈB/Ĩh;QspHyp\#e;Wd!M{-,TC2m6-5J2ŵbS'6ɃK*N05Cb*r N*a4Cok!ʮ(3qvޱsDLzwlTd2$=*W$P>/^ ' {ã:)87.U'ZhR1yO\!1mW6ۛ?lJޚ&p/j`f[3`yO͑n-D ( )c @ "i4i1 ZJmy Q#?U5ƨ`K2x5NؑO$l; Hnx  $5ك񐓍9m/, G%I9BhAm0Z-ϲ`,,OσbZYOβ0rz^΢:(x8:-TqM5-|L|J4]#͉l^Pe斖kzjN14݌&h02 lfr 5) ˱as:OSl"dz76c l-J8*t 1˙Z1@v 6ֳYFH{r0+Nzү9 Ds BdK. ,i^Vu\*Z~vئI"#(jyR|Y#֘X^]>c喙Wv6*y}?;9SF.8~U+1c0[9 |YYW#zςx|p"b3ZQњ(8RU17{&ۡ-@@bGޑjSr#3C<!)t=k8H\My r+ڛ?>3\1;_*.xqAŧJը3~?H$OH' dtvGRn&6ZxɫOܦf-2΋6q>3..P -0)DmXo38A>nvMH^ vfn@A{}֧+okвTa&_Q%.&=4lT}ǶoljC1cd@1v{RoZv"QoC&ݑD;IqR:ȥhQi lh}}`4_:?囬.1B^nhbpl%lfʬ/J[1Rp nUD`Ӷv6mN9IC{MYZ);t3v+h{@4IL&c^H!q@}8a]q_sik,S5UqV,=J]ѝW71w1~Ff ] y7t7ۧ1c.w$y&AժBw{v:Q[kڣɝNdP۪\s6mP3HM =PtihܮmWf3S"8dEJ]#FSk#g*@ Rp؈@*l3F 3bātCG[eL\6#߉~2-y.<좖Ҳ.0$n尌][s;QјOyGd&2Qd2_*ߴ 5l8o03:9#I! \}1*1thۣ8oaAT{"hOv;c`84p5c^^{jw]ߧ}MU:G(θg"pX}RzO\w.Lt*G2t挏8̉nȡupDm:JSP&6bP,]Y>'Q%{@$7vggFg_ՙ=OGnBP ??)/ wg"o4򕚳E \z={4fOoF czNa@P{hz,Y EH-aعG֯7sv2 oz'ܮyf m<)8?8ϖZl >g7{>0O5z9} ׃nQk`UX6hM@K2_LCa{'cr>qơ݋7X@PfL ̉.fO>^W6Ig0 lzw>!퍼>^xA'"o;|w ֹM !r}GI84 uT}[Lqj >r2#H '&RV쎼B{TGRӂ1iIRn]cQ~ T(|ǽNﶂ*_^i}LWq}?3b#U!Sgp}Ͳčc{{E2[Ov/*">qmCOP>p{t%mѽ$'Z@4TA:]?ؖ5qY"[ySyaBUN֔v >Z-\4ޗ+޷Ԃ{Aw|I|@LYu[ՍY'Өg:zZznG y6ɟѣc9 ՔoznBHXv6g Hbmy4(tEq>% 5iLG0i:Y'7An2=>vY|wGAl#77ژl7Meϙm~<4$ZHub"[.(Ԯ#IdfM sQ\I(÷]ox?>>YCm72F]f[0xP_2~ٯhod?Ų/T h5nv,v7Չ|y"ivchzuH.>d,^=n7b9 ޳ݱ#{)7>r9={Ubijw$>ţcEP~ VdHI6MⷶW I;|vwߌH-focBʭfSVxӐnGc͚"\uQbȬG 1kw*""dw(֛W5HkG&U|۷)اxR]4D(tյ㬷dhW7ӎlъi^K*Id-%啳;x?Ԏ=ISclipO[% @7#A>=2h͢ϧUVc C k:>(k^_A] JCnWq~|9;ވx[jRw̄ goI߱ÉˈVUVBߙ݌[1O)g$&>ST58y9_{ ;ϻge9tx/pxAu^o?-Gf\[x|ʶ`igw7 b͝ Ska_d`rloymʹX^8?z".;i 1ΣΛw0~PgG:VNyITsV?uTuuUo"'3|yZ-@{緟͗o'2Tx/X7]ݭ8g4I]Sw^Wz[P!NO±psnem48d͢$_{fw]e+棭Wql:/2{Ϻ} :6ģ yTʦ7m yum'߇e?6/LjY@XJ+Mt?i6}FE7Vv" &C uW! 63"ĝ[냦ޓ> !آ+i}nWW;l/-'Z;NbЖ <6)%P,x_T;t?URg'wJ"} jGV(hx#e |;Jp+,R-T }a !'\p)ZI.( HP^Z>]1&=rJbezV>㞾Cs{bܫjsʐq>7=臧FI/&g:pUydY?Z{~u7'Z6j$3'm;>McylHNx/[kνW?y3 쮾1?պHyB:Lojp|N=E1'Rho?/-].[t_;8R(}ύɯ71_;oD5@M}=N >N}lubŤ$xI7\J|lG'שKT8 %Sc깑r{nh# @0BxjJ4<#DF70?ādmziVAupd)䚔nK wʱdD^,{,,AlgFȳ=(97* s?Xh`ΰeNmI!SnrkhBysHtaY˫O!g@Whd^V(8-'"[bjVw sq Ԝ xy/α~~L-xz%Xx+Hh~uaŀ/)ms9ĭ!nGܖ A qch.`֏~ гEjBWȹ`t= }f&BOOSTF;~9Ѹ 4A.E{ 49y_ I18YݽK)yXZS+yzQv<۰"DdoT q,f(>naGu /^봾|Jӯ i_( ߝ6F#:zI^: G#u{-RM.,8ůjoPRsǙd_@A ĴHoWS4!Y|szy puS*щW]wzO:9Vva,ѝ~ ,uI 5qR߼ >PXxDö\EߏDo$|M^unj׸2|*(w( m5Lu"Ԋ@mGhtҩB[Ou#RiTfe&:yj옢UpSZuvQD)iOS^>+kMn+gE[6ou{yM4o+IL XAhkP%`Ϟ]`(dXR(;sݨb@}<ꩲO͂`2ɰ2TB˺.AhG}/2rG y~ir7&Zi;oLh@43C Kox}]yl4›m~%3'_ݘRki৏$zmvua{?mA'2h\1A4~H1äUq(>$0=ƵMRb}V=-z)&iDXdb.>' fK t>e3Ko1<%ZC 5% "aR?>?zyM{<5=3[WY %'^-J4(G77=G2jbcCxV˖503$,zR׏U/ U H2jM~DXJ9P!tԠ,&aYIh 4vM" ڟߝvP` Ǩ)% J#r{AaN(Tʝm o[6FPf R܄Zt\ퟦ~nX1* N#UN/%':79ϐ|R}HEkKoMS}-.ETzp)өOV1L[Y ISgB̻=]zPUȂ' #E2Qthٕ-MK QSE3[ ehcn`1H &@xd:uj\X;L{#}B6$ijjZlɫ9sS ]򙨳&v59D'Ywt^>hԕDZ]+HՔ RD5TJoZ9(7^Uo=۳9н;O@M-P\T\UpS(nJ.FE ÔJewciIK֬5&F]z#SuBӟ@B5W@VzjRځjtbdDƋvYz|hn+vU84 [E]2ٴ=5l-ᨡnQٛ(iBBzqjH+yLUUMN^$lM IosVvql8ɼ CiKM-#$qfUzN"uE<hu XUm ->:DUyXV+q`t)A 8VWW4&s(f,glA5:1vED>4=M(T9݄Gets⡯w&K)E ˪IFmuƬGFdh4PʍpڋL_FYêg'in4*Q4l)XG}M]w7l\g{t13C`X 7^L}wWc65A%3o]6eϪo+`vLгjF7T!UGδT\fRkv>6,o#  &HD&HI>MDa< Q1esl!QіBl)l&FH s!f” ͐%(35'bZ׭pJ0B8R# f A07H2Bj 8Q_VD' Y 7+1ARnrR] CY6T 6H2w{6ٱSFH6eT:6HY =Tar"]N)]As#ӯ4)*SP+񪏪p43-K DHpgyDMˡ0 )S&EˤV&meM6gSM[(MfŒ& i0^_l¬qiy!¬0*%y:{I\%۟ݨ <)*!fSVu."+@ v:sX6tIjDnS 5NNEqLm*nU$Spfseu %`N?J$Yae0 3 i24G"[mBR5\ eeX8r`̰ARmk1,b_EI Bì3nvV%>tȆH0vEh;]q*ZeVĒ#tb.L/cQ`7; Nç {TݮYB*e}jdyzn@ɏN_ͼ9Jcv35(i"4,4s#kG@亐A{OQfYb+".ƙd8NuW](9{)IlӔ|<93RݙI%trڿwCElY'g:2n=gtmڱG\gggqyd?;0'I.-y]N:a厛eexi|"sVƶήӜOK+'g2@'gϾ5,:8XgT],33 +uAn(,Hg!i 掗/d-/w\epqczc3tl.ڗ;6z1plͦ7=6_!=C>w_(oo*!x" <҂0/Fv*t\酰M0m=}]agaƶŰ=vdSYe\5plL%Rmˌ;MdrJ_aJ< Engt|WY] %)ԥtn(ɮU JADUЭO 8Բ<&9ٴEMl;pUkŜ.Sv3-׀WjY)#< +y7cjnSi%VV\PLGH+djIn)" ݣ=x, E3 N?L}~_> #>/s?u\[k3i stH5Fҋ5l *JڠgԒ3,͎Jra'hW)9jǚŠdT%TdYޝ|D][#jz?|41t=} ;vpB БkJsgcRUإƙf X"#Fٿ'?͔d5I4TV?Xf?C=ю=,N`xIQQY&³ΕE%+<[5.,:wwTDHZj"\cP&UGS<}D1 8;A8"`ԊJ@ACOK^'GL&9IrPw *.~ӻ{=LCEcۥ{mR w+K0 d]i*d6)fsm|`=yI9BƢW%L)z!<L5_n\0SӂѴo3DTúv+n2$JR?H.&ŝL5g nqYm:,jH򸋒xcA6--&#%ϻtsvK|ofE(ڡwMuǤ KTms,@?Rjo03=@3ܠvuŋm%KC8.4J)@ю;-dL'fnK2s`[q 4p"yMjRǶaI[[ϩRcICVYjɟ&tkWG:MD!6`m\#RsTe*׌0Hăv?֮,uK4ZyQ yz.)W:$Pě~J5+X;c^V 1ƶj|{\aY@C^IJ[a$JHCnY]uMftmI=:‘fRgվ VZD8F*w;Iaݭ#ΟPi̫go/7 &ӕ4(=]JM0V] qC#':T*٥"YunThŶ\ }M;ka w>z1]b?;ǑZr;T7zl=פ;쫂29>L'r3H_i=TwLIN;I~AZR"C}%p*saK(:KὁFZ=hz2_e^v_в|so>i @w@TdȄ(^xS( ͎nEyTM]}壙.X C,TN"ʮ;49=3#9* {UB {z9 >Y'>k֋=Lc ?!hOpF1DzN^^vqѵFѹi2*1/ QoZ DQR.*  I_yԧqЙ ۽39=օ۽@W~-þ46FVit|m?CnG0]i5/@ɪ.I]9WT֡ʚ?Se63OPIuce76o,0VgMFO⚗p05*mQmǍ榫-VqcZlZef%;2[-4A;侫7=᫰a7rgVCV' L۲nEXS~d~wnPߟymǶm<(Zu SbIJ65Mcy M,v#sQn7ƣ@ eI3fX-mdš0}!ϴW&{GpъƹB Heaب/7j}$Akf?lf}cS0CF=d&vФ1mpDj]<}[i>V 0:\O{[9r&/`t(:TMۭï2Qb. %DAc.MnR& \ߨЌI#?/ ?g$ *Szf9;!^&4|VԼPvF-pYtύ*$3h{@V`>uv1L}h8ͬUS-q~Cn?Tr?0@d\֐W_FPG0fj5o+ʄ^Dif4b+ fg竝Õi;U_& \\.S{5-PuQ(>xjV)^QVSG=vDreJYfTQ2K ,UmLh٩ekX雇m=>{()HVs9&ˮtI{ral3mݍG:4^QCJ<8H> ˳DGCb ꭣ0($LURRxT %"Z':*zIp&Q8\Š@D)'CZ{QHj+uמּ ^+KU; =6e_BsfTWѷ)PUFݯC2j"6w[in6BIG4iܸ$ mW>m2O$f,%1FB3U?Gأ>GvrzEIpCMF& 頮,!޸5Msˌw~V )D@2ŵL:\$ NN+y8?Mse8 X!ɐUP{6nxW/[ *JX1P|fb}ʒYi]tZKPWIg#g&wϐ31=J`q^D^;us[cvF=LN;>Cw-ѳIVR SĊ$:U]SZ-+K'cq9t1q-!sʹKNvh[Y b#~r1ZV=h"$YBv C{I\7ZyѴ4[A2Hc6{Wt)8j{!OZ[W;+M4S/T UQXF#1Fh^dYy?S%Q Q2KM'DdC=c&;rU85U=LJqk$Wejr ^zB)t*dC| =gk.'ww2%qDAOZ{* e&O0%T~;yL`#ާ'sTÛ˗f6.bYo z*%qƹQ<vaQk:؅|0I68|Y; e' O!BCy,^UPdK){Qqϋ)K}.i4<|($y}\/fϊc5\eF6#NNGgEX-* Y~[kfjU++e~+j $-?V,/ v 3Ӽ-]=#eG+ehôX{bN{cW$]L`Lhvxӕ%8h/\Ix0NɨY[ەd14Wr?v؉*GHwBeG UJ׶ɣy1k~az,;*PHt*z0!D oF[ ,+U! \vU2,NިRv"AymL".6x'Z87͞it%y OmOQ!ri |U![c^vAK߫Jm"QWL(QϤ(v*>~<çgq.h#{wi#!TR8ַ y3M_.L4d LN.)mfC.1Fe7x>t8FfȌͲMQWf|K*o^U-+ q ?Y\'B[5[C 672YWB}#N,2 UI\Z㷟iBUm@!򊪖uQ`3ˋ ҼHVT&Iq6b#ł9ιf!MLe|VtqzT~0]䒏$VS'q'35P2Dx܇mɪb(A1,.hΤ␬\L1֛1IUu7{LQ7>7=Tٮ^d*rJiـ:߇uG L}Q50]VG[iwQ=wUM5obBBش6ߋ%YoTaC3N}Oz` (O$`w^s;E3w5iB@zGK(3ocj~)8OMGw*(}(0Z-h;& Hwֆ,!5UCi i;nrﮨ?z!`nFH{ɝ$*Pf5 м:QyIcj,NIS|e7MOdTMGz|51ONh  /wrIePUb;m̩I+\W4ח!zOi:4X2Fd}1 "u IFyFjֶ+_6Ky[m#wQ$t1wo;sAgbmB'+? Y9\f>HۗZZiffS*2҂kT' Ug⑪ |3-f:GƱѽV5Od >]M;|Q>W>%^@oY3ygk:wwLr8%?p hC}\/5SwTaWTԱh0DaWTiv 6-Ԣ[lܺ#޹uGٹuGrsSiw_ӗY~E{6ygvf0jg-ahP[[z:Qjڟ>? yZGUjѓR (xxYabiG}ϣ%>icf/x*sEv}e{橨gOmf ncp >UJqTdӸFEƒ?95xd:|׳@#7>=4bPg-ovWi'6]QI'pG3JJ5(wƨoy|ޭP> W\+m+| Q ,gg քf ]}J5wO28@e˗}:`KOpNw0CpXRx`Ҫ<"C^)?cٖh|uKeft1G剙GLQ*+5C:̜F2]YzL,}x^@ Vʨ]އ•J2Ic5bѳ%UwHB 5~pO`t3i.+ PӚt4w_PKQ{^xmq#mFFYxSp-]Bc 25~&jTc7VJ7fQM-&;I}ꠏ:5aC|D+Ln00P?y.N~3gp=xfȟ&ћήgs84Tp5f<7#%/ |3AjG? xixf:d. IYJd'Yr}$|(LgZ&᠌BHhJkH/'F8.ehgS)AX|Dӿ`*unOOxݡ.A+^pj=> ~R^aŌ.|[kTLE\?3 5O/ʽB/h6Ivּۺ ^v|z5roXex1z?SqbPW@ͯ_M=Y^K_}`KLj^ϻ}^Ң=CZ_}s zrMzߟpM=s3}*up^?/3.P[m>3 ^%Ϧϳ ~&4;Nk6۞pM=^*s.a{MnG%~0_S|nϤ9\O_rן~Ӱ=47{ʛj`/Âo!^fi j\iA.QSL yu?) o)?_\QoY 3"/;7|s[lj^}=r/{~_ _LdZ6Rvm=^{W=;3ˎq~s Kx^[%*sz}ZbF>ۚ^_㲌iY̗Or~+яEflkxf]@ tU(x\B;JJz~AZL⾌.#%>OvQNji5mDX +*@Kf𿝬zOFT"` ך\5t+wܺm9S,#~}zϪGOlxLOxO>~?|˟_WT~:} x%j~ul_7/ оd21W Sva3x:j [ v;@\忛&ݾu|~k2v~~M۬7fu~Jcuѯ`2E%Aa3OiO?18cOo쪃g\Os`xm(ςL[ܜ)ƫn<ϢlW='殽m3m~=_hx:lfL_%[av tv:2+[lq SATHRu"|_HEO<"!Q> ̓lӴb _3,_7 =|O_Qܫi!@%Pqq\r-&7pdf˘-(f6/B3m4"k^Segښ"^<=٫ 삑\ PWJ8T#JW2gwSm݃N/Rw \qΟż6Vٗ)m>ʎW9z[h:j|uH5c]__7a!0WdL(҇#P?׿껿?~gS * T÷(ѱfxkdž蚬hE^D9}v@c>`_܂.g{P0 &K8rdI">6TWr%NR[qh)y4n{̨,r +q{47fޛ7ѯ&ۙư7Lɬtni2&7WM.5iZ2MICJ0DK %ܫZ#ى)&v6&U^P[1fٲq1<$a{'μ+§+ hgHA'g@< Ete&?R'O 1:}{f$BFG½BdЮ4a!J=s= ` /r}*PBj?ۉQ@D2cꔽm_?A?8t5ٚrq FtFBϿb:z"Z g>0FvE[;aP]ۘ|H(wI?'k&G;jYkݒ SorwaVAj#%OFfku^g`kQmy-H$5Q^`J#J38$'x9&f F\|** ^q x%c5\bN_pKMddmNlz{f(߿o~'{Ȱp{\G.1*=w,NfUůиeR_n??pw&:ϑ 3毞/"Jx}mOa&%po?{_$_ok ^b+W+!BENn11]Brj .0b'\SoOxe",}Qqr؎þcMJEcwF,@?00$rӂe)T L~/;,D!L~vcBQجw\z5 $IdfO[n&XV朘 pF%c#̚ʆEkۖ>8<+h*8O/<{:gRc`)$B4)BUƵv8ߙP1YB/~$TP9 UG2b: @y*$T>,T]cBD,T@MO}`k AͦI xEmx,yX ϑĉB㹯|Q }G} d',fk'3AB̭W 8FXTfoF~o洫aa=AIQF6Y_Q(t4TO7j wc>Q.C?֠oWGgSH(8ቌ6~?#;X>e+7nu}5zޑ=Qwj i]?c~~}&OSCu'MOG;ڒ?{L> %BrTftaTgcAw fіtc޷b*cR<lVrnm+-i+=v<@̀fa31/=l&J_i38m&J67SWb`ԙ5/jT"kvQeys@Mh+Y]8!bL[q3> ڌ'أ>J#1Aց$Ȁ3m?L/B>S'gɧMaSnT162@2lێ=yS?riޭ3sO/8BI唜`xp-i>55CA=P%d3|$Efnas0.5iti_ 7INI D!ꐔǺqH[žsQ~?%-.tط4܅h ('=6HUfy,@Za^yWK^?;&=|w>?^ D\' /yRɴcX;=z<5鋱T,Y+'wG:u^ejbL=:>kQ>WOx/LNOF=@z^߫wb]?7gA7:W{kvK_,WK|GtHyJoC,%]]'fM暊2~Orf}{8b}D75mOhY h^AaKʒ+|Pyz/N'?wx2t1?qR͈fO>?Jlx^2oEfKk?sLN]R}̏?7݌wÿɬ#?$:;0LәO:֝Yպ5׽;aƛWh֙ߺkMN]?F|~&NZ޼}>W0R9Лf%_M]7 8>`%̝ {A~#__p_m oD5AJSi#Yةcab;4 X[A;Ϥ9M|TF4DELnTlBp$D qV~RG׬LJx/)h D4?*bvMM_t[tIgA+ ,)׀0E@6r`\= I4Vs u3 6%=Pމ`_3ijveb𙖶k}}U7kO2XvDu Ѽa@z`OόfJ>vg1&VȐ[&"LBۯèm(2>r}wڳJ2`Dki'HY,c"ЌR频΍HF ef77h$s0B<߭V4_>wt^&L5Ɵw H6T*1Rh,F;mօyh7sϽK\NNԘ ,%UMI]JД/,CSl]4I*賚l0[TQ ŷ$RD߼l"ɷף"3,$g&rlf˱4uU0{k&=׉R|bGAr"HNnJQ03k8yLOiѫV!PF1GJ-&{[9Du* I*^(Eirj/+ut';g^dۿE[+6‡?J<G5 QiO@..:В%$Q픶EM+[-z\U؇y;EG3M͎$B1D1N5 I[ oDwjBlz쯋_ʂ<3F-BZ3X,Q=8~:LX;)h)Q,=pFj>qPYs-o1?P{Pe1?(kԯo+mI~Z. (z9@ތ%QI_D8;Y=J(Js|V4ݚeǦkd-K'P,} ##ճ3J; šOT E lnc״@-=NNkW ' krA eNr6>W]z3T[ZCԿY|?Qr7vXZվT۽ (1ABE]oH :Ac AX  :5&tvu^9pmwQ Aa麗" -> iS|PyS}LcE]5upUi]Lc R[Yf=@B&"?9v.g)Wr6尽& rdZ /vFN3#S/P*ʰV2%wG Ș~t5<,jM:TNN攖;H M ?*"2Q[MWjSvvVޏ`_G6kW6 v6m|e3h^*]itvLE+╟zX{R sOp幺$4V0d 6ڰ6RHͺ*s/G>ZxV́묔ƹAқ-X-a͐y7"v[ {e~jBτP/n>9OM@4&\IvtBne{P sUIՃ Ƅ|ec]KLX? C?o~+;"wnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_EE.svgz000066400000000000000000000003171221777731700221150ustar00rootroot00000000000000(zHcountry_EE.svguK0&ޡia X m@r{+!1!Q/N5A@Tfp96ȳՒv}|t #ιA8"`Ti%4.&mH )gQf'݂~("ल֏a&Q7T/1navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_EG.svgz000066400000000000000000000127171221777731700221260ustar00rootroot00000000000000(zHcountry_EG.svg=iƕ ,6ɮPHq Y"X,=5ݣѯwidˤxG}ԫ㿼[nOֺQv\O֯/W_nGϯn^lW_u{zҶQVݗg^ޯ^__W =y R/^ﺫv٥?VuMc|3fv{unr3gB}>Oc<˃klZ@w?dݿ<y])LcT?"?{%;kB|~e韂nWj{aTƚ\LkMk i|6U2 P&\i]$נ ҈p]zIWYi-~l*-L΁tF M[$7އ7&cinL|#Ch hm\.7Ը- T2ruFO~ Jܶb-*5 `^cP*4WUG|O33 ~a෧OQ7Ө1}0 &_DL!<4c5Qg@ V-eZ_@412 "d>:)x R+ځ Do΃ZdpQ4)2ShOBKCЩ%uSnuI.T=jN>5,F2K!M"zM*OC |qHe`bdD %ݫA@Y갧pZ>(JLQ-E,Kſouc{:E)S(#0ȹ lYb:= p> ]ߐNa3΀Mm6 FDl ڊ# @A*6zd$'\sdĚ'>fY91tžѿnŽB/>[B;YI!#5HΉL?v," 2FHg yl~ vee mq0f(,=QsXS4C㰿S!l66wTj|Iѝ!`6..k GH2hP|V(*YDab/ q̵,~;Fòv' `W$/8 na\s)}aqq w(3*;  zq1Ia\ UDo 8\XR Z'!r4# 92Ԋ-?Os/z9Gzav10\/j~U[d$'TjRv&'-gWcR5Ri^qZsATt(GMŃI7Dov:9gᑫxaԃYy}G:J7xt2<R6R1W-*턕60 C.B `z&;ϼk2 #SKCGO! ɚXldȏP]p)B QYXWJQF^&D$Ԅ<, !v21XpXtYj*p\A0#x XG@aJ"kUiu.iaeFI9de aÂ8^P4c-)>bu=3DeqS0y9y 8كOBf-rIB(|12z): n61ydblR++L{c8ʼ3G4EЁ~$70x;f]dzg?8s! IA|Hy$]ݯǎ,:Ķ }ËodŦdLi=8Ǧ$/9uhV'&}fP$!="SыN BCs'/*ѴH@+UGOl໠ih&B:Y9(1! ;F!1ރ;1U''4F@e0 ʝ[d?Av!t(IL/9Ԁ,4=} b7c6!Ύ+X'# NEԸZwR+ME>EIJwQ AIK{2C̝sBc$$S nP}:8 `s9,uEEnEqX[C~qP` tQ`GO<XB* D{ {oDMĢ,ChF1z]XG&#R')G%EpmZQ8} !*j`7 $x @nx1ahgi=Qq:"Kq\,j3YѬ1,kO9~ fBDPVDɌ蘒9P2 ܠ=X0w>W8@ql*9a9J2k:7Ѝ-V`P:cmBϏV [9,-Z=YGeMtq:v _i^TyPh sh=LO!aR^ej#6v >),̐tq᥶h4W::(Y=wsi7ڲ!bV{:ᕅwx@;ĦMkv]ɓFlplb;T*-}9+qsǥQq Y38+^+!pP2:2> @;Yx U3KxV '7X")cS$klQs,zP AOE\%1F0_?^ ":c]zBt@voHm[đ#1l(m-HBX" wK/ H{e%1Epzljه'HjX#@ ~~a MF9ml/S2qlLe$p}ځ-vQ _ԄR kq|qR0[Ep!ҐYjR 6sT*B<7I$"bE J.׀G 1s)XG;=@Yb_R#FL!53wSuMjF+kiD)^%[V Z#"`G5-%3fss4I&@I/\&)6elWڲPjfnp p{}g$7I1/^\l;y' Io*g V*x=@ҤS}a|Q[BcCj/Am%-Pr:)P0J0:kLi/8b$XiÞ*-k@b:xֽ;nF(5~规rr`,)+'hrh_4qgNhA\:PHi &m?G6? L<8o`"*!?y }1nE ??j|pEqOrMI`X4Vr/-=I0 {$.Gσsp2(D^R9 ~,.GC<=m*<&'۲R3$-MC1~4N,HX  5? DR'gր'TTY+;"bt'$M4 xp5 έChnxOh| =*@p (uӈi+5:U؇~]rD5rM-ʂU.D^ @B{l:q5׺& OqѲŐ~/# ^quYqliC-`ox#9c9-rxU@?d ٖ:AM3Im -@75[n `))ղOP5L ;̤{M(23͇yV-Aa)dnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_EH.svgz000066400000000000000000000011561221777731700221220ustar00rootroot00000000000000G(zHcountry_EH.svgTMo0 WhڥE$e}dq{0`v~8li'Nz)&_G${߱-8YVݪi7r6] vja6ce__CUkv~h&Ptf~fpsx\1m;,SgRQJ91f_OYms9gmu+9&5 Z~^#q6Oj۩ʹ. "B;?u->t5hwcE.KnS":No`}gRH[Je olzdBY]@eF^ 3RY"e+KȢP IwծUh):>]_jTDߓΥl4U~άۗU x&zT *G7zo-݄g/l.%L(BlVp)lh!I۸!pirnD.۔"`F@4$QMd2(*Vh bJE0VGЀp`N(ӘRPRM ϗ^}e6pW:B navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ER.svgz000066400000000000000000000116121221777731700221320ustar00rootroot00000000000000(zHcountry_ER.svg͚koq`7-*Q~Qlin"I74ͬD $e!eI7i@&\gyog~ݼ-;dzǏt\b}7 %6izݽ\-/f~/>/_~^qz3Mn9ٶˇj}/] ONjWs[s>V],r|a\N[Mt|חn:stfq3oi?߽?<3T,ٟVŞ ^_>,Z/X^}{x߭a1G׫{Ν9jpiѣ}tX>8I|5L^/^.p-XaWa}^ͦGV~[PnvݛNgQY{(;J?۬I7 ]fy3^\?}v[+ow6ϭG0|`Yz~=:?iއx[0z}gOnV9IOTFKmWkj-N O F7Pu8Z,MBsGY_-ot_u# z6}s?b9{7#a廧<Kﻝva?zvud|a_r[?ά?Lfy~_\ZMok*O{q_TVKUΎ OjNw!=l˳˼\~zy}z~8UWVu/++P"}O}ŧiw_cS0,K+Gr~t폿~K^jZqW~fZX0 S\8I5]),D7vKKn|Fc sJFY+9Mˈ<Y(8{_Mb]':wGω}^Cd~J,q3GiZZOs 8P,2otS%%& r4 2fM:vhF\Pb;@jP-T)DYCݳ-y̓2~EՄ"pRTPYV3A2>eAo&eG^*5vBgA[*# {J80XR8e@'B= ő@9 NSbbT+C;蝒>Һ`W32%' gNu|Jt$# űdN> =wgPPy_f2N `'eRq@)(e`Q#tVnj#2+`8b-D*L9UO]I,*ʦNh~jH9yD<8!+X\@m[8 FV(%((;@[vH(QU,G&bu_+;VHV+ɐlNMmnle0+# Rz)Vt"Ɂp9[ZT'r I\f2*6 ṕ'p!WçI<޸w<TQCCAԧ#r{HF0`H3RZApB'x񆜻2(m`Nl ^ xe3!A09݋Pۤf4(XGr(0%Tذ"+fms,@U> RWNH ]1KMXh 5sT6\b 8جS,( %^t9C,F 2 ǫ),`>^xuԻ(D|X1ň@1)D=6ixÓ,xuVt NḘ&:KfֹlL:Fxvm'@KVE DUJ$S'RP_@~.8Cv2sSz/ɜp*+Xiv7@МEvJp@ɰ`; |:`-usjT$4v!4(V\xtǛCR{%-xQIeSnthpU d*)eKFXJ#DygeV`7(nx 2'&\')AJURmCiHm]2:F=A+Z*2K13Uj bJ h.=C\S)Ԗz՜]hsP4+}5Q 1 bM%Zo8Bmܺ0M\yvDW^[@\[2ȓj@N'ŎQPAfP7kr?Hl l%_zf2J){ )WHEԏ6 scn欠ε*k9)?ˈ(`{$ENQy#ƖBLvFUv3S%@,uEP.fFs)P6zGf9|L&]*x&zNM1r8N؆)S0I|VƓp 2'ay ^gƟ&C樦јduzvS^񇕱ыv#;`ϸXAZ^r7n,&Cd-l';G> lu,dPJ_e*R7%&ВGJk̦?^LDjN . ֨Ex c9FQ ̛46cHC$6qfX8%1\K;D].]%F-!CZ"'Vlt{PƨLwz5a&`1<zh3PKڀf"ʣNJbgeSƂJF#!KtSøKFt1Kmuw] J[)!; {2속AYl6Xq5KBOHDxo4%t3N,zd8J#u5&,|=]DpOZ4Q1M:d|V_`ݏdVԨk]lC`>[Gw&i*6$̑j-LAZ= j!MjԂRJ 6 F. 'Uc1B,6egSA ˠ1G ճrofZRv+c/vcUbQ F$cdecثi4a-݀F*QQB`YOJd1ŕĨF\1;4Ŋa*9UMJOM$㛜8,94#)y F5fb5LSh#lWD͍YW<]=Vi&8|-sFv4-HJ[큪)xE ō" -FMJ `"T.M 3 f =芠) %L7O:fg1$ZsM2 fo}ZT! lcIjHEWa/ȏ*hnHO֖i"n̵ar`B6UN'e[Fm`J^F8:bdfZ}b97zRt;+ߔ O:`/2=*V_|VO_]MM_-ǿ_e_/wӟ'o.k(¼c3}IpL՛#_0N}1 upгdܧÜS9I]:YU_=gv.Vl}/NLsoိʿcP~B>,V^[/+navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ES.svgz000066400000000000000000001457461221777731700221530ustar00rootroot000000000000005(zHcountry_ES.svg][cq~`9hGFBEKd ݉fOUWCiGؒwߎ~\77XbT !.]-yX _g`޿r_boM5]t\f<}3C owcoX ]r1hEmsGWnaonoG77!ӱ-zr^>$!p[l cb7ќKbI6L|N+#fDyS(u_CO<]u L_C+W~9]8ny?}@Ig`+tRyVYퟰ;øl24= @{H&r/'U%{wS(u=V^@aDPCJRFM:mMEM TJI !7xz˽3Ƥb!4$ 3$LBQy-2ޓneА!!ڻPL <@U[;~L[?d2欻ϺϺݝ׎AWn_jO߽.7nWՇ&&ѩi(BiMHȬ" Ќ·eP&Z2д!7(}S i[b`-c:Рk٬[2Fy& i5„ceAiن Q/kk@RxZ@{%&MoJRK?=D@keu Ip`9l~&" 4 U ojѠT_IӗR+Gt}T0A[@$C͇ J_ ZA "lfQ.XAt4g}v",Psq '4P.XjkMq =33)PFM 6?YuTNzLa'8YJV`i/ʐp!OhdbYI'5ŒQP„:zHu.ЎjAQ BreJ"㇘Wr"9Zq W):&S! iSHX:۾1Q10#U71BN"wȤz`+J ; 4DHĐhҶO[J 34m= ^z"|0|8a\ĝ`GO6j@;Gߴmϑk]p2~H2$O6MCLP$>- ~幐@t*GJd\Jg^ѡ-Di?Rc7iNe٧B(CM{π.N`0YLbr }s ZѻlH-&Hĭ=`+E@'$D8,u9EF ǒb"Q(@&acЃMeVf).ee喐B7AS1B+fei]G<4qLq"pt˂Mǫ%ϒ%\;k$ۣꅢK\] %-zR3@Y ">` }iJ8eɠ:N4qD}e,%+BV4\ yjH!i7Ber0WFS֢9#'D7UaIRpT<["pj@ؐ7R yJS.,X}e|@Y 44U(Fϓ=%01z2PY$4eU" r\JiKLIQ$-W#߸O9eB5kb7f9Cj]C(d(Nvc3xD&ٌvc҆'.PZ$'t3Z*X"Qi܉CcUӺ-5 h 2+)6&QC ڹ C-DZ["bQ"lEeݒmF)R&|C$$֑({l] gzo /[Ui}s}JFkU (4ݖt,I^zb,M*>Q?~TJR!fϐJW es Lݖ:kRR`Ók -%`-c:p^vvџT{Q~9a;@5WtO>t9߶C\R-)sI*Dδg J(WSvВxOSߊZ̍_MY^|@b0,+) T|1[A+E*jorƺ 0wlce"RD(=A:gt\H֠??R,0ۏA@z< a-sĞ99rt_ il:v~4DZɴtMHO.Beh-ђϋWyoʘA1R-T. z 2[tksrP[R){Sjƞy0q='S%PʁgDdYpO`2g 9ŷ!~dvd )G~K6$a]ʖr}'F)oOuCJ$MA#2!Kd|MsKsw#n"/?pn[v.l^IMv"xa7N§Ct錳9t|]s·hLKg,.t=Dw}Kh?,ZR]4tOݐN 7Oħ׃blmBPNFֆ΂a^p`I 8;7tiLX*΄a5& kL΀ 4|"a 0\Ts&n|ӴioRvRu-@3䑼 buӽ$Q2S Xw7..#*A\RN,x!ж'y@kZ*pdC-CO\WC93䑼~|KJۨz1 W8*zȐKASܫ- H^0T|Jq !9^uNO9LE "HP(j,; 6x,xG1x +7u NbwSU>X: Aǯ-$,`|bȦ ^ x&OJ+}:si{kӻmIӑR&wTxA:gM' xuW:: /asKqpilq4[=O K H^&``v(ҝ˅'E|.$TϕJٚix^+LydJ\(w>].,brOG<㑜~<AQrwq/oDy\xGNg+2BズOǵ X Gx]c̄HXnw|y)=B *.vnM)S˵c:^>L}HsPs|pL~mn<:g/6:2PPvs%K/TO>w}-u9{o,YndJ[?IfMk#Hݢ&_,;+udEYJlcOHb E& C="ʂ*Z~G5^I XEp G) 5&ZB R܋da=hg+AUtmwhВfʁhk7oUo%f.r8Ƿ}E`."VTf,(Ip~9s.SJ-%w J?'M)A9JBmjW(\P%|>'lW7 \ 1fb66ch"Q>6ޛc-ImãЎ]5,i @RA1@>m|Ѩk0|lbKl Ͽ C`}+ W}hzly&@m"DWyF6dXY/~ͬWbx4$^ͰÈ>F*r\*/"8>v2Dz嬕gH?|t?J+3UImL3Gt%6fāJH*l YaV8G!F*"W.9x98Fwx$8hL(ZF$ Mj,)h"lЀЩ_ͰدK6+4kg M -qI&-1-mifm?e;@7CNga{J-=@TpAC81h +ƻ@QϵeEsKW;""H] ej-`sA.TSx&'ӹz mOH7k~h_D['\H2oe*),騥TQ+w.~$RXoָ?sf$)(fQtqR7)"P%\ i5 l cGWo mDW술\IȢц4y&t&/.낢НBx(G/Th}&lӉZB1Ӊ ^[]63"]UF?REh'ի%jL{t:K):ܩ\/[B4>bc_O[_.x{ww{ww( 0S,`4ދ99qbS\], NtrAKGrL&]Oc㴃[bvq/eKwqgưv VXaTv:#, jxY\5.>"',`s  Jʳ%; @WeYei=ww}~ϻ?xPNӤg<ǥ9-HD$t5;s_[M/_BOhUaaceܶ&1DRg )toߛ?^ѺcMR@f."G0ۿ#Svmk:jO]WY#3 !UD?* kr,қ۹3ֈed{uI;#m+xvW_7P,Q9'˿ґǥ}2G-A379%_pg?p1{EԸ@ȇ2.LPN3^B6b'.鸫z'.KKӖU{>qB~4lL xe ^@97 ~pΑ: {/{)x_׿b/3Ǩ~D Ealq MǾD"az@*8|Fx!T1 ;|BhJNx#ۀ1fk\T9O x%Ѩaj3+CGGDMm.?WOM2NPE~"HAwig JԈc^OjIbRdWu4]|zREBRoxBŐyfP "j@z@zJtzmzME=C娂E^SQ:Jn$"t`|L3ɺm@5큏1*/B@K5HŎaжU wk4C3ȒFpd5p{% *iq5@T1SP +adqE4d/j!hhNfZ1É8D[G#ݍC Mj$|e.`0, 0<]A;637dpy'vUJܒ  у<*sp*@ZBa C%R& g@O'=ʸ0䛌<7nq㝳dh&&Aß!rCW;MF Lʗ <¯P@ ;cJ y8sV2gc(r ;ˌɭҪ𽊶AR320OK 뱽+(,\MRMmLs`9UdbQt,71x DzntZ;= f"n`PJko"9oTaYZ!D;&:ܙ]p:O`J#p*,fpXqnIi[ 92Xh˓%5/E xBpꀛ߹9晰Oa>'z\}r}ύg)͗!w7w%6{.$&:hDV+`02)kU[! ,֒7ӛYF;+4& .ljV(əyb dAk3 GUa/if- *{2Y>'k}OHgm|Ӌ;]dWB7/'@qt"7Bk2U'JgH% [Z:B|Hn.vf.0KHi[ "AIIA~}QYϕ* w3C˃) vnTJ9UzZ˻ߴ򛢕q^pFV˼iBPwl _Y-8נ<Ɗ:^R6,1111Jl:>9v],B6n -ʊ"SYfES 4= <e ̸A*xЙ@ \oK/L~SH/GYk)@PXwyM+ٖTd%ժ|~kI)=ħ+\ } =J O"H*+q7i>(0[Rhpep$fZcR;ZS*P˗.@JRSHa<;dg8V- -)4kԒ`k[fz3hg-1@3z,LKd\|$2$w2*Z0[ZP"vyizchØxb "X 3r5^ufK ׭-1퍔YZcz{]Z”'7TN$Z>!pȇ2g}є!g9|8<maѢ̇I>(g~G7YPc~( ߙ}"(ezda"=%rM `#ISI E1▕"smDfXbQdE7|24:(3D_M-?оYa<̞"4kAVehpOf2(0[ZP֩Z mI,cu>c5,[A㺠N[瓲tB >e*w҂(nժe>ؖ2kRaL>| E'3܌rڔѬEӒB,u2rhْfZ1‘XX@8豈nTW,P+zV];މMKSʥXƉhĺ2͏LI(lRnWecd&KIGﺵ92d[jW播ёh=iLb;[-Z-1Np]!7)̘H^%bnPCd?lNQ"q(AӪ2i[mVl5ICE KBȻ)[[׳[5I(/{ab1' K=MX lqwֲ҂X9kQIli KgoLԲ"9 ݌W͛$x!,,p'c[E)Rf3 x֢diggOf b H bb(ܪ-~6(WjTlI!ZT<[ZٛYF;k9:nuĐy aL2%lFښmZfK b1Eɳ%l1emLŀ6gf\y Hŗȉ gхlU{[}K,Zw°v7)ފ^k[07y%0emkdYa >OH͉u*}Z.g1Y(59G Goxmƍ]sL&BF{м]  6R%5ꘫTކ4uSR&p4u3[1dnxNC?۲oף/ / //*d/ ja/f,.{l$(`Aѝ@Q =e|]<-p$Mތ@^WQ~]hEVDS/%Zm A$voD,XC,Qt3y29DH'Qo)EW#<;.y(3E(j"xoKǶVbm@BmԪ"[0WC='뮯t_--0{3ς|`_nJKWz` ~e?WW m/HLi-}\<=dpWC%6cɛj<< = NNz4PYo'xVV SJҢR]3&9o D! 8:Y {dČ&/K- Y4 +IH7Ke6ALUf_X>T$ďiArGɼh%Jeb]W,`6 Zһ,J}BOk."x!Dzݎ(2j0^8Ty;usZ9 Pc= */= : 6n$} 4@p!94EBO|"_BU YY!UL SUT_X>T!yȏѤ^ U:9 t>s{dS!ezqtA-N,hwCz:̈́؏i!?i)ED֪:1yL9PH8E^Jhٱڭ&!%|X:z [Pc. 媖)%X!}XB})36i(G2!C5xbj 7\-"M$;u*kV@NmRQ5[|S#Ƶ(J;Sli|GTU9nS %3$O4uXSM4D;ӎE;Pz3bؐ&:d`L}aw2#/6sx,4$ SasmӠ4h]f?'Z$F勓W Vu[9f形 #qk2zj kA~p F&K E{:f'mA2 -k]P˄lOX ck}? &\*UzCB! [r ΂ ueyڃ-~|KN~ވCH'K,BQ]\_P?T5cqd->aw2u(ܪOD75%6ިQl(CReR'$l/n[fz3pogv4"@}2yJ[o[ +m-rGзmCO}+-Q]+4 :Znw-̂ZHTW-ʜٷ֡'t>nd,zѢ`uhIE /L/Z' yh ~|C:M[HX!oxO,$M_e!D.YW>_C$e[ZٛYF;ki|C|ki9bv ;="Q2{J0 -'g%y>Ͼ2kR>'#ޢ?I#ƅW*e):}HYJKȹv ܐ1(Bd N>-OË/ϴ8L Lի/kzbezжki7>WOrDc2QT'k_ZɆ]˜+Hnk.%RRߣfy1iD,fdE&pio!ZI'렇"L_hWDCWw#jdή FeDF&w2jEx5\k|ڌ~@c,x/H^,VSy&Q$RO͜sҴd鍄`&MB.gC*Rxgt7}}_EPz\ ƙ jX%"m|,FX>6"1+@Ħ"ƍEYU&rz`qccGhy >l " W̢L+UߋU?BTb0 G1|wV'*.C񢄸:*50Kgfxjf/u}tO9"$漤IM/>:%F*6s C0$BI(%-@ p5Su~dD' $oՏ"E.j_i,K{=n;Tܵ gDKxР$P@51fI]؂ҶnDŽ#޻դ$=NΖ“cL[` @PKө O1MMoj}:{<&Gg:9@hzc(:(\ B9FKX&j>CʆL'}d S=>N@f):Oh6B @|Z ldj1|kcm_ PV$# @vp֢C8 _ߓd^C<6^v0ZHt EnȾEn#8.ۋD]{m%scR;eHH_$FkP !-aNuNYB+ܗ98bJ;lKe—ֹL BM[Ҵ`PW7LM2ݍp]NIbHY-.BA.KE!zqC\l:my§M w Ъ6"1m:"}v3@32s-ys9beIs֐&g23Jj9A +ϕ3*)2J˳wЗn9vrڣ/-z{~ocѽf+C9bBΓv֋b(Lct6a/(DGsaSO{yPɝ_ZpyP"fVR̜Qn%v0\5dR-}dʚ/9hg'MJeG-'gfҗWמd}2@k+ZE2Uν2~]N,;hƳ8v,"`~e٥qe-оͱ37,[ l"TFo(]{k8{99?0;0{oQ @98Ĝ"wXf^f^>aoh'7|ꋽ*) "PGpbcez,оν3,;KN?݅n]٩ ˳W5*_='d9X:r3-cywG~zPM{l[ @q8Bhgc( `9f՝,jqۇ|/ˏ9p8~)츦PZہ%'rQ@h񰀯4=pj|{M $#va#(G{21 PSх+{~N;&'PcѿkfIbF @Ђ$"x.}}&s&T` !:7W>j|t*zJ|b %?i}3M; p~_pތ^\%*|J8~R!wp_1i6ƻI \x<0y@y(2Ŀ .H=731|h^Ô K7sJZlQF^SC!sD8XF1Zxf^}=; m IAD 40xMA$ upFQ{o-p*0˚Yi0Sꗄ)G u{Yr7ěr~Ksy˴:iy$U 䐥fq2^u\F8DƘ\,2Eo3F6o$w%)UhG?yaPc,mZZAg:zIZ[UdM]*N5=8EPl"UA<9LS@wBua2I3]~0{HU5q +]?]\,Kn:[%wg7.R2H憀ĩGCM.JܸhG7'L/%—*D!~ι9ܶJAR#ljkxTْc 6^N2Џrf.SD jGI$QhmLNȥP )AyM VSk[=z2S1g2Lz/3ACJ< *sUP M-:*3V'^z(+?ij:.V(!3^hx:xW&bM ^d<(\¥46!;˜$'@Q (HO+M ] d&ff `^]aSs57$Ƥ^fvWڪsZ@Ql_xcZ9G" LZ8~+2p!)CpRe!O6*gC"  Y >P]@f]f1qN!h] bjێe7s:P@eN!6)+8&qh|(ymA $|Š815DMo#CNNŒ+9 9Mrđ-`7-E9J37"榲o\j~|ʼn3#1WЛ&sy] }-Ŏdĺ#28G4 J)n7qk@.e9(V{h,k+NQN2;Izw_FFxư¸Xȉj94m?[B"BX%ajH D. (CAU"1k~F" (gӐHܸ[1(5EA.mA CU"뤷f`V Cf]Ī*.#ҥE!`3}TNC[FSfV4 zb ;q R‰ZLEwqAf[Tᢐ| AXR]%}'7K=!S 01}KA0Gu`MDC᱙T2comvƔZCzr9FB<y wm{l۠ fB8PӫݷaHBm4O`Yԇ:^ p3:B?Z$*4NTڎx# + csC$w Rxy@:p s0DfJn7W A"!FHn;`}^5*C><Ĕ"Igid2`⒙E22'&>ߕ pݔԪ"3ZaHЃ>_fjrbCGpy=So}ᑳ߉>}ǝ+^(#i~'p._7~DQmOݽzNݭ=7{wEYZ`.4HS%ƝC'BB# Ѹ=od֋n!d["߅'0=`N} ^eƋyc+nb[j$e7N8\ɥ]/:ШD=D=Sq.ɔ9BCfaz}%Pyd Gݝ(|=ZtyP]/\&P⩷ zDOȮ$ߺ]^|['Cw u@.>?9 :=T~ Nܙ {d́;Dʁ HsPYnwؑ޲˅B˒6F8s=\vn}Zk*@UǑp+ZRt77X]qI~>u&…s0[Co$Y8 n.Yrr\8A`<~vk  C^T7/̤wwNN.{ux$/]3_A~D[5,K!')@0/>^ *R"3\'%#oS.I[ /<! ^$$_p#x k )aSU#Ak,.$@LN[-fHE=*otQLv3nLABb[LZ>'@dP)J@wȺ#=4U巙y,oXB=)DRV8d!ZbYϬ6!0-54N2 sZm- -)Y^gKj9{3hg->7, `Bz`Ov0G KƤ rIG[%2[Z,c u~~iH:ɊЁ+og^'ѹ#M @zRfl)hKoX2Ct3;OClR| 71.y?̩ N%qpH BHDNM6hX%`7))ib eJtΡ^,;/g-K}snxg?'O(Nj T8/'%?7f,?QJP(ox;yo)/T! p'j!Z,geQ &')YQ x9;0$ @ptII)狣'sfZ!`za'3aUೇلK-V>6qUz?+A}hg7~ H~Ut7[py7f!s'n : jů]q7I&^`TgR 5r\ c#nҶQF"|܍3^GEۧ?brȐ@($xBzcDkr@\2j3 i`6qE5.57@ebcΙH@j&w$ 70LPIL`Umg׽*ıag)V&jj_8r[ 9@>> :po@FPfQ:ɜ㶖N E֒߄&ԟPt2/aAȮxR_z9p8#ut/;қBHI; kEoY?R,PxͲw;PnFD'Brҏba也]ϲgΨ׃#7s=hR7r|NtLΫ)TL͘wm >30 l )SҺN­=ma-ETN߄&ԟP_vGfWqq 1FR=\Q/rB_~Rܕ_AiT EWM~I{erB_ɬٷ@1KFH`4,Q5iXFaAҰ. ~xFR) &)DW9Yl3 .aCml5ߍ&7!>?38BVDŽTOꨎiKǤ1U=Gci1U`tL(Fc8G}/Nj gO bwN~R[ ,D, nSpJզi\ h\Pa7ʔp.hʀ9f4.pEĢJZƥ"e4.8ZոT)7)ͱ@h\Z"r(\M႐yN.*R,L@S9RQ XaVB i4~~7*_!r(],#5a]z{_ER~%j:r|5o ;عetg- 'iu[ eV^hg->M~ dAb@(3IEFXNǗN,jԢiiA 4۶՛Uf Aj)*?PAx2IV dRԪB5{~ղْBZ.µ4NZfz3hg->B=7u6gBdܞ"c[veZ̖H>ZsakI,c P4GB%$4$Dm P.9uf.EN!xD$#G,ɚ{n[FR (@< I#ExTVvN@xuF^1L*^#j.flC&)ҝBZSU;c4Q "fAϻE/d2eGsڑ&4@JKGr)'W3=(A{֭7n$ƍ XƇn=X+q{HM= C =܆7|ou#H8ފ[U^N I'I=+]5"PU  $De,1Cvfe|ne*eizI"e.R)^Wɔ4D= &#m R OC]+PIIn)Ow.d{:IESF34ct($f!ON\ g &hIQ<j i8fjQ}d@[vH #p*WI={`uthI5gx E(фщV+DNP+WqBK"WN 8NmL]4Nl|} ԴE&:#Dl%K$-1'56_8zGsk/S$:e]`ɻ;]oih@xOMŞn%HA2! 4D{0) ѕLӅqy% Iiy?rXmJ(I[H\IwEg ]!#I~ܾUO!zN=$bQ\rOEN#S txL(wH4TD3%kr 17{YEW)pBpnWeS@L0,8"#B"*(2ܽIRO |"ú[Ɩ#騲zك[\TDCt;zԼihSkjهbyg;5B cjNX`Ksֳ8}97$PPN埂>bu:'uτ!aeۜL1ՠo@e+ErB|q(9Si@Aji":;+Y8yCqhȘ.TC-FD9j}LcKS ! w~xrI7'Pb!$f" ͎~K̲&e$3S|W|ц:廝.d<(,r"tM37i)XE0vk7-jnR=@ȆM̦Ͱ)f-hp۲*=\xn(͖C ۖY.e3#p1M+M sM;覥Zٴkn[ݶv*fĬ-ynWeX-辕erZYk쮝ӗ~>Ů}$2CjMƱ? Eli,@7(]7kFP^،tܮZ4z[ @id 4>.@G3*Y4*#.) 3jt0,mT/S@ P֩o*B @et7'l4IʦFg|tܮ8PU5ij$Ӳ@<4o4 UKSP@b>l-)(J0 */n #9rγt *FP Gʣ6+b4:pUn( i*I5fu5zjM @1Qw)5\QHZ#F P,Jk:kcޛ̬ɪ}kRt gS9+p۪̔%<6%x,%+U\QH<((m)JJRd.-@"VW-@p& }L0ZQ-E"5Zyo#NGEYjdfT P h':?VH(;j#U P&4jt/g@L hP1ZjҦM~F @DmgغwRUI'|0ߌ\A NTN\VK- ԲdҒHoV0O"OɭgqF1"NlT&O r8@,ЋAfFlYMގhW4WY9#I?2~CHنfs%kwNXʞ>fr [m,#FEG6!vyH5$"$N"I-M 'eVB4º淊&hEd:8:qSΦGvUqzyՖs"j$$mt2o<"9u^uv]&5֒ ~γTo `>y$ "SpDƭ9Sy]"/5JEp:[fw?2H ⼤uěc%1\Ƿ"+C#;Ovj̡KG.n*} ġ 넫ZY˜zNlŞ 뤧eX' qwb 'l8'~q#D\ $Yo,1b8 MhNb"xcHyT;q1:v։Y91b!43HeN.>ʄ`]I͜]:qs\P1D'9]Ds‘wL pNy眀j3@#vH9)w3S6 Ty iˋwRl]"RމIJm~apްN8ָNpJf>N\/x'o<\l},`Ÿf=ZwFZ9Ph7Z83[GQJX2a2]c-l/mkIhY-R>OnĔªڛIB&T PY&zhZ&ZeBY37[RzhØ\7pOlяMFZnɸdO )G)+/Iẋ/}?O݀bHwS7ǥ)%X+(9 4uflzM`ښ!` sm]]0D"jLd(HUSd/X0("lVm?0hql3ؚ D`@:cBevwk0p+kNM5d5.TG@>vFoڌeD*41m_Tb"7Ect;qԤ&!z^@ۂr RC m UPpfxt kvXߓ'T;-qd=.@^i iMB1e. q6mkQ{$;kd*4$WU04vZI/%p%Z&|:Ag)#7ɹ/CTcw+a*cP% SgETdzYWuT@( hܳ%{J}o=ִs(vN`x cd읛mz?_/׳s?~x\ ^V$@oZ N|FgNC!oL=J$Ft_K#qZ{ᆹ[ގ P{]@묘^@83W1 .ͼt)]y\>n ǂuyȐ"r#J  O4*4'x$nuȌ)rX}&зg3r?w7;&\6D_HoD?H+zHd?3d2Q]5YhdfjQ m3pp*Ì=BPBAqJl9",;e|__z␬ 54^ R92L0xOd2'(Mr<8$ԄV]Hpxxp ,udZNҸ*QS6*‰iMGKybN۷@v\ 3;QU(o4&^&>qRH2HE d :\ ziRT"cvlmm r_^CBphw܄Vɑ~U%C "ϋ Զ]Ql4u=iڗX{@; o]k;{,ݐZ.`26X_#S="Ƽdm-X-{V_D;{<.dSW8Zidq0L߁\B>$:ks/tѽrwgx@%:;Y`A*8R+KbŁ(&BԒHڒ/2 M,QƖ]c-WB_#g DDY@=SJcY+5.d7x`)N~ Y.,Y)"@^1_i%:=}"L œ%w\a:99@^iRzcEI}x8g rt®-6ʓ' X8" 3OqE1wi@=:?E؃h#31=sʽ4^wC FL>s2ꯜ\AփM ^Ӿ-(mϘ })К"~uag) 7bGh- !4dlE.j,kXGW J">:t&A .X- Mhr19|I͛A-Y ԞU#2J3gi?u7c*TzV!,zcΪF XYgU|q1gyWDsV!W$:Ϫ+YE  I 먂:P,UQ1lGTf* :ŇGߛ96sTߎ*$Uh_a* .՜U΍-5ϪF>YJ_:ɘe;(B*xUaJ~i5qF覐VhOct&:B ՞W(!= BPyux ;.ez^CwWXq\cru[GS3לLg5l'ELP|hN&$՜LPa};hsLͱVrLnN&dHk4'%d甞L0o/y;H޺K\ȷsVʻcϥCM,mz 7=GĢY@ic]z-SେJΩl)=C??R-LTU,w(/MU;vSH0Aޭ̺**u$.L 1,`6R1)( p[Ye}@ČDْpH ;6&|̜&r+\ [|hk~jJ)_s,.z'qVԨM5pu-43r"*s•xM@orb8 D.„XRD$-ob9z iw"ݻ85PJ2˖K*\&{/s۔\g}|Q[#.rKO4sja.j'.yP@\xd 9: ƣ8UʣĪ)R"gW-1ͱc. Kt,zFbR1Y{$+E}K4p\]b4qJ~[jl7E̋(7=R/btlC::?f^.r}m^ feiEys7öэx[~BkS’?A !<p%3JW-TM:ypP]R$w`Хfm)T|t JtPvKm E!*h[EXa lz2M@Md#ќ8gu16~5YoC,v.>nR17moR‡G"U@Bxe>'j0'-0ь04"ahM {-o4^ f0pI'DC3c82PYߋdNrIP'=嚷VBZ9@P*/#M4^iL i& hMpMF ӊ5L攞il.5N/ ݦއƯ(lf(KI;*0͉E JDzBӊ~5By.TzH^BzTwSl'9B٪Ъ~~?;s!?[kb,eH]?r<# ~SvZɪ0>ij#Y2S)le"[}M-[IƆ&_u"Q/V)?D)>{E^}˾4&Q:AN>Mj~9ͤB0Hf{ 'Ֆ|բiiAG\ ے7ӛYf Aj9U1P&aCp}UԺx(VV8~í.+NY┵SA,N1bޔSږfB|Ap^D @;bkj@|]"ٛYf k9?DnN."m(Kb8fjQ E1[ZeØx #Z=H(ǶCP[]EEڳziۇ[]"®Gʒ)rpewaơxɔr9eYhz&9D90b+$t  L$r|14uix?+_W2C8v,`L&c)8}` B(C]2Fg`1Kږ#p*^4 UL>9ϑ+RϨV}4|m4Rv,i SfL@El-^;Rއ 7L@vtn'l"6QuGDd&)Od%6 G֙ Q5eH>Q{# Bɗ b ]``Xl aQՀd2ݜPT_2H @-UҲ/q!# hE;)@4YwSFc.STkh+Y-pB{dHp*9Wj5(OH]2 tXy|3is.a-}yw0()S Z Hb&?+S7r߷bqnN@%0T9/i`f4]^Q; 8yQw'  Q Y,Q <oKb 2J^ ss@D] 8әYBwUO'vId K`osV%:rP:QcISƣǻ<횫SiQ!W rЄ *E2eY%x#BqU"+f@:[-fz@V=C[ v%7bby 7amXRH<˽nzm[⭐oVw[4YdNv2e=w(* :!- Z?fUZf'$`w. T};Ÿpw}9}.| { wFD=Z^QFG Ow'#b?O.\B8}Cw0I/f2ܜmf<v}Gjyṿ+UOeeP' 1ɞ[K$F\kr'gDpܮː*6:>\*- ʺYCex-~e!+$+4I;;^.D;IP0xV&3hoE.)2F/" c|S; VB@|T>p 6BnWe`lgCopVKtZzG ~`1<Ŋyn0CJM(0LUS$[q.4ǃr:d: ?un-3ch]4k `ՖVfc 6&?m.a@HL޾D`Qg.:ǽS7AD%BI*kb*0pqFh)Z^bAZjrCX\MKO SϛVebrebNqFNF2*,=7SQqn¹tX+RuL\cQ8s 1₹g.  =I^0 a)/Jb?y4P]*&@C(REfhe%eחpTvo"r#3/t~ $:#oY/xw]̥̏ ]Nb2VpS>E<6 >|=s$SЅ7O i5t"|H34I^D"xynWeE2$D㖦*c)*uY6L0W5{Q5ʧN[%'8/YɀxneJC~Rrز@n˓|ܮx6s H⠁s8?x?E*ϳb@PgfeC.\ gt  k>J JTE8ܮDM̓i,cGŰbf#")R EzD`>e 0r**d^tUndE3 Ğʒ<_2'gG|!mPӵ!xܮːI>ٺY[gNo%VAq'Q| ^|ܮ0te>2$2#. 3X]k$<^'@3&,3Z z>VjcGXXئy_uA6CG8=2PL#ۆ͝7P%"JٗOkEEI#%iؠ@]jz:GŁY#J@PR#O2ghZ p=gٯz_>3Vh"z;S`}ː'؋fm O#RSPUd##[Ӓ:@81bxs. E2yvQ&l"4aRϢ֢|.N*nAc-̣m8 Aғfsl_NrY)X g%DJr|@iDWMD*lf(2@^]b8M?SK"]?* ؘ++Aqg9QאF+v(ezK+ UzJk+0{9q=p-V=Dx/Ho|:/̎KlND *&gH4c !  SȼfnUDG:+HbӰ{%^2L- f}Eʿg#?[׳JEjb5sHcޙN`%WGtNa"MWߖ,w38{1Z\ Ǹ0_8 E~;`Ed1";>3TB=X"[p!,@g껞c8l>S9kـDrBh B lZS[~beJ&[,مnWe, aciu*w&WwVU[A?~_<b_?<b/wpmۛp q",ÔmIM&ݡ8)%eDUw ]Q;t 8nIeI-ʕ;NXa8%1ZZ_v}OgZS#ZS>KVb?đ Ԯ< 1o2 +&̺!Sm1&K b쁻Q0吐!Dcq2$tA%a/  |(;&(z6Z- OnO-{dT B̬',jY^IgzMr(tVg`aXL!co1 X0LbRړW/I E%REsߜBDsU=MK|gKdxyǥa>ORVWG@ ܮTPz:K0m}t s^ җ`ynWek bp٘^4, v]< եLڴnP"i]nd{25ģ"SsP˹&F ]iwKf^z<.Z;0N2vFtRT3xg"fx5ʡnGF!KKbEb@L+rcWy/.\2llӌV)ۏ$6^2jf0-{C0l[4jXoRv^.u&=i.ASpG$+璱b2Y1C)f v#AM :vH:^<9jLRL̞c]vUff>1/ E۰|d _zR\2H2,Z7%M< 7БB} vUɫ#W(`7qe.'O؅^[Wm0P!%( r&96WQA)ELFckxq0GQK"a 6@~J-=]2u54}׮ZGH( qnWe4(N Q@*TDp`pO$^sGY$GvU> Ea󍄤eP LRh(BMwF e3O؆`/\Wms-jl Kp1&]!tEܮ@h3  f;^D!z)%pz3l[OĞ?*~i%@IM;sT9W閛~*vQbl~kO?ję܊Dga߷!F̆Vˋ)فo+z,g`~;@4U֥!͑D'rͅ*N7ܾQ+INf Qf/HSJ v]˓V24xEZQxa^v e-x20ٽ9!fB!u@(H #G ة  e wq ))xqg~Anf~nWeSGRD˞5t&ރzn^ pdR]L_(nLA<$i[=Rqf3$efkH?0%0gIq#`PSVK/Ī"K_ʶD+:џ!6*^ },dcD?Eh1 ?2LOdH$<"`œe]%?l0Qp.Ae@Ep#p*)5byDt:2EL83p(K(seL?!daHl`@Uv]$;y#e+;6x#?q<SOIQk2uSGh? Bw jP!AND wSofbxj}\ i5J>'"Y!5 +b 8~G xWC܁)E/wԈ+y& :Br6p/U|1 Ǝ2c]zx HeAGŵ K벂zТX<$$ _ q@rS՘D>3SD` aC#ҮIg h'4óUILˎ*tZt8il2҄fo:3B~A?׺WsL/r(2c~J)+Qpl@ė\ɷ[ v]&i-e;(_B]l(頼DI.UƙtwWa$`D`,Jg WrBU"u@pIN1LNiL- )ͬfٶ$fYCZ1=|ӘG{wIu3F{|}(QhtjjpYfK]Qdcz4d&``<{@^\6+a@uv(|E{1(`ZPCUKdِ"kR>$\3 GR4P㨤xpp=-x0BdjQypk5-)p[Ye}LO Ɨ#ٸ~Qo=. z:'k xYe<Z, --|™ WKe5hWj9${?o`_DW֒FA,2:=%aB'`Z0[RF:KTKDNے7ӛYF;ki|z!=F!IAD@ʙb^-SIhjZ S mI*Ccz4dGwkTD!BUg)]i2p#fDL⃭D~vD߳5ڕYF;;kqz{Wݳ!e2b2@vݑÎ TmgB1ZꪤlNw-:@$\Djw藓l`?WCF4^l\X![e`l- THh=kAh[fz3ˬ!H-@=/#G, o'¹oa9qDqi\OFim- І&ŧy2þ$Fhw}@O q9K= qf@s,UH>vtaeZ0[R(kEέVٛYF;kqr70"@(.9 Y_0G$i\/o끼ֲْBs9ڒk,cz4dɧ<WdTB|Tf~.IUjZZmx6x[fK 6q-0%n7wֲo"_& defJQIP{RQzMP|MUx˛ZXϹL-֢iiA'k-%n7ԲS,T~A0&ݙ쿄 qkHLA'ĔG,lkQBg-MvkKLofaG){k&dU]OE t;v[&Q*rSfKu'qHD[RzHW->B=%ґ<.9mU(yl=;^]g!-z.Z0[R(8\ @[KLofeEb?4#3$:SHs%nd{i֢iiAI^ %Wj)L7ٛYf Aji|yS`n!O`n'F a qB۫W[u%IPqے՛Uf Aji|dĮ9|xH#i8"WV0vq,`$&ph-)ݶmfZ1}dG LH6?Q6W[y, Yjd&8͖U*̖,u)C࢕iI*#]cz4dg MHA!Jh8B1iU%ZO'Aθ2o[u;JPzBے՛Uf Ajam#Y5$ 0@yg֢; I'l~OHމ`r_8@Tf 5XW|@[l%۴3_Ujfᯮ2R>'kወn\ɗk}N@q2".Z0--W-`ZN7Բz7oa_E\G6][ z7cAŌ>B8[oD~U!酿2ˬK-@>"Dڬcy#γr20LK "Yϖ * c8Wlx,c9[(@GcJƸdqq̖Uׯ ,cz4dyrn9[iJ Sz Y/"M\EfC@E?M?{"oY -¾jYlI!uli2Y>'k~OHIأ- Nc9YlZ0--g-h?[Z7Բ $*'k®qH;[|_mVَBJlgϾ2Y68&Lb~ɻwB7ʏP쑰"2%*̆RoY+ϖO,#ݝlzT^vaxĀ8e<x1" u7lG!YΡ6Y2Kh_gx>N|S"R0 đw Wĸ/_NZ iY&-7ZfWk9Q/D"VU`ByCejc /L_[S^,h306chWV0OJUJ*B LH'g`1W4{+vA@  gE5L`5d :0kѸ ]02p%}epDWP i 7 M0o^3"o=SVCL /Z +93,-cfVXq N/H ~Vِ@32cHC&|eޮJ}e{T@1?}H_2Rrd[&)`zZԧ~gofeǯEQBAb~B1!zd6~1^ee5(`ZZ{Zԧ~gof5eHU${?I9 2uQ6^q<,5뻯i@/Lzmxkof5d~В| _EwOy#/x|,T1} >»LM- - 4=嵖K-{*GZ1=\{_FwOX887{C1}cO>3([fRV2vnZtfveήZ}^G+Ez?IDv]!?f|=~@%Z_xZ0 =䵖C-?{,zTa }B?OdIiPPH|֢iI!liy2Y>'kOHqLi_~_~׿'d:冀O@-/|?<,( >2.XoAM~, ݏ;\8q1oKw_yMchW5\=,E!: h gi5g q#Ng@L־25|wPSCjwPS?bqԎxpڙ \ZFEHwPSwPSwPS?Qc{q]vZpVZo$~Rc2\>RhBJC R̋R N8${b2j|,Nb8Rwr$~cRJr*کkR\j^M,@NZLZNj9*Ts)w.5{;w@yeWyou$s-U 6!Y![J!Sq#]ٵݝK!Ӣ@_ *v~<{'VM)L)Y_{]4˙\>^;Q_Ԣc;RZK!SʝE)Ù&N- gR/v8![JДRȔҭ܄ /Tb2Z t TU;ӗ)2fqWhw*;heۆGxr4Y.ˑi){Phq |f?ʡcK)d꺸+(ORO- dRf*dŝxAZ3aK)dJxBJr}?J3JgNpBT,RtKMT:,6? Lsᴇl)BSJ!SJ?D gRb22⹮x+ׄgrg2t@BȝoBtKdؖ)d\pg*tgqgqRR;WpgqPν;޶tCV2wu[n"&L]8a2wQ I1EjD?OEzMldRҟG?FLB#ZYQ?:~X?? K%F!9v1[=xKk^Ux:“UV}c|p?0_H""dܡܜNZOZfVV}c\ ?i֝y\"M%llI^. .U`| 2tr43k9dx/;ឰ ##r XG*Tu597vy?)nd"Oo.U"ءbCq>K$ॖ'b6;=r:܃: >sv*.e5F* pbɧ@$ޣT]=6"B!'` sMSad 8(@p9<*( U1"(e yO\ (n; ]H- O閩LlZg`}b͉$WŰ}# )Ha:"oT ڣ]L(LAFDґ_LΣH"Syk(GhUĉŝ;B,bf~ *iכig ˜ e=_ ?)k=(@KSRqmhCb \%˰i+TH( йD@cԬ + NgDNM>&$s**uB (ka6e ?3]E78'bZ6؋ܝ&mC`r,T;L?jBl(|8 @8, B`EH֝ SrLR-3(˩О}A> A4!sP<-rc <)Efareȹ]o2H*e e$kd@UXiN-gus=n kݗ ,IXr2Kɸ{a\]}nZw}.fxK2#I.֑.^rKb- Q>n{\¹굯GSp)Wh¥\ށ\3Ԥ.j4=?m"rse>we"% `կ9~`帞TL2xr-e=p1CJ_I/yV$MWO#]#:H>VBA#?<Ŀbh^EcָMyx4_ů>r&Ko|T.ϖ"Y):b0CITZ{^F%XU9q ',1Aщ@,]ˁ7)]$.* zP*1Lrh3*Ɵ"*K\H\oRB1gfz~"rsQerlDpY`s2XCND(]{%<5HDee'Zn nkzrhڛ@IO*^r@I״"zP%R,$lb4ִK?v{ǡŏjN1Iqe)]Q*9?Q-qTUQR(~=5?i_GY *הxR) uS*B~ѽŏ/u ?֏0XCbޫX: ȌZZ2˴CNJ钖"avj-pӛ lQIp!={_lȘ|fX >?g,Xf뀣\ ofb)NIVM\֬#-ܮː %Ӝxy]r켼fG?rk]7O"(sÀ2<ⅎŁ`Wȶ ?֏h,s Ni1jRf*M˼к{ e)dB<J1H"簦iF"@: -pv@O [×0#dBz3)jRf)6!@j"ZO oGi1~cJ?"8S7P'Vis|{Jd*J \9WQ=M;~'Z?"N.t+W$[yL(!ڤIŏ ?jXOSY=YeMv'Ds$Zfv4e،F㐹JmfC. 7z)U zObʴ/A-㴖QÄiSԌN'Zj`jQj-L,א]\ e1%#RQu͂i+}?9?p *ɤ"yB7,2$6LHzSʴ]޶ ?YWL!RU$V`kPEJ8}.^A4qb~8UQ,|ƒ5~+/H I~}_tٸ$Xo)Ax$bhK8!<wI FosQL_|Ix$ +<2lld@v@=?a_-'qi y*X9V:/ w'5$$mi,bo7?=w<"bo(;,vٖA]]`hu^ʸ$W7oЦw-bWﻈ]v3<OtiQjf9a<S"t9~Pfƶw ^2/x4] ]CεwGn NdOwoA t11 =o{XH1YM6_`Tp?Yi 2"G?6HhQ8Yϗ+2*/ί*O5EC> u]]E16Gz,vVq!V_C}6yvoPm}*qON ش"p+jPQ,tQd 鐔 G#c@塍oDӈ甃QT,~Ji-~sC^bU;qCG^yZD4lP8[yi؊2񙴙|}{|E>i/M oC{&sD_nOnv%xt_qe D@3{h~}]` }&p*w\xiu˼Q3ǝ;|cڱTd Pv@8/p}"Qw"gʷIX CE!D2haпMmYBp'b=o=%K,IU$??w7F&n/Ʃ c%TPЎ D0I[^>h+oV?ћfzLo?כwflOf.7wټۛ{lOf>7Sټneo|ѫ+v)biSn>G8W/Ci oÝO߿= ?0ΩVϼG8{Y,g]*~I($ܙzg;PӑɠD/Ңk?7H/~mwY3?)qYzQv󿛓۽ gx.V*p,٭%Cߍz/>@Fr7z@/MN/l|g{K{;?7ʪCnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ET.svgz000066400000000000000000000016431221777731700221370ustar00rootroot00000000000000(zHcountry_ET.svgU]oF|/ @o?S uZQdK,Y˔(powfgt|mj\u>xf*m'd^j]~ur_[/j4YӜ_ [\Ny~iv݉]on ;G͇bGep총V(c x#pҕU-|\lq;oǕϏrs}n˛'G6f\g,SNU|&O8>Mˤ߿+9XA,kl8Z_9CS0>l1Tl7fWwv\%|؆Q:RLgb|yq⧟kNJw@(E(}dKuʵ`E.[h88w*1r @b`#SW y&ܫ.pXpf*bTP){wE>PAGbÁ4f1WF" Iwmr bC+&XE:y!• >/&k₦=ʹ8 7[ Ăh1  pv-~zts**Ԣ=Nf |yv:RjEϿ"6!#|u]^q@"9fI:@њy4J&>-&` ƌ3~7Or^}=!0{Kq+Ҟ@AS(3'4tCخe턻Ȅ+6#\7U]: ^vথpaG,.!q<ڸm7gFcbKoO˿V}m;navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_FI.svgz000066400000000000000000000004771221777731700221310ustar00rootroot00000000000000(zHcountry_FI.svgMn0n 4 ɢR 0`Ld[qrHK%j*ov;:0 (D9T\4^pHBTE7FA ˝c,YY -z, Zc<~6A6al;աqB+Tj &JCBos]gկ+nLȬ[ƛV[#8`Cȭ*VѝQE)%Y+S*}ռRr`  F|$$zJ363,S -qEŁKƳ{hղs3L"~navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_FJ.svgz000066400000000000000000000335271221777731700221340ustar00rootroot00000000000000(zHcountry_FJ.svg[ko[G>|`~?4v gM^ɜȢ#'~K^Ҳ%3XHbqN~W٤-狻glL]ny..&Vt'ͻɏw?g~wCh_v巓 D[_-^wn:_ӏ֛t\]Zә˳ݸl;gm۬/mggnկV3ek6\ͯw]elҸK.׻PcC1Rv=㭈̰u^t2~xaf>f޺{jY=材3ͻ˳8Dr`j;ӞmqS7_˳n7oo~XKvdcasat2hlưno{eNײ̫_>& Yw?}߯,Ͼ/|b* ۺ?(%lvύ0}+<<;nJ~n~zÐ]rװy}TQǚ/0Xlr1ڶq9Njab,&A=bk,ٟ=ޣWýp~'h=ָLkm/ i%+=ڲ|~yr5WەAly\<&_koC5FwߖEiqi㯅gd*cB i>}8Z\NW[Vx1׻qk`t_|! 戎-ƭXG,wVĎ//(MWl7`y}Ŭ; (5m-6+GWە^\S 0$\[¾TM'P?Tsc]ʃbwÜEs1t.FnaI,N?~av#MKʺ&ڷ7$vrWrᶿ(fW TN +CPk';` A | q_clvz矵GHIw[x3JNuFX 4ݬX:\tu;)|eV[[R%YAs|sՖsuK!V]6ŵqF /hcw|_,eNgEu Y,ʆ=yd.ryCoZwgm~E۾u._7#.frۛm_?of`xTݐ-ׄBJ02%J@-XqxVS䑉q؈"mQfپ5+/c` ׭<[sg2vi])XGI<.`0@v(R59G]&+Ӫ}dT=cկa>bs _Uq9ٛn72`/}܈x9;sk;Sp{>H1 r{7yO6»I_k2@%8kJr}~=tNJc:J۔sW2kL9H;^vInc:DCv6a!&zDB2dO(|yM~gƁ]!ԕdw;;D= O >S#^* ;N|==Or jot@ӴުzCx$RGл|Do$5RR.uV 8PALI 7 U6ePѐ2A1ҧ}c瘾TP8P2$~$ĈY ]ɻQE>Bcu\)-xdٕh";d_"gHVOUփ%M$f*E{V(Q(/#}t $)Bw/ɂGp#*(W(i@' lM,dt$8k78Ovfihʖ2.Q>6JQ ƂJ`ddȫOYV5MjpxBoͺ(v-ɽ$73!2bTa'rI@Gaz()|=%,YD .s%h]qkFK!9 h[Wz?c=6]-}ÜmVJCz=͎1;xÈ@e`A2zP wxv_oxp%B  gZMDB<fĤ☭ey*IRо+d,h ToTitcNT`!tszn Gl&QF:*!R=)A6bBRPjv%3/V 9˦I*&i_kXzS"TIjNdh$RM@Y3{:볃 s$Hb &C$/@MM mR.Vd5Kϙ!<;BĞ3Rz8=`G8xaYmNk`o,qܣQsqF#'T@Д&[JY8QC C ZML eAdဨ[ʈixdiKpE b. +0;%,/ hH4XvtZXad!TԞqEuYhzIcxRZ_%;_ؘ#Ōx VՁuT;2Dm7†2b)Hp#c\PI}zT'jk:֪ZF֭t˭{G(*v/\Ք.oa*NMFB!XmubH ` TUms{:U'×жr[ֱ j[EYUp)0y.H-ᩕsUsZp$jXC!a@6y'ZsqW۶ӂZ`#r,onfBq0DfDȼVB<װL`Y6f 2nO&jlΚ&i t\ eq*lxkq"fe(,1[ikBJ@.123!F!Bs`8&j=hq E"\F#%1-!눍8@1WtPV6Jbjq&*$Z!#E#Z ;:}#MR?=2{:x)28l,!,N]KZe4CG@ciEQ 4FL1O</WrXj"Q))N r~(; [nD`).wЙd=hqx{XShX2)YBr)OiE^pD5v W?B;Il佐Qqz-TZF q%(&kVX=Xq - Mb8FHjP)\ dqx(IDYT[4 P/p*8b]eJVjf̞NGEu|%FUu58~osh?Z3wC.>0 " Amۋɶo HBR\2TLB`A$gO= oϰI1"*ߨ )(xRvOPZ $Jz)L\Y ^}HSX>T8EtpNY./e`h+ѲdvTu8#JXwye Tes$}PtBxMsr[  E(/)p&ZBrr$ XbR#a*&v>bbr"=P,8 gϑsꥭ>aP6^>Spp0)sVY%%XKZp^Y;RA}a'ȟ!ngSr1Ǚѡ->8 .M:sp('=<]gt8|̀#ÚL' >CByla *؁{Z+x)|#X7|k >Բ-"jՊ*fW",8E"^D7r*j)!# s،*J "RvڍdM ^):xGH€~5W;[l6ϖcҔLD[p]8eKlaLjpy$rdt>bS8Z0+"JbG|v6]2cI%%?JI f֠Ж%ŏl&0fՠ+ /#$lwha%+Rk),UÉH/$qIptZ|83)4`ɨB|R4qEOBt .e*)_Uv=P|U֍B Eǜ(b}1'$DN;O,g_bF,]'3яE)D.wrzSt'"Q L^ sRڇH\eV^(j!IF8ƃ0_9cvTYGEf",TF)&'8P5)U b xJy<6S@Dz_SMidJ1 3Z;98&,r^?xQ@H=]{!x#CuGEʲ xx51N!NцV쀗\ˉ@w6d[s3X]} tWE!\Zx%73 ?[\ڢO*<ʵ gx!CJ9oDXPC<9MU 1#3=+ ɥwCx`C=S_|x < xjEg $X6 %aB~Gr .8-QO Ae4τWĪcՃrPUIZâ4 !}si$pNA[R|1FEXVҠShĤ c^D↨г+>3qjyE PHdni/_WZ?2Ÿ:@YWc"x~ێHr_E ͓a6`f|{V3R2%'Y"{^|l!"SGbS%&8زm+kAWt7#)\kΐs <HSL(jс2q#<%(V55.yCMNYz%xj К1RBᒗ_L'ߋ|yEOVGȬ:Ǽtdqm%F+Xh.u=Eѐ(Pv}|8M%\K,W9l%~H_s%NH@<0*ˢcJ\[ϵ+| ROڎQ<0Nn yM>0=\[^89ڤQwWDddQBi{hi}:4+.X)[SC{k ǑKV{UzNbOnm,˪ _"<-"{\'L_%BU& HH|c]PF.3C(Zյܨ[uHh򨞫\y ,N!Y~}ZU*յ-# lhGv>FyuՍؕX+WQnumb# 7s! YvC0Iz r7K꼜֡$ %HQ+[5[nTظq`ozlHZ$9?6j+s2rJRЧ:$IF|S %Z# Ixb5|47CB᳑12.M#J}#F, Xr bYFW攒c9N7 :>~CMC7UUqR'743~\G+-dۭ9Gwz޸|(/Wwn106Hk0WX;E&YJ>x{T͹tg98]Qs{K7a¯PZf- }2M*^4{e9Qx9)*VMi;>ң~GUǢ$J{qZ؝"W?@E.%vR9<g:t+wh>ҫ*Hnցoձ9q^A孑Ttv=T ai[PH(u;]M;p*=W9;PEψqGq(%#&Cog0'*@ږ*ڲ*LtſNex| >'CfC2KX o2{+10|ooɊ:ՙَM@ ?p oW@ȕb:D|\0f4*H4"6bdwn10_Ta_sRa§e0̲@v&JKPҜa` ^ʪ7Oaρ[C"ƜW)R  <1ruf WhS5hq}(g\E.įsOQN؄ 罚Ui_!ygL5itaP3ZNSȊ!&rO]@XL<դ)ŒurlaY+HfzKa>jI$;}oەW#ZByz+3 rwkڏcϞm_<"S5Yzy>S(t>T .R&׸-ŀ)\fV\9yx@Jp(mH1 NlrA*1 Y@υ-R_[~^/r k(gmeдڴR;x.WtEB@,a+́I % YUd©: Iud^ Q/M=H]Zu?x1(`ɄUNye+ Op))tշB+TR(z6(=GVB7WKtH`|2Kg{8-өݨ9),sKZf0oqY2A8ؘ2Uz!.ChIL*{c$eፙ\.c.S {Ys$T]|~[}θoݦ&t$SkR0BAZ/*=K~mcs>L"&hK|u瓘a^$ k&{I9"dLsS,c5IM3rIUi ~Y'ϝ% W< #Pi(OF%-DFmxSfs0֞i " 5`y^8tƫ.>#/ qԼd293c݇Nk7fz72WY"TA]RTK*x(ʁH$J2 ،vO @ DW(Q!Yk3V4"*$:߭Oa*Ԩ>ߖȏZ^ #<\TL,}ץnAp~KP)?u 9DxקG>3\IPa{Gqp"n!;.T)}ʿ/|˞Yo \?^`XIXآ_ڥ<“6'?:aڎk+8,yqx~Hh.#Pde}f\yNl*A6Q n&iXʜ_~u$Ðn^}јhw[1-<TBz_-"m`1%9v3u%al kro8!ד\kejQGso&['En.wv`J+ca^郪Oh3&wVO"Tͥuy[l6vJ 2d. %k5}1KC[dwnZkYu^Ht'sO{8B%6hyLy(Jd̫R C@{:5̼欫cGTg|s1zf%pK*{aDr#=?D6di':hkem8E(U5D$n׮<.ӥe*>D JUj% }<ӥuK] :>Ssٝp6!kY*7YU q|N ?JL^U ~;JTH{(. ٽEQ!CoCv3])pU,>{HβAi!^n5u8$~ Oċ7r݋n>bx3W;CF1tkl$srT$HbPZvkDvj H ::K+%=S>05m |GWF ojC-kj#bRD6J袜,*%[OZ*P:m3+: '>%WuxGqGmaouv&zpo撊PZ-96MpvqVWk ėK#=z$*m vy%(}axo=ҡ"D(L&-䀜K]E!.N|qA9[+tLG!LA9- ;Ay*]P2 uVN5]et@Tv,,bsd=ZߡIÌ#Ock#ǽa]{v}w'v}t薚l]'ɊQA%lv_΢YE󦢀?SEM50:40Qs#?`!DX{x;moŸW-hźg漟?}8 +$$j={2HS[fgʄDC N;|7ΖxaW|J&+wU'߈LsZ42-;3ԓZJSCU3\G)l|Ri* t_" ќ Ro!pKpKyVDȡ.R+&é"(@nxAݼ#uk AƟ;-*jʑiP*9.݄7BlbGrUjAE[{8CZsTfj 8*K7DMO ;QؔϊoԵ S*{~"IɄR-_ :"SIo h]Yx ๮H V/: SV%D83ꔲ/vb" O|h$^x׃ޑ_aPjn۸9"JکlC>â r;R~;J(9Z4uj0A~,KjP@=C& r;\'}q 8 @\3YqǎáɩHyJ+V3lNiIJ]%u]doJ"vY8K\#\%(da t"Ld5pRcm2*&)~rڊ) 1&) ,ʈ⠗Q%A/%%Ӧus"qW8u+τ~ymκF0/rf8j@ܚ5fsV֪R_Ա{Kd.l]/ iƩze  !^(a?=p}mYn5nVML4>\)Цf{Ys¼_ìڐ^:m=|2Sgcr\R1.[Z#q> n3l~׵᦯lj>)HrgN6Ҧ D & zDǕ`VJ )Έ31B킜h eEzU7~B0bpɭ5K"lCܫtq l#CDvB.Sk H޼ 5L:.l2h"]:[ΗPe^I(BLPS#-[Qױ&JVϸ<֚q^Ӂ9W^se.v(\p}TYÁJ2%PǪu~GK1>viC3r$Pnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_FK.svgz000066400000000000000000000603051221777731700221270ustar00rootroot00000000000000(zHcountry_FK.svg][oG}__bتE2ؕ0I/lIP,9~W&%;qPCu=u[u每z'b'z9]닓~vNFd9,Vd:7y/r]Ol0ތ~@;}urޝ=<^wEZ_ͦgI[}VUz_Ol:-kgWTdĽgL 1Fr;y/7ྦ1vkmOu/}r2j9z¬iЀzugo|\jݠtrWw0rr[o&zs|vqkB1pްURKC_l/Nt*7MgsQKN{8aA/.I{"ԃ"9>wJ3IR?yJ-14 ch>|((14 ch>|($PHC|(ǀr PP y9!r((o(tvz[θ%9`*Wg?Jԛ d)[Zo{N+B^Bi8quxfFBHکtV4}L.Z WXTtyyX(}I8КwgӈQ2ʊұ J\tPAsh~o ^XI1rIqt:CAiCA~'܇\`p((`((1`ںc0=a`z((?k01Iw ҳc0=_0޶~k^xDo;+yUJrr]]I|5YCnYHz|yxqoowJy~>7nm ޭ_mWX-_>*Ř;rzwN t KS50lal;/&uXw`=&Y,ޮ&Ѿ#R Z͋0<#n^}d|xQnjt$7s./Pv؝mԾ͒79Օv= )"L{)a=|=V׻NSl_ή;X\/}\fiղ-2'|[s|,M67zSXh閱yZ> LoLнRX\ju1_SC3o^溝ӵvOo$~T؛; P|M7RaGr/+ǯTܰS(PYDjF:t[MGvOkI7w\-2mR0>en_/z{'}ޱR߫<Ϸۉ} S)" DUZȄ/2 鬅ȅ5Hlhh!允HTR! X. c$%cK-*#CJW UpI2Դԙrtax2LFӌ(F`ʚL< 2֘HZ{̊1dtTb=B&K4$(L+9(-byO> zDQ*0 Y2N`MxNCP5R1,mAwL9)7UKq$h<|tK EʈDYF(FΆK3D\0F:r.SzezyTjpθr #+Ur %X 3&'V Ӿn-gβ.1J)1HZ*M DB@K)(IR츶 dIyl"9aqA.8R UF3NL5%oԚ~BM)̾RD6NĖ̐!5`&^зpT/HңL`mH^#fAO,h{-Q6JN09jf=vtN:Kyjœ-[ZK2oYcGT6VrY$Ɋb8UwP>- .]Q6q9*|FP5f}ו1RiU44L#-؉,v` 2-KAGv]%~CCu@>!FFb{J%yH b-ᒂ\SYNOĘIo SJ4RBGC"QHgɿ@x%xbL;lؓE$wvhqHP;!'DU̜*FqAB'e&C 6HT /[+4X;P"dѼ$7XQ XM 0d)D!잋|T@.rI3oދr`>wYcAJYHϬ phj1GLZg dpHʑGw:j,%Y&RM1d0. Af5=!CӺ j;&F.nr)!ຠ aE"nj " YB+ x/XpI=;$[d T\u1hMG /ȴ%TNbC,'@JJQS >9L3m_(w4n'RS^kC|4hUd_O4Iθrv0fڣլ7o.Ng?G,7m xht}}[VLvzw_ ٍ NBDQ| 8& ğZ@sB H<Ÿx"C^>ECQ5͚cXz-MX$<ƠCS9e-(^ 5\dݣ("V]vz=Hz'N-&_{)0PM3~o}I GxˆFdNyj0XzX($S.`0;V/wk< bc0p)eìLGO-^X'1֥R$,TK@?& 6<(wkRQ(#͟G2; 5gRS_ Z_ӽUMD+kys $9:%9.J2Ñ;rd.&8;:ԏ)1EI眎ɐ£-gx)m~5dn+ ʹN?cVG'P#ŰX-(g;r,HTe2U0l n+Sd K@flۆO,o=OAOl tm chMƜ`W.~4$  JeYM8;"O o3lG0d10&GB?%OOr=ym REj\"L$dd&ϣý ;/&ĭ At)ڣ;X,~%[0f/_ְgmdMГ )F+c6r`c W8{Ѩ:Zdɹ9刎.asdBuϒmG,᦯2Nl% MBuN:O$Etz6pg,ɑ "T+\gVfpcdf!}ٲ]q V@ޟ(Jrݒk53$GTnCrXـ$(9㦵sNm-];דX!1nY`Z+cz5^ɿ}`ut.d@|gKN !S[ʯJij5e(-^ zoٍ! 709e++{،;-c8;N&(h=}Rh&8Յ| ۭ1} LJWȰߔ΀w|(i./QRkʽVa7ؤO2%}i[v!]ɥfh`_>EKqqBù]o꽽2yޢ'g| 4-S <̌qamH4ӭ&\,6 YigRl;k5w߶ l^,;½Rpף%}4ǎ8jviU cWKwDB۾S6sۭĜAB8 h2s7;w5`ݻjE ְ:7Y0>4.j_jۅծFDc@5|#uW\Kv@5qX_ [[dACDԂǍΝU$ޱZQf aG*]Oy ZsvyQP'lcp'ZՂ鳇{:"|lx7F+]~oᡥQ삁(}zeXpOH- DIkJݠ+rǑFV-G$-&')ʭ9OQ#\ThsM/5Ѣ5>X'Sݠ@2Lm+R9]ઝשi\V=5f]psĜg-sݢMtmmn#"FY-S~.$OHP_L*:$90.RNt-Sw-z˧5;x2(^4zITt]~l-SsݲN x9]ey~nЋq{+Y; )`Er< ڇwtۍ5|$ɀ0[ZlZ3E:2 BzA`2pqܵKԮɡltP|D|_kbĘ`߳ 5 4u܌7h@k*_4j؛-In=@[/[қ9_ApB(8ܠ/gqt`Sԗ3ʯuok٤o$'$~%=b 82j'Oo-Hؒ6 d':zF.@C | M?&QDXbMbSF䥼$"@Xj \ z!df%I㎈\Jƫ>LmX`زiItOw@aRUt/?$gK(D}';H/AXtE ;uItm xEHGZ5®/vκ溚:iͦu@ۄcO=1b{|7omVstE>ډV?;;B>HJGFLUʫOy\=9Ke$/SwhLk瓧yk~wZ]PkN%N2ZvB bgŝx+n@6-L&%0 t1pWtl7vE?*[ RVXbY~3>Px|ڮ𦦏RbnhɡLZ³h06naV0չqth-rp"(K+nm5!7.Z6Vz c%}Iusˎfoep5fgAί.#1PPf!z#kUw7|ᰊ9 sy˖ş4ϟSI2 _V%OL4.Ԏ 1V_)CLPLC-.q{ 䍓$T$3DA~ Yы9~,ww>7bFRfǬsE"Yli _]ts4禮ɔhj%Z6W@_YoyU,8Zj-l"Q]+[ٽT eEvEC|# cH#~QI : U}w582 {y/4qP),SWGuM TA¡wv@'s.E;<\%áwY U[`c0%bzIA$:(߁>Zv^w؄Hg ؎zGNMImyeH(VxUbyFoJMr1=Ij9v5AeRvb\ 2n8vEA;4ozB-ڢw%`G B2V6bjӱ#oU |.c/h--!n-}3[vkDÐb٦7)>fW%Oqd?; G2d̳)c )x(]ل{7H~C8C[ OfhCg)4 78e ]ۇo#gC;%Ft1d c:wF 'Mݎ`H YDc&LPr%80I',(h)m>5$ļe+D3P5uDhJȒA@SyN5)Owߑ+ 4#xpGqCnoK7gon-28 -^E'( d)QE$(3QoAlPDDQG[ 4Ν wgϬe $mAA^l߉Mi.(Mw]h{'a5DvdKvvL n+òvgx sd,ڑs23mZ(|as=[dt6tC21L2>dPdv *yH bF2 " , &/L1J0-C sR"tfiXjɡG%@?2*y`@[FNsjs:YVYJF)H,:.]7[ꞀnKuW֑[v#Xl*6Go#{N K8khpU&2ж!%n X ա9hZ5fO@bpyƁ/ vYhH>2Y8XPU6%[Uls'*pkRXMUݩ3\Q 7d v d^9B#YhVJ:Gq})ɂ`+F:䢎т8r}N2qa'aƮeAcơ_ G08 p)* uQ0-j';Rao]ZV?(44eiCm S"C\\me܂iYsd-RWSkd,0:K'J"\{o]X@HE^%kT&()MlAhb)΋Vir Hse4ztNCXve i %l(d8-J^l舃kfoӂg2I/6[i0WUrh X'qQn" tq_QU*A*()Ɖmȋ uM,k$E$W`U \YCQZ & 撚6σ,ʤBL@nyGw`n">UtqW 4o <_[pxh QIAbNgzS}T6ёv(Qj*w kTP ` M v}y#gZt AUy?`b@CNY˓+~s0':i,XA!!$v$ EeTN7v(H22Q@2  &I!.sA7`dByt:};C<=t* smwle:5Zw':ھ4OQj[,fYY(}p=V&(Ik9ӑL'qHk:iJRw<~6J:Zv6ݘ.0)Vrsr.MIxp֍i&X*=l в"mtiraM<)ʸ)@d6@ˤ7E 6hrÀӧ0MݷЮ0u:SO/,ƾ9@ -ڐzULjEO%HT(N}á ș$6 B&4*w26Ec [3vV\f6Ш8ܤmo n<ә l7D"O#=0N@5EՃ o.gjW!\gu6r$NN,Y 4&Fk٘ ǑM'E( ژjNTYr:V rPR$z@ ~E. @QeE9O.0 pu:ѮaIQg1D# \T{ G ?,ST gU.&Q[6NDȡeA01?0Py>b~ ʹFlG9F ]u1鍩d؆+ .jOA#ueNsMA əL:̒_3'D* UBIވ^&wmqL ;H7o&8{[PC mVjC>$@.Y9 "z^v'`YH*j͔/QFh`Pu#D jTb% VLL |4~$7p˂㻓M⢏KqU ^$̩Gr|l,d ]Cm̊^8br#/j݉ĚE^f| i֠~5$BasզlfZ3 }a&6ꇚJ&AeM9# {8EF C]42h.>QM\s5,EX2Q#Gޔ^ N*LLз(.=T1K@74Ƈ'd?0P  z\=r$4u)[ƑK0dC&W$cPѵ,)zf%r'1M G؝HjҐrTTm%j8dI!hf2HQG?8 _3aRyFhfٚC9Q9sZVǬG812Xz㏘/\6h*œ|`p'. PD|[uZ46rNXNpJ1Q|ZW`2]>1*tJRFgJ}2fK;fF:A&f1H +de "Ӊ&LΑ z zgX rbϽ,Oc78PxTyj Oo ˍ`CAi..HO"spԎPKAnu[_x&~ij _ `u J?Z =̩FQ|#+nXm+Uk$=pnϟ(';&m$!1bfܔ0\}[s>_,ċx݁PA`am)wvGS6 0 k,  `EhUg {wцfFwb#M(80x4`3ZboҬ xw5DѳH`Ft40eorL!dI8-cl&'Grڃ"l"c4LS" x9CTF !0?*u 'm2z@;h(qT{Gik.Ph/m# ,H [Yr+ؔ0?MIdNM5?4xvh!YI+/E=!H[" )TC#Ù YjtP-?Q}RL p>85_!S< );#ϟI:@[+Iݻ@TPy#Z -T;,7H(ˢ,j[U>YV1r)M"2al b܈q԰ްMu8a}G) akl @=qEǯ` 0C%f3QF8ʃScf0/fI̲Pp-2唝Jh9OO[K!oy:zhh#uT̨[(fdfQЪl;43wlIk!4L Ynv<0=nJrb0x|毌J[H,AcP@H}/4Csc 4iВc-a{-/-° n2gDvǔTfK$DyB#,h́vޖW^,qJ@Bƌ A#5@_z #U$إa@$Ρт3ȸIoA1тp;oWd 1|􂙻f˃0xE._lAұ׻7:HgKQLBjoyb+*F^WQo!6fg)]Vq }M H)$OZB(Tمd+.&Wͧj.k=VCAGSBݫn0yzʙ(z3iƳM^@q^Ew ^kbXɅ=z.qz nACD7 gy* uT6ࠚ~{UGo[n|S(4x00uLh$ GPGX#C}"FuÕԬ+$M{ȟ(3hES U0HZMZעػZRU3˞`'m O5Q Qt:pcW"=Q"觥y04"(<PyޭT10Temq],QwХA \Ut ~5Zk_+_Ch(7Mlt!199ʐj!aRy*~Az2\ /CzQaV}'\(Qs3I.hx)3Z8f:0B~ kǮ\ً&H'֘~LEi`71e*(B.iWMzn fT_|3…YZtIƠδfĨJ4ma@%· D+[e.`6_ ﵅2=K3E)S9(N,;2B )?pLG+nS ?[9Gau!>Jgq\ތ\%8 g 댿@]k;/&P )#p,:(Wg°bx_;tD1g<l97귢 ! >YJ7,*' <<ً Z}S$7:@Ӭ%*Ž0j\PW1%Z̴"Z* [+.A|A5kt2MHɏY ?Cqv/x+ +Cr::,mIb a4[ vA: 83$"(oRX٘:f'w҉ʜ2~,n9ȂL!c%JR':HEnk7[ Ek7O'p|xƵ^Fx:bDPVtcI [I5H#=y8xw0q* ldjxV M $Z D\{ #@|f+O`dޗ_ ᦄ"HPT,3k*\5Wb SWkat)? ³JےɃ@ `]([@3v]宯^"fO+^k!\Pȫ&bZcdoB!cH; 0sѰz=-N3d_>=}mI"fk cnc[O*JPP۱8:N2$ӎY0mw-&E펄v?x4NrrMqv*[|7:=;;<3F֦>b5RCtzHEQ32o-ĜmOGb'=\ ZEׅ\P$ , "!)K2eT"TuCaE\>HԡwNTեNnk%|>HPb*/\kQ,3:Φ[n!tOȄ#lcB쎊uEb):-6ZY0Dq ;g +4-LfhrFϐxG Y}FV "9G1(&ݰ%K (y"ISd4QAu/d,PDw1-V64! K#qH2X 8f-&<^{LvXн;U :>Ы, p@uƙVЁttiC⌓e ub9h߲]#t":ׄǬLBc dd 28]xrMé&4*Y xŌz=rwT[2<>c.tE*n贆 8zۙ2`/p~z%[ := 9)2\tTUC%mƲFcwQ ۛXBmgO0N V ~"ҒS^Y̒7C(tyBYHѢżN2Ph]Xpй\=iA1kguԂ<Cfv!rXxf*8D?L?垮>w_Szq+]*dx2<`UR8ØcXx8}V!6a`Z6-^dd5`q&T>\#; E)4wbQy8hNRضJ.kN]ӽU^*f*y͔8R*u$H:vO5ʬ)efv$A' ^~y Q'x˼C!i8)L#' }IKuZWPYv\~iͿY$]o孰peaFBcX, DFɻfBfǯ(Ɍ@!] J̹ʖA+(}Բh$w9ɐ/PY84`Z6ʏY!A 7] =,$E73xPm&q1 qMTӡ3ה^b*-:˰]b6,Fèv7/m׋ݑ`ɴnsTXM04dDx0!y\L[t:Խ[$l|; U{Z^Zd-Լ-(t#(nW`e ] BMu#hf(5 Z[6%UdGjҤֈ/;s&×gt:$fk#/ h0rzVHh9gꊢf_e$[ycYD1;E5fڬsm"[6XuNB;TB8뾚MbK`gBTKND6J# `(I ]ebf&X ]@qtC=M=܀ I r@g54:#/h{442 oRx} [R#6$H2m"@+pᅎB'9Ip{븽RkH- 2B-QnBc0)`,A 1cPWG*jQJPh3,p nF,?7u1RX X? ϊ?&=c0 @H 6.!MA-D1j'3M>E3guripźvsL'zLhA`ahKRst&؃KbQe`liԢdo#ӥq( Sbx-8yv!={@5wWٽi`-( ^_A(ҙrGJs} r}O]m/F(5J^L殺+^G%|ϬhX?=޸_!셗_?̜?o\þo3n]` Pw^RU?](Fcxr iRsB *c@?|…wvk* k c@7`- *\~z:Ji,˪!F}mfeN:Tś^TLJ 7"EEUtKzeRCYaOgÝՎYS %:YlY.HDpy |!|1kdtvx MK !UJCkbX3zd xU`' " rz[H9hE8z@DaŤZ#JcY`s.U *s{dy  #ɟ*:yl4ܿa (m}bJa>|e*55F%qHGNDI 9;z+QxHX alRP]H=U.Q.UQ(K; |ɪŒE(V-AGI(,adA,2"e TDQ-ʵxbioHF*F{<XP jN{LMGdrK%'({hy=S;h{~lälU'v9 <[XM(EkwZ2C^t F Ua>ĐNF8(%xDWzcSHk悙ΙwYQ76#ԁUq*Ζ`>A;e8n !1#܏"3kFD_qqX-E3h-N NAY7V8keԩf&~'QpTEAIsy36ۓr>|Q:z|NGa#}{eS80)2z47gMPt$~g:V0ؕ\ Yleg.{>ZU$$𑹓{#*"x$Ȱeq2J1m>1'C .w8rŲ)uCYT+z. ;|N/CTYo^ xu:p"rVy0UxuHo5A q_;T^h/܊$ dD(Eb y)lsԱ/mȖv- v9/A"?u@9v5;j0/a2{iLɶǼ7ͩoBW|,nWbاs/*LO=0T сȇ{.yySu ]DXX.2}!x# 1^8"fH$E= Wҽqٰ kmcV,<|XL'?Yu7,z1ı3WT**[WrTvxR5nhncM[T+ E0 5l7s֝HfEvTBGm6!eU\$vF .[;zcn۾ݶzͽY{z?=~S3-NPϜ`z_lkĪ)znIaBv Tbbk!˝.ȃ)W]o ].'/uEL8*A=sBPc$񩳥 !ɣv1ϛLo_\%́Crh?DH1V `!}zm}xW~ƿ]?=?(r(#?`Oi~ `fGqKfaUyTC{'_XtD^Ǝ4L/`LgYق`)_ҿ 8*^$և3*l7ЂNox0-x!ʎj=3Gox`5^4E-*։>L d[{l%y,gߜ, W=.Ïߵwv]<ͣ:2'5VgT4D㾰0w&#<i1e$c>F1ɢyr1藃a_Bx /tWkʆ9قTJ+ ^O7@Bj:6 )YS߇#` K 5fQo =U,O:(4Z-(y,=M\lrD(4ZKaj#==w&->&E1ΪPJ/ZV) hr_#9 X+u9T/MQ-QxWDL*bR6hsC3ȶ1$ XQk3g`(J~:.gBV~>ZKKt^#x{X/*9fmJ GN&kӁY/^>ӊt”yN`MZƸ.+|!@%tէY{y sQG>`sjey~)w&-dSLmvgjS[-RsZz'5éhcR9wf-?f:}$ѬU.5AzBc |ΝY+Y4ZVp~5G]xTx;h;9wf>fӨYE4Ry0ey:*Jln-719872ڹlEk2L D (Ӥ հiU3}sc^.gEelӴẺBr4*@V8VNHdBލ BT aA L){Qc)D O(f6%Ka5sU r E}-{lV5sٹnܙҗL) 5aB g%i@TKL MS0ǁDY/9uq"+|$TdL) xH\'JGx+& Dn\cj9>nLSQ9k >gUC_ 5l_ A8,tAK(NOit$\a%mvI>_ΔQ1GIOW-(xd?0!tTz-v`M#vqcq+`cPyBSI$zC8:PU.+9j+; 9;4%|5VwN>/>\\EүP/ΔEwe.! _[K_X4_{_UULn şZP=:WA&ed![w eG+P#54]]fTYQh`Y f`{S*1nidnl9RU]Tg!JV!.n=2&>xc_2u*sM*6-6kHO.=ΞOc SM̉=00rNNrH޶ gUh(,] 0@қ/Au;_KpRX.ӳY\n w)C,4~0gt&qDuJ57Ԩjv;_OWsy>Nhbj\[|jLiXf$ &rS:8/xg~wZe(\ /Y/qn@uW!m۽zb̧Gzpх;YO% izj/'U?C{~kto;:Vj@++)m2(Q |}闑e uBU_\p嶼q_6N`Vv=IC,^54.uDžD~ʔpn\HaF.:qh{%t~gxxO7w [l\PuGHXKug] }<ǸBዹFK"NaSc *P? 2&C2iM鸢!M_rtdb U%i6t:E?5H]LGcᩥ+jKymKj,z񣖢)N-k! E3pA?ݼ› @s0Xnk0i,}I?ݸ3˰0~̵;nh5\sG%מCHfϼ;+3xp_~\?wEGN9]`lwg]WrۮKLA_%׾d_ӏ'7^+{󵗷EwCɯz H9|=Mŝt@{N?riX?GjȹIunƮasB{`:t8b|?xz3}b3n]S| vk~e;Н. Gt"g뻾){[&p F,jhARH>(Ij05}͘K*/ "TN;_%x4DoZ#'<OgQľ傾5xLNoٳ&NsDff.{QƾQQї/g-.s]J;|Ե}z#KS*U#''ܤ]w(zʤY/tV~+|ȥCX!t8U]( "H͉ ziޱQiM T+!y5&*lǼ6!:=oE/̵OKMW5kM E\rG~ooC;ֆYP˯~׊P9.{Vя{FѽRKܩZ|ugÛbH7_N-dNǂzق/cA}njj(Z?vbt){@|79uE#!ɞq9#Wﱚ>ba2tmk$8 Co]oss>~ 6=:j3s4ZҜvoQѨ[FVؗV2X{If{hο}rk_/y13`*~}fGIr99:cpPjOlK'͔P>N5O=_D Qc~;Ep~3\_Q^pRZ"fDsM73" c_l*r|5"zݽ.3uHE |r|=^\$GMwNFAՌ%Y陁T!~Q?H9I3`e pZ ! m*^O7@V0ݬgmױ2s5>W0+JyM~xR;~A?znavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_FM.svgz000066400000000000000000000006631221777731700221320ustar00rootroot00000000000000(zHcountry_FM.svgQo0KlZ[uU^Xs$PII|\m 鼲#P)Fr4nGŗǟT1oTjHRUu81(}[)!e ~42~X. nM'UyNCGIDwI/FV/@#e@x7哈52j.20cSCJk_D BG]DN/&Jhy"DVqǭZ鏂ST:ʶVgB 4a0N -HN~ulp5T;s<;?Mal6{}=7Lz 4*H _:Inavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_FO.svgz000066400000000000000000000005001221777731700221220ustar00rootroot00000000000000(zHcountry_FO.svgn!>dzԸ,`{{62. bEv^/?|806^6TVVYhgYH7m;M@f1A|813uKrCowUa8>zb3)eܥ()g;G J!]navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GB.svgz000066400000000000000000000011641221777731700221150ustar00rootroot00000000000000B(zHcountry_GB.svgSQO0~G?ept(AlL Xe8' f.&p(S{RS!(Yj'ma CԠ]hd,qE) 6#ڒY"7)xx6~6$D 01b}<@ > np@?pm"mW=ubRe RwH&?Tk{cDJ%xwڮWjAj%m |H_dƬ0xT=Je[ҥWi ,or^(aT| NÜs,ۧ'P{hڽ7έ>~z $ navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GD.svgz000066400000000000000000000025371221777731700221240ustar00rootroot00000000000000 (zHcountry_GD.svgY[SF}Wl՗0V{8N I'3iIH3}T,a#{v%000:]vwv|N>Wz\NYBdYqenEY̗j,χ{?ytdyJ޼#dyA1yo^r4Q_^^KI4?y xQ,<0Tp3Z6eRe9Jr9kȫŧXUNY$0{p9YȕlF_4d˽y=Ƣ8a? \lh,OBSqy%&h vp[tY͵ikܢ0w켘V@AiV(Ldw"ˋzRm lkf#.ʻ=w,M|c|.M],aɠhٗgXtSA7i&y\l*JU-j; ʱ7g EUИູS2qRq.-WF-\_̫QZ,B7bVf}hz?bT6s@ $"K v Y²vYBXsM֪h60lm&JnP5~v(W2.ߋLڮPϚFtݞ '&"#Z5 ,'6S.rڶk۷dJ.@|yv5w{Х"([xIgK- h6uok ƚqQk|2*АJK-Z)5l LH)3L.$ ҏ;Tg5S`?t<) pr.ͣOQJI@P{Rww6N*ytVGDp ʵii'8x) Xh ;`uR ; fG9 LXʤssmhE}g`q4*0 hݣ<2G%lS5g[G= 0C,M t-8z_T1B'-Qꊃ-SS<2r~e("X Oix?*Y(]gC ^oCmybrq 0mCu6p p_yEonavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GE.svgz000066400000000000000000000010311221777731700221110ustar00rootroot00000000000000(zHcountry_GE.svgS]o0}μt6 -N{̈X3 r\BwӊQ2!}?9>׉vk [ijU># U2nyYnmz)) ρ97_ ̈́ҦiͰ_M)ԪXH]!6Q㼟ڔ CF1e-NcNBEmB r6[%j'HCg VY-/ouC\"JbgXʬNJ׉+SյkJ"EݺOt⍋b F=F]0`=6~r'B= }f _bsa2' [;884A>?>Z{' ]OgMRYeւ&VGlܙJi2re[:ʼn9xt 7sÁLi-HS(+[~ۿ/1烴59 EFeW܌Cڥv.\UG-NƛM6navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GF.svgz000066400000000000000000000004211221777731700221140ustar00rootroot00000000000000(zHcountry_GF.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GG.svgz000066400000000000000000000005321221777731700221200ustar00rootroot00000000000000 (zHcountry_GG.svg;O0w$vnEqSVPƨqb]9&)z6 dαlyJhkEfc m*/G,[>?@V}t@NHI])/0Va1i*(ngUQL)rXYjm-2ytbH'+qL6Ok^b4WP\QېV!u:G4٭8)cq16`cd@4X dH.&9v?FԤE/[#r #ջ4u;KN!teG| 4Jnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GH.svgz000066400000000000000000000006331221777731700221230ustar00rootroot00000000000000 (zHcountry_GH.svgRMo G@J1 ͭf$^i/6w+U73w@41:(ug(Sfw4| j9ڧtrYXӡ䌱2ۛW8ХJf'Gct<6@ΎQ2a| ^QOo#7Sz9 Z- p!$߸`4b* g G!-@hg TVQ@-e`A# PXh^("CTQ~oJy?NGGM#*X;mhm姫1߽VSz}ۜ_i=!ǐtnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GI.svgz000066400000000000000000000136361221777731700221330ustar00rootroot00000000000000 (zHcountry_GI.svg\[[Gn~_/vEsY[)*mMU[I H˹p<6F_h4@㿼}}5{6퓹|.wYvmO/?񿜝͞׋z5_\\g߿:/ooo ny (o.4͠b|27+*Z֯\v|^/kn>nTrٖܯ^֢Г[Md\sΠx{=|אBH~%W̼+/nmgvKnu\5d^=oׇr}(Mfu|s ]W㓹#QdBt:+m2~ Pnbq^?nyC:y>A<[٬f:춿~jf}gfb[?v/q?BǫAᗙRVzYւy^\xۯ?v]A1.?ZvOjokrZЊ#x?n oG7=Z[0/9,tBGXu' 93D R'~!fZC~;{b9>.VtF< 5p~J_\^n+,x,k<\ yWz]+Mf5W$:+6â*Ϲ]py}^?_ꧏogv VW\Ҁyٮ/nf{g>6ׅja_5x!cn+1#J/;PB>s콹=Z@,>+.Ut׋V0cX*?_&m|ծSv_6jO],w} lȭipKmݨq :Jr3*7Ip76MCYޘF^Ga ,a[M!2t~4Qu)묗~@*]֡;{jb !G@pơ(:oPP FXsƘ>l焑żV"k2nFʼnC2H){=JvE)`|NvtEZ'Dχr4m~8,Pm߬ݼ~ N-h1;ڳpM{tq1~l]3y{ l 3ښQ&L}9,v71WM}ndfy ؋z$:A#y (,ɍr:&@`)` DhH 9t煌0ہ0e]FR,hlq1) uW0 k@'Ȧv71R\Qj ZO޹4iSz1='dځAK6^-DSKTSz-XZGdǐ滢$fz<`Ёwd-a|ClO%!|}|~y#uÔOJ+9%>a8$XΒx86XqhT)ݥ4D]6a N#Þg-5s/#=J;5 C.(>ZGwJ9DȅУ?P4c] Jx`JWc:BojԴR C多+HQcVsZ7 C_0.(WqPw& Š)c,#Ǯjͻm-;8aR~G_/\Ir[+tɓ)4긠 pޣ0 ASa#\j\G[ ͬ瘀ȔSR pa\BF $X$|uuLB*:]T͗w:5U!dAB Ped퐸!5a`z,c)G5FZII>SCmBH#YB*) C6D.fa*5w۠+*aV1 &$Ӫ3VgdLSBD%Lӂ ={-2rzRoxڶ!25lm*i]2r3P6U\ᴭF9D c:JbedRJ`& zIh˔4Ϭ"HKy96rƃ3 \ 夐*(Tڳhbd il±+Κ,284!A漾X# m4:fL2pĘsArBVXEki9qK$ZQlhAD,pYКƨ@~`v=-GB%(1ᇄGU>Ք (ꡄY2 2C[ &Y Z9H>jmp1'3>I|qJyg$i,M(K&mDFтn^o1Xg~2d6(t*LDjIRa4D'P+ ݧNoM>sV 1WTc -S!Y'\z]w&d5p(ycˆR/+E=i1r~Uoz)Jo\A>?tlu]2ݯM^>Di7!o\='2. *L Rq4 L"-c4[>쁗iퟳoe|g>?4oúuj؁ LYgjDúqh<;PU; <y$5>i|/]%OmMvsP^.>d>.8DJxyy[*,vQ;nd SߞPPOշ[*W|}9,-eE2ѥFݗ(Nw{L5vX~N`7 ĚeP= jɱ;Ljd%*n)*e7:$: JXK*8&2buT#`b{!i\ {Nm't.OWdP Um_t׎#&\ALT:C>=`C9]ףTZ !E_<K+r9!g7I "j_ a ,X*<#WpV`WՇfC0Rg&2 0!R2q#>)ȁSM菁vi\4G䃷|1<=Je'#:QSLKAcZdb:xcVE۔ j,1hƇ@Ah~[ű081f4Das/d/  T4 ZKBpnyZ!ѧ'X^0gRhw.I)܋p'=aCڪmCX @V!RՋSPMbv\":3pmb 26& ʼnÈ W@omA<6P)cU?ǷJR@. o#KhX)l~!!?9 b)6{l`º(kۄe n- EB\#jjy$ D42c1"$HRt=8 mDm(3óAgj3)ҶrI0ר9T S;\F9x&dRÀlfPPK2JçH׽bҤC&!òeP uV_FrnOK20P}&/<ՒB5?u31r ;3"4M&vaU^r}g% (lɝH Y`c& tcBvvYoHc~j%P/W:7"f+$ B)t \uV09m2bH;92N^Lɀ>G#Vt&2CR:&~OVIt]ՎteWo4ԫW ޣe&b68FZJ-vUUm06&b c)GA]7Sj#pf I? Ywww L  y+wޥovsyZ\\?Uk5wD16i^?2[`C,o`CbU wZ[6}\ M0wʥݺ_}ߝu FjjRP ʯ`D8[1F=.RZ]s+0sIqKibs+?re8P{+?c"\ VM$衿/+tT.ʱ W۩rx9w!o\šҀW0QtXIӍz2f:(I]4X{6 kz)D` ^Ajӊ$GSPW9c^;c%%2Ca$ ^E n V@g nWxoI\:u%ʔUwR~SM(Mz3v$G;SajWUisNMXK˧ s qV5L Q{f#3^ ۥҒc6ll#N10n;} (G'Lz䉿.z2a3mQl*ɦT,~ܩHޅ>srnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GL.svgz000066400000000000000000000005511221777731700221260ustar00rootroot00000000000000 (zHcountry_GL.svg[K@-?kmJmW/[ŧd!nB6wPm̜ 'odݨRsd>E:)f!4&".J-9'n'?64 GK0#d Y< `nLuCH۶~eUWJb Xc0]Ct)N3V s\,7)N(>"΢R!]M2^)EX&3}uTKJ!UEJP Ue!m<[Ho;`Q:|DOMG9M7navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GM.svgz000066400000000000000000000014511221777731700221270ustar00rootroot00000000000000(zHcountry_GM.svgTMo0 Wqe;izqzXa׵À@HLՖ IQkm#Hkqg=h*+mB]_3I2%!!RoO<`ib)-JJo2AZCC?^`T9aZlzhUո4h12Ҳ4P$x,4 G _o/= Ɓ/s_X1H;YOumr0`h{_W;P0j{vg2v*(vK!hm]3?|'w\r^3)[mLEioܧ^n?ijXl ߬/p+Pɛ; E fKWp^c;]]-9+}טxcBȲ^TsfiζNqA{},OO.D9PCl:-ZMQ:+.N~eQ]j<_hC>$73 /PW-3U#-'j9fY4'ѭF̅{'[ navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GN.svgz000066400000000000000000000003221221777731700221240ustar00rootroot00000000000000 (zHcountry_GN.svgA0b[@BT[ V񸛙lQ&9<&ij ^=jֽ5RXQ1Nӌs#cا: ~^N v!R&- RH0ٸW>Ai$I';/qkZ0!i1^2l0navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GP.svgz000066400000000000000000000004211221777731700221260ustar00rootroot00000000000000 (zHcountry_GP.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GQ.svgz000066400000000000000000000275711221777731700221460ustar00rootroot00000000000000(zHcountry_GQ.svg\[Gv~`/^eVb#A%y1`Pdk]_;]ݼ#Kfc9]sNUǷɻv_m7ϯt&f]6ϯOdov>li6صC<o&ߡ|up~xxhYl^_n2o7nlwun߶Z7jh?]t[,-wKyH眯6falr (lhanz)_]۔տFٴouza9u4ksoo|M}sx~z|~%zgYn{Lo{Qʟ|0߭l?oVu4Es+Rvj>j< 4ީGZ` )= +~-NnUĊ^tMQ+2Xy5 SW?70/mJ 1ݯۛ].vۿE>7PG%r!U>x|G|>haG'dk=] {gكd=|7{1a+rSSrcwS]5;mȹgwÛ!T rrZfYM2ڹ6khaAn"Am UĩظT/&x=VsN'F3y ä.ƺ0P {Y}rM 46rs~r`ء"1;,nގ9TpΛ9̤{0V1Y#wX'5W3MnB ~']^sҰMP'Ohd| &ѕ#TkJ={v0n4 p%nbBj2Bibj֣9 s* 1ְ C4lbS)~)YI+~k8vvI>gH~ԼuG+5QC/z "Џϕ 4kCL"F 3`2IkcRԄiTW'DbY%D_1\-G^mx%1Kԯl>T3KEGj/1Cw`2H[0zx:bic|1^ L)(PYMa=ҡA@2@+4\Ô&뚆Mw5@ma9c)}jt2ߺA_Ae g:D||ڝhw;:(zC b<ѐ2Uߴo_eI4`IJGGO$%EB-ciۧt%lP3:%CtPtP%iz}*3.p`QAz xt]K@\r'=4&xԾů&GrF"hl#qDǩCvyOY)GnOTgtP9e@8f;z-) J=ܠ)lBD$cJkki}|A{=~Y.]ɤbL5ڧ(B&$8ϧ&pM $ {;_3izv~]k츚L n)ۇLeP%\u*AB&j)D]4B:'J3!u / O#C}A)5@Ni@4]T1 !䙔SYaF yûH3fdH)bQS3jp.q:}B@3: dڙ2,CɄyX%1'I(# #b;$xS-R%F탨F?cMM:,[Bca)D.Ŕf yv K$d'H ss*;e+"44xD-^a|G fr:QI AI@ bF:=u-kYPEhsɕ@ eh$\c%{pae&h$, rjʐ&%uJ3fOY$S?.H DeM0Ȭ98 $\%).m$QE\SUYX,]:@pmZ¡v_HZTKPRbX䚔$ܒ+M ǮGCШ%7{ʋ?W]\.Gٓ˹kd#(f<*A1t"$$mJ̶DFsЙLkY_01ǂ^bQUA}H^`$NήTuF#Uk#+:wcB~6Y9$y]nz8~t:a;ԭ{wwX@VڔqռW]Y3eMFWc:Hm(eA b2X @\Y}缁Sb$KBRE=ifjxB&ݝO1ǮC@ KQf,ڽEL8A,1H%s- |jH3qvG-S H,8CCntU) `h؃EI8U h@:ٳq'ed )Ūc}Pǩda8见<[ImSQ" 8 hPvY3Â6P^2͈b0t 87==Rԭ"tR=gAbXUhqj lA[yhe 'J 䡉%B'ynq4+R{nS;A8UI{a/-{9GN>1[1eH6(0RZdhELR!DS`g{1+B/Um"cirX+B**g` --2?\)aL'8Dɩ+B,N')8.-g/_!f  x&Z[B%S`%+֡!kԂGEˁs)y-g˱MuAgɉ 1+q8i^~T"<LtݵLfxηz q0Z[+9I*1G1Q^j8 0JЉ6ye@`NKw8yJ SXv~ wKHxP♮AO||/xo182h<*?孼ҟ8BBvvTxMEN51^ k QN,˥ȩ:%}qO8̦|xQg-әF^'иN:yTF#TY"t]<\'_LLO!|ADfhrbgԆ\ԩ9=GrS9gxuE>x1곈YP κd\ĕFR5rFs*ꮜuUԭQօMFM߈ -e`,PiTqG^n1jn=(tk*rHܕ冞g4BAPrW IԒrrΩr:Mڤ\!7_17fT4?1AntWZ{.Bj 3ZšST/hb!7j)rW3 w+>5ď+s` d|Rڂۉ. \grSS,J CySP ?H<!s #_aڙ7;3LYϖUʕB N`:xA j*cbUȘXu`Qvv\U 1ʌ{+GTp\FV6APK([((AV]H=|!Ұ<Ռ",iK.N[rT,t Lc-rZ# A,/0-u Ir.p7M٤ZaB늌p?r9?JgQ!U:F3>!?'2z|8gPo$?R{G, ջ1CJ Źj /#/oxhƕ |aN>!xrsely;"!# "pF߰I\@+! *`(X$ $G|ꤿh;$<#3[P?hu\V(<;b3+FKbSҫ9HU7ٸtߔiemb[ Z^~7> 0w5oЕ77T pkkD*wItϋT~8l.їz2Ć%c͸mc`}.~efj㜛|g.-+|sl*`~^ G\f|+-S/ ޕ]'(rq3xu靘 A̡yE9oHG 2; ?, 6RuSb.CBpLe_ ^{~m;3BY zVPl@.:Sv]tB' ira\u#IWˆ:Sm1깩@`tF׫В֙;KgS~=/tfd.!WDckf,enVn ě28-Yr ̥gkV8y<W%3Ebv⪜}ȧ 0Qnc"IٸXMufwED$y-2%ڵtW*z|SJŖ4yu PǦwt@fV^Q λ6d-l;zp*0}+>-ß,l/-,Xv-(E"gܒ#ːOi{  r~ʐG*zU2`Z!抂Iia+)NI#Z]G tk'B@A64x# l~W28lܔդͣCFw]m`Kl^ 1CI#O vTJE1;S,aI9F BZ?(@̨Ry!@Sk)FkhZg1UiMVZcR^1InALZ9g9XU#_Fdu?%Yg}Qf{8 mf8YO= dp'| ^ C_c6C  t>teu2#ii T(FE9~t+^+җhWp݆+l)!j`q}~cbe]K&>x&e*<ρMAEc*m&-]${dw-%32QZ2A)zH JVZx 'Qc6B$18Xn)۬ X+Z uߧR x ѭ4O.([, эÁzd(%kҼ-fO̻}|7tXM,Luɳ'H kƁL Bʶ& ?+Fokmwz~ =~-(R\6ʤۖO^ud(C^PQD%E34Jd$>П^Աwo <7l$51Y԰/QqDWZ1<˿T\Q>@)l^n(R#Ġllzf6g cOeF"3_KyH ~<ֺlK`K8̫ĦؾmjynEyV *C4bAck3wQ,-zS _W%}9IтJ-gͷ% kRl*8)7Rʒi&Zv@<no!RIY}EF|ӌ d_I}ɾ‰\őܭ2` b%Y>K :k5ɘL$Y}][,Kd[E*!w\c嚚[Lv ;z9.`^]os)48* C3*GJȪ,".uطRn<-`9|")/$VR/`gfrSE\ ZT wVܰv "G ?4o.RWx(Sm* UA2R6n \{MܩU /lC-?lIA;sBm:3(@`fӾeLP wd1nrV8ږk.( a;SŤIOy-`ꔪ$ AOé=ޅټ)sz`c~ @Ëf A'VJשs±3R{qRpUƪ膭4*9 xF!LJڦr\^ G3 S#v(lA>}_pߚLUVqȖe(oT_/D㻩BRWڬ.(IjG+)mTAQս ŋmy+8wKʌC5ӧI9'baW8#CVomOk&8%ذn݆RrfڠtيCO&mq2/Nc|rySp74S>I2/')Ѥ=JLZ`ȷnvrd2kyٿ__,|:,=8 NFH-.7Ïjo.hd02TtI'ԳW@ylN!QP7|>հ aud]pZHb&~ByPWJ8(RH\U8"5P(¨ߛjhBΝ.J2(6z<5 A7:3rApQvٸrD1FCatJn>euwj5'! ް5U?d .u,d 6'hx_#뾵e~.Oo6QPNOuO45ޡ.[,6BT"-;cʦ͌+\s$bj ̦ ׊|fx!`!ba9YJMx[h[0 (@ߩ"0JB,W ^`Ђ!pN!g?O 6$t)Q);VpDxB\HD@h#Ĩ%?TړǗA&)VwʚSp}ZTkՋ+PE[H@yR0V1;}HBqf *gJ\yv pY!CQk<ԗ;^U¹|ݼE-'SS ٧rČL Lϧ +R@u'tH!2Y(k E^2qǼS03٤ Mjp(L>ZyvGQ|g@7 -E{=:vxA%֏v*`BĊ] ")0bNAC.3#,#[G1MQ/޹0}WyEvKQudx&+Z()m.JjSM+D~INUM:A < s 6tJ I๤,~Amꂢ hT' SvJU`\. {U,8dHWXLJ[ <;M* w J݃"T0 pZa(Ic8A`qUAjH4< E?!+zwJs~Dg:kt~~rMQJ_dSʮQ2 _UȘ͍^[T DJcH {#>Hr"t\H=^-Cu9vxV}|"l1Ic^l$ɥ_ćC|=,"SX -t٩R~id-h"u)hT ۃLw&MZ<ϜwD+F &&j䄣8U³pS =9CEVY66zpB&YQ8:LE:rӅ:ة3J-hP."  9/$9CuWIˮ}b7eH0VYU*Ε{jp +™%1WAF)x}mħ,fmgY@o.W Fs&Kѫc "DR )!yx'dcۥȋk4}fgf?72[w-|;uȊ{]AY(ldeP=ML:_Y3eD??H9wHo@9e0_Pf!qph6BeZM?:@A1uT~왪G!:25@wdeYzdO0ɀh)3Hi$|f1իCfW'ADʵV/>"~4~_Og~ &xr ;*S+KCHݷ|^ξ(&iK XZF Ik zETr=w4qk}D眊fs> <)~GO><;a:F6%ZC@Umqa:>w\R!LL_Vpx.B,ǮݴY-K~>,,r.aet d׻S!㨘3 UhDka+NO~lv t{ms4O@AksڿX? ޿ǯ||ߴczT7+Z_ tJ^?$zş޿92v?ֺAΖO^b!3l?P/$ٚ9}2C1=O|OƧR|^$4Wx/G|U^ṇ}_ba ~jP𢐚 f 0v}w/ 'Òzث/^Շ٫ڌ,XT&(a Xa~8TښoX_—juy]#{U_𥵺7V$XE;̇zث/^giY,ZSǁVCDUš)ɗ_Oծ>/_OI9}F{>W)navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GR.svgz000066400000000000000000000016651221777731700221430ustar00rootroot00000000000000 (zHcountry_GR.svgVn6)X$Yr i Pt%@ ,[[_Cd TA8o~9#xuSٴ3e]dwFkW~/B6t밆<"zC( 3ēАr%&Y¨2ɧ5v'F,Zj]0-(}'uq/|wnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GS.svgz000066400000000000000000000660631221777731700221470ustar00rootroot000000000000004(zHcountry_GS.svg\n#G}/6@~[3lmhe$e{Ndjh-ƌQY'"oN~כTWj:qnyqϧwWqr2mFʒ[:Wiy9 ղI)#</7XXiVv.ٮ6'0=pWZ.O쫥_^^^~+fx߷GGި~{NTa%Qa%rVa%[]QrC}Dfo̶ˍY\\'v8gb~Ϯ5WC%5jx?/60Χ._*:B)apnTIPiRN}>5Wɤ{W+ŚIUҌMǻ-\^yݏ )v&Uͺ33UmS("Hք¢-!=CBV'e٥R2xyɄJv+&CeS{HX[)1˱S$NJ)t >vFz>-W' >(o.{o){8lq^CR'|z +ݾn68nEO7;{ܭe`Z/e`>o/onoϾ"  g.&9Ţ F>q28N Q~w-*;t{~w`[i |CU/ijk6\G'gޫӫeTc`8 x႕Li{d{ oBl+匝GxYmF5P#Zpࠟ1ZYSB'sƾ 9V~rNpB cք„DC[BМ\Hi3kEʼn8"~์l='uig>˹rdH8#ZqJ9˞dY`!#,7F #& fkdP#N?(rMx[q/; d k;sʼnÖ^ڐ9|:L!JsRCp i3cisls;賝0dC$)F8&x b.KX6d4\qO^2z5lqT: u%|_ށMK {'eFI., 2;Bon\6Fcvx;{w;es70DF1FA0 Q2͆bɢ:TN8YVhB, %1 &;iE]3PPD  ;C9K_P~@iˁX #~͜<&Pn!C%ms`8|I=,/7|;G[e&Y8#efmM_5]Ja)4z@7LDrC%vqL Lw3&ʂN8.NJXUkN g4:u>eAgXfp,Z *E=Lb08(#Fc숴pG_~=&odk03f#N)vt0̝1P x34=QC3CȉIw4dpRwfr`U|'&a)_!Ɗrx6d spmix] XR^tbbqe?).$͋@C;HfqMJ{DtMom(/T@AL, -G\2Q T^@@G8V8'3ޗRLbp]h, X y*rBCZ~4DdxE5B } '?Ra U A{ Mʜ5rN" zaQxE$@A/ eHƴ ,2ܶb'=LR3lH=iD`^yC}EPFC#50G xB9yw9C.M)9DK8NLsP݀[ə BtAz͕W`E% ԔKnyÆr\F^[& ]1}rgHB^ fGȴOL}NsHvbڑ21r:|``BzÊZ*:H4Hm%ƱII$zךYT;1Xgq!er׫P'ˋz}}Cp6>i-Dz) дX`ApQM@&9Bth$sA&3dۢ3i[ X&n~8DjP`v ٧pƌ+X*r)6>CQutyUE:aDÁIaIscɒfNrc0Df,* "WT0e<`5?u-6%1-l9# rJJKχ-xȇ*DJNq.vl+N_%Nħ=tK_ƥOm {5p];w=aSc40i4/fw?OyYe;QP '|thI]En ˏ?.cV66M\9G=bI9"SX®\F77%]G \ڙI/p⟪9&m:EchJIƈ)`i?=*mh{1i`&q)92t#zL֎0pƘ&hsFU޲BJv\N k$;qVW,ϔB _*uBDe{4ٜHA,)xfҢ<-/HA3PBH BТ09M DF+ݪ)U/K e eC3{,jK#׹&kn{^`fka`@%D iBZrPf-/&!YBF:LBxa"`]B#)sm 7AhKQGП/K ̚ *Y-0 Ͻ-`E.0)2;w9,ȍBgZ ݧH!0)k9Uq.9H,9Q/DȚ5'aF@VR#_j{(O584N w )0H$E,05XQP}(% 5*6G\MJUYxa1&0H•4}C:wk?/6 Έ ,ڥryþO 35FlKRa tzHӱ sa.W֙9b 3,mX._C8Ji$JB3q ˴w_FXc9:pJYCϯ= Ҏ9 4K8:ho犖Leɑ;`]] x㸯_LR+R9^7EbX)1T,*d;݆gԍ _Lp -s*j>$IM,9-I$dXWNl)!&k O2؃ER{Z )MZ;(_y&*/e"K%D8Xȃ WsburtM2"4*YQc @yG\TWR1v5(`wE=DÿK%;~ I+[zAf\4S2QNN2,}jʿm$~ʰoDl߉iM|tMIJA5""i JvXLk9VV!5ce̚r =щÓaX.GGGZX9\a,@Bbl 4?^Q,oΔ@+w=Hg%O3{&j3+s6T* _uH~+ms@{֩jMq?2 Xt5Vrr Q~fUl.n$ uRsn'BfRMo"߹I>Z=3,OmPp./a3+ ,Ow#<ˮg^8a ;qhj9ҥB'rs<DP#>IYÉǕT]S,6]獚/|Qf˘?(KXGߦH?de+E W⚩cn6 Um1b}j y3ٮ.7`by2e!:3h/gNmnɡyPLlI.x}^A.4d[vĝ'D@?QD#H'-%@[ d%xbn".Y(mSjmVKDujSdg!Wm|ͯY"Dbv;(ͶM}>^1p%M5>p&p¨vder]ىAQ7~J^.IH>h"fV>$ܤlJDNg1/ HR"WPhk<m9*t[#醌)f~;`;q+QJ3ݿHrX,lO+@. MώTlsCq)+ SQCD<+ UG*AjҲL^U``p0&Y&F4)0)x0Rډͣ4[A@a"];Wp<`4+} YqtAf]5'#\XZzIhRPQāO[h"N1%C5ꙭ!096m. fD It/L}\vyaV<ߐ*# 8|G>ű/~ ZT>Q0 j]굢kL8wGHIn|U)L(eCB{;߯~.0\ 3G+ %L$s݂R  9眡XfG1ʨ#81XRl͓+ȰUPt2RWGkkC<Ob>P[d?.>g2ˊohG/'2pcW0Zx/NulLsȺ4/MMIFu Cwmu]ّH41;^ L:!7&XrxgrvcwGL]I;')n"ď؞(rv+ҧ,5:D;5s-@f=6 4S/uta&l\9ą2℥dkTC':ojKb/ {!/txҬjX|'<FQ0>*iog <|fi* ?)<{0;g Gu_=R1㓉GĠUe5ӓK>|?%|)ݟ@;!+g]~NֽFTiURrؓoE~s ;Zew~W~nw>ݼ˓8OhGb1SY|CzŇU╣m3worbq⻳Ch56)T^8iQ]|+Y.1'?mh+z[LSI_˴p'kZ` Ikw1|K!K Yq)M~v l E0US`}ؓuӉoD*C @+ǧv0_ҳoxّQ;Vo0 Eic%׊8z)!@.rR;ImPd]bKqǶyekѷNɍÅv% ;W[V.;Q8 XM{ F_}ZC!h'[ap4uzCSIqi1+k|4"zGQufG ŏ*Md$<6f+ÑgD|X])@uM xp^ }i"16̺ϋC@RkHGa0f57ch*@*6FJ0,CCҵ=\c{b:}4J^9LEDGvwvot.|JuMW4H- J :46w ŰgB!bIɣߛBaWGA"Rv:puu@Š@Ӟ&ٶxusQ =qcc3$]Y*AIK8k:-Pxң:&\}b*:5=`>^A@OJ^h4ygscCp>\1Y18Q!XnZE=M+WZFq'rv+Y Mp /:GFgVt~(I#qE]Б;ޕH},JE^Ц}ع"ȟZ}DZّ܃1A=ɮ `a7^4Aa%zE!T!7$EXyExragQ @@y7GfoW@1PcP g61`z@\b3zg]}(-y0IfJX< Ȣ'dRv AeIXOWuy@w7( P*_A<?9qPt%.9]\QWKvʰ`ں7UF\vdvU#')Jә҆0x)hOsJ:Sp>Y'A2赔J1 ߂mWC`',}Mzk*px*OQ[gFS4va6Ӧ}عٖ>4 S ܀RߧR9V u9F8kgSAK:v4)S_ђeg"&@>!$p#߿J2H|,u#ULv\M>W,ɫaC:}6GsV6+:^jWT!O ħG=ANa < 4ǶK>Q :a WK*|=Cc]7{ a$!!=TTY:Nj9O4f- @QVAҎPV3S1X UR}ع% {\Em`m&ɟuq~|L!u9qǏkl_}8BOm2 + ;(u 'CvHDEkrC5$?]`+Msg }M̸~~G]Wc9Xx%.]7{ Z;_ Qii딕|$mx=T2nwD89coI@1\ϔTyk/戦丂#BVw ۠EwbO 4|P?"mpu,?p)v.ST2z~bnǬJͪm.nugC + ¼%/5e*3o[Ǒ9:643>[y' !1 c.?L;VM[n]. 5-yBqK|^؞O_Q uQ7ʂsMD+qVXOBxhIAczՇ9?hп|-CQ8e&s0-X]k]1M']7!d`tpU^ho򛝪+LhYRRCЊ: $;`#F;ѳXh JZJVﳆ;eɮ:;U8UN+BT yqVfV9Lo1fi}@l+zݡ?ɦv#Wwh,4ܑLpzuiiyDm* ݱLROCVmX;(T% jPolnHgNNV5ɯ6[͝r, ƕ%E |yju2)+Ħ{Hj6s6yl;O79OIu^q!$ŤdB(/0+*ȧDI<N_O@&[%(d7%n6ڝ[Y@UQ":)0%%W͖[' Š"&v̉1{̚b8 t h*fxuvg&WuCR'0e_[N`dԀ 8,U(Ql+GY[Y.VMxXߓSO5kg*рHWsuKxD%ɹ_bw!6eFdHV L E"rɪ[{P ӽ7o c5E qRڀP\TqTHv~h/QB2ڍ.77cn)^%}d}uk4RjQH~l|im+RPev'*Fw,(BAOd Oq2 01i;j3JJ|!p*4&x96"q˚p٦[TSr<6QBn6(Aa{ xvk6MNYg([5yVKQ헅:NہWhH_ TBf\&\0sA~ H2W@<%슙EgX%U$@ar=038Ԋ2ʉ%g6u0yJ!k^왐f/ .EqJxu ;x]^| \?xg߽jq?3?,1,8D>΃'#+k^mYrD̓<2=LpV}PfȺbdP'] *"Wʨ4 >}Tx\Æ˖\`!,@ @ɳ0, 9хChw E沪wMMg]F)¶*sI%= Jm7aNf ûwb} (a)PF(ˊ@ET2c+i]'eF;"60*Q%l͂EcrbsS{#Q rm{$A.A7e% Xh>\.(VF2SU 0st Ff L+Q+F~+ /J(YL9D4P$kq> *?iXtovG,Bh=`2^ۦϻvߛRM_W<8'r=CK~ճxXgL&2xc2z.vzk2WpL*{R] ,ܞ_!O(|"e*ۈbPqf<+%eW=T^q^k},t=ɌtIeΫ5j³I}/jj5__ f7`v 1&cɃÆc!g?i-4>ݳ_}k&?/؄j䧠(K\Nj{^3 ~G#=#2ϭ]h|xw~IUaԫW6 ]HaIqo ~+3=z&㍌Gy'i0YczYKoT/Gz5;1Nl_xތ3>2λ1N5 68%gP8vi!z21[Ƒ$l3\}8]/ئǞsTO;0[b3#ۤ6&x])Nڵ-7~ο _2f&ř?FmjuqJP-ֳ(:t bwڦƽxiM_x$: +vm8dVئ߇m~}Ʀ#ۼ#D -=0nmlsĊez{R]7|^ 5zԋɅ;0O}<wŬn#珎~lTE㥯rVئo~6w9)/RC_߮?5*oWZbMx/+|7}&~41,3ӵ Ƞ2=gfqٝ~&}o{3Ge`Ug1~ޢ)絲0(zZ}6 [Tp{,Y[1~Cpu}m;nQ-ߣҠߣ_6~ BؐskwSu/3e^lifN:. pf:nW #C|]r vd*#o >HPRmP TߐDa>)aG(CclmPbO!x_vv l7 ܩ@[14E' MZ&.~;Ǟ)ݠYdv|s~B0 e'/~œ_#=T‹Kv]bAn[ݨi6*63TlgsTaşa۩r;W(j3r^D5l]H?<{v%]5-H_,w`lR}.)[vږwO`F5'|EZCHjb##86#yCCjV'&U< 6f%ߜ +TZ&vmϱw-.c˞bRyrX%TU)U:B$*4F N D_!zx)j{%;ȄL-T3o|~dsL=5I0g\JW#(۱]- ZˠQ^jCx(?*9` "a/!ҪrS&1-vg߿?\)GU- ݥf0/>Xܯ9>s?MJ6]{K9ηNYLVKXT gf+V=V?z;;Tj!$Qj4J()I=Ϭ3Y" 8F29SZVMktJ*(U3m=t"վKpUd!P{Wq="TF&eZ$^pP!-Hw\KeZe *npj *A^)nFXhC9а lqYw&a ^sK |8U ӸiMq~{wRCɼƁ>IJq6t.^L)3fUʔxp5*Hl->Ll~Z`ZNQ˩-a/҃ }QD2<,HWu^ml@CEj^숔_hݬە)M])ԓi3Y{P8MFXR ~QI(o"~;K,{ J"2rȔ-۔. h(3)c"TeSD{kv(-j5qLζiF). 'zvtP B!ovE {+6RkUաG$U[?V-Uj&$X6 c0d*͌>`_`w ?›҈qyc,e'-Z"oM WB*7Y-ctJz;Q>$UPq쮃S=-Đ]35O8_54Zm͂ 4-~ac1 lPB [#(RW:'O ^B3$ƅ:zҮ\s^ ^3z\KᤫQwFKv14Ɂ%#7`,j4}G}dlr~RuWa ]iLU& @.{רhL'+VlUD%D }i_v<"6PL`zkP"QA V*G'd8GhD.iLmh!P|m QRD`:G+(ĝWM;?'=R]4Z@ 8H[T[:(U6p1OV (iذJqkŎ\%Ѣn00( {=*c;ȉm>GA0tUR]ݑ颔%T6#ukMuzN[™69y9&lz Z4hY T2M%79qw)ij>ypԚf;w}D":&LJFrݚo-PWȶ!5L%=F@q|4AWPs)c~J23IdEtRa[rgPW@/(6M=)'ra<-nV`|%wQDu[@ncL|oJ-[kj][>f]d1}ކRB -evɕt]$B ﬇ GC:U?g5 )X' ZgPz]@Cy !(`?G*4yCU4ݾ0pQk&r=ZsCy,_>ǪRӾ`pЗ:6pI \F10+`PGɯÙe7q΃ իƕvI($̅V_YkHL ɻqBz@?(&ɘFmrUw)WYZ#$(6ߝ3)8rV^'*%p&ˎB(*VBhCqېRhӁnq{B𸲙K<:>= љ$b;PƏ8ץІ!K1tImWUcX&s M8"1P]%~ԅգXI 'XD)xwl1#=2ee&Oa;4"S|~ TounE*i63,8;掊{02 e-L'%Õc)E,RD9)c-9tvez-Q W#3FE<7uxr&ju.k_nm$2>9[\c㙬}z= m&_ąAPA@mcq餸C9]ũBDxa~S(pQ)%k qm>+ i0rA{.ȍwyu0)%*1jٺu7Nƛ)adO4E0U2s//~(rCL?"^NyɎ h_U*/W1w #(S4K%j`,@iyNAKmv⬑y2HM }nX;8L[aS.kt0*M,_8,E]g&z*Rs2,>q5wMzh:n|L#㢓1ѳ*q oK #= k}])p_H hpsXѓ͆w+w҉" iE4Q$?1qwKiuZ;Xl35ijjmm>l 7ZBsZpc#uU(nCHcW1B<} "wב H4ZRB )յ<>;P z[JT_NİEL^5?7GZ+&%)4R*Mya88RkjcpUA9ϣ )~)*d Bbբ"D"Gh:w/hf&]6 1メ '=Wav!EZ&kJrk3qWWk йHecarQ<7$.Eƴ$Ӻ( ӕ \b^= ﹦ !~`Ķ\ކȻ@uEao$I7t4Ih;C5C-N!GI!$VvĒgS7'mww|- Za 9cvjm釀6+.ԥS+bY(@).d+|4eɷyoFI{h[WLJ#@e&yaom3 J!Sี8Je >X؋Cs$$U<9dB_ppH3rLOyGm)G|o.Y 0 v(!6͔դ" 1Twu]DwF~oJ[MZ@8:c#8R!QɅ395'h7Un8a8u^~`C#*v"'B.t.`;c"Gqeֻ\-nu}NDE؀S i-g1eey2Lx$j -+ ȵ}hHS"Ǖ#;v9:K"씎V.F:vk(dݔv>=@D/)5("ury# dͪFvuCǵ}'ȂJ+ŴϪ?4,CII#a;iܵXv>4<M،̙ - !T =~ؖ6(5B64F@0"8I9 TV9>1뭰0)m/l);4AT$.Cձ*ޝP,v-tpNQz,2ˇ)VT'T RoIU,!gݓ:۷ňS @ܥ2Qp r8@jW,@9[Jc2 MJhZSz|^RXbhG-2|bKÐC _%76)Ԩ8^)S ƈ,'|ڕb(Bg,KSU2z.=.js'7KM@$)bs@,U9=(dw^PzV_6ىI`" yi2~'@)p\89KEi$@'C0KQ'>X%bc8@E Bނn-9^S;>p#DrT%_7ajqf5#ICI+J^ *y[%FkpGh ."O ŖK"x{h ۇ3 z8Z݌ښlnT8y9B~ۇ pUB!;k1P:onMcRcm7Q|YO!.YpF-irvi.A jU[ #+*EucuD(F66 ݺiWDV@Qvgq~qG &b DqV]ȊX`eL&(9/ĭS|XɄwzPs~5*Jj`~'@y֭?^uﰀϞ~_u_`~^1-`;Y"7ƍTSCcWKu%0n@I zV]߾a^S]fa=g^W^q\dZ @nYm-[z}WtxzrEYi|Ў@bs/?,vo)pp Ih[EzZBYB[jfڎ !iꑦ5hW7m-7%&wz1|(J^TH@M[^Q'``}teH,P5(:xK%`H2M7۲PxvF:]*Z.[ᚢ87,R+Vg]FQ;10J.|VxS$E]DžGbaw%ir#,`6ݙWv~0\@x EqV[2ڌdGhT9%&FWJ.h\0UdG I ~ 6%LΤ*A37n|@jcEJ {/`bW$?<X9kh;Qbo'{nFe>Ayء5RDb򴦒3pE_ 'P%gc?y&C$yT~eg$~&06eSgIniEA x@+.!K@0Q7PzL&Uٺ *6wU!B='.or:А"s;u% l6A g±E@pE0'0epؒ.MfyOfC$.H;* C9H(ÕNL@jȝ~A~osAfN޶UPYf(:#JtŽGfF \d.mu.If=kO?  ܲoE 2`@K&>Ro=?:2z$-8o=)M ƞ)x^bLowՠ, ݊'k{ۢ69tѥ8e7N.IO 'Kg+7=$PY~L B+pFDn ) Yڤ}TSԅ!U΀ݖCy8#BI.BrGi )a,`i8bf6~j;+.ŔDneQzQ;U wIab?R{-]RHW"x<7Q;4bwU͎prh:AkXS-x v)Z75te'1Qb\5" 0M։̘ @Yȓ&QQwJWqB8LLV֤FiGC ]#Th2MBB)C/czoUQjWGQae0YD-Vn2e*GtWJ-VI,zxǂ:zBcťS'RHU`BJH#@Y#UHx24vuO,rmy qTaT/CKaFQ=${ti5i.gh7P"*[YRq##͐Yw LUp&>l T A W}- Q##J9~$Mxӻ{I#D̃8K<EjY5:ǭKÍ`RN&SO;_ZW->2j..T͊HqJ궸^j'y! DEI2ł[۴FI颥dՠEC)BIfJ鄜-c pYTL!yڢ_B7<<bt=HZ USi3EYZ ԗU`)^P-}YXFev=$]u;]T;ƱQw9R-cv]QY^xR,₰((TJЗmh= V73mC|10,b4](R="q 63Qꊡ T8:@c p@Pse#pϺU$d>lVg1E,L=Pxv>R%)7cek2y&'Iߡ*nJuǡCPn3PWVjX&eYsf+P gW?Rp ^/-P0ˌ&dIsZ"HHB5PbH[ Ȍ=iھV- Gi͵*lo+1+ɁGf5ƨ8uSm7t8(/ r~|T=lɲ 6$T׈g,&1#eAuwhWB{>x劸'% l@8Pgo;L Q$JZ[Zb}K.)D8TBL h)@%_mo ʆbƩͣ_<„y%d=tN1Ui&mA^6msJ3$i)~|(Z$,/wCٝxʀPPKi[dT4pH]eՄ*R}Tag{Xq}ڼH'\f:rt)-:Zё}X* nY2&ye:Hƃ:wN6[RZeڔ|v8qȾ6X|c%nN30%{TSHSWʄg $pWVˆ ^n#T'S5aK9_ndXPج瑙kfVTUS/izI[TM\uן6*=thTbnܰE  H0xQ+Wg% *t/% VJiS;sN$"ҲrQ|J3((%\B¦Q."!h7l+>gg&*H4N5 -8WrH--^Pf4Kʎ#^pUP5 [0N 3;'ۇMJigwމI_-U1b=MvK7d]F> )/y~>\ |'>?zg7~?y7N7oϟ~}//?_-O˧/['sϞ:g'_&;/?&y/y7_WO^<}/{~a/S>ۻiâ >˯x_zݫ7Oׯ^}SwOy'/^}jUw˛~W]%~ٓW߳?K7=/A;ճ%FJW~퓯}o傷=wWxّAËo {I*{er_x'=^sOWg&yOwøv]&gۏߝ݉TI.4' oI!Rex8շQ_eˣ)U:_ޢ No=g1yϥK?`λ~ .4o'[pe\mr9'vrvd.ddr=aPeee8NƘ{?dl\zw \!=XY d_<8Hv.s* K}UX\\q|7JWw-[qܲx3-F [KYFB=لVS͞RB.20) eٴd$ 免B- D֓/& SR䋭D'3ZDL! 5OY7&vO\M&brzR$[aɤIZJZVd rx2VCqMN#9rLVBvke!.gT^*(bK[7eadV 2(.׎"N6PNeWlK$ސ 9p"K,R3$*fK.!K; GѵwO巐\P`3 Y7׿+?nɽe=Wpcz&}\v^2p)& ! EM/`\reIM!K\r* ;,h wj-:A9A-(/NbNaw1eӲ+mREc$c᫝?jV<)D(^, Cc;_zšrƮQ5. )}鋱XZOU*,|ƣ(p&C`yC`ZrŵHQ؊(׉ߑmӏxS)H-:X[P IY>ۋ!'Q.e{.-rNO_Uά FFn:YiR4=0ZV^\7@xM#IK<)Σ #Svo_ C 4J<^xsώ rB`Yz6D z\BYxaa5D+"b] ^SI`<5ՍoE]8ܘ(EejGeK˜x ̼%zEJ'gi:nz .%zk'/^x-Bua@1+V==eXE4ay:kGŲ­zbF%C={EP Uޡab³(W[9+q(6:SG@[Tx鋱Z82s1: EtQ\\8dTiqE1yCpoꃋ 6ɇ/F)7VW[pzhBBvqEQ(JL !d0>Ӳrg.|!A"f\ۗK𽈭Å!zab&2fYS Q)jE_rNL)ρܩNS!w^ t@&*MIH nk TrB+¢ʖ(BI,lKG`ŚxkO/+j? Kx|M60Q*741NE>]PȿIagR_p ;Pc0#" I ={[\S%StdMZw뭂 d$Zw'v Z]ڡЂDP,+店S++N ^wi@WhP@  CW.߽` dɡ;he]X)(m#hKrHdPNx> ?j{U= \o"n0KVߩ"4<3S`SSFRv/WFqsr%b\× 9^"^T7NjͧᆀE,_ ~! #UZ>eX'6~W?OsLY^ty])V+«L |> (XpX 8szYtq޹ 䐍"H~REz;k-2/FSM,Ɛtr k ˗Wؔ 3Q 8cQC8i.R:8GH(7rȆr4^_m_b3N>}=|š~%<',)eX"ɡ/YMs1>D}G|E:srB e`f Oދ (4'$<"fEDm4HQ=b ߜgDbXbKzGvd6MɕqbV% .$]-:ߢk ,la n.p |HsJeU&4Eo9rG -3O/S \Ob^pqȧX?Wnk>GqtQ m` mĈs "zjb#q冕_1Hh%s9Ō-MlLA\u)bvդZ{2"\+ۗA?vj̹ȹ3ׄ:*8=vlJHWQ\/UEKT-XT&m)`ZJbe9ʖJ1+ޭ`3A"֗\ۗ5}wPoބ. c !]IXfLwPE:$`a1rw1) 9!U C2% :ʿ(#) YdF2aUdSR 59.+Qd%漺RIKp.t!&# tPPϼH(,1Ïë. iK`H=#'q}~ oB#0,挂cb$Y^!!x8FUpKM5~:EƪZ/艐0T+JN/O笋5bAz%Ȫ3gO_:_r_Ⱜ/c2$! { /fդf)r|?SM¡^[=@84ѓo_\^s_ba){l> ? 9Ohw&]0TR:I>Ў;r&㡸_%RR cIL4 bR0M &'O)s*ΥcnHE($Rs"jEatD@;HJfgck$Eɗ?g,%en E|: *gHHgbCΧ=LaTQ`Rx*b#U$1J;J_ʩ *Aq٨')Ar 2&pbWEi Zy/" T6!&QQ?+c2x:SǙzoʜ,&( pYJ작#? V"\zL*zj8p?[hvg?e6)wS31w2XG=K)C^10S'uĄS;99ra~O' P/1y-~IhC[D n\Jn1(Jf1TξYPg; \N) h+XdxVx]0jG[9̩ G> ZNMLΠ#xZZtDjmPƔRèor]E3 ]rEC+l)*`)~s(fj AUbvP]ëer)d6>]mYϦbf;^ 7z4AZkBB擜ao&RX]I', #OثkBj@mŲ)oBK f("1}V 2}ư5Q*MAV35(8q Ḻj.Aպ :&@ ؍3ڗ;[*˪\78 {3/fLqg_8`.ypnBY˴g>Eg>EfpePg>߲̋`88֎řO$3L*{^,x Ǽm0bab`fy劁3m'Ya I, fN>|QŨj0{7)(̆ÒͦI<Lv9@Qx0갟 +v($&(2†Hm9#Er94xh07 f0tm9+ !_Fl1/sݏڐ*W@[Mv`JO g̐6 fzS,ٷ?춢MՁ5eRCB̾lr 7!PVr٧/J%4 f2rEՏLF֊\44M9kH(0 f2܈Ͽ6Ja`"|>6C` y7@YGUDprY 9N>}s[p1qit)3LPi8Ms?W]+hه/F _:3 .?Ti13kBi1YR٠fIDH-fN>}9T'eU@J2-fp9¬bkG&0S)w+*W+C rLQ3W 1ҦLP 6n;̜}bfk3wКt /r0q 3XB1[\5fξ}yVB3MEO S|wͮm0gw3aץ1`-`_;0Pp?39CBF!l>z-}BΘCE30la0f@CP07v$3>0s Cp|^'3|~~- Q[UEoLgs?6Knajf$<|j~wص\snNG^kKBuwvm9e`56&>ƻeX嶳[p((، W疳^%^o_`CLzU #PάӥxMAp0 w-'_ HA%r%l3"y< M2=[NЫz`Zٻgٷ/L9ׄQƋ<[ ?ǽ8߈SA{NtmaқѴm9eDGvbAB ıڡn PcIKz|2vCKxGfNy =[ l5<{PPԻ1̲//9?* >vWΦJ=ծ-Xd۵o׫k Bdk_K Ȍlخ-":rk A2jMFMm/h(_f-"ڶ}2C{2#wDLIXM[0VthڂWzGMfjr w3rvŖ2|D31سňlӳHճ8agه/s^p_`Gf6l1\ [̌Yh{|K1pk ˪m1 [Lk5l98p@<$jbRVÖo_楼`yqׂFs0Y*J~WiӰհb4l9` S(#qlo;ZssxZ &VeWc-'yš~= t%83vzR xQW-PQo;3{o;}rS^r_`W"b6wP6nҦR9FDi̬S84la"4l^ݰۗid9//Hg;1[=زVǖ4ѱe'3-;fwl9eKxZm8ݱdR. ܕS !-nrKW+ Ln+dVB5۵ P_Ͷk.Uۮ_ ZN|z#AcM)xV-@ZXtC֋bM|8V-g߾N|~$w2, #6VҦty9CDٮ>3v-g_Lm}š~Jgu86eZLB,<3Խv-P^EiѴk9ekU/ZCZ@_ ʃ<>_)1gtXqY_] MPv-ٻ7yq] N)v-lrăv-g߾`gkNǦSq4eLoXȚopswoHc]-C`6Te &U{XP[۟2i9svSyk'[l{@=mo&A2Hp (-7eξ9dv낙eLj-i-֖ `0@y'_5`&Z T= fg2;˘YE1PO)3e,H(2L Zq?;&YuuAxmzpi|Sd&V)v{.ޝe`uO$7DZJu9"[hRw?e:J _6s2Pr(j-9HEbqb+fu>~s6HhXvH_€w2~[M H0'h!J+u׳'MBJ9 aAbX o[hNpß3ԁe`?p4A hMG ,8U#nj,sO(ֽB条GN}eM_8 L_8(_yl'_8U1jƨvMc#Yw9qC΄meHJEVfM۶2&dS?RQ4YH')u7h\dnh*ô! cǏ;yD!3rϙE [2(la3d]3tAJb3(vf0S2gȑ;61TǦ7?hSzG B"6xB۟G°ـXGTYu2ME"3{D+)h5QzxϙN4aΉd V^0Me`wNs,ܭ|"-m79L)gT1ei*E-=e`{ß3V[^=e88٧{@(e9@orϙCr)S~%2Kd{4S$S۟ +cOh="pfVOh=wO\Sb!Sh¯UrϙӎYOn6 Z]TSfc!T6HY?9*=exH<)sqў2 !}7wO Yn*sq=n*[֕^i*vSF h*3|dLbxD|soᬌex|Jl>TRH+%I†f*B fJ$,`;YB5﴿\PL'GĤ@_ߏcXO1=ߵK90$){2qNQЃ=`г*}Ɛ*0ڵMiHXZ`5H{ff()5DGD_Q6>#JN49iH%$۪0bg h5O51',Ojv QzШ.n=mNknF P%@cB2\Pl%s |wRɡ7Q?ewm޴̪E ]@C׏Xӛ yzۓn0/! MnUHkƼqqޗ:YxמF;$,И6dhfJs[ؼECI]cdK\yoo~ä:R䢨rcut7xZTм{d&Kݦ"yrߞ4Q̾p qqnOqL}[@,7UYD'P\t ꉟ xg o{jnHcd`%c7[Q />Wo˕ʆF4m U!Dվ5,gӭ4|:#i6 sфDFDvl{tP.z 9H7S;bƢ …Z6SN鶎O[WL kYkpe(޳#}w5 +p#W ނ WV V,W JBi㿃$;ZƒYMGvJ3NJA,%%Ek6{8<>s e&n4g!S_)Vb4k*GY6h!6sMSDY1~J>@r_4awRPB0J,Ц23lĺ3yޟ#~:բv<{}t)ӧԨ9#&>epmaAfJe7UFтL\՚`1H+Hvr9S}fA#"BmN dq+;#&[=:kD^;'j1ZN# BKF%Uj جM ք -Uዢ?ES r3)D˧\k`o;3ґ!'Ɂ+#)3ٸHruC &j&MDQi}1!2q%~6T\v.{ùΈqm}!`#SY懎Xᅋf{}f&sԅ{&:"ъxq+@jF|{$_N)M߶9=yNڍЅHl/2; ]vE P"M&*,^*0^(ZN4ΟȭH jط1[4w@+G41ʇ+#<MRPah0EDDЉAVP@n[@ĖIidjǼAՄSSTudPyVhaO"O*-*AMxȊ.:6OZ@^ +F! 8ܸ]"ѳg?Bƭ6oxKp侇Gbxէm&|XI? / 1/ENMD1e%RR'Q HoC ?O`O" *4sҢܫ)[|T-\G)3&k>Txd^%г%B)DP?H c[!0Oz*<[QKρ _D" ELh!X%Z F X{2<1-?v|3a+0>s"Kg};+ 2XE2oi Y5"sSjNRyOd "nT"ˁwH-I!-}Y-BΣ[VgC;Oola I\1|۪ULt." O4n|OX|:(SƄGH]$ޠHK˸cfwZ'Op~G(m3EPo=:(2 NX;Eu_ASID6D~Zʈ iEnNwqGR@Hbs^cDc,>FělO WxVd/l>6ݤd3f@؋r_b_=uWȄzVRg1%Fh}rR 6UY5dpU=Tn>Rb.7tVHmk*8YFhfU ㊄zEh4BT5AG;{H97Eg8\ĉu +)tE8rdRWlcNgZ4c`4|MaɅc`l tc"0xQ@Tgnx`ڍ}qFr31W%XLmO<ȬB /9ӋU:']fU6ő $+PB}-qw+Mf wdb\'ODCDV=!JKY/41YF[UXf!ٯ0E'@ŒpcmlphB9oGNy5@YaT ރ=9Zdj෈Wy.Z$KZfF0dI3a0'*eZ<+a (JenggY~޳FXVKShoE &XFϦv a VGgx7;ZWe^\EHCbyVRUZdM1$(H @03y+n+2"ݸQrЭc?gD`,ލ*DDWNJAC;dpUupFi¤!\j30]-g jzoiQ@N鎦ml |׼7B޹@o}{M2qmy4R[ȁ=y_q+GT4ŷ`GA^JÁW&"!XLP/4eKC\o43y%}_2c*~GQDs 7Ut~,Y-h&f5MEC|\F8MK>|zt'Z D_K"zm!ZI;x9tqnVAdobq1h9^i-sϻ#Yⓘp w6tFsv3MC(d-=AU.9Lj` 2vŒf@ `s,ހG]74ݻJX܎NrX g[$r96qyo!4[j8`>,bM@v6f5wvd?V裀ӓ&EҫS#ܵo\=l@a'4cqZ 8𔝵 67-Gav`xTEsv%? gmЙuPN{5t b"brpk]᜘Mr~+M%R[hi4U: [H`G8G7x^Q爅8 PmY#pOmEGᎄL{KoI dP{z+IX0"RYv_بMfFI{FKD b*W 3owgeC)]DwH|VP"xSDkFZBPZ|85 =p3/M|bj[ l<'y1!"J Jm*T,ה3;S琮X YTV=i!} j6m?АXR*A s/25 tJj1ըNTefTbh 1 n0D˚*Yr#PDœYRzB{? db(ę5;Al3]{y̰h㘐$"Yb V \>F0‡Sмȏ}hXj=G@|雟W<7xSfV:낄hxʦIkj/bVA?)Rv1-ath-5T9{zۜ-[iSڍTW]WZ*`A8_dDƱ&8Y/b!a$KmLI,X̸XS `x=Kˈ*]4YGhDو.6ۚ\T5WTXGXkq0_ zjʀ)·K*_$:51m5K&46dc]l5yӢvniLzt2>qePcI()?l Hq!mM;aF~cS쓀24]`*O)}ڀ; 5'yB*fSE eO,VHL8/ơ>bs)|M\Q-8@doH“zyx,Nh7׷j- $Zdw x2 kޯn\ڙhi`)MN *Ą:2E,ĵj.-O }!wjLs𪍔D `>b94dnhcXwh@ ge{üq3wXn֦s h 3ZLl3j,{m}2>L|VT65fZn'57h~}eMAo֩ Sv Ȝ>V#2 X4IF(Uzt_7ړ](f &sQΡ: 佗°HUGڍTSTatvxr\$i ɩbˮgog_sSSF\SuU+zl..ˁU1M >p1R]:(?o|N_sє7ɫS/vF=!vhڍ (08*.8'0H<* 40'j\ *8i0Q4􀯨=HuZhjuXf@a~&"GU&/nB]b+^8H'558,g:ʩ$j+]t@yM.(?o|N_fd ( -oxOF3A*# @Z8P0^0۟du&7R"gEQ r~z©nM@MC94? ~{9ee!ihÛ(hG AݢPNBoleC2e+OxFw?_T"~}us T CHlk'* "ƜNh`*F 7 dF`6NPe>uBQ)&w.[€y)r h+{`hQCZ`ߡee9BQ-hPaohE -@H^vPm>&+rAAcK>0 w\xFnϫL XSCew{@Wdž]y658q00Oj}$ަ0t +*[pz!"#CvQiNғ^؏le3w&|*~EOW9AP νzO!c]6NWx#[!;LWV<EE vޭlA9gg[:2QƸ*,lj=I+'(й *ySF5+@hJRI5&ƫVQ,1LX`PnPpEɼ4S좃xZ nOZI{^>Qpe<6ЩX Z}e*j)T;]!LHy4EϽA Ć|TD{+Tt[ZJ@]4z(#jE܊4k UvщZCZ/.B&p܉5u9thTm2ͭ&g/EĎ2ֻ c YA[̄T5J쨍m{3ЩV| Às:jNBZnK`7D{"m> i*_k/! JoIoi9%pض8[`4C*eݛC wuB{wXKh@H63CAYPzLuvo;@EhD},[@\P4W z,t_S|fP,0 i<1T~J qis4ag9I$Kjyz(9 74]BE=Ó$GC81·Q0>Q4@ĒRu@ES}9~ja/_ "JBC``:EF٧pwbwM"z$]jv@ rBRȗ: VneƦl[@g7 Zt.'U-=>H,YE&Ld-wj)?h2FF^fMxÁ 8*Qh.43[AQubqrMӚKmg=Vbۛ`Ä_G6Ks .bb5Mr.*ҧ;&hA6uQfp4хyUJD}lPEZfYd6Z6o7 WeRݨ؆ZIieF<)1/-tVg2k{)Օ|'z@6Fr9Db?Leݎze+%XGgApecЩ!;ꬊ8` BE?3Ci~RŬ Jd@`hjlF646M_)& rBjk^\0g9;md?/%Smb8Qk'2-z:~=IU#ut<\miksog\tv8_nDہk: jiEPGo$Nʧ6=vH ;Bma>%5ͬ6u#msCv[/Cd̄:.>DSf<]duJ_i2395G U9ԑF@~GRH0̤ )[TjRUnK(k$f:=sR /7Iu3߉H4=~D-iI0]Ol?C[EQ ,cFȁ|"Qt9hce^H0'N6z35&VɎj/VL#9Zx ӂYrQPvyQ1>U[]`t1ln&%M\ha c= hD,A9 (aZ7OF>qӢtQӽ1u]ytΗ?ܫ2]oYe#e+EP:|Ao ؟ۀW[;@& pCPӵ!@;)a欚.f[v“W)䴻_T͂N .*:d>P#b phZ"FnX4|x   * fRdzYX]yjr%Q@5qąab1L%{n'{H/NJvi(=vAR T',"x!zZCw\ Ԗ[~':}<4g^PcYhAffpNB`!zwfY&{AJ#6|U[fG Q=FkF8<7 >fwV{1fuyr+zmn,{jўכAu|3c}K~ ,XjUUEw^m;Q*$ "pk)"8 ,tAYpFj)9kb$9wy|W6'y#ȅ% iRH8xCMx6/XR ԽPbC5` cbS86ѳ3T3#<6l41 <#}cDEiD\jmcoJAG}&) tcs=-5ɕhLaD@ nKoqFgEʩHIC~H=I6L_TE\At61lz2 U\8<_p͇S@dlIe5A[Gv&%D/ʌX&HNZE:_؎S|(5F "5 y6zSH+ !UG4!@10C#M7iq"C/o2Y+"(輜\3ee+v}CI6b+kiN94-ȳ(Vnڇ@-Dx6kP ۬#'fr0^Oq'?ѵawP͢jTF,8tVc3bNCij"ˇY!ZδvA׎\a˹5Eahv*7nrpS1TPq\2ȥ' ƿbtNGI}hHTBj}J+?s4 6#\?Z +y\"q2i5:Դ`l0|6>)U)66cm_7|ūeEwa3\by}Z0%{J]s= kI.,ߖ[lU7zA(3Dٜ<w&q f|&jKr S蚧iz>lɳ VһqJPB1r#@D)-"?bvA,CnN_(VS~xXp˃giUg@d;H`1[u1Ö>–PZp6*<SںĖFM,T,_۰İGv(HvD&*hbSoҍr0Zn 1V><-xXTSXYQbVOVMc"KJh-R jħp^< "$Epk=aͨ}QHCtm8} QxϧE/ J+#L&:AJhvYxcVb{u,fx<-9N4h9@*)5f[M7VHZ3F.ǵچTjt;yU&jvG%yL7T{ݽ9\2UͧC7fcz?9<&Il>m ݓV-b|!ĀGl1Mm\_Ͼjr%XW}Hbzy7ܖ!kzx[q D26 /'/'`]/{yNLq;0?H1L*t?L\M"x5ĈSm'tfkۃvyԃRvNբZaކ4\u(3Dm"+AnͰ>,H/\UZнf:mNM0x8q)mlR4 TV+~*-:&ϴAKck"ڌQfhZ4-x*͠L6J'%;"0dTt0Ͳ>ahjgePN8pֱcjPSg=9|k,ȉmhN)h_uz3GAȢؗ`|ZY;:=Bb}yB1ΞMWR2\DPߑtӶň&p+:4BDJ)b6<X\0`{=1 [n.k0{KeƚhXn%I9}SN^3U]ے4u2K-a$le'Q1|k씣"]DI}e*JEea6 hqO=kqp ۠ܢ}8M~jO/hQacvpv^/Jm$T4K vǵ}:cUҿ d-ÿ뼞ÕgHJZӇ31hz7$h.:ҿ>I-ء|ƑZR\0fBL28As#+zR@/SX*#ڷX^\+_IY=KaPǥ& eHpx<:"%6GC(QXXfT(>EuCGۓCDƃ whI.!ŮwG,a qme v\MTBLF̓Dlǜ4fX U} Z&ƒg:GѼRI1l7GIR/K;'j>O.~YjCJ#i4`@EQ "sV?}Z&0C[HvL]n]7JPn"; <ݡȫf{gF -^PE0RWu!OC Wլs jLS.A+hL!" ;*yˉ7̭(.Mzz~mΎUm0+OhPLc .kwbMpS%7#ŷڏ X2# @ ucU6iLPl}[k 2>{28<8ͮE^s`ax9)IML845zܭU' 90Xi"D? Qɇ"XDت 1q׬VQר.>4i9/pJǀ ub;&Bkv ] 2^T7? 6$֮ w@iAٖwyR#fpqL}d64xM^3Ϳ] VSD;" MiH[m":u8T>'r"eEnHL֙ɸJM8 rr&qDH#v.~è)^87Jƒ7Uevi,zΈ.' h:VKE&!XSHg s&vh@Ȇjj}!4cB؃Ӛ*P wGn2יA؏Y]MmU.:;[PYzܦ$dY.]k2C_ ?AvJM,M3V uJEX yd^aplehqĪ L!۔BWmN>"^m_F |GV-1Z!JN(M{?g&]4:ܓ̎ Lr"@e= xD 9_q)& /N6(3yin#XG[O]g%m C;8?Ͱ\u#OE#"6 nӒѴ=ZҿUmaNsc0rTʔ!P9ÐJӜY/3*s#Fk쨵O8&V"q֔V>k갎lL&X4X|;٥QDFAsED{ ճ+ lF?hpJT=жd.>H_5{v?JyDjl~I=92Q׋q;Ķp*h; UmN^nMKt["RMh<]gn"X í~I=ln`|F ( ȵTOiX J^uٖ8W%h3x6K{ُa^/;g48b3]]ٞpVBJrG]aOaf?O2^)Zx|nߍÝ~9=cXQM5+ *ȹGzExs89ׂ?ȹ|p_N鉱utJPf mKZUr8?o`Vj=:@|ukVF={+kVQ2<YjDD>Q~/?gl4Bb2.p 7{gqevxNsdOgM+n-|G8qъ%  ~C\~bQqI &S<1WU?πv# JshGPHu+[eX~x_y6O]vqV枡TQۄsj'<,.19Y0[qMldy˯>gl@L}tsaFK4{̬8픀 *7fD<;# 4chqKO9Y)jkqJ=Ey-3/{*LժkK0ѷ)ₖ8 ̘J:`q^旟s7!8z,M|ϨYpE%+Sp!$'2wDDbm ݀JռQ̭~9=Gjk.' ] *^W=\F` md:ƭ5ֈ12)qgS=GaV?YH }lBo5$Fl8ȼš~)=LȰrΑq~pO !݉΀V`v8tCτT!^WsNu-؀Xo9b vG1+~Qp=$ k{ ]j\&ENi7z_kSԔ*j"qbI{<1M~.s<)fu3ISԴG펺N7d 7@y| =0OQ2g6Pc%"̠6Fp|hvL]RrosT?\P/'Zͪ(K紛^. KY:Вѷscy/?g/FCD;5+„C\ *xY*6笀j+8ڛqd5ng~9=TPMsnE+9nHݜ]4Ni=9աEu @Cq~gӻQ^TNqv{3V9 p-rod]h@t͐V(?K؋|2 +OIT©XoK2*7#g ɜMqབg#k-xlWT=cRV-eV7겁;c3=+At< ͎(CngZD+hJ-#2M7:&kTlpXХ~Qh&8/ʥ_~V)ތv5!1^eaSnzx6wHQ FspEN95Ա~*-]v;-3w^5d o`]Q㼀yY=g'eׅɰTGSkSi#0]uwM3dzԞs?~I=vOA5ܵ"IT-t. _)o(.@m"|Ta^¾Խp r̠Ԫ)=\sqAB\H" ]銞 5SJ|0xUs̤,6_rvB \FgBDp1_qaҡ^Q6xBd]"i܍Cnf,n& t^uF*l_ɳv@p:"٭&ۙ*Sa̬WԓA5iVl򃙶ɹ8 z׾̌cYtEѪ`A_x>Ϲguж„=nwco8dWkO9Y;y܉U:=nIbksMf![iQbGlh7M(/ 6^|NOUdRZ1 = ff-nږ}lkywlW>` ,A,#D{ QpGELsYgڀX<0/0^}R bjm`$CEODŽGڈ]Bq#ⶐa0 t7 í~I=dnDA/7.}`nwk!pN],rO8a^̽ڐϗb 5 {h Ӧb>iC ^_;2p~yx)=yNd kZTCi20{xFPbqEP+Î,ndls7ʋ9/>4eTpbL&ҷd9k;k̪VEVDcq v6̋9>dGߑ>#*eJ͖UiFGs31A]ihҴrՕ %~?32yzf)dKJfn=]EgC>:&[OHFӾu;(wxB b_}Rϩ1p@ʳm5w aG x:щ*=wp3}`)T|E9֫O9y3d%Z*lշEtn#@LEwq^"yjZDmWJ=Z=wz]0F3Z蛷q^h/?8FkK݃{i9e.w9Cݟ㹝/szNravcti+k^bnSD/#fkچ PTw?cKa^0_}RO6: &rVMWK?ZU޹bSYឝB3v6̫>h/>lvYK&=vܽsDvl*(Yq~I=G%}9N Ѥ˟nwK5{ږ$3Ւ0/tWsb37( uڪY;XvW!1+@8;*tf^raWsc&i=ݸşzWgXo+-OyaT ެ:]%p fO3ڨXky,b"C'^4 4\y}Y=dM*;fF"h**Jl8"fq@X= !줞s'$30d;#X[sl;&/K9my2A1Q54|/k n *Rں-xngP_|NI[e`dW$NhӔ G0>CuQUĘ;OUt4Z8/_~VI7JrϨϻ2D)Iz"Ԇ7)vJkdRt skwp{ zҌZFw;E93' b%= (C?]V2&1ц׈ngH}Y=*c8xgV#v(:iҦv*?l?NI6#:b:|YY U=4"pCnn,+{KO9NQ2oȟWa=hˤy%nŖj@-{4ifoܓyaq~Zå0yP7sb?͋J\gdH7]iOO1 I -mR df?W/3xL^ tŶQ4^lZG>$L)C yn~_QY6.hmS0iRl{2ZijIRk-ɜn!Ü_?\2*S֢8k7(ԅ.M?bWRqJ 4'),"i9TǧX"ɭ9cŖZzjv#5 >-/Kz7ɋ%qW|vcjcXrudAؼ].*BEh Ɠci$ '+o;IK-hhS=Һذz|0u1Ez5] 'Lͮ6E0^V[Y\0x^ASIb J(|A%>Ĩj$r%[w{ N]7n*~>{bWD `'V94!~\Тp'͉*T`}<+z4¯|(ꮡ~c)bkEC?N}>,VON!F-B"3  PMwQzbuaZT"hƦ(>\[& In.?x rı(HϺ@ΐK@;jgcS7JJl`qZMiT@~%$1[[VM 1MD7n=@Fw1\)!ɁO4" xdޣ&X0zcAirih4NTӢ|AH'%W:BX(<<7.bPqsJڽE]Cy<:EJ!$n?>.V@+P VKǓ~=\0H1Jr7}qINݑvB MxstZVT7+gb*X\JsՅ<- Pc1nbt-qb3X_>R9cW\ v7R2Dh1wr0K(/ޙ!?D^/]WltZnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GU.svgz000066400000000000000000000125621221777731700221440ustar00rootroot00000000000000 (zHcountry_GU.svg[[ov}_TLPМ@Zm!hPt_ߵ73G*$8׽׾L^᷏.~w7 Tnsf?2-.a{x-ū_߽@njsw}8<^饾Zw~J~7eJ#sRʘh ]s]R "[_֟˲]>lWK60SYPaqi}}lSH/EJ޿{Y~s|nUK[~rfwU,~~ۿ$ٛ#~wY}\=@ǟ_z߽uu#ڽެkZ4!6A]R ov!]COׇT?@/GA˰]R~s񞝮~<odqqyUZq5մSքLEl~~"w8Y8}I˧쾼HzEca8m {}|F#,܏;2O~}o?q釷l!X9q0[~av_(fon~b ~RÂԅ߾/>2p\OTI U=xX>욥>B][?R+Ţn76҃2ׅa?|xC""]pNDD|s>re—ߥIVᣵI{ ?v,~@&0Y™eq:/cR]: otFYZ:E(i`|ɥ/\~yYӵ^ۼ)Y|~hF1L@NifJ$ v- }ǿ`8 K킆]@eR8 絠Ww_괏w}t#4a!T.ۗziuPQ_"ۜ~ˣ--FT>)}A1U~sR&3fV#Z0"VtA,YŐJG0wGOˤdv3/Nܘqݍ=)oo#y, 6_4GWVm2ڜ. XçsEذ冂TKoNl\ [o ;vKd؍+֠9ʶ,1WB%(m1|X\/&#WgQg`oH/Me+R*U0h#P iADK|>l ;v_-2}!Ah^Sch% hctfz3Pzҭf!ӝ^F|c̎P2A(ADgRZDn Va ʗx#B)4V &3qrX<Ԍz@^B% \L#z["RS_cĠ2zH:snsg3PZKo_dMu*Ŋ@S1(_A<)7\ *EJ4a!C;VBb {1YfPUalfEKd eһco ;j,\<EB&a>ST:]z ,` GGrJu=+ID dV'B x!sη P-x]}SdH1R[%|?) C!\TE0E&7cМϤA@JP5iO0%uG8r[X|W7l'4G&bZpC;VYDb'ǒe)hdOw -ߖbe.z%\,4.-R)5gbpenajNU_莟@]&:d*)URR vH4a'[B7U {pq9MgZ6}P,}d8˯G<0)18rIIYJrX12+;%)JIzZ2 j dg wLA͔t Ҷ$T/.ȉe)<4cޢjx,%/=ѧ!e]ј$6OHr(bk/ma1m2uB:TaP)3 O6kL iG-dbAexnR;H{'5l@6X[h!]gkQrѤQìĉm 9j"bO& )ږͪ.јcPqur(4JbXs`:fՂB#}qhy[=zhL @T8&rU͟i<1uslug+#ǩ6KL3ĤeFj7\s(CF.9! ک2G% (iEh=51A?!6rݰP!Fc8hNVgKG x= Ф|O8lڂ=Y(Ş!eaLuoEI,7#x`ܳlPXt6j 7Փp p' d%CFzEhGGހ$Jsw'g?ax<d`hJPCFj.;!@biw6C^SmY/RĻJY8Clr0rm8YZ췄11 Nt by謓S}5dL,Klnmhq[Ð)7U(LQ453+rҴ,9f[VЕ=lm1CyIm%=~ěz Ys{j*$8T!70V_ r;] .ߔ3)͠)Rƞ"nشXoZջUKɳb9W+zSZ,/1M<0)~f:@̃Wl@v?XF,is{4t2e\KTqVSzHQ ᐃ +BC1dž&#"Fi_,r\3oqfͫpmV B`%NvDeLuYY:BMjؘ\ڔGŒ(ױQ/"srv߱rYgKÈs3KU3iƽ BDBG (f])\}@#`C\r.HOIhŇ 7 V-~kP=0^y5C%zt8mfN9s0b}DϴCTCcDxlxXzOIF'Cg"Y;6'#̖;{׽jn(/4=NO «PʎQ&_ ƇLKryC u/TCQOp@>)ףx*"LsXm&bÂa|G5.]P&iqݎ:hmG)N!{ef<LV3"/Okv4'"WL`W"fAhß1 m-oy Kyf3,yk|ybj*7^4\mX0u}O1?ܭv4}D21f{,oyB[?c#=y)O+Dr.˜tE:BĢa 86*G-#ˑYc#={ff<Î' LQ\V#T;o#mAɬ +N(QK>kaGsw8f﹀yOL;"G #MG,8^ǀ%s7(7!he8uG"v=ﷄ.xð1_y-.5%zoPӓ =,-4Nջ/^~PAnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_GW.svgz000066400000000000000000000006321221777731700221410ustar00rootroot00000000000000 (zHcountry_GW.svgN0 { \ԮI7:- q3 mFdJu=!tl485g;za+W0 Lme$Ç|7 hr6~.(Ӊu( !EӲ;O"ݦ죶i ]3N(Aoo!yѶweo|qP'UZ3<eŗ!yKuCk: !UL}ո3Bpֺye6t դcdm&ŃSH-VWGjEFB.bޖm`d_N3:B7¥Pm^b}.>s}8Ia&2ɳ1" lg!(eQg"DY./Z}„B.T4BzP sc΍-1)e ʨTC19DS'aX? UaV{rR 5Vce괲"V~*a+̓XCdӥ\c2D|KMi|v,Vk]8Rz-DQ{B d}v 1Lu5̴wDUw];&QQVbj>^zG)aGJ}azi4H"`+l,{djk\eUcjAMod$X&M+v=AsiMX3eaK4㕅2 \ӨV׶O]G=C+xHE f"pa.;05Uxe}jXfg{C &9bƜwby[Moɩy ϶}9[Z? ,3ϫ<amǑ?_}Dnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_HK.svgz000066400000000000000000000014261221777731700221300ustar00rootroot00000000000000(zHcountry_HK.svgT]4}G? 慕6Ό=JDhAlTB9nyLr!z>x,0n _֛)0U?5zaٱnaG闺K}ˤ]/yv6O-B9h؄D@װb:&\/,Zp}pDΰ2N3^޲qX)X f BpD&g:Ɗlg%Z٠ґ#$8 M@A2ኊ9X \|dP۠'>bMu*_K &D<3+X;D ,HlY`N^ئ=&DMnmo5󭞤|{E -o+CFRdtAYvNWpփȠ] 0=PI@\ dYst+AXxZBCԑaprU ٠n@F~)Bvŀ^!(.8 Aeq^s ˕JYxbvb(&ˤP{s o|K(7-\gu4m;J@wc+OEOKOl6N|}0tӦjX>dIM nfmo~z:z&Lf|y:J˶'1kCOj'gOGAɋv1q݁ F!v8s/NO*0k!}1C~^Cx `4,orqCмy4T^Q`H#͘CqfUqqBCګSJAE2oQg0,7}4`[[FM!hWd,BBjYBzq yp*X&,TI"PҀ~CʼA 0P}u5LRiFphw=7yI^bQJ7 sm]Y7bM"aF QhLUG0mFuukj}֫⍛BG.u>20 T'(`!.ʵHtI#)k*@+Tc.E脩`&f&Ȱ=DF8o {ўze:RDje(e:&Vs)Xmkb)ʰV<q% M;FuJ u((1(g2N[6*FјBPgn5ʖLJnOP;[ ȜpTN9pʟ Ihpnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_HR.svgz000066400000000000000000000332571221777731700221460ustar00rootroot00000000000000'zHcountry_HR.svg]YoW~ϯ(/ F*}Ql7=h;/,KS@R~|߹Ud[SA"Sw=_^L/r2=<ѕ:Գ|<]=<_?r5~x2Wlpz'M1|םƋռHϕ97 -Ζg᫳~Wq_W:dzMx5̞\<ސmaMn1g]=^?/;ы zngL. cNWΟzêZlUe< 2/'5@lG0w0-%4[ޭ~_Yirvh+5xpSj Y[h<]{xހaSL`v==Nzo+Ao.::FpZlxͷ ϒLuk{Qńag2Y,`{.~xG0L3kMnW5 ¾JA_ __m|Qý׍G7v:j2'9w~ ͻ}Y?Z?= 'Xt8Ì5WSѿ''% /Q vɚa}xZLVyY/.~nnf/.{iK5OYGŅ>so$`S /:ѴH x,׋ Hegl!wCwW -_Lʠ[f>+F \U9S<|9/AFRZT@ &avn ME/8Ct=y  ֘<ϖ>Qz`vy ]SVI6b`6y]h%m6oJUa'3Yl7ǖ;[Ӡh+x}㰯$xw3F?_[?]^\pCWzs@[]C{^Bk5YՓ;lYvbfMӺ:ͧץw##GuЬaϬ>>8W|O~Iwqq~}Xs*uQ+auYw}x 'fW3ӝ-'o mn_} Qǚ:pq7/l>Wb6]p5E;ԋ.\by=W?kn (w.A JFA}:} q=Inrߴ _>Mb8[2~x"N 陪Gm WlWߨ*e>Ug% b쩯Ro{$2č7 >FU'wjTN.>:*& lPJ^|F~'?]@rV.wȺ)9'ؔʃhZcDS41W>fd1jgƔ+͜je0dg2bAtu3) N`R.VhmLƈ xg|܋{2 KKqHPJ`ir*,:T[%221UA̎QKqTuh r"V*'@Me+cQRK28fezw]؇0"` 5S ❋=ڮ8=MI#_C!PVـB,2$M 7`CI:yg)V*FBFhplU7 H&:{O.e BŨ}$(TDDr-tFȨh'D>Q f"FJDpU $?P4$ Y@q1ǁPQ$vQߏ> IAD35=4MQ슫`Ò+ѧ mŽRtC f.D{d4 !Kh`)0v`N Anٍ uj0cfH8UQ$c~ lz j8{XE= .1 BL FvzeYbO%{Bc(k w`Bӄ kB)QzL fbsbi{c 6ɞ=FЖp Lh{t2kd|h0wp;uCy4.w06b{Y˝H$})ovxfE@!!7`CC;a\,l-蚎6ֽHNч5]&u>Ҭ":C-3={ZcRwʣ*u^cy[tU(8 شăyk|a !mTÊbKbF?"`q f9dtcKV ,99oP(€bXh4a`ar  @(ˠ$T*Ӹ>;QM6ك/3g:)Az%p l*:pi (BUYbTS{h~s 2.ttz0"rnTUA"b 0AvHzu3A`Yl;F`qn}0-k E|'&8/ 0gdșnrwupa Cq04E$oHp\kMĶA02f_MI$ rg95%I΍$ڼdt٧&w9[V G Q4 OӒ'Ȉ]j!o"R!)Lk41~A)W3lhR#'e&# .' X1V0[&D à/k^IOtS5c6 `tɽ "1vT}Tೂjvٗk4IavOzdRȱ0ٶ9\QRu]O4j%VIA{9XބF^w>Q! (%( _,hcR)U\ʙrrTrӦ;a:|Y!`ZRqQY-o';c{o|P.]zv6:DccX?c?Uϸ@@, @, UcXc > @Zzp,o @@O2c~?a@  ~zC 1}oGyu Hd -o+~^Lٜ Q@WkŇAdn |RdwuC1K ; 'N^b.}_D#&Kf[%\Ix;YX}&-!DDDDD?; ΂t|gJJJJJJu%"Yp_wDiD΂΂|%"; w Еw% ; w|W"QF֙sI>$h$%yR('f|`Ia'"LpBh0% VC>QPlY>JSLYS޲l*#1O}?>Yvuuys!/dy '"?%9C?)0HRA4G唄lGdXN$brɒyU8yj/(ZAaf`6Ux50y@ůx+aEDH9rEDDJ[1%\H!Rg|kGx /:IB^rR ­15f*ǜ MSVn{taFv 6,hcߢRdX=X$b#'7X brA.w"H|#s 1/p^N$_苬w6ߩa%"HRJ2"p'/*R*dA[:/CJZ*V$,HRy"䆈'bTݨ,rF^@EV%!Kpm@=VKr/@KcX^j)_6UYS˒.8_uWcǑ\8׈L~+#~2 }VwHJ[-UKd'"(&Z E8oYsA[;lEv})4/aP_Q 8CC3u qTeph1 D+%7iI }n!`֢xp*Qڌʻ+N,?tugy-5]=aԵ֗hk+2ԔT^Փ2|<{9"K_RI/&9C7ϝkm=b2+h8&'Dn{Ӟ'm6tɗTԀ5 ֜Ts=hГOOzzZ6 pd3 8 0-cݚ>?O( Ұ<=}$~Oν_a.31S#>%-aG1 ,208.gWpdd8pĢ1M1=& "o+iU>/ܰ l\=>ld2̴)v>gFѽ~dʯK߲a7oM[NbtDtF:qh6ϘtcCPJ$(}IPT#\9D]Bm,PP|~q;OmP;C1jFwe+w9ogDu͐_ѭ^}vx,V*pۜ4ZP׵b)&-B5^ ,QFbsF%h8縧!Be#!OC5}{n^~FI/ѧh jzLC n6Bo>kPRJBq$-u,z)V/o_Ѫw*5.&N /-TBX&vZ}v/>j ڒѱ a!ayz>;v4JE? m6v>|aqm֯.aWDcQ9DPe\Q8-]&T Sp*PPE!"/a4l&]XQ oO=W4zv+ 55ȳ3n(ݭsn&h#ߍA]D.Qɧ6J"ʹK,}0m,V`uP-Xno[~J/N:mtoFh'ލ=PY `"fR@.U9PxZ=SxcsO4ZW)+j:<&Qt7k?ލ,\@*\Y! ݜqTfԴ5 <q٪C M\_1Pَ_3#Kf?óEAqOOq0pG^9p Sp؅h`CK &LCfQ\x:6H3( F7LHC6ؼk`)b˒џU/I48,TQ1JeV*Ɂ!8? F3f+Uz%Po,M &u8g:)gpW94.DVV J2hP )Ñ1MW|hf[e8NSIꥍ/b;lb2cKVb=eQ.&<)Âl*1H-3s+`祓-dQ`Eէpd"vOGt$.y S>#P9-1qxc}_`w`;E.?6Cfw1A ϹgXQCy Oei=H`C!b,+Mr\V=r0JaS<Oa =NveI|$S!+)0+㳟()/ӂ&y_O 瘒Pdwr fGA"x+g8Ek :#M 9 $ٽX6㈓xh;@K\sڲqi+7n{#ii0L!bCC̵s`P0qa<&_wHM^Jc$:D(/3Jr,RL,Y=r֋cMWBfpN8\rʟڠ"Oד<hToƮ {PMH?%E3O 빠Dpn 2* | [ѼKjw`FiVl8OcoT+׻MK2⬹pP5 XǡBl{PmN1Fw$d=Ϭ+けXfQپ8$y/ǘP [4ރ'bih>JVVuE@F$ Pտt/OKvDpJT Lɱg~/Fbj:_iVUHe0t^b3`{_R2)֕%04|պ|N #e]QxMk( s{F͑Z(\hMuɗ(~VugopYg!Ba <kMc3mtu3 0RU"ͤTH|: N߅S6 k~Qq<? ?ӧ_>o?}뿟Qw'U{= pJ\YT " ETڀ%i}PTP)TEЁj,d^o\xa8mٚ'FSB3Ӂ./%3˩ԝ=b/DOr1ǖ^*4\j ]kT,(cI^J d3hI9WO]}s Aaa&r%mVƟ .̯9J?1SW|5ET5^وeIq:x2q!XULh1E9"lMpvb+hM R:'ܟ5v0 Jv1lZKp~hUEHb¤5ZOWcXӢ]sa߮#>wōt|otۇ 4 /+Z&JD#2dըw~F2ԵSPYU Zf?~DVNxg9'^> tDJh$c0X+BC0`eou%|nh{V'qL%+B 00Gb.Ge3~',W¼laR#`saޓtx[* &ѣa# Kbcn0mmJܠ0,U9 ^@hf5f:=bwc4!}Ir#&ՖL80ԨyN;3ƔdFe6U=A'dN!#\^`&?nVn쓜yc=T#4iỹ%SbZDٷ\pQxvυ~Q&_|v6wr@`"W5NJl82/%lR6hkWY'a &qF0^H{iK~-1"#|Dу#pMӍ>b0U44Qs%@B"J=Re! lKMĭn6lg#ɲネRT*U/~S.=ijdK7K0'Zj`+9_3Iͻ}iu\fÂ<]>)5J$MϒaaptHe ζPҘye\ 4ߺ U &]#k T6fyP1-amJr'֜#6P/wS\!p"imvna3oQ(a GZ!P–tLJ(PpD#LGE &;qc[ݤx3 }|A^Q9J޴˩H7 |Y)1 6"E>1(CHAѨm 7eyqw(ˀnK,Xz!'rNS"!OVu1%xK}B*NaSCX ¶CyBU) |[?Y%&=;T:DDʶ@}}UJiv.|y &oYD̽oM b7iA#- T`\>,yRTI(`ݏ(s )Dd_]oŮ}u|l옺ԍ!TT5 gy 'XOH~ FCySoa2A}V2S[nc#M+m9 ? ? l4D78A5*R YLӧRwT%8ú] MB 2Yet:ǐA)ho{fOboL͎/lמ2a+hVs$]wox0]~v'Kd=(o9~!G]\Ҹy^U| ­tpoNȿiUy'EqĜ5.Twd&;yT]P /jސ>-#7./l4N_qmVT=ٱ+Az>h<ޅϟ4 -"블z ev $RtYj>Lbo'ǘi՜aa1:)ܫk]c7EW l)IO -~*'MծUh,Bl$:q.>r2,U>(l^|V? C ݸS{"` $Kw$І2n̸7{>L6(*XgK9n&P1o+|R(L"6l"6 =w~/h֜F 1ټ"mDZ@TL =Rfp^e*b`0;gMeGd;bY$(8n]Cs}CkOE;~ ^C3NE_W<|)&xL;卍H)otRo4YSj֣V̼T8@)]i8ȫ)[ߊM%U;%u*RPwx%q*"g&K҇ ѾF{)M-rkmP *'$T{@LB6vp"!  "wA#0`~6&4[C#֊-NȯȈ_|ݟϿO7?777wo??|O}7/׿_~ͿӧOBOo^kƣ)K|]_?c|f 7߄OS S|曷owo_iŹ˝_R_?I qz[ň͞@FQhYXUwB wOo_~_Ij ?~爛~ßӟ~x?~w?]~_?|/?w__L7J,DOE6m!m*k#:;\ZEBE-%˜Q'DZ]10÷?FhnsN5|rb{?|$~w_z,P ç[S>Ƨ)٫??}eq6IؑZ;ob+קGV;6ŔK _atjjҩ%mU>0|KeJ!BJӲ>oSK osOSyK[ 6|l{)(Ũ J…)2hx/WDOHA*ڂZP "ѱ~\+%SAqpq'U\xoha؎ӯjؗ˧,Զ)L.[4:rjN"[u=As ho5 ")\aP~FPb]ěA?/ i1^bkE>\<ۮ? e- BYz{d^۾'`(MEU u8ޮg_QݔJ'GRE$ 9g_Qv%]T4tEmU֡j58,MZ_c`򹷊 SCXdl&!ҞGzCUN<Ш Z3[g7.VڜDV)=ҭ[a'6(@u02MX*_'.Na~ ܅jC $ Mg}ǍsTfQf&puJк(OF?j((?wPL=o:*T拴6TVM ZtP-'G _z1 Rv-.^8鎫YWSu0ͽ^vP[v]Rgn h+)}3^r7u][҇)+kW?-4ocVÄUk;2w~= #}W2ENhhvW47=0X,,hR34Vh<.t_G54 v62m1֜Ջy/*^4jڷ#u]hw[ hުx;W0 m_AQ@A.\nh ܨfIa_.Ԡ ]i 7Lz_)sV?-^Eݵ׌s~%r++G3k3R>\Lgc1fU*ۑ>by/^, <)\敻 7Eb);ԩe*ޭ՛N{[S _Md)_,Y÷,).[Er$_~/F3%;֭MƇ%I2I)b.M~Qs{=4Y({7c kܱn-xRd ;VJK)M>W~-)?-+cߚNchm֕Cu-vׁ"k "G޺3':CQ$inzņM.^ż= m[me.+8м"B!bBR"Z+8[,iqQ|Q#Gu5'jpC8Y!F57>ZGԶ,!z*GK<6`Y7S9AيF-ka5,۵(t3c?Cb;Xe%yên8 =1ljȢXV!:%rnVetjt97 ꌶGS!L ʛ9\[Y=e{EC1b/^sW)VV^yv&+^3sksxyo5[UWi(d̾XPz$+eWu%<J}ც([]&5G6&WRO2ĚΖUW;Wg~H;]pTu6TUCBĖzxFa嫃f'XI#BvEҠBOZ -JR(?{h ;|U[;>uh]9 55. UޑNcvQ+mMw-.^ ukFVMt:s~Ҝ; V-7ߡBYnmϽa|1սw@^LY-Ô*X6@go-@eWT5v]Rao2URuitZLs_6fzzkjzSQ}(fYX_,󢠃EEƢz@7w$}k+ZZǪj/5!"<ͺM#dXsV/Wqxv9c-Z u[-P+ XvVL@Thwϔ)!A|;;@p~-+uwٚ2y+t6cb^.5T[3MuJׯ9Lvb̡|bQY¼iE(Vښzeӄ|Z0+?[}e)-Bׇ>^n.tf j(:Quu#rUYZHM(S%5,% Z%)i_jVu)4T'3YQ{CIېvfeVXrgVG ULiW`qs(Z<.=?0ՠ2drb[KkCZe! `/opK" i A~G.BjcS3hO7<(|ڜa\x EZǾ^l9Y:J4Vk%*doLINאB7zM'T/iW45l1Ȇv6 lϾ9\h{y{a!@ gtJү{$5pБ ֘.{MWshcZXtaC>eBZD%qu}(YڙDL/(duUqF]B.Uۅ68䛺 ߻JqwbǝlSl呿*JbE[&? P z9v^[{vd /Z0IcR/޺v}IaJ8-B} `ٶl:j$HݤTgSCո^g/gWRLgbXuZ\ETjѡ*Y _ K/(ns+t6.ƜUg a/bmڄ.bB#qu|JvN56(S}5l6ԷjжDWZKXnͤzkD.erR+HQh@=}znM©.=a ^/!#'+|Dog*w]0֕Jl,kJ,ti,=2hY5RY![BPՍX"萤 dy-2Wgk5cfpWgl2i'oU]äYCS z9c9\,ݢREe" Tyf~Q% ' 1%koE$Qx*G}ӒԽAXjj@wJƘ\WlޤʒjͺcbhfmҤ{Z .V*֧M eIQXQDNZ@6!VbB T,>V+0CQEWfeA- . X:mfYUjW*PABb^zZ :`*O/NsL0ftY#;;iS̴s-lL%ٓEVTH[ TJ|q7wQ?ޅ5k(ɀK , pѝ̬7z[Qp+VI=Y5U q1@1]<\(6vK:tR/gv,':A65. CᨏCvSM(F-hCv'#uv6mg2mխNN`ǷP( CvWMlt4){_b|S_ A|@{֕_0uQCshdfVM4ǁ2{f5/{S痦Hgp nmՁR3c8E}uZB4JjF L \%ŀSY-١Z8?>p7O+a))rBx@w,1t[sXZHf1Yp3H7W9b^;NS^ckf .vMxbfKj"c_0b$xM‰% d}ouaN݊m[2 ެO>ltuNbp`]ǟ"vBٶ`Go82råK4m}ǿ@"7W-}:Gy͵8k㝵}vou.m-JZ"8Q' 1o\ڙPP٧"SW-L[iaF>IgkFڂӸY^O0JMF2QANw4\6lsHgY6nX5j648hNdR[4["{l谟S:im-*.8-ۧZEgY w *7CsQxl7"%,6Լ":ߧN +V/! G>Qͱ+]Pg܀[b4 6=0XOwÄ6P'6,iN)D;,XF= m6,X ηo2l[0-|J|&skG{8"uxKosdn ϋؑjtK g7_-1hw4nѐ ւ{)~nW%Ձ] XPg;]B|[簝pkݵ].%syɵ =Ep%ķu0I!FYv6q4-Hh8۬7te9*2A얅zhZ <%(Znj6ULg- Տw6O IaCˬdU1ImtB9e m&TYf<-6H,Njgs{XBj oXx6U8HܺB]Fbcq~&#/zޠXmUȺ] Z4r46>e`@X}*#P16 7g:_+dMЁS|{::PDlLhe57n}蛕[RȚځ؝Q }]|7꺇ΒKdN=#qߌO3j=+D'E?`^%h)asneŬN{@or3e4%è*mE]ao < ŪV 2{8%wh8Ԇ^!u;sScz ]Y\5@ZiYLaA8ޢZ]W̝b2"D| Ze^n4 Apa:bn󓹇PjG/y؇5" +RSpԸt21" 'q_œ67- 7oze} E An_- C>piHi{k/"P|0AUDdX["ĉBxߦ Tx'm}O?Ί {nR{?waEG *W~h_6uv)Ձ:՗]puJX ø'({=ݹPtIF8ݲ,Un~QR$u\X ,M$Vͯ&7}l@uў f:EPN*"[DpBL/B'QH`Q9&Oa' ~swW?`w>;jC 䔺@p ye)Ptqvw'5u_^O0j/_xZ`=B w%pZrF} UB}2,LA +Yq[X݌4xQ|zk}r#^e" =Ki *RJhCf;̺$.Os., (n|^Ȱϔ[`C cQ_hh-ד|}5,JFcFVtkMPl}vk5DWG,&2dx/ToVy!Y]mFQ]hLYXNDwY[DKDF۴ ZN츋jhk ]k FW)(~6&W^mW!VrHkj$"ד?YpZi迠텂=!΃=䏸$IGyz$ /y{0u͖h *חy!˓,yE1ˇ&X(HVW}͢ys+?"ã̔@P~Z^mNX&Xp|bnLgZs([ V b]]ES@&<2^xϘi-DM|(s] Xp/Y̷ 5 q R8P| `A*azfT|J^.XLWi=xU6n& OL?e' +Y/FVi_Jҏa w^Õ4l -XIaYnS2k+Zł9-J͢7p7Zik ]׏[:l [poXь1s:d.aYg^PP</l&qз8b!GhPV'ƀr L"OlE6!R1#03O#7v(P#Vz_P.qͷE}|6zv( j_S:M)=MSxU{Jg/|ߦX,}կVmWj~7/իa`W o[`Ֆ%BY<[O7 N{*ƋطeknopV;v5`dkKK"͢^*WwPw'rmrv!l="fN'=Ci[չ_fR9Q- ^{:쓺{zw'L.Y4˵MxbYi iEIўfi\`槭Wv 4ejDCrh׏6sZa27 Q&E\۔h4ûF5ev8lBPGB a1 y^[.n!`rxb꽊ǑWvoW~jP0Uۏy\M`2\y"jB xhEOo^ð{ כLrm"#(Hxo̓ 2s#e1߈+u/ Ñ&v [B7˖Xy&z4HBFѭ>N) Ff#pN}9Zoϟ3O,lG:M\j}TTߘRvtĮ rmqF2Ɇ\~[~whGÓDUj4w{^L +&0%b'>*fHcfrdF1$*&{,O*dtSy]1)j^-q$Tsb&Wn10Z%b=[o]LvfDnOb6aw1~w/UР_Q pH;"qG;m:y{WLIѸ ɆmQ1Ԟ96DfAUo۔?ES/Fc6vWkhGNM\9ls?1mT&CoбL6"d_؟iHӗGOT7X?.Q2GzW| uu6eK4|l>d2>Ȉ:[Ψ3~e \g2Ugׅ8IE (![:ODփa6P}9#RX!h!@'_vӗp,t'eXZ'Wy9-FdSK=r^oov7ЂĢm#kNv^߳on/ؚ I$25p̣BYqa;mi"pBo[ 0.㽍5A?.:yh&̭BF.\t 7z@c(=E1~Nż8pX>!PrxJ'&)z{B|"* ,TA*y7dD %SE|Eɶ Ò `d|`JZdp{L&!}m!qªʩ@5SdֈDxj k+Jǧ'6^&s a | tA{Ef5>w(#dY2~5^wBs|3NW3} o׆id[|A!ʄG=,Y47-K%挴hd;}07ѡ*U*&L74[xJ}U&X:"6U>E7q%_c;;WlOw' >DB_% Z\d {b&kſ4_Qg~Pg =38dOi^J~z n Ae~~id[?6?.ڙE)cv6@S(hcDYϞ7m$Au9NU=gy rP)0?[ъCt?|4ĥh+!ѽze^QOԫ x 8_3H˘j!-N tio3e;^W-y'A _ke%*[A!='r^D@{LFZk,#L@% 2 ;QG@@.%x޷l͏_PlA3f`fg/1!c^WbjAjA[1x-ǰ,N.%x^_k_0T æh)hz urΕ4&^vN.9wK NͮA bufbu.f4M4~K]B@H;SovmKݫBqNX>@@-ï. BHib7) ;-IZܥ|TjAk_)fK@2ՂՂ3&?F58K]B@( y[vŖF 9%XYuЇͯ>B*1,`] DT [%.~ ^!}!^-(Z RhX#ρd *h sz 0-iH:'wɹ_W(gtfIpPDN,E|vu84fq@sN.s/Px6H6gv.KY,)a]]@J K@%P?XBl^sN.@J-6B@q&61xk_Ђt(&懢Ze-n,f_##5qFq.=1ѡ޸K]B@a&ov ]),"ٟrfl&udPÓEcҜ;(6@@mϠ[P\/ڂ eAqL _; Zl &=#.9wK lm ٮa9HтB ނvDfSjAPD ЂhA|`+Է{u="Iv1L}uuޮDycw=H!{$ح~<8wh.}^!6i!-{›].C^d\^SSva1.\jlx@ g[4gb,9cK d|ӂ=nt^JeN vLTv<.dvJd ،b&3%O}E:K* * V6 *;z1Y"ȢfʢEOH/f1__!$c>+),'_(0羚`Й)!_ҁv&0K)BL2f+d-x&xiv[ۅ'M,ӂi=;̹X~I8uHq}UC־y}hx*m>wVJȣ H&O ?9x}ȺEozN:ӚNzu&wzH8d!Y=C.b6G7Ccʅ^C--No .ɉ''~Xc}f kb]{ȪQN?zZO2jdЭJ3S5,>jg6H1_ijONs]luNVT p˜,K.'ӶKRU^Tg$PIYxH<!tIf#[Nc}Hx)nMLu)zFv@GhD^Y6HķHv ?L$? tꐵl'DzUCW@ӚTȳ<|ǼvDZ|X64 Bu3]!"ob5^$?fr(Q *DmK"^xu5UHے$ictnOgvzOKJUwGbi')|Ec(|XR$qcu]3?TW5zJ=QC3_|!l}*"7[yO C!\otV?mb00PkUHTކX 7?l5}m.@ͫW5>:kz T0+0!,DY!,5\xq]< Q" }Hxv*Zvllٱ4)G T+Fba$5^Ј'~ث_sH"{UNZA'1Ow2JzaKsc*@eD]YBZspj!r]j>=C>95 Tcog0Nu0)_$ÓTm@S9%+պln{'\Vۡ5$8VC$1=&3;S5,ކ L糰 6"/)fF(R]p:PÙ6gjU!SԞÝa}a]aƩ'LOz}n$gD|LsQ&pHy>kP<U#9^C<%4(XCJMO\n_T̕ %'66JAS-'6Ü4r}mZO| 1 *W06'v#aq":T:Ԡ5 fqCuMoPC P:ȧD{zrl(AkPyr=$̊5f:T؝{39Ӑ@IgD˓y֢ 4Tc64{I3KXSi;j!TsgwpܻXC ؠ6sSPy_qiv;hSE P+rGS~yG2BTG%VG"ZVgf38Id? _+5ڜ["p4تeVv!z۶'IUd-ϡgCϥ6ۓf Xь)ѺZp l}J@ZyJ8?^KF@gh|bIVLx_D&EtQ?ic>5Z mO蓠9bk!'s+ #|ؠƳ`69yJt54XtZ""@ɘYSOV X4%@b:C\OW!ENsgqJAgAqP6M?UbƳ}!\Z QBjpr=%3yFZigApݎP1O_Di' ?>OE,sט@Kʠ>Nti5t7[ i mݥ)? xv "vS1? vcv-^5Y8@K HO;Γ abDS? p^HÚmඕ6@Sdתbd`wf=Ğ8 kG)i=]d!mcfxq=pF7o-~8ŷlv! P P=-P6KK(예~H8=lMvX|8)gkZ{Fci~ʖJ,@\-Iէl`n+v4-XYbf+)<{E+w JѠ}(Nu3FZe͓)9{qZe(@  gJ< x g vڧ3E+ڡNl8[1aCOXlX#̔Oli0mĂȺ5~H4uBX|{&{"7qʓ`6̾CIN.nGݱ˰udIx!%ʼw_;8G?@ 7#3w)?\_3N> H6y+PQ&Ŵì%#뤀v, nd\ Gfi!¶^qi\Y.Fg?9LșH;Wռ s1] v>-MAp~a2yミvC#\nF-f&8Sv}EN\_Sii;kOHT-顦}~Ҟk̽a}s@.-B/?9(UqoG\u@1rq7tvJ|~e޻/΅Ӟ#ڹ`fuf8Sv}A(C=HPjGz4}t<]` i tHvNxtR;NpE:>NG>JK!YVZ=+"ͺ]+sTGeGP엷O1}NS }п>)Ry_}"JҌˌJ:!w-,D/BjkÿR|:>}bçW-Ӎ?=I2am9is̥d HrܻLqIµ_%YOO : *v|uUyWCK|bɘix$!g.`&%١v~IR2*qI<.rT$9Gf1d\f󰓤d'VVFlŦcd\qWHpZʽKlFd'Nΐs4\e¥˥*k$ \崓+dԏ:Ph7/㴔[G v5F^d=RޟQե\dc]/mե0*sZq++$tYPu|THNe`]3q($ZXqUk%Sa| R'ـ |v QXHNi>t,8 4{f;:*M+grNVa?{?Gm6fԋЌAܺ88AUX\2uٸunP :Jr<([.WO5jqڨ$$IP3[F!qUg(4I9pU yaYtΌJN~H [WF!UIf.֑QIDINZuc8{l$dY$ldS|*=l]d3$|i:-*i$Nbx8brs#P9\ ᭍Z{0ƒ ὃbNCgTCr[.A1][;D"|HIi#G21VwPA-E%RjB"yHxU vj cbŜ#^9x!wLT2vhJ:28&f, 5Jx})C;%*cADwH҄8Vµ2FԦ/7ش Jra@v'2Qy6`{5GE2 kz djt{O@u oNpMHY?%O iv'"^>N{;u]bТ!\UVWx8Iz29p:$w 7aWmdxSjD \ Cէ?uwh׌SƇ.xE+*iQzo.N:&%ntOIu h#Ķ8qr(5Q+[bK|##\[&LbƼ"ׂ}H0&C?yCzUu7z20W,bJl*(L$Zu|cS)rž)KV>9U‘xH9lHT!#JGyy};}W\ 9gi'p&V]b(K@Kp媿8ʉ BqEQyE˗rEڑ^W“W$tOb%uMHkM(RIQ_ 0cH*̖1PqOAd(oYg@nJ ʀԧ: b@xQ3N05Nj(Nj!BAM~ևPUz~aD7ܛIfDc`NpZ쁶c˜9=ˀHl+y0Ƒz ye`~C[.U+j9OCR5MQgy:Qmd:b|t?e 'P}qt :ڶ}w(9Ϡ$oMЇۼD0 am,O!'._RkiK{td諳nObe<)3vR~=|390?o6Őw.?jbd ȓTJxdt7i\"-oSVRg1_Qa&uk-I_Ouwc;ko T|gM^"Km庾I?6 <wvS>w7Ǧ/:`7NlQm}`e+`G,}^v740i/P;`OQt4h;es]h~P^Xe;*/n/ByՍM{a7zq}ҞYܑ:G͔{f>]'L@폹a&i<xE@wV4nzHDCt60O C $~ : |KkbMR!A86!ṕOrЂ|ܧ{!xl!3BAĆQh~=#$r \g\3h@PqLtA% pߙ .5֮eCm<4`O.pݓs>%MkDoyL eAC%=4k~jSxqd,MTxx9x* i]} P+IsD8Lৄ|6i) \hc)|H*qN8 'P?[9g%@C.fC(1.OT5@g!IsN |^ S] OReKil)zB;$_ƳIDoƫvPɤ p[aj! 0FGx4[JO٤٢@s3 a z (u}vm:r89Ǐv'*0&ZblODd}xHA`$*M7r1ĤÃ`o"=K&xb?6ًTDXw iC-WI+ {6H7/PAmSl` jv\y~MS`f>~aJoC6Zx  s~lh/7ĀvtU0Sϝ=|-U[ltFgٞEE04KSϝ;>k we}֯W,`.h7R|@ckbx@Ul>:ϝ~{O Fr_|̯}>ً ̻mi<_1)$ۭ3/D ,Mv;}DS5Dkނ^m!hD~ c# h1\l!A631.u=#GW':1Q@eX |C 2KnWfuw=@C{$!x$ߋjݬEge SFnsߑzA]xI G o:<}^XO{yQހu\=ݜwi%U:ĊΪHE큯c*s&;HPypf HA6⇩zH 锜+?Tpc=¡l=>LOa#Ծ Q`ɏ~5ɀz? -N ߦ.p_&R0$uکwff^{؟fջ=[b˿nBѼIAخqSTֽS leZ0@&K& RD.w*lOk2'q߆OL'Di !z)F:-8 mP4BjgeP|+pRiCd՗YV$ )QL&Ò˖;#W0Y1KX.9i )aKF=ov\$wmJFnrP.[Ī;BdP~$Z  )I!AݝN2f'`iA5%v./gaҾdہպ$r$(m"迗 *4+AUiA.ˤPyhPZsG,$I$g'[ Yp?="mE R]ycJZVjc@o&:5VU[1}elF j&Åf=YA.N^`?ۃ KM31} utp8>d)?fwЂ4"+J=keup7qKß=\vu`˅MZ(s~ rU'Y0hGFuC/94g>2aYu̶3SDOl5K.EƘR`1(,6ˑV0/pǥһCuIH-p\} =chc+߆zЬؾf6g:߆{м3ih,! Pf4YNh-=3(mkr\/0`} t14xgۈ[ s}?6mTZsf4uzizXcӋp ٣sE؃i?Œò}5ӱEoGN4LU9N>HJ7--YDƅPYCAl1yxţv*N$FwSb`4ĶVepIsh\bp#VX;6mk%kĶaF?;AFl֋<ФBmwmyxQ7& ]< 3 |',3uU]dlw:H݌=W_yb$'K:wK}K)u2"eo-˪olڎp1Q~Gr^"<iM@eɼ ԛSIlomd7}0SpXh̐_iχ@0܇2}G'W JJ,q؉ci%hEKS 6Us70y4aXrE\)ug>qe3q#40̥Ӟ;t`Qk8`'6R chuaC/U;ۺ>sw\g#cCӮN8û= ?cȄ } !|Cޛ}B$5wZ┸*36r943RMPTvCR(641uz<\4 aF3i59`Rk>6Vͷ7POqLm<2k_':[POq~A]XL_ ->I`AAi_aAA=9^U  "O28.>XmW~XmHٻ~v}W~XmPFF"t6/>XmW~XmlWφY3Hy8Su\Fs_mċu6EZ>h#;t<"Oewg]ks=1&GGEL&it/:!,~ $TJJO@6JXYF]M Ӵ7oWQ^]IXO1z p$$'Lh%VNİ%! ozxP~u*yOV6΄OODM gķQ'Vrv[{?m+yJl>FXqU%^C}nU%^־VaQU onu:+P]G8%tCs9J~hZr!j0k>,R<'ra5M2!Rp3O؆Nķ0Vk>>TCxlW}`SP^B|uTXr pH|NgДv.%ķ'^38bHW ̘^%@pel<8g B#YͫMop~Jm \īR,R.2X1[ɣ7xZ?5 荠Y`x/q|xɇTih`U%n?&ݔh5=n]uԂ*'gb5)^`}a{][x6$TrA d~۹RSNķ[>4U_.!&%Į۶ !%!9`Q4 Io[jP0XķfX-\gXR4-Aؘ374NQH=rrhNKj{z0B> $k 5eӖw\,7'}uwݣw.4"e0дԯi]i{5 Iʁ>I%Ű4v }:U>I%  /tpef`邇 ^}Ȯb sj]s6@p9\"9Ol#JCs5w$z^ ÅaݧhnvhJnN@T#K12[]",͉nq#ݧf셅ez6dEl/Cg64"q#ݧ@l@8\}BJ0+B+2OQY5R.lƪ^Q55R., d@i@٧F6 ť<>elzc*kS]变V/P̦9tqjcBy:X7t,UPMsupmbAkyҝƣk=ԣ/dt_fg^#5t؁>!Ş.gXbFTF5.X|uwM$V[PVm ;Nu݅kBWuE֩j}s]R^qUz3t5W P?[ 떲uDK.2h>T5kPjx)eom k +uI/DáG4lGDLjp$`?9]PKaTȟփS2hޒtUzoztwѐVMvK >H4=0P“$4]j]N$ AsQ4C S*փ iXI13E[ֽĬFe.ֽ,U؂5WN_}T[~P Yq|[}jsYyT u/^/i**ጛnI ːX**xEgAbŵ 2v:[ 2c]#cmi,ЈLj#Q'n4J1)~ 7 nGx)utF3.>u1#AԁvS d(\U|oax2-ŚޠH9TP=u)|L9m0u-Z#M/~ *1J1i>E4p1h 0sw sB*Nе8J/9qnwc9&w1/C&#o|&-,P<4Naݗvyւ3aE5ǧ+;1i:=}F7qvuR'JYG4+1߶[,nHGN&4{L7x7G;03 6@ r]t?V2N][Rlw荌J`T]2*&x_rd-?g\eY'ss"q]uR~{xcsWhHЏR<<ꂫcw:>ߨ`0aW%Dq27|~iemuV Ӡ:/i5M5 T\D=Y j,ơ`_77S&>߱\JHoC$-r:dj No[~ٱ haeTSyΌKXF=| #̚Ƿ<'Q=-2A)7:sa>,3 i!@Za9& q"d٪aHDlh~M܏qP4|PC}C.;;W}l"0O[o?:d-ES$s.P\`ŨԵcuFe~//׿? v _anavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_HU.svgz000066400000000000000000000003451221777731700221410ustar00rootroot00000000000000(zHcountry_HU.svg=0wE=gi0ꀃkk蠉w旣Bgvha@ ].u`[3@kWF @ b=/v%ε";c\&ikL !;aI.J'c1~In(@ucL[QZՀ*tBK?. XU>"dƣi_nM`Ehnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ID.svgz000066400000000000000000000002701221777731700221160ustar00rootroot00000000000000(zHcountry_ID.svg}M 0kJkw@PA"Mhq9|ٱU.zBJL'K~Bh'@nWa,L )2Kh^ !x^Kvk&"r#S9(n~ 7HW(navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IE.svgz000066400000000000000000000003341221777731700221200ustar00rootroot00000000000000(zHcountry_IE.svg 6cԘE=A=@liLzVA"o?8X'.qӔ⦲2~90A[ ()EP\7\`BHMm#pF ANHK h mR6gODt稴.Ƅ,9?\7o3RoE=W=lgtӛbIunavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IL.svgz000066400000000000000000000017251221777731700221340ustar00rootroot00000000000000(zHcountry_IL.svgUQo6~ϯr/N`Ilrf@-еn#-aYHڊU'1lh;>*8m3˺Xo %oo.W>s(ۻϟ@(c=<XȢr@Jk(j6lGEA󦔙04r09K7ʩE5fw1n7AOFfܢD\ |+jh* ΉuHd{#zcJo l63 V˰c[*ﱲ]Ⱦi΃Fڢ\$ /_VA&j'ܿ3J=3a0+mRM_!\<5v9'8 NݨX`+|A2Ab>,dcFل%l4&]v'a<Og,M!6lBS:M&i:2$W$9Aj+J4Cww'@5<99ص *|!\l[htRZRWĹ23^̂t|}UNl+s``]%hc{-i%[Ş2C.<P.ʪ}cU;ҕ(ٔ+U+{368^dofi>*$k'}W@Qs[ksa,K0F)94he}doɜnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IM.svgz000066400000000000000000000167341221777731700221430ustar00rootroot00000000000000(zHcountry_IM.svg]rGv}hc^4a!5P8 Ma/z& HU^R Vnvf-y{OUˇ_f7˗{vj&ӫ/vP&_Ë98NśXr|f>:<|tލNOirp_^a2ėӗw7ӫׇgb~hpv7ջәμ9{rR{MC;ɇW:c!~y]XN?y~zr=ulq߿;gl0.s_ͯONg)~:˽g7/x_Y`E?p~rs_fOgW{i'?t2χoof8P;Ww~ه뫛Y;я]L fx_oޝL?lۓc8Ϫqcηlqrv8ႶsHL9n~Hㄓށ {._A^ޞ,={zFQWNj&/>^n۫͠ꝝ=My]hw+ⰿMQKF?gߝ͠NwrO?]}WWo) q_?٦!!iH&ߟ_]?tºl>1ג'f,5m?\|ݬ)$52s@N.=^^o/fvh?nƯC->^Hq̎g(gZw& tdyZϳGzw{ɼFJɯoymK NpEN] O],zrs7 ƅ oIF1=m.Ӝ0#@ܲ3W@ طM 3ut'6%p t9V$ YSX+8Vm$ay`=pNS!h,(P.S@"CN_pLhP-@sl9{DNmgkd ..v@E ~*gl\BiR 6*Z]~ T; ^tYe$#Kӡ~9@cLSti#&MWD7N Ư1L)n+ v/ %aMjWp)Oq~lehu~j"n+h,w UIarqptO bbuK>ʬlڹ0% I!7e7;k;E~reS+X/lyP ߶uc&*Sd vIkgp}@Ie|DG`l #8!!n3zHW( ii7!*)Pm}S_S!l (g&!lWh. H@4Pn:&9:b% 1@U -$/1 dcbk`l8m~HU7N)O)a50_J#BZmc 676Rbn66zɿ #nC=L#jL,IԼw^g N тFee4@[ 1ar]d,k9"u!2a#`0DW#$@HUx+bݺ=`i@x7#BUNx#LBfz'X<^f/:yK#̛MAMYX캼INMkx[[D{z@9Oچ+Ts D栣 H3T8E9r1H"C $ MF0\)R9k  5W1i$i0;hܯ z/Z YwqrGv,Ce 1>ˍ5ޗP3'Ax[H1H@!nQT_.zƷ +l%{Vme$rgӂRVhI Wڌ- wfP#zF 'p- h#JG!LZh{)>r (f]`T q;iKH%fPlaIk2Ok|ڮUvK6rewS:2e2Ntq'5Rk,PBo|irT^,5gFǖ÷2!mݭF(3@ti9*h',E`z`:0٤^/]U0VS`002$"EHOJf& *࿁¥VJHV/J yJCVb@{ Z&z)W%yιŻ#ut+!Fj.b {,)lL17>L[:/դ`KёFf`M! jeVQ "+πeתG0d"F-kW2X R6ڙnFVm +?^tNK3g}jic$&Ɋ|NoiJM1lVJY)H0~9"ei &2uR;V5t Zgvl_[o¶LU82L,Y}SN?ŵ+ŃnTR:T魈r'.5A]+RpU ֡ՎTjuĮ蔺Y* @kn.Ä÷Y+R>ك&8R5nex`_j2lYQoOA?XS9jTOG+cB\HPH[Uǽ:bi~jAKkM캧X;-еuNYaJhWtkU-(b༊1]u2arcPwHFϟBJR- E Ӯy?EVجM-JU t9u]<=uKkwɯjL#h9-mX1jCϭ~hkJJ݊T.jyjrFe<\a(M1ggڊOΧZ.٧M*tx*FX@h؊t 6yJ XV[5X9]]hT# $"BQ+,4:jF~/-AFa@竪2d`QWAm0>$YjV tO"% u_9w>n.mܞɧ: d5VEӓtە_sNVr>t$j F;֌r|N߱x[Kqfw,7ы1&j(.cJ-6#ͿK)X~S̢mqDĴS.~#3o'w7r1LZ'Yk` 8QΝcY"KKXUNb>nHv!w7%g-`]j[*еd LXalJ.QtҖ66g-_ݟ"vs  uiyLjTد,lG6#m=|g@[#m3ć|z3]yڇH|l._~xWL+8ٞ)A}ƀwp#<-{(4#\m=\>}@_{zF8g{j: #I6(#Ycu=0`IŌpݛ HW3nˍp.Sp{Š>]krit+-k+__sXҥ9SCֱ8:|(:Cxt#UZl?Zjmè[ w+J+d:k+{KS.(jB x[]w{(Px_ =}Jj""U皶&ٙj+ºzKZq,jm5vw+./g'G?[]*A%Vely#4oмhަXAg r'qv2srssF_u :$>B3pju;χP&o}n; nݖ= dtP<ݶx5nA!8g{9(a[0G`!4F=&2(m% |Pm#.Hg.&"2Pe,hێuN2bF,ۈe,s.еvwӄ8rjWq}uH60X)5++&hGʩV%&VIP9 \ 31< /p^ :g *{zkz㩲0&_dD"ct>q s@i'v!-vF!1ػ.m+kE&V ~.r%0Ӈ* l@V4\@nt%Rq$bB3KM GSNhĀٜarEEf}tYyϽsASz է+pϋ원Uc=3)@0a~0חo>A,O!rK߽5]{֭/]aU҉;´v7 rx3}s8؇뫛dz{4Ry>1a W7?| 0Dڱw5xihȑr{nw񱒧6m׆/_~l0o)o~,?I&oT~dW>?By^dHDX0$y|d|d^eïqWV*1u=͐%7FfL|$OMI 7J_DmX2|7;|"^8$I= ZD< Ck? ҀVp_ZfiQ{J{l rH*_ej 9~?0F<S5qˆom#m|yn{'6~D=>V VhhhGڈ^{ڃ~Qf{h{C0Ftۓ!AnOIHoö`و{j҈tܽ͐Ȍhj s#znsEwHFdވ{ȼ[E}Zjb"XU皺&ٙz+º{B6{옳 ȷ@x]{%_{7|#ToP7Bz~b%X˽ǖH%wg/}|ގ|dp׊ٖ=$n|͏0w< s? q=#aF!4b42}n&ȷ; ߞ @nOd.ض6b c26Be{vvc#,J^Qm mSo iu Dг,][Af)75t-iSD+JhCR˞w;@$PgAi ֧%AUK'Ǩ6}^n׾?lrk{XqYh1T]kU(:5J|zNqZsX}|U&Vq##<h~ta2`QEE1%6#sD`…lhtBvD(v"uD~5'i(Y a/5]4Y! 92 fc3Gʰnd$@G[c'Ʒuv?AyP2lfC^ذFӔ3?r͚/(/;Mo gldKJgS4rM"NAh6 flvЭ%  7G4숆}bhػ S/>{QH.QWڳ> e0~.#F6NztYgI߃5F:VIQ0r`ȫ#-B AW1B<okJz NWUԚq"pY;HTWD3^Ldf6ӫgW6I-ᖅIcmoA3f;pL +_< u(__¡ߢn<~Dc Cv l2yx!(@i VNC+Mn%X# ``|^$,EQb4 f9dE[>&hOĆY[ ae$AL/f3U }nxF&7 "=ٯ%3g88ϳlD0B] H*Pi=#~KYqKJ_E G)E(U\$p@H茈?pSB-/16gd\QyQY#]V |n_nhnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IN.svgz000066400000000000000000000065341221777731700221410ustar00rootroot00000000000000(zHcountry_IN.svgߎTM"v.{1RH.y0 Čl>#ѫpCwW_O/7_n?zypuO_^}ڮNwo>{󧛗W>_/͛woNoܜgϾ}>_?SVӉm?=+GSO &v_?ܾpW,N=}y|իn~۷yzw>ۏjmf;ulO{/ISӵRZO'ОVNUTCr=% Sfu+ﱤ7$]=i}vXu4{BΌfS{̌vHMհ*wݤ܆4oŊqjzl̀"}Tk2/ICRPEV^Ȑ$[)XxMKŧܺ!K1gA-uMWUMmJJ߷SY5IjLϽ0 7N{C4vbFN#Ȉf[I-]uD6O688Fd<̧ۖOҖ1NV'֤N'bZR"l]i(gb$%'<""aA% NRex8R(d2JF.!˜-a(F9DL#(HRa"Ո:2j",Àq!xn h ӻ"LUG@RDdJA0[lY6z^L8a\F#|zMJ 5fX}nJ\1tnRh]2 }#~ikbA ˌk춰)A3V?ph`x #j  v<  }δ*wՉS[Bq8}6 V1]ECJ{8ޏPpq8!%xFc.w`K.`l'ͥ=қji^fYkn(BĦ=R*9 $ ѹ{7%|/1\ n9vG w9p2œ8[y8 Ӝ89\0M[cKp`ku}Vkm~ʱ($ת^ t*~kKj,BoH]eu~'[, ֻwC?E ߮G7x68~e%navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IO.svgz000066400000000000000000000315741221777731700221440ustar00rootroot00000000000000'zHcountry_IO.svg]k"G__vt:ߏY%k֮-@MkZ@ÿF#4=j6DEEdFFE󿼿Y ޖ|B r͗Wß~vvMey5\y/d[7)O7ŻwM#-xLn^5 rs9^'ޭj}}1^\n7CVU.7NNQs={}Cy+%cB1i7r5J۾v|QP'_M&I:ZOa]DjN/^m_RZQ/lzo募T:nA3A=A5A|fجL-Mbp={rea3NQHs</k=ny^ݖu^Z̯4jYgU\f{jA, NsM f.淓6pgyA^N?Vuyh [;?0dvAyKFש7hΪ&hl7L-U2p[~-fNvX| ;#/ry!!-dNm1Y^ߑ岚Q~.u8@?4n5asYޮWiE{=o?plo خ݄_P7靵'WjVL};N^4 H9Q بi\$5ET6 z) 3xZ9Q*#eMa~`b(TNڞH jzYziUǷwEtP4ZgMsU:h\t`P*uv<` /xKh:Zkm;NP]KhQ otwZ RJ$/uUJdU(ELg$SQQ(#12f;YZ))#Bh$-rئ5G\)+ rgRr5E{(m~3ч rCA3wO,R;3KjncX>vĘ\' {$嘍dǕe=,졚1Q ؓeaMr{@'[ߌ=S+ۃϐƞl<&W[\Yؓg.߀gLY ؓ-oI6 ,1 BR_.#C.qZࣈɠOu5y`dȲ&O|X1uTX'>Y -Bo1g,فgh|7OB8rG >QCB@1Y>BFg蓥? HXց,R$ !~@-Šo5!7 + 3+LJ: P+57ir1g{Pkraq3,-BYgʽNkd!5 ?~caopF|"U{0dxcAvR8Cȹ A6$XlWlҚ :RٔmLqm9dw4rЬٴ-w| mmcQ gӶڎ'쀴 6]^wBi/6>Z# bI6C?e/a,J*b2@-+97g hb33-r oUsoTrE\{(^sAܟX}-rCA3P>m(_-7HD6D?|⏽$em wUR ms.@j"dYX3[I9[A'׀?+-roRd?5s'oN,7k V'u 9!J?,lZJa)㏦XsPZ'࠰s fͼls}sրf.y9c!@9"j\U`1Je)W4[̥Gb%`0wt"w<ͽ4sMGvXL<޽>p,7d(Hru.i<̀vEk;b-$FZ3{!_ǧC6K%TU|ֱSaXi cumV%χS٥RR7jwt6H%/~.߬WïF]w쬵8ihu8:CI=!FcEpU?0'վ(Get4GGLq['ߏ85"}c91aqA{s=[4UOK¸?f O,Wwێ߫f-ǚAU P b$t?GCY o$Շ,=$<8wꎊо܋ƍ<1$3 IJH$J0{jlURJSĉM(:'H䎺wVOM'l]kZ.m6A>Ev=})a2퐫 >jhߵyV[|N DceŊdA)R65iƉ?trw%wpx,_ǬTp/a9pvfLv(r9]P Y'-632&}R0 J_h#=|{6sC K8H~3Q e{M -g͛z=S( iVxҊK֙wyzЍR-/wsԄ.Cu~z]OM؀AE^iUuɃq4]EO~|{)L3{dM,i)u $͡u.}f$&Y}Y}$1<"Iԡ1*P'} -)q wckl'Վ؜İjPT{Ojje۩#:h3mbs$xpS hjΑ'==qu/>og{?xN|y>e!^Y+tr "RMzHİ|+SgMOBz Hױ'!x#zr F$\Iȹ$ݓsI7'!olOB%!޸'JB?H *? 1F("YtՅq,g!гBbBc!V,lbeBf!V,lbuBf!,l%~w~ YJDrxH7h[ ""1C{t 5>yY<+zy=98yS=98y3O8{^,t.N2-mXt%H!=<Ĺ|T|C!.<|{r6!g/{r6!g(;%}i//oE6Kh(Udh"vIkXp%ɷB.Rst4c{.ri(nt]͊#\JDd1*CEN+oōƧ[RyKG"l03nXchXӮPTm[󐦃4:GbZLaW79LD:GZlyCF{P j#O-x@="ݭ i7 %">D$VH :oT3Zu5#D:RmT#De GBD' B$LIȹ$$ӓsIrOB%!AKB= 9( ٻ> I-CHzfщ}( -%oa(/MHuz̋qd t-To;4^ ~j aV}[Ĥڐ[hUj5RsBLbǃU$9i* L;3U kur۵ehI^)M՛(+lwnFc"R|iL׍酳A?9%ET(bAY "kӓ%z8ELITB#S[6 \!PpU]uO9; *$X؃F'zrh4Hf:G9ё{dˉ#G iU@SVnn8Zۻ#>P1,^C/$28Z겶GwWfL%|:dFe&T+ÕY2F xH;R4xrw~q PWQ6*ףKXL2%`RUB@ڌF3I㵮B)zwz E|\=6l2BŞ8vcF-[6pYo258{2zc1aʥnO׫tN_}D"/f* = Oܜ/L,s,FiOɦ&8$<|d.pMG!BUD<=&`:/G40a Yt 7Z,[Il@ (>S %,L\<, W"se`1R쉪CߦeKY9f);;AT&=J vLL6&(6Q@6a4hhy#zv{dPдR+ʆq .>%|n/ۿ?T7b>7Z(%* &TVe>EV4XmV"ӈZQQ᥸Z%ʥJk.W2m}M򠛚ڟdk#^Nwꋲ`S$&:7LQe rH"-c㷬Cjj386:0U:to@Å[ٶHNi`*nnh[6 RЩeU.v,ZS%.:LLY u4;u HjU%]˦걋*/(+ӈo˵m-5m0q\S Ũ -F`\2x87UNf"` ˪1xpBͯ.%h+Y`>ގIO& -MŒb3]bwSؘw k8A pMћ "wr2lM-_~竗Ц旇m{ ztoFF]EipթEGanGG`},/ʹ|| <{~:g9tΦs6Ml:gW;#3Qt=$'I^ pG:\Y=՟(o05ai:{lzn oP}g7` TL }?-&D ?xǞ jWwkI@#354>Kڿ:d =" \P%@tvi!EQ$(ҁNR' 5aaU®Tgâ`J !F{|#Lp! N9x@ `v.e E_@q/Ew 5@ǦyK;G%ZBMsz$g%[;953<2r1c`,/F+B;*yOLć8oRDn^T?3yRfX^Y$01`'[$ Ő<(2/.|}0V*`<:T5FxDsHVʼnX -r˂E-貲`E 'UՙrtzZrtZR: ::ԍe`"!iɑp]*Be蘠<Xɧvb'ҫTLjbyNǮu,-N2lJӜѱp J_04!Փeэe)YhanPZ0hH .JkC:-~efdaEE1,COZ޵N2*n,|5ӢZ}eWZq‚e49xltۆFӪc[Wױ>͞V% l)uNvuQ|6Û+ٟWVEA00d_5%?|PVZo?'쩚G'c~:q.\s/]{.ő^|-ƜXpmK asNFbᐳ[W@ݑqs1'9Z .ye /!2%(7G-\VI:5cw$cuYCTCC'`[HW Wнĥvgi=ϒĠg bC$ K}2)WB )@v6fke Xeȼ/5n28Y_M{hhp07r:wŹBIҸ{΅{oGk6NEf~PNa~,^_#piK{\/_-E£9KЏk0.滹M̵ f&z|&wLTkh+bb+nLG֝"38A/\*8);K`oyO4gag\T7- : j+ P8~_?_A7konśfXx< Ңs, GBR=57:Lwwt\rލ9'8E&亁ҔޠI{tz™}ӤF[)X!ASHp$7帑?H0'4GW-_b Abzհ!U_lA%K;՟jl9Q2~y(\&N1Ps]&䅜U8owp11k30J!p2s#4bFg*xH^(2ݏK&bkX@V5d3$sjdOf"(C=LߢI3p9nOy`VnRFkHG(W "$lo= ơ~\0 'fĥ_fWjJ1=/eouN Hq'-c5:d0xkk JqI,Tr KGMDMutyӢoQ~ϋzy$BW K_YJ!ciBퟃ6A8^e 8y#z֗ q0ྜྷty,䩌ĠT<䌏r*8/2FpKQN~(@xD6֞{J-vE:ꋑŒZu쀏顅@<m6Q/c|eiȷ0cR0D(>e.GzQ[k0IRT( Ŵ[S2̑m5FoI2L>/*fC}>{!' /S f:< oV5 <.L>ioUx K[&|ߑ/૶;,&7~ 43~d;=w/o q 蝎{:n+u: ;w]6J2&wx>|Ծ_w<7 ϼ]ww/Sլs g_Os~[u./(K;߹sN][/Rs{W%sۻ7/an^2듻3 c/D$ N}ڻi/\yKg˘ɖےwW(~K#,= Ϛ(ϛ}b?{=F i_U 2!.ӄׂ 鷄ND5DD8! =B:M%="RN&5!݄[BG 'ЃKgKR_2[XK敧w~4+]A#xKˉv=JNv=moMd8=jn,IjAi0N>}wG?~W,\"i /(~PݺP,J9Kd~nj! nE&Kiڜ\v[GګgȼCo1xù2G"!\-M?(fП91<$33U(3p#T{~lB:\joeX)!eބ } Yy\B9)==\3gm)0I(V+UBL9 L,w=,qxON@}L0+st3>>bCmO Px4Uz&Lb\ULLJ"Vj G'*N n启rW1ve[*u?-7aɘuokv8w Ɖ[p&_$R $h [`X& _wsld_&ġwM.2f,Zp'_+h ٫cĠO4 5U [8=7cL]>ʼn[8"S8Rf{zfSGDq}39 .lz)Oߍ#t۩rst1kqѫIٍ~DޤA Y<bJPKr d{ 6Dq0lc'V/(Xm=TasbIfGNbDr-I$+;fd[`-={~WD;i_}NwTbbmŏd-6.[bvv4bWP5XmJSؤ!I+dAקΡAz\]QG'T̐r)-GYL#';&eN^9 yu)K6]$ldLpQK2.w{\qNtR"0;ۢ:ǯw]?s}s!Uy4Q5q[6}r#AR=glVW\`kyMct>ZqLCz(5U "oa>RQr,fȜ=STPل=ۤj8 )LiS!ZeLK6h0?sb*YWl}c(ffa4xCsz5V0c'G3ƻ{JzzڵM}e!G_lR(uM+ 򩯵Y`_A'+:xvtg|>Hvglj) eiٽlb'H{z\6aaƍ՞ QiG Ba'.CM\/ +0|uw}8eK5Tvh~.I;˗<1:0(Y7Ȓغ o.;OOy2󖂤˟ w; !R|$)&홐}mRM~ d+êH}m;.^/؆EJ.p6tS nX) ʢDޤ")Y%skqZOύTۅ-V+{ކ; P'N6\/!eXBCiVcA6ON ;=q(;~[1s >1Vi$2Jca@q$0>sci8 ;N ;˸cYgˎw˺#T>1 sr$8~0N8$/#eo8"55SN'sP:L8d9~0N2X's|x/~rTƉڢnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IQ.svgz000066400000000000000000000046221221777731700221400ustar00rootroot00000000000000(zHcountry_IQ.svgWkoF\K ԼFEM4.mk*Ev~3eNY;q|~}YMd)&Yr}u6uE|z~u;4a\jV&u)Jg);4m\LFN3W =-WLhwYVƳf<~^/g٤Ngϒ8:&]9Nonn]6S%~>+ [ADaxx Rn1-8 Nlj~|9ɀz{k]Jմ^uRN^(zڪNg ..>1N*U@ޭm~3ߟ:H#飳ci!SJe~L> ͼN"Q2ZNwdž4oZO7A >]= "KA&0[ܖVBR\c[”{|)"ӫtZ>`\1,!,Z~,9&%L6X(Uʀh)DW 2z?z_p_'WFT!<1WB ㆲb⡁w[YDM*}-2=^\@ظk uSpDagR*]`}08%a!Ċ-N9j kv0` mFjG"?Z@ L C*kf'`ΒtIh ㄥXJL^|'@y'Fyғ .4zE E_cKϚ|q>)wh{ʤ_#2؏5ºT*3MSl#qJb :r\LdCh*]xׂ >R{!U^"GebOeXhj 񱷚8BCwc"!eM&] 1ҳIU\_Ys_tnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IR.svgz000066400000000000000000000013211221777731700221320ustar00rootroot00000000000000(zHcountry_IR.svgKs0wتd 4L{H=eh 3@LOߕ?_вvW/9fӐ%OglW'W޾ }׏/P}ٸJ1II $Bygqq₂ċ$f!Iqb4+SJK._lз)3KlL}U)d\y>]? ,CRYh4(CakCqo@a7W3͌Zݢw0ƻ]b p;!ubj[hZNfcHGU|f<'NOcwq#jslq)g\"6  Y*JNQZ4.=j]b1Ps:d0{Z`?_X>ߜC*,Kd3Q,Rnbk"E0CpɔŔqR]ҕ3~jp:HR>jOmS;0(6_e5yxtG$Yjru/*CyŚ2jLx|ZF{U   ?zOtX0߬gBD{a8 CQ ֐~y2>x  [ȵBsśi0 navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_IS.svgz000066400000000000000000000005161221777731700221400ustar00rootroot00000000000000(zHcountry_IS.svg}Mk@dT B' |+F(md;߇#J}KnW4AIw6@8N,GT \fgv7QX: ~&2navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_JE.svgz000066400000000000000000000315011221777731700221210ustar00rootroot00000000000000(zHcountry_JE.svg}koGr K_{$~d"@@YRh_;d}˻?߽V_s]j=)9_2Ň__>U4^ڷC!'˾.?l_]5 G!Տ7~z}Jg_?.%WۜˬOSQE׷`տϜ [1|soÿۻQig|wnn~\8kJo~Ysoo>ۿX_/Eq~߼ U;3ZҞ*HT]䧭5:pL<՛׷n~?|w{w}s>5;tk/.n_ۧ^}O}ٰ>n'Ï~{#JT[J6)e^R>Z{yːz~T񵯢?{o짿<*2Ɛ?3a+LkZfi9V%s9l/ʉo/oft.>bu{'2\}gg~%uѓG;j㫗GP]dI|Ƿ(߾{hć*_zG}/w%7껛w_?Sy?x{};8[k@yg3U9m-q[8[alI4MxдWى]c&ۋݼpwWZe y%{ưnhssyUV⻻_z /@I]w̗(W/g h!r8=b?'~MVGPPVſ_<1i7Gou\|wu4X~V]yu/[.COqypLېkM3ݶSf֖a\ZgekyJ)~sb[F^e#y9r~n52Q !CȆ~ ʾ Tn6-_YN}ᇷ7ww7w^xJJ77)xܼ{wSܓ_s l' R_3 ;V|˜8.m tXE e ˱8}$[jh\'1ۂS`sjƲ(jO`Ȁ[l`巔=A)YOlL㲦8_>۶o=JFi%lA,fE3f+%MK `-<,)P$/ZmYsò۾1BqvD_B<\e708X{K@>~/Ŭ{O,"_ DEp.ƹRfHd ^XˑE|G 56F1s(GɪGG:C*c5Ghփ0X8 ;[.FT`{dV"7'KXE!+4Jpi Q3h~ɈC<FdLۖkb[W}ʬMU`8q`lT سEbXAAU02gzd#),cp 8H({Zg)FQK3VMj3`nDȍ0c5mQ RRGȤ"c85Dim] Cp(#n'#`n|-Xoc?VΈ6UK'6* `;z|ф'E=Vud2)Pٷ8q":9}vx/Ms8!8Qcl6Mb[UTRƲ: w`N0kHh)[ Зt6cEz1+K ;b r%[& ԠRB"r-:5ڼ\8* T"'¹l&ICI]h qǪRlnFR"8>Yp oRZ`ZLp#b,ۂ`^ $j3+ӱ)GK33I*a]u#J[w&8i*pUIg%p3ܛǫ(P'Ē۟.tw}/gP sI9)MnǨC@2CCU Y 21f;%c5@f̎mB#G@˻/n΁"}5UB1:;ĀmGw1^@*1bz@q>;X[΅(r^WCm[tDzT%9abNygdY\3ٜdij7mfܘj\0-A#B@yN {NT#H`R(=G`C0ēq$ ƹ>(֘R'@ @{Xұܶ)1Asj1%uY_աDی@"U&'{1WIZ0J]lBl GjKVIY(XwM9LY{h=?Y/҄T!%8mu~FXA9Jj٘ԝ`9)Z(U x?YRGJSZ$)EG-T3*{iD(dFij U/)EUl՜hqQ6\KgA2mJtW@Jv!mI\yTt2MZ)MQ$H?dHZn02/pq[3HDN6ϴk1Br&P=K$$(f<`H5{9l1|5*:X$w!}F Zax=ABЇ{dW_9.;rt0Gϝ$>ZrK`fj/4 #gi+Nsl @K7І1f.0 RKeinMϨ#õ#EVS1gi5:Y'*U wkW t hv>d&sRW˴cB%3FMթnb+RJ606`l SmQ'Vt"F^ 5h.G Cn)͵QG> dش ; 8 *2 RbBtZהTK:΀mƻKXZ.G3RwQf[$dP:Ra,`اݬ) ;W6/i|hǾ\ *6w`IR-qO hIbƦFǡ3k4 P'p u| tԄWR u:ڵ3ѣ*J0WE 2cD )fY:ELbB[)I:Mn0`d4;G?z\*I\ \>v~Fs9 SAA}+\m]䍄GQ}pXX؋dq ' MĒȤ\xA(dIdW$HR m ):AjabGaPXj!)D8a5^pPg@O5TG&*).ոiЧU#j"٭ Q,&:NA -ҙ#v]WS7| }䡏jOr#o6F7$ar.L%@Jq̘Q}\\޵Ĕ&zVtXL\k OʐSdC冹#tr1t$6'Ufʌ85 uqJA5 v,6oTПO$C划ha' rb rݒ3[p\gG3(=Ru9,Lay6cŒFy?9sNʍ%O@G]IȤZv$N6$AZ}! u7L0k7@ª{cB\dh;k(,^lK;DAbc 1wɅ5(Ѷ?c!Ԛ+ ZD}j;V W@Ӗ"Ŷ}:'K-koP\{ОV&~'Z&ɸb=S9,hJb=:eq۔KdFXP7$\ZrSZ݆9NJt:No& .c;\LtdHӘ;M RP(\~D 1t!q/ K 0IM-iKr mMiDmI[0Izv,Ddp=|)A@c꼔]SŤ.oA͙1ZS:ު$ >-{e\i#$_^e! zZ7`CB5j!},Ɗƻ[n&jTnW7ᙊ|K;~RНhT~Wt"ҡjc՗3Fp>r4dE ;k muhf)HY8sX"P{ܲWKRZ.. qP}IͶT wYG-t2dum8R|wpnUhPdֵbO8n{pi=8wn"hn28Մ(tøYv*a\FqSa{UߌɖEXe=ƅRgϽ}O:[ȝ<p3X $]8PCRg~mQ i֙!z467)^](DQA KiRܰ<~W>x{Z@|Q(4•ew`+Nr)nŽXwA2/0nv`pLԅG er<_ Eu`қduF(*q^Z\h\hV.4T3!V!lDj Kpr\״@ G;%m 0b&!vv{; .̑"$q$Ҥiߛu8Ħk(iqlF= 9(i12xnn|&gc5UܒKIJ G5 )@Hc,$$&).qMPHU`9JqgBQ (y ˜yݍ1JIl瘍~Su-nWc;v@*Q 氹*07+()-Z3hWO&s4y5r7O 'YY}'FTկQ g=&BED*BS-ܙҊ_^(lM;ISSJ.r<-6B]lYBS%~6\Qnp5q,O1OfF:xłv |6dQsڵ8eȢP鑇MV"qtڔY:ׯjȂmlkJ1tENDjȋ jU9-jRQ&ׄx5brؐn[ ϑ>༂j )dp,nM SDq"QWWv9Sw5i5vmi [u:  sg7KXDv.;\ nz=8`۠6 ~`m$4ǒOg Ba ?-y3ߕ. A8ss;5 ܬeMSvrE᥾BwNPM8,gYךd b%9㢝s$iRp {1m \Z˦ %d>&Ud8R|eJ4ܚy:nc] ڲ6|ڹ.pz(ѦR\_=c1ip o"!Hl붱7AT` bmESIquxI6!*,aS% CxQOuWXǜ3{DN u@B'gz&T寚,BlZ=eAJq_Q:32tM (FzJX쥯[񳻚ݯSp$8 ^͌2/]kNG;s ⫗o~XZBdAZϞ;. )&/iF]2He #,*]\ٓ@a7$eNĤG!~ne6{ٓd}@3= _:؏9xԕCw3v ӡPcy~oϞzwn::FhÑK qn}q>=5BFbs&W\x] 5g:\_Ir?oα~kFxTc-Evz٦ %@ c r#{dLru:ܩ9IVAb] FCo@1x(!:tt߇`7}%.,:ӛ1ta·⭅WZگv·;f6} _PÍL,!߱,0r_67TSY7ʳT8$Jb @FܡUwV p1d`LUߖ2v _w~r#d8M);6Pf9u3y>C0 "ve H *PaY!Ҹ;\4hOM8F ^j8kz0ΪZFm硺/5'O'OqS8m>06AX{ݣnqv#/5艻G>t`?!r0C_)\>N C(ǵo.Hq/ÿ=˛ԯ" 7ZNP0F^WY?z|Yh2d=[hYOl:d9ت|sG}7Nz_s{ZНx;5Jw3C48 FWϵvU*۬|Bi$ѨcQߧ'*j|ԩ9[wWx Ĥy"ܽUaAdqP/59XVd* <9&a;K; `ƀG:3b)>ni8h # Dcd^ 4'9ztM0:xP!!SgFL;"F2ˏtѫ(}ĵX2¬7ZJeq7Lʼn)+Šq̘03zAqT9\¤BӖOHE6xP ),"(#fԾWL?I~kc-)!(硉FU=2UmxiXxbr}:3Z& 歧bB\x82=F;%ߖKjm ʠmm=GE0_JŮGztfSxzgNf #⎸LPy_CB֭0 koKA=篅u2 ]Όv /YgBL=ӥGB@u{`mewqS9'_لG 50!BESgFӔo葫s#]ѧ cdՃު+}U<p/KUMvX$VD;?}Òeʸ_ Pks9o%=uzKa:"OV%XC'"41?ՙ1sN2M'>[G5;CC:@x1BV{t}{ŴE/2zebhz >xu#UCqG;wkxd5ٶ5AX6@<ƶFM~+q0b" V*f"3 j/ӾKgFK:Ɂi^NH"&Xb;}Fe|QOnq<)%tfSxaVs;F?'0퍪FRwuo8 xŹfFbo͌ASsQ8a: ־V^QΌrjLE73,4"|p &`YURV!&UHu)\a@AA KgF Ѿ+ 6,O!P"h ؉{\=ַSouĊrP\ΈTXL?Cm>SgF8Dj{N[JM5Z$q䈋L‹M;wVkϞ ^1b~#,%(vjS Bx=.:705a4oAhp7a=k.t;NcV8+4z,3Ng:vaFBr+\[}|p^bܒi*"k[t]΋Naϵ?*YO3ܙDQW_aay&PWã+'nZmфJ0Y [ܓSq{R\t<i)M`@nr,HB*|t.o&j= RnV]:3ZI)pZV0ߦ14voljLDtVc~^Np kSxԥ3eK,] ߩ&Ƥm-{3&.gxkPܥG:3JipZƚHDDo r-+"zOA )AÈCE'݃cLUh6كN1b$ K3> 6nᑧs#\X r$Dt!=`$9`כQ?jt^|.ƤwRnԹ "1.+LUW16Q؏rNPT#J(8m#\8~信?Rnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_JM.svgz000066400000000000000000000004711221777731700221330ustar00rootroot00000000000000(zHcountry_JM.svg?o0gci\*& t$n7߾6nU{O ׭P xB)T)5b>f7ڮmgmZ1LJ(Ntt%D8(M0%梪 EvGubH@'gR7A / 2 =+N#o/~ {!%fy9Ҝ7\sϬv+ qЅ),)|ȼ8\?[Fw=M/~WBOaX] ڶCwlnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_JO.svgz000066400000000000000000000013601221777731700221330ustar00rootroot00000000000000(zHcountry_JO.svgVmo0_a̗!5t& 4i4:Ca]R%޺$}eFs;9Н+c"IQ)$)C..EOY~]C[lߠ @AAyb:^{g@ϗEQ6{Gx)Ei5] 8udc,v,1%@W5;%(lֺbDC+-$Vsf/Mo_f0ɭ2U?H¸eo(٬=wXob2c+Zsy/ka렩zshWh};؏"{7w -2] rۿۚVVlr˭Jn=tD/^nO[+?ΑXiURZt㫍igz0DϢAj%_mPRuaw 5KT)"5j%LG~/(5[b#"vJIT05-Cf#JtW8Uچa˗SFT0lr#n|9T`jY$4{b(T=6)C[ `4 ӫ6L3m ~F4 navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_JP.svgz000066400000000000000000000004171221777731700221360ustar00rootroot00000000000000(zHcountry_JP.svguJ0!IW*Mk 8/C$,M79|OSNAQ sq=ʋ}l[=پ.75+Flv yy[<' 0x?#Pdqm4(0(TgeR-3%4!QJNT+{2#)tr+߾WZ3\` eD\DD|1(k'f-O&$Snavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KE.svgz000066400000000000000000000012531221777731700221230ustar00rootroot00000000000000(zHcountry_KE.svgTMs03؊KXȝpaP8b{A6uge9IB/+Zv󋻛 nm˦N 2^6S-W_>6w>.ЗHI00e^t)s[Usŀ mJۜa^N1"x*cy$`#0_ud]*%d-!{<Q,"`ͤLi\͔q@>.Aol<ƴQ ,ƱqvePT<"?x~ݩE8zs [`dh\G=벪R_*[^A^0;m!=dסּA2g5kz ?_z笺y9s^*s|.xXބBuy~K.\@y\:s. ŇY.Hǃ-?weW{Hͧn9G[T1Cu<`8/Ԯoۖ~dx%{NMUĴ(3E⇜^qa i0Pط wwVoޑ'O :'-lnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KG.svgz000066400000000000000000000057671221777731700221430ustar00rootroot00000000000000(zHcountry_KG.svg\ioV_Q$zZ) :L;/DjdQίs͖ -0[=n'){&uOx&Q]v5c7e]|'|ћ"Klݭ"eܝfwww0j*cX}Eϖ0w[l¼bml[gZ >KW"U9.bȄ(Gtˇ+@t曬H Ft^f=A_-c&FH4e~7y~+oՏt;ZDpǟ l-&}D?Y~[4a>d@1Ir>)ڻMČ:Z.Ǹi\ //rLiV:@m-; %|D'eJMZ^%~zˇ]'mz:/7kZ4\o6?!Mlc2I/|rAw'P&_fDPPB4)/Lt"QB{zy+m^:{b}RLzi,MU̾jsdgHuZ텲7z^$wO '2_LW\,7jg+V &iLk5雳S'^]eW}O/! : WwD*XMĦё z cr[6vn5w- w9сE7F4qh&, JЫZ#FaOZF\%zN{ei=16jL:DhP D`d dЉTK7LӮLHapB?aG-8 PKi,(s& cx3VDR#ns &SӴ$b&60gVA0^ٯnzEJ p[AbxQOg?(BB>ƼtFs)#p-G%K )  S0KBJn@ZU!U܉WCŘaThK<=niݷP"PN n(1)[i a*vYbEX0UJXIl-& $RA%8qYT?+.i&:ICi48dʅʈ,(1(#`R"6x\> dP˵“U2+QUJ# -ʪ5^Vz\X$\B--`]VUU$oЫ*U͑Ǭw(MLۤATjμ6L3d= ,ᨮᠪREɢv ID>83BtVu\g@nqӘUQXP #;I I`kYpW0r&G%D(فGM0:;Px_] $:Dc0ĝ1*+F69lԍM{;o~Fd =̎d=Au0z|'r' HOHOHO-HO!Iz #G'Žd(?~'C#?O~"OiG~2H?AD 'Jd(?QyP?_(?ғD 'Zd =z'C艶#=FO@zbHO#Gz2=ғ' ]cC>i!}S}hؗ|C{=\OW wVI3J0Ͳ SpwաEQ P!G'qu%}.8rS4Oa t1{v(r݆3(;~ 'jj>QWA4Q ӽA4Hh[jY;ݸٗ/)ZWD"cЇ1uiJ=H;cZeཌྷ$No}EYY# dAR!3@Hָ3ݵ֏\Njr h蘄﷣g3VNYP6Qܙ7׋"eϱ0y9yIZFU5 ˲D;))iz0zbuwyybs2Z̖˗'Odţ˛˓ˋ:=MVz1Z旻v1z}{~vjl˳F˿F#|>{ynugg6d?|~Y-Vv٬JSdSJgƝ9wwo7wbK1 #7ļ[@Ӯ5[47Oiw4fK];]Ng-<_j~ފ1\_`d54ڡS#Di٫V>9˻i]˓qn|=L߾‰ic_vzņY>Izx7>iozzy9j/VS!tN-Aի=j T]^/VӛnݩwWEտu̎LS=f:_y'[.f^YoB쟟}xy`n`j黛5w~\r *lwe!_Ӂ@3״t>]Oⲅ@R=8~np{{s}u}TlsqyF@9<@9Ie mBh{[14{3 =H%_j$EꭜCCABK@zPJf{c^ { z+>IGB@SzZwfUS+>Usr]hTNPD}`#܍klX﨓KOda"_xN1 ̷Kquuf>kxNC&h@ 8a7Sqq66لv!YB La71xPrũbukdߛ1oLEA0D) (]) A\pH&Dv%ذ1T#D@ _p\W!D(BCCcO T)ƒ_ҽ(Ai]1K_QAk*Im&BF]0{XOU‘/Qq"#"2h]RwĂX/"C l ǖ1݋pU|R HpQX݈%>S؈/tQaHOUVB\>rI7R`~*|BUdr r ȱmL&dF:C7yG|PE>̬0h $S41^8Yc Hlp*tL#ҁ1Q+G4LS˹KP@%1}wR}񃿰]uT:%Gv(QA h{ѐ Иh{*aZ;{EapAه^xAYmE+U|%:D!fH~#oC`'B3?F29Tي^[='%E/5g"}^Of ?=c!>[|$ֹzMj *z LQQ<p/#bы,!PE?l.*qn\ЃKP%GJr(&rn Y̦ޭ%˫{+:[|zfZM?,o[n!dɎc: -z+GG%d>>4 L5Sl%'7yI3Qj>N< X+hR9PnF͡>*`%^ow! Q@NÇZ7b@=@ r'd{h!p9n-W7=mGJ'kK6Ιƥ ohl,dqO1Ҁ #PA􊈐6Nycqp9cÂtQo2et֭}\~"G9oS" ɕO6ww`y?y4$@ ѕBRàt:>#akNZNgD9( Lz108%)'$nD!߁;b<%6'${ǓěaF"7a'{a^|0fR n@l#Ag|nz[?^ݥn/8$1v&՚F}P$.~ 87DL&`ɂCZ rmb/ Fae`yw P" Ia0b$LM(|NBJ7!H%8>"͐tfYڰӾAA#HA!L|}d>T!3*uNj" jR0Xt;;;;<my8m>q1sbpBesNt6ՇQq+|1{uR:dT٨<'D<"s|lh ³}^>q8r>g1b┇ECIa|v a|.Y|~a[7f䎶wc{7[=uXC}H ы,\"-{x"-s-Ҳ<п"-'|.~"-jŸH}虵"-Gy6j[/ڃm4 MEF`:FT ߏo*WnH]k_ȑ!|m@đ#Eu:,^9ZjsX_$cpɖ(ŤS*#I-a]$1RPgTYh#.}!/E_H52~ڦ,艉ݦVWiGbRF둕C`/  C,` @$LЋESVeE\rPĐWr1j-EExb*PV6>wHx;W\HP#X]d`ޫO>% 7<_lvM&*2k}0}P*Nl-lc&c% M (;L`N 6`hO[pam,%::iLNWa- **&!*Q]QLDkP\mq^L,a@>=6OIsTaaPl -@C"I_B]0nL4ʀzФG<\3ցy #z$T+*YD}$;#H)_ |%J E0 qv i6@&uFnFu Mtґ6!lbh)uw%;R]7N߭}s=5C;'+X[e@SȽg)0&3F$DGc%(WkSA?ϭ` yS@'Ux/[n]'SHC_05`D k Q7t[p"'H8jd9cFsU]-cPN0HbH́ţx!q9HbpCPQ]lI* >"%;+]apn".2+TxV@w+&~/d%e\ntKk.sI3pB: ``i'J;s!Ipr@#n],CY]GX/*T`$ܢuV$ `,kmC8`8v)7$f,tCd0}>O -IꙬw5hRn۪lZUNP0mlN)`@]1po~|*b 1.j-;$/\p8-t=^sՆ֤E+Rj܄_ YXY! Kc 49PI,bD?9abTP&X#fHMV`9"_@'U("Q_O4Re ҁ7`)HA>)9HZ 7U8찧!'Ҁp`bjJ; CTLdg!I~DԂTyF-tO+-]ӂOu7^-cTĭwKUtؽ>$eJݜKbJb`f_ߓ94bnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KI.svgz000066400000000000000000000067421221777731700221370ustar00rootroot00000000000000(zHcountry_KI.svg[ms_9@in]XPD@*'I*tK:0ӳ{;e ʀAޙ~~ٛOzv-Eޜ^]lΏ> /j>Zl~_>~Ewy}q8XWmŋ3W߬ZZ}X/WPJ֜mb;^lg݋7'݇J ?0jt]nnfVl-Q?]BX*:z:hamӣE /Οnn"8;Z`]xȃݪ>:o˓k3z}ퟍs J{L&/wG9II qgCǴkcV#p:i_'=N^env9lK3s۶OsF޳-mmۭ1ֶCw}wrsNqxܳg3x,e27Z~JHKfGj5ٱZ{=7mQ46$Y*lGʶ(mjU5[_VqF[i-FH߷zegyof;wqE|]EEުݷA3ФK(6rWw9+;BYIw!m`Ҷ[5*%FUJmUJFiK McK"vK7MJɨQe[6rLMc;g.x[)P FRXlGv]ȩ>JGʶ(U5*$m(U؎ mŗQx5jT TWHo~e[IiԨ"OV1FX5WU~<7M3x 4g)ە3ͼ4.^F%k$UHiRL;%*Bh&wJ:'_mlj]9%“+WJޅАX{2~~b{nړĶޥ:!%d~<=٠=4c֞,4==4ɾ[hI)[ 7cY +|D>J mIG e[a6JMccҤWF@e[q946k-NOFyʶ6r妱EȨQee[QJɨQQh6YJfKIngx9<xN97UvG<T`(aaC3v9$9aXdxA,6YJr*Ȇ|C d˥%9Su22K.,F5 U2#E=zx1NE{8ku֠|,ܞ1R%[#w8^!::PXNȋM C"#*sYX x".Zb9a4ܐmHf,RT%ץ@$^ `uu~@UhNvP'"-O4navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KM.svgz000066400000000000000000000015671221777731700221430ustar00rootroot00000000000000'zHcountry_KM.svgXn8+8M HߤT+EI}M;ƢmdHlKʒv`\D^<ܣ IguWeaYZTN4S__t'g'F ӷ3pXU= >!~86p!C#sjEnfUs z0=a$[`s"[Yŗ GQ ZC-yffQLәIͲ@eJ>f2L]򺿯?navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KP.svgz000066400000000000000000000011471221777731700221400ustar00rootroot00000000000000(zHcountry_KP.svgMo@Hr)R~N^@go ׎4*REP^3^^6.ۺkss**ןv(ڲh6W]$z= bwfՂ`!!oӪ~bbWZ`j=: 2WMQF}aw}*R7u [4)j8 ğ&k= !5VgsN0Y*$Gg`?RZ%oLFn][ʧcs(.~U^Whtz˔n }p:ynf_u>ȅtmnS LfIg[6]rSaჩ:4#EL>z"@.1xc؄,6XDl,2=;z3.BDBkD0RXKF,Tpd`eDdm$.hΛ]# C! ; CF:$Q8tD iQ`ϿeE.Lgo \JLz enavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KR.svgz000066400000000000000000000007331221777731700221420ustar00rootroot00000000000000(zHcountry_KR.svgTMo@WL&K^uԏK^>TѲ5`Tzf}샍앮 6qT 7W/}>CL&1d<͌Us|ɝ}U*˟3c֔6MhES0m"V7WTRMw =mq>:ŁoQ\_nsaO5{l|6>Of"ƃ91%@c XEy<"N?mpnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KW.svgz000066400000000000000000000003271221777731700221460ustar00rootroot00000000000000(zHcountry_KW.svgM0Fb2n`'T@Om--+b{_(A[1MA޴z1*QB Q9'>Ol/YFD,^ߜ 1რq,cŸ#AA![kۖ[do~kYR:N6. 0-Db5navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KY.svgz000066400000000000000000000533071221777731700221560ustar00rootroot00000000000000'zHcountry_KY.svg}k\וlx)gZ $_0Zdḃ@-۳>EY,ʭ}v{yg_^ݻ/߾߻GWwo}͋u{tͳWo}G|}}uxww{_^|٣/z_?o_?~kgO?^߾{w^߽GKKؿ{鱧O=={z(_Gu.<=OoQ p{ߖɴ so~Ww{s㟞}ʱ~_^ݾ翻wo^߾ݿt{p_?ǯ=os Ǒ__}v{~6 [i^@'7b->}޾h?v"~5l_|}_|pk'ޤgO_C{իG]=x tLj|^z?o L峻%a+N?{zo?Mb2H+`{/cǟ;V^^ ~<Ch}Hr{"f>ϧ9F3x(_?{rǻ7o=c}bdS7wؐ'_~ o_y{7Ax4;6wHy5?4P|#ا 4Tx|yO>jE/F!S wZ-x@>߇X\]aU\wȣ1 >2^71m,qG뾖g mW*]b`Hi\q#(s: RA[!U JW}U\iW&w}Յ}+qGUu߱^§AxgO| GXk{WK+nx%zBh;,ֺEnvUO/P,y8); sO/ΧO=8JG=8vUol ;\7}Hy_{6\_øjXQOH 5Oe{(YjvCNsy~.)mhiRŽ\O|[ֻ]*ֱoէ+fo WzE^ @%o@NL l@K)Vkl FJLy*oi0< F^=~O={6au9$"X8Ì}m!t M.w\*sl1[, oFAi u=;1`޵u.h:Z`+m_1= ]w`Hpc0I aG}\aW*J@+ b`/Y3 a,o Z,Pnx\X ̓]t[ Ghor4 4}a}NXAh#e+c{P[Na/bBP@aͺ$sӨZ?aXZ^Iz m`BPSN!:2=v1!*@p_ 챒 Qބ lT\%h~PL$)6<Cj WX!`δ/7(0`<X0e֐JXPd)i&Aq1:D=GZ+_u@,XUI=hҜGdtc + VF$PLZ ďr1Jd= F2j "^X»3C;KC{3c8hX`F@RJOj@bp;!BsvಉnroѰa=Tjm[O7GXZIԎℏ4@w,i\907N0< 'e2}W 1 % x1߆2';Ǖ4ZƸ[|e{9Ξ`xsL^#_CA6CAF2rFʿ$~bɡ@طiWv@X VCJ MP')Anzvނy:<q^ ko8\7X!3Xdq@ ꟉlZ `]Zk+ x;ՕKB,S 5Q^6+!(/j5q@;]^XJ29΃!#=2 :f/~G 2 T " K1O@7;(|4\X-,~%s&KO,! `ɐ~v\ ,1~}2٪c!na#LPtl;8@ xv|ZdAN5D~DCHJ܃Sudp"g"f~8%)R*v0F 4u,?;YaMAs Vztk`r3 [I`\KĔgu`'/;a'`kASVn{34.;0^QE0>;\]\l :Cpf@P( Clx ص䡩Uw@I!1;dw Lܰ+(]de}ڡ# p+&6 ?&$ЪhRM2 7 8: v*Dt%ڂ6r,C_)Aa{e, SiX`Y"cnY4 [:L (,-v Ye'4$flʇ8yů8}vS=zoqؾXE n,66$)89'40@r>*]v>/o}|GGe^ ;5c\JEBýGȯ7EYKaե˲ ;l5m<}rAʅfwld"$-Ȝ`QU6 &詎/<[ j_dyaXq :&$/)<3 ^tAadׁ0@dc$T3aw_x 6 *WGAr lhO'm8 zP=%xඎ윚 zZ1ڥ).a뵅gjVC8PM"x=tƚZ*"bɟ+-:G0#cJ::/?O R1s` ~4Sm<+k9 yJ_5I\TN7W.Ȟbַ { R!KO4!Z,,h|9] }7kD$+a;F b^ X3  :  %.q.RxK eH"K䱆a|\Xz|0cҩxxii:^_xbZYP5-Z,LA_E?A%$4י'yTk2 y@ X #t!#hDOzm8T?9= +PGB4$\+`Yar[ygزyaܧ s#b@2]ZxD5tHdZBRg{fyGktفKzi(;\:F3:傃E⫐aw0-}[߸I9H1/FyXAgXD=+9a R8@VCO;p|{_|561"FH>>>0GmWR1i/J \e^r%\9R0̱C1v!_)JAPf'q+h@^-XEd +&QpĸS1O B!xǩ}-ݏxb!> K.b4X1 + + vU_ ~[qYd&(y7 Ja︈c arfnW&g<{h[mOl}2NbPNFxEr )>  r\WĐ_SS,.6TJ}MI|bxxEaC| JtӢy;`ь=mJa\zyKO+AK7.co?4b~Er+!>`yŹJyq@g=浴1䃝D|_2NL/P<(¹?tT빐M>ŶLnļ6pKE0 xE&1 #$O;% f1BY-?vP=8(F`xɇT/;(!>`yeWmi[J}[.5ax?ڍH8^}V,cO,C%Se5W T8i O5jW|{ҙ3P4N\{pxV80dRd.DC];EoV_i0"//8j.E񙐜cy,m}*'-6F茏LU@܇h{R U ?X\ɫ'&d?#IkmLL0g FiZ c,ڇ+GEXY#V,[[瀛3VP39ӰA%MxCNWf*z&PVE^#SI>M/9n6zLY`E oҧ,̺ /zEbZ]IVFvw,\3 36dJ0И;uyu(+V^ }wy[9kߜMl;?mK.ΰŌBH7ηS>rx@ύL;%ɲNl=2^ŌE]&9u8iN@Ǜ \E&3Oa(/BY˔N7gUj=d8 r S3M- }8a3ڵ7xu$ef08di WJg훳i\ضۖ}e['8᎙yO{f*?wblUV4V+3?%P aWx$kNᮘ ɇs3"Jy&1OI4$1_id`<<wD=f`&0q(YN4^yLFr&HP' x ڀ:N46&`S}NW!g7NLgޖ u@&D+D/}''i_]dѡW/KvK~&*]9iNrd܄a|se5evK4qS?…-0?Xv,n@v#S5tE;|3FZyI+ X!1)*ˮ~G%~w4b]/`둗aT2l)=)ϭ-̼cS3`cU]La]4(WƆ|= wc$<,u= ͻEpta?8I.)@}fA*{^)L^:紈kQ3'󥰇Ǻ!*mtG_``u}#fԌ/PiJo2cFkrqy o6m 4CuJǠܣ2P+\߀kԍ+AZ$Q$jH34gK>@Ki:dO/g\LMS@L? CX kasɩ҇$Z.Sgm 5bU0wa~A(g 20'4yҼ9# ||| .f]y60t;NNgUٓ.w3r :+sn:,FUbfE33jϜ]~3C b msIgۙO Z] E.t/ÅnF,-VR7RӲLHrClYrjD"Lv׬Ux7>%23X`eymjB>. 8L2'ݕ fL 0hMɻ҃Z-f:NGD,v S1ピ8+ҳʴd&gptpmLu< [?]}Ib:$X,ׅw(&츮9'e$Xȑmt # 2"lTgƔZCDɩb|Q;oQ3z/m$%?|W ˅0q22Qg`>)#&9c:‚+."r gQQ> J/wryD*yϩi@\KgDQSv^sULemG(:2R*Ƃ]FgIZa[V+JVzGħs*%o*k'M ,,=[JCw*+4&wLd\[vOF9E:yu>)\ѯ`VՔzDm@0AP,|x)g+D2z>Ց Vd+Ie1zLV ctaUWF1:YՋez$idIIQsjx1!fHJ Ћ6v{hV!g=wϏc)WSoₘ1>C BAd1XS$UIfX w4^#&@MJkV'="! S`KzcE L!˜2y:l ̱Va*`@4h*-X<%ku̸,0{녨 7*e2Zbt70z8 s?:Hw<w1 t5 VqAAU@!Le `yTQ<_EX2)xFcnUL!3j/X)Z ` =ݍD%@mU5T /Um[^±VW5Ik8as= LϠB9΅;edћ/e} +yJrVfҀXKGE,Q[EI&DL4;,ȨDϞ=o%q"SQ[KhD!Uy 8?(Jz=ڞBK1HW1rhPԯ\ӵUTF } _uGRhFZHZIyQs1ހ.ڕh(Dz ̩j5'A K2n1LQBY4K2KLa1 ]m!K PbTc;jqhVւo" cWW|޾7޾}qv=MS ˇGv^!o]#}1<_e*EtP3dM5׀O0|w/<AlD. ?7"fŸ+^'0! iekdrH9*X.]W { LC,hd}\PpØ:uZd:@xģ N,~F7'_so_ިͳ',I`9 XmVvRcUǕ_֞7c;ۅ1b{A/u#TlOFfjcg;!idՇIQ4-+b UsmVqAuTʎ83;NMP9dXJ43.o`=_r:edV&H?)g_Z8Ux0ӭ%ɫ%!$Py%YxS:Z463v$> SxǂLOpL=PXA)EO>jMmLb#=F{z!L]}#c֜yj`@gԞ^/ ?:-S{zUr N=n6t6gK\(wgX/r hZe#O!EMg[O'[N7Aw gW#:.^kPtF7pu2oԀ,T2A6Kz&S=0}ƴ8SO;W1 s{`ڿOx"'&&8 3c\ {ԝvhE?5W@5W5)`ЁQP{}W^d?}"a[1"jW:QuC7Xר#>'.1 ?48S=BǃyQ%^r7bqB9f&[Dn75;0 tewz \!w^iZ1 ѫe+h#KI]jgj!G;y`px!3ƺP:Gil^FPZ=[ǛF{֯ff-P+}acK7Ƃ .qnWp '#DQe90GN4nxCYVs"͛KU\D$mWK' æ</=x@<0o/NUc;0H#iL<P;=6L|iq*R6Ǻ3d`1+l,=^?1zL,},+#Y67];F08Oo3UBu]+ zueS>V&[!B8YgF8Oޑ=KL7i޷G*;a./\d /?ɲjf.mf,zTϐI auھVzEZJ+'tz+9fz8t5 ]ajmcI^8 y$Vepg`q02._4w#drX/<Z^u^g9]'{k]T`[dfaJf8v)°'76 Jѓ7/VzحSʛ7\%ĘLSt 8ffL.w5"7gYa71ZDdEf$/_&'ysT=uqzF]ʖ6Hcf`p! p4>vc.buerˀN|6Y~b?Sf6&^Z;惜€Еe׮6ﳯ$Q,NGuq?c;:OnY৐V􊾏Zkjf {#N7g߸caμDv*'b) *sw瞶=r*Sіˌ'sy}4KÆm2 !16g)e5R{R@A@ 氌|]v*Wو.8u0>0WGYcTs-yDr G{DNAxMU!šm^?m6zj|ژYBZ&WjfG+vkz3;xqlqrLOxݜ˓Bt:--jv%5p(K-X> IE1cl9< :[>l(tرk)˶=^sfbC᝶=bT+jѱ|\i.WvD|fkn{ki#@`)o#Lv}nz/=K) ~l\&Z JmHCB XDnӎ2=|Q椉uH Z>y3gE@&N:O|}OF_)aǼ܆yGsAxܮgA*ǦFΨUnPKaW.>$8<"VL9(&K(;j2bP`W!!ٿ}X8!wbQ!ȩf@LENym>,nO7otXxFe_շ2)fm$Ȗt#6:.L'H} (6:'r}+2Aic.";ȢU(Oi ɔj{C>t>l(3eFeɡz)\R0552ֺ dy)JK>I~Ğ;ʂX)L5=]e%FF[30e4o2>qen)1~>CIf2*]`v,e6,5W3WiβE]ػ\=d:qҠк%i%?g&IV>Z, vd9)sbko@)/ wG yOBha)F3(dRHqFaΛ,|X1!~ƹ2+g +'0& U8ɨ3r>l%Ȥv-u~*]fEQFUzVF&>i@5r-xj)h܊qL2xèky+-KW1~&`Bx7J{ *+T* qJn,Q1f;avPl&+ڼ%Ru͆jĐE:]H7=|>`5&u5z sx,\s}Z(: &4 myY2਄d꒫, va!{Pe[?i* y$p'1n"orˤNڇYi [8Ja ٢FQn_Qd))6%pNExt2qׇ;4)E4.}(wǐ W+ 22- KZ1?'p , X!,6E/H(kaG !_W2u\WwZ~ y3#HcލpVE^Yh]ukFK^k">UJL~^|]O{~WqJϏ,k M/Yd$BbI^$=*wYִOU#FXLƿ-@._ $<9{PI3U:&Ծ@"D|)qRC`Pw %>?TSE D%SEzD|{ڟc'Ţpe,cquAeRS0 2N0G,_` YU'1.jIm t-(U+RJ$梊ӷYNw>و :jzu?q? hNWa7*=g%rdTAykQɼ 0GQjr(6rhAd]bt` vN'ʱoA̝"kBRt*2U>cF?K-d5\Sk>j({ͪ/c*YHӊoa=eųȃe(BVqoTl sgf֦BU"7l,56H#N]IM$sbaUᭅEK#_|A,.5T&z1ѷD^`|:[5S\{W ΕefX.dY@hkBki- RaLC.#V#/y֔&on /s}ޠȫG_ 3/25K+i#Nsտ,Z,r,yk|Lu&ZS{5 ,g]]"2G{ «l9X1s0Tjo=ѷeK] *P~#ݬoLx:Zog›@ھ{!DN7qAs(PlԝR$S.J(4bsC~֠W,as`zN+$c sMtA`jo ׼LQ 6X` /"j(i33RuИy,ET۱5D!Ž 2>wƄoY ܄ Au\ zBo0`S01Z"LŠ5j(vRyc=P @q0fP լc5DP_ͻ BV&8Z^ q4jyȂ7JjLA&0^dTkEIU]NO7!@d /} ്~V@l]AhQyۤk1Y}cFp>3WI6޵lj*k&7=.ʀ&X9lDC`dQsqyM `"W =844v[C.9pLď`Ztj~3C1;ͣ-IJ N)ɠZ.WYְC,ͧ9A4[y? :aGHX o Z<4$Xej!ROBz"5jzoC&ƼaոAU'`96k Н+#S&A"Xht E4+Z4؁WjQL0G\VB%gS')vALn@mvSXZ6"Q3" hq7:Z<{ B8_ y0re~P"ްex:M%zJ:sֳ[`a"%wc Iؼ԰}0%?xӭaMP q=;e>Lc AƄBH UU`.LHYG lL͐O3!;wa21I0.*Х B<6枺@^d PMa#DT}gl~IcՅc;.< o+Ð,ATþZ2NB &Vc0l;- riraj8AO/*5հ1Pf$DBJz6 Ηݠ0:]d&0 ̜=L7d @WU* gN`|`Xi`XÞ%N rIA.,n^"QҲ7M;6"|:>*0ӧ{x2kD?&ŃJdϫuAʒ[` eD׆Nh^U!fd=,"hOiƆE m:|D+^Z)NQD%hr%IjlJ2vֵɍK:D"[(Q sVdgÄBS.mURІ0*}uH[ikE-.m,xK }fs }˛ٜ~Y OTXs}hȦX@!9e  U@t ^`0b=8CϡDKXa"QtAsmXR +1a;O\m-:Hƿ}f(bJG㹪"ZuLl5J`,ɿjʠl0wJ&h@# $H]iD\U 7 S3Ш. Yj`Cl 2UvEdtFt1,Pp ,?zٷ ?V(ǃef4/sKz]mc4@)K! nt_ PBτ\}YtVl撣 4THi?No"2|Mn-s?Ftt%ѫ0.lJ%A=l>ۤ^U V8|В$$(X0ueO1\4d+Ev`f:XGvNPgcy2J6K(ܚ4s哜㤹6Kj&˛7g&R(Z'$`逑ޢؐj09WU,<(M"Z` B16`L2,6xturnUQtX^sU0V q~OV# `Ǖ}`j9M}0Gխ,"T5e]ya< H0Y;Vr?|9XmdBc93(ۢa=viS`yEPrq[rWu%iЉ3HK}{l :Ӹs*NDyn +nDڣ-8aL]9Ž= pbr1q :gY!(%3AW}(۵vgVͰZwf;<ՆfJǁΑUE}R fͬPXUQ:<|x^KA?Rqs>4V8U +v^t2c6N 'z! lGDT4Tm``؏6N xB==(^~D(1f$n, M&BVY(E.]*7T^Qu?HIڜwKmT>jT.۠V,Yg gDx905v` V'%)G#:ĂV+ꆱ 2{DFZlWzJQc7J׻?0TL3<}Sisa2K ݚWP-O]{l.)|V zal#ߝ"2Q"j2S.TORvd=-и҈ R5RCGWQT%ue;,eR,ӯ'(3WE1}=*j /}{Elg[BӑŚ)21_!WA =|8u!%#z̨ ę-H_lcOSWr4,Rl@S7xLZ ^w웳mY?)mLk 嚊|CJ5gLy\2F&#+ծa GZ[,ffEs)yp˫ [U D,Xɮ[dcMX3+IaߍQǥ hRFSjorL9cj dp6x Tf$Pl>A ' {Ysd$dg{]ƨ2/`mpCIϿuidi1 b#ēA)N%VBdCC`!j** =g`NPdcL$%@U Yh9|0 B0Vd,Py 0AEdަĺ $" HB@1z ,h[ɏ38bpEXCOe׷ پ*-jq(:;f<'hj('c>n G=9JJVnX#Eԕ1\ S%eK4"$@#Ollu#Ƹ]VY-c\cg"k惥Eh|m1b0^0m=-ZA1ׁ ؈jkJE]PEb d{I6A 4\h/:(fm֩GMsBrgb܃(`;>x}pI0RK$ddF9{cx E0k̖ǨbQoxېyd)0Φ\}ɦ)$5.8rK8Fvɤ(fB ,AH"7ƛC(yth@KhzH6:Ci.t@a7 Z 13(0f7A"=F] z3A>n\`_Uͮ90:=hQ] v-ESnv\#F nO)vsN] p8[ƫa9]-H$4'x jBEUhcuZBhi]UVsS5Gqݮ.EsX l $A;Sđ,̙R0H 922:Fދ:x}Q^YƱKG֢GCPς{#) 7#jA0o9i%c!PӸYE:!JM erhmT>zRP2..a^&9j{ X ԴKv/Mt(S.+v>J]^!3ODY,X=K>].1PnHPpl7;5 Ϭ4*tDפt1(kNT!hAEj\TH}SXh*am 5:C<FO,"lBh+\6cÆL%ߖ<kPlnρ&*0jն>Psm9P:w õ9s`WOSYԃNxdx V0476C.`ڠuALj LZ'0Ή$E +6vՀ2eJF+9AR1Σf[ gݨZ&bs[.n .Fㄍf{ u0 m,DNXl+T0IfcԦS9O*fbS4i '[1WPL3jK.Nӥ# X?HPhDǼՙϺP S+)07j) %x6w"3Lw$ .\/ 2S~*1wo_䏷^޾?}}ŗOxػ_Nx#o<{[׼}=/o^\~ɫw_<'_>{Gd<6緯_o~ÛoBI5 L0졶IL1%_>~G8J7navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_KZ.svgz000066400000000000000000000177641221777731700221660ustar00rootroot00000000000000(zHcountry_KZ.svg՝ko[וWp/-#?ryuv~hv><;\=9:׿yozu^^tjGǯ_7 f3yt|r;[.V/Vc?nzusz9_.G^= e' cCX0bqr}櫽GGsv#ިG?]wn~_ֿnqg<.Wo 7rκwqybut9; sr2|u\Lf_Ϟ?Ox. -M?]M1'6;)}j?9z"vۙ^_Z}zu9{t ==aG}s|e9 f]טw{|~zoV7?^~7:__G_3Tl)!ncF>7\>6_O񓣣oɏϖЊ_~;ZxÝ7/WIǴ[S:hgz?i>7xoLΤ8lbb?V)Cz{KwQO¡z#r߿u~Z_]O/5K?Vߞ^]oWo~rU?Na7ϯ^kWOׯVoWW/tS+cK5MԒ^CpS!e|*]\ty=NHۥnv񟳣L;뺿煟{-~f|?4͗ЧRcHs6BoH>L% 4 mjUSK#2Գ<T[cǚs>9fMbv0l]Jy S*!O㰭jbQ;g ɥbә_sޢh9s֙Q ^+ﲏ.kFOKSϡ: wGY\AtiƳbE ޕXfL@cTŋ&'/af]Ϙ P a̷Ǝ0M(cFIh0*!=v0pBUSjк-1szߍc)0oHmΔm:\I##[HwTġH^Èy S)3J_8B6 "m)Tb^P&; La[14-yAMرA[F 8,,0^C3W>gإd2by<QAFZLH :ՐEs)o\by%bgXN1 $fF);⠖ɷv<+h9r-pXy!dtcVrޣvd:Qx0N]*z&3g+^n-adےnꂒQu{,1@*vQ /p5in~DإA2;'>4u7#N" bAe Qƕ:[a@ [@V''9 ǃ BEs2 J3XÂl{H53`4Pk MB(m08Ҳ5Vy6'2MDq6h<բW|!>G30Cj-D \: t,-λZ觤L-T./l9&o~'Y?Hz]2#V-hq+2Pb 5+!``* iaptX7e.!v$,MQ @(6-%{HaDE ˪IMf&y?2˷fD1αQ9O|萦izk'"v"5Hh8N830y,M0V|u};}5@ \.9'r6!J#Uyn-`#1 z~,ⴤ(P9B@Bv)"Z!߅6f.8ġ 1l@q@eǼN! 4À`hW,%م(HHpH ?0b8G2\ږ m ĈZh*# Jo`|@:ٕ\wß'$  bbQi++t`8 69K-(Ĩ%؃~AgdFǴDRro_'ۮW |܄CxeuYňf_L5PY(ql2%HmeM2uYd QmAք9CVVdWsIh]!ca-YX 3b ԡ|F>D;cNڋ WfB ouL@FPE$vH؁6SrP܇ 5 1L,y)ᗛaGmU G4+ʓQ8)].} pM yeH E4 sn𽙼8MZ4ȭp5^4Zf\JvKb Ep}#K񢲹bJPԉ ,C3D+xEi*wl>]>$tX̵[48> ~{r&7w,DxCV2J-nxl/*[,]ƿ(ah#v`_ _LGCŐJC'7ʍ@ C;rg|Av|q4SH1 }2dݱ|]~s*=O׫zzq1ffbţ{ThR$ٍۭٔק7Njd$DNzϞ-_-)wٓxwh/N??vm]/n LmyS6^ݍSl8ؿt$_pۋOw|˷9=vm쾇"*rK-鶃m{Wp43^X=Z:;u?m Z|zOvd啤X}?XAUIhUÔgVZ.۸I`fdG} 3mz~VW*XGU(&{BDS?Z5*ϰB&6Y"\QI0,3S͒YΓe8m<+Thj݇nS<9ZWj LJ'U un >,>N6I3<;4Gc  5֪J[UO1>h%s$M]a]͂)@Cct 0Ҧ /INNä3ꌼz-tU}jHMǧf*j,SP0=0#UcPq$~JU6MIOEASdhcnQ9,m&VhMe.ONF]8hW#hfW7xo6$5fR2˨Hmi &Y'Ff3Ȯvh؝L%wT-j?V(0z}٘k6ۄ똲qbQo˘rҹ]VɐJ>jgpe :6u*2LSkb&.A "D:|,Ҫ1@{5sl{׌MձXJ٢5&هZb9s\ *"Y8SC4.oVISD ňBkET=X:4H ECN b#"F"D Y;ufj-nl]@u OdH*am˚%UPkCNjCڑ[n.y2#əjK&oB=#< 85l9.ALb69j<TORNI:T9jMcXI ^n1f0`k3JT'L9$t;fHe5$VSE:8 dLIrNz1%Q,*][m P:d8"`˶9N RYW+3 TINƐe8g::.9ƴ1RtC\FXpn"؂$0 J-Nz.e5 7 )ZX9qf~Ku^@,#O&?eNSdVtlBY 3:@LtWh{Pqp,&?2SUw8 (6_PXw݈#u,Lm{4 +!#ЉBp6MAkfQ;EU! M5&f4˜'j^Iw\=cPwvrMZ$"~24p s Ԅ5|kk%h*Z烦zߚ.U߇&[Lt @)5be `BRJʶtNj8 ~aRP@΢t>>Sjj sH8(6TIma{QQ~t2Ep.] '`0\Uh䵵rt09ٶK&0ԥHh/j8-֤[+whz5[`?1g@Xe pD gY.+ʦ>E^5?H;1*`~]<4]f6N쩑}דsVD{Zܡ Se < B&tR)Bd]pRX]įIa>M(,$f"9t)UOI#:áQ'NvCj~A+c5nt_%]Nh#;fIN\y^\2E2PԵr"%*AJ.ni25-[2VN1Xǒ2Xk8yL c Ymƪ%8}v򎑺֕`4/Nu (FCe]ꬋʖl#ڌMew$@!;fE Ƀ[F%_eKH' [!hfmX4=o[4ӕK5ݸuN1RI~6G ڐY ^Og݆qFV YUiVptrp\MQlSIԌ = fةQ-rG~vrx HGEAw!1z uA,ju>nqn vy~4|?71V\}{Vκ$R=@4l^Y&Еq+|kY#n*ktD7-VeEm0L1-3E' byBF&@BT.)n}YZ-­aE$Gg%#$[mͨߩ2urZtݢ-G GM{Xӳ@jֱulFk.X'RfiFC)Eeݹ*O\|9Gk|:݁R ُU<˖1"( GXH)yV<pC M(zՀ9%MFڶaPt)y`SrgPV(Q>랏^10ܖ(ڣ , }&E GR]-V#4'-jǙIEͥdF ]KKPۧ.r1xDPqE5-|MU]uKyT5Vuc1zk(Yv&oW4Gq~sm C.Yb7D x]Pua}e*Ǯ[%HV0f *ZW9(8d4`LkA]J1 C8 WyVۮm7)-0dH4Gill x4@Uo0PUSЂ2rPڡeo ) 1A=jA2u"/O &oywDS aԿԊؚoJ3|©a"2ln: #7O079fbX]_IFw" xQoD}+˔q)T=ˤE4j*m<l*2aZ5&!RqCvQẋ0|Vբ%"NQ 6ֵUspAպ MA5cT*t줄U匸625Jj+N.JnK Ƭ/iMҘB`xTu5n RfVo кX;jf!2rOi}2p$EZ^>%oNsU/_pTksZ_+e*Ehҽ8F%1I0Ck&B;vTS&Y[MKX~K/U G;RjDяN4k}*'!CNoXm1XuFt\x2:liT(ƌ|G-#Vj8f@èEIvT fIѦ F=d\8#Tgr:JY[TQTKr1D$ V 5*B/+V jUHTQVuo8;4ac+ %](JwۭP~޿>d;(܊Zuy:ˇ^:li*Fu$IlU>U zkEBERq8,ٌ:I'ug}=9b]71+<,EgfrQo b4Q$j 4D"@/Zcރn,,`xv-?p_pD 2( U-b7 v\Ak^@xD FeF 64VK(~ލ )~%QG45Wp*m_hᣎF@@/azMG~e>h֓N8DG+uZ=}Z2/zq0r ``DG*z7ّ6>bZ<9;{kP} }ğq{ox qHH@yox cM&;$W˧܇=4l{h~OP-Bi݉J$'PiYAz 'abT9~7[_//V݌+-!z}vBٍ3kOe =-xw[X=L|sxw?+Ζ[\Oݿlp@z@Х}Iq@XgrCc ҇MH? ¾WE8-\| 'fnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LA.svgz000066400000000000000000000003201221777731700221120ustar00rootroot00000000000000(zHcountry_LA.svguA0ὧhƵ!0zRҤ4no 1'閇!v!aUTBo8+=4ӬH*0Pcb9hIz#BQh5s:/x Rp"ϋ?_Ұ5-쯮xw\{nħR BYxzDA0navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LB.svgz000066400000000000000000000252761221777731700221340ustar00rootroot00000000000000(zHcountry_LB.svg}[o\Gv Rr L2@@-gdR )˞_RbI_u[U?Nj_w..\^on~zw_?oWO/O.W7o|]7p5(燏jwsfqM7ͯ{?~篯[>ܼn|joBzkxկxDDBos#wh;=ӛÏ3ZzwW??]]loo]bHIؾaFtS)<}xwk??opٛ1 şOOǿ|ſ?>_?˟ע3zwW?an[7?n!] ?__?]lpgL[lWO|Ӟ{ؘo<\vOoÆm BylIȋ$7..(<# w5jX ^Z>u?Z[]s\Qϩ,'4F}4v+Ë0 㮎Y^Ŵ⇋.w@.6̭\0+ жW]atRװ-du7RZ guɻQ%`yJ#[O-͌Z v!%d?c7KU?uzKN)`8jhUcJ6 s(7& M}.awb6uaDc3x.YFAe%.jac0q;0V 8LeX-bKu&mL/a ǘyîVPc ۆ( `5VZRiˡ6c5xiX/E1t2ukFtԹ i?u3f0Z[˸GIzbԑK.t}qx6&QT3qu75R6TO֟390sbz nk}ZLsLqc>ۮ6ZS:c>J>,\q=k{0B_ܓ\]6).J%0zYFfX-Hb9zl_̹/'6 !b BlT X`eq E\N^ !ji-щ0Wڜ>D^`"Y|; b3L7c6`.0S1! +iİ!1 Aw+BX0 =cCR`"T 01q8HӚR~ l :;czDcmA A% GSh8w&eHI4s6`P`gGSp@ 8w,l䧔rRcX6 |X:pouIAy4ayXoG^gcTUg#ԀJ|V%,;6:)WoY 6a'l5LZln 󌏕Թѕ[@HrRwHwBC!ցyQ&7:52 H VHAvB h `2bؚ܍u0 -QR+Zݻ>vMna5_FC\ g\YvF[k+ r^0kpj7―2QSWR( l  824' ,3)[c\Ĝ ҫ7 LzHY4W-IGG3;#փw8تjPDcfhմ;E &(Lh+İ W7 1Y)=McaۅAflCB6r(1(f # (5nt`͌ݲ,p%G !Ξ[¹l] )ݢw4dZ3LąSpAd|B+ /2 -(dy=\~0P{Zbʓv1diBJ͋UAtBxv2zRLS:iЄ, nJhYt:X88:) 1+Nz Vx_a{у~@7'NNb[O-jW(NEA| >1(NSC2UI cWxG>pfT&1W2XWth&y%dFP1"{TbQg-Ł?fA Ƅŀa#62ܓYce%x4v si8t\8]3Mt 6OtoQ,tM1Rc&bWV8AS"^8y Tz$0F) 6mlNohy ۘ!f@`D{ 5!LB(1JD Wp(GRDA)gC8_˭kp1p84/e}^U_ݶZFFe ;S7P2\o~ ьnKͻE[hb`،g\XX!P܊QLkcX;@u1BksϱKO 0 Q E5-cQWo2gްn rj7j(70JhP@8/ٱl[;Q`VhT-#2AtN?|D50I=)7O&8P$@.1DIuCfhч5$f7q%2cRB@^gX!`ց;> QD #Ly~'{:%as -FCIJ+1͘~Rx&Xn0 i;@`&2 50L v,jCg qIv1"Y%1zFߏXvAlUELlE4Q8aґ [6 K$'4]ă/+.7,K&αqL@"򰫐FhQ Gq\, "Fhg[ օF)5ܨ6=07 䋅'tF~{=P)2Գ1zky"N0B-P5`Zڰ@x|JU$j ݌5ֽ밤V;쫨[v1hJ'ZCT`QY$f6*Yh!`W#3^E",rdf@qGgqH4žYXV5d8#)de3_hqtgҐe!K-qWLSc`QK ſp`;B2gO "35$T9# xҲ3QU p ]nĊb,Xm!;kmqP&n0!VK,0q.tNLj QiIS<$6#@BF!(L²&|fmƁLF"{n%cI:@3mƪ’区HR"S rdU:wSS,bl>GKTG1= {tMEj@͸拫R=i9Mu#8:Quce ?}lLsCpjJ),de}0aVtH%_b0 Ÿ¸hY4:0!g΂Qap"r0M2*?A4-N:TPzš3 c:O @2b046X( %8PZ󜺫'T.12$ Q4iP+FKb0wܵ V?t%chi7 U52f6Eu%# çæbe%ZLq][9pPY!Wݧq@t=,>6gԫLa0RdܿW RPE9T7O* %s$WlyaF31XvtE8A%쐱xD( [nc DU岜SU+ ~THOEΞQOH%jð4VHU/n7A$6P+`%(X}X%:#1VXbԨg]. P4ef͞a'EJȏa)`y I 37- b؜5sSvcКx2/ց`u eL}atjfl:lʺM%[;jgԊpvҲ2x³<,fRĴnh0'+KT/R"JH(>jX` .("Q15sX41n&.z1ق* pYx8e0n*s5Y7Z:;DL;K'QN(F[.QL9ݳ)pk?h:+cƥ+B>SLd`iP:XBaٽwh٥¢nYYSjּ;s/XgPFKIb鯙:|Mye% D}EpyhNաZWv`Q a.mTL: mSJJE0t؅NVK)xf 1nB#JWeUKBcqٰDUI0bpbBXE ȐlPEpωX5c[1F # ejYx?IX*ɓf={7sX8'w oy ^,gfbY=I8#:"c|7/p-to7$J_Șhkc&G-itrΨ;j9YؔCv~ftIkx.j9d w]caRpZb|ua*M0,xѡmQ×e_ag_T兾_8 z/IsڦJ&Cw3aG^ҽqmd/R|Y)3"Q/lo'ŗS$AoLXYŸ#Z'@o2oH Y`n^L_f&:eZUD#U]'eKZNe ?Wuw1&AwPiʲ> UrP37MXԪ+ItF퉥V8Aȼ7PV]pŨ,WznBj I jݤHRꅹ!,"m &fg.S]M^*VYS˪+)ʠ S]4?X.j]9ӵUY?tTƪ@bn,t9z\7%+s]L.[߼ )_7r%ZJ1"FNy҇vܾ0 ^.mZֽko&-W-zP%)c"gKUu ~2jv{maN9^m7dѓ3R:T=d_qZɨ*%a#R 程q09X/)=M<|i:;"GTt˱ֲ穛6*ɞP7γ/DOJnj ,bsܰUI8"UծUKL4*Hf46gTċشM3*Y:tkQ3hKJRb}cy@c /jyd`LJe.{P[;X[,oBq駰,81ELe0r(ЋELB˫%ɑtDz7]7NƖ YaQ FsʂV49yV:<`FȨ3k˳gnD#Xb)̲zbwOu5Kb6ʼnRubb"Ы $ .et%r1Fa".\Xob؈3"yPfȲ8[ģ ʘPxX{f:_Ե&`z şnXeь c۴ Gc,Nb#0.~sQc]wktA9Sx1';L}ڙ-SrKGFB-ȲTn⑘ B[ sK:[C)mt=Yi,Z^q04CdH|ȳW;ALur 9jɑ`i]i>|c#qa𠹪/͐- wq2ۑv{V_O$qKd+IÐM:lpF0V`5L+yYYi~s-7sqaƣ)56l7#F75 #J oĵ6kV2&E0;~,1Tn9nh9VÆU24NŅ𘫎h?Q>_p{؂ ˄%(|BN_xi>ucZ3 eЩmוbnܕ0B( bvsRR@R :&ц뺅(SFz,l(TwJM@G^YaM1G9”sz֗]J)[xZX\PQPnB h mou|gjN|.ºj}bUȋ(ƻZvP1xu-LT#)iTQAxޕ>g2bX N[8J`q2ɘ;VB0K_g~RXSzXTNP21D{%K͢u kjf0#o20$%Z!\]0ߋPx@B 37Ēy}AnG&.B:QorcPY< +˧3uj3쁡g7J^ _R _”̺;INdd!ZxkA(#醟:4ڋOB!yuoQ\ɫΠ"'p:5\6@6=XZ*NRDV SOz<@^sj11kY-4NaV)HefEc05x<3jdckzYEw+*Kq =|%XeXJյb᫝Ӊ4E6o_(yVK5VJAvcSQϤG+Շu%d-K񷋓gHv:~Uw͛7?`?>dnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LC.svgz000066400000000000000000000017721221777731700221300ustar00rootroot00000000000000-(zHcountry_LC.svgUKo6WeoEA=4[ IV#E[%J-<3߼>ML6;'V|UZ|3 5 skYiqa}ddX1JWeZmm:Q:B܏ȶٯ nB7%e|;YwXJ\V q}w#-[85b'I)R մa׵?p=*: 3xd= kfL]wRnfo1x4/TkolpIvQgwK}AIIQ2[M)Y{Ǩ?^շZGqܣFN{V?(QG5͖f(-1(hu{yo^GC̵y fvi`i=00[(ex齌()5e|1{is xcȒ->=g1ÌeSc-vV9GA賿`7%v)*XO{)Z|=Θq j&t:wSo~ZwpOEܝ=cX {5gڧR+2=s& g2;1-(0j4)́ظS-C`gZYom\8Fl%QhsTkϨc{}f L_zEI zNx8L81c݃F5,}p[ "Ǝ 06N֘R+pޝ 8qF1ea8%QQ=vV;`\ gXd': ۾ęQfnOn-HIŭ?Zr,Դ~߰6R\J > 3M|/{p -cWsqvņw w}2fP $ZݽKj~XpT}^_lxpK3(3!nogBhlzJ_TvW2px;r吥WɁϴNjgJ[<^ !^\Clhj,9- o2nyIuwɆ Saz~_~K8)O@_~J^x 땆̺:Sr`x~Xfs\_lxp+3!ʲT%>`95,|]/͠B&,9vj4> zI*ax4LX b pO_k46T` cDX`G`'296{"[tI]/E}~*ІVh ]72B ?MQemޞB(psi-X0TiTyoU9JдJXyw}?`9*Rż1pIdp5a\ڻaGɄ9%9W- LVQ$(Fh\xDBhjze ϙM\h ћ350bazl@ᓅA/whZ^.AY>0m87/PJV)LV.vI6;qzQ+Sb/4 xַRB5d~$KUt00x]x0][ k,x0=iΡ>jgWV~S8!1A,aZ-1evػ;9RѴ . pҦ*LPRsj8π0_RbnRcrx(EcMveZR@8M'+״@R;M5\xIGy5}?b*Mq],βG}9gF'9Q,neB5j;@\ 6K6j-ٓKʂ>ɩVrQn.3ky3AЇ%t,A;x$V'AK)u;`cFX:˽-d ѽ&B׳`" %@I<qK 8r9stfQ 5,̵* 襧 Sw$gVtVNkA9wbAN/xPO` j&V}NIcpE &U(FP.uy;&q\K ׉e\)R)3-\P,_;X'xiqSY}#~=<ֈ]4ŵZ\f0HFgܸyuemCMx6)hrT\GPLJڢ VH7fKY,"JNfqk.04,/jZ;58Wߥ5رk0^rX!VCZ OtqgqO%*;n"VwR ֮plY6qCX!D-MvS|,p}}}>x%( Kbx拷sE;zZ;v)Zvk "D 6_d1@C%ؤw|mżGd<5ܵO$5X,Y-Lr蒌;޹S0%] F\2Xy%1J}lk[W8r8N8fA,*F1Ms}H_YuPg[ ?ro-/q5fD۫ڂc&Aق8ϡŁ^/Y5Gj)J4"A0^9 -܂>)]XLdи2Fj${lٸ-AG pz, I@mDKS!Q|O0wvOB(`ag9jU8zpG  MgHŹuP$[kK<'sp!y:g>C!NeᬍH!HRB3#X]KHIpR HHL 2:Cd0ܱopEn +qXրHƚl pr+ ړC6> ɏkTɸ9wê˞3 t&F_ BC-*="Sgqi$_O3y1~NL?&lH_!1+Eh69(I.dlr꤁$zd af(G̮g8sMU#F* RW18B=$C kR *91,m Pb (o vl#n#`$aܡourF'bt",*ӗD![5AȲ 楲>{8}z@DLp_xif2-i,+\ޅ 2SR3HV_`+ >'#pS_>9GZ+X*pܪ .yF%#6S-{4M6PY|t)N>m>9'.l4UTSH!.65!l(e, JlIyQLi 7/7IqD7 : TaG@,Noj,SĔD;3n˶K>f9^ wӇq4"ӨZ__*q*u'֐Ҥ4rAMBW ; *iԄ/NXx0#حJ_ qJNzeM^Rpxw FPT1 fZ"bv 87v1GeKut =+M-F5O9=X*T-4w0a+~Ri kׇQ6G.mO~lPJ+0)xZ ѕ#Q<%xWI$8H9UDͦiZ^! 0fHyႵAawt ELv ZXCS+زenN`f 6^WanMӞ8٨El A#9"3-ۚeWIaSPpqM縵wbQ6Gֻ҃cmbO!o=p&:]Wa"ϖ` \|u8t;f6gaJ LXkcZ UaɊ_xmn+zJH6j]Qy;$"S,fŦ+n\%+aͱ=M$&iYVEG!*I$g jܤ˺B>BJ>4xmI(Ȅ e scK-I?A;йFCp8+&JcT}k|

5 ,!U/!F7@qe+"뺟C I{2R `3PvsⰰN2' [VѱmD頦sQEf 9ar!2Jq e%QԨҋu;\M~J$p<[Ƿmgr2Ȋʙ>zE p ,0wW~a7KQ'3bqlԕݬ(ƪgzo+]BF"3/z0Ĵ=KA 6dӱ~~.GJ| KI7 ]>JatGn9I bf&U۠YҏOgSPGx\#mFn(TX^iƕ3׽_-93v=O :),u=5vf@k[D"ގ& JS-SE,v27t+&Jor;a4͔hFcP$:ϛ8Y嫯Ƴ5_*њ=L5> %,67"ZKu6>sTkRJuOׄ(HpG!.) ;SԮ4M aZR2QB<-a|EIjWu5)ZA^D4'PQ}f&fȵYFc"*`#çkgiMsDD-a_L8 ?L72B9*$`Ṽ 0nFsv*USYpsq XGn:އ,%SΆk JݔL;ӌ]ΝU+ Q S~Fmc<5#1#bPuHY@-v}%T(! 1<^D,Q/ށCvC 4=l׫3[8'zP$2# *Le$DJFT }C\GJ=^ \r Ea ~6 iFf3?}kT\oL֍ 뮈0%Q+Kb'XHx~J $/ wڎA] S8kw!T^xCϜ=%F,gD#l4cڄvMz-0#,v _l9}1XJFc*-P/52Yz=Bs%t=bmrW~$ >UW~8J4Q60N:aߖ9 ^<g7Y-;#PFB 1nqWϻ *ONdc*HSF %`79j`֔Q895>kWddD]e_zb6W= '1nj:ӜHmh`*%o L1ߺ뗗ZH˧ V8s|qݲT1 9gnWIb#t^ZZ%pIAhk=Rf* O0YV? 'i91eB <7Q`#1J-B-+ށڄ IXjV$DlYAH[ O| z_U.//$o}=E/)U-kW&ʈ%T0Jת4 Cw7m\Ҹ.6)ߦ ou72A̠ylQZrH|&qK jYpa/0o,^xzi$Y.SkϴL?gKNs4ZRn$q s'Q5!+r@̳n˛P@(rX$~5Jz.)͖[]p?Od2n!#bk` ugOQc'|Qk_lgH)DO<G ;MӮX˧8u$$^JM50$MCC( ۸iğ\6;H8 ]I-)] CER1c.LI y CeWϊ;|OȽLHdR!f:wa/fby'.IID f44oxG^b*]&b]##QqԿL(!Ąs["@f*!ѱ%JBJf$c-b)ТCX!׶{t-a =O1iqRQT\Gܷ):\M>hىTA|4|?Bg:RuҪ,J`Dn῀$>dFcoS ,3U>e4 S *|-@|+1lt7f9VD7 ^ lwx?( 50ȵT+/grhe`&vW,*oZc&~Ioe)gxA )G]B*㩍yYtR!igF?°]5(/I.H>zeƘ1'pY&~*|M)+v)%N:ݗظ x൨$;*-<ˁa!W];K'z |SkvM xW),1vߪXI8K I_U */p;(C20qPkq[SWRHeAgVqs@]9\Ը6= O_/w1rI|$&5KQ@+3C4= x_3vCσ$Cuc_8 9† !0@8 2W˝zKΥdW8 r5cFcbJ(|v=~+ RSc5Σ5P+6EW tn;ؚ2/WJM ÊtuG l|ۚ/vr*Ӑ,%a^OK!QXo `y^2"ț"V1AM9']nptQ9I*(o?!ѹ%˧Ӎ7Mf'D]KI5^v6CG-˅ZzBK'e ҅R\%> )8rg˷ԑʾOYhjR*t*ۤ $9Fafw"<[䫗3+G[:=:,D""kW]=yv ;C2R}=lKHo` =! "3#vi09}<cp W:{[Ogrnrh=>x=^> *a3t&_N'svozʑ+] JdQՈ+07tx^,ie:O}!& pmF)K5|7M} L` au?B*!׼1Vz䰉KM{߰nozp OMŹۀhs8'7?X׳Țnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LK.svgz000066400000000000000000000142071221777731700221350ustar00rootroot000000000000005(zHcountry_LK.svg\k[Ǒ_|I3wH va Y/Hȗ5FGXv~S՗c9V<_Ꞽwg.fvj\o˫W7j׋f|y\/for1ڿv~~tw{Çn>vf77li׻˫F}q~nmgoG7vo0Af"|1ϏxcM z/R|7g~\FD^MvҎM7Yۂs0־>G_w+LE ze^_.oa2bzX_oMsζK<=y\- xl'e1rU'+vOouu؃Tyfy$-.sdVɁyPm./8fO[t8O=\ i#-}D!| _ܿ_r rq/Cy?_N8_?]mL܂ k_>m7{3\՛O?r©vIFc {[Xpjl៴4Qr'7~X ;랾[(N1n|gnwobkpkRC;oCJ,<x.yٺG;OX\ ZZB(MۥϿfGlƘ\]6frf̏l&7?b3.n&b3ŗGAJ>,m&[y8!a|?Gt5K!Ƌ!^onrg}5,o⯆i7 3rWAo|g.Nqi֟`҇ b `邱) 0)&Pे k2. aU^ڽv|W8d!]g@d-8Lg}nvm-|Źp0ebЙekn4 VbE_pvS8LW&.CfT;©)/PD/<%)dL>j!`Qp7|p]r7zosuRQY`uPeiC&1 uA<()AÈXaj1N[4 *I%c{[L m Х#P*s{:].FP `rۤ036 b^0 FLͷͨN8|0p±Y Vp B@Sۦmd[qM~g-67G.@g,$Q@'@@7I Z1EPEP@G*x[.M&'HfD(2 8s];?UcHah×F꜌JRZt<ڰs!RH]Ql#kmW0b9i-XM4QP1D} wh|%$,$ڗjM=b A c7Z"P"#&"@l/ "I`<4` bN5Wi246 =01Ybt~/H`921Rٲ`cW;0|Y"`cfa@59J,akho3_FY+ܳUHY­Њ B(b+^v+3`Z[̜Q˵8\ Ķ'h0PG\74b8O&ŁVz&l0/ZLcdBɍ0"u;Ǔ?Z8 bKY3|A mACDLHJx;bT\XP" m!Fp#<$28Mm\Vۦ,{U d% XhOZ`Xu^laDZdKp!bNIK?oIrawu<-8GWkX8AfM:HF3 L 8H_x8\j "zSa? X"4+Ӵ˜|NAv"NfjKmgvSp$\. UH6w"u}~ zeHcHh^Pf!:F/MC OڠNbŚ!<@FmFӉ8^Y dm4+ndB4ll0I^C"92BV`@ Ya10`s^Ak ^ 6h⪲#24s[[!dvQ0$p4˖"ܣTu`B !V&x&Y(DzP:ǵEѴ1(zӨ۽ 6ucQm{M:&u)7U*Ib9KZXUU#f +駵AKs>@1v Մ{f>:_`LhcFic։XQ d ,6vL%9DE-[Ҩt򨿚mk ka>u6)햏Kz߼feZhY/OE,+)$E1Z-.XɽTsVܐ[ lcDf%,38 %A>Qӻb>F{r֌hDK2h|u7j!c4'ߤU}gUq4NƝDYkTig, QR_xj)buێ4?2KV+XǘhޏYa/ ?dx;# .g3 k\D&8XCV8tgf}IoTX tNp-Bj~ƹr8:9shVFLe{GNU)Q<CS5BKe'rٓI#bq0"3Mϼ%!:Қ0Sb[z:B(U cl֤ R&Vo^4cxAsQ%]hZDXkJ匣8r]Բ $IVxgf1'32eC̷`~eP\9K5kM mZb)#x("ܾE>"@bA#%QSAg6imlCnaq`] ZRTt~/~ CkLc} CrD}LYW 5Ȅ>PSn_F뜉 \Ki[$@54I)DGdC>O '[҈W/Qr,Bڄ u(y1HS,R=^Fd(k"YDEP&YU#/U<@h))Fo&Z pN!I RZU ǧ=cV"㊔/o5뢉v+a>tjØYtF(AC.R3 8@rzIZGb 5@ Srq.B@H/G~݊ |a"pN:1rƧK1} CJBp'/ң=ڳ#8gr ue:gluPP璆,A누4Ntϱ䥨d䋳roFM݄?ay1:tԗ iAuEַ=E(`|ux$o>K6dtw<A^30{:Fyw|AcŨ/78I"u'&鑂P`Qӫ^Vh'1KW-η YS({ыː`&c?Ϸi< TnيX۱[SỉDq+ {֚c%YD5?Ŕ.ZaK%EZZJ I|1Okae tю׿%VhB%[/Vk`Y#/k+WNz:bE x)*Fax]|Fe墤{jWv͂0DP6|C歨w+ 5B&V&04,` >p$e%vzSs<m(P6ɛ$VI.mD | ,ʔy´KP?}QEkECc#j$efkYüv|$"bkǚ /qOr/Vj׎ eEFFKɽiCZEa/^BZ[o¬򖖏!I5{OyQ_$a#M9r2ښ4B݃ "3-#K/pҊ%0 "xN yb|TҜO,/{Oq/? An:ǰ%MRlNӠ`!ku3'V۝F[HQTp݋$8IIyA ^94vzG`҃/~LmԾ 7 tbNobnֺAˏ{`%fg\jNࢸU*RjJYzB3wzp^*f5N/ r* ߘ9^8c|ns kD϶? I̶1VcI;[ j`/,@ Ld$՚n"?M`;s'n*t 5[61̫[>f6g|*1pSԿD% V&_4űphhM6R⟠d%?KxV'0k8 1db*9rHk~)6KnV380e5@x>YPUǓa0^-hg*DWRš괎rP?=0z:}?p.)KU&4(yOxpiUsSHE)M\N.xW_Q9Mnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LR.svgz000066400000000000000000000020531221777731700221400ustar00rootroot00000000000000(zHcountry_LR.svgV[o8~ﯰܗ6\ؐvJ#jQ{ HCVm6|~QT*EK0qV$!H騈\"ąğ77kuLnB`\ !N.+U*b\EG]^'u+6|YŻ^trOZV+014Z)3e^i/yV<_MFѡ%uV6Rtx*,ыh/Tq<+: 1YOIs>f| 1A1B6@:k\.qQmB3}gKnC%OrGUߝyA?-T<({V06R^CMFTF߄@pSVQx/Գ%ހz/tG:2򭄱٬-]Cs3Y=Gh 9o::~MaH z~-EqkftbόMgyD2AkZbS} gud3ذյ;eE,O噿q ;rWiJ!fcCgœC -ss5H-ǶEE.sYv^Zf]}' %&^UNg- 'Wjl ݡ`CzLsǯq"ykR5R|xIt98-+I%LXaSۧbWdZԁ|u)iWAxe"s&d:]؜/diluieǢ_ڥaI+C\??a&=Ӹ]ƃaY&In׳Q";Z\ͅLz*́.A !H+o9#ޛ:w?ḻanj/>xs5^?=H navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LS.svgz000066400000000000000000000027551221777731700221520ustar00rootroot00000000000000(zHcountry_LS.svgXn[7 }/{ـDDQ"Ӹ6`On&^;$N(`i!\}x_tfZNf|y;sv.V٤_߾ŗ?d/[٧lrizc I<#^>3)lvv4$Sy0u7.jg4XL/rkTaP,|#c31WK0!,iU"59lUhj,TϢRIŚU ?mmnMjiV!*[1k4 Q,Q&CbVVdL5wԐpt`4nB9)W*%H59&o gRcVFP*xhM5d $X@VL[@8KqU)hӡ6/ TtˏwzyvSV= ɋߓ#0bKfJQN'/|fH4)Qᖝ Q=cIhg&0U`KS*e7B`i3+jBМ!d`cjS)gˈƆ*-Vi+ OU1[,J{2cy^[q7&"os fCpWqĠ_OZA\jcOAàyd0G(#h Jiٹ`^pOW-cfosߓQ ~ɹ:tkBeLBnEcn\H9Jm V#nOrD!.q89zO0r6u8Ÿ]뒀,dZ&vuT0Is5dWP "ʘm(Fpr4l`( p}5+jCQ3.HeG_ˑmX{d sq7_ Onavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LT.svgz000066400000000000000000000003261221777731700221430ustar00rootroot00000000000000(zHcountry_LT.svg}K0ཧki)z`kx{ LLVLFha@Px^vZђ6XlR[k'Bs7QJO 8%lki-tF%L)PH B_~HG:Z܏aw!UPqO`Bgb m!#navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_LU.svgz000066400000000000000000000003021221777731700221360ustar00rootroot00000000000000(zHcountry_LU.svg;0DZjbB٤p%c؊8"h4fwG9GXnqӓ}j棅\V Q۵%]JkȕMgb &0IKG9a/G$[o]ҸdPǡO}i?&\ʫeŒʒRSnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MA.svgz000066400000000000000000000032441221777731700221230ustar00rootroot00000000000000 (zHcountry_MA.svgYmo6_!_Z̢*b[` ]aEIrwߑz4I8ݑ{9^_.3BUZs l[*8͓'8̊\_=U3˲`r^Mhnj꺫uL8rU*+ ڃy4G BErY䕙WGe7 0cD..X86Kgw*xh*,f5Uź)=~+:-(\];a@T*Tvr3'MZpVmY, V[HWTy~V*ܾ|¯T6fbc aebkimk#;+."Ii8mB]EuZקVy:Bר^f8CXA'X m8v6`mYM˰>JgYPazRâͲRñGTOr,Eob[n:چ☹]fE5 G!^A4l;/Di/)kozu DX&Ƅ`c|lXwJNQI !w|_<vkNF0Ty3UU0:b9RpWNq3dPNqbOr3l{oOh l$a 1AK!&ʎ&,ίͽBR0;8^| t>_z_og oƉu'^4|] So U`5!e q.dƪ.2Uj mugE߉)"+ʹ3OҾuy {|:/6ګ^ڇzv($CcT^Q 8HkP]2=e­Ew8̒!FKaJw"fa^8 *9D9GL<raIOY i~KfJ6aӁH8t6G¦):hLX=Ӯqc.a]/0NA\.O/&Gf! c2쫪.Jk,$uZKIi,?S,4/rv\ ο/ATLa~N X@< H %#OF`&AckJ;~NSw}sS{B&(̀@~OJ!CA HK1Py'YL~R YL[0I*uB+.=+NP6V Ij k$^ZF9Z@RbwRN >e70y[S) v.\,{J504x P Z 8X4(DCp287YH 7HpFY`lp +Dv&͒R fxG4#=navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MC.svgz000066400000000000000000000002721221777731700221230ustar00rootroot00000000000000(zHcountry_MC.svg}A 0EwƵMbiJ;&H34z{Sp%/{vϻhWXF= DػI؝֫6B8 R*R]IJJ)2F~w YmXa#%. 7@eY5: d,S/9p] navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MD.svgz000066400000000000000000000576611221777731700221420ustar00rootroot00000000000000(zHcountry_MD.svgսi]I]P]i[ me%+# Y wvDsduٝ=cĎ=>y8~7ǿڋ?ߝ>?˗%_/OO|wӋ~^w/WǗ8%OE/q3 =cNէ~v~9ms>~s9Ǜ)?߼돯?|:_~w͋b? _o^|Ͼ{O<Ç׏o8?}~7o_}w?yw|_~i?{_|1_߿y}o^;Ox]$Oo{S{/~I}뷯}~_?`k]x8÷y \x†3zwjKeO%~s^7ûןƏM`2>>bu/9w޾||9y|!2:ʷ?O?W0>}>}Oѽ~g7Ż^\?5}t~.>}G/_?z>_a}/m%ߤ/u/<i_17/_ylNo|~G9o_}zĚ?_`5/^I Uy_?y?lU^8ٕ +Q8j=H̅D|^##6|㧛_O?|⯊yqo ѯ_}|}x߿`o\0§ew;'8sK~O<߅*`џj#9||zTt!$.D}tx_קs9]a?|ӫ_~{ss+׆N?էū'ri%֓OCgw6ggpӖK!C-7xB.SxŞjQǾ3c ZOxNt gEL_龕~ƐyN9q~`=Ԓk S^s? w?“>ty9|\b,w;ii}i@ȿCМq#1swVkS9|c$e_}@>zL1&|zhWk}̙FkreMxH_Wl@\ xTobKƋa72r9ۜ}2},\9sגo\Ĺ&dO&͌U体ߛN~{SxکxR.6fQ/<;<`Z+qIEmy9{q}Q{\y:ȉhGqCڄ›3)3a!xWID.?ܑy8]'Mbs$W0]sbPß$\L qbí©}im[k{ y{֚;kmZj[jmn}dVWXYZpcTp0Ii#s,'NJ9I.lN #6D{ '; 1%fE%78J+87dODܯeX:mqX[r#<'p0fc|+6 X9 *U}#8_O%@ *n 8 *xH8?4*~=V X?82oJD~oKAg'1>ʹ㌹UIeT4]1И3|dmx01F-$d(I  XЙOP*>4FP@ ˌW.'a IO9'|Zg–ǖDB7Fm)METuuh48p(cP5LyYIP =\ŔR=q]u<߃|?ׇˍ +--ZtKrUCPKD1s1x}#9G=/=^Y:WA@uٝ2 $sp=}9rq bZ`xh6cI͈2`^Ɇt<B[{#x}^iT8vL$qi7@q?PJST|{ b<=S %q"ҤTz~N wlo] d&k䆠#<4.9a!:i1&7P*ԁjBô4db@|lF8P\9A`ܚ{]F;So]|O !x?kY |v\LC˵k/Ҥ O$C!4Y.jk4=UW U>:n/4_rwhe$7*4dj4 ] cRbaJºAzFĜ!.=9d:r[ǾS=4:lg껴$ ],L,)V}uc UdasLpW!$ ]1 PkAPI :_}>4ugHW޶sK=m_\u<&fXcWBw-lYR6)du+I .QC ):袝Ah χ[a Pv'ӑШ{j >ӢoUwovZJ-DQ LM](xD٣,ik46נ_l J2o>;M%jhǡb I{'$&S 7@6D2do˕kߩi|a#Gg  hb{ d9ldsi)<=sj3bnN5 e>(_ܨ=-EJ[kB+NS62^hgbUlZBhHDM%rB'E%eqS<#B[33*˷].ΛBCf@Ӎ RG"(} ̄v,_W"ݛ*XzbGjW6Wwh. 9W;# !~䅮hF3V 1T'/tbS[%SA&SfE?¬y ¸@VhSniL2XA'˭ vY4s%;dP/,u=.,Z-L~*n P:Y2)KZ~p;V$-hENI|?rl K%aE'tW6# jN#0aT(`aTB_{Χ̏5ZN\hlj~I9L_˜9x9|n`okz]Gqjp Xa#M75i|o05g(UEՎ~1"sL4L~*D44@} ZAbc7Q1':NV@!5'7`%RE\BÊa`tDI2Y /FMhtVp^,/fG!LƁy]vTm‰CG(Y20&%IY]赭c,80,@|0V&Ţb_..$ Stf]OfPV(;h+6gǝ3{EaXL'Z3s;Dɢj^d3V臱`{V!7&lh؊8:),tnj3:NR+sԨ{#niK8m:K6 Ơ";b(T xR|Ω4@9I*c*5@qZ|P>c:;6koA(aӤ#+Z9E9 [7oE#PBy*o'ס~1=% rQqF y $pj/L j ( 7$D9m9Q߅J%m\jIzN 鋶5P( ɚ,Aև@fD(#k uX ^S\,&'_*G ݗ@0JP*93-%N= wN{">t] ^DI>N=iy)IeNضQ6IWv{h>* %յ<4nd"`/g&p+2gXz9i?DPCϋQ`2l { eS*A|%Y?*Bh/OLEUR2D !BJN9РRT2&*/L,]Gjx{>1e*͜ ^}ghn#ȺH}Uz̮QpϢkZC1k=z]{lT$YB5x K,Hr83c"d (<+.!923$3<]>^Ԣ${8%@xs1@ލ12~&OT?.7C:mnt8CZڂ6ȾF K Xԉh`VKsYtEk$s{lI"ro U~8`STZMՒ(0K[T! "7F_.Ԏtk WaCФ5fd^M盹 sE5/(i}t` AUؘ6=s'I9قZke`!ɝ9I7v ^FEyџu,x(yC\5t0G21A)i:>Z`CF9!OCv`L|ߩstXFB7kF?W ׎ di6^R\NGA.͘Hu8UjYM찘Wi2j)ZQr٠]uż͞ȕ]37kjiLP4ti64$ S&ВP"{&7{5hFV褻1x(Ϙ2?W0ߋVTڔW>33߃%gI1{ERm7 gc c}{k"U_ygDޯ䢌 R$}uSH`vHd1c\Ѵ"%JgU9rLPnR1_ SS}ĭZ)ev(IEzkhʆB%k+? 6y80FOĞ淑5cZyw+)" z̡XK{zqGV} /X* 3vՓb{>P_VW^?L/cEl0eS ;#NUxt~_| F I7#FfENeLDN@=Is*S 1 R`}ᅰ-@'`R43 0]S*emOr1ʍ(m+yȶ1T2% УE "*&``fYzj#]Jl0&1"·Pc/O)nfs`Sڤ߽#Sşe` C2&WxN&Zw !`3\#uP61`[,bJ C>2} H$Te+q/#۔7# Xo88Q잍mxe")kY~ jZ:eV8_]QWL]8U>#{ ֬%(rGv`F5#R‘9o; Yg;_}CqNtK|.k`@9"tB-NN1 7GP2=V`:yz04#vk4wj Jy1,ÒnmE)֋@%7Ls6Z(2.sҝ =X7QJ.UؤrXj~QDJ@*i`Wpo4|d]꼒!(TQIyti%2Qa:ft`%'}YTkηdY?trJKMӳ:.eh*i1f۽ ,fTKL5!0! %áN5E>k >υ(eJA Ճ)_iRҶH)0r~%ZA5'Ѱ:>lNJ80ȟ@P{&ڃƀREOmm7[n<m.{sw`INFp30xc/-)m1z$i0A椃|Ɉ^: y vS#a["@6t;281u##>{$sJv=U n` 4Va1 9c[֕S<n@a#`jYvx0+nGIc*u=hE{(ɐ|6/*/D|4X.6%%1sP'3X{2o 8PYjX+CɊ\#՞le.PCDAP ؼqM#+L '̟eX̤߈HXKS%Sܞt4 y-:p1L Y 9+LI,őV>;TsF.ۿ{NG3kC #Wwl3 ViZGBY5MA(T[(aL 5g H/I{3 Eۢ~Af|)c&c\<)}&o(C4Ơqa!/׃XmuuX24tByg쾨T2`j-ޥa KD&┝:}ގ2V$d}D~ΪASnwNvR sPT\ Y5@$>V2&jdsyJߦHm˧Kl-z x5ff < hLK]+jxJlwy Tfb5vY~aь d,Ì'ʡAvi|}{6lfĶb3t9%.^̥ۭ&"Afj ėV#+PS֙Q^OUx3×t^ƄpqNsiy`ߣ2+C"ʴj9h͸=}yU8?op!Hqu5smծUr*)Tp p·ڛYT>qN: =<3VnVLflO\Vоb͒m-VqotajZ9bV>)r9Fh#ȒK=#X~BQ/5؁Ls&*[+koU>W=^W,%HK~@8l4 ,uLoY{%n4{1uwHv/ʆ/HV}$Y-?7w^ e"=GXspIDL<jxjaΉ/RHf YXjƮm`zb~[.(*I\v:77)l9okx$Y7p4k}!Nٕcro%\miMybį͋Ǐ?GGщO;hwsu۸lٝg\?˫ml`qLZ9nO_}y`GZH.Mk֧}oyէo?0q`wٞB%R5F3l>_W;u i²T Rah*0'>M4t -g%k͠%SYIц1Gm;|m Lg1,DgJ9s P.4wOU Z5+]sQ{XےSGZwV09޸[L, SjVn}{M Iu0((i ZJoʘk)XCX?vV~~%^^<nj7܇{s 52D7*e'`t IЕRXd5[Zf\-2ɯ=,f@RiSY,QV82݃J*LU19TLu|#tL)ABN,g- .G0w{9ƛ)Q, oDә]fMy=8(`n ݌JU `ec.CX9ؽӬ>$T' :YgPTf5ɿN''LdTf~a˽RN+PJ8 a()Ղ? Zexɱ1YU<&n gMb83Lo.**q5"آ5mf` a$)ĺ'0h[8#2,pt]|5whݝ"c< SQU2`f$bh(ѱ )3*SXLP s9][C\E@`X4R盁! o.hG-3 2f6.XcrbB_}${^m-diQ֪v7xz+QrZt3FK}TUj3ijUebe)1q1$ZE HeK_LkfG0 Ӛb Btc5n]'d<ʀW/ݬ4fOC5?ۂShQ IMOC~@UvNf`si |HųO`䕉8MP#&ncʶv %HqhtRh훰Լ쫑1waW 0oQ]~`6*sºoBn֏^|(b)G*B`rK;._v,KM75fn&fޫrj<答g_rug2h`6mh5{ JX¯P8%t 9Y-;(qB_E12oΔUDrBr9sEgXeP͓Xlg1sbV*X\Z!Q Uqym 0J P"CmRۑpw.ȽFGr⨖v@cYIz;ݗQ}qluo(x #Q3<}:D<:R吘 &>+j^bsp1NJ;jJYBNP,=,MVF>U͔?0I 'Y˺ : "Y1e]AEq/M>J>8PǠʞ S [AW*xbTuVekY"ULmݖP@Jr'3"ijf,+C 5d!hFGflǨ#!/ jTFRzXL1Lpt;`[dD_MӔ'*JAmgRPbj»/ WdS8]jނN :KN]+g'N>@+ on][j3ؕBxJ⻧ !nJ N"M M[Zd5ƲR[R͈VAok'`̏LƔ.DnbȺbљj`ra-{O_Kl &W}VP:}L*?dzz9-m~^7WmEa 9cMv`ڒe*OoI`^2WGeg NT]Oytoi{#|7/;U}q~!0Gt`L 0NJū_bfA+;4Sg>Blz@'b8 q~7UlS&ozKr_^eU6-@.}~Ԉh{5OFyi(AӎUΖV7wy4njMlj3 t  P]z:?K+p6>ݽ?ӟ qK,L[1*Kh4 HiQ%.MJT+:5}I$kYEh51U]il_,Mb$k56*I~XltI5 9/UW:PYT g* ~tJ}J*v+U6㣏mچGk꟨m|o(u/g IݳzK*Zkrz$EaȲQ CtrfElKAc6GY F)Yj`%^̱rSV :ORK.@ooRF|Y y0)0u {j3zx58c-:mavM3cK,:rܐ~D?qVJ@10;w?/spM6dxr8J%)>KA}rYo %~YnIfI,D)X o;M68т{L$Ka/ORe 8k&26'Wwaԕ'[Xs!\D,,A`HxےBk[e{iCdjDVıh<$+UOaf1B;-=vdžGM_~7ӟ{n2wpD  &л☨-@?bS1^YpYz*e"ˎ!R۩d"TqIw0@T1sz봀Jӈ:OGD>ƪ@eop;`wRnxna_&~<[6jcTȓ fR'Da^Mq5<ܽѩ Vւk.du./lr30ڝ!޶}wlnǷYq>n~8]lNx1qGMv\‹uICp$Rĺ VNœtʠȒBv'Rѽ ;+ j *I4y/r:p;ˑy?'"ŀ7]NcD"s7(vfgAZkJ:_1{7|[x b U?e+%X9L#hsQI4+jE&3 #FS1qu`"9b,-šPc,?{rœ,}r\Y< oM1cgF{!p`IKy6-.'nkwOL{ylMn]N񚠂]ѕyn)F!Iػj/ {* iBNq BT lFs5Ea7Y`QybnJ/A⢺ Ԏܙm!aq 3֫R' 痽1vMolnOiKk4oj=˨M#9]>r_)wY j\3gEfZcdNd7+mZKh?\( z\LdxBXZ끧mPZDfAtlm LZuz8 *Xĭ,H^p ( @[WW18z8pjf)کWS V{ @OEK87clqaD`PxҞzMةjCdziʭ`6F~Q%/VW)?ho^w8n@P3lBYDzt9ωp%>DF2WhXcZtJ[ح~: \ۣ{\X QB5I,+cjMZy4ܬqV)JaBQI]tFdWW!k[i]0p`B&;WL<9،Ysʮ>j DvRXX%[N_5ZzNr[z\>t]9~mE;(xϡCg>t}wbc (4w8&,Brrn _ 6CaRCXAj`&Ǒ MX+%1~*Cڈw~V*f/j POfbfF@/ q\9% bŞ֐f}&[dqW˟$#F3Cx-Mko^F=z2N bP}ԶВ 0X!y&#{K:ESTRX;rGAw" xtcvE8 b0CHD%Q ڷ55}94qqEvR LĞw-` sB"X=̫h\h T Bx^#]qi0cB9ThJʸ\+*L]C R \< bͶ1MzSSadҤS-B7!K2J:<.OVlrI1m4,bv?>8v=pnu~QZ׭{k%uovH~-2GB!Z?RJ:j(&ñ h ͗X%AVFrXPb=Ss_4NM&qݎ xOg'r3]A.*8 CX>K>d0м܏or6GyOtj"^[jÀ9~κݽ.ovEt%vc54`~Hx.u,oibɸ0I X P! wZ͒Mygj Z(9j鋀Rm#5_OG'H_=^q`B!5VfF9<:'`Y.SEs~`H<#\% Zje ܭ.L8T 蝋nʱl] .RrDnksE7U떜I ?0ylDM#10=.ԨTq^X}0@km2hEunߚ~bqA{Hmk^)Z>!76Ř1sx=ƈ8<4?X?xFlc+^Z'պWEbP+!qeo' :eVJ2NAͬ@iRM[i$CԮ|媬[t&rF6XD ޭ'Z6h1d V\evu'Y8Vg?,{N|z+mHjua刎ZǮ`KOT՝em*V X,Ux5b:Rj^։kKJAV`B3чh8wL}1Du4$3VKpB&r<}< :/z['rԷO቞-H1vLQ9|iQ[Y[vjsF ʩ\lKQeh*sBj{ :%Lc1gd/ 2)+\s pGS,v"x!mڭIU;>no*~㭻;W]쮼onm"س%C-&!$vd+c=HxP;w+!fTlG!U\)"9Ǎi\ wrbo~!YQ}8<ۃRn%73Hj!*Ž#\F8X_b H~}'8Azff,ѝ\*|}'$EPK#$z)6@Y!Mנ&1Di%34FiD{ ȣ 3*PA=5eݿPy9M{7*S(zFƞyEL41$\4DZklK]ֲvf$"EH:,È>Y8Q,pr9eLRP=k΋%ĸ}S[̆Soqrl=s4&,jas\$VLǝtjh(E{Ľ!,O$GzR#[+bxQM>Og`VE6Gj gґzP 60*8&1[$ ۰|~S2Qǹ&/e6v6:y^pc's;\a\  Wed4@6Uk 8쁵f_Z-l V,d$}e4DTu] dk#K|9I^("BHL5ᰁy3/ _YVͳ=vFx;6Y`ֻ݀31gn}NֿF.sbة_ow[#1L+i dy~Ѝܩ1RM&=Hqj9Wt  Lpÿ*c(qط4ޔ'B@zyu(;= JZŦ5k^_Bd5τLfЙcN٭RT(pDtb라OR*@$ŪQ&2GIR+fN'lՁǎǬ> {x=*E* Ct7uR ҲᶲXJ@'X}WODu-6& R5kQ@27Wl\m*٣B#7EBm qO׋n*dqgso6Teuh藴u)є^]1k B"TAJ/Pad̲w2'gvs~oL[n3.L=˞w*5WԹ/Nf|vý2B_>dUXwT T3I\eT͐ǽSzR┤uF*KUrŷ&1d݁ckU yDur=1 vgא"1ff~jCSd{P!x+Uq =ӓ,S5۩vT 3|<+jd#q3b՛cFvO1A|þW}58u`覆$`OrQA'D0陳 e˹N86xk- I*+V[1J}ψnd9V\422S{d}kσMi -3VւEh;BAJrL!rnFu؍@c]Kcbcd:"KRsIhW#)3Gp#9Փd5!N3r};0 P>_Ri}kMx %P|UJ_:+Vr`^M7^Mg L EHP5yYnv]}h;U?T859If2ʃ"FEMzf]d 6~qMnѬ-?*l$<`>8/DM!k nGgiElM3kf_`zߓy90 RaȨrx HJ{aq:č2QfM]:qވQ.7Hof̍VIjd*)Ai跼;#.v.,.v:]7p~3Ыwb>Ӷ'?2,u.Yi$EyQZμYq30:9xU6`ҨDŇ;FJ0 SQDۥF=<3qګnLeJa ˅U ) oڊնB\0rfۈ\5嚊+ɕ )b`f |`Wb(u3 6A~oHc ״7I<  Tr"W>yPsGw 1Rj~lO%"04"bG"4ՑӐ=炈 _ak+ H $gu5qIYi8:gc(LKRrw={ qQKl@Zk 08 qcf ,#Q8-g"YZM:k:9tC_Z\y;ye+&bAR-K1'11M$UN:ӑ  %?sUXWy>,dd.72:%y` @L5W%āG m*~a`AD`"S x4faͶ<jՑ3sZ6})j"f?BzIW@n|Ѳh1 Vf횒(^ )fYyD\ lɢU*Mdm8އ)d->=\4C }&*2= rzP $@!39B;s@T7JNX1sg+έ;~\i}E#?~.LP;^bwdl'ff!c[5wyb8&]>2vuid?0N6n=ȩl90 ߥL/Іnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ME.svgz000066400000000000000000001372711221777731700221370ustar00rootroot00000000000000(zHcountry_ME.svgٮdIw-zP=`I`nRH@RA΂BUbOO/[t<&{۶aZ/}x×w_wu?/˿w?/?/~o}?O_b˗ӿO_÷/_W}ş7?oǗ?h/˟o7?C?/_~w/_Ǘ{?_׿z㿶Z~a]egWm_V_B?8QKR;Oo_ݟ~]lW×oOVꗟ׿7?䤗~o|Ygog]忸/o??__w?۷?yW:kz~<Xn)x1Ol_ <ז%5v_G/y/|ھ:nk.k}ǸڣTʫokn.}}[[gyo5vͮ`]LK_oj=Z/ke9 j`H e^jn/0u%mj [gzOe]v?jBf WvI?kWoka\f9ǥ}--څu#kv3 y}v1/d:2p[5} =51֗ f]ޕ=T:e`Ch﷯}p~vS妡RGc-C6=gZ^f_zbMyiDYW/hc60n׽獿ؿvh/|4AnB2%4Rz~% 9#k\wciuW'hڳ}k<t=ƻP~WWYX4.纡Ŧk `_Nb2!U-naX}ݟ lo=3$k^`[XXYІNJ-)km]k*6V~iY{ԕYcՉmj ZZԏu֢R4W/_Ga kS."DİGSm,5zh>Gi-A:5 cِ\j5F_L/z﮹E9n2עb.oqJkp]f}"75YIvWRF{\lMZ2֍[flکXJºfdɋ]ڗpbcjq6qـh9]xtևcTѽ7{Iq¹)(.]Vkӵm@hiŕ1غGc3E`c]l~,/{+gTRǩLDqU>j=mt}l#hЂQӔoYOjLuS~VSjmW[ު/QMPw5mqX: ڵa1i%բZqM5oᝊMAzty~ -UMLE-kU"+Z&)z]_ke6O؆T hwFs۞cѣ6zm/W-B&-ľmE&=xY *yaC/iPWe h.BOZumk^!gG遟Adlm5{o-v-­ sA\SԾk~7ս4šHh<ݺJ=mFE!OS"5=6UcDWFXoپ,C\۰ޗ!dؚa~JteCNJ}V̜e%wVVX:G]r9 7jToܻU|qP~(xkPZ96n[whvEіMp}/ #ߞyȶ]>c.L%拞zn'-g5 U7aߟ;s3L~n߽G+K_YsѬl s{SSPF 1!zzChsšaĖ֗ӳ]on(׹M}],{hWp$Α۷0Dq,:يAZSstCm>޾+W9ڹSY\Ov?~;+VK!oPwN.:)Ih~Sg tNϙ"( --hď"{wBC'sA_'s0+a޿}8DBɬ{TZ4٫Q̘O5r=9!- J ]_3B:u 4K%L%DN:ؕ"Ya8i^ד𲴘V;<,uf jKP0N~S RpJYuN|$vDMR뿭Q #}hb5wJL^wbff*3ҜiNcA6٧'<'zׇi ]?q}^9p`Wg2ڂ?Gz_= `%L[l@*L-ˏ?e2@}20ImK_jZ#V\G~޺]%$-%ֹGgW@(;m, &&eBJ^Ew5Tn4[U `b&RFfHъYSW:0 4QT͆)b\)bPPUGƏQ ]g6-!vUTxqM$Ed 44C mlc V4HȾLЦ)UbMeS5+[U9^+N*uB^ /)\Jո 84j,XTBюEf*6 JAaS%Z-2Dvx+YS;լuƋsE1 ֯VR[0mq+U _rr)^.){ںl-M'"+[ SRNjc*c->e?UVH[hQ]U¹yP[OQzE^!T$ TjpNAҀ30WrFU3R S*c~jIxOS Yg Y=㏌5irVJF[iRZ|eS5ZݹiCúHI!uKZNdc7ϓZ{d;Shi:yo]ʝ1^@ݕ#AZ:2ʤr%T;r.xeFEu"bh]_U֡e@@'Ӿwn *ؼ0ў9sel-~My4f"\x|42Wv$M9Ayuf\SPdyt{mI'abc`dZ@7YrRvqV}id _&qEik'^ _Pn銘 hGu~_дoJ IIqV ETARvhLJ68eoX=u:n-GKMzZe#VS&TmUgLEf_ZثM\}mulA[yS (U }+QY 9v]gWvE$mnګhLE ˽ԽL%{Gkmwmo@]EQi%+ yByʳ2z8W`Y0ϬrN;e!}e)7oFjVxeq۰®PE?/cĠƒ{=K\YkNBn*k4ؚżpyzMSH) {ejyn|j%,@kT$]W7UAfP.&˒Nl}@Y :6&+ '紺'SDZ5e0-s9U%C۶B$.S4 t5xR*f^aBYOgf4z8hDhTj`@ҏb1"cd7-ٷӽE^6S,Mv#k3O P^RQ`EdK$5H-+Uo`*oTC# guvU=勢Kdhh4)N&\GBRK9秉a,]_:lpOT%p`&шtTa͋! 4Ht-[&xC!qVU8\`I$_I<ʑ떛`~U5_ v]V-MwfaOv,,"h@_̘܃EIۿJ՛TV80,LȝǗ5\Af:M]c$0BޔTlM,z;$($^.˴AJ rJEЀE%Zn( /lCf ֌PQ\@ !ڒ,Sc֦2]Ɉ 㚠uܯ6\ij%؀$X\@dHe;%EnlLM@3өcCVwAl!dm*/LO,v7T)(8ƙo|7*u f h*X",\ƫjST+*:e׶$N=m!֠ߦ0l: aNOۢ*͆Mqka2GdBWv%}jߋX6 aa _uFX={˩ji,m4ɧ}_6Vߘk&<۠N]aSnݣݩg!7~]^&lJW͓NI ijY $LA=^plUYM#("JU[OEgs!=Z :zt hRP'3 Jnz4^S](Kc */>>Yvnt bnjV7dp&/ 6+znH`}P oM~-AH8Iw0aR+*(lo77o11 Rq.-C߇I V%u [ICc~TkP2Zs̰ w5}PV\V0Ͱ;Cs|zXtSD5mB:JIyӾCS6WE[8K&ܜl$}9^)B\Ar@JSV' SC 4eBwV@MK^p*B sʯ+Hrj|w}Xx "&6 @K2\XU9}oo7.+z,JHm4W\+GĀ//|c2>v"Wa>!ӞES5iH.\rbUbd<~}=Uמ;%zﴅ.dۉIx9)ü27xv{ݺβ8F $SSRLGmIz/U%d3)o&XA쏀DTӑ3ҨPfkHym7 P+bKmv#gz.rŗ>E}x0!eT\DR8A(tKp2^%mZ=+me9.UaDDIĤTN=iچLb\(yI"A D*XC+jl' J T"eǮ)lZ]AdUp:89eAFczmƛX=ӛ/7,w}nkRta# ߧ@B}Dme켨:' 6UOpA`μ9%J74u'uo^K傴5zu=M1k̍ C2ȇdD 4t2dM+^>{.O@upj< Jݼ[بR-u"f* Ѷp1Z^>5k" #s cS}oT^q,rVb@5mZ=maC>hu_!Y|;0j=1e)W|2'UU.9;B$ڬM*xƠ|v/ 6z "J.eUMlHNA܄4<,g"̙PEj(V)G2G%YIERջ' \roK1*:&ތ:+5;lB?jjc> WW jLZZ(:Y?naӻ#a2UG#EKJ*t8ϖlkJtOQT|@9 cD'nKIsgHޢ".hITR;$i2^fhpuQzV@衂"@8*͌hGɤBv]w: )qW'.7݈km/Ie&FZ:#BIM%!FUoH]e-PpT=MUlD(dՁ*BsSALk+M!l٨O߆'%OmI-ub{)} mՅM`f&dE 'xfISSDRd֎ʇ$]^|% ڦ`'~$vѱcY܊`2 oj0wfU(&M{R8:>q٧A.Yk7!=BrJ'V+1yֵ PGZhGejhL]`M!vmx(%= !Ϣ0nA<ldɇ0\[P(r)dZДDxKLG@ }~@uuuW74J+j3@.v.ޯ|F00?e˄ZR}:ߑZ-qRJ'4(Ϻ`1!̬.nd% >xM2HDupp/7Y&~$i#GpʦMIt/y=86Y.̄-IYNaQ[^0 P2x$cXQ -j螟6zs:I`u۞Wtl#.4njtm$*+A{z6O wҊ-t{Y-hYiOݤ)uKjDkEeFuЩ׻L 痐s`lXW2ɅbY&1믾)bK]]w8/Q`!&AGׂ=Ec f9(nC\ܯ vt 5] -oV=~P1A;Ľ->VQEi$9jOhخX+K z~ov:hqOOCI㑔VnlT͌{B\)''1eNM8iJϓБ6}uGcd?Y-"^>$&`W$\/' j\Օ7w)ond}r:oUdAYbu~! F26%,p܍w#!`yCWI]ef=$ZDí 2+PahYk$LFfnqS'Ç+~Rֶ0 edK'g3mgPIhk/1B휪Cm_SU>!,jo}][ --3&kOߡ7_ qlhuެU!\ź @ISvcV`!杻ڹ}(]aMBf !ZdӌJwdb9I1\г|/:Y|Tj"?w2Q2 P>)>}HFSgD0PJ"AIfo>7GQO-Ni|cgJfc&lOs[BǬ>^%5ŭ`SLR>PmFs@UD?N34\p\Jz |xdZ 5hIA>ZҶS̜q@d8Y6@mVC K @RpXV"D xg@~pД#GEY %ŽMTFdj㸑2.go("i9+zB3LMH41TkșD7qXcF!7ׇv9]"G2>i_fg_(`q"~g2nZ+FH!Vh(WBY/ Xln90jGㅆjq$οvX\{O$yj %6n/yvrxo; izhk go(]<< iis<c*p~5f6WMΤQn>cA{+\Y(ga,M(4E43MBmbhh6ȧLn=J7ԺTNaAߔCr+67b/$坡J!Ś-2}_tA7' TKd ~~Q'٧|mzhDV7zUx4# /vPmak͊L30n/d Nժˢ>c® =[z[kܢ'ԱL2MYkp܊#HAu⧰ܺ܋=iwrg}{K2ΣQ e B "2lfUjP~,gB/{wif72%]lpJUB=r燺;^/u^MFQrn>FS/ҹ$k͝Teaa g?$nYQC4Н3'qq5*ڬPsNIK8`sn$=w6Ɲ)!lX^G6l' zFôىG(ۭ#4\Pdhqq<)06\T|w(VӖ?C6l8/JČ%u莛JLBZ|X=(+{je@O %!ŗUUۘDGT_ձL"ؙe!+~NhSņsߠ6[52U)qԏ:j"G6f(m77Ϩ۔El 3 λ Li`nywj'10Ύ(:k (Kg+ؚjc+TӺQX6II+GplJ7,ޓxM+leQ+uv1C-!ջޯ;t eK)ґikEdDf[ s~x$QYdLIkvZH)#Oj5_F}r?8L'+>o> Rq"FH+u֢W"0 oY}[[PaQ͊M(Wي2T!S$q|ɶk{N5jOش ^Q/w$l:bW'qOu iGrYE8&Yӫ?cԆMw$D5BwcZihKAwFmӋJYa'RͱT,Rv~fs7w~Nn<=++-adjlGCI*2M]u_kAn6*n^vuIOߨE[;1RʆH&g S5f'R&-xi}~6 T0D K )喦VO}еc]ngv2p:W]^hH6Igӈ4dp6UAJxbj29jk&˃6R1rEeon%5}1 E pL.ƢlW\(=lc|.e60I;N``Rߐ_[LeLeQ3aANQlJCYF LLJ k҂6䘽`·i*٪7vXd+C&t.;c[ԹtPq(3*UDw[G} I1:+2Uh_E洖8z֧uqБD*IsH07m~?:Ӿ_βfn90vk!º|A$P4pxS)k[c᪼xJ4std-VQ(y~d/W sU X~]߱% JLV{'g]_]\7=݆nR˒( oj:j Z%N)QᏖcCR?*!tK!UY j+Q#.I:1X5߹_d8P%o(RADnԊ,jrBYH%z,f^Xџ$ xNQ]54V/6UxJ^eHvS+Q 6TŴQɈFIˁ0_ _֦{(jjC5=~ӷQiZ Wd"V]5u@.M9.[ljRP5({M~Y6g,lE@߄F+x[>W`J#uJA&[+\Bt@~>+ؽˈMlcXaGL,8ͻӾ#.}I690 #Uo F͠Iy9Ʃa~zn t<6 N @ޢ_~i+Sn ϡCvSF\$QyQ[Er'4+g'P˼yJZJ ԄJJ cT'oӕ+j}?b*t9a8섁iO~ıgN%!B|â XCcx?|;4aGS▀BX }t;d?)/JYFmyTvy$fE}wU5c: l1 ?tQ PiuҒoDf0bC@n|+7XŇon8#Vޣ S:&t^\x<Sy"u0j#E-9LΑM`n( ILI["_zddg7缿ewɚ`ùj` pԺBepqV##&!cCƳQ9|UX2HT>bkC$կB{)^e "5cf9}V,"O:CCnL$ʴ)y; IUMO2uGU U0m@i`IjL6>O".kJKǥJ@U%] sqY$'n8# V?u;=F(E(RLrr =`Oˆf#6W-#;)wK QTUL phĠ(%!I@<Q[u3]3DL$I5S`xH`=W}wnNfI*ZTy[%`u%g~z&]ukp SșB >6ke2r9WҌp~!BLNd]M~>-"KNti~k0!~OJm~w-Ȟ`׵ RPB͡D2:4)B“:&pHkF^#e'!}ᛢR{fNm.1FI'7VūD_w78:\X){2iDTee9 hzd\@9xԀpdFI }Ž)D5(eoݺS6Ō@W@l5)/݀5XM,^o*d D7XL`E5&e~0K`YnAAU1nup8 ZJ~ڹp0%R;&QC]\ɫ`srܜ ylSqP , ôaIBGa}WI!e &B KM&:M6 B\;dR%nl5q=sK@7a 5R:4u [E0ELiZc;u:i&(5Pkuϰ*6k'tru wbaMpz!XnNWtb_}B y$QIe5gBu>rBqFn_ʼnPІEѩi10" \@)ڝt u uѺ`(;N,9$sMXg_mP tNM锜E%5ka3 ~ !ۯdN {! lm8E܁g/e)N*jf5dFJ)FQ/QXP;R>0}GR; (9aNqеoYm[HCN;p?ЛfRd0G)N@Ot\}>K[v&%a!ğṾWL(dP"!r]!enZ]+ x") Bze/EBa^l YQ7"ا]a1O-.5u73Pz`Lf#Usܦ; I( | r#DP`F˷O}+PTdcl`*rA00q@ZLsɷ#=y*{RSt='rlå 2+Z-K 6q EYaO;t)8MWX:ARe׎aI=5CY<,'cVi|~fȕPkLp4ZR <ډAev7% d1%WIt <BlŒPmS[MR?GZaxxjY{dJZ>!BD%u*vPpݦ&)9G־E#bwM`g©1v l݂AD*ī'Vx}_G9dͧIm}֨UhTQUb}DFٮY);Ϊ pRwx5mOah W@ۡW!0`R2Q]il&什28 zfrfvʤ#~; jFbaPhIU+ԳWX4&qD 2ZU* {/{@T(w=By*]/]+$B}(i 28UG`" Ix;hpLEd5t5VŞ؇F\P׽onr #8Tmآ*xJ OJ|/wxͦj_.&uu_H1U>,uqatf$4%D[9IB^ț~'ҲqaanPu%M<HdQ)iNr:}[I}O. -[h<^5LʕbDUV2?9O sm:)h4 $ 9!DOy`61c$t0vk)`8nƝƊ7^$2Hn&µg(wL5'E>d>~~nh"jr&G3|alj?`FG2's2xAƜpk N8״ L ;>h-rcTd/H$9=$IwgϹ<wUAGnM88Vh=fzmgxcZvݦ*5$vq@Ҽ0/¥i/@aYӏOgL\6EbԘP2MQ&gd;`>Lنx<*oF v9GUNuw%Ivĕ{4/>"8]/{2]!]QlɒD]mXWѧMI|< 1^7ưb AnU ˆ[kRnW@!I<:خ w99'-+,u)!">2xA4|D .nΔip32RT@X9NMTE\uv0\#5۟߾??{wKm,T_}q5SxsWQL_E?[*/nQ6$IQҠrNnkA?In#(`Bsm@"ٳ(6Tqܞ0ҕxߙ M%du|L&0K+u ^*0dF\R%mEy0Fc=h,njK9Jfkg͠R̪n5| 1 = = HT5SRPSR 戧xo;/.FG:Iʘ0wVX/^q& GV#ZyW|GvV+L5wԶ"3ҩX| MSy{'N^AQqV|d-h6] $HSiweMJ %Sj2ALc)N',蕣9GFm*V(tpuP}EZwZQ9"YmS+aLg,|#L<55-cOz]+Dmcc'yN/:V8RJ:VƸfjh^ Lsuo\'qĘ2P><+(EKw7zs FG͋e`5u#rqa:HQPYUd8 i 1[>f)BTC(cQg"LlE }21"a(,<\Ejmj ["edn{IN sZ) M^{DͨOK$Hm2RIm~TUcܕST)%]:]1}vT.uN]EA>Lg<5U!b]l ܭsr`X21GTx)NmK|MΠ:60@a:vjJa%-NebZ$T`*<\@Zs}+d ۔u2QPіqqw[PnEJ4!xOmt@qZ,>=ϯFF埈uwǺi[Y2#-*gu֥>Q۬ӆY"Ɨ`BP w1&`!X, %i}?N"H&ŀjU lx" Fn; =<O.(Uawwme(wJ>`"fŦjODs[l4{s^i`PH# *{2hzmh{-@LFFu+nuAוǐ=#$7U ']Â֨F K:n_Yv3 NJAH8*; s9m/SIrDZ=)0*$6Eч+Scԇ6p"&&`"`U*LI:Zt)?4ܚ䰬1b)9>(0L4nw4]>\%c+bxD-VD_$ +ynݷ2xɅI+ ~9p#~ͮ{es5hgȎ߰hj?6E(I^1 UF"jc`ƣ&)T<@,ֺ >K۩*>@@c;_ +"_qei Ӊakw[ %e=٩LF FU}dpCAfOܟ*.3E|z>Cmpˎ>"KGbR?VYYY [$"JwI`Yd?f=";iqz 17pfM.hW%;ϱ+ #;U@z{n1o 㫂e>0:XsEIp4u]y?룧ׁ%MMD8&DҌ3Y` W^n\/ qbEADBlIĠ3 ҸLV I7 dU֪x3rh~3Uk&_KK aGކ1kWO&i&A}#Ie+UF[z- ԭQ#u+%)xtH@N]]hEjMk.f\Ů1 js? t-ΐJ6%_6A亍Φ"&5aQ/Ƈ:SqS.~O[,jC3>h*O(Ro[V1 ;afX.a%mKx“EgNPI/SXPޮ p_i_4"9щ.,~w͝V4wPT#Ri'ydW0^dWА#6!n;-g(vǟҜR2gh1ڧg6ER7Y?E7\7=i+WVQ+s{gpJE{ϯ>@JYibbI9˝\PŊ=NҾz*$t%=y2&`ʰfM:WE>G=^2Sl-a.g K) d\QdYy%0 S<~dNe"DҧY֜`]$.NU82%ۅ鱭(=d2vxy٤`r IA^*tȈD$KbLѕLpᓊ ,ي4O$OjaUQoa%^QU r! B$u+dZc(kMJO7@-|zoDTVެ*G;<u!NW7oD/x)(McQ'X0C1-({j9^o;#|7l´*;"kztR +2r1Np䁎<( 7=Wi &&;wjgͮc"_lTH}h^aYխu*LP4?=˷ ^Xh 3;F(rN H7S1ܧ[7ɀޱSȏp 3c͉iBW[:hr?HS^&CT$bxZSs2ӱ}6 {N&%OcnJ{pΧ-Pv.!{yrA,d\>'LkfI63)$Uϣ"PS5&&pY J3Ĭygs΁_; BLQ4d!i彥7 j6@N 8"#xiƀ# U]tTi٥d4%aQr2 >gvDEleS@,Ɂ2~p}3qSxh 4#$ <0d%2F:T]ZM)sBs 7kfأ+}`N+\߼s#ӆGb]#(4.+-G`e C!3U !"tUIay0$dk8V!lF)9{#Ϯ;\.G3iyۏCc[xZ_J~Qԟ`n5pzL'3^:Iw  \9qN>b<0)kTӕQtjۖՌp'UӂӉ)<ַ쉙h֛LM4ڵ7N6.u.2XLeeF^ yw}"_ݾC!SG}zJ۝s@s*"Uzm;mlO4=2>Te];i٩NE\]d)bIlu*tџgi8䗲&$1X߮(c\Teq fabXNEv+C/]VK֨s}Qqaɵ7({Ѩ}2)YU"vV7iBtKDn pV8mU~`0<#ݼD{IBRl3s5+y duqEv߫+6dT]D_kw6upXOݗ!n@dy@: Ytڪ hħw-0VLFFRX)IWkrvdU5M^/mrQ1pg^S0)\qB-YpD@p (G!2ÈeN)iՓYC3g&ð$qM ˟ W .猡aA \I+$QžtNAYTŦ5QԮ$;ce ‘h@!TFZp߱R]T ۧhOzR]0QܭZ&ދ 8з](WB wr:Y{b kP=h:EU6qw6|Mh)VcΣk(üYGQ Qslf AM19L]%%=K͠$(!Q >It+&%v+QSF6z&*FBnîB<Y[DWhpu&qܟUx̒#F> P/&ȩN6|1vLLYyaV**afiUo+'/ U@rRMD~ӁJ+vh28S@ij0QN~g>G4rh2'>ݯ;סYլ"1kG`ɊRHNi)LI%jnF(:2"`EX4:ňIM" п R5\Q\q8r6NpbRx n5ʙ⢗[ v^ y; 3v')~Z!'4Q|AKѣ@mmۦ|Č@ځ4I`{s  3>j=%]`wr3;z;boʒ]ˆžDfVCAm+ PU@psGtefD c 2D3Q_vp9>뷝 @PRd^ ժ]zWvJa@cb!v#rR7agB:w&Na1x}@CWo^B%sֵ~v( z `$l$ @Fⷓ=R/bYUh7YnP#Et)Hm&@W7Y N퉄F(In߁Ge efMT+ˀ$d$*Ь%Hl5tJcBtw`hW vc>lȹw/?>6[sYшs'1 eOFrӾ/xFp} 1pO}1ZSk D8oF &<$E {ѣg,U0UԖ]H⃋IJ栥=MA>Ft8zt׊a۾lVӾ6XsȒ6ܶ)Q%{֝l{> zq cT")v &lN\ HՉIQ,av"e,1 6RA ~;ޝ|xFt=ٷ^ziJ<6Χ|{pۼ,Ӭ̼wsZ3x;EoN?(LSLL9Y"$oZk: NBQސ_&-- &"b? Y0m",~HdXo ~]7^$仜|m'un1f}nBK;.zmYjOnj%6Y~"nr8fW//])2u{I y&'fSpern[Wphwzn]n<סs % ]C.N{OTa5ZB;ʱ~6| {74'HRjޜ!sٌ 55+huz;ua]S|#jGgv0STR%KCr"8D?ޣϡl#Y-'tp؜gsNt6HF1wf Jl51v%a+o+1|3?7^V"ஆƖjaBo./azi-!U*dvT"âyCǒAy4= Hd0ULѺ]f>ԠY~ZhS DVQ}r.%UԄ6bB?&8W}|\E|z$br>b<zpI<顣|n|۾nݱB#44Ծd/@!ro{~PM.TYd2v{"k k`I)6(Z@)h gFǿtT2rDhwHVTxlWr9;"Fr39yJxLڗgMA |xa*,8u5>$uD?j?Նac~л2zM*Ԅ;yjyKQĞm ɡtAS)IF翑jBIi}'g +m$trN=#A,޴|*"UtX;DkZ 9RPҒ*t;;M95\d_1Ƙs{/ͦCyɊ`F)MzhƢ6h~9JAHEY8@HV5OV, i+B1+{@RG"<+sUÔ(6O%adVȑNRLI6$u [>+%"u.;|\Yˢ.k,Q6 d2SdYtAOȥbúJ$ BI &QJTm>_6koSڏuKeCd3[-hn mmP$%_6"㽒P$+}Q ^O}xݑڜbu֘n< .}E&SڔnqVF62}KK׈S ˾݉ܝZ<0hqȈ,(*t$()aSk9iC2|\ЁvV9Pf/w,}x0)]P'#Gth}j&i[!^~uNC)pbBDZ^DF 1 qAWD\c4 ـc} |HK%UQu[eNԩw :Ip$V)֗%΢z 1}uH1XF T:Ubɼ$sHTNB:v-:_uml_QyU˧y{UkC֊λ#0^qA⃫2"q-Ͼe҃E%G@ZؒobPRA&Bc=Vp%] v~: } Iŷfc#Qe &Q@h [g{{Șao!}BZRT7b uZ̤|@ Tyf_rgȢ6"Xs%VIHHAN xAT΍]3eh!%Eaa$ f8I@q l|i :%p XWjNgTyЬXAoD`_ ,mCu5L{cgvܺ?iea@ugò>+Q#gsSnhB $}m)b6'R7Q3 3b ͽz$-Txaar*I<(M/ V{,(uxQ JBD(9գhӃ'yp\rW;cނl!f hpcooxn2*>jH~i'kFS,.^BD_6.NP17YN~zy6Va(_x =D*)ky\7d0Ӿ,8kqoA]\>N2|R#ѝԳiȄ|YBm=^31^4 ;GbWLouaz^WCK񓡃56:˧;,kgGRq <1jBSqVܢEIsΗ|`c޴w{X hJBsn7)&D9P:dt^r 9;>+sh616Dz TY8jqU@j&㺍RƊii[GI-a9L"f/n;mR;c. ~#a0T`DmXqs<{h ԟ ѾAD$S\Mtb"BwqJ:j xf:.BNR_ ӺnĴڕo'WS̕C\rl&/=@s i|I}Rx2 xSt^˧x <%E*ps76,d:_t^>ٮ90zl/Cg$ɄhdznܬH>Je8In(KX&dmX ]{1( ٮ3<.hQE4{  J1)*cS qae^ӴFfdeS;.%Lw(C aYh:M)ؠ0U氳i]&}Ŀ/+,.s۶2?)l/PN!4ȍ1?|mP.ykM/NBĐ5pM@~;쓒PFFauqA& g:8P:@B'[HP0UY|>^@|Eji^NMQ )~D7UãF󚄽nVMݻB/LU-$T8WpPdŻF#s܀ιonEC?' tFW8 =(k@{cbha0w NQv<':l( [9Fmx|<+3FTӥʚ= <6Ů iU]MFIseRav (ss]fKwP*ewV&\-03@=Ȋ%:UJL見hN<BSW.=0Xs !10#C11;F<]H]X(MSAd*Fa7QiYKe?YfiQIƮEP @9l9I;ՈEքL4gd]4ZW;΍FZT³IG=@h 5{RߊB;i+yNw[tvB&pm Vw4_> Wb??Lӿo~01zAA{/jN1 B9m)Tܾ vAfæBi+r*4#_Nzqퟲ D8#݊ٻ"m'yH)ta~ ֑SF rcѡPÄ)rz,пrd:.b5qėx;?l$*>ԁוrJy/q/,1!,\U\rEqd@ fg#09NᏻR3F3I8:0+E3АDCfL<%DtB"4(7k`Iӗ2ݶٔ(ѫ|qhM6l;0vH"ʒ|=8$&hyqMcB;L6sƧt䓹F i*[WB5S}OӸ$Ydb6L3,#ļ>bqƝn"o b0*cPEmeVaj,[ Vv#!Z4X/mŘ%%ƾ9v%*`DW- ɞ%'6ħ4C-=8a& >ix n>iN P63&ClG]>dMÞ .O~,zܫV,i&JD hT;N-j@˻,ne}\l𡟊'ѣ+  3cZ27}et(8̞p=Kރ:ka$QMA/E>$ }N"&Y B]"6#kC[/zb/3t&_dYpzKJL %6.*m;XQܑz%-ξmӌG,pM+hf` K&t{N"~=߅vNY@9S$yol[PoǨ!Tդk[L@gҏ'p:ĵTET,!<}̓+ne6G8[w/T@<qWhAC;ډ"Ê^1Qʔ؎Y?,C̓6nVb7QqRDm4@nj; j-ےLHWtFBVan~Tv,D)ǡfm%(.,j/H}=<6f_^\'ؚ 4nש9!Xjt qNjx!6n)הPQebirQa*Gxcwċ$uٕU-Pĭ: Igjv>(^.rtkFY6hp$ 5 Bj',= NBXHJ)>*g@zF,C: Tt:3'<,Y絃j2N tP%|ݵQaiª™Aue. +U·|e.V`2(Z#'iHU٠@ߤbGߧ E*;=Cm)6$"i6^Vx]C͖߭g.hY q EL+V h$Ri _aHjtmk;XGR1Su5׫wyTJ^s(<|;@\\yA)!l5&8cҿTTH74(>h'PuώX)yE]/o^!S1UVD(Zh)B/B& d6V&<w0;qzu'Qc5Y&Leܶ憋"epdONвeqiMr>iʫu)<߰ Vl7uv͆Jkz6)C=-n&*vKЫl #nؐ)MH%j~>5QeCA]vPׯD^bFpֱoc!t}bhlFABWlF <`|thVGVNT AQs|?F]滛jUM\Aggw+a?H4"@LHewWP"~g2E0[aÝ؋Ԩ"g2e/4ZKmXa뭿!#L& {C;,Y}7}8]mkp°m$vN8imv˥ˊW?NvI8Hˮz1o"-QAɮ[%:Ԇ?ti !c2e>,.lA{Wca_z=vqT_iOWHFݔPu6ϕ{~;Њb~±Wuwl(>YjdE 37lFK՟\dc_\B`b2{juSQ+VKs戙e@$IOf-\zЫ&!tڼx6OIqr22 SDHn y(nn}ϯ#*A˙Dde!KLW#bҎÞ;'ĉ2qybp̧\J\&dYYOv@CՏ -yRKdEHj[U/S2CΊN #9K `LkH j&Tw$ /}ۀ"S Mح)K!^cU5+ β II5R_w/^ϡzLϊ1) $@JuӒ8` sV;|*o*Oy}M@TӗGI KJ΄[c4z^R|3#&F~㈅tN3S2drlNj\׻{ ٛbx{G9kker;+T #@ٓ+Z>UQUh@>EH["N.UzOP]kCnފZ:mYz`HíN(F:QqtK~><2x a;ϒ1`@ J1]Sƣ)8Zu{aln뷷4_l$WC^XrH)qjϹG #=AQU v k35"{n@|'U?];S'<75RKD$hQé0*Nh)m:Aڞ~\A7 G_$,a7iN~O7.3Nry Av'w;*3qa (l>2٩4"D20lK/;]l녖^E$Ye>T%,d%B'V?],a6 (]X !/Gd&N9GϥruTi>;!"m(:'HgP%C +#cvݥMG~򻽆5a;uF 9u꘸PMA[ڕ{Fd`Z{ʣ<4v/2``ӝ"OCN8bT2UpS!6)y:ac--!%'!a[tTWO~j]",,@@j *u*9a-xH 'BY]z;)]"'ǃ# OS#?t6iVCS3BNCdV-B_Cyp_w#Ou"{}[SxxWt&ḋi\z6׹h 6C<=P|jڢcB &ip ؕ2܊g[kNPa؍wW@jf/+Ќ=9䂐JV!%ڒ?Ke/ ^nEEcR:YVJ=>RXr2^zM?Qg)8eUn **yN85kK #FOI}(f+%!n` +}U|zxwF-/t0"ͳl!uysMh0v(?yE;:=F_5Twm +ó@x!S[XSw@(G9V[gX.rψ=&2[49J[^mՆ岔k2-z=wئu2="Z,.ĵc uмntQO^Jbӗ)%aS[ n0sU#ⓐ\3 J^9]l""EH񎬘6Jfo.nWRVvlUң+E[K"āDֱf+G'U9) O KHU:GeI{Dg6k_pO,IΤ 07մu{oHc1t];l~UZ$cj` ^uQR-Yj^êo7=G$K^i ^0I5"hő$]^<0wMXs+yܬs~h~4zl+F:s;gn+şz6UT QAF4JsS6|4@7&dc :,lBpcj$cˉ@ås*V-#- z־h/M}e.8' dFeSK *YP@$NEY1 nMH _;FE'_OObcp%!Pĕ#$IrwsK'I;y am"J}.nדtW|GKP:sϞuEwe\(`1~xQeOuAIVNb}1W 6|xs;iLF2NEpKvdy@8t?05:S6Y'FY!Iϑ0b LJ%2 ? 2l*=S&@qLv%^ۻJ=%zɪߦ;':Qzd[rSܓVa|>(OE׽k/W^/W=V+ÌJRӔLE|'ʡ bJSP9=&<\sJyکwSQyK痃ԖSH~xtO D5 L^sUzkٹ]I&i(_"2WO]I*|:|R5iPQ,ճز*{*4 +wx|s7xM.Z2S*u_Om4J^s@ZF_Is%5)lLhr-j:GD!FN/䐦(N(cH ;(ה|ddž`{qv?t>f[ki߯A:HÑ_0TS[V>noIɹVVXT.XD o`9jgE0m&ᓢB.TlyIh9-- Q)eв|D"nm3L3OD?2a2Cv;Ơ|9G啳#U%Oϯ$:_C/`A:0./IUKd4*E1r:ў|"A$(0ظ hoz?x5S`?#Ϣɨ媃A  _ffoI6nZ2O1)(**]XǺH?.{Ppm 1Y1oqp:@ZU'BFy?5g.xf ngv|ݮpب?Y O@/IO*'Rl@GTS :&2Ga{_-Ŧ_taL3\gn?Mp&;ۄĝ?q8$fFȼ5rר{akV(#&Ug}٬j矎Aa8EO`󽟞O˕/F}yOsx(>.s1usy|;~x%Χ{<a^nXnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MF.svgz000066400000000000000000000004211221777731700221220ustar00rootroot00000000000000.(zHcountry_MF.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MG.svgz000066400000000000000000000003231221777731700221240ustar00rootroot00000000000000(zHcountry_MG.svg}M 0qm?4u t-ҌI% ި o7^. \uG W:-WjHUK4!tbYY59,5UH\E::6$FcmGMKF16`(~X/I^DGC[-KTw8Ynavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MH.svgz000066400000000000000000000017511221777731700221330ustar00rootroot00000000000000(zHcountry_MH.svgV]o6}ϯഗ(^nsҡ@]a^Zِ8ٯߥl1f{_,^qtvvSI\djWe'ه׹ئ5ljI֬W/οizۻKw{fʲ(~UӢ`?=#1;]v[Wz_H!x96  "ˮ̂_<<u-&=܃/I!Z,Ԁg켬n6a2V[G|9{ hnKe9F9HVZsْC?ƿCU݌oj_,k'#A BAثC2gb FYQ[ao)O4#C}Z;A(rOXpEb32JI\ a9YJRJ7˃՚l "^ŋ3MJnE*gGdKb@9zg \zˉihkBXHx jĀ^4^ts RI:՘ ҁHVqoȯR&CPb? #~KeS[K{S^FH4(^SxtD 2\!XZ3ð'u=Pg:iSe~8=țY!oҿ1c5Kf(7E2Qd̟d_m{]լ_k6\`5;F&H H(!D9Gzi<'sR)KiyPr^K9|< q9 navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MK.svgz000066400000000000000000000011151221777731700221300ustar00rootroot00000000000000(zHcountry_MK.svgmk0_p`0m-k@ :UGTɷ$g[ؒ7I懄57*A4$t.TU\ӓ,`7i>LUUPt&Rf B|h <$nVB~@Ou_nng#@_{#Аb 6g~Yŕt%{6 navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MM.svgz000066400000000000000000000110131221777731700221300ustar00rootroot00000000000000!(zHcountry_MM.svg]moF_|i$5gǵ&bbb(du+$v}ΐ(Yv 0SÙ39s_obbq9-mz3ZLFrQ\ ߜO%VhSL:,zY wwwnp.2<<}$ &^&u+.U.oW">6{&WmRTD!C)3>[߶B!z~>[$1n{gE^ O ?q흉|>7o3Ͼh\)lz!lr1rOXn6\_ Bb rQ-ZT5\j-c&b|4hq3Z[{^Ǐ6 UqN/6ǏϳI|].~j|=\#PP< Zt.k%>Q{a9:] 䱛%`m*>/դX57Ƹ[Էx퍫g; f>KYN)"6ڨhUR\( qkƷ 棇bՈe2Pdִm'zA %pey 0l3̋Nb=^͖nEfXhn[lt>/]`ZO7ez+=ֳUm{{fr>[_ߦ~o6X-;W.haS78h^\&rUN{@y18/Oģxۡp %Nfy?b88@}c_śh0|dGb +`?7bph1ŌE\Qs;0m!5G_߲X ߵU9xĸ?2z]޾js]Ǝ[[a>!^M]1b)Wɬewabр}S.8fl;CX%w\M;p޽Wכrf bZ˫uy4mETㄳUcSlm~?5=2+8k<9p[ώq Hw<?__ܿ:' ] ] /oOÃhfz19W` |4BE ^D 20hIHJ6ND['2=ضᐵ;ZaMUTQUs=8# d$'4v^E9@rWErSu*URbQn"%鎴vioA,LAY]6덳l6*5ʇYg!#:;F-u`h'm֪8f_!?^TM5+)\jջ痱Gԁ}v¶Gv7e; kkG-Evɇm:A%\u,,2r ]H пдȠrr`{iQ.- I>%R(lRiUMK$aFjQ|x-#`G>TI)hC<0t40| Op+~J\aAA``)s E825ʠ7,(ha 4j=%@9d:ߜ+s'C>p),>4ҲL) k볦R#0ۍb:GO|h- |!lYE#p ^`Ka 8 zA8М/@& \C7A^Cɹ,Cp 5}xlI?}A<)Dc!='!^='Aq x]7> a0qc`eoN =(J9~o4yV(%sg}oN@lI=U`n̴]{uÇ 0JF?q6|NK4v}SO܃фW˂}\-&Jbɇ 8;Q:'SEec \b"¯sm N3.=uvƁ= hTsjV_"fDdpJ!5G['HuQL TA9-Y9p= e OॏT7?0T)bbݢIG |}Q6YmS\\#pA&=c'!6\XL~5H =ѵ뚞A e^"]nL,- JzUN$L+d/ؠR6AN8s8%4N#5pLb)YF!α!)O,NUdSie-5h.gc`K !>uH J@s0~!? |VA.NjK ҪX72J)OSJ/rLBv3j9`)&}ߎpҐ࣑NC3v"basi.|^օ#ZHX) $q5X 8-DMciY?hࠃ'72#N!\T™l7J xFԭd{X+렋l&ܣe.Aux=+EAȍ"j !A%xv㟪~lՏCS{T,[O8,a> %PX>Sb #իc7Ydʒ@"* JA@QRWZ)dg`3ym!by!>j <2$MX 3r!BXxh6VX> AK ~0N(]>A' Ugь cbXZOFBŃk\MDUes` ē5AexC{"g@I`1ϖG4U._X"ubrbӅ^+H11Ot(O ~6w, KF d >8TFo J4/inD<ͫYH72OslQ{a`H2q36{ sqǠ=,23@*Up<$9|(I#Q6:7Q) `J?1">I3V*Ymj})9oBm$+aCz%cm9ӵuR-@hYL9% =')Mq8+<|{#*)yW#=oIep*,) 6N- R ަR*'ɦ/m3E"-y!nx>ogXgo ~v);K|",:0_cZT+ޑ7N)Cq 5@-gc_~ .?H"|<%""7|;6U챿Ǭm{jR\J`gdJ&>ZO+ uoRPld]m.<|ǔP} .RcSl~{y=Wwǒ$,:^rRcvr'meZxWA+eO*3*U'CEJ:YL\͹&%_E,'{s*1۔t4(y9kT~,3Zy$V?"sΌ@l[`=i&;ep`67Vl+DDpNJV3܂_ن}7pXr[tDd&$fuC#?H&G6GM ;?[vh'5ŬDd yGVǖnD0'g۞̹/\uzwxp)S[N4pg_rl;l؃B/AA Ҙ iN@ȍ7:sC[~BBXSjnd_zTuP,\D'He7(vh-ci۽C{G/t/pn{navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MO.svgz000066400000000000000000000052631221777731700221440ustar00rootroot00000000000000(zHcountry_MO.svgY[o~ϯ` *~QC-EwEMR6YtI*xmKќ9sW]򥨛_/㋤gU^o凕_$MtWžZ|V}]m'DzK~nHkۇz}<Yy]IV+lܾJl&Ϯ'Cxy.v}o`bѳXܰhCulYUD!5k)WX5O6}\דS9_n6fxQx;?N-^l_|.Wm>![~w}z_4iV4b2otǻkw2^@ad<m:g3z*2z.S[tw6{1\isѶ?.>}(m駧e5~۟@h!:.w*6}ھ+ۂz!OH#DɳnGbHփ든'5=ֽ4)"ώ>N-.cś3Hܥ@^KP\MUE=\gYk?+"_lg19UuOLAzcg Cn vIbYŌyx ڥOE=K.$]u=yև3Uzl̚;SH\JT0n>QV0KDiǴs,Pkoe7@'9.S" 0\D*Ǽւs`E z&q::0˥H2@_!`e`tA Iv t@L3V*j*44JK9H [J2Dq˸02ZÄ DZa GnPn ZL`/kvLBd- 6J %(Jk&y ?KjoAi LJ{9FR0 6KCX!z[H*)YSX}i!- ,s6" 89lsCC[?0n-\)AVZiƍP|` '`(h8>M($tR`m`$WXE@B 撌)G#%Vh;9 ȏ3}5{N,9XKĂ^D7Fxgxpc|~&LA3`I /Třҳ2=`"̐,d$Zl VSjYFZ+˧RBѳBQ;QDOi $-,2'SSAI%TNKVPYfE nfAB9vY m7Zl7_,3?r>R3!^]hvPH*kP>YO(P ca@eCS3 c7(DNR9|C"PB'@@H*ZPo{b$;X:v;>|'Dj?uGjڴng2}>cIJ=,Ou4$h6Eg/eSޔ;:įm^6Xp7[}):玠5 t ¡~.yazsNA7iSXT̅,V/ݕTi3cyڳ6d{%AXQ(XN0b>D` ;u4FmMUչWgV3̯>7c~[37.#2ѹ5➏`; v3oin™v uL V)ژ q=^lsV7X`1<턋a=u-HD_Ȉ:&v >3Kya;z1Hvs㚈"":h&L^aSaXqԱY6k9(]c O4"{hrwXQѻ"YT#@˗64);!mVC(g:q,iHYҴ,њN hhiUɰ 1d1/a4q2?e9(\HO?ko߽xdnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MP.svgz000066400000000000000000000506401221777731700221440ustar00rootroot00000000000000%(zHcountry_MP.svgԛ[ocǕ+8KaSu(dhC0`^ lf&}(`6XUewU^Vzysgb,͛^\/n՛woz^Mⰺ|^>L~[M~pl}ζL^b& nW7wv6zy]}\mK?×?vn9|~<~8|6/] #^߿u2 M ιK~{ڣ;0A+3o5۬_ѯp}YOV}jXK͇Û̕лIo.hßO\@Ç7a+o. _=|bVtX^M~[~݃N.VWx<Խ$1B_ X~”oįWv5(^헻}ӻGqZܜʎۏLݯ/qN.WO}0fl {חc>]'_@ٿzO= mH; 0x1{hCK<~2v|ނg_vX3]qqx(+'>p᩿pꙝ3h^~\k_?j';`j^<3~O]mlu1/OB=_׫Gl_{ÏOc %5{ ~e ~ՕWUni:b}]][m׿vۿq$2HgeW[rl7={4[>+49R.M#d>&ͺoX㬇$:R!j*jKOcj͓v%+$|>:*t︞1YwIbtN27=14<5f>k.it)DqeFD YM1I)a/}*K0k1: 9G ]0 )͒ǎ& l2WS$ĞO(oxٜV8IQX w]Ygalv5Fd\*zmIO%BX7Y>32##1#WGzEN<%uC3>Yh+Dh^ݴc2YHܤhӑ*l t;gK֊ܼ$#1ZFiĆ&q(%I٬J.8#zJ2!5߈h>>NT_'6i vĮ\ȎswPkR_Yf4eV)f 5$0X:V4i8sdiB-`sū^JÈl>>/Z7J%qUk;# ?YT`4*j<ؒ#)  rq9pF)"YWn| }4K 2bfQA0"܄Jl@',*Jgpc8>׆n"VĘ@qޣRB4%dmi|vL6+."eIoMpJ$s]vQ c I*%FdN9x"ӷCmqE;بL+X& %F2E9Md$'suDʔ3ҊKԜM8+Mq.C+ @(8d|>{;NLwG!)1P9AքJ <#q졹(d"vD4ef._V'!5w`].:qBb򵉨1UD0%%* dFPaGr*hD(djB{xFkI$+6!h@#/_HE(;98#;#Na $$Aeþ`|.`=(aGV.5a;n!6Z_>9~=2OQő5BSyبF*#j%(&QT+G'&YɋQbd jCwV hA;`H\QSn"Bqz?cH`aOh6I/cNC ̀ @K :2y|;Q~6!bsiPS>EzaT\ 8%E@=VW8*RH DK4ByT6I) J*̜`:P,6J2@5%W*!uB#qD%T}x8՜*hLE)x:Ш<]+qji t%8mia"t%(9F"9"-$dh<%8tqd"n^<:.qZHl"]5Jt8!)) `HWwpҠ58Uy bSTIij VH2iT6KW5XTgH pI!v"sT6a$6 l-"TMJMVךmȶ'B׍bYQX&=\_)Ba-$ ֮ӤCW@2n…,ro#GWrڟbrj=}[G=yHcjxEut}w[C4اJdu84m,<CSF)AGU0;$티n9gk|)Z6Y%P*cf2>X~JAM1||$jUak2f;YP_R9l Qf\@*\*2#i[mv"ś\(ñ "*|[߸߮7mכ -E"p?Ὁ'Yǭ@T$  $*FlߺdTG$k68jQW \t_7?z-6{]8~ͩ?}S|ꉗ\*&Wo9}UUB N"<3"J 5D"2/2%,$/Rƴ=Mݬy$$f5:u#kֻ,TąTs*pxR6ώr'Ǥt~V?1`]`$Y3A(LN] bsN((Lyҋ D"th{)z-$M@nW᜚dZ()GE?}{\]t8a>,&lvhɮ=P͹S&q&ͼyv+!b OWpUHV=[P\-bHD.h ؙ6$uEpPF(`(%oV!QVT|UUj&R1US{=B we;UGA" 9X.j9IA A^J!nlmLd~s~qeگLsORNcw,k&c %](Î'jҮp"1 ~L=RxDݹ"1 L5woIfvr@VUZiT0`B5!БG,];Јś'e^|iea1v5ɖ"a дE̎}>2H5̓ umHYY|j`r0 /.rDl*'ts"r&vi:vɥ:$TΎ{5+KR]V6B2TQ6Im޼I [4 05q޾d=Y8? ?/_, sY!nl3 S2#6(uXzғq<ʚOj6Kp:L}zlճƺYaIִ{#dYUp̴SiMuFϪuScK")>ŕ$:;ʐj:h㨚!T YS֢ ܹy m[.JR]m3E*u}zV<&)3$:Us7'δsR!B%MsEr6rX[6E_%|%P"!ѭC(A zo]M! \Qq_TO8:rMVN`="|CI4d=9ғ]w]1v 7ӵ-^]!v@[9 idB:61FQ*B `ߜOK]u1=C4`Qt9nI U5r$bXv躖v.uֵ%n/ռ!̐Kw ScYWQWa!ҧ%P/YdiWNWi*"5YJIP( If3sCz>WbΝ+G˰&C19)$mi5 |+yYXҞ>NjEzݽ-c\A&uph@߆\ L]*\+?+eq|9k±X2W*5`#}$Hq2cL)?lN d 鴭io=ÊIrADpF8/ k iS6`$coht$O"ɯ#y:`!FfTT)_,V_pJMF( }!'N<.Ш0sH'rdHAZھ_9 U;Eu,!~wJt&,R녕,[h,5)jDנIzkRNw,d؉EkN!Lܲ&J|-89np17diܔWMiHUcxdmR9J(dDMDz-GuZh!}h JpxBK0(ӘT:#CydenNDئѨp*-&߸L]Pn+9Es1Vbw(9?lҒW9YF 7mjlE^+JIğzʰ}IVSs8hQegbE`я ç9ot)nS5`8P$s4?'( vzCSD¶IkIJ.W1$_7AeePr >.câ#K"b<ue^ډ-HkD&Mـ80?nY5tտȎBSM+,\/ .G9tQ|a\dO.UNЍ'sGGHq8BDz 2*Q$Ymi8X]YgS׻NB%7D,HY-vQ˖2\)cjLuɰSUlɡU%eh4TD!dDx@b?M1PkV5 jeIb8' -(KR\n v)ԏ #ԩch11Bl,ފX `IHc1Izne©sR\(~^ -PTl[VSnSTLD9Wzš*%qZі$fi] 4Ddw2  [⦉t74@InEi^Oh͗]KR%D$ո^):$H5̽u]18H\Bø8ߢb}P9Ɉ5pi'IƗ7:F=^q\BUmYw9 e*:2Փ7ljN}J xzvr( Eu4e8P-av*0Л1="msѲ'۴-80VN>t"̥Q%3-Dybҽ5\K3ExVE1rK3I$7tQ?a)+Q+V2ggix!pqacp٨y!ɹ^mQ։uSu"֑ cJKp⏱\2+$d,ݼV3FN|?CŠKND\\_ٷ/ wADZɲIZ~LmRo]yJPdo]on,:A,-"Qev@>(j _l(JWy]}#hO:jwY >Dhvr HL/7~`8JvFXU-1)OdU]6 Ng%p܅0Y̔ď ˝nֻMH$%k1z5 ` rҁ0@9]]'MԀ@+8B}X0"JZ t;I[+*j< iXR·Խ7-G 4R;J[MJn'x_` B ҂cPO;h;|FՕln4|;hm$,6Sg [C0elw_&k cHYwf~LH(ۤ;jcV=8ЋK-pű}|ؚ_y|J˲f7Ca!mfwWդR{18KxFIuc @ya~D& հ)J U lvb נ`:-5noDr.ʰ8tNsnu~wU`Ru1kM} wwl77:wă|b0愌@iI(]J I?: L6e`N"U3/T։+@7$y;[. *q9x&g՜灻93/Dcvhfҟg]m,|wtWmtxg6e׍ Aq0jyuH'ߥK$|T^2.*p,S?cf#R\tj$ pݎ fV)ĭQX=N-Zs_\/־鯩Y[D b# Bl-ɰ-MJwKJTNeWqx S*J~CsVIJQ4La\mvԌ}j9%` ^㑑ӹ}ug @@4ܡUrċ;ՄKl>U]w`>3O=oP*P//QAAQq+sevKРۊqv4P QQ:`1wFl|_Lj:pe6OZ{պ w/F:/"XW-Uq 3G2DCL,6ّ,Kv9]?,QD|kdnF0!ƍ^[uzʺC7Tӝf.f^(1g3/Tw4k5s'S/4ѥ+0D}ǯf`0  Z)xRHTJ3(Z uuw ykݝݓaxK'ȝ6rm32Z6%֒xT:6C#1 cuΝ˝o;dH``LŝūR8.-$]l>ݏ>czH5s8и젎bU1,j(ii:`Osrgy$bOAEH9aSz tsg@e&Ǵ;s>.sևbNmW?Ӗw0g͍IV|`lĝ>OtKP: Nݪ8l XyyDy:ÛH\X^h6Iq4RGugw|\|0Q΃ܹMAu.*@՚;w>.w>T(A<ܙpd5c0wҰ$oDKPq"M{׭sEcɎ׈odc6޽I̝!~1-tA'ب4՝?(.*29q9MrGЮCOct O~ Jӽ!/=w{qzo5#Y;6jѪ;j< #$SGŻ )8nnZh|F;Q߅Q3Q.aR)Hdq.AC50Cst\uiqDo͚W$]ZH79F{=j[5krgH]F(w+q)i|H嬧Nu^!UG7GSh+%Jfc=G( %p$icYiZd:c7:#{+7[BO -% ]`ic~67ii#if:p3;1$ZBJKL"nF[amRttaZm< nd|^=V 1VLigI/tG*J9fѓ^z@XEQm ;6*l;1o1hiX#xYE.GK֍f. --H9]:.;쓙tE**Ľhڗ[IMHu f?X*J.^1H};J[cD |ֱiuF@!;-#bKr x9QbH"T"Nm)/ЂՄA:U,3E=ejKQ㉒gڛȷKYoŔR$?G_) f1h!㢈n"鯍kI\Az҆;\Jd{czshKn4iqh*#hoZo䳯q[z7w<݌{!+$Kdƭ^ni*қ YJhpP/Ϊ^&5hyd^+FbhRYЮ´G[M*%RT״NDHvKPhaoױj%8$_shRT(ЀJ3C M%ti3*Ԕ(R/41D .wBjhb/&:k( Ak^:$lގzRkr#5Xfzbb3-ieH5(vJ]E+<~m ,VrG[1 > 4Yzc11yoOW4B7{ c32- P%-x,)%Qeb.e)ߙ&H9t7AVLWֽ,\Ҙ}(څ{f5>LfZgBӻ!VwzҍC|3j%t4;8%XXgj b1jujw\96;-OfvP.`56ZRt e6_*hJc}52~7zB^8oWV6Mhfi.iO?QEWϢ$}L\ e~Ag{Sk(Cu*-np^ KsH HLu`'neE#cu>KˋFAp@ϵ>>wo/Eccd!hD4[6ao#<}D`몐־v%oehV8٥ҊtFplb,t5ڍMa2:'nŴ1zED1,flu6QZ0וSNu-E2.dq8%pw*اhL򹺁Dˈn!W(Ů4VOPr!ߺw NmM/K *!rۍz2hh%R(M}LϚLIeI&XUˀFCG^)gKZ%:z_HGE-!"}& ]K R8+y6t |hh4gt?hWR*ɀ1tq6LFVZ'utMISlBM!w91%[usM>7D.w'IvM؍E|2iv_ Gnlߐ5:Uҳizs\nZ5-ƞ#1hcu3 2C2ƣo vG|ِ=Q$'~;Jʮ=$ e#3/H,L#lL4ahR@ՈEvK? 䨣?dZqU_!%ҝwբq4?q5ZNmGӸ$vbێ{lhYxeP6p4ʊJ &!=lfνhn0v2聾qZZ ?ul9iWu`j8w,Vˈ3㼌qymNF>zrrrDΦ;z)$Sj텧i]r8&+G8OCpL;IQZ43զTиv֑Vun]4]iAw}i^}{yN=bg>Bz:LoLӖǟ ?d~AlAOT{t<LgvVp}4("P{>?%T7o߾RYH$FѴy <\߸-u=fu~n@3rfHe#ElˮL:vud$!PxH{CvVl6KˍϷ#YV~w*GYR+X`^:P!#\DXNKѨb_h^*u~ˇB'uIyA\D*^ f)ezyAy5u^+U|f nQԺDz_Zqҧr.(#N.3hO{duh|x}RRRG|IJqkL{z5ʗ'Oyyfۍ7<16:XWTSe"kPgړs'~WO0魼zߕt*FW\_(CQQ_}tL/|;&maN|ԕ*=9 S /)3qDs3:sKĚOU7^io_MeFq <ӓ\vޟ[mLbsElJ#8SuVRjWz"b}`P\s-"E_ʼnPKic9B{:LN{;O[nkR .YbG@:|s$.I7Not?2?=pJz: /4rS]-ۛ|5M{%e_$et/FHlTഩB'48w5_7Zhn(PK H +O?&x@fKV$ˍ~)d`PQ v:mRIpf"q=Hnڟԛ'ˬޜb,&Ѩg*sKVb8*̧) 5RI4$ Pש`8O~ :`-~ʉ;OFwb|Nx:1"fiGn˭<U8dZ&m@4֙ƮS{}$LlOӷOT8 ~~cs <듧ټq3O[v{N ܈OiQ/|22(H;&O[*\.R Rבr Z2Y?@]! `a E' ^F҉Bb}hO'hFDia8~m1ǔ<}͢.43TZ\F=wU )Krׇ݈-gʙAzlڰChx<uUiDEĉ]uT~=9$IuL{HHŨ՗iOx}:ㅛ9o`lF > c3J6*9U.phk~#KgZ -$8ț^HIbyίs]B}gy?mɷrXI>q(5R6k$?j.֘6uYWWѻx[u/dH PS5®: Oge.({Y(ٳLB:#gԸImfdGo]xG2,ѺpxGuea16H.Jx2!F,\%L^ڼT֣aeWҗVwV9R|Nv!jieO5|~@eԥfBmIowV> TӖO쑏+:EA)MXS}zsgJ0-\faɆ4u^Iv-[MO B DB2+]ӪJv&NSZi1dΉ~3&BK {)X4\1E_WVvA'䵭ez\b9e=C=>uHHK{o]}K[ݺg7/'LaVI u;)-!TEdIgb PL1{KKkm_hkՓ ӧD-!B,/ OO^'s}YowlK(}J ^7=oc 0^i:N@jETx}RM:QNol%3(O^gs}yRnxHn`:9O ^xTKg`6EC9!#q;\k_J;Ju /7J[H8~=yz: Ӗݜ~3!B9Ǩj HJ)pBN&+!0/IRh,[@H)Xzaܗ攜aZ1Y+ƛ3GǡqsYZT@ESgݠSԕ(QDlgiKnͬpTVmR!+Yσ.-H*LH[rPI,ZR b^Q/ t3SWH:=:B? v)LOJh@NI4\JCY]Yl nP6YT YD~]Qvm!NBcL7Z[ CMkaopdnX+k%Q59A'3" х8NWmn]J_n xRXu(eHˆKTC(ƶ`Q2U9cZ њ5ͼwQ6`* j{:SF$d*%MrSZy-[ ,v1(DԠ$R*,=2k 8dN|PtAGuTzX@٥ae8d\{fKbx6xV``df 〪QFVfFP?AbOf!`)9CkQ&0%%` bJ 1TpP3D E_#- C4sTM.ET]B~pԧz;6 Ϩ!OX)VP?rJȨд>9y3HG> j O.:V-˸)]"`dH d,3ٔMY'Nd P)[|dNYoV-ܲ,3, ]h2P'ԫCG?')QIQRL$cć n _ Fj-b;.{s̝%UbekBv74w:*ſ'A Tn_ϒ܌M @CÿDQCr+`GUzwca@a[p]حObl(BKA04Ё7R ̌NnPG1H$^[KD(ʭM\Ȧр"h̺D‘ hMk:hq@ٮ5@ԭ"ؑ7S\FNi}AB >oۅsԿJ?Z7~ &3ඦA`ju3w̦|SYs~rhs50T'9]O%nBBhbEl\?sMVY5/)[i*q|4@ B> `|Ť Q\,YŹ׫EŬbҸ1PTwea#ck&Usv#KirT|:Z BSkSٟ eҞTҫ1>1Y[HWJR.MW]W>NaR ,z!D[ʧmg0_}IoF7?1c:W*[ h"cv};1jPt'߯)-<+]Lmj":7PgY7àÁdIrN;B(4vyX3qjlq6ӻqc &$jzM|+_w~8?\W]CfgI BMFAsU93S# ݎvW$:S\SEzΨ 80j,9_qο.ccȬtu1l4wL=Bx邺N̍D"]alg"36iSp8?bZ}D=l+:KOϗBߌu5byuu7jn][W?׺[WodYW#ο3jwg]*߉u#YWoFh=ӵɘcZ,KOMuth 7rtM e1[C@FJ]JZO6HP~mQ=Ecq5\EA~> F K5 6m`i͓j|eYϜ4W q`@e`cM-0iņψFC}.U/NLo(w)R5ЌY\iNffSCe o⺩C:r˺hV^a0nۻԒ/T}壻Rw8+ A;*Ӥ\8TdЍl|ET]-A?jI-)iK \SuϏ6weG%kI3CxtPrfV}^:׿"~.j)ϬgͿ+|տ/S}_цzElO|7ٓ7/N?nzݾ/YRկퟙ8̽^0ϫR}̍*lM՗}@o/o7 |qFn?}?}Ynavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MQ.svgz000066400000000000000000000004211221777731700221350ustar00rootroot00000000000000(zHcountry_MQ.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MR.svgz000066400000000000000000000007151221777731700221440ustar00rootroot00000000000000(zHcountry_MR.svgS]0|/?l.`ǒ!~@_Qe[TI}׎ avW;;3o o!ARg@W>p]@a&V;ߤ ehC`v$]Ml|<ϓawl[SKaUNۭ*Q* rn$sY[]zs@A)11_s}IL1QfS%dsVJwg,bZ2P6yS/l iO'R5tc̡vv ^K[E t q#sA5FuŢO'|19I?[ .*HDu#NOz _Gߨy0;:\%_7c\,znavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MS.svgz000066400000000000000000000156711221777731700221540ustar00rootroot00000000000000 (zHcountry_MS.svg[[o[G~ϯj^&X꨻=1&$} ̉D $e}})r8HF"UT׽m.׫g3g~5_/glVz??[gr~>yg~1yܽ|)wo7Żwmvsݾl2`r1>Ltb~j8_w~{6, [J0r!rwSA੩bȏu9pa\}Ry}w~u1>7b8Xf`q)ۻټߎ[7Y0FH >+8xX_϶7{Ÿ|vP7fo7?moo7_DbݮDvxШvs-7PC3Nq8;@g_l_mPP 8nJoPÆ?׷-&#)|}3_bggsgf[w)'B !@~HofͨCnf{ ˫?W|~?w ^߃#b~[n]-2XN'_b`7˻])޿[?푍]f^>9fvl|>Nl]v*‘vb%w9xI,SSqX b)]?q47lO:Ä1fB0?0UzWGEyFfgwi+/=Z4bUHf]^.aef;)xG.j\#w]0Ye㻐 d#N9B ]xʦt Th󐞁tΑA9 爲'.3׋1|Ē}H]NJ|lLLx/{)-IeN"&73]?Yp f%=ZI|Nb)5,H] DťXWĸMp8YqxY`]*+7XJxX/ }Na@ \ȅ9CauLA\y).^>=i#s<2F5J<҄d x j2 6'&kj DDD#Йшr6#~%Ad8'؝ؤaz&R ph#0!^(Jt;ΆE;,ГƂ(3|C\:ᘣ7?\ krƊ׹8Ac=P1..adIXO}{ɊO^ y \RCl B$ "NWL &"|Z(g Go<e6"!'C!E_ΙH)&f"k9Aޢ8S]AppbcPJI<"j1`u3I>; 3]_J1::80TT \Cq[ !{?Y\!(peD Xx-)"7ӹYx%627QFc,|0/,C t9"{0fJK!|tc'%{Oq'L$SP y7J/nrO]|>h8x#J#px9l[_$\̏yֺF+pl{d<ФB,r aP4"=#-?nA]LrI`p6AE/3Ų'&nj%E:zl\O U.;1'u:-JTrMxBwB.BmiEORĖapLy LZ쪰a4-V"=N~68WMS\ HSR7D Vdg_֔f=ALջ]!{2*o]ꚾ# H=ipHz`#A"5%  DH)/A_* ,&;}H\g"״]0%dQɳŶևjFe0?»Ԍ $5݉(%V閔 b݁.ڽ5p ;#o,aFj:95 ^%ۻ:@vb][ڌ/.<,7-›i3JVA pQ"@T(}VrV@" )L0 Kݳ&D,!TOH|gzB0hW'dIMpP\`XW[0QgOWKuY94,w;hi3B%:TՏQP 17XѷYIB JCIpjAj"8gvMPr-dSVaR7/RG3B8vOy=UdeFWI↔c )gĸӒ!0ݒv)CfH3 eg3R! QMMPUbڱ N Բ!ʧH>1kgB5IPKkpuH;[G@DG<`XU2# T3 /1s^>%=i <&Y !:d&kA e:1e aS45(a^Jff a)W,B{ {S0$b #B$A k>1Z] Gp~jZT.k&gNq4 {]cCE'tp8t :^z_b|VF^ |>+:# t(p]lK ;=;{>dQ*bTiLi֝C ӣQ4͏<ϙO^h=Iɵu 8? pT;cO"i"B] 0Llkrh<~Dﱄ oht, n,ˠ |[QQ v|QTRB3{#LswZGStMéSVغUZiO%ɸFm  =nsNk7 ORm/(T֬u#T7^6 B#̺C^Ax>L e1W٠ v*Ki>h^m 'zŹ@|JmC{>\OE.^"Yu!$) uK*k./Zɕ ->re]YqTXZ))cOP3ѧ>%(r a!ʑ0 _{R{Da ["z9#ĖM}&|9G55iqDxvJ D-]0j\S`S,V@p͕*k3"eC([kġ a*'+7凱*""Wڊq6-^ΥK QNKhBLCWv>mR[`~:ߥ(a>{sC1BLر_T'T{LϹԔ\I$7 > \c.~Vե iFՔDqeV^4؊ߐ( Mw@ (c& _TrDim֦Ł>&~;F?dő/aJqPkq|6Y|;j'd#;$e}d~,> G.|cKFgl ;"*ɖQSNP ѯo`j| eF ԏS| 5yCˆ:lZFz=Ôr~+rxR3<3'GP%$s^!R]/Uu;S*GaDZ['6 ]=|r{n-)I}R#4dGr, PicWgwZ5ޘ@QvV$K%jg )ه\Pc 3g %s Ǘ1vraV-@65#~,/ ,Fsu=k4E71&þ\8w(S*cOqY"`B[%1_,i¸BC~Iq`JuP @7iV/+Qt<P6ھBKVZ©: r#_mM ]F9Գ\FhkirdžΧd۾=tD@oCL q<#_,'/_ 󪔕bMWfNTYyJ]08Z&*W/)~2zReIX )9W="hG\eHۃTMAHǮ&r=\&Rh/ AA']QYm#&.h͆#_FԖyDs5`J.n8lmg^CK͗ FE]u) mMša6TMjbXÆ ;NA[j_0+;a3$\G\ބ -8+ ZO3&16_ޥ(Bѥ\<(*>E?wd1(\l4:4$ó~<#sl_X5*}(& l.q3U)ŽAeǟqҸضJś;b[[ -P8l:_)]vh A/h+N;<wW0,y : yB2lߘz}5 O$5g 7}DuAcOCdnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MT.svgz000066400000000000000000000404601221777731700221470ustar00rootroot00000000000000(zHcountry_MT.svgսK]G9_VM2P`Q=.(C :R@bf<~}om~/딪;ЕT @رǶmO?_}oᛯ_}Ï_~~駷_{ͫ?}w|o^֛?իW?_?W?ZRJ߾x~=_'=޿_{w߼W_wW_w|oǏ7o3wMoǟ]4z4qs+_lq|[h?}W~Sz̩c-m-e>뫽îi ՞c j4{Ew,uu޾xn}:jzmqǾo_^^ћconny9?-Y|i4~782}o]ѧ4Frg!C_q7赅9׹}_P?{w{e.?JwnOQ]lUhweqtѻ tVr4_MMxZшnޟ77~erE3nzr݌$o/sqm>ݠ^sRv7=bL?õGW^_I!>dY?Eqb\3K{̭.tG}Ek~\j\ME[k^}ܢK°^l_[y }nW{AOKWfDzvNOWyO(Wvݢ5=Z~5uMc>6M`y6w`onѥe]%{h^]m/oSY7n֧pEn4)fY_1yq6t3W]k|E->9?AإZ')+6dCC|eyj.R0ژUOh?=iN]uN*mgZndf;G?-G|v~*QV5cׇft8^0~,VS6f:z_l M3WSgO__}ǯ_!=4ӞS"p%-%\xtK}*6ܼfX{Ff, %]gIy %)q5Ic8\b|arҗw?\R?YFj욏)|ΰ?#GEa5&ǪI8PZ,~Η"!J%¬Zԣ"'miæC&)Iܪ1"~]yE1]6Ĕ(|FvϽ#rxԟ؟\PMQVY3B֞leHؚt! vXeҧK䵚B.HdK^.ݥć,X/9=%DzAfJb({SFD<˃1DD%L!2e0tq 7˕dC~8:=hSN/BG. wHƲD=G yȾ9 ?QKx{G$e/"?'.;hMq!dE"]z Aic qm N!zQyEV%-0ۗ m}m*xEۅ$JEێ?#riwHiU3ʳep.fS* 2Xv P?[0C߽|F{eu mǝ$?!^J:_*ʧ z3#Z~>voT4>Dov \:|Qf!H8>EଷgqtX/~^>1of,!VPхKH* 48{wG|\G׌ -ܼ|%*p-y!+vBBسTŤA]ϞJ[X ' ih;҂4xz~OZv&c "KUB⎗ +eHSȩASb2OvWH8@jdd*<M*.VM`Sz'R}~=\[77w6 [zon#}D͟1yy#KG'@?S/یDPLy7ӫ'k7-}}4|׌ +t˛'Gsmΰ?°HA6,mLBa8M+W2|+f:57ÅMO"ɒwk|mvڷɏ e _=oZp*Sюo_zIpx^nGs]}u߹?w]ZݿG> mI7 hs2eI%l,=X'M="MuCN=NoK/k\?^wVO>煿 nvFsy3.']( 2,rao`kZ񸠑l0o[(]{KQmmz[q),ߎgC7򷟊%ؖ7)uf')|~H;V5NYy^%8’ l'ID2gK3I}ϒE~b_/Ou`ɂ/R,-O/>[9WP+A,XfK4 /0 1'%g1p651Vv8Y]V5b2vͲe^zrB * 8D+rĆ`ﱇVwKtpTԬC8uO"SIZf4H20Zʽvg63 *kQ+{iK3<Ÿ"Mw GS&<KNEuj 2]ɎC;`Sn)mSOgd*H3gci!1\&­/nmg(ZN|-bO$Y,RsߜQ6sˈ"yFηc٨oK-uX|m7bdzw#> H"9id)ۡ[xktjQNx^o->;sY,7^g<2;%Q'Vttӌ2%Zclm}|zYqxiu]ݪNw1и#\i`BȘq$ q~a]>Ⳙ=*ƪfd#GNbô 2xT>Ⳓ¤Z(vI冶+(ڞYAPylqO,T}BLp Xv5zk0>  B*yER}`K ,ldr6a5-")N@JZj{yln2bhyܺ]*4I]ҨJRw}g䂍nuA쟑$x73+ at<[bd ؝?TvI HNp"ȒqER ˢFL휂bD'`2IѴvMkҰѐkS+5E*x =Sȡvْ%L-Sm}=δ=9ujP=P5[49X^-H!r^|V4J@iCVg²ֆr%zOrӎc9Vk>0u~_ 1$I0bH^zV4-zr}S[ سO 2i@YZi$ެ#"Αcv^Loy<3KurPOsmBN8Ιᄫ=A<0@'a?75b2l/iyQ#S;,v /hS!5uԯh!j҈݁9dWIR5x;k%XbKE3IkQ $:loC5cļ]#d5<)b; c7ҳ"1T#ᇙnWWo*n9"lk%IϟqM0FJeZN=ҙ,ydySn>LIBX4 +ާf  R`jJ3Kl(W;Bj3cϵ/>a͉Hx=G#5\-V4)х g*j@| ?WγU8ְ1W' +ޗXWfɗOFUȜ&[zmv|tHm[766$pa|#N6/p~Kݚ,NℚZfJNQGlH/[Q+C5٧ 7x2Ÿ4zYEVi15X3Yr!o0^O1%tғX>w gbgR.P{j^z~ЭkF`L~%@iNڄsje+@ 7sX:r^ !kߦD^1}cO/<~Lig|pV>ܘdeEDGK, UbƓ #-w>Ȁ|NwįtZ~ӕL|NUO?}??}ei3!]J=\,%1LT @mTkq;]L?I70P]\:a@&Rer`m"f;I+4zQ)#3&Ԑk:eùс#CRحӋ&)At:qI%S=@eaT gqvId$pV('cMhxOĝ]ŋ}4;RzȸqsW6ff/>6{OSCs> .h=~rkm)$l[4)c?ƞ^xXXGQHrb:1N'g9tR yF\z=g;B\nkRY$Ap{]Y\XFDҥ$ӭ,O.8\<{ࡈT7J@T4 FO=֪/?ZnS).&*IAZ8xպ>lǹMVvwZr:x .k4b/ML̴QyKnŇZhAYOI6:;OB,O͐*9cVy [lvj*k]s$l5fg`p6}B5PIRzfIЪt ,*awR ,>P[x@Ӿ=?5!NYy!49ϼt>&|B*g{h0OjvCp`9w`_mO7zU&=IJv-:@٤prj_|@ߖd/6]P=Rq~ o4v[Gwa<\w68z|zٌ~gP&=d+@!;.!q9N}CkX^wGܔAbL%iGҐ"Iv4VIApY\̊W@Dmkrh [sWx>7#cW7 ?jN IAb |;׸Ixa0Pqj^zOj?'LF{/6i;g*UMُaw]Gy*>跾) Đ=;\Gz3 ݴjcӶkGށ-|RD"q>eY}3(j5nJ88hPX;jR챁`U;I}#4Od]R!G -tsQZ'zphR8lt֤ĥwXq2v&5`rZ>"q~Hn!KFS/ H+ GTaC!RB$Q].1K[#wK "̚*k_䰀=/&QESh)3R*5łѲ"}I&%JUBc! ޜΙk3lylʰ,8.;)OBǹ Mfn3Nvh?jÎrWm"qlCZ\)ga>4qem?O"w"%Λmrq!,G= _puPm5K|%;Ro9>5'k?@%N{0XZ1=zLE>CȄܪYAJt>kmrDwo7DxQ9Yb})Z\iKc~*F#ury&逶V^eR=&Dx8ir@{gbKQ#HC`eszcA)k^9~: @I%xb'gɷR΅if"+9墼 Z]d1Vv `[%{=;ʧGBCg3B -] \qA_,8&cN9oz)a e'yYP= R{ȱmle czffg07VRg)9=Wwm q8C%pݟ'bb:uXx9/s3YH6GDN =<2v(N$[G^ ꏺ>KlpElDB,a6Jбgi5MEɦ.CpAܰ6'gr8 w̪8&0#)q҅oH_ ʪ"h[ *C]tl ]EW:/uoE*ueǡ y\>|nd+C f<}\tļm}d`p,A1rТ nU dJ:jj:(߄y#Ssx2WMDƟB흪-mgU 'W\3 bfLy]~": K2UWBͪ^j) tKtwqZ3}zxSVV9;/%A1N[x"(Ҏ'Ét,ZIecHsbS l S *5 ?>1酾;3G_N~+u|OPN[<]A$ snLӅA4Y`|]{UN۴I'ݐ3J " E$*z ~f`oc965u&"v-WL"԰x[ҰdEy]*SE0W~No C҆R[Ẫqƍ~Z3upU6 ~8uk?d]9+Hkc? -[ 哥{s(|9Tsw_a,Kݾ9}n|w[2tJc+NI8bz%0y)x0;zboF h`pXvd~ ;*YrsV 2ēVħ:l'gyppxc-0.+#=</sȼ2/>}Y!ǽYCO,ѹ1Wrvq|ij浝tg~8YO5ѕ'k乧.yQ 8qHrԇYΧx> -0z{|'ʉ &'Ӌϲ\*C|{sپ'Uj0,;1,sԾ>ҳHRq>E l[ +u:z#|kd=]Ft 83EB ۹rnk6^x&M縼‰nOeW7YGNGgkF O/>{I7[iG͘++vɫԔD!ʄ~-Alq{z]v|at&n9mϴ9\(5 -Xq)c D򋸫dk'isBMɨaČ⺐(-PvIM` Yu5~oV zxD,8Q_0O JGq283E 4i{n:`4.:8$[ӯrqe7K lP*[ Qdxjr/ӆ>%-JBޘ"R6:QX!Me^֤n,Piӝ,e 67"0LC, x[ww3'N.&8ݣsrq3N5svR%<#HqݙL$t:*}$,.}{PIOrS3V\+Uq-0J1 G.巣B:X U'ؖ}`(`ZeS(RoftHjoX"bؤ˶|lcxyDtig}w"Plc'ŊG _^4!xcS;Rtc[s1("8b-P◱㈻7=GK_oksZ~g(S\:5Yiw lGZP,`IR9ѢxpyqE1y#zF(S(O;)c&mrr?uG:<5Fd0FpKF49^'߂m`LOm~ c9mTJtiAs)Ph*Naͬp8wNRAkCU+D&3,(A2X'? c%e2w+iꄕIE F/vg!_K"ZϽTT&07fէD rd1r mݨvUhv H|.]' alE >KU/Dס3H/b/sNzClu<[.DMR'eyqL2;ɓ4_X4Z~s,גh5;/*`.+h߱9P0LSr=;Lǝ} 59#4F vĵ=f.IoR[NGNjpByޖ m.6f}~xW[Hp-.)Wz*.49hMkm<<) 'GWƵ/7 Xѐv)UC+( |p?՘,1RÆʽ`z̗sɉM`t,y1f1ntgY]:INz| ֦ctJO9P*֨,GQ:-$m$iU3ԥKxXJd uVZ6- sc:%jRN wLy^8%j&U㠭Ae&gЂhTe듃`,z#I>,$ߦte:((,ѫ-*SUϴ8p^^$z7WO#VzޔJ>NhqlhcoJ:hҰ$۷QD!TfGׄCTϘg7ɶͨᤍLHbfRqo]]>NjVLZ+.sM%ss, DstJV#y&\Bq@7G`ͻT 7W_>GVIb'vK$nHDgt3vXw\u;GD5kLr$[5.:ooK)`TsC];i^.6 >DNqt'6 OSţ[ R7ԫ(ti頉A*f.(d|$Fd<abZT 욁(CGmmj#u,;-Wٱ -vwQ% šmtEQBuwj}SN'N+;`GǗ&xze춽2ik CԎ%]$qA0̷c>kxΡ.4(!;O!vfdXpSsiU~rfidiBo!AUBO"i9[mZ#( T! Pvj@'\GKR7KH\tX>DPjria—\60W. Yh2lbd*%Ē'@X6AL>@8Ɔ 0IaTȘDtr^'TӬzgjP֧GF,%hOc^m|0) /{'mv/:T`ba4.`ZKss,B^~W0veFG)!uXfȿЌ"6Bcv^‡К-c6uIӋ pCbX3g^,TwwT:QX>gn!L4g{7:4nS:cF"+c3;Z&toVM2Q4‹Yf@ĐWmj/3Q /OnG P4uZ(,#v;*Q"9Q_2⒁Bcd`7T_3ir4l$ "4>`T:Q>M@z7~WDH)a`߶<X9ΚvR,Ѥ`iV5BiُjqEX(U68 :(gae<%$:[#0~VB1S5Vq H-!=ˆއ!K^a<^8fZж K07H䪔L̜0/%JLuzQ9yh!V{Ic[v7/+<.uaWc}8'fyUfᶝ: DD'+`hT8V?Զ˝$`lGBMp i Nb {.M3s2!3읙TfáՆ'WIk0Yf cc2dsgG.V\cg">BPp<UaT[Vk G{M nmuqhZ({gb0}S\zB0Q!DC(9B0V&_Q_+ohnSqJ!5>ŲFRyz ՌIS 恢l&?H\?.0Hv}#lF-4u3YLݔWzvnTNAlF+ԕK=̴"GQ%j}& JR/d;6|[qtke.Քok?0 :4WJ#(R*"h%BA褖pJf%ǫCխ ͻαcNf`/ / 0Γ@`UZݢV.jKG/N`0^}vfcEBvgxt9rxԽ]^ \#E+Nr43E ]N{T9[Y\0jw(u~$Q27*rnwXFqAFHLŐ()Lbt?SkkQOIIH[\Z6&y]:\4MTʗA.0{F![ڛ$TLRaS+QO"uϳ;f1QB%*XXԆ,u#Jڗºh<pmHc'4/rf*@%G}ۼ_P5$HZ9"/RN+@1)<$Z>hTh@n)е"`ɓ̈́gfj8rS79Xɳb,rLHѝM'=HqNIЂuNdbǬY7!&Is ֎P50:[sv׌;dM4%0w˘ӟGŌ1op%SG(}ՆpŃ8i.g//᳑2eg̅ +v1^bkR[%]ɉ .:olxK:4&ˬ8x1hYr4~RbV P3Әqfj~Ǜ;pR;B ץ&dmb`xkFT?-sNtrBĭ-UWyyAS~6ϸAHMjRvn5+&'CBdL Os%{UZ[:vg{a\yHu9 ҥF0#eʥ4EԜ JSt/4 jRdAXHyBɟFxgW4#r'x/! u/ R[}=y4 M}$wvIn1tT +Kq!>݊x{D7GNݔ+X#GӘņьTE6-&c`6+ujQ*l`\UR2 `(G'S$!T,!NC"KaОq}"J sG~393vfߖ*aw J4&냧#+L)E 5xlN% AKAz2iЗ kg4#,H~bBf"G{m-#S!y=lbmB.`^sPnBāc€X̍ SoI@Țd#hT|l\bϩӝ#M~)Jhl䒟ƔPc9gEdR9=!%HVj"25OԠ423+ksO[& 7qDK7N izvGw(>ֆU24ʸwMļc4Hc *f+lAudrqcߤ_uCOssCl$k&~j&l=42qܣ!EL\1Bl\+L;:yJ=Aڎ!ZjgcFq["Ց_4] HLJ>̯PK,GwmE q E\gx2v%{av: ud+٫ًeZm*`z:54k8a#IޤR'ghd\޼x[ulT:vZ{XRV3_0 j8ֈK!,zaxҪPi)dGh9xgWAdKQѴp1(y~s54IiOz9(Ժr&3p'g0#F}iOˇJL,t,&9z nHR$$-ZtAӡGftՄ\b#LmaH L4԰̋lG{zl\dTTt#G9s)B)hl+wdi[7WyHfL6p8Nvis (!pfj zWJ_^2t`vA!<Z.IIcZ 0۔'.~˝5nE]-g5Y+ӢW|Pl }6dqxp}a>c0ن$ ]fc{O4Ve0dS B-9ep,`Cn0ii9C8^@D5Hn# R%$:7朙8]NJQ:Y]' qH9rIlPz" 5n>Bv\x&ixv:Z3 To}6H¸Uߞσbky=;#u\Q9W%cEE}St9y:RND?<۔2ɨ;%Z^wn?{w{e_ɿ?~_ϯ~ǯy'緿MInavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MU.svgz000066400000000000000000000003321221777731700221420ustar00rootroot00000000000000(zHcountry_MU.svg}A0нkXH\x=B)M5PՄ6,'̩x=:e?hklx^6JS5RX0* [GƼO"+ QK/)l]+@P+j4 ag/+7?:Ȧ. qg"^M%D,xzwO|WA(Tnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MV.svgz000066400000000000000000000005341221777731700221470ustar00rootroot00000000000000(zHcountry_MV.svgu]O0{xP2$&~/g[ڑ2F=yha%l*C1b2p4v'x6@0{ 98gFqWR짾~),޹(NFEV0BiM4O8m+8CpOq]r{;ڷ 7oxK,g>6;R ιw8za>\>cj?x9k>6Ho g~Ѿ'9WOUM2~oW,Zvǧo?^œ[8]%wqKASc_|ww?^=~}w._!wgo\V==\xw9? }ͣ;F%D LaA7l(]yUނ",7X~ PP^sߟqzB8}|l>Nn׼U]mp`sїpʺX\ }tOJ l= <#\"o󁖇?~ćO[HҰ!o|F U4Tf _˾ost0y>o>nVsN|pKYJ4Nܫ\Lm_Fl%>,sM(1luSXc& -L*UͶA=S°+Nj'){_ l%_ZjƋlf4^ь^_M2$,PrZ cI/@(h(hei\fP&@&Uk:6|tSLM>c^AG2ğ < C7f3.|$c\z2:yY2ԦVK_AZh1c NeKE~S}TkG6872ʕR[@Je.QyK- wM@SvaQhՌnX4V5N dGa3V0b<؁3{w e LBX f]FQer=L\=:KaJo^ClBʏhqxE\\D6V6'Rcֈ8n7Pzʠ:] 3fX4a]Ppߢsb"R*E68jܫ=c-bRC]}ܙKs'yݪ֢P@RvujD~tul:9$zD%H+ZRZ./qv؁s^cĶG `l18- {c!k#&CH!CX ˄d0C=P0qI D{% ㅳq>G]=ѬYIھ?Hf;mf"M+U,T芐K@^eØ/ mFAWҏ(5X6[H@qfa0T(YC۪8)߼Rԇ лZ2U;aIz.9aQ p3p Px&톣 8C#d7Εye¡7j]N9eAtlB˦4:K12^Z 4.xFsr, +( <=qש]c l법6n}:|/'J,UY3L=715̚#zjɚWf(J3ѱG|_"Ԙ{5H" ر'-ٛȿTsJ+|ʴ5lVGoRi-N~Tj5cB.|P+8xU<ꊇڭ }t~xŒ_7|/2v+navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MX.svgz000066400000000000000000005662151221777731700221660ustar00rootroot00000000000000(zHcountry_MX.svg[[oG~ϯU^bتEcy``FlIPФ,9fyB~ߩ&ERM[lIƬu9uߩͬzvb~vkuTb2_}WtT-W|h8^hTwmj'tu]}=a9nnz]F#\*,;_NgG}ۻn&&v޴D}{Qwrq׍vnr[s'ʜ3B|<ϷF)uo=a1dFǹ5.{ȶ߾|zlMκ;77˓5] MJ^]ΎR~?mx8;R*V)ں(=7͇{,gGa۽/KwsA֔)z?9_qŘ:;j\[\{>LNjz,]je:dK>l/t,; ^R}ӮV_Nnr5E鲚KiNo~v.m;6G^޴fҬhOW/ӿ/؋Ho.zMƧ0fjz\_<~`Շv=AbPN9L9t63U'ej־ЫeU^}'ȣjVoo^ 7acoJ(ud_BR}uwf=ci.gl:^/n#ӭ[Y^,nqw\&Ǧݚ W_vEgI(YS[3?Cd?˟c6}uI \<鿕d{j] Q꺭OEͼf-,𢮾KH E.JCrli+CXWjj4YVٌC?f>{H3>8CXX10ދe7nysinn1e/^3Qllm7}߬[k^/x%2#櫗pͤ0aIdq?Z糨RM}qoװ#$ʫ]-f97:,1@_ }X z<^A&_ʟMbfesHD NAaTJ_ȶ4:8hFP>E2Q{\o F@Xmxɋ.f Pu6Pvb \XVm(ՇY[zDȧ ^KC#tTOFt/v(GDfuV:|U9( %z[kCh؀3_1kPlG#3{:Gjc;-(V%mwUo0. ::-ƣjme5#gkn&'`1ܛڨ }i`K3Mv]4&Xc LC&cRJ0e+{V6"GKjbGׯ9hDtMoc7oAwyЌo&}6ۍ =9Z_ﱺfr$M2ɔ%厽V=I_;igFdᑠw6Dp05 mhvLXeʫͲFk#'PPq>MW0BAV.P(R\Q2Y)z:cM Dfrg6wX)#KfʑIl+{iegCmEe g(T 3Ŕ|DpSi5Wǐ]٥>`~vc*eԡΊʰbu(L5eiߠm` hG@ …BI1 aѣd$)(rs&WptB;3\ @%,`nFM Yk+%+VmZ,mkh묵lFu̖)H#) 9 c%q/IS1\Y@c*-/rŪYw HM M+%#TDئl:=Mm$cء/**A)>,Bg:o jOCa9T͎wTV jfXHr?%f 9u<| C67跼f]]/m3W=>U5M pƐ !0 xw 2Zid{ _LoxpkW,ص,w6)6b6a5CߓAyit=c5 |>П2aSt3hL/%w?voa1"Ǵ#mr*Ў,lXxt!Yv4:c1 ?G"JzK9{~ʀpsP9\r?@ZVU2t3vQK;u#XWhX#AIP8#9jEbU Hel.m.M  Ƞ eeR , BK [8q$KYxŽrocWQ9-HQb;2IYCzp5s<LDr9r>*b]>/auS0P.(Q@+'Aah8oR}-,y'11?"ǥ,նL<'ѽx ~IK_ y9P,߱|Oe#?gͪef 9K{HXc#7}kW@eѫWmlllA;ivwtv `n4wi8=biOXLԛfSuִInʆMs6Ĵs+(>mGr >U" :Q؜e,/BآQخFTag1: f",jaim7 ;1#iP4t UPC ȺR(jyl˞LeD>GUD{6  :8Pr:!`4L'sPQb,Ju^9/BJ02&GqF h1 5:h[ԈyoHNi#v'E`*!$(T:ZP$,,桡RZ,b.ʔȄ c4h""e/ d^ ,-|'d m NhO2)}uUP56.1*glf F+x>3+Elې!acxgEm>RL aW P}l=CAh 5ڀּ,E 8X ^h2kx]?Dh0G2(Kܱ˘1gA˼Y ^F[\ʒIXk5C@ 0"4!^H)`t ?Hv#ᴎ: {ᙉ{9HJJ%#4jh Zx:4d;) ϛ ,\1XWno$tQH3^nrXr\|n__ h"$|^3I-\K1>@М\#>Aw?TĚ2iDTNQB:1@" :Bl R@Oe֖^r!C^&nzD$.e9 + `JZF>1l`p$HA%=2`zVrTp#M =V}rC'>3`񪉩@ c %E$B|vBz:؂KFҢ3H IȪބ漜̈LoZaA0LLH! y WQZ婔o3xvDƃ7>Z"--0!"D(dR|^bY#$t@sE 2kZ6_TJP5k'&>7PE\M@$K{d[5%a Jv t dY @Bi L| . zJ;?Г/ϪOw',KlEhS 1څ<  h{B\W8X0aC>iw|ObV+`7n07h`!˳~h`lc ue7!^!T^Twr4d($??[ %=20ˊ[L|x'"mDA1&{Gܧru>;F"k(#CJE` bs3diCS%OvtY-=p^Oqq0}S@||[Af!I&$[Kwsw}5r$\ޝ a*kR fnW>/~d|B$KŞgL82X|jZBi׌93),e^Oo! ^0֝xLJll;.dIGr>mgl8ې45Cj)XR*˚}?* ďIDj(DLVÙ>-w"swf7#HU9ڑ <'M(E%b(lFK6w)yP"f: A5(ȋW Na.q׍zyCER'g*_]$FS1n ql/jP@ >ks3W72(aneyVBت$E2Wl'J 蜐*,RNqcaړ8b<wrX"DIEVϐ8JY'א//mT,7Q`'Q^ $~z]C3,Ko|JX].(qf'Ϝ*X22&VȣxjBE&¹Iyl\N8c,\\ƥWql۠;5]_ GBRY&N>)߯㾘 PZ\(!=;'HI,|JPUf(/e٣$!Nq2A)ݿ`UHYx鯙{*u``@XǝۣZȕjm|8)w"!hl9,}ô5R`(_7'hOQ~ϷS=6 u9Oo7cS~|w?C+=`H%WNU?C?ߺ #=OVi\+au((>}l)&ln5EkZD+绌!SJpnYvbB5ᔟIqHOIYc^(.AV'b;ZXc ZgكPVr.UgQ$*hHJPQJ╴1YQ_,HQ:pUq zۼ? *z|A=ӐpVRF>Hc4pd#a , e04 $ AR(߱$*'XLLG{~TqLVhR"H!Fa d_ 8#~L߅=IB^Ra`>lhXhY=C\':V%$u R@d {ǃ;WRQ e J+=kd`!rO-ȘͿX!#^Xq9,_dv&tDzlLbYG#J cwPzXIHXg=~2VvL]g"XZD:UȳR+ਸ਼NDף+5TPD21~;tB ,}HWd+nÅ%< 3>VU#[OȤ8du%8,hvlaC J(o}YNN0EJMъreo?\OۚYSڶH(RJ$.SU_osx+w!Iұrí:lXBc_JE%ڴG3 `xqaΧp^ՠ\9)Ogr_2'4 d/]JF4gM8)Jrx9=75m(%*vM}- UwD@0{pe&0&tJaJ>z[zAk[%FXثWQ,VZRجTl5(kfERFv[*js;_u_vm31+|}lHWeX㌼+Oq]=]RʜRbj (5vJlm}[v-So^}ُH~ǕFAZ]pDᐅ1&wJTsPUֈ}0N <M'~lI'Wzx bee&=)I)PώnĄųN"(N (SY?ةuzn|(xX(JgW%.|RA8+T"ztmgVRa:W?ĭRCFݺ/u\}0mڏ[5=1u..*:W;Y<Ȯ' x߅X7md*kx7gU8Vك]xPӘ%BsZHjS^S\ eRY\I7AH4AXAx0a [D8*%TSU.wZtiEa8Y@_ÝbR.!d'FT =]3z XyhG!a/e0?CU yNm(۪,,"j?xU.z Pو9t0}dcs 4 ws_qi nf+ayt&1E\2q6Wvvvh)Vu4Y.B>.lJ^Jؔ=>p5 6eVXh *NN,1Ê0l5 ULv RcLTrkx]$;`09z9C[BQSs/(LD B!\%fϧjY*'Z:@۞A 0ɫ@ ?aWxd0e>KJ׬j=1"RgΠd!qfbct!)zQ9B/*|{rOys?Qb66Nl4SYIHFEsm58~i&V}R꩖C]*J@m ; PkՓ1p o#@=zZ~NblB}ﲏ,߃J6bxb.CB2C68Gnz`Cl!ERJC5Ѡ͎Ҍ%[<}tC4rEo54/v.o qzi H=ׅ46HRCjƙ1P s<Ϗ;PAǔ1R>o=ʎs@d\Û&ÕvTPѨ1O+]PIO Ӱ{ %HmƢEJAŮKqq\uC+ CJb*2y=_9R&n 0^ r29IcbPYX;Sp2ۇ? U^\ˈ~L (6} xvv W$ f'\bq?ySحaj ͊Fsk| ,A_WKW]U:Y+ />AΆ4$J36"d*+ˢ^);XSr7'W҈jgvz{TE*#\ơ;$ӴԤ_esSq߃x9Ie9B6xh8DR/)x0KڀQn[9; 9ya7$6+v.\ 3 z ڂ]ܮ̔ 6vT/w')wFs]&.d2}C|{J,?pCT,^?&!B ][Tj2sćoybC\mTb0*,UrhIz:G u`rZ_;Ps3v'p/&Zʒ3DBX>I&?nU[ })KýC,-=Ap=$vN=} Re琘"$Vwa9Joc12ǺpqWwR k8CDisT2]dxu\xO2MX5X|]܆~K=J0'] V:^ 6o~h2sɟh2^i7n'#Lkt䘅Bvz*ur"0-y~(ZlPE^/R2oL%渭pۋ%?^.Q|%}M fʿyFAg?U=8"H\*y.37,~t#Ze}; '7CM̑5Ug /\oe(ȥ.Nד}f)kݼu2!A'WKۼg}$>4p.d6遧.]CboGً[C /^QQ<I9VçTDxk$3aJ!Tnb*5'ئ$7O׍`vRVC#Eva&DLJw>ENągNԫ(ORtD>߯R Z@HNm;aq4y:<%Z쮯aYQ J}¤4%G ō¢q$A`Tכ)OY._4D6][QG `MTq҃]7N [#Rs\fy$> O zp}cygٻ=䣁;gɜMI-ރ25P[a,XJ;j8ţTdfjB`@ܮšKW6 G0+jI]'qCvR}%c6V"tk"˰4@rp.8OKu,_nAzxG%A`aa:JBua{ɻW:.lo %);e `3UK9K9am?~j$iϤ:ktnT][A+e> &C5ȔR;A(<ŃRAئb/"R]-!8'(+$D) %N4P Уӂ~T_ z*Rm Ni2' _Eo t^>]:ziu1-u?A:f90{(KAH0+?u?㖎&sI.y,"BjT #PH r'.D~W%4xK@^PV6/֤ S\USfU;+o(1] M*\r^,NrBzD^jZENJUU ҏ*к̅j?;L6"R1fgEH /bX&l (!oՏ,r3)lÅi{sJ -aTD3/Fɪf.a;f-]>DՑR2Tro-'/G1_*K!}<"j"[! m_K*&u} T>E{Q\a7C?aC9֠j5i3T̩!kuO^R͙*ӊI)fwh>9cU ?EEAed).ǪS/U+KV* C~%ƲkhAr$\Rչ"g!VvE5RQ%jDxq6 NtYWG ~ 䣻=wNᣧftb?)J8J͹PN}f%$bѨc$H*7^au#uCւiA|-S%=v#SdA[V֩CJ÷Q0a$9dIKmjw)dnڧ=e&=K{lMtVF=5]avGX5xX ԨjũÞ'5(lʷ D=m[ PUYb. D/JBBYYVy!t:)Dy:7Hb8\͢ަYЪu-}ױ3>(Z-Mz^#>I!_/>#!;P#`]8^si @^(u+S|)ynVX/옺Q'tLj? u$VsSEhdkj 4ms'="ORzĹ"w%K`srY/Te&:@˒ C'/l~" 7oPyzb'{kL-0j!1&Ikhgm~MtO5:%}{T;1l;x-YW~Y雤Ժf)v6:Ž,VQD'is^Wg"NReR@d.1"fWV0_^rr20xzͭyU%62וI!K&i(u=d%$V+m >CtXw+&d]y*!;GjS5"{DB?%j5,i쉔afUdC\h%sFXjQ2L1:T!ݶZ" ǿgM!kUnJEjƛjEa}ёWQ(0rQ̭G9]J :k'~k*-Jba8/ҦcÇ5_ aXBح\u Kl")"ON)Sf+g[xn,JRt{*:?`3s'̘O@t`l7 ы4hoźF ]<$ T(YXR (!+41VzIůӠK@p4 {1{/Q7(TG r%LqHۏ)?LoADk-_0 _lT Vv&74zStaZm8N?pH,N$#H_58YlCB;|Z9FJcqB1$dc Z{Y핒 NKj=#]PH݀) \'5nwp_չ^whs;z wr&YJie)a5Y I;uR,N6uvnH3!xvj e:bױBr{N :.+ aCgٶCţ+#Ea,] dEwlm=YuvSG h(ƿn߹rr3+sKwOj"쥶DW"X4:5:OWd3.vhr-{Xu_o5`o=1pIK"Ba\HTw@ GOcڔ-c$-j%[%AV}hS7I3t9ui'h1;ieo?\Ia_4/Xw]KZ"x{z@DA_ݢzS/P&@b?*dw~Ք18D_AbZ}b΋޽}Ȕ9mڴD2q){צ+7[>%}=;70 [ɲсnW`Dm?$'ϓ}H\8րmEq!#Ubp=ʨIyS)Eݼ8j-3\`W1d'+|7m@E#V2GP/ȷOW>(РK&k̤1ģl70Tyaclw'mK q*jܙH|=r=J]ũcQr?JĤ HɹJUbUףvQvEXyINl_!DkS9^ [բ I!uqe e3'1M$`G1]bT;Bh\qT|_xtN\]~IuW2夥c Gda(zTJ[-l~%.~oN SC6gV7G?s[Pk)~7T *cz~L|ʃ% uވHjU_ Es?8$__- iɱX=&F"0U7qii84R3*E QZ mgX "liDdr|Xy]3'h lmŎrN$8{AH핾Hr'tAbՐTG8:%6Be(oaiL}a_:w}3,ײtR=|>PN.7E/%˴h?O ij\0j\.>gDpAlɺHP=OyűOH(?tQ3^99UǽV"0 Ps`ޱD(ʹx1C+ C0g.;iM7Uv.dI}N3d#k#b/gA^Q]]A^/cHh5")~I*4F5y 09.NzwHc{n'^س@S  x"rdK=)Pn'R?CJ6sK8͍ϝi3xaZF`J˿S]ʑO} Vw{ROVW>zoo7hG1wҚwp"NDW:/JnsԵ䭓3vx^]YUI)kҗ(}j 'AMQYSȖ1#9*zo/׷ 9:K"JIM-.zNLJ[ӭ_:%QbE߶0>mVor-u8c|iIILpʿwJڼ#j!=iSz9)hC\BlkZIxV0@}gѾ U5(V"A͐h-r(ʧh,zjgYבέ~H׵ kLԘYwHn,_}7]?VY8Dc]CE-*kT墮* [n5J8%tP le8VA]Mղ@)oZ "ȁڐ+z%桅-J3uKu@ue f:Y zs29:+1?{[D]aӺ<oOETVW?+b6jRT1Woo`SBdGs×̩Iױ_O7"tQR={ȂѫȜ; I%M%I|峬2$3dYMN`m;1`WIxr.6rw**/RϨ}{̶`oLpp2 }!v_K얝Qas!frKNUW*+dLuޚZid=ډv^j4Tr~US:]G^,MԬv%j-?21v!,SuNJ54,)ӣ.u&{u]qHO'.X~p3 &L8H FZRueIEX/zTR]`L#CmোAn*"]SIܝ5tTsCDg5 !(_è;b|} j^] WVaڂRfbbmnE}]eњe)DZ_yJg1y0y!69U[!ݞɥFsdUVmLv] Y;cp/i jhGn h"CT[gc=香%-[^%WigvM&\x"G,]{̞h[JbE*˵I( qUsʩ݄"C Ǿ9LTx50s7Rau\FTk؋,s VyNBs ڧ59Z8N%f%]W-,q2Z-܋Jn4*#u]1 Ͳ\JaS%]i|yI)Ybn5ߧAal.Two~^LFM_8ۚ:klKR6]s yQFN|JUW[ >IuU%w NKbDLhyhve({? sPhܗ0CH vs?{2~,P@%%a!W Iv*Sk wU]nR-5uA!H*3Ym Ft;C ɞ&Kh ;)ȋg=Jmħ=AVY~o$)1BwۏW.uf%^ Eq^tUj6:xcl>ҺX7_ VUޮeb2lq[ ͽ~ʿa%oM*UI7uUPPYY}O_구^G&Nc l-}\V!R9M}։uL5 ;$Z3NU`)p-ub7 >=Fi[~o|p*Q9\ NL1X|d7iUmi BYLCi*arfrn1}[4xu\ Ԟ1fяZ*Ip8𒋝yvTEoāqvNZew}e@=?&b.kna‰Eq;ΉomiNǃA_Z! )%0[xvӄUO2[[28U_ݾ&CM?%f3o.<9\fSPi:ڨο]gF4\O? 9iޥ>TLBZ Gy 5x}v%GH'nwni&ؚowrj?%{|uq4% 1.V_nuzC,}/Ǹ/JYwwD?48w _T# 1/cJNK%w8FdH_%% y8xK! !7& /)%CphnrQyʏ/|ŵo&Z uT ] d X:~\JA'jBP8=ժ*y |=JU=ĭG0Xi !So-G0_߇?NasKE\^{tpo#6Zt?.ܱ j`t5Ax71f~ 6u1dwpbjI<]9&2_o~%~б"ۢc~a&\zhf=pd3,zUW;MLY&RtFHҹʫ> CcT77*LTb ʥ'eMcpK]@l>e<FNaNI:k&12^l-`%5k>Ur>1Tq{4 p>oTjf ZeҗȘٽN^ڽMxxZ.j;U娩{iLk]Wh NFӪdoZS-'WRD Ecr~Och?%ual%ЌA'滔\%)Yf_E5tפ*MlEX槪6>=čYnj4sSABۏYb=.:R\D7%79:LSGowbMڦds}bh᚞CAQ-+Bibh 7A$ɖ&e8RO2/jk*L㎢$i|'Q))2tƟw"H7i# Zb*$b;Cit. 6Һ]3S8vE$4&Y}|w[߾ةM}hnKߢ?S.}/Q?~?vovطg@z;'&):eYqVTUxI[ ^4!K*V7Y['(jdP?CvMEgw@[۳_[J _w|5t60B?K('<@2\ˈ>Ɨc)xڪm !4/d <W~|knK*0K{I%Is]YįP7%xj~#}no-oW.ۅ)f8%AZ7.E/m'eiU]* lATIjy{ISVeY,fbo_?$-$?m`:N2dFZ*jv#q hnJN}RԮ&4][Q)!YP%P9Mnf ysjZ%#A3Xs6f>3uw$LW/_?vM Wcx8v/.O(PPM#_0ۿg]Ems"Ħ.3W1n7B~ߧv /i%5a ޤbTrztР/gTK*R])}ݞ}V. y͂5W޾;Nge:{<]RPM 9(CoOc!g@4:cs!qC*!?%{Ǖؾow|GU!-*y˼ l vOw}^vGqKdo5;>|65MZ_HFNums]˯)>nltjL AYǏ!Vi~t gIZhiBTtÝF,v4P2bm0v cV-g&[p{c nz~W _Ү\0d %{you&ݡvM'|=Ew)m0_@F9ɚ:" $q@ 聫rulPcχ~X* ܃?Mꖔ Ij=4;s[*( ۖ g\Boj!7҂ ~|]X_>[E&߆,>K~tVrFonCoҷ#CrĒNj"]O \+d>d֖@nWR~7)`(j;cNdz_[~\5w|LjZ K(xoi|zK7BjCD~PxG%N;\[~\~\NV`CD"N.@Cj^vlLRp=P$$'9E|$L,ߞ#cSh!ug_%[V{-$'wbfS1R_7ͩg۪S'Rl+o*;WQDhZ|ۆR+sхHkΐP |c TIz̚Hsc5s;)4MHiք%}`cH ̏U 5:{fR_~пmv6qT^ULh9uY:Q:/?~|0^qͺ@ Kn: @ov}1h#] lG]^6T~B,Yvii6cKGkM=C6v8΁,~&pޮ|,wnϾIa Yݙ>Egdo]5;>|o:>VƸ 9È}Ƹ p17DWBe1&?zb"=Y3X+}u~w8FAy> 75Bu#:|ɼ+Kn,;d%Uq! mܶ%{;/IsY/~֝)Sss߯'d _^tIƯ1 +aXZ|KPOw06!כ?=cR_i9uU+e ؏uxWvXqp"uߧ7 FhyCvRg(b00 חZQ}~zVz\xF{ ư,{9[0pwHy̯#AnӠDkL%Ip04XQnѦ&tt,)C$Df.ùa`aEJFwBpA4;T9 m9 aiYAx:"TO"9z0KS]`'[vRLsDdBAD`M 2 .L*WdT-.+E:PpqC$ SAmjpЭP XcǠMtM̬Lu2 v5ۀx>R 70N!G&I_`_Z菲 :u,-a7Wzljæ^Պrk(Ja%2z DOEĠbPjAqFɷ$z{Rmq.Q wggAOmW&QV|bQ ji1.'uh&ԃשцcw{5]K/ (rŠCv]"DŽzxd;:al6m KX/d;xͱ8лRGitw) `y=_'<BGH9"#:/:rC /,H1VZ~=_! bWKSGJO"0}xo-XTOR,IUOna1Ä<\A#>3 p\zETRVe2/|} R_YʒhCLt0pat U\Y2O?b,(8M庴ڑwLJ Pf'OT38DY18,px,Bj87`*62duͣۑ"LB?i. %e >E0Tc~"z*",j̔ON Щ$E(҆~v; dԾ@SuyZ1ZvN@pU;t\xzf+CyXRs4` C[LJ??PN4(i*uXm[-xHTAhxdeLأ"` a}ƮͿeoW ~4BJuXS̵ߛsN[ܒA/ID1l2qMRxj"<aB6QBs$ZO @+.Yd.ؾ1SLJ 6$ajC$Hhu55E{tϿD4& ux.-p`:e+!Fȅ <*_QV;<+iR 9 ({t%ً;xPcwUQ°bLU9c|Jъ/Έi+ވe  V/VV{PNp6q'm[S,ԕ#I (IHV ul51mST N<@Eb@c5lz΅ʪrlA<]ohYQ(c䋆M=4`ӓ~ m0vN^:h/0-{U#mjIhL [D,9,{h'SD=#<ʇaE[=~'dwsVp9`4La %F̓>p>DXg wJ-}7R&x,>RDQ: zFRPubP.D `9z=_T⫦OiEu, ᲫMRʘoڰ(!ʂB*}T{lȴG U8,ʳ!|Vm',%Do"َЇrʊE~%=N<l@Y/ݔ32j6(!+2qdƂN?yBFUw< Tjc8_% ,-Պ"3|bHbX hr4{g9/ )Cfa({J*I9Dgۘu\}k֐0ԙ*f;VuM1nm'3M0 O(Abˏ6rRt,6%iڳ?[xm͕~d6l%PH^%/f~K2=·警a>IVD">$|]Hco`G)uUq)l/D y&f+!-I(NS /ֿRN",V5CiC(ѦY=}-N;qv'ԝz}=_ǔkw`@(vEQ߉,=zU:3)?տs?!m9z,IUNh(U˪KcY~쓔'|ϦPb il@C͎qa^%` e@EE}!iiJs5PjI?#i/鏪bﲷl",ubJMǁmFJ#nT%[ooL!F!br.kO,IT?a*q.W!+c? )@u'cBtBqSY3s~ZQ0QM/{GnF\&J1)ͶEZJ@ zP%&jJ7pcE< j/ peHmPjl'K~=O,! K$iZ>]nؼ;:2>Jg ܕpSC9T{`sC)rX\ȤD&:0JXW.HqXݴ\N c>wW28 OޠY]!JmHi7ԩ9>d`_)x)/Iv R:?t>wu/Yї^_6_0_"nJxڗ ip?pB'z^hTHGP} ,nB/'z}veY[ =GIQkZgwkL ͛^1΢i)#T$G08ʹ,a8pIҩ YӋ7S% %v}ˮmStur'GJ oK+>c{ ba  KoI7G.(1cd+(&rq|Lk0I}e0_B_/Jʲ3b4ytpjP?lab+?e:%ΎhW5߿pl^՝P_۫N34Spf[}ڦt`?}%oR4 .bZKP.4C f 5= IPQ B}~ReԷɈ[ϯa5yi`Td8E>1«8ʤ سjE!M\BɨF^W^Ң@9.LZ kPpPIӥ]gvUM'Z5)bĒԈOg!F6HRnSqhurSg!cihndky:|laƒg$J:+}`b 9'm؎}[:I- ?^`eԶyE0a_:/hԥ LfE^ f^shlSF06%.!d8g=C{ƥa?/`d+:PWaB:e $٧UR,(^mVU޻ Od{3f4T =]7ۮc{Qk:G:mT̳u\NyXPqh!=BZxK)E%2Pn!(/~S첦zvSƯq=^֬y unng#fAղO?*>2&Dh[Nӯ1C3ߟ) $gnuPp )R-"U{!,b#cӺH];6Yx@#w4>c)VIoʧi7ogjzb`DM6^?j%lr˶Xf裖}5 TƑVpφe\8G"rC?a5|J1C nq+.DI)"g.ӥ~-.ا' r}#%W>H#0 w"4YW6Eh#[ԴtWdo]8醯?A__c 1@&Džt;HIv;^;I+I0w5mF~<"Ut%07xow|/N'n4޿ܿ%D,XT&ݿ6gP8Aʲ346;lJ=[mN__0TA?żʿև 'FuPK(w'3R@Ի8K__ϫF>Ź#dSl3_ ܇SS_nߞE?ҢM0at6|^O$YTS_f&\|?j0d i j+%z鞤de"֏+q* x k!| kxn]o]u*96~ }@C E>*sGPDwOPomw}4d!\2uJǨ8랟e}Hm] 7vce%MEW ӵ/͋ey Ig%Xyi}P乭߀Z*〃c+|^U4g &lMi{?khj JpBP(I61rf CxUi޻V[@5vV%ݞ?"H "8wvlZNd3as=$g7#;z;F 8gLK `(@2{=UἤLT#Z5]lZfK"CPU^?[յ?m)vǃWͭB1Mw.sb^dwX(lĢv@SsȿOs<+A|cB?EZӏAUK8[M DIdYckI;jbZ5wǸ˱mw/ܪ#]0d/P%H"3 ."ap1rWEL_aD9^t8Thw;y{fdr`W G4%jc3fi+X;-yq*i z>[_$ [BشR׷~ikOlA?Nz|61mR *EF~&ًOG>"OU55KG֙2q0Kk8/ZbB6smP?rΉOL{zm9]Ήw|'rl+&z$Xc@Hj%m@RRA"6:)JA*Dqf ttocWd2<5}lyTtњڰOqYKeue:Ď$C^9]-%A )kRGOܒÑra-0= X3roq_S>OE}Rv`C1퓴 )p@8xfof NsY5d+7 c/ٛt+ w4}~4IX%ڎOn}/`ŁdU`xON&+ C^!qS2EJ |1~ f!㚨„~]R<+,t'~,Uov!1uP6|v}ANj 2giyE|Cɲ%m%~78a\NА,*!#V}\|\1w?%]F?o>U'EԈ`Dߛi'/"zH,{ux=Mՙkg@vqڰw{G]eCL4Ӊi6@!):?C`O~͌@ "n T@'Y{ `urZ\I7J@30ӡj>"ɇZ ?j~wIsÊ [0Q ?snM]C~jcP~2q7I*N9+dEʫ[櫷 w K g"~/kzf!8TLyܘܯ)xCr + ^vI0- X1@Y&Sc(N>g}6h$ Og&&V*q㵡/[< ǧ!:"-a9t6wYB34irg?/)pϯQ C-R> #|U,mCo2O1Ϛj J`^RV9G\@ѵEfZxmđ̐Y޽0ߒe%鞰8_e+KVz֦F"#EŶXFQ{W*'Eq>sAV5@g׌g4oQ7 R[HH޽d^,XJT5gb 5"=Q֚H6vv?t\>]ZXѭ:bD$2ڋ8iOڏ}ċ(Y94疌:r ͵1]19.Kf6k(Ei,7-DzTce]ҽ?ϗyȮ>hteNzoqY Pt_m9YYszs?uVl*|h$mZK7X }<9ђG: 5{,qx9Y\qT>*e{$-$97 M-]?L RݲLg]iŃ6Zx|gFUY~Z)wlHih7 ȗ3ϛ(~eRy7o!?&nlqAm(ŸR1'^~x _7|r2TtטarMŹB}̖[> U imAa\ ^X:Y?vg#7]j%,pN\fa@VPEyN C4#Iv_R'o7O>d,t W/q XEIV1P )1D~HYkE2w3%g^JR- k-Lp9(yӖ^xE\^*^s35Izmre(ֻ4A[67?oXUBo\k@„t˲ltZTj^R&h,4YT ^MC׊4t[},UY0Pk 4b**.XҭqXˡ,B޽A =vo?}D9mS Jlu5fK&La84.h$@2jD}M{zɵ&©ǰtZȊ/ YzW?ǿ}S@IfnɽnT?DX\%q%ɎcͭZ N=#=.K* WfWhn׮js1k}]EJPoAEa+}![7#0r~yTk@ڽ8}A&lѻT-Xfڪȕ%@62ȳu3#u}͂tkpW?5]c>N4TA2)7YԖC93.yvwJ,F뼃΢ԇPz":ԛҿtChj(gid-~زCݜ-_n@^j(>í 1,:Lzs͐m՛m3aTz vغk<5/iž:U7ėY^b_Ke>Sϴ=7x^FP1ݿV6沽fkU,|ZWA\dr;P-՛|eQ[/ԬsAy{3V7g;k,ZI`k8X#>c'}|VdX~: B!x-wKC%{Qs`1 A^7悶&N_,׳G`PZ GpfOgNYF}e}CS% (-nH1c3zkYv*IHEνY~KxyV;w*['N;y3:?6èr32QتjIG /霊Mz"Ogf(Lýᜱ^uR@>8N&msv{1dVQFcb=vlBFR;6s_mxkb ҫb|e?I gD1$aTډ=@~({wh5PM 1kؼmiq&vOa~Nve{Ev۞'GlMLQoW#t+mkj\ j~XyyKw;&լý^]ܬ#[6(`9)V@ 8PSMrz=6wݥ¸W/ѽ%Sg-_J_Mv,Mq&K9<9>]YV y_\D7vuO.ٖI8>kQ'^W2lYs&|]>&4EP zP__7Wq ( N-DC5,nE j%n>$onOO'l:~nx<]㴬YEW`P-^3O]$=*$Sf^ {)}G=`Оԅ 0JQJӡo96x&+>ji~r.rEݳcj9`)=1֕qBicC~ȼ ;[1ƘsV]*2c__LS4s/1\Z<]ҩc<ɣrBhb% Y djoVw)5PUkV 1ܰ'gN#ӠaKX,j=.ap-WUۮPzydMHz UP,*ݠi2&@eUlJJah s;$꒮R}zHlw}ZLs$gzixf+;Lzar2De$|ZlIjg Ɖ26JQb|[@+X{%Nkl߼Vھ# ,Z+|ei7-P+jOr6T /d69d|\DhUM )y0滤4kG5-@}m uVM𭴛xOWR RΝ62\o+i1:3!;tګ#S!8#!%Emٷ,5ݱPv7b[s TWjWq~^iڗMCĘc?/gg{(I7fns`9vfY*@Qk TvGNY>4ww{v)%pN [xr=4%D1 5>d簤q {,>C*fAJz{,lduz0 直Q&X?׳Y)[ŁV88qz{fqFBaO{O6ocSыvw-6pƏ.W.MDZ5]DY.U$ZjXr(ش*I01K@M&Oρy.EmQ/kYc.5MhMHP\G&>Y vJ6+r3e2t@A k>VT"jc;`K]Yi=yԙ˙c0aNMeûE";6.) cT"C]7\P0GԼkvFT[{釙ھ޼-֧ %*/0?.APo^n:lfUKuxK/\Ïy]b*H܁dY''5wM2@~'ڎW˺pW$:eE>c;ީ]JyD0{Q-%F_@zU%;IaK? D0z; "a%3XۻjYnPmAT_-%iڈ7ަةn.8_~7_u (BuKJ׬SM-·BMk(sJa$IHX"HueVE!QWY{o\M-'7!AÒ"Nb8lN 3n[sf+MDV>ʪcnp&=N)?BX8EoJu,.J"Mz!w/+B ټQN 7K_ljwmKieDo˲f-TƟRf?\)38aϟ𷘉K&'q u\he:$#Q3e4 (AWְ%Bc$K5pI3Pf:4(3`gb?CTբ|3ޏz!>g fVkO0gv#.p㒋Ue=7(1t9剰OSCq5K=Y/iیL59W"SjT+ЅNR!{5߲sNKiyY$_EXže3ȒWS|o7-~:Wڊ?ZwkE0ڣG26+-2]bѣ!+{0{lb 6ETܵg!,i0[~C6j㼩Y]P>\`Z [eTt+{KfOWDi+ GtK ]rI6҈qj\YYשחX\KSPHmwiҰ hn8lmj|ڭ #LY3qP|t (?ɨ+2nxKz4[U[b{>`>tVXЊdSmǜǬLғ$6jś>VWa?Am۔ ij|Kvlv_ h~UhCyuՁރzғT6bO?ِ&;X3&am9 s"[\ˣ]_~n^L{1m9)l7}UʾNSWB]vg[jm1mX_4O; 'st`}>AŦhkYFwPL]ۍ1zeNq'oEͅTK ^I5G0FGN'QV__=ٙNe3L85.zWpzߑ&1៙y8eG}8\$$: (uSxPR2aZUze¸4 @! a+cP&dJD܇OA6QY pBLIڇ+!5P0x-b{dn㖹hm1 ALd$B74\X 4!=㘕hJnZU S\gCRJGݔ1)<{4>qY3IM$vI( >)pn_#s\IM[f!&sP;Tqsj:!M%).ATpZxq*tƀ]Dh7N簬(4dZٽx V4Sn@Y8Gg&0Q^@iL7ZQ~k~ƱCudL Epb% :/"iGZjwH[RT4L1}/TЂ^K2SFn辸|R2_*BњCӊʰb?73DRxB_P5mRT@eT=qkb݊Zæ̯x qж8]P̑"V4۸WȈМTLRB8y*VLc<\5^t]d6>mWBs}OT v@rAvc5D0Fndw 5Yk*k"L*|9r2?#h(%lfg',qbR2\b.j3QM@q&p7_l6}>dԐ iXjI,1ޔ@IDYh$xu2ӼNєg&B`m Qb&ЙFDCQi5\s9,d FXSEQĆ XAT̥ 'J*d^D-)d"}+ړFҋ}c@mlQNBC!14l. L=eYg|u,LrJ#T:Y JH5҉eRa7 RL󐲎T6dMcmU@KTtc<ʈ~PCf؇sU_SYNN<+Jm+%*&*آS %PwDaiLE25g'R4mi V•o ˲L:c$9ܮLQӤFLA@p1]:Iې AцEqt5$lh|_EK#q&Aҭ]_2?9)%ad;ڼ8/rk^` iC⦓&K-/a8W< W3q`f ʚ7{'÷;y5*'ȣ##f$),~EάSЧ%i'Dfqx Ko;?12̳|Q.+* ! ehenU3?*|'aR=HZ4j-s$ pYZI'+?[&jƷ ӭC]tC|fa>s܇9$d D Y O >#O ndq)a=dpU~aE'(ָ#yb}ΆfD*55 0ݥ3K Ök+?UZqFGaƕ\kjv$&2zQAqP1MAmˌQyޔ 6˯+93jDbD)=BbkѰCj..I됦G tcӔ|:+,K0|}I]*.\g*ּSt2KQgeXaGiݛV{0 cȊӪkũaPqn A13ՙ>.es;z),ǜ %.Y-NRRzƻxy%{穢!:WY+ݴSY#;cWǶTFޑ ]m|ê@,az=-QPl)q[ݠUC>m fLw&-Lǫ>M0<3ou^&[#]$.p%ۘfD26=1݊iF9PMQyp%dݫJQi?P`oZ*vp R!r1H ހ[U5BF.~/Wr~8:LFjX{km] bxH-1.*y0"x̴ kP~!EMP`F"  b747qlj+)E~5h-^S"ԃV r")7OA@ j^N86CױA*>'FTFi eF'򬤆ȶ2( uCikt$ev)2AFn5`׏έZߩ$S'5i,sdy2#"TK,1 R}y\kmLS@n):,W GN.z{nvw H_ӵd&Y:=A=4,^=J:*BR]ޞS48=״zv8FDž|ncÁImDƜY Q~]*ڈ*Ɉ4ɊLy~G3fꇫ~r _B隻GȂzY@kBaW akg>~5b+3,! J~ݬjR A|Ey ˏ=~tl SfVK>~2 .aY20 MF?pHibCDE[Ie8Xnj[ēo¼nH@ti\M`y/u?~T?mY@bWfEED-!w ELu(p%&3W[W ` .D8!,spZf/H? ~Sbˇ`tY: 'lKvKx2 Y| HIZFxr5"fEvk.h^>)@_qȥoZj7%Z$Rb\oת|,-u2N1x(uQ5.g4)}%kZp Y A_ͦ9o4@y1&ƑZ Т+M <@R^~D{R+ کi 37cn*okncfffCcDrfnҲLw2&N6e'cD )s^gi+{Cm|/vI uw,Vj.KM^+gm=HAB=lBG^kWqX&ZsYXRI:H`nwG,-U3F8+|`jTlvYqwlхjէERܤOe0ҫ{6XEq1 d|w]-8@i5ĦFYlQ޳a艹_ -^Fnӽ F]Sެ^`Llmq({Xջi$"(Nt`^Uv'vփ+Yl1dKŬ3])vڡ"J({ʭ:~2uxFͳ1]rggS9T2V -dIL.C$>[][XfxAszB&33wU4cNBOIZ+Gin>4(5K] `46aXn̵M'xIRFI$jg9mŝ_ Waφ)qSVbI( g zF (m)ƯAgk|&ڴNos{qHCZXmovĊP)<}@ 41գ=ro0eQ L٪B+](eJ8tQ#/_ȍvvM@%H2Mh14 S Me(~R {NH˟_g ?Oѩm兴yj2ډee@nOZXeQÕE KK>m0Qɧb.șd$  `\7tȲJ.(q5Y& 1 GɨC*{ Ḿ:±@jJaMwK-FG,3@6:->$Ceʻhmhd ]AŸCGMOjÓ+i1%!1v$7)xjW1M-J B*.7P+ lusAQUpR jZ ZAUUA'zLdٿM+~֝z g #`zFFC7HHZkpqSb(Ď_ȄS^4ab)?TN\XsuoRN8ږɄjgmF&IC-)P,8W.&.I9dPHbE 6=kmQwuуfDKtCo#s~s5Gۄb.^z51ch 4k@XSg 3cR+ᠠǺ@uLO+ T"+֨$1>=v+؞mtE}\]. sKzR7a77>˖L=Y簢Fl2jp׽`a=V~ ;K% mU'-򉶚SؔmP-v|,{J XsE %4lxvH^'6Մ=tG)@dL`딿]Z cٹ'iJ-M&-AL6P87ed@DfO`ajY~ZZHLyId[}:,h:*)T ` O,_42/tsWű˱u2ji"\; xyvJ[?S;o5+*F~9vY!=J\8V*g"̪MMPmLj$v`#a7t2XȲudɉ/ Ṟ$"Jl8N_SuR",dxPv؁YisB(u7sC{Ɖn샔H0 IuP[G.A!2n9]%a|Kb݂ PAf]&1CIAURfU<{f@ *KJSSD: x\=OKUL<To3MQⓙ|-VuV2x\p AlR[vٌ8tmU\{WҨ٭VT KbuDUmoǍ2A+v&"kv,@D[͆_Y46H)xN)H(zkz^]:}YcY;HT7Vߥ>ֲ@ے4$ܭ0Q>*l—QOP/w$E}6 D!}ivKUiZ]&ijA~XB߽#x\oRJ.*j^2=+!e Rr*piMjZ!)en h;% %_J1EsV/Xt͌vNptԩ& _ڛD!ZLYnB@a)A[@|*x V`Cgi).SCX nZTN8XLP”J ܺ'7\{3}e<2bLKna"USSq+iuڹDap<@YD@l|]ȶUt7KH!c5.xIU9%ɚU]h1m:eh!UAIDRa& FτUyecoP <*^$'dys~Y0-426U*6kӢl4"EMc` OwS'GQy(@UO$5T.0wD; 1Y&"C{U- P@xEoZ=2S.W7c<Bp(PҩCTVUIGF4Ç 9a|,FוvWRF _'#w,T遦v8 8E-~7P90A L"gn pVMKr"}g=OLY= DEސx+6W`#p]8+'ٻ Ќ[.T K }&=")Kw~THR=eP]т#N-"~Ckb{k ,ʫZXl,[־},«  K˩\pSmȢ|@a3?%†:cIq|%e(7)5Ӕ:%?C`x\jS60p ._ˀa_e%/EDmf]tRɜ7W@J67 ry@v0X$(3B lWZ~!1v6԰>„Bsc58o'MAfȅ4HJky_'j8K6OWI]"TN*= /7X~byށ4IfeuN1+\!*zW7'HW1i/&EsQ .gK*֖Nr6&2C4,) *  l3Yuy=݂s`1OG sԢ>p0\:ltqKآ*ԡr@`ڜzͪ?M;v8rXbVHS`DTs>ᶝyQ/60Ӥ@I {!cN2e%ci4dc`hr1둭Q͹*}qt%8FXN.ӏBTN]vv((9B2" :-YREFRy VAR|Lj-)"8SFkU F,} LMW9D K5R"gZ99ErL\ZsCa*'d hdКe"UXddqHd4biRdKX~k v cmY%jhi(Ĺ߻~k~%iKKC1)b`N`~l+ 1a&\M~ِK5 iP{ogR!ߵ j2%Ep& O-%Bk4{_%!DƮ„ޟEiqmDწJ'b:" 7Jd~04h4?K<=ەTDTil]0R+bCL6`KaQ@lWCYVN]4VVPXx+qMkFnvrt rD w-+,M$v6YIk7]d@4+dS0XZD~JTuDxS0rʍj gQFxU(suCx:@(]d9ԭs11C95x"HLP5RwmB[AfBiflgzY sC+lr&tWUa`N9턋[f]t: {[銪moXBTqo.#O!5\e:F?ip9u,)KfT{NϨtṽ8NgWRN/&)M/J]^V"~R,0Qy.Nu&t`%[leqW}aM-Ϣڌ1, = 4T7h Tf.}3ܦhU©;jjih:U3AOA8%t2t DhY# teycgcjob<^8W}ѤUu*3}orqlgD X%ӹo}%zS|}-AwB;,㾕u[͟G =m/O$ !v qW%cOR6_|MLg8mjeHX6l~ZGt;u]VCF/RL Un7D) t_![=?1ڢ쿬X&.%v=}hCJ%ed뿜5U^28L/i٢ߨdGߥuG}~Kv{I i|BnWa,6] D i_&FwgKUA#,|d6veEbLǕ ߑrG4X{c17|Gb4BR@*n]^5_2$R q4NY/Y"|] _6u4=e ?>.mN}JzZBi"C B /X:oo7a˔qTHn\w).=&RX_jyw~oqk^w|G_bP?t/&IK>İq6EuXv%iE _7$7iɷ AIAl~! }7$uӞ%?} w?Mw~!K~6R.2ۧMՕisL.+̔u}Z/)iY*ow#->M%{;o)Ɨ+5 |յheU?A׾vp *V(lqMq whacg:\~/f+05is},Rh"gh0v4}-zggu"i]-WILDga0iڇb&眮2Ȉ:  ~y\+jXsiR-9宦6v#("["+)hZ3U#tMGav'mڰBKuQ;@ '@/1|{r7ٔ&irqnS`BcՄNUyNZMлSDOw3i|U/ h!0oB$X*0 NIЧD]AW˼qƳ S)gT|'Q &< .}YҘL]3X!dJZ;1 ~Q2y˷֚p+lI 5ڏ&wOq!$p u6I!mM;iӴW4RY2daK [ hI'y pZPh 0$qDu"V-`iɋ„K^p4BFz7[\fA$UE*a\{sd%Û5ƺ!/%|b?< Y1=UUiSp-6|7.a0C3| HV1貞FsPk*:\cԡyʋhE㣞C4$Tat7v:M-DIFUEFUa9Xue}g,{>ԂfߗN5hw5]rCsz l%SMh`'y0xmNOٰ֜ǃ}Y9fzVe ~-p^dЌJ\L&d;GI{^T= ܞc) Tq U}!xoNù*vtV^>'[ ?;7=`E`IW;[ב*U\;v*.a5QvPmdf7#=P>]ig@=l~NԚ~ 3IXexm`Ŧ:Hva.dm?O!mC5$s +RRw4|1boigerRNN0*0&_5wAhN)Q0G6C%Y.&[(di+PO+/fj.z%/r`*Ym5+7N~wo yXaDˏ$ɒ9I!.h콌BS;aS"V@9gx ҋiLOpCVmw U/u+<䉂%a ԿRު/  ٞS0 myt8kRFUwcv)QSc@yER'L\!vф`FZZܤ[#d"R}݁[aI.3I~\)h<;(\fu%WZM:/>x`|bz.;'X(qΪ$mt 3HcNlؿ<ɉp}Z+G?HrO_N̛a!~;]2 )5V)Qx4{}Rfu0;qL+W{xe[C-O_@yT\^=߼ 8do?\IROFn;x .{R*.ٺ]I~K4):d>RfXh}yhmSQpa12ymK㧵ajaUD/hy鵇g)5U}ANU$ͲrvH¬a`ՈH/^9+S~5QA$^ 7 )OWixJ{Yʯ}q@ni3oQuu@wuZ=].CiSXk]yFwV<.bi7Yzz--Hۑ]$}nD`vu8*mMRÛHT3M,?4Yc!uSc4INU^! QvYC薇~ٜC.'Ck?'T&ɶ LMgrS/3/.CGn*j5}o7c*TZƪ?~IPآâh.d:<ݵZ]4GԒ 'n".)KfӨ@PtBG@[3gE*r=\lx "W)4K^W&fk#k>6%Ny¸[X^R"R;zk]$sڗ/[/VPVb-gK慭":g{t_"q>Q ,iKZ7aMԢTtor,NC]*h6[ D:"49n FR2dsF*VFgyO̧U\R9baƓZ:r{M!-LUyJ{')bqHpmBLmCL5ePN2P*궲vZJꂡds.GO5jd5w#rJގ`Q,.llPxn;OB $(4 Fe# X}(Ʉ^ɤɴiKR_|JKbL0SsUR槛tloͦlJ\4>˚)˖OW!@Lļ$W"=2/# zGގGKO v^CK 1yrTIKHЧ:ۧcDaRX%vgq)Y0VS#W,wp0;+9,{{Rۇ} nIM^:n瓍Cw,gFauSЩ_I [8"N-މw1TԓU! АpI_V=o!}$]lt .u۱ xeͤUrT~bCF[UVN6cX?0>aЙi> r$&dpDm[eҔan~"y/+v S]B6 l:f-QN#5td-| \Kǭ^ t/pWJGFZEM*ojGU W9KJ0GelRyjM݉U&: >gߐݛZSTm% avLn\m9M\OL\}i:49t2"N_bL$xے{a?p6:&b&V>W]B|eyŒUt|Ȃ&Z#'$&SpXM:sv9HFQ9*jDfj!z'c"Z2Q-a[ؤn~z(J=$[W>8z#(,k#r͋}}Vn BV  {clNN-h%ԓ7Ͳ[vh^[ Y?j>c8pO$aj3[WEm B2og0VS<qgRl m;YNGWD^TwjM*]qjU,>RޥtRi+$o ;MǔK2<؜&u) .,=<pFn(UXbf<#&`ZbJ-6}44[E>e@9g,$Ů:LI~ҵ2fv~Ʈ~Rb~fi%cd`-ѡ=zPg"H` )TМs3/<#2۱S=i3] :clT 26( No)-ÿS( SQ7CGM)o5 8mk~{ '纵};cȄx/O]8vG@گnw+)JD?=pN5N-HPАKqEܼy,:F6QoPH% *U]3g!ۧ"^NTĮ+_Fl$TVM%J zvo`s-S<I*b ϪWݼ_z/"2L?;޳!SڵizEz0C뒚I[N` J:Gu+zmdD]r@Qڎ`"M>pd-1w!9;g9kM\uB$EoMVvtHhP.p&T8$x'Ҫ{`}|}k_eQZYϦFxckJT6]aJ4KYJ'QaKC]ϱU^"[ylPV]K0i_,Af&B>}z ϲÉ@奶5svm49s-;Ւ4AWe>,d[f27窱fEܻK & R2)UL1li]-! ^UC HD'M}"j1Hs=Zʶ2&a[a}p !U1fSXj%tUjdAij')" >k7.mMU"q}z 2!f̲B' Ŋy].=5MI@w.;>YmL YXG 4 P)ŋw\Eb ú|ͽβvڽX 768Rcll0L7'Q5Ty&eܰnF7/ &|$n k=YZ8*elB?MƋRR XlНOӅ>[Nt:9]Q GH3N+P:!Ԇ7%ĺyj=.XUCd~_x킌nl*ɷ̨Ofיy!QX)6A^J^0VAj#;v aťqTD[/guY$ZRyyG G4.*k^C,5>-eHSHNŔf* ǖ9z]PD±a>Tr3Zblȧ#wMes PVo)9[<+ Eۺ^I Dȅ(3H}XX"LILg#򫉷y<ѮK@˕Vʡ=m8d fʻ,HT:kj!n.17e`Ŋe z͌bmnLw8Ѝ_&S vlǿ1e?M?5\M9<}r%=e|uRZuh[^`Wϭ C-r ʖyR54QN<<ǗMBĹ戍U{&=.ۇL]i$`ߪ/:%M2 jʒ`HwM0 lEy);H o25{.:f2}AOm&B՞U.Viy#dU%H_n,5nn4ô1sE}57V0ϼÔAfM!hJP E'I|@K)}S\Ľљkb,VV/խ+0'GHEr? )'e`"dX KdCGjNZvߛ׊:$$4DZ^s2>ӽHbM8 mEj(#6}*[lhB-٨sT)1ŮM2[؍7C 1]r$m5,}kek[u2 d\#!dng2i֝;T$mg Xwln[nX<TSx+WiAz1,v*:S)][W$9F%IX.eJ;Lשpvi 2fVxiyb}Db V?Z/9IiXp[K"6k@lvQ=lY )j{Ru.6 53E<6c\#&hukm:lyOͤRar p訊lA0473!]* zː\]urj/:'P9;4z'9']um@Gj*oHƎ//yRUi\VqI6#n~us{ZY|!l tVG yQNH['Eݭ `da \Aid$ɲ#IC+ב!M$`hk_.U]x%ap)݊$֎H/ !iF󇻙0h1i[O*؂@] mY{$9_N1sz;+: co#A[febBZ1ρ;E 'q?՛v>Cœd>s,I/6U_d> hnɣXƥ YiB}t˷nW+8?@ m7'uDEPΔ*6]W隊I%PgP/m"M1z)+ 0jIA4c#mWGVFG]ȍM%69$BЋ aXVs (`s]S_KUGQ{eyB6^,m{=~YG{9LZsC|h !azju B|Ü)/=rw ˩))?.jԇC'CWe]KwEe?*.]^⌳6=K#NF .JoXE:L\{ UOeuaǹFE6 B^)m߾{XهͨܝߨI&m3!7Ʊ˥ʦc\8EGGK?usgCS=N[YEwoxÞ)}Ur> o f7,'uGz첣W?,r"`q=${UMj%p*~/^&:/fF0 >ZR4w/QN4Qöߗ DsB]i^3c+|ͽS-j5>jm)=Ҏ^ ([Yc]<9 @g/ij"<&khBl^BK r{RL[ V}JPaFQ(ۊ -u0ZSk J ,G(Wdň0~%eLNxt1N^ه[~DzH .wQCn)/19- ޒbImB* Leb{k<șoKJ=lo%'T/V[O jmqK{jlc3\nPM䬬%+=sօ>zNwO}#!^ÙVuO+}Zd6Ƀ~.+b:bג&NaRpjAczvHeV'`#@E20}q}ͪO"FA_ټAk v\4lne6kRn6ucl?UE6H^@$ EqYCex.pRh2cdԸ*&o*PYM Lvĺw6S5\nP{_527̒kƊm0˜N̮lpX}n!gY̪KA%>fL$ls]Ò['.tĎfqS5CG3To͢eЉKAS_Ʋ7ԆYGMQꄊ V/4Ub9\H"{ z.v K$~4d%[Gj(l숵2s읺#vne0oϢw4}B݅Vm;֫؝2>F #<'({yZ,p J#,Xbl%Թ%h8M0bV\ʺ+j_4ɪ&0NO/ |-dHz퐢a[D䏕x8#I&;渦VEi%opxxl&()Aɔ qr~5̿cjV%s& ͸ih tN.q[Ν^ck6~*B0P6AM'jNl(|ޱ22(艈UK S֓h]%e0.mJ$&G䎘)4cI!&%-c{9LnBPs8sea G!Ci0@@ًN4cc[֌kiյp7yѺ8pIy :f؎3[XeXK% ^҃$[n*;ȈA;{=途\B po).\=wd5jE[K`Ϡ+_V"N7?$Iz;ڤ5ZΗhSle[2MԘHi`cz{cmI^XIړL 蝹typ"t 7,y-f_k;ufl'$x:j6qv)jJov i(Oc#rcOԐIQ$n)h᷻%+y* ½2Ko'vT86p2#`nu/=T%oE ǿdʾY(bZME9Onk>ӧ Iiy҄U2S,MN?Tk:Oeg ‰v' " +/PvId{Q&w3,{,isi?vժHqq D樰U+y9|1.6lӊЎo=POǾKqv_ʄy[b_fpH=пc{wV#<}JAQ};qޔT w+EĎRFe:흦;%{IJC u ,_F2o&%Q=U?nö$J*f/ʋV'G#L -םYJ$SmRx 2.߷0ʹ{39 =:g "VE"eR G)ωlWn1Sm4t՟_E, ((+:vX}/c6`Jir nm".`Sô(܊k+rGG=,+TdX@(?\Oh cd6_ަNN=V% ia91hft]%ʠ:tvjo>͍|HB݆OǭUYJwl BAGf!}Xc5' LG¡L x'ԗa~wmUbч^軴*DZ>ALUrf|{*܍*GB$N5/h ܲSR[$̃^^nL)QAuktOuT2KׂmDWXdfwUY С!c32wteAV}RMEXp`:uDB}68x]+K|~f鿾_fɛkΪ_S`ǫf:ĿF/ [YN=cg%"'Ў#šHPh6_;W"zA=Hc0x Bdsce0hBzGQsU* +ͩZe[ X{Z|:ϊ,\H$t;S gne,qQUE_ѭn2\7N7 ={ﶟymuI y=k͆Ȏg-3XP10xKa Q lp,Y (0e2 ?W4o@HG@+龿?W/cX)D[+{Тyc[K@Db'\{}6le16T2.FeěQ)3$CdQ.Bֲ~SA;w|47_F͜b4bϵy$;7֌J?Zqpa-)4',UEAO&"͇$#7N kГb *6%'&5hq1D zWPmk~i4 %]LYܺV*kDkۺr4F) R 8 tvOܟj_G }-8mꆁg jkYCl11i"ˆ똦#ĢC۲t&-Wr֌g\ &Ŭ3d?~HxbuH5}-zH}=ualG=bmNM]޹B*YcfriKD{m{4;_$ geC{k:T:8"g!σ~4ܤfAfǓUh1xuff ?tiJuR E7ڑ]$"_YM /45lB0bvQ;׫!OpaJ˞6y[ˋ2ؖajC3˻:i؟#ާVS]~t1A@ ZsI ywcU7f ;jRllf"h]l ^my\6]REZ3A?M1Fr r)Xh Sl ^VH]&Ma]+@ﰒS 5"tf+n==$Em3"jQh`"[]{ %l(+2Cc 1F9 BD8hC@~ÙC4.\*rF}$stR^ 7JvR?eN̆*ʆvu`?^7˛z3ͥ $WA~Zit^@=U*_NZлZ^l?f!&o whhcuաt)e0ۻ MҸuӶB*͎upҕ&!yy8G˕B Eo|خ}]\3F*t zt=<>/ I>^h׆&RI8S>lՑxx]~bHm5O4пO1 <΁}W>oTVh{< W+ x pŊflI@8Ȩ+~@jy(8YbXn3f땏 s<C`i~&ƛLJ>G>YcI#!su-*kAKVeցO}.~c.W>|{#YΐV ZWSo&Р߈=˕Tb&j]vb ;*GTim^.|> -\EwP{dPbEFug,pj|ؼr%}JҝdַӜ++z/MI7.ZD)H. h˺{_M j zǪyNejz3纅}P.}I*;}mo,tGjOx e4׻c{ցN.UK+ ౐x ^1]WiMӺӧ˯Ȯ@O{Sݦ9]C=Z!QnqoB)+>֨-oX(;>ā؜@BE%ӷ.d[c{VшNGL݋f'Yc< `WwϾ8=MȡA o<.8uyu綟W^h`@HL-;c2̐AK>P2wk(KљİL|E}$ur6W˅$s,.|'?t-2/}W^7P{4S:qb]nx]|$$_>1?Ly^j~bS+J+ 43{(D;b>:/W>~[w`{ 6c)Pܜr柕I9-φi$asjxq2+a8F9cm_;58dFxTHn(\cGyEG=ʶVmϧ!Y;c<8 fs Qy)xADkx,8ޡ`_lt^^NpFm%t) f;"=ξ mXxk"z>7/nܥCoK.?mEpA|i2r)X:e^x&\0|tKv0m $*f/Ϭ+rρxbч%uE"$;B +6W^l#t|~hʊؓ17֬":<86524lG$+MbxÍ2 fۯu!r>RYi>xE ZeX>#%Gne(׻`t&mtw=A(w:=9u{"P&DA_Қ~P|7t e?-(ˎirwɟ8Q!y9hm?zxY–/X`88wxJ:G9- ;T[)Obr۝"Wf_OV[7{47_Fݳk}vIV% AⳫM5zvLKi5f)E #cІ8mH'je$=x0erK߭כWcK^M{${M^>i.ıv(( ]U\@!ByOej志Q{_sG,MUT(ժx>RiM?PGJ02cu#/סnEmZd7vx}ކeb& !~x_Fl<9Ցӣjǐ`3%a Jf7GUVւD8Ÿfp&q7~LH崵Rc L4[`,S g E+Iр:vD;Kp)v dxqƅV!j{#ek2]v,#3jƼ} oS 2Y#DQXx,v`=zBp<.A?oA}Ҳ;:XƚGLuVÆp*[ jiRFj*moInaI鷝$Y>8: 2X_~=Y~wOjNr!i;|F| 9N@DDפ҈}Z,ԢC-NXY''F QW%my37t}>ˍ헱| f^y݊ IPA3H w1a78LRu 1+Uwp27"PdUt07_Rk3Ck۸U#IU)ŃOXx@2ŏPZB0^\`;t]Y]RWiGU߈hY`f~2Oۇny0)Y|;KZp2Ӥj04ιjhysh>PeN[pԖH1VEXZWt<. 4/Q]UBeGNj#0?k]E]$ǐ?nˋxp'Fw2XzpW:!{ݱ$5?(DXP)L-wzb#Zr76 ̑4LG m况p`z#kR +Oef_T҆@d="J8~0QapZdQ8l>fڼ핽XkQ[܍mDJ2 a'(jzw A7"AU3:qk!rYKmUo\ЉOۇl 8?fżE4^Ffem#>,N%&[,bdKiNM~E3EԚ5|)O llݺ|SYoX٘9Z s_ $ӷ/6helO$5P6So]mڪaSO Y,B8cK&VE`*V5mEC~ZbHm U1U7^kۼn`dNm{WLm9"ֈ6[eKcomcy;M`ۊ&>d툅u)eEdq^][~QP *sJXT {)uC.=z|碍!ajŅp5J]\H[|EXs'm+vNjz0 $-71\܍ZPH3tQVb )ԧNtjky$#b_8·g W^lƁ-Oyа5BJ9ně.3%ox?%)|8rʞ' fO!1ۨiˌFO,OQ6t辙; Ot|uى9I}4ͮC5S N?}*+-ݲUIJﶿv\^U?CW]t*hMdgeoIJK*V-t:4UtǞc[8~KQXXشU>w"Pvч1av<{ǖI >D/4/rJ/_]iB)7A0lBRGy~y(˻#UJnzxB=E؇eId}4gWUz\W^9 r]~b|i=>3}q9y_cgb- >ᶢ+Ð2Piq%Cg^i p ;GniC|qͥI MF*7`<‘Z.XJqr89ͲKjsT10\Lj^mjɛOjY_^ep˕|Ptȿ 䛭#Et;s6R:. ;fHChU\ Ț;~v=JCm!Tb]MO$O>]BV{_ߠ] [FQ- t@H2sJWwtOkXR kPj{|}}ڟGmD覫Y=Hvc-Bq]_#Msn遼k!Fgl%":oӧ QM;īK2w;c8d^rp(w_]Ԕn.$y3_)ܧM{d%㞒uD5Jg )`0Ba*r]%Ӈ[aIzg6 <}_螈'狕S Du!I-ѷ"~LtBmh(w7 7,__??=,sx}9!OTeOw,7_mنS#w"]gc˕a7ڴ-v䃼S/bAёz @$J&[I,#brϻכj47( /SJr nH,0癿@W3Įb[ $sȦUq8p#k*P_Sk?SGny(ۻ7f1u#Y"Vzm 7Nѐ֏*i>jȤI!ϺEsnvQP54v!9MrLDvGRKc lD:[JdƜRmzF1Q)/qvBP{_!Wo޻8:n&Q &vpӅ|Jw(m gA2lwgքJ ⬤aa L"Kݬـv""c38+x.J4f󒓈j&e\Ȅc즳[@*gj:^wPTSIm)ΛjJ* Ӥ.mp<ّb|,iY7O L|e"_cvKԾD:ES9!d/.B~qg\RSeXuR--q->֔+ԒFUZl;^+/"bgsZ'6Ёx}JJowUޱOE4gME푈|mG^L]z?Sϝh8knʶl S+%t1 TxMY^k?^ 7+OmBfC9h_5$J^m\ƾ_l2ʐvq1;g~_^śewjǍ5\'‹6+&P J0$ coV}[[j|XM?]%}C#lAX1}cƁ޽n8F=)z P~7 uiX hAhlQbu3CD8]/`Z.?rJ(0h0 cz8$(rؾK66VDD,'ne$ Jh܏[k!'|zd-mE%Cօj.~IM|o|œXa Gt5 ,RW r; ]OlP~yoFygj:hLY ~+cse]L X, ]"{,e nԧ,>lb}춷X>(ѣn-(1lqRxKyY ~J)VP%)D -=raJ[зfe#c|aq% ?Sڜ໷4=rb*~ nlw=QcKȌ1.XLV=ʍ헡|xQT*x= Žh `(9abo.7wZ5+0BhàYuT[g]=xdz6Ptg'.;)߻nI&*C]밨익i ~0sO008uaI@eT|:A9LNnϳhw=߿YUN@ QB}fRt($bWiv̏ơ6БTJ (>lEtFsV),VϨɫۧg{"Vi6plů=[:ۉ:Bi+ wA2FmFpv)F뚳ERVޟS2gWVxEW +ӺվH5IMi5DžK-uwкJK9r#a LEn+KRZ5{Rض`IdcGohR @,3/ƃٵ(ky֒hZbv:q[<ʼnP^e,jSy[g&| /w̦&Ɓ>!n0 T7x;IޗATMwSժ(M;/ҟZ>jڶ_[?vӘť\&ڑi@-<{6Pl;"'"z vȐ#Id]P;V1zn//+b+Ifr%L#ힱ'j 5P'wNLw63j)Adc/\{YN CN=feZߊ'Xt񍕟ٷ*dA8P?md,>rcKсO}ŕtINۇ%˕&%3C[IϬwAו>:@Z'T O\qD+bCI;?My5Iz e))83u`ЭKaCB}~۷#~8lj2E39i_~eӿLJˋXۇ5zb_Zo.̋*YxسgQTSQR/oURjIT*1⭲)VF%ݥx7Waz7~8\ȳ, A8^l#mLe4-R$8M )|?Dٰ =m|vVz%>mן~Z`i_T R>m{]ziw.")z>V s޷X646oiXB|Zp_}cj:޵ܡap~=zv]&=VG||c2年<}ܧ aeh`{J|اCd{\DZ9~t٧GCVѱ 0j\پ|].(x?c?e |l髵G)["9;.6oxy¨z~#ªWVXo$o|^|7~_FGЛIsv켉ǒQ8u5cNh]~^PC{ ]mx>@cC![oFͧf/W>mI~ܿf{wÄSo%bu ;jMmڵo{mh0_.;۞>dJ`UcϦL]P Hu#eZ^|> ߈|32=]_4xi`y*.j̡?.Fݏ(|-][e2Q(x.˕E9O_ L+U?e|ȿZ[T;j}n3CkL03v MͪpPh ƕԟ9miqs·`ݟ h텙Q~>YMe'ʛ$\hU6#Fѭu`ڛ-Ke?g쮳=i܄#vVDžLD1.Wrce,E >oΪ:ChPCpWDJHpgJj#9U\ [~@ ZI vt?&Akq"#HQ~wH yUҦ徳r*lWK][<ܳߖH^N<c-1j>b+>3f,Q׷Rqq "26$mgWV ZdMVSHy#J!;n% {.R'9!b^yđ  wGae@ :p\ θne 88l;c ٍ [Е\ ܘ;1n<(SeC^>,s)Mp $ndzK{jՊXa~w-:rCų+7V@-]/~<BBZPfTc~i "‚R:3|A(hnX!>$oXq*D&@Y0 Qa\Kz~>w09_l)Q8qbcj8W\ŧ.qCf[1~x_݃둶d>gW+u/0L܁*U|ZbǂU6tMB*t)Hl8(^mF@Ҿt-mZ>'"ԟr 7AeݱQs;)X!*~Aof/̸7d[eaqڒ,̦x+qԔIPsnǡǔ:6DI lZ wkWHiy7iUt՜1[@rpF!fր/^}C"0v u\(?wef} b%'NB)Wq&aX@V7%OƔ3fa 5.EhXyĠ7+5kI1 q^E K'f^HGH7+hQqw&0U%.;r.ټ6kL%o¸R/ٴ[tc2Mt¿A6D&ޒ1D9O Nj1i4?WK:Aρ/p!t̞{31Wv~Q $ZIvi|g(jF䎭j[LŚ&{e)@‹#rg;ΰB^VbݷW>U\4Xl Su3-%mkNMiaHHܠ1ⵉ<9Z>NP9<) >߶#iQ,oiWpPr1Dšܔ],~Y^,!ʌYnf.&[?e{8y ݪV:~4ՇxvsX'ؗkE%M '66Dx3.[Qm(u V4s^]t L6ZBb~ ah' tMayVTǾ /!XT7,v_źDeՁ1"-H[jQ`xEܹeNfPNݶr,[dP,$% lL㴲SSPuD`,bt&ymcٺvj# >F${;/q~%)u}TGAe\_$mH kT+}iJlj=i-op ;xE &d+ a\XsrUhWwqMvʴ4`j=m\$sqwd9BT? ۥSC)[Y>x0YG`a,n[8<BU}?6fژDKbUQ=)}_q;svW}X{52riYI3gkceYXnzIX!٨k]:i!|;3-bKz7v;[kAgVV <çZ"Y;ZtٓXPalC%9^-Yc? "V6>m\rsbeX'qMi yd-M/syֻ3`eX/M<?fɍ%Xë7_:M2r>}8膈0w]O@Ǒr iaps(ޤ+t`6х-smKS{@~&_u"ǻ /H j- f]Э.Vv%ǽq3]) ,#D,KT8e1TŕO7FFmL@mMqoo'}tDڑܾڤ,I#214|%>di5twʵeF;?#+yfl q5]WRػ"u/& U.QwuL]Nd@vy[ZwϪZޛ-% R;P]fbl]YΣkS,j8\Sl:;k3W JF9oW,8:c{᎓.4JB ]_j-bIR~ 1A׺öP4#o0 mTCqOy%8/ngɶQG3vƓylj>x+ʌ ע<|)x|)Z_u^3*1PNU"߮H {۱_,}b~3`;+s펓'!#/t'SDSQI`Id8Vɛ)ꛩjQ^{X'MZ?p6 ~ZFl 'ppu\Mu9˅MǎʩmBj(TcX sTJ8O:%ox.\|:4>|F}"G&i*Nk:3rH q*R+#us8Bݦ9iQa#[`-Jrq7̆4)d|4䶭5 9X yK֦9$^sO?Vpp|v4у1LC=ӹݟ۞Aju3`јT<k<1V C /o!޹9Ξ`6H|7MF4׌/C)E6xuur?칈2TӅ9PofYEm>Be8q]WbpW^WLKh( a)){#YJlݏvkd/7\je_ˉ c|8A aAx~7śzdԓ ހmq\jN[b;k=nKIa|ɼ$^'<8sSlӨR ˩ף)P&?*3t{S4KbjJ# {XM&gVw*SrgȤP;odV t6ȧSʸVQJq.s|hPa軚aa 跓xr xrc%9w+S9STqiGXrޘ=b-E-˺H](?'XU~yo6pÔut=9y6XaU ZDXu>o/o )YS M)&W{ hvN..rLR{E8d\֮# &e~g,`z]m|:4+k#ēA(py.wM:L_NQZi@vjXֶ;/o&d9@bz̍!;XZFd*:CT?}0@e v M{oq.0Ѽ3{x}pU5Wf"|*o/`Gfs7"jKZd,v;:wC{˧ |nVdT8|bB(#J?TUOA 蠉IU`Y@ E kby\w@$:_xᾺC$ $E$y>L~*7G %PP6SQaj5 {7*[#sKApZ1SWxlj>+  s+AlEXAo`ƞr{|Fanx b|jn1*\,nc{@ui‘<Թ$/ ;~Uk G pً(0>~gI}&DԕIL$yz?NM|9[e.CԶc酸3!U1=5$P֓W+Lһ\Fn=% G|)\[W.jY,ZQ1Δ LC ZGX*tL-sҎ;6 蠡+P4Όu(! @S m@7Ɍ(2$ ZKto1Gd*Qyg /dnm{/ɃԴv:r7X8+̺Ujzpf@>c7~MZ3}x&?м}bme;S j-TpYM(jMzf+4|_^Û=J.y21J~-5O'EbV.=c^M#i+P4gߜ9KlYˆw oCE*OL%u!WjKf<&@ 1W$'44ڑ J 5.ӵ6 P-G͗fZOOw`CWw[D?o??oy? 1ʢ_ޥSfL-joO#K'O%mGaEdq~?/)ow7?_;?5ֿOo?ǿO_Ͽ2OoO?j_//_^~qSokb)?%>#߷"~VgV@?Ώq:/II8yH DK"סJ"YIP}E տXnwoX, G9>kbpT*x⁻yRMy}_*mKqǯArRm=k)MoT<*j__ԸLyٮ>'3i U+w-+79$*B&[Đd{i:[/t6PEID<$$GHx%l` d'@}:c^.ozKjոI麮ou+`^?`gqvZrR*C:xک [_o GwEcǍ[[2=ԧamV'z7~Bɜ9\oMSW~ۿ7sQ)9RoP,3,<⡓I*!,RcaP`Ӻø4o[?eC"G38X9M|1^4N9`V+&`{O3bO" WαFy`W=F\Ч;Lrr˒Qf\\yB@D0)sHmSIp7 U*ͪ0ս-~L|H1ԯM16V17[ahYs@,u"abykgOMyP&o`_JC&ƍ:\PhH~x {L<{hi_>OzeN{@D`C =;*zѫe"|_xoW)6;@ˏq%ǥ\NYݷ˗77bc <=#{4cpGr}8&6U*懜*L3 翆 7ѽ'e?1? VJU[̛V ֯n*[BLW*D?moOY;۲tPȖo"[ EG+6tCW+L$O),=:lڤa_rx.B7xE= 1-hV-Pni1rO鸿T&ڲD.F&t^><C#;Yu*ڏ)u쓊RY|҄0^.V2 9S<ЀP*]r@ra'RSur+|1GZD!eSƻdhEM)H1feN.َr' 5%PR[ "d?/[ m}DE1ufݹ#8-~wpQ1N4B>1x, "\X`- ڭ%8]LCmILV`}APiaG j~i]nw/S;u&p٦CS2!Eðy6 +[u TTXYK$O&$}._G)>$lA!ۂWS7U>mMD+{U6CwUC#6t,XvBԒ*撊Ȓ)6pƛJPl4-<^`t)w((V3[2Mq*{DOd8VS}EGS%XB[Y=;S_M~l̚P4`84E&2_.jmiOsqt7;ޛY6~ ױ%3;a:[h!ȓB~ZC7Y50iRكNc;:1olSjrAJT BD%SW*ݷ0<d%c.-U0 Ze5uۍpGr!j%qCE7a㹛RՒ@ä/@&*)iz|z׏d.:is})ܜ~ xb+yȀN3 {}%aUU|MnR` rY"20h{ $EuC&1rñv2o}0>&MDl=]UǒyqЊc)4k!ٱ]XSlbQ>#8Henj]zcny0uRd`q Z9 kC=UոI'פ~HpxY}pAa7/!VP 2~ P~4ObteLU{nG w8|ЌҒ' IPQzA1~J~UKhhu,@ M}2'+yQ9b/@s`5@;|h0xc˛( |aV X+M">46>H ֈL$)|WX2z;gO"9ǚtgUOf_1fv!j3а-wA=";.R=";6v4>TV.mm4Tf甄%\ߥ4IkwMJv[? 1Ťѳvnx/VYsd9>2J#+&0= KVv@{Ht:ښ`#܁?]D+j'` A6 JFoJN0}; l5v` (jm83{tj04cN%& nk;og7/]OꫀlQ~eHViOU*lfJFJҏ9P[?DexC%ޙ'$E*"l-¶#}A@Yil3W᫷K.҈È f528W]l9g:|#Ѳ DT_YjB*`إDzDD 7Cz.[[;?<#qҔeSk{`u71 _fdGX^(^5eY)g1MԆ$\l5.ⷅJJ/HJx-s엙ޛJJ6f3!y"E8A{t|?o"Z{ls1ν!ƶ`8͓Ez\큍bb۟DA4  Y*lh5&0~HJN+DQmr"K/`!/yqݛ.7͕枒qUҪ 9䒙Uͪ c+mVK)JBy@M5kO9NBpoTKu*Vli\=v}zX˽0]Y1܍ønm{Iz[ē .Iq:_N>7kgo5Rk-ӭ|㼟Ǜw&4jT m sa1yi JqU@:S.鐄AVOd⛗~8AsS*v;?wӛ-yd$gn[`URGئl*-}&eE٦{`|Z Tmk]5y ̽Ðz.Z ,~ePsH5td.7H(Dnv~0nEиI ý;4//"fI3F>ĿѠm3.(2W-y|ٍ6݆ е-djC:q]@ymusF`X6lRV$gdk7qR Pk)QIcOgK\4w3Ef1> PsDwGt.=MAMmxc_@N^HA.q.bIñphpH:öx%툝BO?c]%AG'P V}N,MM@% ި_(#+L90Яd8QQŵ5B(B:c%C hj:&kjH׮O\OVg1m}v24g6la~nh{mg? E>*t|8a N8d@m6*ΎcW\-s,˄^5)Z:&BZ-v*XlU?'mlm]6(NϭӺ_^C{5,'lOqvMEOjNTԛ5FIۼG@=dnt7F]l*GҴe1s-v:$N'W![d$$8[z/mJNYݯtefua˫o U>࡟8Op|v#8(OHNÊ؝&t7H*-Ujia 8"PMvx J)#g*}5l%)[]?ޔ+=T>ѹ m3:Y^t}7|ck O ~gI҇1g UH$_1)rȓ5M {7wwjf_oIїcG5,?3>𚿳dSŦX"Mq; :/;1C7_` PV_)?yܥRi,D02e:¹0W{q}ڠ`ZUAzlB))?/|ՀS? ,<VT"D 5X)*x8e߽7|q28['70IC8[1c)Л""7=äc\lfج]zu52+n BR}va+PD Ӝ >yY)j ,`rb$IFǹH%sm'!Jm>!}y đ{d $o#7ΰj[틃q:g%zTUUQ%ܘ 6',͟i0 &]N6$9e+M6"6cJDy:r6(5$4aV0 aU/wg?XEBp^ÈfQ$+ ;*sFd "%"QHtSRAʢ6tfG7({"qrO8@١un=ؗcrflUm?\+KdVezyYHM qƬqDƅX4 @I%lhuo,m /Dp? XoOP rpX܊e+Y㉄ׁ=(a4VbpP_omWJϚj1b]Xc+>ENuHDv8Fwv9Tt#nI[V*N\\y Bb/hemD$*:’Xn ~ Cf,!mf&wO/fks՝'\ٖ@NJo[r'ÍRDВPf-bK p Ԣ0[$h39m۬}Oeck9 9YlfN`X 0]e[9XL¼ q%]lx*'~_)!э]pň24HR%J.hmb}Lh@hEB)>,y)`?Q@3;'19ŗT|!w]/U$=QA@'Y˭{Rl caSv6Q/I .C`h)MZmf8XA$]7)orU: APB@*Tc9lŠ{!J}T]EqY|I@E-w 5qno;kCbTҿ;NsZjMmk GWX{c͝v}jqRߢWqkkPXp%aX o@Gn|bEVEe"O D=YPbx!v*fH3cC$@]S)ώ\5Jү+5XԮûҕVj>TE}M1)DC,*Td%5w;INN!ucG a`J/LݵVճ(R$Dŵ>봞h^X}@#L,zc-nxaMߍ T{1(# Xk{G{CiƁt*T"A> *411 HxO Tw7/T$V󒰢 K0i&͛)a@78jZ$Rgsv˛ e2R}l}ԯVi&EV69*)K ^=N`R}%*f 2lbrvo8]癰;]wUmHя{9\!Kf\ tg&7:ZvH.\|5Yۧg `ؘ]4gw|і^9@=M[;p\I0xb+"q*zSt;}hrӒvB@g@몊0xaIn!d-se)]|:řkP֍d 8jVމ^FKLJ+}64LXg5YQB)#~}"=q2zo,HW5>oX oYZ +kߣq̎ bwƫZZ/@D1S O5ie_Y#zR/QB!Q֧kM[Y]M'xquw%k2x ،9%n})NuNIZI4ߡRQ HK>o/K<[{BYy|cc-(пB$KDjy&&//Rj@w*w~alXLaVb COZ=cujv%!Mr ŬWKIK<4@!ݘ>#Όd@Nܣ7'%uo7['KPdl?a 6bZ6+!瘀y%RRَ_T '$K`釗od:PJCVW?FN(lȑb") uG@.OLdntd*RVjV-j ]PQZvK#.[UMS鄪3+{OvATsWfL5ߩը:} Crl'~dͽ"! m&螧( zcs" GCDU=〢F|@LTT%O9E'1|(tP#I+ėPIgf+7Xj+|D],)_}~2כs\/mKߍ#&5U"2&ľ@RpΔu7GD ˋ}){B@zas&t$,o+!S mrŒY8nø}=[ӛ B,) nqVN0j,L@s7W&6UHe9h|}6{:5o;IS}l8VvQicۯ8{9%n/sLɔ3[+؄Z3 .lW$E&-\?poJ6b- t MYE>e؎UH,**A(zQ 1P5Fxɇ]VƏ5M 38|J$e|1mh7pO=6w{#$NϦ0JmE͉am`>%j_D]فXaץz?\"\T;Wx3m~oo]guk(h rg￀uBJ3@FS:9^'}ce(ƈJ0& 61TZ_yRbFTy4.[kޯk#K|S(=!Olhx}AkB\ f)s.sc<9#iv,Pl׊\r{b;=PV A%JrܐV$eiM(eRiіjb[ID 3]aQ(gqQu|AI 2R¥px`-4N FD,(oc@Py!?!8gLn8!<y0 y)6汀@O{6'~be^S:*S]I@jISDDE(Y뜦__/S]'yZk'=ds6yƆ&r7ǭJA Y"e)1Evt8sUaoL=Pe!0:+')h9k$tJє!wݷJ b+<ڛ`֪jg/八e rRkRSD085brF32oꀂA*nSmx_$C' PX$ .h6eH; @ؾL((| 8ڨQ]f͎]ǯ;{=jG jj( 8J]Z鰧Kb8u}nL{'E@F7V<%yi$ŵ/N v4:~h فʎ anmױJ{_ƻ'sD\.%XOn:^M%WA]G8z\LRa7OP P{76Ɏ{ȧ7*'1 h+M "6aJv'c&6@:}6Aj*%4*CTHY jaۯP)fyoO8SZn)P}nl˩| dAIZ σԸ ҍ. 0U P,(c*]lUjTQPЉ>R{mO=gL{5MCO+0b=X&"tgg^ %7ViY)0ə zMbwc/v{Õ7*GM>.j~5q_GOah:܁|)h [h)!_4ڤɈ/m 1ݞt0P'-AKxq!ゃŸ&L@CR̦;SlI&DoBUy ,{h]ŏٯ 97s.hQU1fTuV6ZA(uրZzNӴӨ x9ı DHEvq9TeaccEsz2kK$dsfHC%*ymX&W&qMsT!T\\~?n-rڹ$ALtD:;C ;oE'xoFb f3l@YX~sC??|CXܦSX9cث+\FyN"aSRcXJJp__cz\)OP![¿LiE.`i%mq7 |ysA.61ZL~1"T!ĞP(+Uczs xsUU(2\oI屪ԓ"Lqk[S7"jPatLjtth#nFE S#ak<@:wL-t_%3^jo7]Gr hY:zX&=_&|h 3/.U3DbN*1Y>Bk2H~9MD\רٌ0u#k< Fzs >ʽ]"aFEz3`}M˗P+cA{cJ 6;5Uz 1WUfz_5K ׯiH1?GG,␽LpNi29Ӕ_|k{hlbη|!Gium SEDZxdr(HB]BlvšW)&*9HWޛ|H L(rL|3$*!-`H/8d(AKZqsMbJza%WlPV]0PЕjuPx;Ƌ5Gb v,gyy7NvDZ>l+}y!*QzMZW{@ r5`-/I4:bZx9 U3C~r?=N .P@4ÿ x~F"SikPÜ|m\|tcJ[?BHA&Ե_^M=^ዔox3ή!w{`z8 Pg` _xˆC:atUZfD7bgbS^Qw!X9}}Qv%vXشqڶ?r+0")cfa1"藤R$8J~I¦6F=I2A2Ɋ>Lٔ^Lj.0l1a`>!i-Edx|rZ ?]0Nq RQ gTŮtkD;p|U4SАb&Vqa˖|tbjMؼbJ<$1h#ZR("çh1! zNgS/Coe.^(PF]"KzJcĈS\B˦#,ԟkRM+]C)}2^(we F8EЂ<T Dx\Β,ڹLK$=] Cp=0lipanZT-IA.M*%1㖕6}ZM}3PNOoW5I."jr YxpHlHOeDEV̮Po=pEMQ"RNӬJ>/'Nh="d72lS%c/>BE&PcL7s!EqnmʱǣQj000ؑC~>pfb <#d8wH64SNFxq=btsِt}ZM3jc}2 utO5MػlM&]SL &i~wJ3KGb3y?1^_%-IصAe{7

>Ū`n] b]}pT/u< [> A v3Ui!Oڏfel|7 4{Ep#C!PZ u <뙁 o䐌F'"Wii=aS#Vq$`!,%)~0Ag#,;*\QI~ͽR/\Uի {kgqPWE )uE C\g21g4"i 9},qxy;eK.9V`M Pzw:{.K p/- (K;-6ƥSEDI"Xۺ;@pK.6lTLp7~}Y Wf'FVfw9Ү pV#%t΍u+|$vYv:RIgz"*`&kR XO)2;?mʙ^wpgV.>@` eg$΍wEr9:HN 3n珋b)0Euj>NK>PGG~w[cv}he fN pYUqpn=L DjY7V D@*; Lc}RýEL |Ex ;ֻ*[QKR7VgfĸOPYğN#m]tDYGFm'9߭A!$(ҧ9aՙ bQsj ŋAmhdyw*D:ך7!{D'Y nj{ܭ!y89NٔԪqyRC XTmBS]4 \y{?<)fZ7b%< Cp0麕J;#P$COkʥ%Ůf v:@N$V>f&~iQ,ֳܥ4`*BdŜDhG1]G" 7(0wUnm?\{.<V8jQYRHԴY/T>^/c;1qxG"wRUzC- ̊vl#!CPqK&_zZ) ACt5~g~VZڦ  avf ,m]*a1nuYQ˹HC!"t%]Ib͖CٺBSh?F;nU4 d R;p bMe[OLz˧d?P#o1SNިj5gR\#S溵CgPzk֮Q\ZE3c!}BQ '#{NHŃ5<6:'+C_$R:!/Ofua oob#Ii$?Z}hNSsШ-jq +3>w=_bיug8Pm&ќ矖*rۮCԩ6Q5PE(WpRcݭMę"{ݖtglTW02;w* <1Qt<:,Rm]e*-B{ߤꇖe/YRM!^θ xtu clq"e{S(:,W6dL&քP6@L<# Cw>}mͨ Ht]i|u,+9JH Ǘj0։Y[]+.]Q B1Fuw s:03'S2tYeZMio.5 gZ_zvOD. (' Բ"tJG${W9P9aП=p?2ҳKeS􊜴@p#h&2'"7Rܯ܈0i 3uxVERl16֘}ߙ>lW]m«UY"܆oU-CI|hL}4 ``09sղCZ~CSectW˭ $q'`$M6tŪ_;tFIt r=_'rը9OŊ=1fx"YC"BEV<|3-nlLW.vgUh)5L8Nnh UY0 @q̪+I89Z$ nA4zBDUl{{t I%Qn=`ɑ?&kK%Ͻ J|alҭ_@AqycE2fܦ g˛AUjC8#Ѵ{kV&YztCr/4LM(S]wg3$ܟE3^*sāxwHln۹bgVya<@iӥ :JgEZf 2SfOl]ot36vBs7[M2@o)a$[: fϸV8.̓Y:8O 裫NMڈJڼz.Ns""kjb>o痡{°Wϸ6Bj{?F6|^1څ)XP7YQ6y10z(Qݺߑu! *ףKߟ˷M,_SRfq<ͿZŔa} *#c L[|2n]hhx%O:b֦dFa$Cl=AW }S$ 좒j1iY)f0L5b$ Xj-uݜܞC /_9! j&8e5#+ѼzFL~>E _iִ)U1>ecwsVUôPt;uEt^Xb %%撀jML3\ޛϹ`v?\J+JJEE kirR"S+@f&F<8us D[TC|(Nta(v 3cE=*%nl?\I!SLsJ| )Y!ݲ0qRP>].5ɡ@x^ͳR^d'.^L|la|Vr.r`I Q5EO9]Mo]4Y=xb%el}\6 3xS(}~[ =vG0=4S/ s?7; ?bYIR"bc weejo3E\zK Z)$0wZ1k7+;[W%[Gz!# V2P4=S9om?^; M"oٗ6gC^#yk)ĕNn0!E(4|X_Ÿ}$D$CN$Ud+I<|8ҹ,wBK,zUlD9"XK38nⱫtc-Ht޳l][-uZ;oDgIߐReL.1 јzIcBnvTY&KN#aId8+޷%ڪfSDr>pŮ!ȇIyVtɉ2'AdXhIz/]5Ic<~1967S^7 E:Mבq"}!†yT;U"Vɛ]x<l?^8c΀ 5KҜxj][*TVf@1!]%)wv) kϏ4qB)%J}#!ؠj>-^M+aMb*?bX:N Hm=OP)>eNvIeڌ' ͗Pl(M.gJ^Ui0KhrYnm?\ 0`ni(:tnq-F!hJ)N6:Sײ$=a^DĜ7Bfﶏ$6租fL~[ xy5yR/1IY]ȃ}v-(k5SbM?Xax<~%R+8^8r6DDz׷@]~gQɴ$VlB`L Ё,lgww/zs|mR6 @xgƖ|,/9-LO\AZ3Rq!CG t^ѮZGZ7v2a!dzPv픥P5;(46iV(؏ֆVRZ*(wD _Oa=m 4Jc) wu^29ZO`T#ט|P5h<:61#u PJWwx UP~ip[a'}pt8lbG"C823j>EC U.OSPHT=CIV%ks2OR"՛jszj iG] tG$kj'#֖VҰ䱒s˝ \ktr rJ8y_ZsSs9Miva5|s/] 8ZJ".4ǹ.'-КSIL"ىӥjKC{LuJ# i[X/յg7ϵ`Ѥ~J]_e_Եbuvוd2َm ÅXя^F[ %|Ei"6>쐮Û..ZN Mkk*]б[&nLQ-3?Rl;,! 96UTG[&ەh*c0/?6-?9I C/gH_nw֑2Op&mko/<,zClFˍvCobx[G 9boPt2oO$+UƆItۢ>^?-L` jĝmV!D<,Tsjr^o\ Uo!5Zn~yu,UdxF-b2v]qbZ<^B0jm1}v'MjW8)c,,M`tZqU.nnfm"6kebܔnDSYE}nDÕjZ~V#XSuyV}gkGꡪX͹P &yQ(H]v=vLkVx)bIF9rn!xj`琩&0BI!t%t!촒):jLuu oXvLq@+RslEۨ!EO$p6 ͜8J{C}' l 0pP0iorh];% 4F"tw34T ^#dJ*Tђ5qb/yZ"$^U87t>L! eK 8#b jGH[v83#EEl=muCҙ80g}t/ `9HrՂޝa*6`š6Eϕ^-]}[+m4*y"MQH8DJl54Q3 !a\%5R:M7KL.a,(+3 Nч@76j[ LIϞwWI˞1T9a}bg.3WRQ:|lItI2%nғB:BLwcB +R!S LLTOi.u*SlaՍ+z1K$1TZ,>R(7^ݠذJ*M~: k$Ɗx>/^C^vz0T\f/ZSs>6? adLMNf#Jd$v:ދ=CV6Y"c |kfZ#GSpܙ>#[stFgV^j+-1ui:̇ʔb#[9*d`\3F"_ deQQMӹMێt(ыEh;=n#ylm&*bԈ ˔ n7 K,Hk̻ڨ4v^/kXj%ؑS^Gn%˥(307뎢鬯jPj28!k+qIa1{WwoR5cptZۙlUj=I)/~$7j{TQwߠ]R{BFVtA6'.ꕩCx^BSe˟m}|G(7`DB)i;|K}SN"t5ɂ%K@+t~_3drhZ)TZZ-0-MM I4G./%Ҳm U)A#܅hl8c_O,Y).&;4rM @U] 13(ˈzO¤˖oxy_MP)nh:akh!RUVu.QgȤxu%rmLJ')RB`pnS?o w--4]¨.CBo?+ޗyuA^3,z Rj k~[6_=rr*Muzaq$(6{!p;dMw \S0SՖ,Kͤz%LDDiU0G0ips@BUK", + \dN`k8eˆw'^HJ mQ֭v* Wrm7V1JEVCkkeWWR#&*f`OTMLaucHw9 oMh=yOLv{BE[«kV"jHGO+8荮Mix@vв0tۼq?nbxysOU"MH@ V?ћlûEI< ;f" gҘ!N*%ni=姏7 vEa@2"3aoAa;Q绶P㯨b309H'24$swfS*JXd+i $AmK4 =[g $k~qyNRUM;nyDdϋږiN7;8; f^QG5[f:+m677Of2?5<*8/#Q^Bl#b5emxw]y .t!qi=ty]T&s ٤,P))3`E1RYSj|l,}q]r dHGPRKjɼͶ=[`3(4T\sxxi-l(1YN5>؀' gXl"; BK`jyCP TH %u#O1~j£:"`Ov⎦^]i~Qh&U~n]ATj.=7^ifHý=3ሆqY[K85sRE:DQr=}8>aȐe^r&ϳ;Έ:vJP a^e) jm M9.1B FrJ9|NGF9a~{Eh=N+xTbu+Z4KL #;Pz-i9QYXBՒ|CLDx%tO3U]e =MAq+81lB &jB ~R֞ 㡭5Ra?{D ӈ8 ϤNޗ,d_DWefDƜ۬Eݡ"EY&g-Ҡ= Ɵ5G aH,FisI`Li?$k(oM"'6'1~>) w܋!L%L]<-XHLB۪k7GT6MXP~K+T-G XT};[Sun)p_B4jRga/?^KV~,m9Rsmh%g?/9hChIDxi\a[Tk%JuXG3hYЬs_TPqlQ[dﭏ<6x.FK@dg,nBr./1gGwp썦M1[7)544l]l?[e¸`ltswIIXG @~PX&eIgYY)X;mFESqhSrim3KJ !p %:% ѣ&G =N/,y }_ D4h.yUIH8sh6w&j+RCu*K؂ȓ Т9s1[pL^O'߅*讛SS 'S[}>fFX. /m$/Sn$8%i7&sb)6U;Ej\yW%~_14 Zn'M aHitHorc{?DNQ|~`{[sxEEX's67F *YӎW#CD 3p15*Ea0X ;LH=nj1KJ##"a.[9;Q|zu|1}?G)AZG16H $:`ۛ)I2dM (*۶6epg{?Ixx-%_cЏT'?B1Z~[?0U0ď4* 5qX`ɰ@E @[_A\U]V:iR- )5Sn#u{@?gs\ Я:N+E42ffQkQe18DlwiUO|8x;͕qٰ`${S*Yli7|sQ^tV y Hh ۋ8)Ӆ"D0y&\ΔЃ(*[:Rz,n}M+GEe%ѭg'YZjZ_"X_]^"/i4}^_Θ_?=R 29xm#5~n"M(b5N/Qň̓ψpk}:a#Y+ ô**Tmgn*ʎȁndccAS$_< Hf5YHձiz5S:k|FWI  ] RmID ?h Nm)XSgq%d筛Ajy&q<+9~}'~|ʋ|l[Z\P:Ku)-Mq2Vx.Z">ua BM/4yxxSX|,`%wl)C~R0`8¿Z#&UuZ~rGZ4\c轢NbUyD4>wfbo I``fIQ@.Ǭ%+'PB̄^+Ic ٠G9eRn_]I!zxU r> au-MJ\OU17bPɳ~p>!W=dœϟ0E-YoKOJ6r4f]KN6Rn;zC`͠vw2k94 1&qXyLxKvU,N@X:Hк/9'ɴe[TC)dN\,6(h*gXO)E3@|",kkZPcf7_krZz2`r"RΆ%cw›L.\6HU ŦƂFP[b bѾ}# 'I]i5#kapePQ"IdAkGv[A;L9wl`EIhvmZ_r%n*~oF-?sœZ},`g /(4= O"GqWص;e{7VgD1>TjE?ս&CrI4a8:+]Xk{q\jNeZLJA^]$)oWKדOg\M?Ѿx t itImB+rtr(-e;]Vuo[UpsZ̛m̽ }'=w8E/d_X!  _ -'qzN66~u>~)ԣeDOw+})@ϟ {Ey_ l tzăк_J8LS_pyySuD7r;ZqOvJp2v"XrR8% +z>GEI,ƶmlYP1ԆaDӅh>DaZ;cёOy\zUa?wVyʫاKABɰ`(j?[A+b J;B1tceokezsaE7FʩAs8?\ZVI⿿1u)F芿ˊgJfb(Ti|1d<_xZ͏ F¶kj)Y6VLH89W$oE1cF9;6;9|oFn7M+UM#ٿ}%'T,V'J~BE'BBQmba?_'Q<|S^qkUbܲPlh<3f踄sEf*qS Qװ6;з_C&\P B9bsXחډ򓭦\V\`a78UtT`9*o4mb1s1>v{S1`8ფLtt{ ձ#;G%[#DQ ͂K*A>nlc鷀M!*d6`Oedde>YU^\w|n59->qK ᤗBoyeSbZk0[l*%Z*Ǧ+ZooVF Hi,qI. ͇)m!aQw+I| Q@m ZYg hߵ#9Z{U , JrV9)^xduV{9s-s"ڞYьHܦ2ǯ_ϵ7.]EK!'CJ]\Cj[Q-;.au^v4ҥ߆oID9?*II~뾦dlDz_p}`3xܴ32onHE(B%_#T,xbWť-IW~aXVUp)>!tP"^p/s/i*@_P *BuƶIm=Db0>Nq/#!g"QB4Πf.Eq9[+ &¯x] !02)w/lZ ck!ԉћYWGJG-_΋Z5sTX>Pۘk3 ?/LQW靚x%k%z\> d]` L^7\Ьp 7Z'/V;>3 ˹@uW\D$: 9cTW# H'dUe{Q{&:( 9?Md[Ϳ<>dG9!U_j' ?Q% ^j&9FC"e4meKqxsXj:WZ$Ё:bF1(4(1-aS` ^mފk*`,|eX+]I=M{ieG2Y"84Ӌ/eeת/1 C/?R='í#}$IGw/P; *Ž#I um]m~V-C϶6S_v?oߞNܚ{[U6F/A>7w$;tn6-jB`QC6B"Rqkt!uV}v >UU3*5=k@\^dv[ -R|{I{-m~c,]^AsĖę9C{U}:^=j#R?%gk!X^4$S Ј!UڡWSd7sjeA~sP@,~rIXoy\וcA)̆  huh)СW54ʼ-4'd3ECƧzg,V}6fj[߁l/V]+%Ew_S;yI6kQ1-6L^^IYr=w_3Ћ>RD#I]6_9J y fniFsXU4jm 鬡Q"lQ{B W9;'XJ{UE[8'j Kqkݾc[ͧW_˃d/Nxh08cTS%n֢~3+cfšJ+YH)}\x$0]|?WW1THu!Q Ghʣ=hJTx3SD. WQ<[^.+l9/Ev(.lmޫΩmɮ#HINܒIypx6 ם59AQHhlsOwZrDLC^^m>]it9~&+ td'#RrSt4O{;ysBh݀nȭ]V0gd6k/$5м}Jv:Tu<7]9o_RU]w2i8a9#vjj%w|;wfxK-pI4qHԾWY1N--q28_B|i5exnLjNۏ1^6a7$:9I.kSI<(>Hj\;Ū@HP˦Z)#ӬjdP#@upӞmIg##7ueuF /&{q$ ֫zNJ=e6N}<ѪT4ІLJZ" -PBoJj]Ol~X+-L%CE:}!uoBڔrK{,־4f'SQ6(/ߌH57FO}m s(h*w@bssSbMJIa8 #RU<;6_{ hsh]gARsx8 FTybA#Hw853_oif&ȷȁmW}2/be]̹N︭V_SuXK {rFۑMo-] `zWױHiCZМc:~["۳*r^%{h/<8{ņ4rY S骐޷W, ӱbc EDeH]h澜a+nm rדRTosn*"W R3#?׬`Y%H:5M TyW"qX0n{PNgWNgge-3 KCqz½mdg %{A08#%$ b+$shx =cCk @W>鮦pp5,fԻClڮEZ>h-{?)iD"\ <ܝUcrϊgwQ/ozlgDՕULNs΍Y/|TgK1 (Zs,8NWm4dUG(I6JE'1՗eK7ޒj}K*#4rB,.Ph\HhZꉫ?+ x[+C2\N&lK*lKd;ܐd*Z"bxn2ܴ򴹆{N>>Y,U֭ :A0ef^-6 cn!hߤpoLԨ>W Y)[ bIY%Z>$UվPT>0vSG Ipň;ud]=ᜁ$gg;\sW/SZK4kۉt<:Mt9Oem{Xf r_6d~#&*ca뙩;^T`϶7l.f<`]#>f\ }Al($#gGYVgRI}\<5|XD+h_rvheHONZ;5=J0FStjT7"0iBxKUeN]+X,((ujp2Nua( 格Z_>[YŪChHwCLsF=eYp b$%d ([AΘp>3GE<qR"4Z5T (Z).@@٬G4|K\{.'fkW!Nr;ӵKJ'g0;)p׿3 x3dؤ+ VP(J.}Q$h!]GFSH8u/~OCKͧF=!OT*ϭ\ZJ9MC05x1BZ.R!B9ˎ%X`{0%YDq2O*ANP743)I\ [5-P:4A Op@M5b#zl󠍪cIPsY&cI̩]b Uҳڑ^6/ {{'gU:kY_w˒ckըcU-{@Wpƨόn)b;#: Dڊ =L!A+}KH`Q0JtE v^RP#쾷>[%V]1sL2,BH V2HN -\Fzll&no_Է욢ͷkYV{pɳ<Գ,E{AT^V/fb^"PD.jQled%[2b TECοBk7iXufɇֺDpb]'k D!Cb2k*ݑꟆ e'#UۋUو*(G"">]Rvw w190zi +׸fAId)FpILc|=] 瑾pzl{]D wb0m]C( uh/2˱}yPrɭ)͢i_N-H#w{F$\%犈"jw|R"Z)jUE#܎z}C9ş?} cpHgA{DC[ۖlυB㽚 ȣB̧_ꬒ¡`^oKU/y/2{~czJxM7|Ae(Z_ݺ<+8пBO;JᾑlwVvrC`]ۂGF\5/eE`jЂx3ܪ~r@,f0)څviLGԾc֨%ۚsSFg]kATRB3rGKZ[_ 4LB}^5xWԩnU҆I0P]_"?p)_"u/n.93QRŁA rp3i 8;CP;Vy ٮE@G[ӞȠ5_ghe5綝/YGz؁"&zSDkf&ZطQ UrZ^$')Vs"wUTc.>5}$Kexk 'M; W$I0(Zpr!moO2¥5\@ Rz׳۠l0Ʒ|Oeϟ`nW{d,-sK澯Ք"Jmܛ&AoIC5ހ=2ZV|mљ$$d3ǗF>v+-fExvy#@Mָ|[-k\= Pod k+LZcFORA2wb"'<uTESzN})R%R"-;>4{Hd]gxT8=nE-XZ:m˻ܙ0x{|+aVdY޾ I"M%[s賿JᮥЪ97{h8I{ MLU ؕ[Ǿ"*1&K@srۤ6Z߭ ZJMCա[MC`m:qCS~չl=q{WGBL [ߡUN9gjn3BK!-Ӝ[><#^om;+V@o**h_ D:ݡ73W eK0sz5f1F: cY<i-b;_Yu%xJTz~3uzXֵ"U}71;XR% Mˆfwl#38-mg'z BX3Fo u$L8>/e_]6yO"Z:vLzx)>]ZMg*&mj?M]JMO9W蟝cdjޜ^X%2Iz~M`w̓BP{X4 v|BJj}6jy?Pce]!ζb׾Ҋ~ %u Q< .0(.fތ08~w>T$zt‰8T dH(Jvz1e'w9GuwgbS|ۮ컍+*['_])L@i BH=?:3ne]tBr9.=\K32A~K Y60el]lW:o@!糒D˭ZlU`" cuqvg: a?n@@rUTcr1< E dՍTYe;hV՚鱇L|r*6*dEdk][8$lVƅ7K͗9rl\/^1 cMRT4b/2A;'cX`r.#eo# -"qM&I*uJG!,2$W)588J^lVآ*$gcx̑W]JWwSE~ݸ/Fmnn %,ۚ0>%Bl7.- YZ^V3帬b}5ēIK! W;$#{(Wbٯd𷴞#`1C&_huѭ"i$<\K7K[%IxQBdf^EK1(MY#CzYGsGyR.+D. ܊=֢ HLl~(E[5 YE~r׶(_8<43 [j5zNC*,O?f!BSCjN )-&D nfv,Amiu]Z/$rm5ϝѺaf8g/ݩfVjԡ9A5}^6X ]/"@(w&{,D{/S)sJ>Dm8g.VU?N-P ~`ܕW$$R[.Զ"=se _6YyTL!O8O8km[RN뱝+dtޘ|VO(][[;30yDu7z60Ma\A gkS "`u|˳pNPnָ%tWRw4Mx7)/ZT@^p5ff8V9xR| &Ywc^:[tvXvIpDov~-mֳk`7VL^ .N*ˣ^!SM:#>>V,4h]'Xn(!R9W';t9CݕI/}`k 2lo2woҀt㔈~.w{ \4 Y!3 Zmr=I#= V˚tK 'PUR EoU9D?7c&Gk8/$Ey] ɤK+ju1H+gc6]wnO8h~f,wSWpWlz1+@qtsVG4 U"#] *8(:ë)[6c\j*#MU8.k,5`B{E}i3II`0F;%e^wJكO ΊVczsE׈Vlg%/^-p][Yح BsfJE}) ApQTgA;CY^kYBIl?5B!0m [%K_K-#+I꜔ȈS*ϛ8Vy$„@iΡ4^lJ3, ]pki֋,[ry7/rݱpfYdܗ^P:K;W3I@VfZ%A:6ug>`IR}V1CuEa?Mt1.?rL(}n7y7ydkjF_͵V,q9j$Nԑ/BYZw}궇;.vfۨͽCjFJ*gM(8$lRX?[+]׏e/DjAc~ċ(n! "OK4~% n%t_,J-du#kXܲOS_h)0!)*xF>JNweۀG ^G qR)|]M^Wkq2K5\hZ7يϕ j<_[ 0M1SDͰ/WSt%K>xOnDk0;gLNUk2Sv^PS$ب;/ z/{$%U֛ń9ȉ] {rVPMݶ ~Xᛜ$ \إXZ`];$ %7B8?D$ZD8Ǭ|0,o60i(vyn/mo7c5МN&).YFGW\ҌNqjȌ)^&HEr!G697@:ŪS59l'kr?wDžn}P5/H hAoz[I>-Z]IV >|"P9S>~n=6їuPK(*3b ::Wr0o$-[K_u.OXjf {rjٛ> kR <1Tx 6nK6VJ|>P+^}/=/Kpď*w_-P%φsIwݖW,S '@-8oH|n3iKz/!øECvh3WkKR(Oq1B .7#k7O[tD)>87Y !_LJNt5鲘 @{{[0rшH+su '\W~•GRBn'[yU:*p]ٕv9fZk?Ū F7V&?& sΪ"+4-m%y@Iwh UMY X'-vZ~sW_ӷg(j ȃeO[lӎ"p?hԒVYtZ'苝!~u;1hPcK-[{˭qFl59ej^-)ɊJm ߄Ʋ={fUKz@24z8<}kFk7p'YKΒVٍ7{GQm{͜ W= тSHYZ<_7E^)|r$z Gà-2f~JXkB$5%CWt~1$E )6Q Mvd:6Wz?(ތO[Lǚ3Rū+tq W41^y/+9/y /3cVtS=Sۣwi b`dr:(!tEClF9cYF⭧O&\LCgv5EɒEG{e s X C@sk P|Z8uexN$ C|eu:R}޼3r藚mY]=>LI 7]g<3`!Yy~aO0Xw,O0h+ӳӬN&y;LI58mUfPmvQ0Iu84h}߱&~m;+>[F2(W@#Rjb}*+s{DzgQbY3"=yى+/*fsn0C9ae}_Ͽa] ""Uxce+۱mׯ?f]ۅkf/!,JA^qHHQҟ{dNvp]R{IF tǭ_+B ep ><'Dqz9ǻ+N VsnA56{9[yf}:%b9BV%{ &l$cGl9kC,so%K{ t6>P%g~>Gd!mY}>,AWyU.*\V/dR:K ܤ4^P1CA?꼉N 9]dnuD[9L 襌['.lOdRDW8y5[H%fN؇PHri?̤ ;ly"Q:~NГq.{BYu->f*Jix?#:%Z|@ײϿ]6Oi6R-umï1g1ʐuvk\yuϩ:s [i'q&`&(u۱`pJrb#yuP'pㅢ/q}/S"/v3x8k8P}N$M7% :  rTϿ9[7MoPZ_sP-@Ω("oDEߟ'k,Ͽ _?{"g:!hn^)Ѧ6U3@ϿKfUCRUz95C²|*;\L ~ce幊ԋ *Q]e?9`Tև4Aڦ` !}EUKJGڐzRsO :{XxߌWȿ QQMrSD=Y3!%eq'3a=Kmh{{H.awUkS(8Պ sYبz1nUcvzLÖ}:i07D+N~ Iloj``)Vv=ر.i/g"ؘ~Q#}Zk\llk>o5TvݨGɅBDü7*H&+t#37$Tq\lG:|fti8 i'{. F4_zJfp)SB 'c#jtDy@+R@{LKSw7m]^?{m'lQi!Wk(O0 ~U: *M29̍B:]^TG7 ^?e4:z2XrMRӤPu .C!۲Va/VaK8l"uHf̘Q>ݶ#;+x&@O+IBm%Aܻga߆ZŖ}ZkIJ4k>6ˋCUeL4z ^ \sw}j>~Z o#^+wOUl9@|d&eޅ,ΰAo%T[i&ƴ e}Zq8 w_Hc[N:D&{ǘ!lZjSe<D"Hy^ ]8&#ӐS&av;i?˃fyA  H֞a?܆xE{"-BcP{g;t7pj?[Y`}]mբ+R-fpǮ߆x=mK4T^nP9xIR),dvnCh3]ܕt$"bzMOL ^9}ڛӘ_.:S^_sJsTrB2 .7C&tyOHL8xxYQۦp;%Wɦ^eʼnl)Q6%aWE}=K_)/wZY~\Fe{m P'݀4&B,ǍJ`+CęY!qCJzksC!3IK+1v0Ő]c` 0/m <6.^/.ǣMa߄2]&^]~ //hP4 |'ד~ٺP;ő W2ipe7A3lE2syMoE[Ni&V|Γ Uo]hG0#gB7DxA%W}[W LV6:+7\\qj8ޔm }SK!Kq8e$[ѡuCY/o \A+Ztnp&گtS!#lk eO~HT2` E cն՜3HcB Eqj g Yh%\juX0\8l# jj⩂~}|%E̲&_[ƳEC3IopXӓ8~!0 P+Fm;']11*ƩOS|a8xQ a]>i-"NN^VWoQV&ĘΆRQ`q.:e h3 UUkGcf+mZ7ϳ;:%5f`pk+BlO`I`Li˅<- 9l0\=lz^箪b[Ecq83SX}WkSƩФڪ[qn}~d@YV*|vLQιdYeEM<(]Ɇa+"`^ 8MI~M'*a)>ѹ` K_ސ5&g;mZEz㜝l@g^ls~~5xy p&˱sc0ͦ@*>aP ;VWFPX6tcRU JǿOe*,9Ğ#m효*v(>Oԉt7j-HזU_^7UѮz <%p< Nsos-Zkɞ\-5֏}[rc̒\^ORq3j@9Er'u)k Ի,WH팢Dh;ͭ HADNjvw GZ*I3K%460w $4+iSoBJ/9rdr6mgrJ}rw%/:uD |Q15ܒ[ )C!Eu o߯Vl4F#DcOv Y'  8ak֨Ǥbg'`nE2zO x'`+LJktQ ֮ Un6 *>ܶlNñ38mXzt\:ڢ~P_JRL8U~ZҌC8Dh:ƊQ#A\[Cz[R;aqvy9}ɬ:b_?^#[\<#&WXˏeJ1HH~'H't%|, 4/ M|S:^,%/Zg FVf@345JaSjqVM1W;M[<3OּYfZ\mz"1($UH'? /5>_v6Ϫd $J¬mpjk?J)J.gyj9 m(wiڏ&0IuM0ΤFǭcI)cOIXuMhR dLh;WA<_C5Ȋu1w:ah ).ahi%$ 5h޲޷s?emq8gCIZ| ]+z"jj;sd^Ļp?{_߶7Vɬs:ej=>ҽT)hݬ]_*dkfA/_NrܱjuXSt6c;\#JXw9t=$ga:ʚ|u/%~Pa7e~7}vxeNW[gyRlGr32s\&(CۖHO˗Ipxjω*<5ive*ģ1kcuܒ(`v{/,Qk'Cπ*XD?@Ҧ DaˋY;(JM$"jW3]u91eΉ7dJǛT"3arw#q0D4B TNtw6!' a$~C()z*nCKbA84Ux۶9ʮR?[9& iDKJn(|+9wl λ0j͗D6~g/pu Ww&jjp)QƨM}7TGgC"oIJt ꕬlݮsvpP pH_(*WT_T@C}ʾkV25 qhP4БZ (b9 ^kab|^s=ɺ h6 gaP5gY#XY!e\޳jc"P{vQ˖}cd+n>vJw~2DϔTTW3/~ы&YrYB_up}Aȴa8P7\)岞{JNbnf\'L~M^֚SRyj!sFN41Ti{Ğ/O|"o2hٕ w 6ɺAmX 9.I)7uHuAx6кDʾ|Ӷ% $>q K=΋L&Jᅏz+PB\Bɵ⛗JvK{8^jR\rjƖ{l,o…$(ͪ G[UB^Z׷X<|I_^'_`(\}PjNVu)EWл/-k~LvTcҾ`yJ=G6 , lsޝJq#y1 TdO "b܂pU@Su"+NУ+﹮]^R7\dw 9FJ)+:UvWK?΀oymYU.op?[ZnVC lW%d8E/uXt37X]JC,ҁdUtU5TJ:?oS7/ql{bD?[ Zoˮ:cf/\;<zNd B!gkh9@xK='t ;`7S5</!JU%;d1@j7BY^ &:/ckJwa.j0fb0v1c<ȥV}Oa=үE銂tݔaq4]O6xV^^i9eك6ZSmϭʞϹ45 I2d\w*l]Ȟų]:ԳSVnr_X(Q O|{6p=@VnU'|qt{?/QDžT'?ΌΥ 7 YbW#;kY-J cG]ԥ:En*KoFrϑ@- |F|0 h4h ryi4~f~j(Š8eb6^j>u2EpI_Mp,'܇<^oe2+];q*R, :|QWBKZ[ŋɜfxjڛ䵰 :5E`K?zh啦Um/$\Қ9O\f=Lv"_,BD ۜ.演C"۾uV܅h:_tcLg"շr|ЪcТ-pY\Kl!Զr=C!PzR0$[I#F㸗m<7G`݉q>b7;˳j>_ R]iW]Q)5*1g&QHa='O`䰞'r-NXzKR9nArwgSM 6] }NSJ(䌴-}HQ\,fK!wHxR9?f)89-"C\]U}kAM7I>) q>?`>/e`U;[Ã%֙H?Q R]!΂γR2ۚ\TWxZ툦U^^f+ `{*29V~m`0y+.Sd$`Vّ--fmgn_Q`k쓳X ]}#3|MNy~Jbye; y@u-YD KzoIlP;jMU1-b4Mhznwuhc%~zw~4_W#Ľ/`m& ]; c:Y4.bjM}t "9 G9dD:UnýzX RLc&l=`_5e'1\f2V HcC"%֊':_m,ם0a5_\;Cr1"-9 ~N3`[+JCIX,&`w 4)h U00f3Zu>[eF)v`s<뛿ZU(Y^CDW\|^gb#F 0zL]r9/ [blB}\FY ak7&ݔ?`YY</V_%4Dy.j#LͱUa?59Oը,C"y6*T9ԩVw0`zȦIZ?[f'6^X~Ơ[+ N^J=Q]+`T%xu ZqsxY8a0MV~Xd *,`Kqu9zi>}q#֤ zJoVc25sN[; R%Xj\HM ⣐:XtDДtMIsGc-Cz^K9%!_CUۙep֨P[I+4o='_{c;6}1D LaިwKIËU|[Dޟh_4d%]?mGRQF^]-MgNOz m'g/P.toqȅC쵾`%GVZPH:p-SY9O%#si΢GbT{Wf!9߾l豞Z*}|A-p<וfJR^T." J} (3DXM#cDAwS਼X;%實FK{|Ł*3A0}PY[-b SR٧ǖ|x TN~ҾZK,?|n`E=[xUxxFy.+|!Jl ?ƴs6NPcSUsy T|Rӌ yu?>?yK&9K+Ƒ ?:>;5&al=R˅W6/bUowQR?#鄈ZXf6tSķS"[^K*Qæ~ಢ _\mn,1qo2+&ڧ6DBQXs~"W\z k=h UP߳DK3Q5G QpFM83(:F4ĠpL9΢^)&uo]FHu܉}BՋ8!= ^ZJ=~d<I\@֣Ѻ?w$t. }r^[_rX3T! 8qy-%2}.)ň'G!ggzp]!}rO ~#hIX#G#Zbl \".DˮJ6\ٗVI'Cp|DO2!:CPNmL P܄bSf[ʜ.؇Y@dƑw1˄>S)&Ɠ$Sh66vNj&kd2`Jv#аKBgOPTJ\ImuAĻm^[`4Yy_,oX>̋契ud4r3fp(Af+t} xˆY?Z0_C:ݾEpж|EFnP% UE;TJi3i(H9h'4 Iw!F-M5 ;kLjH!?>Dkڧn-vuLxPĤS},`RXR{tsn*%9i$/u<*/`F9Jx0<]sLj[ө&N'aV2^LGu|xJP*r1DQkx.əcJ/$*--k_=4%v(`ȃ)4`C39T[l7@!:{]dv#ț;A1_gPÝ?bs#I0/ Ϩ(†ss?zn\@UCM`!m,~xe&G)1T 4fx2Vf۱Ѝ"r_V%L&`/A6ՍD7 .)zpGk^7UMFy4nS{ZE0y^6R+X]$~L%0sfGzbjICoj]e([Tm*A&2/Zx6.bC I*FئZi%R랣3bu5=Q[f9QGX' ObZg^\%8Vp7YĠCFnXƌZքUU$XV$D;^ѭ8W!ߢ`TZzWӏԙE,M-R庽9w"D3ɤލ%9z|*JQiP|$ E_WњtA6Fy]Op?D̎#5gLdN>^ɴ.zK|DMZ;pUUZ;J_?v + ?~x?[.Vs@>k'DrAϪC`scN^ZkAA.zdNrLj񆕌k6 URn5=mf8wRAV%@V{])&ǸL("mت[j WVLb@{|R#ի T_q*kK5i\W\I1$ĨZi=X8I XLMĺy5F?/<=hϯ{>7C.jU4\e̽CݿeռEEWy^(jw_0/@Ns4'twq*( 5`s L4rٔ-mΧ>wմY;Bb9hTÝtjqA:p࣭\>qSm}MBV R BZK71Hnnj6V_%!PV >"ԍl/%X&Mɖ 7H {-@*10[9+Ewkz/1_|"=6K$\m{\&_-JEh`KW+.^kW{4?&CZSu#j6+NC2nk' L*Wg/uO)Xeԕ0i{(̘;!ԟ_\9 , I;-/ (ާ=-x%t,HztW$}O?B^Iua61KP$k-LLDcj;*=Thi{Z )# VRa* IQ 5ʜbVQ[ v"!GX5d]V+1ZL<6C4"z}Ls,#_.8ˢESviPvbRu/}6^ʗAVT;.%X3ApJq~.]+{OF 9*dQ]n7KW*_>ҽ8ݞl6>N㲾L3#2?O(y|r-!,}˜u\\Ox5%i9Iz\WQR(d|J}ߣ6vDZ勵bG?Y_~Bݾ(xsWVW-pC;r]R:no]g*)5UGԗ le#_?k\ $6lͽK򥿂~BH5wco?n l'$MZl1㌺(DN]S42hYh  Q|Aqg{}ɟTEߎ ?[]뢫Y_0ީlAk{RNaUhM:gVWI/6Ua-ғޮ'i)_!b(#n}k^.S~~1LՏK](lzU)UL~# rOZK呫x#vGzg3w-1()Ǿlvȑ/kDErL5o5"ɟYOٝISK,Z!3PXKFk QZW\b-F'en'vJ;Yb +erAR9g B ;XPK:n`~Vz]#!*8u @ZamӧˣDnWyqmyZlwTⓤHH0rrQ~!gp(&uANyӕM0CRKjC"[?k. Eb+ e&ɝ6;Ӱ{F)r%%Pzo-Զ$h]J%s/)K8"3w&Tȟ0~4lT$sX,:~J]9ץმ[=^bX փrH1h>wHz̶J#>G5)l?{\Xi$TS&Q^h΢׊ ^6y )z#=[C6<f)%h֪\*EpnUO٤y5y{t ӼWrRXs\nݧҥ/.wǷOG`N^4]^0SN] إݝ º}?QV:wbYߒ 6)*vl[](Z<bAg gTS@ WIL!RHս@;:k D*,r Wuj*W1/zEub<{5+^ M=ΥX`ւķ|Ғn9_XNNr,=cūYGSWx5҄;5Y"w^z\Պ|ISP귟wּN|',` pJV S&Z{"H@)" xyٮT e#IƞYuhdt~]ǂE=EE-L@p,dg-ۗ&cse;˦pPHWe2YѪVd{Ox]"p] 09F|FYUȕL- 0I|(S]{; 8sR ; 6ˌUuwfGcETaoW/K=!#G?|B3$z}?&^ݽwhyuXCtUQ4T"YWIWr6+zBE+3oKӇD@TF9s'1(^KPWuX{O_lWsuٯ^ KaѰ eyo0σI5]dFB?!6Cؚ~ v}FhBnپ |VE,#lG0^T&pLb!~V-hEXe~˵@$K S^sTcGYբs:eKt{ /'BsEma+S3f[I|6/|c{|$-~Q-J:H$IY1%zKgm2޺wb^ }mECyØzc kA_oQ@b'^ do*??o?_Y'Φ5-ZN04案->fQ;Ggx&PGk)WI.Wg,8:\?4kIٷ g@ི)wN>l_) 93B".ojۅǪl BIO7W&-b}`b93Es-e*ڎ>)^./iLu07`4ȏL9n]󳕃)%eQjb ԁ&fͥ+paN,dzm\SB85z97]:=W1u*#t8TyZVֆD~<EWy^T0[)YnHȰ&k4OʙFlH-(Ejy;Z&W:2s!ɽۂ⮟%7w=D{ ӷ":2ؘhDmU?Gs"QҒVWQ(oO M 0N־?ڳrk 'k-/4U..7w"uE[{?%+t pȂn*EгNj+CYˎpg{ 3UJڇ엗|O" `4w[CbI38\ߑʥ*8!wKWkD#̭HУd$H4Vo1vՆ˂>u7*< ܐR ]4SqdJ8_~PCP&ϨӍu|I~ ŒuUF:s>w}8W Ux.WKgqkݦ'L15bv@I2'͠sPk:.:!`{1|0Eq\6J"ĐԹb-%s򼵽ݎE &U {c%Yǃ1!ROV8M%{q[ %JaJ L܍1PST=[E!I=~:mnuJ|f5—.jJsDcRSV)p"Z#77]0P9s-_̀uʟdrH[Jl]KOFHE*]ԙmNO!r[nmongFT,pP_z- EMFQF[&*q^@ᡌ#Sle#LQn0Y;vD?拨KiʥU9 )Kn3GW.BwE'˵Z lX,f 2t +7,(3ndQz V" el%ïNM.Ig71uKPm~rA8Vݼ΀%Z j4Y7vOVIȵY~R=*=Ÿ ُ^kI:U{(ª[GU=Nl{!f۠|8# ` Q!_- 81a+@]SUoAH4!Wb^vEó)GFeB&WPG[$\QI<-;6Uλ7d'qqZN壻g䔜.Q0[]Bz \*8b}e%0-[6|{5^Nm&B*5=τl*ar2h`G~+-gvDPu:avNtuQ6i']Mg9dz1u>֛C᧳Y ZUxbXf#{0gEuҸ8!.iqRۭ\T'81JǾE>6 ŨxI{A2R*8"ew7\չ|A= (""5 ~ ,@4JF ;ɭv:Dtger%o>7Y(L]}ΘuElL tz'T bǙk rU)tCy7L?J!{I_P-U Ai2+V6F0}=$wA΀.B 3эk!`FmJ4+_stR=YD)iM?fWL`#P1J-i7-\ b֫t{⯨a9yFk@8+v#vzMbàv3t!Š.gOKג^ AgoW+l_ zEM %IFl}}:gt\ S7Gj:Ʌ%FMe}i[(ʁ[~7 G|77m0cOMȬhQX\=)&37f*\(lj's8OFK>?H 4]ˈ4@ N(svNolo։∮jlU#q[3E=E(Q*ßXSM;?om'INA #[MI2#vBmq{LdK}lI]?&qĐ1jiK i_B_ꅙҤ}q*8Fp?/0Z}^' m']fFBWgI)L&9F*7O;-M"PwToҪɠt.1v-OVޒ(jʦ_Ȃ]WC)DfX2 D:ݑډ/^:J9[İ9𷋅fQX6y7|&.ߺ??:jRm(yi_ShsFgrGZf5kOԯ4I cZ {cQ/PPP|=|4 y)2@ၯF-n!d?Z-NCͳD-OIAfEUgeE*gvw_4*0QUHx*c^8ND~~8PE-[T4q-lK7[Q`ӵ6x \#3ZGRZB ];csjPDey}5(cl^Xˎ}nsg+ R8=/Eg>iC."#cd1b$Wm&5[ ۢEG FWy^hvqlhoCW=dl7ENoMY9 S,byW]FYcrQ/9ݘOu}F$\ckE77O.)BaY:!E/D~D__ýmy&LNV(}FZQQ;{ i~e <'Xbj:άqcy \bжQkʼnv_f:(}ge1[MNwN(65/C1.c 5Ւn5zg I76ƟQ@5"EMjN +0!Qrzn ^^J"%I#]_l(v * j磯DoSWuIEcҁ!3ҋ PscF3*|H% O[$U4@2@"4psOr~_p}rMqAv8wbTq4!mNs'ǝ"jN27Ok9}tIy%.܏IL*l~͠W9#-f]6|!E_ qאX>%f$?O>zH%2UчXL=8򤐰I) j䓦2@YM^\1sw}5׹>6Q{T̼qc5+=_4Ղ,MCꂎmr򕁑(<3k{*diMoO+SKU &' iC! U;ߵL}}p>9a& ?L.= ?'Ϣcޅ[_¦;=wKH}_{`o8Bi|+IqB˟Vmoq.=%;?[)#C9_ aAP:5q!T繀by>uB*T.shDG٪ Jtnh3I?@.<ɵ6QtS*kf~@%d{Z"+8GʊoI]SOu0OW'x1D } FqL:PQCb 9:ND[2svnl'";Z^Zc|nVv~b{lrHI/Ͼ_"!Yֆʘz%['8IݍE6bQsh*r_Qv0n|WQ݁;Q'z9jH}IhçlR iptnXm['וUNvA'YeHAJYs{R>EZ^8b/ua(֑kyA)My}k{?mU R$ߋ79RA̅EE+ |'*~E>osg > 5\_W9طq3(=LV_bh|]w8'vZk]m'}]H0 ė&!WUvZGEðN!ol'ɢ P]OwKygTSiE І;cCk `u9}9~&DnlNwZn!P#jzzD46,=dļԂ/-QL5>71ٝ1SQy@ 6,AH.1tp/}D?6]=q؉@WyihhYƨma`uN"#G:q޷sgi*n=T4>\r7V3B^T꫻OZ,I0Ld,Aun;#cCz@9xvK&k>չٽ\N 5A6SAݢ+tM0WUo|uXn6r#sSr]-%~E]M\U"j{>Ϲ%CQif=(ߝ~_փ廉dN*5)ÊBDSҦ C_CخSe#_xZ:_d&,Uy ;B߾W?*;/YdW/r8DȀN!ߠx(]_Mb6@}n8('Lu xҹEY[j{vT%T D /rZ98~:7;4_ΑwU[Wq ԁ6ҙM]|Y#^Ͽ)894 "E.pd}o7}c{ *_dQJlE%iRY[%U-`4K &p/}v:·$eӞ7<#9) U4s=RUw!;emV^^zn2YP=9:=I:A0&^fݗmR_)o<ՠ*F퇳^na"!/x'+8dj~"ⶬa4QDp9nm澺 B И:¿v-7V#cڽ0jV-RUF9:Dtk;k%Ԡz ֔g@iJCj@ioWAsBnloӤ®Z3DF4q_BY*|i2T N%>6;U&zj,SOGKĈ0oMҟ#W-]x,%U7 WHA_2 GYo"Escz^Ͳ<4I`p6"*MB"QKYgiJ(U·r<0qg;/Jecebt@;BF~By0PAH,KSZaug'xS 4ç pзO;'>$W4DΒ;&AaE#p7nz((!+M2!)7$Uf[j<|1 sR Cz\5kGdE8& ۇFdxԫO8gNcWwWl:om'P-Qu 3e~/˕k(xn@LZz O+ [}v<=X-V?,##>lt~xw!dXPdqT.u!i5k13msU#zK)4L{`>[zw9AKDke>^6Yﻑlioc1آtf gKRXX)F)S\kI{vBƽ]`{"N"Mr)i)PZgG&?4qBC05=@ (Gv? cOAa5yBSb[ = 5osДܬr9H~7>sB'餉5^"Kz{HJ¿ ejxfά:;/7qR =F皒 aįVvJHN`Sˌ/#NYoPfcY^_g m.'#p9[xC%99ᖮi]xs) O2Gmi̎w>$0{央V~UzMmޚ? [;;|X[VvCUjl .NP0-Z[m,1@j)l$WJ8Ih#ŹGڭqSPd~O˫(=??'Z'J XI VUY=ڡ=1%) {KEJS躦݈P |w6gl#M+34‚Ĕ::{Y>8:yg%Rл=}r ᰍ?53\\[xCw7O+5OByl8rBkRާtsFAbњ8-5[qmFW!M"5lIҍUW2!sàÊqΨmPchpg{{%h@@tb%r=E÷8(<% ]k',(UK3ݤKZ BtF7K_4sJq#Բ9Fu ` grj)nsTUBF0Xtj$*%.r&"k8=4ս"4_?-ɽePXMԪ4 ڭqM]Df/dٮTAS6nmo/,AKRGR]T3A^IN'+Ju9[*"$0KldӢfe@1|RΟf^)-osUIRyp@Ekxumw6B2 h$¼|*Nj/$Ւ! 0)VS;)|g<5*Z)A&Kg. %V]o}8)nYۿlkPԘBV5zUY޴W]Ulvʩpbj1y魭ھLJ\ܸ }gVaER!DNHUʰ54姡e藛错 }֔ Yx"1-3θLK"vvc [z%}0K8hYXMaA#kGߏ^j ^,I-EybH\f_m'Qri9u*g\{0/vj{?INuOHD>EqzPGzxci"7JgzӧJ~FBv聉47X^sjG꜏8lI4 6(hY7`x {}Ih+| _A~IzY{4fg藀ja|48'3齃R " '%S6N7h G ]->ԦO8pl$ C55|_h=tS,7srP$A4nza_$NjnUJ3!R+*q[)-]y$= }w]r 5MîxrX?[ qn9$;FP%iW\No`Qek^ue'5 e4d=)7 fRDc+D<o̷ܵB %]XEQ>%_8Jk.,erJ9\O٣y,1#HIdS6ws`bw/f_UX(fkA0nOUED$S*x=?r#gۙ3e!Yil%AEo[*R~aWȍ>nrS@nޑ4aqHXZL-r1.d/VP:Hdfh QX4Oa4XЗ/@"RAtL{᛼j<:&K, w`y"a~-,YB^9j4j5Uol.7MyYZ/!(ǧFj| uNhwLύX"QJy2":T/1ȫ+g#d↡$/W($3]c 23\ M w& O<lu]yx{}aG867Y)OsΗhn/K}.5ԑx/˭ /.Qms>nD @W=GV&0GR3m/.Nhzcz澐{ANҨEuw3qSELrD[]S/ iNh50w k>2]͵ ƭseE[ 7`tr.Qj>H; L{FMR*d2SFjy돟6c@UOԈ\ 6\ݴ6*[Μ:#<&8!)tݶ)gq2[QE.J*!Ƥ cDTdž#OzP+|b[i #mc)r{|t^ӋXpg+UJJ';9~lO9!T A7@4Myֵ]- =1Ә2GE>x֜PnMqVքYZp($\'S" p€rk{|$Vr/RA2|}-R!xR{Z˚EjW8TֈLJ?-v?zR  Ih5_MOIJ[~4?|b@f5٢ Z `iʤ9h,5=W(%v/)o9Ԁ8iv='Kn@Wpc\Ƚ!qz}kr.v~{G>[2(@Wܹ(#@Iif8ZhP ɂq0Br#^M2^õs겻 lsFQ-6mUT­̑wjE9oV&w5rdc",Lv!]1t+Yegs2277Orl rdGw>Ofb} l3S _L~^<w9hC.@C#b:-#9gzolo<" /'ʠRT$=ZlT3$Vp^u:k=g`W'~8{ ])^!xx# hG-PR  9yZHs,耨J"woCSrnEJn# X Wӝ-omo*cnyR&"QvI83(.Eº?VA8f~V,휎_z%>;Vq[Xl8]?ǹye$1汸fnM\lv& ՗N:!B-Dވ-HG:%}Ia%3a//O|637mG R?K6E% <z'lW[6DC!˱̧=BӺ\]4r9KxKS:@!_ AԒ!Ʒ\56w֨y nM(RKW';Nf*bn.^`+zN0F=ibU2{lE2L{?_pd:GjvVHv| rk{?I]U&aJCzDͪ;hE[e(O]L،S'7iA!?nQ~ ja p~`|ɡ5zѾI($;s7N!/f>="BB]s9 ҥDoZii+{s|}ʋ/*8Q$ È]z1vˎh{|$Suk8[ _w kTIMX)JPֻW-U+xX&[WJ Xy,@G qҘ"m|ۼ$AB*YeRsSG,ӨѶM k 3E/?l|x [lf!R֑詿#hܓ4/FmBpnm[x E>nvW֐!KkQBrѾtV3xunJ<8 QðT;Os[u'ԡ oD)]wW-]-Y @cypwT$M\d A͗3Tz4]ƒ®2{4lT}ʏU ڎ>BTH4%R~R!WWJ\. 5 M(WlGy?z6bv^S9mzUr8̖lo$նveJC]@un'؂n,IK ڭSJ]+:-)) HA?~B ~X>l7[_iP=C\q(Z)[6Ž+x.<9F:{% ڦwmZ X'4k@"IƋ>3%$ukD!5%o5L )p5>\mh\S!MMH8'Cpv8(7݋ D췶O Mǣ54 x&!_z?-x4)WYUy$jS jUr/dq|tHYLIVq쳻u{D-:Τu/l"VK:-nEƹik| ^3KE9tzΏ~Jڡ}Mr:W 4=y$"Ý3 r\ƒPd|G~=G|n,޷gg0D$TokaZ@_Ӫm~!ޓ}&?[S椨YVc!7 ͑· Nl}θiY}y$, LmҢ"g2,=y̌rd3TrtcqY5mtmT2Fx]=Kug{?9*؋?|.=>Qh cd+8XOcٲe"P!/hP\wK-Pq:+lɰe'WIٌE['3챓3=lNW審< rr;{D"qө]5y䦉Al5:m쩨%!=$'* f$CZS馽k75y>0/P,)n8Uzut߯ZG#w墭V2^TՙO;|Mto{| E{]-0ϨUP(M+r hy!F^qHmyyyR`N;zXǎ c|߯ƴۭn wP/|Ӯ:=`S)7OЋT\,?トK ]Ս-J|N 4~(Z{vMV*2\RPjW4Woxik Keiaˈ`.HW|`|G|WigF&?f||&Z&RP4ӧշ kn]Ek:* -spZ0s`KgiW.u@6Vyk{}^S?-LH٪ѪW>{ ;;=yQ(V0'%"֛eFҵ}1m[3l-"}&ixb )a#r ( q]̹ۻ")}k{s>d/ϣ͒.ϊǯ3᫑s T!_S8wWVgiK$W%,XOM8RoiH4WXc4P[=~丌^]y>TܔvL`|& nTKR&O \~<"8fy=3z2/qkU],5MȤİ%Mι@3IpUcIB@Q-I5꾬7NWS7ݠr^l՝$eTvh3s@'(YXۿM3S~,aڃ6c3ΉBb(~mǎxK$7V>OBբ]T܏14R0yzQ: ɭN[*?[ZEC eJ+jzOXbƪ^Z0lZ|KN^3:aWз/ ȊS/q\\Q5OYk_8v&pw!# 1Dkh~|*#'Fn_n-JC$*˭BI+>rq.#W =8IԌWR`v*ryF3Ha3W8EI&U .ep5mʼiv;M"ǭUڎ23]ħ[,͋'u_=W-[tvji?6SCDf]sҹ~2^Ǡ:J6.2\Rz\>=&áߐ]B}׿ȸwql1&7 X~zWDW.s^"<hinhEus⨹> ꜩqj{yF2_R]vxHH,%^XE%6(׉u>϶Dqdvqtw٨D-Ҟv^"ר&-(r-x<;XQc$; <BZC[i"|PE;JVVCy6}應"? ~] w;(O?*X=Qk; BteaZqX*pAy(d%%5gsx^5٨Ҵ9fZ;g珟-.^`!zbva[:mcIK;j^;}Edof[ Vmcjxl%&czIi9_9Hp!&JjsJG@Jqu.u 4fwHgk^mz\yf{=o, w@7 Ǒhq8Zܼ"Q֭kJ?lT9"!k:1>FݴWwdGmˁ2Hr$*zpr`$*Gyڝ>3dcp[v_TwR4eV_QFo'S #%% $+mՃEw@kʧf%`4}db2goYMbF˂8`Q.(2sz}}:z^!Mu?]{ G- Y4U.ղ(Y=\\feSE({2Wn*83$=ZBT\^kA/<'MIJNKRPJ Ԟ~b{yK{W4\^GFW^ oed< "4t0;l~@ӳoTȌhIs03u֎B?ayjڎ@[! ~,>@Ik׳QmC6Y@9o{< NU*EG"֥lIVUbϾW8Bvܾgv[!_m%z)  қ ¤*jߺXCؽ Oj?l͠4kK seG%OG;Kn58r?;t5m ӮF278z *񑓫>[هM(Xrߠ-~!g )2 ,%= .F&<;>jqVmpdLukU;B#fhqӛ#: -ٝC;;L:trbɒ5'֫Ƣ7HQ5R[~D,E|"W8{/)VjҨ:*s"ZZr"H:H"vꯋEv;ЪGѐ/yN0hiNE%+: w4l1r%U+:uwQA:(jK#jaC۽5%2IM12l- awnZ^#[ؐna}|9O3_W~~˯?W]__=M24ډUw}ڥܛμ!1-Y]BJ жSW^x]wUd 4ЫҞb_:*^$[IGϼM.seWshgRMgF/L=^ίQ#;VE^B5 ~ 4j Uׅ8Nl/W^c;}ΐi^#G?U@2\mn@۝£U1.!}@ܨ 95;&奴o6 [njMU yGi'7T.\ NvC"2Snx!Bݟ&۲_?o= ~uX:r f6 a=Du{|oyP؉JPIjKZ*q)#z j:0&0%ٖ[Omg/=?o8fNrl{ePoe gyZ8)>}oI{w)!#_l~W+/o%UnIH8ܨd =3kgų@Sɳrœ?gdz~T/MSmO'U-NT@4zTR/>fRlQK?^ί*ˆ.gxr]\'y7*rڻL쬶g$"VV5و% v`0 6ïI?6ĿNm/o\yxW/8!&N E<xF٨=/x }v݄Gs'~<em)N}~r˅%5Pqg։j7ɾm0-̣zt1EE#?{3uWvKB-ᄽx |M+Cבn?1^w YVFHͲR¼'~˿}տ}O_:F%dߔ2*4.n(4sWn/_x~ !@?WƵ|)yAB*'I!&:S'(.g#)]snǯ}˷_{~sߔF6v^/jZ4!|twFxhϳWzeZ+M+³wSuv@\b-Nb՟wqZEU8JW%2HO-(R*wu{13k[Sb=le# aF6nlْktYU'fI>EKo1:F*QY4bN-v/*77k W!&8v=1IEG}vdJDpsQj\NkGM*oDӷ~*Sxdl̺MI<LsDQ'$+Q/O I2:tE{)Q4/{*lB{AxWN0!zV  S]n*&a]6my(; l:͏kTȡ0r0dZp|5r<7b`>[* .c 1DɊllz=*G2 `ݪ-ѵqct3r(JFҢ˼MxCժՋ{ި&ލU%Ƶrpc(B&ZXq95{9'ME@>n*7Ph(UhnkSMȗ}EUf&?H.omwz~f[}'$"˙!(ر&ŮA#aKU0? É-T%MG Kî3- AP.[42l%q6hZչ%lcy slhی>">5DZ%o_{~ dQgV5rvd["53=mt`({$+;*O-LRr:tmAۢIClzo1tGOxZ(!+&}?׺oA ~gՌ굒acx꫈Y!AO"͉ʙkxU}^޸R)H<Ԑ FN ZԜo(9tO P}F f $V<ޛ<C\6<fha9+E{J]ZTVB4 "B?XX7[bd5u{m8wKbBwbwqf䊦Ӓ*&}_ls; 5Yl;Kj#q(#,,:5L;`5+(W{7<;w.pnu8.d% _=P逡 hxDw۶PV4vAƈg>NǼ-%nTgk{LqAZi('c({G^uZʋ~buOwAWʽ cSƺ`x\U`$mSWJO\—'bRjO_g Wt!-;_Z.IXG6T S4iJ> Hܠ[cܐĔ}sr,4{ +)TVHpgg;rn Eނ-Ȍ"~̷.c͐&L K '{GQ؆4;b:%}sNmз'<؜r 6Dߜ܊oY]+$zSËL*Tu-YQt*z)KI&u(۠| >S П{+{wrUv̵V{sB]>}XZgxukfX;aG-NH׭.ŐӶyKz?Z nX>+u]ڱKyM}/]Z~~t{TQ1C] MIJV3fK-aK!ȶWO)y~~,Evif:mzsmL`͹O~,9a-o8a$}[gzta#-GEq#Wm ܪRPnP7ǔӑ;|j~؃ه¥dLm}80c!W+8&J~2`MjKJ3ȗUJGa $ j#nTOGyJ>̤ztEXN9`6"?ȧ8AޑZr;$=29#n![NXb $mrΪBn_e;UKz_.zښNRol3ZebstY#6aG|;oXfy [Rvk)>]kU4Ì!͵>x s cH:r&bEXOQ/ Iag, ԋ͗4hp%\,Ɨ˸Q 7X-0iVB^,5VĩbYg/c䰕AU6mF 9 ; Yt+͛]DX{x;lYZD]cvHqZkKw qGg:I7^t&8]g MmP Δ2CѩӥDj#ajOºF #hU"K%#$19bK&o4LRÜ[*% ?l76 dҝY%QF"}OSZ1Ws-Y.w֊6WyW*-%Xuk}D='Z(zMkIS:G=$xZ-~](fK.`_PюqA1%n۲Kb;vFtFB,RsۊvM<#53v=Ac|9Jf 1FI" 9FS")f]w䓻o{hޜ fvV/F[xKnZ{P***!_&ubJ-BǜDJ @*&:Wc1f P˶ה?1d=lҒ~zi*:YjNazxg HZ能JXKdE!n諆3@x@N.lS݅;ޖܞbjf.jBDNڞh{$B,Y/Y [u_6XOhՓ<{ddE  !HxێAsvd坵! 1[?<Xʕ" >C?pH([T>Xs7d^MYUhsSXLBTLXKB-I;W?wgINώfW #m(꠮稫4_gpnVYd_K' D^Ӧ7I4myPkz/BU.|LϞ[H?ّڝcSe$8yh |/v昚 Lsn{tܽÝ* o`\@p$Ӹ^[V^RsK;;_oX%d$=TV+E#xUY%ޛHEQ(ȃU;ҷg΢9.q5I|puGw4O8cZNk&~b([y̠&RW qw%j昀2Bfbv%Dx7.U{?Ҥv85wZ.+^Gl9C]yzt rQ>a"KloAf{ht6rT*.u%Nxw mt+ }?Z%-?Z/{ FM ko,^7}ʬ~אoFBs6_}̪ ;_N5oR)$띵vi'B~!sP1C]uIބI_%0h3Q|yxAdhj`" L?dzlD5"V|?r#^?,ǥ w--wgf"[%\S6-Q:tgy{=NV'SqTEJ/3H5-R;9b4OI=rC)u+bw`"UcO n0S+j; ө޼т;Uv@Hhβ5|ȞX5qP/gFM&ѲƔ0#WsB QJ[xR27dJT.ha J[Tk=03cWL;EzWܢЍ.&mz5}#'+\PuDıx0e#FCMpW]s": %ֻG(}>c2/?'7ؔ>[Y:0\ds&h})o,ԯ}ՔjUr˟&BڎMRBŸ6G;>O7?ą_"bƱC~Nڳ(u`{{<|~dgvcCmR BjUuAH,h+h$Be[ځtm\ SCydf#KfA6ef6s;tV$M9GFe4G(uf*"KZ>ːVvfJ * |,PF@JB4V#ijd΋n>M' WBjS5}.̡Mzn9>faWcWvRSnKk$Q\m N4*%vH %.`C$$%1qlpl!9{횵8= he}^Y 6%5p1gc .5Js 3&O`~6\oAфobŠ6i||d"zn{=}͡9kVc+ԑ-cGcLC2hzJQam&]c AnHKd@"8L"dIkyBQEcvthU{Pe8&5FzJش(g 82{& <=ff;1PоSig6[Z;Uijз~1#o7W<{'W|_m8lINw֑BC-t!!t;'l2p}tUn`&&A,i$:>mwɤ&5ԑQpŀ&zr5BUAq|aRȨȊV%MP;v;㘄kvݤ5gJ8&Gch+ߗfR}ؤ'&Dccc(s)VEq:%&+o ެ_ e^|g}gʮ)KK s:^V$`b uJ+K[;Ɔ`Q)Z!lbo5")"g,yVY/\KMc}&JO af"5 “䩗 eԣ>&T\l]}Sr7 7kV@(:f d^c25ts< vUZ\Hrc ݾ;jƌ&FdÐN&{s9F}Bj'hb:h}vIӎuRӭi9!SY $M3gz4g'LG*J0'C[2iy'^KǕ`ATkqh^ڄQK)JBr؂q ?gsX7zYn Ħ)&.Of (qi.[_͹<ʌy7>ڋǂO>]\|fPS.CCZB 4jh9*82+UFBBF<|8HgWOorT;p˃_ΈxfRs#nU<I7uSѱ왺? 2Z92gdL6+ ۔IBG/V{+xmϏmfy{ &Gj3S64bv s"BP ؍gZkɶ!<\W ,#M^RVZ!9`vDt3+I HQm;bK(鉵{Rr>kBm&EORgaMP0[pUUáR'7 =QfݎXCv?Asl翜1'ADS(f͂ {͆(Z]' '*SנMtx]<P.O"r34fIvkeܗ[bGpCL<\=̪9D  dw}ّ;fݎ~Y r48f}d2;|g [U_+*m;7%gls]˾}6߳7ᄴNsh|u]>ca6Pv{0ɩH D2 ɋdX3TRq>m~[=Jt\37Wz7U>%iaF Tnk^IÕf/w g OFTrz ҎfgldW9H:0.ju$,S(> mO Mo&<=cN(dy}CNn ;ܜ均Pdpc?PoJ{ 11{U|k :'`|jj.e\i<VKon?`1o(=Z{!z O/kPhӺS]IXmGUy`bRFPTe=ˍmqVkbYQ.hjھ] ?p]ǀܼ/p<7TGq]rn9\`.iXܯ_s/5_aV/kU@{8]{/2 Q0O\]? ު&衜Is+/Mb*b5k\e|̢_PW;:.?}}=LkoXQŪbJ?Nm \Iڎ+mnL{{Ɲџ!r%E?8ҕѢcnOG;3.kBݴSvDӌᙀ+uzNAȣ Wt҂;ǩmېC2uA&2]~ԎɁ*5@L{x6IB mᵾ\9 ,+hb%4O_7!lw-hpsCHO蝊DSSzBA QXF>js.ja`zpvy *q6yeYN1Oo/ZX3/GRʘL&" 2P0ޮsJ飅oIxkڵfq.22d6|/NFO Czُg4Z\O&4CthUZBŀjتǔGji^}sl턟ڋhrIݽͬNu TmĹ,xq:|?zO"qDžvԬ db:ZsVpp)o Q 'pnsw_L6ik-bb.eax:6ZJcJ@ OeAHoPJ%(oӪkym,J@ٲhhӞ{a`S'b?߮Vt:rWDy`%1}6ق%KqIBsE;U%{tizu]-:%"XEe9Pw|iPo;պOBSD͞eu{;o̢qd&]ǡ OX]]tZm+uHxl߮r-&X6}n^IyK͎%|UQy\ ?hwtw W+5h-4J,75R㴏#)w$l㳋{ԗ"$dk2"[Qf"PïJ#47_Q/YE5NLI5+8[^? YK)꟤QihTɥJ>k Pvc\{0jXfHHdG/aOl!kŭw2ܚ8IAsPR >qp94z%W-f : `̋Dmx* ˡ4faeF9S/yH{7V2JN%J_3{y y̽fRTbٮR&R{9pPyk渍!j.K='LEGfm6!j;uZ)Bȹ;S*ҎOjX\l'CUZrPF~W$G[}z^ O/T=#"gNaJb;H-\/ʾu])Ւ|!lPKB^ufPqC6HJa,4''{B .Wc<C& *`8Ȧa>17'VDiXlPfВ=6os~n{=4P2{OB* \?gVѹb:]`EM0 S@5pF>CI,7wa{>Hwz>M88k]?\Rb8 ts-LZ`pĿkM8U?\]TOHŚls٥JHx!04WU@)I5*}=? [)=wf!U ^bw\?=~oxm e0zJ soW?xW<`K.IZ7o4﷟Tlfʠ٣[^}:p"Eix0W &p9 iEMg5>~< i;A;'@4qip־xwr tlٻ[c˔ƤُA͠ d?I7PW36y1,׿xSjv;VL?Ǽx=o㹋n8DHMO&-||B=] glZw?+T\n?EbK}L&bHMJ&0 >?~y.qdddD[ǣUsPO<1꫼ܨk%S[ W:ź?\~9,Ë 'GňUiQ7ѡnp^%dPnS8srN}0SGi4//ۗ'G_?S?Ͽ?~˿_oCoߟ^aO?_[eko?×?dO}˗M=>4,/navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MY.svgz000066400000000000000000000015711221777731700221540ustar00rootroot00000000000000(zHcountry_MY.svgVMo6WKFZ@֞$*R )l}G{d/̛t_~6Kd ڢ+v%%b̛OwWVⷾǪz܋?/C?Vz?p8 ][6%'*Pּ0/cmvWza7 xu9y ,E~]~ힳu%,;~-0L:U1ƽbm1Ѱyo `[76þyewOm8~H]%apf%=~<|~do}͒S.DpIwք\&OOts%N} L^yvY}̙(ئǙ_UZ{E4V} o:Y6N}|NV+5:3-QRgn3z_ʗ},PYP#$qi/#J:I>5X[eRy-67S3,"CMʀTⳌY?Qf&K6"7-krj[V Ŷ"lyif%9  17Iib%#S g7,GP>G>hi~ۙ-q!*1VsVnre<.Jyvf@&HflN6Qm'UYJ4Yg0srHJŊgKDcGq`$v%gx{x%`t^>uʑ2S4qKu6f&܏S?Oq navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_MZ.svgz000066400000000000000000000044751221777731700221630ustar00rootroot00000000000000 (zHcountry_MZ.svgYn[ }W/@{̃2oh,VH|}9e;}u<~ݧf\#q~-Vru9oQVzV/o_dҝmb.wW_W糛Enwszrr{{ӭ7''._u]gWSс`[{a系@rɫj7^Χ#m[RM;|/>^ťy:/gf^7f'{ Ns=\n]8{u/w_N'7Oz>y۬/&&FwQO?WDHc*"Ϩ)޵ZbSsoPj[ED./Ђ+Zc{G _#)J( 8_/ EE;C3}{ BU| yyr)M=6ba]5H.h)qe Z)`6q9d,1; xjU3/%Uj 0v${=DYxjTpbC)Ct9jw|5EB8DeGaD!jP$&|Nh\r^5ɃRL*83^]5@7G7HAR!h扚+O)N'j'%4Ýi:GY]|=GsTp0ET!$8p9%+cU2O쵓 !;v!}MtȩkXVi&324 S>T4׃"w\V'Q,#꫏8Ҿ&~=zZ;ݬ?l{5lf_NWh!܃%퉨H&h;9D%0q+U*0fќXCC 3tMm퇹 Y9 SR`nv> 6` OmH ~`7q$OX mЃoQQE$?|>aN-JAϪ.ƱRU IC6CA\>j&J 'շ\n,qMFه%HE@‘ZHT)Mc7`nN(͔ u8i;kjtDcWiվLVc<+Q;, 8xFP<#a=; "މg eQ`VzT!`md90M̒$NddP7ЅgJ$S> ޢ "c_c+&h ꙜPgw Ήh``C!*~B~DE'9F楨*jGCWbyqԖART:ԅ{"mXj$<4mon]8q[Ê LWD|2  1$ёZt&`FxEۘak#)1}j]] 3ɡ jR.Ѓ4" VOt2>hR:3}!l0F0?rB28U)F. p,FqOvpU KE=2nD)eƅ`lख़5&c|P."AF #)aO hˌl@ra0)IjFF3DL I@Ət6#&[S5 h~x;;_T*Q6-yB<ޣ<$RQ#b /Zp5wTv%$jdNpH YJ6=QM!2P*1%?r3~Um([(%CU:,&a6 <3cA.yr{z6Kг 82P} W{9t*pMr$ C!U~{cK(#U+{A߬dP&7r ȹ.M2BFa~|MWo ҅@Bnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NA.svgz000066400000000000000000000014441221777731700221240ustar00rootroot00000000000000!(zHcountry_NA.svgUmoF >`v2uG`%ؒn[b'9N, ,ȇCRM-fSԠ(լZ Q'?4n..>3!Gy\Fhy/)m׿v-ozQM79;ɑrfL ,7@<*j. s]|!7b.D5MΡ)W.Td쬐ʔx+8zwWG).Rdo˫ISNRaՇnޔOu,Ž.$KzOr=E>mV.|ގ4B6yuAպG3ԊskM9gH2^\IMyT!Yɂ8d1hH:*;Pg& FzZ;2`т!gt{lr!F5d}Wüm}XRƢ= [H=e {U@CSb]CqFt9m6-`к_odC(hrsjn y3Q P.d*]ϛQrHSҎ_i:/4C#:OhM"| TDf?0qH# ƗybL$c}~'ai2%gyvLKG}{ϼ/o^ t7_?q|~b-|^Q^?KL~ՖOϯ?OPӁ?Ǐ{9)˶;J?ן {ןv~k}񗯟~z!>\M\O__}5?t"c#}?/???>x5翻}w_߽~ݳ=IbWyݧͳӗ__|}w?]c} 7?{O~_|yӇQ='ߌ}_zu{(W'>#Ǐx˳"ͳᛮ?K~ ]ߴ~3|և漵%EnX^ݻ?n?<>Tt>%Ó?@#@ǿOzۡZo~r_7O#&n߿wy_?3_~ӽwo?Ez{_mk6?S)?!?Zw53}y.?ۏ~h_O.=7||/|ϖtq&q}U~˻:/G|Q~?j;}}=?e%i)}ИQJ_Y #zϏ~x]ߤ50t.yýf珿|x{ >y7jZ{Xl`6Ԟu L^L֠|CSȝՖϴdyBeB}$Ƌ4ܚģҵ)\֗U<(ͬ|r:ȚӹSS ܥRzmZ0#[nԆsә&KЙ=6T;Ƙš~'yC3{&ޙlJIێR m$5*!aKlj*`Mԛ]m5E,ӇF[*jJVcPk)z~/ iʆzb}%_g:Sʝu=EkI}_Ǫ>.LbkBMqQ3.xKLc]K7XX:` Z8惃) 5bem-5Nf1ҳfBb:O!sh{0,PF=*,3'Y{0siIF̨}P@6pi' 홐nwDkc_j7.kUOVuщ}c&v޳x4bHьIoW,:G0fjLwDy6i'_xAiżr_Ob@Nj^?:]JKgVTľtX{$hx~q>naYTݻ!1@f|'-Hmϛ1`09QBMghɆ:+6w" ! 0`gڽA0f`4A]Kh1DMٌF9L@\J4-!䎃IQNZ⊺>NgnԲIȜ%J)czǘᇖǪS; /R\Jll2 PxFA)X+U:l$_LHӳla, n Ũ*(y:2>fԶr#\,`-"D_ϙ~QMr!xAŸ0 "M4*~b*K'@+mb)cpX &G|I N>='u8񏻏6dfث Z/h1RIw+, 6),D4YA]$ּOd_t?0pJpvg7\N8hAةx)+_)}ʰ_2"\;o}U(@c`=zZqk1A)(:Bꄘ#US<ҧfW]-/J{-R.1. $e׸* TQ5yp\bkE z>`f@Kz01z-m֭-/ F%nqIhK`>M![m#:!4T171'1miTir6nzhyOj~}SDJ`Rc&vےm.Rҗ m'y]ˣ`@=Z8_Ň67Zj|Y4mcm [h,36mCJIͽF};ew hY,;a`R]Ǻ2 9ݭXe>X lVLlZuR@nkZ^Qϵќ)fSub=Pkw}ǦF6h[j)eMSqbik1uMc,D\~qSKR㢪#z.ɡӥ](b0;dbKi7~"}bwú.I6XBi[ri ;c E>E 7NLVN Eg>-8W1P)B*8-01ur C`aQQ$Q{0gEtoI,p be$y2{-=()WUaR5覾m&@ [8~f$;Q3^=rUjY 1,Z Qž- n0l* -9{"p4-s>֠ >aLcFT`z7&6znxđzEވkjm vF=Rk>pܜ#Oa%K\O!D^oX>'n\D 2#XU#X"&q.xT -) D9ӨPʄQ#a_d›qYm3 dbSb'+w8eE3J̗+=ɨ$ 7QH_*1ܴ4 >!%}ְb Yа'bG4w*4#/|İٹ5Xa/ ΧYXY oRC)D/8{!Ķj ,DQnJw&ɋ%yf":9~Fed,{9O=47_n=!"doUoߘ]rX%}<**c(>%Fq+j Y(i,4hE얏{3qn c(S #Z ?Lg}\;R8F#WX!͐KgȠbY,$p'WOٛI-.: ٽ1<>j}&?\&1);#;L*:g@LƐk@D;naRMlkp V={wTbm^xw7-|\M{`%ƌs E͆#A9pTtⷁehdmC0R\76juCu"7] ۋKM)M4dyhܽHXKg\U⦂œhԁ mL*R^hvM/@J:5jmkBݵqu#Qp!{v_q+PK2]_߀Lj+ )TRu|Lmxb+mLg`۩Nv\yP5np餴nֲr:U/#9kutGEDU4jO`m<EG\%'yAμB HYo^j54ldv218 8i4`de8M^mm'_ظ j )X%f0vrQhm3I0- 6<Xj8EPaԒ@7V+ZD7."K @,VȤiRde=UІ_]֔1` GaIGOb[kǓ<~uZw)\DH17-)aO ӱ L2E ~,9gz\rg<ܾE ZDd4Vx$IJ$j=;}Uy AfM.k0^7['.V-|ZWp+2MMA)˫ۨ6"zLAvʖ"@ІY`D6L4KMt8Ǚ0ޗtQD۱F}='Z5W <HBy9]ʾ|HY&|N +mh<G趌sm"S֍vFʾ> b"=|O?[бFHx|laR,֚?=K"iWq>'>Pqx8#4nQY @:\>gCƦrWuFEB5cDMcՋrsgb2϶!MfO҂<2dKlavXv7Hޅ6tͳJЙ-$ ^mGNNEx=@&EdDx{uA?HD0n`=~ˑ6TanE8j!xBFs?BH-6ee,S ]x#G[cʛ>HyGؙ}pUEr䝯/i$\q!vg%"u_X6Z%V^h6IzRhĵćOzq \$vėNBǾ,pU],7U$s\dg_c8ψՂEHd&7pmRz1_N Yg;u38fپ"e*׹ Mdik)s= y΍0v G踅ryR>d6}^i% '7nhOX\ɿVQ<\'R"W$v'QDCy`[(#,Z.{XjtM J#cA 篗"R"[?w(~n7C:W^[_7b#]1 ;R9S#Ѩ !g&52PӜmR#1!$ԧmRۡf{.jonjԤ\hJ@] G:_ޘESSqKhRLmyn,TBZ=I1F\9w~dcܱI~'IdfD`)9%٨Tbrp$SgY:;N{)(0ew "kuHVpL"ث y2qHٗjRb^Obb8K#%kR.hᄚ/ZsRb[I9oNJnBMAidBr!ebdIq(Ft6,mw,+uw@:?%!{۩Z&F@B.+l.0Mcn0F@9F$ jiabͲtPqTƴh?AkT&Y u>kХQ"=z(i@5\e+ c vp&Fd􅅱Cc.`,G0^:O,N@q `L;Φ3݆ &Zr|Tn QM;8A={qFƜB1T5j,1>74v+:m GצFˈ FKgK]1v8p1h8`LL=+X;[üK=&V_ꅸJrce?6c$!J{ ڛ1Glvn6vw\W:O6e^ܜPb'Ob9C>ޚVD}J4t楺.}8ӈ(cl솩iw4wuVNƓx q9?wEŐ%|å DNº57(ѠxF 0{;UK]BV@f9[Gڴ}<Юi'Ljm4,Jy8u*1Q0jbϥP٥ycsԄߧ:e2q|3lŲ'?pqNn ԧ\׃\} :ˉ'u^FcaF'u(RrIM6J7؈A-llM 687riBT@O|3h ܲY-V6FF`^d#r>%v(&.@ /eS/.r[mK0˭jߝԮ;et qu}CkŕJÅzWǵQ!F"K~Xj%n6q/g3y ǑnK*"kcaэ+A;).:NBhK\WO}إge@S_rXN`Fjxf]X\zmn MvZH5alb6p!=kq1QP 'ok/*m.MYާlnw#S6J~)h;r7*)nȞqDCkL \"+[_I2>Q<R jmG a5~%qt/]塾qlI#5]hШo@JP%unǮ4:\" C`Tdz;qcŢgP9Fԅ=oC^\. J#lByo~@-sy ՝Z,onR\v)d/pzT`2qUf4lN8bS<.pPRʠg=t0ŌQnŘؼWH 1\tYlcyME铺nR|1?ҚFdQ&~2ucSSil4wVix4ch-0菴Rۮ؎'uމQ7ujJQ3@sl>(2?]P *2Oj[Pohʵ1nRN#O0(7$f>PVmdV0N1!1[ce1ćoQћf7e[LbA\۹+ЎjRX( CzZD̳05e|^zdQ.A ~qIeLŹױ F ڨDK%]SktsW .1`T+$ްGm;c؁uKۙJȁ% 0t]ظF]į17批-uN t`џ$T>K;_QG6cI-Di9+j V[AK#"醶Цź1 L)@yNC5q3\kbJoiS\#ӣM.u _;@pX{4m?Hzf&rf& q( ؕHr u]^p?v xWz{křK P'QoN(Q3 RB'*F|豎]tͪlV"V WRs]ܤ3 ~ SeU!I\78\l+i'G$w] WF2Oܩ$5R!ylȈ tёzQĝnc) 1f`+ lD6y SN*w!q~rVɡu^=* Ė;/E=-BfL.YPO(]aD/^1ϒjкFr#"5B`'U;3j(2j,_q ćkzNcH`aL sŔQ3fkFzaIk|%(J|R=\pl1/b1uI&@ Ty{hJQcQ)>:\};i>rxn#Wc@Y-!qh7wXRaL,נ;iq{d9<>.LGj.8v Q۴{4q%3.)<3@C3[ږ.]v DC>0%fOm4V˽Xm<7)Rb,d0^8=bQӖˣwѨ3}WmlĴѼH)._ &.Kk4W}Lf.Cm>ѳųi zRlkY:\ziԑuNJ9/(8F'UT $ˤ&G.n (Yj(`K7Fz77We|*PFċK DxT$XgqX?&.\7 mutG${=U\Y<8.aO'l]z(#}"SKJGՖWVW+G|_ZpN2"~Uim  +vՈrޠԔ7 2Z<6=P&F:!XáyC@y{RVrvuyKMHPf*Yc& R(cnR#){vziL:#m7=\uWxͪ+[SUj^ IԜ3"0˨-2waEk]dR׺|Ky ս'6Zl@IlRMolDj- ȗת3SX6֮_[k_"aD@]:VԊ& ,aS~EW54l#:6KrMM)jXa/5&{00&8˹%!=vs@VƯ&<\hmW׏޴%zM8-N&/r֦EXmHTPFeUFmj MUO`/UH X8$mBԚ Nj _*Ӯ?vf&UH0O?94[ JGun8/`z5pT/*DD쬭6a NJ*C~װ(d.O_0&c e$zs/rsoA5?ruER ^$jiտew7XOu<X91z~qKxolRM~jƽՆ,{h(+7vlw7_.oFr@C RAh8VLx .:e QX٘PtftrXUu^ Y+rH͙/FDa*Orߢ'|K1 1v`۝fC4k=E|r,Qߌ7)zMO`ec("³.[~P8Kر2Fe꧙u1ʃ47vm.Rt hhn1#Inj7$/gL&N7~鸫ֳ_ZZtc(ۘ)Qcxq+tR` k6ErD-=.LlvWo.vR<%pկćuZ*Ta ӳK ?8(0 (f-.H6s)8 \ _%h}8=KjLT**Wf⸒JA+mx\.Ql0 Q`r(ԟe2##=  У e*-J&fJ+-t)ȫ46qfx  RzMٲnG<+ntGtg5~C}Y .GE\4O`䋃)  yÆJr=smwqKK@V3J7dxCpdž/\/pp6/X؃Q`IsXvFX NSWDNOyXxۨ` <zJb~nդIZMP~#y4L0aIxqQ>XAƈ];qADyZy]$'J3_%LC=Q ZiD[͌@Pϑ+Y9ߏbTܯҬIrG 4jd~.´-( 7u?@ND.M[o<9i̋5XY7 7z8~`زJ 5)ĶP/phmˌ_. -S҉b3I OLK&,H].GQ&mc4fdM=J'"0h؎;]KK$1(9(ZXƵشrA3'r39']G:U-5\]jBtv7'Ć )]PO>ǃ=#S[^x'!)EAwV&A6kqٯ=r\aD˩+jЊlٳMVfS/I1mSfl`Yz;uV+n1 : r#Tw޽ vQ9Wψ3Z&_=3?,Ͼ~5w?甦HI"+1֍|?<㇯}y//S/F|7e???||o|ן_O_Ozkm/? /9 G޶KL-V 6!D}߳>eiԡ1{OQK6r`:h)yzyp9ѡxMi&HLhOVջڭL]:b d܇X+ۘ@{qF8jϒoknavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NI.svgz000066400000000000000000000316561221777731700221440ustar00rootroot00000000000000#(zHcountry_NI.svg\k[Gr_YKفٍak f8e9>4D{XuvW׻Σ?tu9q~<ՍNV'7珧,M'wzxz}3/'w?O_^Lv1?}tݿ(UVn>oիW+ܬϾs/30_ s̬Us9>Gٳ㯿{L& O?LOx䓯/N,ss:}Il6YWtbb6|M>_k|d6{}8yYɼ''na<>=.WW\7^K2scf1ziv}ɴNNfÄ$.߼x|zps\=r<|4qaRx"cjh: ȖCY׸{y{R}Jw_o~c_^՛kyq.oz߈1INˋhs(O-Jknn./n gE_/r|כj6n-ZiOnY_~# kl FnW͓_`2}0ןoW"αu#'W9nsqy5gΫ@5s\P'Ooף@|du-WDg:(R׷-?j+߮n7/OSΓ=۬/0ܺkμ <uPzt:ޫ2ϣ5?=ϜՏV3 @NFh&7Dw =H&6&g͘F&_Ccq Byi?fy@&*6.: g^פ]U)$9Qd=!h'H7 , Iɿ ORlLRthRv0dokR0h :gE &R#AY2݋)JAxZSbJ0whKYaUMRvyXwA.UxG7P72{f $7 xXбl0-tԈZiuMa] APBOC\'}`JϷCmnĬ,~` e0al΍anb~=jm-am_ ָuBAi`9zC$WJ^͓ 7sM8\`<q&\f)`]5B2 oQK.t MG]&{4AUlAhWsA5ā Ll?g[$lG|r= wm5j&94LZׇ<ńVb*i$8z Z8=Q>:-v0ilKg<[^rCytc2>f(!S*#]qo2xk,u &ج0)q?L"GUٯ*mD-9?֋SٽS+\G  xYV 1tYpG9\1{mv+z㵂 R3*l0{ ^2C%4*M6(^ʋ ¢mewzRgg':[ wM"?&'Fi`Z 6?-An1~+*K^(, ƈ K^7MGiO &.C$.ܙb92lױ,,s nU۷ ح5N֘w_o`:>g 9DmܾiG5EHA##6zBB$xa[ *ڳA#+z9vЌŅP#[p?Gҩކw66y~^ #{JVwp\{=eRÁR.q} C;#6F{??ڛ5bb& ox#5NC8bw hkI#$ŁPZgٙǼ;Nx0Ƀl \Pr. 䰑05?s!W hЁXH`y(* }c8" Q|hYhj0&yiI q43#1CSɔ 2=̱!7pg6 6\^`4ˌEAPE xc$[1AhN 4yMd eچ&$AvOaKbma\"_ c[WÝZB0ی/f='7 RY1PVZ (VӖV0D n߈r7j9}{ޝWH,4) 2Mk"3uT!;Ց49G,hb{l,UN[ZQO9 K 9&=1l_y2[Cޛznx vb t*p<!PШ`A0'd^ [6BBWRvz[I m{A YA8oj9CĦ;fGvFG_)\Ħh[0zGI0ȐR6 [5{WB -:= t%sqqLX\9ISRqlK:ưz_:$wLD؜:]Y {[5p{ߺIȌKHFJ /1?, |]$$p(Ԍ·e4LJ:/t!Ë~$ZÎ̩%#G֋tp!56Y0l6-7Q:*%:V&Rϡp7RRc0 eb+ #WA9(X垬dp Y3uQ`mq*bm5h)`ds:l5O4f#05}+dKo4+ C3èS "?k1ųGyDY\OaIGb>+Sd.`c{˃Vlt;Ԭ8h݃^ ~$D+lHb%;%O`1Z^oQ$})#m X{ =ckn&؉ ; awxusȝ,#7v*|;^*ޞg-y,5'K0H/{6N2$)k(1Ur ^9[t?04y̒1e{Z)fK}/%. [/!v|ɢ%^k`wJplKVV~GXI ;ؓ o`o EԱ81.2r{QgL'az`1n6 tN4ɺh;ԁWtIRrL{Ag%ox,WV<?i;d9F.6!nzbbèY bH~R ʲ YaCtyhB{O/ln=ę{@H9W9վɕ}a㠕E:ƐY=Y?TxخQJۓ*疱zdY6pv*v_AJ0pncr:ѾUXr_ݬnD!|1 X6k5,Y`#LXgi[]|YjП|զ9lU^d;)1O"/y[5Y3Ʀ@(^j7^#\$x'ǍM85 _Ǿ @Xޢo`a1pJ^ֻ-rM.aV_7!,¹bVpY$yaVd337- t޻|Y'Te_Ώ}-b)&'b--t<6K*`"H)QlAlAM%%jK)-kO囈tςPgVQ F ear>ypZAfruo&kR_Gȅ|/ك]ySSǒ0;%Z[9-fnЁ,P$*5]6)cn9`$DǺb}C P::H4 b $x |C|1Լ=ȸ7tN~pǸrQ \3>9ksk&m}E,K=k!{)DF{| a-7=+fO*h3 TKDP/ =J&1_=srtX*z8t~:~6mqrő7Λٿ]؁IZe|pxԒrɂ]9&Gh-%mV{i[Zo 8D'`LQǾST|GbU$ߵtY{~ջ {~e{=h˻ 7/X`"T&_&@-@LAaGd=U5suq!DBg&zhtr^vR&ٖjq;n!mŚ#E@9 g#\E5{?myᗸmoKvw}gATOl׸%]O9Ȥe9me*dd:pt ? |˦Y>x00iGjK;zV86Qun,A7n'Ey8u{s eoмsɯeJ;C0o 04һbLlm~˷{qᢞ̀xN*(x(H& 33vqZum>{$Wfb"H#Ih(WP^vsAɊ_TaEXY]Gnc⃢巆(~r' tc"n.HõuA6%Ŗݫƾb$. zn"lr ?9-H@vb[_5k(]/JS36/qi;.g/Q2bn猷P)Mp؋T[rĞskkU s%_`"ƥ}--7j2's =4O\Ҩ'ܣ҃ǀfҶpW:)/ȱ~'r 50VqWcΩ/&&`߁Wr ك̮8^jc{0Kfp9#2?٨v8i'JH+3we>dM\c"^od dNM~UUǾ^vJluxuBc_#~@jeN$/k3)W4LT` me[dmtVfux4=vV/{O=TFkaU]-f.M%T ?U0')(RT^[kOdUR"#Iw$P׼e7B()]j$v؄w(4 LUX[؜IԦ78.1}ۻ'eHǾF"X-|`zH1_P?lxe)v6MI*ݑA+|af!kR,5< [7rT:.8 ca@R%w pHoƅ0v&w3K'7SٹH|oAS㿌WOMa1dSlc,Xc8t7^0^n*^OdcAYEU R>/Ž~H<ަ/oA06isDagIʛ!p5?3n; ^F=9=Ɇ3;UHjr,='2[Тf< j6W^*gGV#&D' wPYZszqWaAlsBTGTm&C>:1 ` E*tQ>Ҙz7E/gkn:f0lxGd'T"C"+̟z&OA饪;*_. s¢TK #'|~dũ,)6 ǦU#Eo1EPQd&u%0bĻ0 K\!dq¤W:3ɫ҂]fg w ٰ!u%X,h~'cJ.c:ǾFV-PH ox}T[Orb B$ BnwTjzBA'MGvFBX${0N0Én uj[oA>^,=3Z{%؞צ6xP,K!$*PBIx`N*jRTDnBIj4WNgqI@e[;]oוfUVO}HN#3ѽ<'Y)uc&=} o)+eXE%zѵRq{|h TpkBfu6fW Y@ꇊ"'!L9Z_Rh ON |$!#sFW02h#f&4}SSyJؿףQVㄦqLb"3yA֫(õP4cqTt-\ājڴlT A\SQIԨ 9*UxɄՄLRvW(g*YԵ9%= jà}lh]r2Ї *6ŃmL+Q;6IA*,zg"7va*Kfcu*z!uxŀ~RsG)}:8vEC~[Z'Py[0<?)Xl9bSe6Nuߔ/R}Mtrp ɤ&YD 60~ʸIaLyρճ)-qEUE(J7g2D9ߪ&K,caP:ИXAQyèzSoR#b:ۅZ !_`8B Rz1 Rb_As[fZꪑG Ate&=_Bb;?E=;*)` BQꚊ|t'| E&I?e#v{L }++o@ZHG{Mxԡj(Vd&''=؝L3]auUuߩY'k@9LP 1ybdeB5Xrbzs$.} d"Cx,2U>MNІxߺ:Ft=2Tt IG\*1/;Pa nR';e:'dg `;C{oՖG 'JG֣~d&;e+HBL]j@TƹtTI(_^^“qAi*RhNWxۈkϝuXnQwE:56mMG@vˏ:/&) Wmǒ86w?gl$$6X5 %ZaQrlSŚa%_귷(k⎟?8c6{p^ c)H:074#5ӥ!d߻؝ˌ]7}ONedlZ#,:#q.@%4fEkQ˖w%^ |^eЪrS=m`F+er3>UNTڞnAYzA_%x`V OᣣriᆗvW#ӔlX6DI-"I"bSԚe1{?VWtCJ8Ⱥ[ C[W"D֘Y d3Ȓ=WX|q]n)Z(͋<;X 'sXfѼs%ȳelZQzd3zh!FԬ]IvC P#.12$;A)4ʖfuCYEcr7\5~JWtF71]ĥaWL=WH=|>S;:sznpz* AOA"UZ+'v@X8nԎ׊lh i0)oo?)WɄS?%4,zf"nfuڟLB鑲g;\ :χ?CG9դcs5 9(navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NL.svgz000066400000000000000000000005211221777731700221320ustar00rootroot00000000000000"(zHcountry_NL.svgmk0Ɵ+?n6I(Z 'L74&6.&3_+ D}98~w Y[],ЦݤuYYT8t;%|`G{?!dXY P9 {~XY^ܒFJZic# P84GVp6ԅrmsϪ#G 0SY"$-8%a%Z6&iq-sZp{N%KIr {$iz>@]Cʟ+F&:a'L>mSnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NO.svgz000066400000000000000000000004321221777731700221360ustar00rootroot00000000000000%(zHcountry_NO.svgJ0xE)t`; :p*^&i5M\7dU;I:߽d+{;Á4U'9;5KXWQ< ҳ>_nkz XiIXw@qns8 C8a׸M+>cC cX>G13 3%u8$~r'm\5?q@)ٱ6)8PFe}&t,3t*navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NP.svgz000066400000000000000000000015111221777731700221360ustar00rootroot00000000000000!(zHcountry_NP.svgVMO@WX b{vEjTEzI\lC8@ %H=eޛn/3vUZ1!pVՓly޿|!nf7EzVcn$ݙ'l^ZI6p,"s3bʫ,/b>(Z,BE9>ZFWG!DDIcltWfɤ.'UR ~nNɴ5M`߻lȄocFC~؎Y }aJ#R{)9B9-PڞƟeqAn#$(cBY $ 8dx:+'qvfi&Bgb _NZN5 y1.ݕ#MP95(JIYI@^ZJ{+r?ֱWD…6JVq-Nxڑh,3V:/˘/٤N`>T6V X5dɞ`@`?=^_KQЖ1=U,}{4'oMb{ Yz@Nըȁ)"YDS: U,)!`U*NHU<=**a ?/sj2Mw1x\-TQ4{v IO6X@ XºtuPRzGZgT+dmsž#ҁ{vNxPZjkP ) O!4<RMti]AϐgiziJ:w '{h_ie&=o֮öRA 5kv16W}L navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NR.svgz000066400000000000000000000012731221777731700221450ustar00rootroot00000000000000!(zHcountry_NR.svgU]O0}?; H+lBbbeCmR%i$ҴDs=vOXʊ<t>),n !Lɢu  .?o.AW#= '`0pn*x٠ GE9[r\M"[-)%(5)t[y:1:UPMGڬkcyvly`$n/ϊP.UJ:Zgǐ j%R3 \s&fi |Vn!u Qg.r) P/ d$E21etD_;؇<\O.t:/2eܞfUVf8D**Jj}׀rxT`QɄR5*Q2|IqƸE RF$ e@! :1xhaGC+}^!:{  }ߧ}G,dDks Jre.;S$^S?>tr;][ ^z}kky ^*M-_%wwh\zDW{"~/rwEenavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NU.svgz000066400000000000000000000033341221777731700221500ustar00rootroot00000000000000$(zHcountry_NU.svgYn8}Wh՗S_\;}HP@w],(P(u$C_C]lJ{A̙s̐rnV-ȗ!A8 li_-ÿ?08OUegf଴qm`Kk<-:!*ʫe0Yl^dvMj$+{c"Q7O[{J[2i'oY{Sɖ5FaQ:Yu,{SaSS)8Ǭߝy/@/aE; N=7=Uqb7:6Ke(q;u Y7e!x+4yˆֶ[Wqp^Z$ns*T\~3XôQldj ,/FA|2q˜?ɦɡr7xo2oQs[}ux 7Ӹ6^B)p.ߴ#' qq;"M@M\f7u;q}{>'k%Mn27)z_g[HD}FF0"/Eڌv0:n;DzzYY.Bpڢ/` c0ZtJY@B8.pdSҤlzZwQ-w+")VE Tnoy}(n\JIɴc}rH!҅)K(*Wm,R{Yr#@[< г`)Dwh\/ N3r2LδW@%de"_cpNaYٹy,ygV9Y׽`p_lss(*[J9Sb qmFDݽH`gcѓPaLj׭tt٧G. R"3 V@ ke?c.4J d_!3F;__sg,@AA @Ԏ_Tí>=jZ]?(=}Rz$y @Q"O(B_Q%˘gRYDžD f" ]ӧƏu6E!Wٷ'u0~pkQMEI+=UZC(T2pr<.* *FR_+㮭 l)&H~ \=W4LTB pN6|ި`HtdcyN䘥_\79dc 6X fCd/\M(`Ve9fVaLe "3j navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_NZ.svgz000066400000000000000000000021161221777731700221520ustar00rootroot00000000000000#(zHcountry_NZ.svgVn6}_`aʼ$D"YmmbQ`(6m ECRdCJr$ ZaΜ9!=y.`:7pMVγ”zJJC]}3_nzk8ַYn[<t]z;%ٜn;IM c<@_ouԽSyvpF`SZW[}Yo%kr3%OZWc֗6ٲSȖwfq)i\Ӕ\SWrϛ@t\5S9^&"fŻ7\WӡBІ!#"}9pw>`tZgXbJNa|C̬X+ ٽjJhkhP:__sTpr *=p_Npl%5?*^0%UhٲkFcvI>}< _4PN+:`?,[;?WakԞfga%*|)t.{:{hSfE=nZd>DpsAY$we֒9>f?"VЗpbASC a`axhT~;rHvtBYb_}4R#7r:~F.mZHQocqFp}/tb| Y?̇y'n|UZ(gە+ "S#!=2pU'`1{=!_Jf&1 T navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_OM.svgz000066400000000000000000000236731221777731700221510ustar00rootroot00000000000000&(zHcountry_OM.svg]Y[Gv~`]{4H,23E^w ſ>w¥)KE6r2 ԭKUnGoz\<ʌGb7/xLrQ?/?ٿ\^[ՓM=oތ!wfs}uݻjݶV%Ʈ|5b}=>?nj6ozY_^ݧWժ^/VZM=WwQy絓+㮜Dfrzg(<6cmz]w\?jqu7W/}if3M7jo~*ɴ^K78|| c(  T-th_ʻfO-?dQu|jFχ?>q~_ |ln-]v,q zf^%04LjZf`>LI8UɇõZ.8-ri~+fT?F^|pa^N>ԫ^FW*z3M6-%]M! y7Տ-?0y| /gf_P]^YbͶ'7mm|wNz>yvG{<,?,&Dc]}^װ1YM^|fqGӶGCȥWz7do7޺[{d mjrU&=@vʨ#n*>db~::Aa>_ȸGlz7砫n混E{^?=n2_I,n⋺=]v͟9ǟBdz&}WÔ~/jO\59ޙ[ݲW;UկPA(FŒ+úAJ#c3=mto\o>܂Kįںx ϼSrp[_or6xnRk{i&V6 /MYvRI91Fb𿝜qq}Y8{y?A/#@]\.ɖf5Y%L`L1ʅ?3YE4UًKklo?ATk7@κ޽lQCFBewۥϻjWB-B;E7v٦އN}A6Z}%bLv`G͸*I}U }贱xR}1d[()i{ 8[of1nWcMFΕDdf1CHb h .&o4H6h ) IIyQSh+H(\ Ĉa-E*}F - QW]'ۈ>dc-G  e-An偆IbڝcB %W)oeo-wڧh40i٣%FHt 1UrN`TF hX n-\4[yeP9š%DdGI -*KPq- V &p,hJa LHv#ܰh1gGx"Jl%`uwXO}oQM<Gwi< ?ޅ{p4oG`TR0eP*l N t:s|{ ?uY8OY'OPhi Gpo_='uZdLC*Ry( V;GP;d5}N>ח')$&;d6 ' )6')&%^>'M^#qHXiTIvO{rVLB ?hI3qEN+hISҭ  7(ih:obr]H') G5h5}YqErtb15A?;ka)"(4O3m|if52wv}eͱdc<В}ʢT!:[J)(s>2ԛ)<ezJ"?ŧL:N\=P{#'&hڃ'HUK'HB H'.* $v#?ARJ#?ARx S 2L8Nd )0i2gW7;>"t횎ґ0K:wGGH 9q.9y9r_v縜#}yCIn`7s$]̑v/G縖#Osʑ 9.HNü#9J29eraKü# 6?8R HCui7qa^đRyG |_S=ƥ.`\ƕ.` u^0u^0Ƈ.`|Ƨ.`|#dp ^:漗9ﭮ.`&   $ ( , 0Ӛ8LP6LP6LP6M6M?z z z z֜u#g&{FTleo. nM4UfqpY25..*A1O8(ѫm`*+_EE[n{Xle G]NmKqNjpИ4c||D/E|p#LuGRTE\ #KU(d" *W(9(j\S~z( Z( ţv)&d@j TY/{Y9Aw8\䒪/ @tŀAs{VTrK,0(K8z(Pv z(5,&8ױ4RP Ll@V3?i_,);}GjK=PNVۢ~0ԊHM`X]] QTSf2~ ROu@wh2`)&}#Po' XO-U2 "> 92{xfA: m(@$B@ g^"EujH%15`X " փvE uR0t }5=t @]<CPL`aZ#fJ Ш, )g~-y,XJN=s-w a(740jP V:/d!# mɆ >),U暩SaD>@a[ddcb[2BT#[< *mO"5|E m/Ⱥu@D`͑zu d -ՙ//9 %L/K@D$L1r#D"jD _tE {"_L _ +IҤ[I>b%C l5qQ\VZ-!-S/vږ ۲;pa#E[u@*8vVu Bw`A w*S9 `63w6^hf%[cQC{@isb͌Od"dfD i 3M-b%٥N禇NC5|9JXHc-lǁXo`pF*VXǚZ׵D&-.5pN^.,pջCBF `wQs%[G0?^iX2dX;rQ t,/c l>p@}GޤWD#r؃SamXM"SX5](:x %D)BN"?HW%Ҩ\#F,rP>x_v} P`b_odv#B6yI٨tT#MHc-n%2t#dոER)=@zMN ;B{ %L=nc CN(Ѡ](E _ĎD;Sc"mgt1ۈ$K҉IZs@RW픓(MsoBF4eXںa,I-=c5'FŚA0-vkD ء; RQdXW#>49Ԋ=[p[*XCwqt+–мM(X!4IV@Ea_Wpg(E3z]3z,V1N ;2wmqP4Ff:02 DThң [s_~Ph mKlL}>Ń2e*"omX[xpGXMnRIPpewA2N2~w"[/zV12j[O F ܲ:nRlv62I;T>'KaURJ/f\Lp0mTE)LTiҀ ŒkYr\2CdHU*HL]ǖ 8/ω#LpEx pHeaYs飌8d-&Jғ;|EAxǂcY[=b-[EoSP /|x&E̊qoKB%X"!Bv7krspGYJN߅AAИVfZuqo Yg[q!{4io>yqH @9o LZQX~`CgCaqU'|@y;e13y21H;"BbDqH 7Yx21T Ş2 n]Ĉ~Ba8Չ1!ҷB,Ā‚"j^*'dLC[Вq'S YOvβVeD{ {I&YsYpaDIOo z{.V,-EsYr1s-؃o9'ھtm*6.*n@y@@۸\-3VokŹ7-ro֫?Q]ϔS>.@35tB?T@ ~>K49szqB~>9@Ę siM%- ѣ4k v|dFa%QxXd …|pSa4Ҵ~%h,ϋYf" j J4J ϓuVLZ.9sΐXsW.NiOKu9sΐ;)}%௜.7 f(rX;C>k9ҊfH7Ƽx2[Z*d Ue=C͊HʵdG*L PZ7#,yu#[0*OJyHBM[I 2o+DY(B.Eګ!S7 uE)@Zʓo6&єBz-INwVQߗ09Snh1GL)j (r77.AY9&RCMX7"F@S#ԚNw$IOEdj`v+%X" *{Nz=]-ԫ<fQ9ry0$D2RK?l+໽S2%>F"m̵#+jeBA! =6t&O V&CŐ$4t3sKݻ 5:wnBR7[8#7^A=D$9zl˭)hj{tH*y41 Tyr!h?T'" L~y=z6 ڝBNsg؊7O eMǁkՓƒY6#?Rß=ߥw4aCFb 찠m\ ]Ԟn>[ F[+d/m=/qWfcJ1rhd@׈\|gS9->O<`D0JK]g+FZ$ǨuϯϟmrfedKGAQAwxDw(oWEiZ?9B_S( U oG(D}B8"}PPxQG,kKaF_RvGB|mܣ2v|O`ůEXv[.Cl@bۺuRʮQHsMʉ @j|*x%ѐW@Viu% 8?u.?٩N ϋsl/ybR,<a\ztŶiW O#hm'}_<Gw ֱYF1 pgl<smqv2ڳXsd}lTL#b{A{_<=xB#|?he#<4B'*#*o,F,Ҹ6.vYs*#U28]pwi:Q֗y@Asi L/ łgv9gQʇʩ\¸{'֥|DkEN֬[,u 1.}&ޖ+8; H{^xiNzJ)L@OPPl JhOD-%ti*|6=x"UƚՍ\~+kh>/Q@KOܙ=N4a\IB˩s$wI'h`i.zޢeOFi.j+ $X:at4&1}rޝJ %S ^}6${*5>ZT04Xt!?8=OO S}6y iow/g03^O仌 gɓhe5۲cKi #<"K9bB{a)zhz~UuAF}(@I'&L[~fFԸEBeˢ* o7W6ݻ[@/a>?cPi}Z3uݹvUg챖'G # 3@JbD&I0 'ι>ym (Vo2BZP*3Ct9mtw9D8'My(dU {Yʣ Xh҆ 8DVkY6iU ErΈTDѫ$C@|Ρ}?G$:sK̠ ?Cf7 eU!,1=`d^4dοd& ^a`?3͋4LSͱuY;8%jc^ux8<=^i'Gx\,6Mq7lnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PF.svgz000066400000000000000000000133361221777731700221360ustar00rootroot00000000000000(zHcountry_PF.svg\]sq}`/Iv4 @^ʓEJLJ~nܹlJEE*<@whۋ>|~w2/W7^~yͫo\=yw??*||_^}_~e,>~,)V򓥎:BWo^Z_\]~sR|-pq@~~_^,vys zvsZ?:rRNM녴VI&z XYl`5مX[ĂcRUTy$]\ge)@]T?S fKEPkC#-&X/')%zfR剰nihk*0Y4߫{\/(Q/_R<Q jqє}x) []t12:%Z0D1HM{qHEXiI:uOq5;z>_\f_?߯dyhcOzy5^/}Փn޽zV ~ Uj/ -X-M=i |ZJjuP_V2G[iP'Т3$g(uHچ€* -& AY] C"ִ<]t4cր%k[ƀ2FZRS=-:gϛqjm {Vt@mDITǨXO[j臘G*?=?[;Z+k'(#VU7aŽC-ZB]r0- f ; %5 +Q6~8Zˠiƴl$OV1cmQ 6HeA؟s[,gGZ:QC9oEF eSuJGJy2C66V֡ ,QMunx4A'N:R2?,榘mr騬]% v+Ɵ0A&>ޠ`Z[wBmnX2Iv.kFoG =.!yB=Lbt LsB5A,YR| ,a2.k6HAg:3^1 e0'l25aEˮ28O3T/o{H h+ݕ(y`і{}so|xZ)TcX3# Bꮚ%@`>R)59Ոџ-ǻIGVy{芽z͋^KzË?_~_0`A/p.w0Sx@ah+ޓA7N4};F4(73]6<Lvy(rgff3pzȰԯ^>IGO uATnAp>/v`ǯFkc>gl}c>>0N:osN>=}cOH(`>]9)||BBw`ZZ}}csӾYo s>i*{uu6ZsGhܙv'd52 ~'5\?0^ޏ} ] O|f~=ϲ=<[$R=<=evLrfnh6חd<5N@)f&Zy 1 S42HIٿY!wG&9϶AIʈv{ǚtkAl;-bͦYԾXm*Ֆ1 O`'0D/̇c&qKdrL7b͘qŷ-Yj2}dlNEU=wY1U9M3h2,G@aC$c摱 HRd՘̀B开+O!XX_ ^Kv-cׄ%ؕL44ot"oSH}B'pTTF-1FWz @`f1|;o:emZ[Ƙ%KmkmXmܭm%l`XZ*h}-Yp$ƝʻN\I[9Unݺr`JjK>+S tjh&N#+Ac0Xט 3LJ\/hj#SF/-5 H@ՓXg徊`WV10KxT.d@ŸP]vu6=P3Jk,=u][@p5ʛex i6K3%0ۉZwȚD_W\VMn*ᳮʜx#n֙^j^}֙ka]K2Gsc³XčR LМ meٺLV1ݹQt4hQzs G* e&E558˚*Dwd윿XEzG9{ԲrQ4#;XfO|ሦ}J41檖o}{27!LnNe)LS\&Q'(s UDQWFFpt?9U`Ƅe4Tu΀bMMBce E$1A`ъjс'*,G֓A&67u3* KB<=3 LYNt$nNkV!溇VI?,4A2]ѫ'.Zܢd{tQ@kйFM~ uZ l 2P`ݕ&PSql( ߑ؈G`kk]90Vb/0s"%D-wuo9s;$Mތ:ElF"T8umwC DApުiv)B7GfhވX#3T^P dy3P=Tո ;&v æ6!;"8v-Ge&!VVX[@5-0-^QVj&2j5>thZqT@4R9z۝ku ޼~KnYbFx}1Yq7 sdQs])څ˱!dneJ N3$v*.,P)6!͈'lҷ{*O,2Hc=wQVzmH6fF8d#Lk{Uum1fQp.wm0nPH d̯uuMm+QD?=e^Vݫg7D#{2AYLґl꓿ +R 'ɨCwlhA-Z(jlVcnp8]F ʏWkU>sSVMH=)*1Dw͋ k{-.pc);XgoP! -$V j 5)s LJL;3dZ6c0R˳"ШZ1]ӼʜCI*sJr(s!kMZ*o6 /$6!zLֱa:l^/iray%` y} ?"'VՇ-rpj>+z@Yƒ܍$ 6;_qJ.ؖa| jG!.;6ae|hke'L:0 m;,XKirʘ<|Ę,ٱt؎1ӿ zcccJ_GXLc:;v4νW2" Q&Kv5.;$Z#]cQnӱQX/]Lq),|ڒ7{Kn+v<0<{WVI2_aW1P}h1iH6JZ T|*`|'cNl̆7Bc:Z?գ/ }ئ}3G3@Ն>;Z$W%.録xCޖZ-JK$N)q<13t,|#!D)%S۫Y(s᝙5{Ѩd'%v>ۙQ[NidST?z<}FRYi-G 9zϹ8$Q }HYoX˩M|!˧}03sfsQ9=?9/sq)#9۬2?mŻ@B$:EP5h+ӞNt ʭu[aIvpuiEat4>uER'+n7r6)@{ O IL7=H҅ vaޤ,Jt\PDh)ee&hsT7*AR!K;Lj,j?a::MZtcQ؝~؝mBőK h,#]"J}:cW"QBvH0FV38w'>Ǿ8CSB5?z_ӺLG  V]navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PG.svgz000066400000000000000000000056541221777731700221430ustar00rootroot00000000000000'(zHcountry_PG.svgY[o~/*6M/hS%/+r%4~3.%ˀQ hg~fV~S}ju]L.z{8]]՛v,&vի?M}Swͪ:aY]tBvC5BUUU0=׋IaDjlg>l6Cv?SRd[-qa4Ͷ;̔Pˑ\}shevk<ܯnFVDp2̤RJ3gZO1=E`/j) FίP؇lfo ׈mnsOXu35O î^6˟֫n1 >]Mme B@}zvR>KL㮾m/&onf߿U41ڳܐ|CrZL=i_,.t"08:DZ4Mvݡiw{bԏ tkO{J\?6%O-☖S:/pMJ~΁ ])}իǒ@{wocy1NMj9@Y3r6x=QiVҋضZޯIhn| #%2V9+0fgq\@Y6uYL~Uy&oqw߮RɘR>qͲ:tk??ô\do?6-J}|9kL,U/@/@5drWww/l?nyٶKγWs{  28>v9z;G)F䅬~_߈G$G6zq.?rcb'l>\(qƩme}Qi.T‡|e&&tIh˞mTZT4tZE4 .D[YT̖KcAu"&FXvie(4^$c,j E+8Θ#R ##V' g{J +D3)vᒶبKY̤18B&-d97P!7$"IZ(ϜEҙ/$'; NDKIL#>4`;fAS mX@^PllԆpc:Jmaŕc =|1x^]൧yP ɰS* 2"KQtf}´ |(b.tnHQ.[O a/yޖO h:#+EF&dG`z>ZN)YICFBAǽ@4}e+8=*NJBD7C,0rA(FԌ[BIv^4=#l(E4ωn;ɟn+`ANv>+W1^gHWY5hpaS7֖df`A7'`\-yth3][V{7Wgy^̽s_vxn(Ȥ$àb׮wNھ lyG#3@D\<ҷ0hU3(~-K8E,q\EBS׻}=_鯭uSw̺͛V_HTW$ {;i1շHVnE'#Fۤʨ~7˕ru_wl I Y drv{իwRnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PH.svgz000066400000000000000000000035771221777731700221460ustar00rootroot00000000000000((zHcountry_PH.svgXn[G}Wj_Zj< A>,@^Yu@iXn}-W/!9zwo~Zfޯ˶׻f/~|wݿ7WWa;~iě5M^j U)xOS#q{s]-4jެx7(ټ{qYLg3DeH>/pz{snslܭ7)Q~sspۿ)k 2T@:yy3rdM EUy6ɩәo'^j0$WpJɐ֠hҒZ=jeUZJ]S ڥT!p!*9i񎮤43GF&!6TJM ae$_Rr'za{xwZ|>췟rժCBC-ȡp7)ggBS*˜ȖT:&QT4DIPZ l!1NiTP25Tn]zjI99i -2v́sB%'RBfUT84d$3ZiŐ S.f7*#)@$@Sh55?cK *BZ`M.ETشؤ eBC_?Ճ_Ġhu)N-ؚe"eXpUKON)^hK} R4Jzq hF^a [ZXFЩt+s %:)P[]F2gzfKn*J>Z;G nKO2[h ;1a̓t(T͞sv mK)MP˂Ӿ@qʓe-`\:y*KUBYʩbi2b@P*Z9l7&Tj uI֙MMy4$h&x ν17Ҧ; .v3z@Keu˘Y&E:p `s^# Zf, '6w39*@5N5͏2Vap3SCE7mՓ䗞`1a# vџGVxe{rtW e.LA!O0E{lmw%Mt[3n)e._.տR-?`y|~Cխ1@6$cj/H-JQp3b+LiG̫ 5mdn]E,h=^+c àE #G5uJkAZyIG X5zf(+'H̯k\T.Ƴڔ+Ln'._|w͛׫O~_/7two~u{e뛏oyFzwF^ޝ:||48o'gY^}$sYd"_^n7Wn⟛/_.>߮0v%,1I}$:>r~:܏zeG%[(ݮo|\--ZxCeCd#1붥|Z69־eßv2$vr6%6mm >D])1ZnJ8aL5PRYNZi۳n{d,IK߆Wdr#\]M\ݶU)6*ݛY-)+sC,[2GL!(}#OT嘸N96'loY4\/׋WwI1OkAN49#$qTJ\NU98}L7&Y +i[ARv7.NVuZsnE}Ur\d4/X\'}M$9#^%Wcᯥb7cW퉢gsI4uw/WEfTeD`W35Ր{Ks鞸_SCAG8A1ɚ\W,:x6MͮI9TAmkqa^\׸G#KQ,!K)=$,ONJ\$\TPVJi-(d7rbJ  . A) %.+.  Kh>К\)AC62 P_֠e(qs.`LH9@V^Op8m,޹ ?)u3N\x_ۗnqWR'!yxk"v2 UZ,^PHnwI$cAZJ [J&bҳ"1|'[tRw.s.BPa.ssIV㹐p 7eJŮ,cF /GH$?Bq*1y :`RE&܅:Pmwُ/ŋ >9>Ar Yh ]MRz*kaL"-V3dTJr xr0Nx< OtPoSe)"+{2e@B1:UhiD܁bNb%"#㖭d p=4U:QB⫬B/GH}߫SqD*A007zduygCA`&F—fŕ j cC6'BȃݬIRDyen[ (GPeXYDX19J@`|pI;փcJ!p"I82%B8dJc؂ePêrفC*_-)sˍD" $,liT;PG`1u{! JKVW?Я!+`JNch/ލ5Mf ޕB01 J  " t ^LJk zdFDPAB\GԽa9_$`{J S_Da9߿gRf5$D{Ns (ܟCD]VRz3 1 à9if=^;!@0𨮑%x ErMG"-jHiQ7@%w в/*6we r|ǧ!?JYE[(ݍueӠY*X` -g{-ΐ#ӄaP0]ZbCQX%)*Q,Ŕa`+F˘ĄY%z--5言aI.4H!PzB) .5۹ŽwϞ m7CD \h6eW)ω,g{>&\Ո!1qf5u4r.o?pYD0gl -=AoktuƐSv0 T#&AG K(~Nc)do}/55X.{'{0iaH_SNTo5Ln`/93ȁP5 dU+M*Mu0*[)Dh5ÞXt ̖4:O^N5UJ)1%1Z ;:O`ؓq&@#ٽ CȩuGc3;}<}ѡ[vbL |k]Q[Խ435s\"^d32٥^9 V`Qk iC8, ӼUE 2Jbq҅eea@fYn %ccB |SMۥTP8{ը!#}" ^kײcl` cxϖ '-f`@[2u iuX= Μ fz O+bH?C6d yҿyE0`>K'];,p A*eҨ BJEñfwW/-e ՇZd3Xu=%º]E~8#Eކ7Xqr,nBK%CMؖAض{JZ9߄ym Z0ނK; -,ՂٲZ0G w{TmQ#.-)ՂEĀ2@ oXd$Q(UYZx#y/}W뵖 _(+>zc2oOm"ΙLQl,-^Z m0z3#6nsi)~i & ﬖ-rcZ蕈c=)99]-λ+Z*·2Bä-Px >^nϨ*!fVGUZǕU-S}Ux?<`氕jJf491<x={FM쌏Ҡ"s.CC!wGѾ.( g["SF3!Eșx!1tih‹xp7|raa)'}XYz#0J)1,N(ovD(GU݂P%ǸlE 15J|wDї.้arʪfx>1BoD"Sy@>2Lw4Zؘ{Jȥ04U( @OXW!sY;};d/יS3<  >Sq\.,zɚ*.XZ?ȫce$^i؉Zf(]!@U>cHq/ ΫjBf/L1u+ <&gトT^M} a4[hkYjz6]ocW{,\ΚI9]r!RYfT{ B3ѫP@>^7F<0aJ>|lb jWD~X)HTdK֐-7K q f\&nZdbR+Y]ϗl@+ܛ,DIq) ic0Ӎ4B1}t2"}+%L.| ɷq7Іu)LhZ~\xjW;\zsYo$gH&57yW9qJi)qRq@R_+wh["T 1cLZa1HZ (G!).00Q!%PaDCT̗LlX}qO&[z+=X']^gw5g׸/6WF5ȤS$𾔐ED"A`HGؖC01L8zb ̗_bv( s|-1kk9T2M@Dդv7JGF8h{?c D9)10N6R밄L>! #H ") *j- lwLW QpVG3S-Mr ֤In lQ%RŜ13` V;vG$?PB~(~nD/dyjK>'N)Cal q ֫ఉWJ,KkMG`֠\iB}%(Ҩ@ᨔٹhX5`n_UMNXY"Wj5E #AKuƥFA+F)yuNRؼ8 V˔T-2S<$ZU +_ ӼM*F P$K-#8{wC W Z/Z3QJ(ȑB< }Ҳ(aI,) }gD|!oPXBs'F9r!pjMA"GG(߃T jQ$6`F^(KYt}eZ3,3.(B=bmEE(0 s䞬"4 -9yX'{EgGiuhƦ! Ak+.D8,&њŒv*ɱ`lH8SBEZ f2kh 55Uu'XipȉէZ×ku+ZͦrXdٌ`%i2 -xTwGǧtĠ]'P˘S!] Qp$GMi*"جfEsAsbRR V">ѕňR ײ&%%EV`Q:ߘ$.u2ު_A*TcOF[+lN&dvF-|lX5ݝW6ڼZJ"Sl`5`<{PBǁ+TZ]t42Enג;9AH^!̏zQy3&Bm؝úFº+#*1G,VBF8&/13ԣ9r*5If{MEvKXc^O>'viK<D%(/nY+X%gݬCWU(P3O 5j0el}NV2i XxLi0o$3cjۣuoA579烌z|!/)E`bL%%:PW+k%u# ުf^(Fh/օȟFE& ,KY0OE!3`)Bމ ijI%~|h٬jGIFL'ulJ@0 !lPԡ-8Tb.7֑ +jpIt#~WkL8]M8|s tLtߌԠˠk̘s@g떦) ϟQIbm* δnan<^]gB ݊Â!4lt0۞\!?B3ʩ/"Hr %J--޴PO6rT92jceLB>5sPOMD{=0FKK[P\CF+.E&KQYLU{hQsZ#&TK!5s r]Lѳ u|(01R9x9YoHQgNQ ^-;6?Su1bb,D.G`|"Bָ3 q0 6", -dԽQȅۖ`9Q(2NEsAZ;muЂأ(CyNp+8bN|ql<2*w.N ЂP h(6 U{T/SXT#y?np%Kü94-Ф,ƂcV;L>m <]QeDbfiee#^T"b%Cʣ#?"Ep.:'` +7_MY5:1֪}}S 2? cjo$0n60 S|V7Z ("uXf0ͨS)#UZ##ԜBfk:-N`G}UІ 2|-Cef +`rUɰ*bl~`2,!>SUE*j[X"A+DY\5Е $;m}0N)2e!nfse>ayY*=<JJ(У%R0x%nI2A֮;kp ׸Ͱjxcap( M-yq֐& N- K_~´~~O2#$!u{ٲ&xo {J rGX䳜\зlk( ,Ԥn`Fy~J ˤ#![6jؕkz C򧘏8;Qbc"/{{:>W@aC ֦QmW8);Djݭۢ ^u^yn )<&K\)nr'ը1׮1K]uMWZӜ P`A;HnyV p XO"mkF3r>1`uSXZ98ΠтCj6j+)@_cJ=/mnV/k>ڝS<눬 X:wLYUJmnnxBD\ Vn-(ˇQl+'CB{+O:~B(:;dwu|N~cHM Q)eW04:]KX1йYCi OJj)^+ &4oH::hr?VF2#o}e0y"X#ier@V(scZr:s5ܱ΢vcϦz<#"f٦6i!P;.~g0@ŋ}pUɷR񒹗~tެLoJ(LjĮdOR"΁_?fA!N H ն%w\5Uk)mBJ}pdKiz3xԥfG.=$S5HF}ikԈބt$ᛋg{tc|H8:"-9fiJV-c?4`,W|ᎺqDU~7w ?')qI{>Wv)Ԫ<JUxY!NBe?A5i+ryo^0Qӏ.qk3ݟ Fs' ¹w mЉnkqyVԿ9jY)N6YRb,BwءbJ(4kJ'tao^AL2F>k;O5f=Lxi&1Or%.Sh,ZKa&=gXL}q>AB4QM;Y_\uvJ TDM.{tng:{Db$JQqv=/UM Л-p>0UPD,Qf^35>ғtZ?D\%ԴN*& F=dHiI"z&LqFN}[FzrH~ឃXL;٧#MX2p x^QrvjE dRlyX6=rC||Ǡ` -+=in$ navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PR.svgz000066400000000000000000000010631221777731700221440ustar00rootroot00000000000000*(zHcountry_PR.svgTn0<7@a^BeXCC ОU%"2)P}.En,‰KM 0Qʊ:'}s7qO',}N ðµTPJ= wcrrϲ̳xnrQj9IUsBBCHQRYx¦+5L\QL`&Bg\nЊUϽVc=y޶9*qC50A)=ě@dИiF6\[?+{FB-[PӃ`0QP'@Z?Hu.4{ pMgΫG<{0P{LXb)Uq<"*4] Wx-ޘ%W57$A0DQI$M4qEC_-{WcR 6&c}t q5n!qLyHڣK6p+Q;E[VMoE贠7f~&P@navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PS.svgz000066400000000000000000000017641221777731700221550ustar00rootroot00000000000000'(zHcountry_PS.svgVn6Sp͆UvX܋ CvMiD "ey>^lԿd[1L~9g1ڙ7^V;h&!v@Z؈{x ֔mQˬ]@ l#nJ5 F,7Eʱ9M_ZȒ\ؒbxJGFg`n<=g+VWARhL1ڧeIYA L q˸*೔ oOswϖg(._iة0)ÙxU# c{Qמ+N/0:-K T;YId&rNJ4,~}۴NOY>u冐!GhMI2'zsHp2 ٴܠQ[f^zhs#}0>CZJ5u:/*= _FY3LKY<.n\ ڲ߶`qtK2v ҥ|bK=.7'7˰<;ƕ83#_@"7%ŗ Y:ǯqS8^y11 w' pCB}47s|}9[WP`"&H M;oz+Δ navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PT.svgz000066400000000000000000001305421221777731700221530ustar00rootroot00000000000000*(zHcountry_PT.svgݽͲ%m&HcoK)5j7fnNQ&i=8yYGMј<?_W~᷿~ۿ?O__?}I鏿ֿW?ӯ_Rk_O_IJ??W~ZU/>k2B_Z]?>OO9?ǟ?~O_}//yK.u}^kn\x `<V WJgt0H]@6rf@NO/EgrThTJ={OM=?&>\Ζig,}:+!Y eNS@2 g1P>+O:HJ)"2y^EwxϣdI*&zvj)';5hdH=KVbI*WN*PheT<Ci3X T럱({.KXg;`i5%HUKTEB 0 l#>WR//EqW>H-.=٠J:r=2{y$ݙR#rB,e]beEH](Jc* rN?B \10V ()nb@ r`tq9P53@!_Z.T bb@by&VĀʠ'r vw@^~敞$X" 3QD\>Ch(DAv7*. FFQ0| OD& EnP5! reS˂V\8J~HBxe=4TYSяâ|)I6 c4fvkKZyEgUݻɯֆ]3'`rЍB'"_Qhf _L*6/F}ZMdΥT ."R!?qERY׻Ad Ya(Osש+g7V5$KrHo(Sd0r, $7_Mq&jۻU =lsYQy᝜C5ԩM%u]2[ ~\}L-+OS޸xGoTXJ~Qt#y ЋTIVeMMe mQinAd wچ*9jFЛ4)ea}LZiC9dŌDAG/|iS3ӫL/hfqV ԏezU"BςroRv$'jC=Wonj:4xؕX*Sv5Nj] uӃ\KwdډA,7yhwѨ!Ul,sL٨ƕ3و\dcٿƺkzwR6v XoD4.$e0+E#<&UvXhbA4 NdWFU\6V^Lڜcwٸ:e#cFzMѨ!"{n78'^EcgQpTܔ'‘,tp4ˮQpTcŅJG=uI.Up; Q G݅#L& ǜ(lTec lTwثm[uϾ٨>&aj;.qrl,epoK+vHǞM:JW(eWJ@oJ/0_QUQ5C8vd$48@,GNs8fKǍ}3v@"2 TW/bhŢ{2OR*0(&.|~*O}j? q̬KF /0jPфs -AJK"l8yKxT #TSuUK9j6P^VWpZKy ׻ 2&ue0um,``#X.d(pP|wrU#z_S A+ zŘ(QjM8ʉ2gS/Z |abԚ0@ ְBҭ4YUǍ4ҎV;_]'pqr}*hVp)i*އptQ`˿t#*>la>a> oL Dg&+Ÿ̧l &wv47K /gKm1~~٥.pR9#PEGʕ#&98'W&P~i_Enm- SRe3Gӱ>*[L/>Y-(x_} !!"9^7(97 _\',4/7kTdTJd!0 0[I -`;YѣoUB*F\8HY*p0U T3SWXHu(uT0LԞ7X]/Bj5v8H/'dڒʅwjgLI>d;9IVh$Yű6IڥKAUsdE`wY pYIcgL`Q51@#R,1 U8 4gEePLEY_?J-oMd7N ZcZI4ib$yh}D0. &;wx_J|Et#PA"PP }[U \i)S G%!$S Vg)OLC<@Uk ̸]`+ =WuA]H*|9죥\Zb:_ K5G(Y9 Җ!ض ’ rqumC vTXb[+ᣑ`"qQE2Tc&b7x2!Z+ ȕ"M/ד9|9z sd!*Ԧܢr2! gAL\t*PeÁ [/F?D6nf A0bX,uv#&4tq\;0;q[%7*M\srAL!*k8p%EԉcĈV_c eߘ`xCòjq }"SA 7pg3zO]WqPLWcTA-&C;-E[=DBTO!VU,RJ9,cHΖ1JsB咆X.͎J.,8qa=ʘ6R+@+foHBG+*CMp_j13!fĆcӸCo^;!ixS#TyfwD`uWn<]z4[F=/?5{lɞF%X61dZKHm=Vr섉ޓ{p6*M*:BNH޷vL텡^{~t_f4-rf9B c59rx߷dּ'} v9G)re91%r#-ڬ vcUd[ױ_dX1-,֜N2 #)4#_CwQI|1ʀumV EPbMdeV=>]_׫2$, .s X₪=fnzЂ ic4553p"jjOj܈0| <tv&|󷾧ʪ}\){c @D#9qle"HDjPX T VYjܲK_< [^п'eM2O#w#{.\lbpʂDU>KpY x}e7E,#w- go(/yaY7 ɔe,˸9ȸ*#3;5_֥@JnrNaL!@l֟R)8,"w=٫dWlKAl~'qJ9s?+˓Ȁ3{e6{~nt´ÍfwB0- gvl~[4ᶃ.a87Z}tKo_y>rѰ~χ# jlD]&ҧ"N/X;`*IsBY+XWhPeAYйd}Dll] t*Zܐe0\BXK5`jӖZj.lK%Lv;%=:t5:ֆIBА AҡXW>d=LF0PUk<beC UuNe.tP waWpeʾـ r߸X JJn{-˹= IoXaq&1RoO#C@f=)R*bE Xgc1VسhSv))~V0:S\[L`FePXYbX*zIW붚QG<8ŁـM"5;1 VON8 ;be4ߊτ RK0JFsUJ4Ӯ VKKZSaʲW&0DL,eN:_RVZp.MDwE(eV6BpUm3VS wc\E؏ЙJ` N  [X7oJi ^*'進,պÔN4êpÕ{Xv5 f00o8;bIJ42SO' uvl9b0iنd3FZ-Txh_t:N*Hڊ՗ؖ PEP%Lڠ_ŸW\WѸ`:4)ӽȫʲj7 '2gY23c8#9s'+C'z?ZPb!ͯr66NT̀ect#Ώ%O\ZkӝLH7"`vٟ SZ.ETm40 jO)\qtaGƄh{x#&g`,M^ى58{ \i*7;ƍtҠs&mzr׫oPp ]Wr F|A:-X )k~J.˻\JJZI5.'tۂB[y^bofhe<:꼫ƙ&zZχuCEp~LsUЊM5?z77:40t]L*LK+U2gحmQ] QFbBT}pY%C2\B +H >iSLq-6Wq'M{zWl-i7W^v57vxra=lE"C ?3U):ݢDnCa\oh.C`MU\D.X/E5@h$T}B rn jx@[{=V6c v VZUbjѻ4#4멁uc*v6bS Q2Eo(S+?M35r\9*`"А @T%:(x3Vz@ 'Ћj] h2Me6>crD: Š)89O+R3P./Tv6G)hzTg~eyKz $HyL#.`~f_ƥUqfƿh|qᄆB0^ƁO*zYi/!~7LLtmx-?,]bwQ2[g7s7U .^"3l*<\pk<sf;f*!,ь8׵ѥ-n[5C-TG/*ݟV}3@i:lDQ. ?=,۶kvc/wkT誤åsP*.9ʚ4|1m!M zti#&9lԈ+#44*NQ1PE#U07h3 s)s~vsQ>a!TUYabWk99pO.%*KwyɧKe1?uvr3J5PdVד J5)%aO0z V ng <%|?3Ů[0.Mf)Kf>\[Lݏg'zN]SZᓶ+!mmY9A3(.zY'Pp^1KKͻ] 䵺ܐ#GKO6n^-=yU.-wbg#{ E-ƭӣy+ӡ$@-ʶb'(+.K G~;46gE-Fv ^4>"Ʉqp)ɿ𫋬hkJ)%t `.0D~.jxcH/qpҌhkO w~?BKCKeSl@ľ"”}Sޞ#;]>#UYv /_i)BQ4ZE]l4}K 'm;A/aoyHHݡ#r[m50-sys(o!^xs/5r~b:Ў{kzHjeWͪk]ܰ%~빐j`R'WT03mJ=ϺCX~/G iEr#gh_VZ0OC%zdyaZkOWqi%OH֎%jkc*Hbkէz㦶]peyre%J>]N fT~( {,LhGs _ΚQeS 7aݷ;JU GHaGMu-S=Xu)3lv7,5Ydl7|M"&0 dK|x%3nDcT8ԥ_qq8Wpl-`jΗ=WZUNpUr̒-Oh /J)Ty>C ZKq8:TλeQ_!e׊,{*OfĜ3I@pOC7W P.Vъu9WTiS"&$Urι׶9aaFs᝞($Z7pX( r8ҏx#GdjmrS1nO5\۰к}ai>{i9aB!!:&,[aq z$}MǷvZӇEqi t + w"qťҤv] 16pLqPRÜv<Ɓ2d̥[-dFqZ7ы 4Am)'oΗGzЁ^ ߛ깸b!&&gҋHjw3qT[ОVwneJoc{lAֲ?`U;YϽ%xGЮEHr#CwNSwr<= k7T_3w#l#EX$#l 5#F=Sp4ZN*+Ԁ KDH 0="Nl*U["яUR69j&&o$=9LO6OFԎ[a-P\-,DM,q<&3 Zğ=t9=8tXqb$fQu4J:U8Z l{NjW}PGgŅO2O{a6OR\qESU'M%fHc9E3y-qEzcK<{vq҈[qe" e%B\jlC_E,NfϡH s1PE>6GxSV~D?nd? #Y= %}+ѱa{,:@j~'"%'_8RLK.ih-O ]-H쮷L96Ja#s2lla̸=X؊|ΑY&{C fOVtgdy=$#G:@ޢҽ/Ҕ߀vJx{}Y,0-ܰl)05N0qDN)e'zr(c6efE3`4/F &X8k='X_wBp3 ?M3>\t3B{i`^y\cĵd3AVX+mr.UǩGcG)OqŲruBGl;d\9{5FEn-q,g8ύBn:g ySAN-lX8_QTYS7/4oT&m8am6Ai4FmmFs~<;vSިwq_i4ؽ=|zFVrG4W~\y;/ %[=\ξ c B!8 wKHiң5iIϏ[TS_.xBx'?%a=]u0T-|sv$j&y*{@#G:vK9@R4#%𭖠{PRn+f艃#谝Rأj +sM\8aV!a̘U}h19͡qPm mYrтp[O(q:& VBZsVu9ZAÐIZ4gT%2'w3tAT{^:xG0WL6ff۹,Z++*FpgO#z)GT:]lK]PfZΠ%\ NQ+9Qې+#~ [M?uFgB6^'(4S ༩[iWpD (8'76or$d4 m^:ǡoQ؂MѼz#(zĎ&uҘ~YЊؑYAGN+61)Ut3oVI3)6@H=r.uFPZja%^f gQ2&l>I*[[CDnymW4Vq $F裬M9Dv(*:1ڼѥL6ˊrQf=V$VdlWTޝVOX֙+4%ME^!GSq[Q9$qXFi^X$k/ͧW S?uhD"ɭ,t\܉!7hߌT8C]7RV%:#/V -}tpke\9*׷t=avj&Rįm G: #cT?;p`D"ŗA[8qXTH]VN钷,xV"1Y;~ oBt5wSgDNJ`5kM<,ѦC;qirM|i}C5TT|yc8ۛG8 0 C؇Ek 7{^rѢkuF@*}S[|#̻\ s튙 oM>jޜ_Z:}$ڜc@YNy *`J9Vhd5AgeϺ)@x$ȱf84hGu3wV1fgşhi |)+1-ZծW+Ͱ9{Qw{[9T}a6W9lqbOXvH5/Rɞ#Z$?Kf깖s`) MQ 38/ ay7Q59`gc~ﺋv~78o؊*tZ͙N +aƻx/HhO^4Ժu}Er{#iikfT#®ojcU]n/z cbӫiX׾ps|TuK@{$Be}٧GnG=guxAN{Gо;:p;i = uMJuXaMmOX7$,=)pe4 Oy(Y['lotwYƐmtrA9$" 05q=ÂB{bZQW3#JrR?\By{ JBُ{zI9QN܌{i؍G3&#x#̂?OY'XѿY%Gֆ #lŴ{z0m d5BHJ7bc\ӛ jndt*L5&KyQFe#1]  *3@:yc%&G'u{pqcK<8%cY[MuHe TG ZNnic Gw{4Œ)&1(#~floŬEW0P*Py/sh||TBOiR&/6͕"O^#7beIce0f ."P!";p%AEĆ֧ $ȖBX/5Y{0a{8\ZO_Vdj+s>'|Z>WamxWd2;ξ"SnL}8]Zz:nykU)pI>)=g8Fm"OW1qĸWfnەu"9 l!}(_aNlc ʩ瘺ϡ=-GM8vQ'eXO7  N"cHy+`WrWWTU_|aԛ1w A*Rr* #h ZDb$dO#PFϙa+YlPbZa>F c>wlFxGIJBn!a=i{Q`Fu,G~=L:# rl&G2Xj؉B]Cb\&B*[0K2d'U>m-+cr&5ΓJU0L'ld셉2V@j&DBylTG Kfr޵:}DS䪚~&Qczrbj!K\pAg5,2`rAv59l`iH9\<-FOUs^"sRog>7jz Xq' CFfk3ѵK#,.3%%~ֻO AEѮ.H҈)tTSgbT=]Uew$Zf2{FMP يLp轕9[*gb}K =0x:_8#nL+ZrQqGw &asn!ߟ21FQiz;ȉ[["ҢY)u̼a{ΐ:'%Q4wHa;1( _;$BNgDFp7r%_eoܲ#4B1:ƚ[Xq1u,;: 3wI>BgKُ/s"Z&+˖Ēl;A ƌ(Ӕ-Jom܆e 5bd@4;*=mK$lV +L:`CޅCI7>ְFGQŠhȇg(YöPۘQ C1хg0H\V8D+&"}DŧG X[bY= G=iVC{o9RAu!G@\Ǵ,K{Z0^~#H0`j8ɟN+ҵ!T?Q}Q͙㠡=\å2TX> V@-S0ؑƓTFaC՟5Jtf6eFc'6~JfO詝D--t=c!eM p ՊFcv ,GLKDŽ~"+[VX>f@ň)vRTO{BY?hA)15"1J),p$A\HfD?}_Oo_??>GOho+-+ :<>2MةZ59n`0;XUYA(H,<Fq53^݄qo-+h[\,]fO'U0:{{!a3鵟Ռ fAC]8t'T:N].Rц+,uaJ6깡>S= 'Gւ@lDN ֌iHX7R?(~hUF1黳:W8iILIѶ'jI.0[ b#EۋZjXR. $ m' Ŵԡ.Qc}:gt߸vgp`rpH+6ˑC0rݴurH7V]GM_IuNG=nmg9qCDDIk+|kdiRNp'"]!&&;eO1$D+7%E8t|tI!ZgL@'.ql`PKۮ."8m<) '/sEki[J5 oH('Jj AXom'&;w*t1fsuj,bPjgb +\lRx &G 3й\ aP,:\ VjQ!$^ӽD߫^ #5B]twP\G-k%$G :]&5KhԀ KQD9SMj\ 1f=zo&nf)ڶ?]/n1l[,+ϭyuY$lsS ö)git뻻+C+:Zw" 4r9n_0XulL'o20%vacN?j?{G%GrJ;g1QDM@Ⱦ{h_3Fνܼ6F3ֵ-o,k@g [Nm=,bQɍV@ń2DΖX`+\2 = fJ $: ؑx;T-W#hn䠷On| 3WV>$zeyw,@Wzb%gu9zTkv0){.I_]귥Omy#oܣ}嘂2)}/acӵGLD2f$`9ii?vx|C˾ZtBï|ZzFzM.(2:.ׂO]},{ =j|0lљ>8g:lzuONlQD&7:epfg~;Jfz:G#~<o4/pJxF ux|sY}MKMqjv;ֻJ6:9X+a¶[2"\TdCDְ*0=Wo=/G>sL1;d$026śmpr3f'ӟ!n0?˫@eO),)5KҞ4h,ptTA7iaFu5,1Ȭyl%O,\u\c3E#(h&`I `$D܇ZCZe8F3uD,qTMs;1@z.e+%a2;cL5֔Ͻ*K1{UEg<{moF܆ϲ3K p^ vu{rtf̣^zA XOG 6wT|ĵ/mp]JQo`8G{?g58w"qXVhzq5谟oKs#o8 :] Oy k>b)A0aPHlާ040(P q3Yuk 3P{9![sƌvkRX62;g*ѹ>5ZL,BmlPDꖽf3'@qdrbel&e{151@o"ly ( q۲eӈ;tQ!<( xezq cajݣW f~:0%0}ɦPupߢn*Z<+6 u.'{j9K T8LV_k((3 Z((xxFkN+ {"KFwQPrc(rsNCwAzR&qռC< /Rr 3crãRv6v J0JrhE=* ~$e8u6yt HG . {x B=tq&o6U, J~EQj/hs%楅8s:.LFtyɉ׻¶U[x؊P clD!u^h H~u b ˹WcGԏ:LO! RC! b@"ƎR/_\Qr }2ExyHОV Vܧs J~hdԨ0FK ;!em@?ya&(A'}hjVW(,]qmܟwC$ eplIMXq&Bii@&2^YժCLXB3O}yf#N|? 4z3^3/WkN֟Y|5Vo4|LΓw)?PPe ;5<&Ɩ0}ݜ0U`X;7`+lAg8q/O#&lO–Ib͠/7P.~܄>8ja kv/18e|쩍Lgٗ~ş~& }=5 P#3:A*,f 鿄;ǯ!!1 <1_rϻq*(`r_Q #Eپ.Td$cw<M=oBG W@2V($ 73)ly>]e-A0\f+iC:&C¡rz-yX7V+^G EudhK)~z= TmhNȔD|jMbRRLepAxHCwՕowvgQN:#ZR}D&:U4شE۪7 @N`y mJo2 %3 *Af#Ia5EQ\Eg8/W1~Rje{%KO9;P5!߉#f?`*LϔU]͎g؈EX@0(dlq$QlxV4^rKJ_'u2WNZ'UB qBx+*U BLKHknbL6ȗu։⺷_4-HT[#丰`= n 01=vGfd :l{kOn>GYܫo[Q:L`DquO~&Z*O8)&1W&*Ƨfa<6^3So4 ;"ٌT5 3+grOo"35= j&Ld4!> pa\?Zfl|v`?ȳϳvl> {Mdձf.ˤ7al5ԆozN?yFL/8h\흫Ah4Ƃv!55L(fߍ+O9(8=3д܈CtXaap Wsg - zn醤jo13B2 Q$M0'I~(XmY&Yߑ#N v3妦1[8 NIZ#&M*b(َֈP'Q16[UtYN[lG'sv$IT7Sub7E sjO/W-eo􏿆5+m;w?õ}z.Dw1' ΟbЌMji#c@ cHט1,UpULFo&9>}|m9OVY-4a/'|Fؿ[ [lٚY͸jKN>:stuv"kWD[|CMl_ĺO247Wyf!6An. -"Sr*-?(yPlQB+C( Vz/q1w V/N8З *xyˆÝ0hPHE(r9|¹ D8X ҳ ta=z"xRG4Lζ% v‚3NzQu)#S0OqKx4Dl1?$*Kgm ߟ^L7@Q{(-l%O 8Xp0LE(dzY*+E>:A\\ҟAɀd(̮|9I9mj?,3 ƄzO#eB 4~@ `5ܰ2.@6;| CӁa+޹r㫨Q;Ve 3ŬjLl _O tƱͺ ܪ([b sh(qyah K7ؑp;hKyϦA<񹷯=Hc#6#:L'ȳ ;|O=<<_wm3Z|푗)?#bg?cN_>UmWZt e1uv=v롇]{=V5}w}[8ڙWQG> >y:x#yö#? ]ўӷ sΪ+W cHT7NuV/e"<_IarIWVh=V8ncv.zuY(J'Zvqbp-`j[5bPt 4Zvpgq'>t<5] $Jv}go5'ٺяP# O& Xx! 335W1B?AejIeLf:FjOF>X^|m?OXQ5>"'ʕk:Am1 !I%/}T6{{2MD,K1q FHPMbǚQ#]8eKРi!`ȃ+qn}{i[~U"Տ_>f<.Snmmc ҆Gx3kT]j l>o' ל=B_lnZm%lԎʄn,NʼRu=uD3!نf4笋QL<~Y޹!B<`ne6xQitt#=1-˄@qAp=`&YӜvnF U,繪~JY~x;tJзz9L8RN@]N)Vx㱙_a|F4d|#(>80 ?e+>z˜׶7)Pda_f@B$v=Vyq}/Avq`$& %=VLv[p8_=73TF}%R78 {{{*o| rLG6D"Rc=^,6T" l ~@QϚU̧FmHp  K|ۦ_qt[rkbuԛMސc 1fv(?r0/'lX㍏dӭLKz3&WBգe~35<)nUbe԰Z`]Kz# e۵9׽i 96D9٠I,JkH`9i`u!}?>xc+MzvРn $eKˇ0 FG &wG['n>7B0oe昊qmޠ7[o%7N9epd/j5T6찅]^OZ9tkؗ9WcH?-L{񀝾>Vyqm/A+!֓~<֮9ilymVv+S/p1:_0s7ӷ*7n%^7d .2Z:,(2ir6(+ [޻vxնڿ>x᱕_f9_9p&G7hc>1 L&6K֭ޕɬM #V˧ 56!0HU\̙ 3@v\.lCd)o"h[!g$v20NiV[gte?N#c\~#H&BgjJʦT JG'L 5 0oP%5wOoDǷFŋ~Blo|o?U>m/9CKXy:/={}VC O0&lMp@ሑ^} 4Q$eAyB} U?mo6sK=n\=qY5 xPX~@KVp^s^`h"t@a%:[3kQ<~nl7>`whnn~ 0L_ǘʍ\k,|bS0 Z=AóNoOn~F^ޡxc##߰Z{:7ִv}d[ݠDtw0,P֬"౽qws<_DY Ho|o?U>m/AV nf]t VAhCA,!c40n`0B*7sQ1LXN/ iz}>Z:ٝ>(3ވ3Q? 4Suә7ۿby{+wPEaDaE%Ne1jf1G`whnn~,mO"A{q.Ctv:=퍇}{':_%{mo|oX㍏d_._:%>^m/t`6afnP瑫cPؗaR҂f&sAd$k鑫5i[EfsD/Ǝ Q}"Wy\ނTwUd|lmၟΒ  '~3=Y}؈'&!j (Fs!8#~eP x#`:d4xN~@O3n ;=2~$kb6eNYMfa訋 SNyjOu8y%p27_۾Ac w T{\0ٺct$NT lv8pǐ޷Þ\_}b;V[~ =Q]mVS`PlQCjNq/3 v>0[KH>x}w{lݗ řUe# M^7 E(7 =_c:P ԜF ),Rt0ei%f7N~@<^m\ϻM7eUV5xPD2k]Q*zK"ܯ @1,_ja/\e XcB~zvi{WT5Kq" i ,T-+hPc", Ntۭ1FPân)ۗV 66 j7JUwJ|ce֘ 2#}GQ}=p+^ف|,^QZjVubGm jOo4P~̭!/%}CswnaEے%ulPT_`@W٠Gwv;tAH7`Ni}#Z 6jD;>+:CmcOpI'da;grيJ_F#~&Wc|}@w";:|.'jUB8yrvYb 4L.&Cٜ -4nbat5x|ي^? 5ݱ0q{l,|K -4po^I$ ZNtq:dq@5^e@4` l\r@V7kG퀽P;vA7(`};5+:CmcOp J+a%`^y0ݸUG ; h_C._3QSLJWj։dO[!5>Z/) 6^`xj!l}:`*f+։*@hفC{KN:UĮ3IѺ`g p}D'[Kr|izZl`C u,j|u;s@^cYC QҺq^m|'/@*1ϡSAHe9ҚT*TN`OV8;6! yat(b_ I{niu#Ϩn+k_~_^ɎiwhEhDTGft=ѽ!E0 ]=v 0h2-i)\kAEBZ8>7({ҭ-Np~46#0sߌxfe99[EC(/pj+ CmCI ]{ u] M޹T*KGzhʳ]TI+2Zz@kCSc^瘨BXoI4 yH{L VTjhePAbKNV^Aһ /]D/e_'*]I̶p Jwcܗw-sߺ^\2&װ'ǝ佯s9 훙i28U6ZmQ0vfNV2c{`њr j~'bCPI6)gz =ް0ynx1:bB%~vhE8W1'Ozl|ߌZ@fZ뾙n{_ݻtiZ#[psЅ1/NrM7`[70mNX lkzὛ̓%R@ϊF90CA3FmF[aܨ(IdJ>!Kyݩ^34z/+ſ=Q,w@9ի +)TN)F⅍NjFJK`]$|j⊑"R%ğ7\ GK^'6SC(63S{f!~핦ܪ-\Ӌ-Vϓ J T/&]d}5g?pNL#l/w>-8Βx+P;pj ShV=ZVUgRRZԹ0og9$_YqYjhXAGXJ 肟?QNx#BBtO a\W`X=C8d0_&K^NּŋwdHx|;7Jo'+(rG,/voB߽u}SgQ=bAT< 䒱P+RC֭1`"%x#@THn}T5c\SU'E}x *>oxɞ/"ѧoeSޛC%pTs=ךlWN=. >ox܏̂;W|Nڠ8q/BRڭ3߀)U%NhEcnT́Xa^a(06 F>oD␾"veY{H#'ސ/G sǍR]F{Bw^)ܿQ ?4oy47ɱӼzBs_9$G!/#3c\l7B^Ux/qLrfFO6ÎfN}Y{ӳHVd܍ ]7jV9>n5 G|o&*xoTHfm:baTq}(1N@xOq2RBf"bj_ & eSX6n$oYМ}o4i^in<Ӽx|Y%M'~A&/ ˹3 DR;}ah!d4H9HpyK?̪O6f9md3+RvΛUHQ;_XguH;CWpX*e`B97l)+L%̟>>^V=26ϪH3ڡU%):u4;֬;읨37?OV'7 -zxfpJzegHOى3}{@T'%oPFiQtz2םcܩ>s# 7+';G$$敂\nҀ +p; 1Z-+Kc~ƌfkXWw6$jO{^ouB %OΪ~% yphfŢJVFRHĞpؠe= 4Z⨸%tTQZ 1 ZWbDv@֪b+WeiOk$܉!0^0 1(.5z֒vV7G;~˗vlF.m5]@2:rin1Z҇blP]0 7 O1:֌|a 阶}8`Frr~i3Qnh#`h'зkW/ ;h]hsNg$42ހyfK$ds jw@a=6x^x X`(6ܫu%3r 4wmE/Kёzr(\̂7G6B|q> |h oH?ƚ6m C #!Z=}:`eܘu?yrgm+:Am 1 mN^< '>\hR\i S z}L'deȔL[d*VX/_m;ꕊMf/@԰^k~6(`' 3.P%!k7"V!o΀wm9j;'ر zo}񎣗aF:7gFF.brD|1\誆˅eȠ1Cl,,ˑX 691"~?3@mnwCH۸tn\ҺwaO7W!_#$u)juES56(FgL h|9M_ L76 =yL QW1Uݞ~?AiEƗC /tb^lJb^u=GPA %Hb/@ F_5|"iyt} z xʰYE u:*ֈytSꍘ jl#W3p Jy47\ݠWr;%H\οRxg!OoT|վqnTKNW^Kܺ;c90/71'jȌ6Nf T[} {_f/j('{p{j }f?ڐ[Zq7f}@1!y{t>N(G?.lK.639o=hfbXDi'z!oBr@˫q?_Z $/-('_ nXjJWt#џJbO7荮ϡgvv}zWzApWN@5w`Л49nk=!x<7Xv!?[y*QCG:;WP]R>~K{7OG*Ov‰NNoKSE 7tZig ΜrI8>F܇T^sj=L ι9.zZC-eNPdɛӠGb#{T 6S 6K\`xk2M+˜gDgI=,j=gtzFuoTc=Q3ՃTgodyְGj^ma:V_$ t~Փ!^m/|̌k贙ɫ׾|F:grLV[Aפb ;!v0k=j́R]qq&yL_XS'4|:*mA/}$ye*$3>slRTcHP^) ;[qnO4ڐ>8[ :L}{Khe"17(,._yH^5v;jΎZEvR%j᝽ gvϘmSڟ.{ݗ|\4;r#T< sQlA9#xKseO1k>m>"Q~ԥ$wΰX8zcl ^rWRE(CM+QԎÀRb$vԲe %ȍXg; |_I9ahpgqݘ;/7$G $UN [+ǭ3Jz(m+bc=u-ud03 VqG_;V>HCcwfqCņO}s1Ȍ9ՋJFq镴0y-YP]ȼ{?0>˚ gΰcbubbcO \kzB 9-=J`Dv4F_C:W;jKڇz˺idܲiXtfO&Y igL%haŅ@5ƀ’ c|!Rb=g-|c ~^rQf7HS%`з tL.[/@.~y"뼭.p][R#&iSDDwl;\ȣ@9#۴&s}έ_Pr*`D6fhd[sG0z{}}zղ/=^zxfyİjlͺlViaFQX6U>Ͽd4K]j#Tɯ3TsWyyIIm4VP TãVų̽ɠL<0]S/~ sqǬd.k`*݋aO,3(^0rZwp.DFr4;psFOb_1NP\yx;;!5$OJrL_rOko$OI ys"9%m'jgNArɟ0hW]ڇq+T4fC2~빧:({^x2{ǥJ:˘[צҷ䃭\ȿVon렜'ǥƀዌHX~0Ǫ&д2%w ᷺Lnv {$rF&c1fڗUԘVee5&OѴaTR)e>: )*Vz7֜kؚ`* /ƿ)?a ba. iN=ů ^ȗ%_EA$ Qs'{.RΜ޽(ֻ;?!{N ٳ;ݍWNdod3٫;ɵ_S=F!=SiB7svәwRP_Zx Ä޺qw 0 ҳJq v<)E b_:MJP0(tIE@"hU8&Z=V)5B4DWр0`*F2*$tvjgl3Єf!ꢁ0U(C*/Q]36Tk}N} M0 :_pP;F~FQ =*`6fMٽo>DY"JcؙƅFұithHn0!7jξ6`}LpҮ Qh tڍ jbA`) !x [u<2: xA aȟ3+VMa|a200_ C%kQFzBjIyB+~t|<ESP4$8)d~ kAoHy!h{76_7Sgn`=f@z Rr[f0*}œ̋Pg*ޔWp IWW`]qP)|zۂޟ.;~JKoEGoNdr8O%vt=n Xb'Dcok%6 \_A4T5h6YQ+n*5&D7Bkx1Ô _zʹn(!Bѩ ^::).NƮ8zZz^·N"I0sNa~_Ahz Ek[ 5: /Щc*sw:§KK4]=FƥLjpT}R#pHZ pnz]>$~ B&\8}Pt=cԒu663dڎԂiDy%4jR8/ɦ/<vxQݚv`11aT6U<ƤjV{p8iײ]6B V٤lgjŪNd٧<20XqzH-=x@9cd :ߊ>=:|@[>˔3oibZj?M\<AZz; %q4G c; x`gzGzG`SҗɩyޠPUG"t/:0 G3p4SG ]ka6L;G3L}l[g4x +f)yIiWJ^;!@~;J6WXk}BٖS?GFK#zZIʼeH%`2‰Ty᠗!: Ôy [ÅbmBJ95\77\ ?GܞlfT>m^趕[ls3`Ƹ_=o%U"{X[*m<ÓGMTZM. G{2–͏bLV>%z?+xt'M|@<7%ȯؤ$i0x+qr%F _N4 s4f:;gEo|һyF>Pı[&.?ޥ ;kwOl;`,}Bj.PĔjԓiVfWa[_¿8`[fuJG1hv魯V 6*8>T2LoRjiHPd7Jʕd-SNmQ/ދVAA|{BGn_Qz1o 9 Sx=O|nܨ-tXuc&&[̠cxe̕Pܰގ-CFwhd&(ִFOI e 5yTYy V·*Ic/An#[ WJ#)nM-[Vz[¼ÏMmN04]q;AK7"H>};`u'>q³Ϝ`ǂ6 1S/d>! W^od1λTZOH꼓V||L2`5!8>zƐbSmnpX}.C9퀽PԓѲ?#dkjz+:A}lp Lwu  9c LO}k7 .B.Н\uZQOhyaZׅ\;vDxu2hѢg]b4ކRA Vǭl8{hǗC /H옗>/w쳹054:/d_sg@jX6ԾϿd÷.'z}SК3[x6j/ҨUz0"=CJ4=/mM3[㜩Bֳlx8(Aj; J Y⩰kM>z*;N[{*ol/1-dvOpF5Pw(ɺa5sߡ V[V\)PJn{ZcbZch@=zO!lRuš\z MĀ&__q5k~Bl? ^>ٞP[W}:2k TL:${.O޺|{O^dzRk )e nNjSUYkMǧSޗpxotX;7#Rl):|e4?6szw(>eMOuX!,ޫp5MKp RCE,)ߊzYm˩隨N@@c8Tߪ2)b% S@BA[V抉vceyQK,/o1O'F'@bᘛW{=[Jt2d+"yw ܜ;/O.d>,Bf5_}'dE}d>d_Nv]ȾdFBY}zF:D> DRS=-*N/z={Du㣆<&qB79QU*\] :W 嵯`KGGi{fV?ً\4h*UI1YUkW}+,EUJcFoWݨ~۷j(mңW{nf29Je⩴dZw ZU'$\O-Չ=A~ŮxSfQaFj F3QwjV/<&/y_MrnF6VNsobxTyBArJsfu7Nt3[qoDϝzrL Kd?Qx]KcjBQڽ Ybv(%y2bISmY⷗kٛlȗN*I 8K^R20pP udmT@S GP"7DZ 7Uf4lFr٩\HI PmjYauDægd\GҜ%!cR  ڡr&"3}i؀0U djPTln Ptftdo[Mۊ^Aķܚ\рoOv45 _U.F#b+j?+[<,NJ| Psޜģd2;wh_-^8hR8IaE/FsJk# Kg:E;.",'#.gKP [[kz/a|S%MTުL-~ww&CJpݩ%m9PlԲ7jQ˾;ҸR[{P)4hؽ5Q4RQf3 |e_'S}+5 Kǻ, r2ir2"oM"IqtYul&+oձrnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_PY.svgz000066400000000000000000000554511221777731700221650ustar00rootroot00000000000000((zHcountry_PY.svg][o[G~ϯ*/tW k#v,%@@G'2)o~CQ؛ a!t^]]]_uuٟ߽闫b~~D;b:_??)Gz<h8Ųl}5EnOGW۷oUvӣoF''(zsh4Btr>]^wtr_zuJeeۿjqZl2ι^ow-k&: rw'[E]Esiw9?-ٻvFS[o<@j2;Jݼ_!V5C{nf;m;\#'Lr6rO]_}Z}_lv9ߕh\Ga_ޫ%^s7P׳r-Ag7b|ݿuX@:94;(ND.vwģ֤ҥ՞z1]6e/zߡpuz0Þs_N^ϤJ#Gz_&|&=yx=͏z<s-މbVT7;:r|7LXfND =bol^^C["| gW[u+{FqS<;]Fbt/Og[zG2O!a3Vݘtyyqq1nZ-dqX}[^"ѷChSiGSM]\\|gɛհ:Z0Gk+ s6F#7݄j^]-^.^nz1F>,IRJOޝE:̃{]8&ͧ' ʛya0bpNZHz5=].͓~1_/wK*^/bZc,w_ϱ?rǾ8SavvhwiQrzbf37ᄑW-uֿB\f0wkݚ|t';>ilqklظ@F4IO>턻9.sQ?|,)ϐZ;|cjhuwq}7ҟ7"3 xĻ:%%;R},EnGi{S*~k۔ޟ]c٦5A>L6ퟋ @q=@WWrlT6 ob(xVcf*;RcϮ+/]. 3ﱚb>tB->.QPdb1Hb`)SYv"t(THCX*hۅ*FP}kD(a@%iw^|4/HGA P6; 9JFhJ R꼧"@g`8R)ŀI5 cDZ ZŨr8wT0)Ru"=R,AkHSםaxX h2 +m]A$B{)-k1x.8sbL!oǜX2E;'VfoZ%S=*K|(X 5ݚC`׌Xj!0 oզѦÖSb ǟG>U|WbRɒZ䃺72%FIVDдA(Z<%Ѫأ}K0iTЛ*Jd{ خY(dSӑ, JumD+XX&Zl"zDDkr1nC&Z>0fadtE`jKz}VRE_J?[߅a;ۗOH2NАHQ:%2* %)Uآ+t5+!„ `MzAB\o* % j^/abqQv$@^AT},J Ss4Sf GRbV8Ȏ*W.ڬwH1C/hYkTa3EW;|tUڀKAG^ъ H>H(5>t<>暃2_mŋ/ŧdIмx)* Wwa5x7| UVҠk;9RS-(sf8&F8~'N*"#u`4̑6. ?.j̥A!~;Sw3ifZ%\ybȏq\->!4/)bUY,BFX*pA\s54Ūhhr@{-zJ+``UH'!cCq%a)DQ]K^E?%̕3".`2Ci Zւ0ڧh-؛rۆ` s %>%37^Ȕa'ݹil^Hs]sal/A(ZŹ$Z0s-\+@hj;:jլDHڧhs `+p5N$aB)g2jIJO/o0A*Zσbs+q:(ɋ@0B-L3RHx~1T- z, qHf fׄ\;!@~*䕦dg5,0{)Ԑ3'n$XZǥnSC@LtmpZo[ˀF*m/(]#hą=c ܱu"빷9>ѻ`Xb<):R R=;pHiըs`7z,%Jh<^b(x{@mV8n@xu̎BҌH@hayŚ8oNnDl꒹E ~bsgxԸjY6>Ne@Ƿ17S\#,!ៃ jQr~bvb9 1pŏ4Mf SB_X6P!n6gahګhd%WT#&p0+9; DUb^Eha%z7䋡cg@o^_E !`}:z28&1Ĕ`nLA)X鋺O_(=+O v j*ZkШ&s O]CPJEV8E=M5@SR ޵$]Xv_=9-F,9rýx p\V3\OWZr,2f:eoԵ$o6z:.cw̋ܩNrQA"vzhp8z ;]M<1蜷_TCa6C@ēZ?% e1uZՂ*|TޞCߐ5 FEl1Ň"O(cȋ~9 APZooAEB :IB0y{c oUX.2$WlаBm.oM{sP`b;AITjfp)z&B48?1{kP^A;e¢]r3ycOAQ֐,ګh=h(/lS]\frJ~;Jڣ\'H$C{|ᲇDs{s$6 cpy<Uq8vC'OδCSፇzT3ܫh?0/\Ez/Iyfg!2,qyYϔ$*B8Lڃ[4;kƩMkpII w ꋼy( 5*7F+P<M#<Ԭ J˖lEyN[,w*F7Xݾ bp)g+UprG0R/೸F7 ӥy{[)+vG>塽W$@j>Ena$o\5 AuXv#}`p@s%'y,W&| ۨd^5I^mf+_lBѤX" ;%3_{߶+Kr\ %3##/ D a}cL<#9*3bz7 !2b}l/:vayzcW8XM+)cpJ~J4֯ς͞5 /mP?{UgB1bT>V ~vhILe)gOi`(zz/pާgpHӚ,wg(vV7 eUtտ=cE@D&8\hJ4s!T"1n]õ59cl X֜m iq{9HaZx9W/INjE aVecG7}"x8l*\˂*﯇zX1x>F~جpBLik S>yzݓk]8I/~ˀ%H`|\E^cDb^9 ^ѝhwa'/\`N^EiBL"u4O/_?0U R|~P1 1>&\#dd91"D5 `}~bVxoXFԉtk~[r߿?ct; {CM8gd|7&UúZ=VPϢXkWYsk0`Uuڽ;zk`PDπ ^!627U}TPQT*+pk։x9{Ө`ӽ|\5~Tkl}K"!Q+{?i$VӽwkO|\QSSl-X/Rx!b`7_7y}MB$+ !v֠Yog§.H`2ОLyL7!=IYdlZ]+a#LoƼ;;p0 4"/ 휶$Ƽ6L72[ζΓ㍸/Ն0s# cZ׀k&iS25K9ԑ|mGּ8<^¨(I;S BC,qUG d? jD]85 aYe^?f4̦xNfpW`B٘:8dds[O#6*͏]P :D[M*LQ.b~lϰJ& {<6ܾ>6T+x ib/v_ #S[ֶXh,~#܁ƉX@c?<볯mZm+ /u?~@>18$-*Z-d 80ԋcq6όY_疦2k+Q?aKF& `}5Ojis8C]>@+xW5DC5ImLT3+ 18bkbmZ wJ/1 's`e}Bqna'T T z!,xi@4lbUm}1Ce` ;qpaNɁŲA`eypBt]R 4 j+;ghq{\_U FWf yM=V}"){XZ=rjW"TN2X$&Jۇ] n/Ypm& tFL2U\a4kpXqQdS`rJP_\TCcmTH$::+,kM#0!AHLrIݤvlΛcD5ٮa2郯;a[ҝOs(Nu)8 *J!aRIRP<&ѹk_WBפ2bͦʑ"ߎť aVVΩ0f` v pˮM Y*Piv<>S=$`e8VvBk,GRG6g'C7wnY4Ql_}y^%d@"WS&j8SN0Zw?v᱒oL=c~]o^E|Ka=xu)ԧPZ$&4Av|8U+>4ؽZ#cZHc"/Z_ov@i7[r3AE%G֮}uV /r/9/ˑB0Էkkiiש$}dDSnko+k&{~uſΊ1u^7;)xpv![X&`HaarDnY-%5 Љw_lۂx;T2VmGaLTے2|}}omGLBN!):b Du"Jc4D '~?O7<<&s.Ae&Vy8~ȏw&e{8k#hZ0Ȗ kx% EC?S +}bTGݍUFO4PKA,߱T])MBŊ k>u[HЗ0*6e%ש in:|"Ϻ>$/P? ,DB_|Âװڂ(,8VVKTY5P8 V ތݍ+ ^ VPYP;楞.K*Lˆ [/Tn3;ߧ^/C! BQ8qJ ضjC:+?>(w<a&Utyu^kR¥YiQIn޷Mب2b>nCfq.V@m2^`~J-U{Zokg"j]i!q0:@7hH3(spN^vW0a~cuTѺrm`tr"ػɶ!Kו79-`b.3,tB <\-sP76 $iq,&ˆn ]xm%2 m`T-ĀxO YEzX'd1o4qBTH=Lp]]|^_ݘ5 K* oim8Jufy^AI_GRM'\-Opfظ,Snc"i/cXG`eёϧ 7o!sWm!! Y һD~6@~/bV9ܾڇd54|eJhoXc5lVGiÏ+`K/&RM13reЀ=(l6̱q~ LA,u*d:IPR1lLx8 Iأ3ݻد%#LAunuȺoE_o;=;؃z8a}"ğ]~?q `9^lQ'v&?UqO^vo~{#__1yC02=8ȏ!0Q֕&0 `̮ R2*gu\ijuybuKUQ!,{nRVb]>w_+J7n-*̜$BGw`,߯)t֑uRhlT!i$JC^'uҼ !3AcN;T"fqaCt#"!Y{hF2H:v± vu*O|L̠Xؤ0#ʞek.xJrT=]iܓQؙV(1a@,8ϿÊ{{ W^X͖n*PM0JڄiNccoYQ{6a,-])J[gJ`ȵ &v 8O]>a QZUԅ4_Ͼnx~MhHquf'%|&U@(]4?>r٪Qam$gHON߇~zϷ^S=?撇 6h_ud%M> }nNt`'HTM^2N;ΦS):T1o4'*c;M@ X<%T<%~{AC1\0U~ߥ^6oh'[PMu VbahVqҚpi1-A[` tbDMmHYMJ;vcsXՎ5wF]hbYR?*X9 `e;,x"LD7C5!7e4h௱pj -"΅UX!^)9%KIdqb /*4?> šEJy֫dD"f/?u#>FX^r@n-p(WDQO 2ÎZ9C~xQV*ۉ\yE(&\E &`jD[QO@CMC3}":^",oQ9VܿYb<3娧~9烢;SBɊ!/~{KTGtB<=.FV(wW] xBb1Yjޛ<}Q/.~Z5,eHBࠞj0# }2$I#LܮL&qb1؈4+k4%n &E/.v }=ez ?FGJ5,GcBv>Vɋ6JnaV'{qS=5ia*xB:j LSR@w˞Iѓ ]E^mQ\x" 0‚GgC; 5% ^S :cdZkF:tjy\4 kӯb^6m>&lRY}6EJӞdĚ1& Lm3# i4͍V{~u"Xa5={kqM U;7KB FŲshV,cAM.rGN&Cˍ}ZIV+cq 5G:PENԡbGl<'Ryi*ABA ?u0 X& nUDCkfjwZv-M:kQKsy"#Z6ڞ^?W%B H#峆e${+ާD ]:%~ M'V_މޯhtvYUv;M%v1s( >u"V^VptHh'&e!maٝP2TFcT|\] >^%C9%,4Wa>W2˚*"̤nbM^*yf Z "V>Vs¢/1ՆHMI GQl끫R6\oGW_-EfI+190t~'(͒=XZCX?p R#9h#4ӯ˽߂^].3ض6pgɜ Y`ωE[be ,-hs@t_-Rbƙ]wFtfA%!jv6\bGc XPDr{W+Bp}O}[]6NP+pga#rcW«K5ii-j Bc\h+nߍ卐s2@D;FZg 7#JоՄlw7*clF+NzC:h.,c a QQ7')&@ve-?OyT kG_w-f JQcBN:?/La%ƵtUܨ: o ~QmfJi<&1*'1FOK3c*C S ,#w %T ? ׆uQbI,N!m [@r޳Q4u 5{RU’ #֕'ʭ- &!_-+ƋlG&a!͓QY$c8 37a4Nvc|,h]CxmڈD`aI彊YʪvڋnL^ [RqI(DIaKaekP>: KIg_7z}?9 'xkguI齳Ĩ+0ƣǤDۯ34$`M}9~ŋl]UY~R $”Z PNaoKEa@僚'@W{*dNe|>TJW?uK+`MMqdu b24iq~m[D-^%XE&#̩1Hh2#I(Tc]GZ;qszrX03hb"HurȀ.̊G0UQB1X'8dDۮ//<$r&|A t6uB)>l{43h FJLts}uwM=ou` ?+fms*lc:C6ql)꒝ ́ 8'kj :GXF@`d"jC~w1OLb6`9T6ՃV@eg"`٧FvgC#b篾sn)q4^(afQyb3x(\}[Bxhha!TRd_ܿ+l'C|`I@GDEC7Xi=W$тmtEc攴p9J\RD1U_LWUL mu??]Q&*GE}c[6&?#2#24P#zz9h.<CHzGū8nzI8,T5 1u)Mt5™ )8{N,`H9J㘟)k0r,\ɀv杨,L'6YaטKm@ g_7idFLfu+5`im09$&n1 f,FM[6l2(3yJlrUQ`! g,tf \Hc?k6$!rk[rXo9?2tgЀډ[='b| 9Z-l"+lD/*Kr!-1X!4-TB=s>9\9}}6c"$DAy q ̫v3M7-g5o/m  aJݵcQ`+k;x-}~mſ 4vdNFp VaT@\JC \`&Y$aLjmrp%"uN0h2t?u[o1w_Ғ5Ԁ h!1s՚F9zcG<'w>?8T/fe*|٭Ѥ@M6Xs7pv\#Δ\ln,qqF /t 0196j TawOV]>ڷ*}_a&%{ aUNU!ԂBťA{9 wӈkWqBi: ~_|g—ũX8ςވs`faL9q*ps;2&Ć $"*XS|RtVʊ8&*s*.n 7Hf `b`1!6׾~u쳯WDcSF)*SS$|!dwiia7UW3l]@~{~mſ na-|/pytmA{Г*87 uշ`! h6P;;%BE_]Sa1c\9;a8>LP .VrVn=ƾU IU WSRL5/YL޷1kzAuÅ$>ň HL襺_׻}.l&=ދ՗4u9͝i1VD, Oѹ{/k]ߢEHXծ AN]%0Hez;٣]o cj̞К'$zCE:_#LQȣ.(ka4A_RQgG=3ҹK dkr?) 92NKq SLJ>dg{JS&A16 \'_1:{PJQHrгH0ـ|>dh6'Yf9ؙ^;=*cR/FNG13kOJKGvփ`h~eD^QL|)kF,#( 1V%@ –CUnL u5՟ !`)0 /㨿^P3Yδ{ZZ9L=/% cqܿZ9l$>$\8C~%?V AL" rgBi&C? 6ǏW;̝}fTi*+M)T qp׻~=4\\1 w1=+Vˮ4-n+(ClbF5S}KA5V9 H(r!OM~%UQLѺ0dUC0RQck}_t,T+ujaRYԨ[Q,ղJ">߆`3"{bMlb2 []a;4,0mWd% q8ެ|FUKKE&Fr&b[R>#2y7bMfuͮP9;q+% XmLͭs.1JiBAͰo{ 7VY}j4'*3ܒFul IΊ[#YGas |gY?ؤU}Dȳ̿ Z dbYzWaˆʙ^ B)vmrn+k? A.}"e O31fZbAqXs_h!Lvoc?ks}:5 [^Zqp1h#[{$z߳kqr&)T5rj؋Di-~MƓCӯa__m W׿l0'8V?z_PkxkV?y{ 4u&6 :':mXM*lCȑ_գ6:~A1|,a40/b|YI37ZW/&x\; W?B_WBŗB[?x`?,_]0_?\[__~~_z> 5Cvѻ}iHb [⩥mU?VzQ;f݆nƉ =\Wmah44pdg̺zc^%Y{ސ3B>Еr-"NJb4^u-POOV=  0E`p|sCsԷԄ4S(igSrZTuKG0'{ѿ2Ⱦ2TmY cP*vS ZHؤh5o"eZ6F;IChV@ /f4\:I!C4$MS? mӥvV|ɑJP㱨5?/ >,0^isJlT2 UҪImhɆDun02^&zKur{h)} rbkOR/7Ӱ9ΘBu4nneqwC ;$یO ]ah2+ֽ)j9la aŝ4 zfGbjp- @^uT0 A3uw#dDu~`{%[]}]0a}_8Q9~"B@6nU#•i\[|&.!,UriXn9(}=,ڐ԰0X! d $I!QP0>xlO( k 58bZSsfA [aaJ*FgjgUǓgH|V$4;Df KW+W(Chj`#6rhcy&c ԗ 䠽狴UI+XUߝ1C<}Bkc])2$fY._C'< M>-sJs!ʊ_Pk99BuAC!D Spx`_|CxdBB V8@KrM%S6TF{2(HjM'(vSqn>CcMWd?H"yۦ /B*̸ ojm5ъ1o«M1r`C( 𞫷2IɹVe !;6ΨM e騀p \d`UU҆| =Tc+3KqAØI'+ˁ-[™€ x,~hF 7 GT( ,6D2 ml qR:юp7jDXQkM@fjRe50#u%8nzAdhew+_1mÀ]9֧ϥhEZp.J^fJ̥#4 CAFC^9ŏ j(H FZˢڣ [^BNċ#F"&Z x*:ݦy7kê;i%lY@W0nb{j"jJ< 2NjrP]&|OvO܊6DFf>~D0qFòCet.Ӂ Y6XÆ} LE3T֥a(os0Ul:Ж 'Y }Dx"3Lz, I ZrY[ q"wd?{EC%5â-X;>VVYr8a*"OPmC*IDD3{ ܌< '?.O(ݻfYҐ`K?B(mѯʴjcš ҙ aVUabAfػڍ]yR1*lYyИ5zˋ=ɛ ׉D۝4@B=O5\E?t gSaNDKن+eeo*$.仡@d ;;i =Tff0llgNv?ׁCAoLTҰ"f7NL$_y`1m ס`bz[,L+ ش@`NlA*H) &1HsNd”:'+LgڹW3n dvC!@ ̕z~<;-"J[8ٰ&8DP2€"5_4 c8aАhY)F٭ Rh#?Y;< lhd#d AlqH}rcF1La6zЭ2؋c?ncvPF<lmB2qTcCZAHu%pd؞y ˵k` !LK0! 9 a:|NŎP$ԼTˆoễvR~:ójtv՗P17;X-MѦQUA*k Tj"vC+Y77JvDu$SSš+QkkVW[Xt1A\X;KFADBhQE90YDzhG飔B!d4UY0j5Uɘ*3dXԻ7M0{` ^,mKZpѩN&,>[;"045vbwSh Hkui|֌KđIJme|뒿XgxЪ뼡X¥C*]hUpSbf9Fc w@/o5 EUa|BsMwfb ~~_z2 E`6-$NX OW@9,i@Qjdy 59EywD\S=O0cY@*uk8-A\xi0ff%5G'>Jز8vvdȹ^t2h2!,X ZjVZN|_1qj'*:R }̷55ц"=Ub髳UyY4KC؟B{E^h0hc+ݑai^;fV_joﬦ @+cSgUui&,a8]AqE%j4b]I$<i;l9)Zv3舀63:%!CdQc)Sߦis !& el.V(:ʛqtXhթ i7H #܊  KPcve]S4]:B$b2];D{m@(>|$(GogOWgѦr2b;1 3 䡂^[HE?ɐbyq ۆx6HݎdmZ`%Khdn~}%>sЎZl㤊d8;RA} XX-R)!+=+"rr8_dES?<HjAl.s2Or gKtQ87n[% uP,*=U~j.3܈^عY?Qed_7Zx+Z&++*!<` q!* Lb/2]k^W8tƄ,LJix2`a5BE^hӎ752SJ4I˫}K3`Vd[>{DEBc2q=V,T '5K4Nt\/~#̅)r=K'$B;F[gHF?Bbs)M Ǥ{Rͬvp ˑkBSB*P*qZp,pԐaD(hBtL IA}iUIBBƆ_*1N0qN@&q`TXEַ@Լ,;WìbyKgiA^=k\!0_9PqS^|zH'*a֕8@BLԤ1vRrIJヷ,c8MIA]< e5YA>'i[׌X<ٌliJw{>,]eԓhrEâp8 y#E,] `9FD/:Ђs7GIDߜ^J ܛme E9n[BiʐU^,Vt!rdzmŬ^=8A $cDs"[& f]$ -`'mO(mvj{Y0.:h哕U 4a?k|g ݭ?zq!&*Jn-̓U5^ -P 4,)s:ʾo9~(qsWy)x?0*l'h}&l/9(ˏ. FmAK'!;)ݐ&N ;P(l2ˌ %͞ Tz T {h֩,iݱҪR^݄Ґ"6$B.}pU*Zp?I'ɗVຘt1p-G++h<'-xu5u>{5\dg[\HÇ0A]c_cP2a  RY6iwҴ iҸ &s r`vC ea?&A{DcTRa@{0c\IaҔnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_RE.svgz000066400000000000000000000004211221777731700221260ustar00rootroot00000000000000+(zHcountry_RE.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_RO.svgz000066400000000000000000000003351221777731700221440ustar00rootroot00000000000000+(zHcountry_RO.svg 0 ߡkvX< նP[Yoo7BM?_эNYÀ&7'[)#xXX-b %8%8@P &XK 2B[ 5 bwJ|DHBtHR:fGi/4=navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_RS.svgz000066400000000000000000001667531221777731700221710ustar00rootroot000000000000001(zHcountry_RS.svgۯ,Oz%=[RqFCͰ"0lv v{8ӆw""ΩM}.ݿ?o_m?}?~__oo_n?o_kmܶo~7/?7s7ٷ_ov x[8>l9_w?>⏿/9~/o|u3'#$O?,??2o6_׌[#xǿw?}}?o f\?^^݋_7_?_|$Z>xZt?np/&v[{^#G=QnpnǷ}WLJr?0nq;S_ax`H#sG=~=- v|[[w=}}{x:_{xko=v#||8^^/<=G>ߵ_=xo؅{ǥL/57 l77_k>|;?[t]=օ}:dyl{;':^_9vdw%nqf[^/ıyE*ph_ax+,ꉒKݏr锲?R;~"迪s.~wzŠ>6gmZpY3w׸Q}n8nF9a^n!=ݖ!tCCa[~g}~2x v~QN[c;m 2 V%F-loi02V@B|]y`a DQ';"V˳2 ︢;]8>[={V}*Δ㽄`:=SAEi&?=MK~OUyYXqq}f$c#s%Ngx776|ʞ fk3Gdfh -)_:w>>zaV\8 cXr˳77 m< Æ Qu;=Ry>llٖ_,wSE&9]/zDE,[9 ;&.d8~<߰+c5EGjZ}\VKjaG-wA?s35>U367,;m}SksD#>^[N l1QI25Ae5bT6 R'4nÞ.ۙWӒӠ#'e8}=SJ,@M̂ZfQ(07me;֭d'?Gs+u؄j#gL *"WMk8n>EC\3 ۠M)";Fn; k3ۚF)g8v7 -Z{[llׁG#a^ƘSݿ-(L |u-d藊nXP#'VYa8vR+ͨʫƕ6;ye46I 7(cp[8zNxzrq?6> qk vKMTe'a !20<7]9sH<#l ;5')xxcicĖvcl`hxdm5;6mƒQ6_["4" Fun͛f QoF;sm[3OƇģob;_aUE    L여~cx`tHc"Iw K`*hfu>b)&ۊvuj= g~xR\RH f8`4`0x F0Gs8kۻX%hzWEھyK6 `ߨ7\)8 "3fN_՝KȉMD>v.G$4"$*^mɦ(Xe?80Hdžq$'"ex(  5!(-ݙahv-X(0&^<z E1!vD[-.m/+!GfPTu+e?7&m\}@T|s{{ApZ`kfHGҘ)aʬݘ1,͗-$OtUs*63qC~U$* Il`n,!pjGI 3<FTO1U4 5.m䨬 H 0$mw-9 lB\Q㬙_L<, |*n!"D3Bc$NlHW6†FG?wVu[bC)t.T^=ʁ^#7>P@4Njڞҙ/ ~ODo'J@x`Vؼ;eRPĄ{mA x[_@ec:+4 ~o9QKzi@ӈ%6-80 <]1V c5G3e} $^8-iDkfs\8r=h|"?VفTÑiE =hf6_[TVuĆ;M+yxWF-; @ctQNΉ}@Z 9  ^[a*'~[6A Ь/Vٳ(4^]Tꃽ\4*|a̓$#q%JX}qS,t\ i\8_tg8 K7,zv!ҸN[1FmnHL}W3O`t&@J5[ܞ+'d _ {h" <7ۼ/iyE`N5=82#:Gkj_K5_ˏggU ٻԡ^jt9WXBUS%Ymc _^8`ep+C0_?1:|F n"b˺e0߶o#yNXGzp-XUY-C!:K9@oTjʛm¼_'l㇝G"Ǖ: ^-(_ogK0,i-xԵŶE*Xo Ecu8$sܛR_\O|YPl }KYxO4E!@ X 6 ѯ!U\⠽Ynr2NdjB &-HGNB weeO}N]Pۻ[?}nplh]ФfFv'Hg ھN5on8˹qP6ʥYq~9x9zyyp;8J3Nϟf+m FS|_zݶbŇ}a YOMIFi?m%ߎ'٠و3Ƒ=a8Jr%-뗢M\>OK"l 'JoYySu7GadQ,gŤ\EW-(4Oyqdz#[ߠOXNd@cJ3 3S\<3BBll `zy5!W^v_,ӌ'[d.fȼlQpxŒv#kd̪Ri^Ƀ2 L@ݼj|XmVP 697Γs gI"< >ExT}{x!ꠅT z ן]JEܮ+WY8}ir 6?6SD\s=+nWpj{ĮzeHc< oۢ4̵L-f!7l8{.=ܛ/חsXPޫں[lG0=OueҶ4KCIY3yOCAvP(^0vi:`GopG[;/Utb'N\J"?uinamyOAGO) ,ӛx}Mkh?4(&oD |d(XZVy!"JS?,4O};Ľɯou j-\ .-Y $ [euhM$v ډip  \.2F-*Q"5tڀi>fYx fͪӛyҋGB~"܆u^L;UvR~ 6.(/DJ9]n=+j@j9;ӧ.]ŵ,`#`{y1x@m*?^}5IPw|cZmTn. v8}3)<`@"IT 'YWtɒQn8yPY6@сp-{ƘA$uny-Ct~>aP/0̠*9]¯I ]d⪲<~:^4A7׸Q>jfu:^R|Ӳ|zX- `Ϣ+?b錏ox:6OG 4pIj gف$4l@g4jz4Ÿ WUWC 2tXG_so]$8b9_Q6pXUH5^ "+3 bflNLvImNt8tPڊOg$a*9#ڮM}%~VV˲u.=C=3Qpb.Nڋ(lʹY_ĉg%_  Aq^N]#$U^,~/F_ҵErmr/G_BNOJzx @qƼZa IiVUSks*E0Ηë*˿nŘ_\EG:3'je3Jj운ԗIX׳3 e$>x{aǺ>_XogK$sZVv]rPO~Z=]ϨY aQ rIPrg `(tak$Kf-b1ϳU95.ݓRkUfudtK8F,j ½q,h8$N#1C>@pɆ$_\[rZ1)4Wmc{$^7}|qHP-њ?x-N:4i͔)`b Ҿ@)$}eP~ئu$HxeIJDe -HP9.m?=K߯ːI'_Id- E0 Ҧ4@,璂}~V]p?]#3ޚf^ۑM8_y?^Ba1z^e6z5n떠/4n.>1 ܋&duJ#ya"SD3d͋#!8 }>a\)è+^<`@~ j@#IuL:RE E%}^Emj= s态ڧf`-Il|&CؿR%<.:N }v+ߚ1NַM ?لٗ@ -<[ N ܰͶBD?4?!sg8Bhg)2Ht]XUdJpj8(ulv4,)Q'v HE@}%c+!g; 2X9tZq1p9)G,aĠC+g,5eT S) V//"Q0K9wJ8~iT7A69aE!ZvL?ꟿМIYqѩ]`bI`8+NXE$#JڱfKM8E %>I:˪k67K R qReMt׭U$v(I$1H 1 `r.:XC&N /SjȽܽ2Ç@،RvطuL]|8O>М]JTKv-Zr.9dž0QJ/ n#i>!.)N:V\)EI (=O%g+@b`-tGmaQ(~oWRZ$uQZ;ciq0\YjoG]bSD`1,@C]l#m$v;һTNΌ :VfhRF(DK-V 7j߆0\xwƎIl\P,͠_IfPT[&L̡ nOh-ƉleV'!Q$T m ͥ`6|{keļ4hH€6-rOON,Zthf}s'R}DI"lճbnjة_ԮXtl]-]"-/YpiMYNi3LHW V뤻_(we8u M=ڳIw2JfGaWC]Ke#{s=:t8Tx 3 Dci!lTJMGtk ".;sP'Ȫ)ؕR]u]H;qތS/3)YQ ƀjLsʝ{AY>G@$L}c_7| ] 4boȊ:qjč)3M{ӅSN=ZقC&N9[nz{Pݷ{xSA¡oW=0Ge.( !hkwd B);gN,yU$vt "VU9hS-<?ZreFDj;Ig5ְɮM*M= V4I:I~1.-4v R<ʛ읣N^gas^^rXgB0{R"2D2ց{V(=&c8")F;, .iXd#("NǚgX/2ۄHNHCGmn:zx{ >ƹK6q._:Yp2ea%DNJv1q4o;I@w>f$]Nuqt8}t=-AP?_4*о 5r8ҼfGX[h.cXؖ%V]I*o;L;^cG7vRTyCхztJOCvtT%[/լX:%h|aƬ}5B:i Y}`ml=a{2=6a˻55&<ג->*1|/@M`{-ғU8Jj|Uk@ Ģj[]E;YA~E'&ӈMG.7vj%ÃMJ|SN 8߼^gC 8<-+U&V͚p50#kZ#wfͻA/Q5™v8|KAB՜xK1ԏK(%apwφC.܃hpFHWG.@֩f:IuڟTf#Hk͝ƱyI2HwU ̗^vus(Y] }2 0pbDDDm,of܃8[yF&680ۣX Su/pczgT_ց Cc7ycc%եfK# CFM}l=q{`ͮ &Y"ro+B:c8$DžN<X*i[sh&ʙwkkGKElm{@ڼ4<15tolq oeVҝ릨yt@ QjP.xXJVnsUhnhaQj|vv}!,ºѕwSVpPf/e5ݧ,>T=-F M 0stxti6kNrjorv;P+\")(Op3L6 vԣca8*s=T"(ֻ.EriHm:hneN=Zvн1ՉG#w3 (JX0$} ]1c=*y6aѮ/oom K0z,kǽ>V)%"$FAnQ34F{TX*̮ΊHbzϏ|mRܵ]m>k~k6 'xM3"18_Y\"'ޱJxEa-E{`sh.UH4a ] 8&X?oפҭVMw{m|^2["uMІruV4mk!+$,JT7m1+VEAC73# ݖ9\'m( JڥGaq? Q.&yČ].a@0ࠜpL([|^ ךF0:E|ja'zv9PwֻluU;U b`{;{ѪIh!r$j 'TEI8Mi= |0/?"?25R[(;e2fJv/jW TJ99腛0(h4Zξ,3DKm4wyF90 MIʋnKᚘ5`3^W=V'O/řO.+TsNNR3lg+mtVq2p3n3l.ìV/?v cD7ggFgg^f~6pN[E<&? Ţƭijm9mL[Wnh. awT0 |#IMC3 ہ<%bů a.(- C_y}~lOIz5ذ"1V_QBW2+!V??_XllY/.X5^?z0|OD b|WjH5ٖ};*y3;]ˈis $ 8Td|0ˬ^!~?HMdKAs)Q ybUVl^mF ǏT_ 9MT:v>׋lBA'~Qg>,HwD H1-He%0 A"4@ T|{D A$3}U]$WDyA;17L !2_l1>^=qVslQ5nƁÇxItrm#zQ|/D(F b'`J>sUV7ׇbQvü@;mRS%mH(6\Kfi+EpsH~ EǣRy<Q"<҇-]؄1cA :4Md:y$#ޠSt6<q*y:|||D T΋<^D +Y CCf`.IQm\c<NrxZ8,٧"pG"G%_s,L#o<4qfR DzLɻ^,B8\I/z1x3/SwE%8 yl!JMg悑O"Ǫt5~aUe347E4LquMN:+uTƓ?Aʌs 3,?Di}]>^GnC`HgC/!/i%rl~{3VQ@/ӊQʁ6)g7-;GX'Jupd ;G{M_.}lA UD9HT~Bq{?ޣHII"4=8IP jIamnꟼݖYWû yWu(2QD+$3JO$"ROxGP"|/*Ų[ %gfg*s ia 73Y e \&Ѥ184PkNn ܼOV[{j{p=.ep qi 3=qiT$2%VZ-\bP|Ev=* NnCIKOSE}ef=#>^D#VXajo\Y\&[X&18<6XmR1:NvHTTlPe& @B"ҏ㍞eڛ.(J-Fl期CX83li; k'σΌbmfoX}0`0(LN6i" {ݿÑ(v#=Jo(lrQUtg!~o~~FV<>ێwHjo>l 톚]6{hAlJn3-uk\S`F+'.{[;켿`#*7?e { [;L+ιW:O*m1[wɈG$G&c[ Q maSsOۖ6;]=ެ'lhTb;a:9,K33ԆV1(.z# 5Jnn@͐b&(?r#~/ϫG971\3Ʉ|F Vt{y~(l-6d؉A {?p+D;Ѥj"J$1,c0@#ҩ/:hv:I,6:FVeGB#kFȇ"sw$1vCfU"Y˕, Rrp H1MALfC_C .@@uMA [۽&7 ;70I9.7.W\LJJ&|# ݍPGo0͉6rXֿZu_ʠnWnWi[kF/͑炝g{, )ѐ:P_\ 2ΐK| Y=;{ /*h0㘱{|YC9|!4K\NE2쨃$J+ G!F G 3y}Qrb9d=&{}/x|@maʼnU*:օ+9_2]'O _"1jVeg9 (*E$Ҕ^pWRЇCzD,אHE@EK *!k|L/>*M)+g)C͍_lSծDu9ab_ZDL),cёrX~J^<:{mS&>z"Il uzNqhSWd3%*@@S2#oRDP"oCLur% 1pa ۋ"a+-jS"5n*[Xr6}N~;^Q&LwLфK7'$L@dQ &׀%l7nfUCЖe"ϠUu-.o!Ua>C?;-/^&sg$WCZJ,hl;%H I'*ѿx$D9*v}qhy 9wo m_ Jo@L&5SnrH1[%oڗomhro]'+:Po,QlSTdAV_fMY*ru#JR~`~7xЭ̌ذ-Crr|p("P6.vIť0aD*Hy9LX:` [tJ$)2gڲ"C a$;t2 \SIN6,q1 nҺM!.PuJ5 Qzpe6D|!." ǀEJ[`WvMUv3bŮ^nP.uEV::w\M\DMrȞN @6Odb/woΗNuP%k2YaY?ZYY$q.P\ػ VI`'Ma,$ ޟNc(e].DڔkXKHj"E1LNڔp΢i;&O9 {B+b0m+q! O@NbQwj]ig +%EW|p,'tz"eZMW8:P}/jjGу!M)/;q+톨X:YmQeM I/o=(eɛК7vh>IN6(B?Je-8>3 kawʶw_ƾpUЮPYSU7~{K:yo\MV<;"J.D~v &BoEklTqA1.- ƌ V/y>ʷE -h S P\ bF.d$r6Y"z]D$ȿH.^jS@̢c;ɋ=g|Dδ~VL]K&J0df m_tMGK=.ɢfSd*UCZ3\6A%J@LXHm[LC!rƣ Q>ye i%U!@EzzVǾSYც%;:78qetjڕxC^ ۳\X67/[m(l>8px]nr-fe=-32hM麴J!Ѫ9ʲ}K`AX7A;-UE6Zץ}jf!Zx,qAʰ|,g+Fs89/>[jQ.wKIk~wh?>ZC~Ô!^\zqx}Dꑐ(kj*"^(\aƀ$P4iIg;>!8-c N];,yëр!Zm.^2(?XŲ׵Vq^nL_?OKQt@ʫ> Dݰ\{;4>GD\Q`٤أڢClq=oMOzov_(-z$!TqF%#n3Zb/YQ?ƎAPԣe-_tpE5WLߎoL yHdQI+ΕNw#,GH;^q8#{~0LI6S]Zw 6 Gu Ó e,AB//6Hӥe&EF֙ựp/aeľJDNVEڧ1UMG $uB¿˔tq i3Dm!B" +N5 8 jSwmnvY_Zfɿ[cn zt Y٘K-lv- vؙ`tG1(Q]TT'nuG GMAК;vjo>`([jF _8 &|D/$WpR(llG!fAG1Gɐc$7L5%)aӘʈv5g헝 -FWu2 - W&|/$W*>+h !>սlIF GUج8x5b.+[AD-|yo"1 fgP,3)?M;4@Cz"ͲSzm'p$=!yY~$M3 X/ti+`c#XMo` =*4?b·1@"tW\6#ZrMBٚ޼ھAQyTC Jj\A k*~ve?o?hڵrw 8vM*j"lr(5+x&.2~%M,@c!OhH+tu3rC*R `&-iBxK'E<`B"\吅x60 HFfITfY*=O!Z?U|8C $¯[EUL2Ԅ:Ƹ0lj2-A N^m [wY4!F/.%8@ 9b) NM@]e"5"F/6~'ڠ"V 4)s];Բ Tg  5PL ʨ⎭u 5zO, Ai d>J2.QIpU'̻8! 4[.kk4m*<}@M Ye'qIivƤLi"LVn.:-H;]mӄx&"ߐ{ljJc@`.THXI!tcc K4E=:>q7qzREv0j:ٳ=h_bfà{зkWyU:ȊqG%pojD߇iVBҥ{JUbc !v{x"&BXw<@y D.x໧[bМ:%1"Eq3(;kv9$} 07?9rtV#R,9(4l=UZk۽v4є`!\JRK%ێI˘$wr,f~ GŢL2L:^Y~=3J}k<F\ a)8ҨpjsC$K씢`i0wIbAK6-e23ClxT9.͒t(CEp2Hhg>w;^W5`Mie7ki-XG}8#-iO̒>Poi4W9Vӎm,i)0Qw$(Z$sE~J8Sr7{t)YRdw"<iWs{/tFO9+Ft3ݡ}%Q9 jBBH\VZ",F#/-@Xȍ`;A҆c55TI:,I1'd:YkJJe(F(x_} 7鼿`*Gɠ }A<$!R"M+ `aR-hɀ$FB!gis+>h8ؔ <u8LG@'ANn>>F!钃ݻ)N$]:!*:fU(!2WR; ЈH@nݝ 'LyX@B;֕bu!%ݡC6gݦ&a ~ĨBo&Hmq6VállFv!N/%PRf) y#%tH ̚2iسu* ]jJW0{ 菔"tlbTqоv  S϶cƲeLjᆰxH`W.`808\gnÌ9RpG OՆ+2a9+Rd&,m2WdL5Y!SV?fPZEΑMIfMf5CMuw0J,&CpI kt&+Hf&B=a yC沝a؉# &h.X&+S0 \;74_5Uoe&G>M?7Hʎc'C.EXWxphë@v"%xUX4hDu^Dymӎ-]D6Gl"J{$fޡ'9y :j5]'KXƕƩۯ@iPB[޺r[ @@!iIlőVGXUO@$Mp\z_¥Ck%P*aroDKGNm)GIR"hMs\YBQudgOyc}jQYA 8k'7Ra ĔHzܧk/rR`.K-8/%A!rX|'#ޘ ڸjEҒ6 BXMVWCU} 3h 8`( s 4 F}#[ J.iFlh~[i &=Mk. v9YOҠ\W)4OJ{\ԩ=x#ye*6nŎwU wKEFQ4j$6ZK-uZ~VcdŚ`)Ev^D%cVZD..JRؼfq}6VT$x S46Dm]quRbw(XԙN22.m bPuI3\$/Tedr3VM[$=!p㢐6t.m`g4C@D#-bn6Bp9Zɻ#6ɮR+I{?`?$qҵ[97Nؒ(dyA0cބy5_^PNz -[] s{R_4x,qv2m͈ {+G+%c3&pXu1Eً(⨰D}k&N0v$Qj+')͵Dt4ٲBYǬEC Mv+AG[UA/$>Uߜr0@v5qX+Z" #"&NRrt" ȟ<9#C?ucXGDd;'4g4aH p4(_sOcӃ)YF ag"WUF8ݶ ̄֒Ŕo,wS>䐳FО$`oCFkPY%J9__[Ў<mID^H!ં1u&P')O*#bƎ-cI"i#05Q<pCy w@yF>p٩H،w .oT%U* ZKYó.+5e1RwyH!s=JHn!$[, @K4C# RtnG%W7 ױ$ *護67 ƄW&:d@)z%T @bWn!ꑬjEZ8 }蓻F(a~2E"-|OEXInFM& 򗩸퍼N݃L@@2 7p~+c\/s ʐPp]*p*Oh̬_D#XHဲrjzۦp|/607kBآAfd )H }Ca8r8A9wnjܧIF0{e@)hDZ84~t] =V~ ^w1 )Hu/ C>]$ 41pR!lviˤFp1l`j'Fnyf'2pcKT,<ץfGKԮƷr]/AaHԡ>Ik`Ln*a@9!ͷpҔQS/6S]}0P1kJ9q%8A#{H]5U$Y& !r[_M)k`SжI 6=+ ?8%;ٿ+<@K%6yO~3 Ppox{v5ɘTDͰz%LOliGԉ#M i( ]otҦctl"Y2GyG9I"ď;`[{onc+2pCG'̩TS6ςb7oݮYf;Ό2;.䀒ReH3ɖX^ehI{PM1R1]I1-BㆉG^i~!Bܗp|Sl>l']!U$LY'iԱ2l_@<9h{QK NdpyWTJj!SAԹhdש!,η+,M%s0GAÈ `qi?cEKk>XߧISq@?:_fy0SQTZ`6ge(\#*#&.q0| >)WVt-n~gtoqs&,Im$n7e'U.0d,S,VQTwc,c‰"vr*vTJ6Ȇ*woS܎Խ3+ 1ux_ 6"v\TS ߲RY[ )'2ݝc%_(@4^^f&+䆁2$xE 6++L̖R2䚚uKܲ&4#bbE Q@wC"4pU". ƚ78zFÁ xY%ڵZ ǒXДyP?:ynyۍ z0@؀,✂ r70!Hd;q3Zt$ٜ2#^CG~ÂXfCSv# X<pI٦z"}'UL XGR{{+MеB]l(ml8 bTqs2 yr` E',J&ݖ0e 1HdmnJͮ[vwLGq6b \ZͰ9dB:w>]='ZQ`7M )G!ٱX2HT7{396vvCM<=dsA! NO SQ_%5j3#/O4i^f%Al)O4K"m8\d&HEqv⭝^nO|n ?3>}ȶRrō}\mzS"$j0ODx0/<8FZ"Ni [MDNBq:>4ڸtM&t8a^**5 fhYQ eqV*Ln9Gp2Y}$iG34*FSw'(2@CWs"E]c.\zg ӥHŨG Lj"+X4,Yp>-|K۝E,=ȭZl\s9`;:95 `h]{uIIˊ'!޷܇q@@^ %_J$(Z"@,' S#3?~؇XÎK 4ف/͜kiVjQ,H4wb?hn %R[>G $TqeFn*uX#Yw7EltLOq}I˟]E l邴a)5f1 AI;ʤ$' Mh`'0Ԃ[&x%FrdC<2nEߍ&-2adؑgd`M?1<;Y:T"t0AskryM$,gvaU,N,R2n#9y2;h!I0N~nt .G(gwY.>7:I3Ӣn ԵDny&$-|yԕΚBX5Y"=zqmàhC0/9C`8LPn$ڇ>(@4jrxbς֯yLdE Ͳ55r:NM֑ir_r:<YrcoY%(tYjܔ:~S= #. SA]G@ƴ;R@n{@u!~7^ "Y)kqVVwAg=/j=+ɥ}9 _Pf usGaA 7dq!JKh{m:b1FP7^`ppi5 k,ӟ%4Krw92G~,􈬄_|ạnwwn2z64,xJ֑{CݰN>x=}O,0!3]JjPpJ)WUST #M[B.<Ռƭ[\ģ卪I )I֚rjĄ+,e㊚J iRMP]'"4:%y0<'G AwB#ٛ]}^l@&f[>zL^*v^0}X£BAv?>8(mxƮrkU>P\%Yx}\"㑠@z<ԛX[*X}z=Ojj SVQԸ/s\I15 i&;}wK/)`?:PO hߌe,2?wHsrom2_RC)e| |+$c_\2A0St2 ,>{/Fl9il}%yn@ݽxF mhf },8[೷v,Z$eiAÿ5QLb7_vʠ='! %x裱/tKf $v{HV[rI8| V<[;i]-#NEEJ8o0y׻ Rf?phe̛Mvܷ;%R 9tRY:l:]4bi3OqlRg^I2fE9AEǡ/'f"d5bwƎ*lSn>IXd^ץ@+3.>tCjc1X犢αȭ7o\Vnh_# %adݳ?(ե!MwTgÈ_a_fvL3E$2p_َؕiTXtB̳2୥X&8 G/eڥ 5߁05G|O<z6Z,iP ! c {4MߍT!/XJ8lOLͰtb| S60}`jr<1DdK,s3 ˂;0ibp]*zsn?Dmۦ28Kyʂ OH%lHY˕)ѦC%;h&;WJKŚ ?6g%ՐGe8kjnin1 üyRt`{Ɣ"ڬeF&P:[EUnau>vjtG+u"tI'( 阰?;c_P/':De,>maѴd *1)[9$(t@=-ȕō&3$[v"57SUՓwC80.l029|Zb!́k-nҮ1p~G-R.FUNd]yI8N8KH#G - "$)+=G%yA>IaArټXe2פ"j1P]eo[JQL.]~;gpLUKU,sJ p%B:JÙ+ se0bQ9lPȋV=Ptts]N8 U"eBRt%6fL c}oNa?hD&ƴ N-ݪ L ?&Oǫԣ GM>kr.L }y0C%Q0aCyԷS6ܓȜzTR^ħꉢБ<_|e$}9 rʎjhe& c4&-}6ebLO7ΜN;S\њutw4a6 sy6*#2¥$B>dO=Ь/Ty2!@[nڜAVɏ_UZoT9,s_fB7еu+BLv9Dq 8!R5'%/ ;"49o0bacXJXVt:_lE+RK2UȩcKRTO{f2qc^<]z={{ޜ MϗTY( *恛0;x?d9FKgFC*YvalN/KIy @x=j=\AVCjQډ0)\dRF ┢e18P6Ⰸ̎T2_T= fɊ QĔbtB>6L͟bA>BUX@:S.3<nd~\]t74WbGҐ`GTܛ{?BJPnteWf3.u'/-,g &οtJUy_ʃ9s| Ms8T] &hym΃Ez[L4hW{h~5xwPžXXDJBZ˷"n(e;y (:ؘMjaRaY"e6e'k/2Ud\N^\r(d%Ac /1Hb8¨\ `"nqFX*1EyMӥa9mHq)?毩 QHX̎sw$F1飸K)U[$]& Ȟrv"ˡ'IDI'ڞP?JzaŰZM ʧ9<6lWĒ,ʉ2/★<*ضHN> $%F|췡syDçB$ tGlKf %P5 p(Oq2 bmUy؋!]ˬoU=D9{?M!2 X%Ev._l䦝T:4 ~1vqՒ{UTfj/^5')]z(2= 睡8ZDyR"  %{b7!SOGm|XvkF, ;nf?2} @:Q1yBMEaŠL/8b?ܒԜCl±yfT o۷dMJB;ɞZcP 200,r }jg|WyFZ:Ve`4 F$t @(eՊBA=K[LNvg!wאVHZv&q(ZPeڞcA.XRMtI6܅U9Ж; o uDG_{:h佷D;oKi]$(900L$nzUd3xTDZ8#!~eј8?„^N <}|'5;7^=)r0{^īv &/;3ȥd:ٓt/gz}ڷglL HYިδ΁ }c@ H9m5@B\A V=IWg +$ ?Ӡ9:L4~mXNAm218u@\isKD* Q[=u5-0m^xrpa <UVO\OPW-ᅞTqG9++őytR:~4aRV4=v),s}iMl%.\0N4$IS~h ꣋&/1`})̛^ʌ:8]z36θn/Y0_iݘ~h]hMHgRsbH.JeI׳ \}4 IB!0|D%g Of`rU SFwx:A(n?ZɈ-/ј< Na!j󼿹 ܎!υ Rgaz>-cyt2Bf:Q+-p$0$)qPlvAБ44Q_NL}I- $c +0cvkNԴ3L9~Vli|hG8!{찹,Ҵ{&ac@Ik45umAL9i13Je~ѹk:-#zz+pvGQ>$$'1+.@hRV鶚kA.W)8ޤ\^~Iv"hc&ܷI/*(_HUH hb_A2*0C'Emf \'L0s>9S `zĶܫuo:n7@I.)wn+eT~̾ȸTi<$'/|YT$„(`z &dɉ YɘdLvz3qQ-0*Аwԟ^dHV  ;9=7ߑtpA@O @EŇܳ2ϯT V"^W Q 4," VU|\f;JzLi eM}_O\*w( ޵`3<I^ :r$=ոg/v{pzƱ]@a9iMI]PqXMUȋ~jwPd0 \am@AgD%VB*u6ZI%Х*Pq &ȊV)o Y@Li[h緑ABxP6feZ6QQ #Q԰ۼN$g6K+9Z n[I)VkDj?, ҧѡFi-+aVMȒ< 2-[@1.ϘcCOwK;?:Kӛl),υbrx09A#9dzApĮ HB%Hvb#%CCɮW͇5Hr o8 ",I#t* Ev^ga$;ʁoj;@3ѯ-!gGMmQ85/Cc1|'. ؆d'f .@P?`n[:fLSyVil}q4'@qZ6cf}zi 0v2~J|9ߤ:ni0ц,$5ؚJW|+Ȝ!ShlP.#_&7GỆf~G.s<S7Ot-z7At\6ZPP;>!V ۛl{qW JxR*7ŀʗAzaߙ_a A.QN@4= 4#kGv;@?v KW+L(1y֚dD]L:!+8]sVEVsUS6*2 ӈ,_ԫnzvdUzWޅt6_ۂ{RڙjRy#&OQq2u__V_Ejs݄"b66,X8gvD`= ̓jਜ਼8J3?ʊ&8E4mxKkp*'dPZ'גVc6(%_9ΫZzΌC"5SefƼEcD!rZQYųX`)klT6әˣɱ]]/m>C-q`s>B%Dan= L+#o@t&&zAXAZiW[~'(v';P^jjeh@1:F4$_Ia'* (!(+iFVmD d2Qk]72mL>_iC\F b\ g}{"t[o6Ybgjڧ&N@n^FOᴋދ$Ztâ7h,^8LL#9Dhy[{B'8|?/~/'w컧zT_ M;Q0k/|+A^  jZfNl[C#3T gꧺ"DZ0"j@8e6QEKɰ2-vpr &,lE8%Ta>I5| ɴW!}v QFJ= C~ɊT3nH;U~\- #~ZpS%m ,qQ &7Hpe9 e׊xt 4ᒩ_H̗'Lb-a/f]n%,99mUJG즊 *a>>BԳȂT|XN(hF"m-n+Nt0j6lT$ kw`g *fqj$jw9`̐d&ngKb0Vf;n,YF?yI-wȊIk/]@۵<1F'f$uqC]K+2!}Ht"[(UDE0[_BKٹ}񌫀@}LG8J5lݸPRESCu.i(-j E#N mx 0D]x3YڥY%]Uc)֖gXcwTynYI싺eek6e4P> P;Twr"#nOGN +tB B,Edߺ^LpM.g6tCjXI9?n+gh/\ L"Xiv.nf' L'S <#f=;#> T"\Is6BZn.I> L&-@Ńj@$<]`8LGkt+c% i[GNalv0$;r{ńնLpQ[FQPpw\6`(~FhXM}0AF+]"KRh A (Cbp|ѮñDf Zl b5%_M%ԯbFfb \-& h U&i@l]%;rȀtvW)vu>!4鸳Y^PbALpgBc ܯ7 ʛ?=\3އo.I` `(X,ȊZH]‹W2ڙhU^eqH6E~}4mz왣~fRH _:|3ꖧ쟭s[?*fڂF}Zx;%,D *g=(X;.O15rdN)ܸD9ڧ1Ey5]zdG1(pRSl`:riQnՋ< (ɷѥjZ&ܝ]\dmutIvUMܪ<5<`;95%Na;x)dU4߿Ǭ @Bp_Kчly O| xH,% I>|EhHkܘ-f6=2LJ 2 ,!{/s 'rV^Lٵr(xyƶD`3d6z f2Xt~MLjz nԯ}$?bh4 t#vj&9x:Lպ˿Du Fn]cF-Sm-^SOoܮ#x%("1~绳iU<~F(u/GoUt*aDL5uݹB}V念uv k jo)fY!o?w&8Wڪ^G>ӗg<4FMM2GgFJeB Kó.oG`}c[ȭmi7/6tNj/DRm/}$q4..]3*σs ?f?QQa+"hAT>[3Z\on;z W>S6GNjH=UBC;0ye/O^rr "IU;c,)ߕj,O]3f7ۨ ^|(K$z2pt+:`6a7yVdM3c{4c8۠_dBIDr4 Kb $UY&νFөE)cؼ"P#pvWt4fc"ƯHWBr87XG,c "dy~뀲{Pɡj~g8[|r wc4f9n*4F~=oD܂mك*=خQ^a%y;JF*ϸ=zVJpNI'89"!q10FOl@ ۑVF#VWp,01Y>9d; ?~pQekWATcr<ޫ{Aƭ rڀ#ᄪ&%mzqK* !vlj`ƂW.ZE8RQMX…$P%PD??xJ,e8SW袚pk 1uϕ-n#A?@6aEȅrm݌hBmCGm0][µJ$m9oL$UX4+[]}E}PҶ6,Tw*fF .; 8$UOn&a38{~/;ZCkKkScHM31lm#2!mqݞ)2ܱC2Q]ŜlMȻiT3O+7 PvԳH='ˬ8ևxCfe8ib-?U _Y٠ p3 D>9%#<#2Hunr7E U3ER6ٝi_G)9t{_}RJ,QyegH|{to/KwQcRi-Vss@wjoS8-~yc,fU,7$+v5e"$Ŭm"P8\;Cޥ0؊[`Jl>&vҧ1,gyn܄\#_ڢ( /tɸibv)lD߽R{Ǫ|5Z6$ eʗ²0vjs1IVˢ.Dp6uEվB[}l(W,Vg=<CP=2!$p!UQ"qw7v- E~>=JES@\#s_}fS$ޔ;@ ْ ؉P9j}Xu:uMţ>l(L=.ꕪbDz{ C>jsRP",kVPU4d-j_PrH(X_(c@3X*\; 1[.r u3-?ҍQw7G>h:b6lsm&2Q 3p #gzDC5)+Cm^$9(k6ܒZc! 6:k-- d}B.Н!|/^n/^Aq_G˰|rmֻĒ3;H.$@@Zt鷆+=%k!/-K-a5Ѡn5z݇%ͯQ ɾ ==#ڋQ]r\\f3I[p3LUu(6ZڡViJP~ƴJՠ8qUw2kǦ^%zv$r}(UE Rػ5=߸gCaJFх8C#~"+< ˻k q6arT j$\ܒyxL#'0 |"Emd %Oi}xg#z^yN2\3ӽHcg{{5SP@I8) 0z"V !AѨ_uήJhY9TsI*".rO4ۑa?UbCU[&C@KZze=~)g喖I;# *9%k]t2˟2fJy3%e d까-gTrHcVmk铻`brl*9a8Eb ,lTIrvv=v! ;XM¦2H`ݦ/ۓl"z0CBΰU@A.śEH*x8Ywn941C*?vk.'FOjbK*>CBt?KQfSVi[]G6Pu $91aq[ ؤGj9n/4Sqv VA0m8TҢٽsxϼꂢ=A@P$RiQ^SnZx. 8'(c)ȚsJ}%(?AC8XR~a):}نɳQ`%6(-t>SjsoC3$`Yj.!O{1V@ "`_c)p֓4ѡ>A)ܼ%nvqq&^EB**>g'!=J.d _$NTۉi0Rgk%)[sIEg;9xpd^ZǛh,%@/"aP aW08ͩ eyIFӢ$v\lz^G#LcAnt fWRvH?>?jr\J;XYh, O-ÍN8Nm=L;./ Xh(tYD.pl@(x+bǽ?+8*+jؼPSk:%p%,fOس)yz! nFzW)G"=:~+~7w:^Qŋ~Q*bfޗƜdx9߆x_u3)j 6< 2J|{UXU(U1K-M:u4:( lYnf:ӋQ|?[H$[{2~fwoBs)|^{B0tIW W'Cc۱:{KsUs '4U6eӸ4U +Pf%u2]Nvs6nz6+eUl沷eb%$}qL>EjGrOgOvu064ÕN)LV$HG =6LX'oJ34O# ]p3WuI狦xƽ','Iqُ逅HmƌK߿j5E*_4%5 NH3&XR(78Ҟ/{(y۪qO`Km*{oK3S&-YP&95ub/6@'d{X"HЕ]AaiB>C"g՝o}R/G g;̸<{M'yo`H_.;} vQN]j䋗I8S}+ +iR"!3ﴝFbZWx7Q(;z5}HP:$& 0{*Ğ[bFUe M엓.HU )ɳ,b z 'wX7zUImˮ oxlP.' qo8/4[l5$J0P9"eZ#/ **} L NG]}yD\ >=o>&فկH6eȉۢtw #掰b;V$[]Of% mMy*i,6{;{/8.0@ LF('Df8D)7x,R6r#ya6w W /-:OY ;:\~H-5%G!oCM_FZgGQ2<]+;Z7Qyhc7 rWS%о75\eÎw3y7PvCJXH?LFY,(Y;xqLi@1e4> puzrtD;#j[f`O1Xsl6Loz;Kiu/'+`ݮ| y# msR1j:h[xNIOKV`v5l[(' _̾] h ufe6)Pqڌtaȍ9 y ۛGԤ"Kt1 ér?.C.Obw=%!jsWR~+K;(5pnq #o<ˏlxbtdǷs6/wj:i .4gk='U]+#_yG\!z" `ӎ:J ;܉O#" db20I^pYgD:|]k1< AKo-ӥVqrU^6WC*Ű}'T3 Ϊ 뢩wGĊ8GǮ/tk|j$}o'뼇{督isQioQo"SI`&RYG.ZX|$#2Icwo=(J1$x x5iivJد]9옴%& :Wq"*qGu'P82q:vv7FT"=u|ƑŁ=4M?7t`4 ̓V, ucH~Y‘^ Jrhjzv/{G6Ap6_F?8ː= YEAiDF9qcweM :;]?>q?!7Ӕi4)0ܰ 5|!4 1J tKe*ؕ%9vu4*Y U,if7ۊj!:?v0H8vUk[ D盓@2ʎ R(6Fy v!y4Non`KБ!(y&[ݰ7DEΊ['LՇG%Y:Sa3l&CK;vV5+]˲/ޙq QgZ6V0aZnD15K@]ڭ޹|jp]G],Y'/qo$BP1*HRDSȕ7$ą~/#Ur7Yu,958=g1}GiqP|naGzF&L`S8cj>]r{oBiʘӷˑxFQ5Hxq8U٢kLSeb X ;_MBjNaZgV^^{{ڞXPᖎ&K-ʀD{Zxj)GCZ;MPW'9qoC cℬWn[fCin32ԋa`i7at9sx>BdүabB;X_ ]˄r#^fUH* Ӟu N7 mhB)/IãxwPJb^i\^Ey)Ω_mZF u$%8Ԉ?_o CL=q l!bIgKSsruhU.\{wom0-Wo퍶hÉI#/s?}'xȍϫxMs)n[؋Ojy`ކ O-AssRޝrNRo])])>eUTZc81<ԑtQ+":vo9`ȳBˀX1: yWІ w^) eId*ܜ <\)ӝ/r4[92kzz0֡J$Lz!4b6GAH*w0"WAR ˊ5a$PD`m*ZB.Qw NvYEh>:YR&bt+nFZtJ2#:*`BC^2(:չ*WƧWBTTjC tcNn:s+y5cBm1ŝaGbTUV'ǐA>N,xminr+# eiYs-[ c>NG͗=<:xҜP7p\YI19 Ol!B,_6h mb6.ֱ{rU~'=35v ߀g9N'65MX]"ϨvRݹ+!h}bpYH!+mܢݝ|Uqkl(C?YX uq)"ӐKOŕ.%@{8A Ć q,Хd^ӤE6QUGek#F4PF4Ujdi+ 0^OP/Yݑ Zb25OۄHʄ5)HBC/IcqA m7Ѷxd;QjxLv5Jrh78TsԡnKR 遠3EuNؗ$TmCaiXв g4})C+h@Cwl?GȠ|mʏ9\vǤ^Q0>}|c=z׳M2K 7Bٖ÷> J)9412~{9@xtڔɦ.,D.e(˷6 $ 0 fYlnyIC2%?IR_rBb58<Ӿ"" NkBWt~{CGSRܙ'|f-ZM mʸH hҾB.90TQ>bkQR5#\{J!.NYAppa8'8rv*̃4RnNo"x,9^I"5R(!e5YI$T9b&Wh ܥ M˸_^>5}t>:sI ~#=L;YpA6lm'OBGum`Z!WYыUwD7rɥfCtC: %_]$(!X$;iȔk}2z"g5,&% u#!w07X$Fʜ۸U\,I#yXӥ/2-Ol fȂoh,D4U@.д֢ocetCTʂ 14FLnr$mج/('3tRe݃Px,3:v_þ ,7kgTj uF˾XrmmS jB?4"#8*AmѤR<+ %9@\RrؿKۙ_ *fJ@TyNz_Z=ʷ٣C(џx_N@kBGC& H\ 6 ^ERoSOn YLzm G8@i i' v>ʒ0<4SB@,ج7>#ؕ~GXҏkG~~~Dȱ;k>L>X;3(go*ɇ`9yA4b %tkYQ!]'M}|iqߗ`%å}}ه^o}Hpa4R]Yۜt6[/ҏ[.- T!.~Kݎ#3t6Λקҏ~J?z[|+3rOCįk .4'ԛlsݮp-HPީ9=3[,G^Lx^9_pN8lZ0)h#=gσ{i&o.`9斝a33`8.npFS`HAɁ}~ כ]Vԁ Cl99byTr~K/цs1>#p,cjvמfhkw؎2q縮 `_OCiΫ~ Y`ELBpeVdj.MEҎcq]a]RPzM[1R||w;;#?]Ļ/NztWC{r; WC}:8NEv*ְ?ꥥ6+}ntYvu:"JAqSa!kF`P\{N ōo&cy ͎8VWɐ&|D KA=aD?.obDcdB$|(PgpU=$\N kdK&)1%X./&jB1V&゙zQ@/:_ rI:(2_疯0_t]D4bSyD?ǂy7ݖ x^BzAH? Cz;y 㠎YG\>Є$A4x)AbzzaP/?eP0:9okL(ObzSDczgbz=tK`x+(3FM?Rz_92PC\`,&ӰQP_uRLԓu SP̊~90Q?6% s9)PP'ǘ|6o_ fPn ]ӆ5Ϡ Bkf7#"ګC$P3HD q 8(c $t6Pn,o&mܥ#7ͨ=ƟZ׆+6~4\o.Mјj$; K:.B|VZD)= HfT07yE|,@yWgJWef@|^:fds+[HItMQI;&  ;K].skt^]}V((U ri K68'] hQF D/Ku}pFS/X׀"*ñ)>\uZ,}sps\=0nefo̞rE)vY&wن7\VS+}21`4+2 C![瘄~Ӂ{=d@]PqgͯyR?jAs\[Ӹ4'9CѓM-z+V#$f%Ifې& - 9X/^Ulkhw+nB0Vy>i\և"{P*%aޤSpN!Ld$hL.p$.C."euv7^Sd,E7&\GjYwN 1Iv@Z% :ByPin".($x = H`KbՕw'iԊuRi@"-ז2=+~wj=}E{0o8\6n*Hm#dzmk%%QmA=m\(#EFNEv2u$r}v mKE5J2)[$S22 ۈNylːՕ\4g.KL2e.7T~\$gN:a Si|NtՀ[qD_<ռ-Xux糿ޠPlSDU|UEvjSjX35W=/vsIssfP)=Ǜ`#c9l5yp3nJvZ}׵%3I,Ӊ$ W# 79K5!:6zzqx#LkH4!k}h.\^]ͱ/QfϺͣow^+ !2f“ E)5:{Kx%c$™%pr41Oӣ"~ޤrnU'iL娈Az>dSP1yxҞ˒ EeCmjǚt@Z" S-~aV,"M= ?sṼi"3 Oc.>xns ܅ٶIn Dn;:襄rL^[_ ,|&/]Z|ERou-mc+ `̋G9.ܴQ685h|=ݮp/eik3:' t1i\-S,pq&fQXȥ8:2( "٦8-w.kxWM,{Q*C"H,}Ԣ-},YaU/76 oN)*TaC`CcOUFD&Q0 #|];28=4%LS^ikT?ZhɌZ:eJjqT`W۟&pζX`0W L>&}[e16U x} "stqDq7oQn'Ӈo 5mم$MC_8DY'>ŴX; !̚b`vYVw~=y"]= [n"+^jtP]I\G@9NNXZxVMJh^R|e"Z$=NTɠe~v}bAc$g.؞Baׂ=g4p. jct܄xF9ίÐ*D+"S&j$ UcH&`R7p2tjVʮv*~6գ@͡9IG2Ȓg\O2NTTDԸvb[Q_EjʏK:U1%>E 9 fc>UO[p쥣w0_q\D6kSih0[ v w 8÷ T1TE]iJ&˸SV.W3mY ni/ ڱg;N ˄$?ɝ ]dഔSԶ?ȆO/i;4rĬr xnl-ӣ /)IT9z[6lc4ȶJof!n!U5ߨ, hA ˳L'44NQMm7df8%&^GXR7wOyΧNnOrz1!|͡/]8}]ƿ< =iuì#)h Wi̾x\+ y:؝2" ܜ$iɇkrYq1(?өrh{Ds{sJfnx(J8YQڹLVe4\ (- 8|..% g)# 1A̓Swe.Et#dI"FHrۉ"R8M!7bZzIl ?k ؏dQsRQn%npxaX㲥QpSy0 'h:t>L uYX^<Ἐx*T(SXI_/q;NOd4龑L!j_?f]K*6>8FY<3Jry8_|Cp³vI`KI6f?yf#>OŸg xnԡh@oHav^E&7 4v=MxlNݶQQAU٧G%? *lf,4/m;2]d`}|ޕLmY\AiC>H˞{7 ʯF'S /(lglm %Ȕ ,! a+nlwW>]3:_f/s 12"lބELlZaFJNn{>Ng.fLҲJL#1ZiԻTUUt2Tx2Υ(<Y@wvSy3V*r0Iz۬yV\2[k& PXtA"A(@xb%WY*Ǭ;rSRw.;ADѡ̔ޢ8ПϺ7P}Ly<Od~VS1IY]j#_0ֶ=sqD9?CTל4GpPy<3:Weo $@ "< >mQM ظ ik$u/r7pQ^yၔ\Mb;lD)vn>ѕ]7ZY0RxsIQp!Ł%#.f7H絔RSz>Ĺ*Uq`ؑf<&kT2@A0$x~tn'jS'HQ>`Y8{ ʖ'P9zPۤ){%24Efc9KczJHGckO4P5ɆpuWe'9BX~@&$6 I Rj <(6 <7:p$ƙq09X3Ν-2ہ@"zBO#ec` =^W@r_` zQ1xX}˂!6Y,Ez|'Gy&i~IߚI%@H ~{P&D}BU9ԭ=@oCREfỲkZ/`zZ蹿~l~+7v2|Cx/ + k<_T@H@茀QUufO[VX.``4yƒ鮢y$urtE|bԽP:ϻ&|u8Px}8OV1Ac:H6EFT,l _ٚ`V7vIvIJ/(͢9`:`#;N?Jm%! 1yVO>sԓUKG+jw< ){#Mq5DQ=% ~JM $֟M4"g7ԗ5z!( lD}1QrEQaE41Δ#bEӛ_ԟcU3n@-7܀9pq٘7w'$ lD;z;  ;;n:4 O4UBx 0Z_@'Q~4$ϊ  Rj@4``! 0dU-d5L]>FYt| )£f}TDIW>& !A|3ū 齰Y$ksPx޶!~!a7W{h]`QU`cRfZXԔh/zw8'&Mhs|cTES0@Aq VTeh"23B\ y%Nf טt$ ?C쇆5s"2p:h ʼ| Gt^n*OE{j7G/q (Xo&FIujΨA1[&HLD$o9,^"yY";)+"KQ*/ :81Ȱ;/"٪[_Zboq9K8Nq|pWyg&@pBfոJ#vJm̢6K(4;N/3RA2^<`Ep: ` ۠32k=fZ~.2rD$JA^C|4$cs:&<%?@Tep?yg2Dek.uC_lgp9Y{CrGPwAwH_h*ٳ뱢 B3tf #&62 ÛH.ȎDvYyn:Nߟ^LfAZ__=׎2J8"<f- LH.ފYio\>k;/Zqn˖BYߵ"W  EK.j'w3yowI&8dw>c!)JYY5(rhs4*?,߿70>ۿo9ȩcIb E_MEu 4ܷhUIH $Bkl&NQTAVi)} FHxcK7khUKWV}x=@!}u:'|dFC?XbP'"w"C#?}AQMTOr t5?@|`ѿ4[#_i'³_kuFOe|\aEKU`kdKyQgH>]V$ܤ, ɲRO^eφ|^ZٵoWڧ~PS$̸_YF~nB4׭e_VkW>49Wӟ0Ix}H~qcUFW 6S&PazRd+u4FrE ?SB5- _o_^g/%_M;EZ.3yY@+:|"5S[~;m裙F͞(poo|rVѢGwM0NԜ=u{FX'ʹ #$_ɏ"ڟal}%¯wzD[lܛ<*r'u>bAvZrQ&&^nzX\k I=G{71E7n4 F-:I@Te{X F|{T:ͬj8,fnO0}X=( ZUH >]Ah"t#>kj+!{s?s!x?wy4qlǑHOQϛWݬj$!f o)-  jR;;{qp#W6{;f5kZZzs12Te(ȦtZۡ`-kV;Y^{a&%)duYܻ,(0Jyf/_~go߽#|p\dO-&U-)[2P{xi rQR09pM]]$# f$<{-o3U AV(a_7- =#[I}l4Ss9k>{]ܔ6$z, $ydwv_MA*τPQ7W1'KFFT IP<ӗ(@8v׉C`#}34@vI6V/'ѳa&YYBj^L-S-$NxHP6ttϦFd^3@~(BwXhOnyGa+rq~_LvIC TV3ye#y(2m5냘lEu Pb^a2 @'U&O$Qm `/M.UC#)*c^7e0Y&qVRPZ7y7F\jUN}|MUm9 m\ZflzZ%Ox/dwDR X(MuPGW&pZYY]5B hO0yTcrZ,4Hq6~,T8pܽu| !f#?navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_RU.svgz000066400000000000000000000002721221777731700221520ustar00rootroot00000000000000+(zHcountry_RU.svgA0=hƵtM jۤ6TowD/ٱU-/*c?iW|+ڸjFLJ3927eX4플Ñf$ "¢n9;)w[};mw -navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_RW.svgz000066400000000000000000000014601221777731700221540ustar00rootroot00000000000000,(zHcountry_RW.svgUn@}Nb1zgwVBUKSeb'H*6 :i+EEJso&+PmۺL3"cmWlblii凋o7Y`7_`8Ͽ4rl[MO}i$pIv#}-#(bާsV#@͍'iNH *@[b9zT. ח#;*7[i0vJO>HEtdE!8 r\ ,7Rq^H%: ĠGM:G8 GH4TKIRNE:IBA AphPלF]4;y\.ԂtmZTR v y Ҥs)4>Yh$㔊8!T2zMCP-јIUF`PFH+N[R%HV2 b'>j㾞|@A{ɸ$ܱU=?/ %ؽ䗌+[0iOvGޱpIz?q6Enavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SA.svgz000066400000000000000000000427121221777731700221340ustar00rootroot000000000000000(zHcountry_SA.svgmǕ2Etd40@O̗ ??{ya/_>|ݫ}p*?V?_E)͇PMВRB_ԗU>?4/~_ݫeԣ^wy_}7W59yy㗯޾z_ï޾[L>%ï^go߾{>W~?z}ⷯ_ܽ]-ӏ_}Wg?3>VGKQ~^|x_c/53zJſ/߾O^Z翼^gIJ~/߽&zogN7i=?o^ 7w~m?߼D}a߾~w~A{߈9=8!o@/}<2}}?칵'31I~%0O^ǯj O# %%{ᗯ{=?<>molET^~A_o?xG3}f_w/^yӾ}_޿]7AP`4;-/߿{ꇗOw?߿{?ܳ,_<W{Qk9_\^Qϋ۷ߡfOz^gǯ|?\|kG9Oûw:VYwS #V?~m[2NG5e/pW^|#[w,˗uySBv>^fӾ|׾KYnn֒ʳE]w?˽޵\EwionE+N]-IXqޕ{ܵw Wz5<mh:ns=k樉I'>f7:}FͬX=˜|WfŤ*MbY^Z3XT[nꢅeJwuk#L]_}u+&Z_˘Zva&k&^Z H Դh[ݭԚ^]1dž_-6d͋ѵMŴzVm{KMl^͹y-/ZKZ4qwA}Z6Wh/-ue6^{7GX.OjŴyfK~ibeIRaښM/M?6nwiFZ$؏]&SuAwLa)kDkwMdtתP}Y=qWQbݳIZYۑk*^p}~iNGyyr7W$/[Rd|鿺8Dzc 1G|h9Dh={5t!9^js3Qᨣ)4ΌHY3-OhC ݠ:5 >Xae&: z]f+myt% ^c J0mvHV?պ\Y\#1Tn>kH[w;dt鑘~{8`=н[u[BY8zc-TMRG,[iSbY21$+[ b]}'pšw-qŴ4q:j+-KZPxt]U4dV>Z%`%oxZ[=9{kZ2}li+VCzݜx4U̢"5ef5bZk8)j-C$i}"gyQpLc 㫝i\F<OQ\VRKUJz muSzw5LĮ;y`p6ά4PJA{ltRE{*5UG.0YBvxGB7oP%6p6]_ziaH印ej }JBKR`-T{*|*b'hoZVzb~4߾{ء6<߾~s/K98h7_{ÛWMlԒjy1#KbT-g,+4єzRrtiGC L6̈ ɠMK,Rł`qk>zZ4 D];OO:xr2%{c7su޿+_r zF˲(@=2znHdxRn 6FϦ3p5ۮũɂ<0pe[mضYdzqzamJB/YxS2S_awf<1,6jZe0(.cN@ۣ{M%y+jlcI¦Ts&c>y\c5Ĺda+XQpqF2kt+,|+:mlGkaq9]ruw'Թ kAX; Qkq!I+CK4-sFrə$G@%ڇbbj[{=juoi8i2vnH)m[G>낆#d*4_?C9KCpN -x(lۘ.:68'0|ivՌC?P &Ϙ׭Ȱрl8"k}p Wۗ#2Jщ v=$7FKV[1YEˋ#CkaF\㎅˾xj5VXzVdR؄egl4oW#>_9jN Ӵ,kvۮb*ͻs&LY2ߗiz'r Z pEc%niH4@_ bI&{WWgɖ٥!B% '|Ɠ#Q/v-S:#4bDtf3Z>hQ}wSg B yMpFKԌ-g1|д&\FUm R6 _"I՘·ΫXZŪă07> B[NGCdCCI%T2eF!9Hz󑓚词]mű&9%D|>K >Iiɓ:Rh%āX1HfC3Nj"YyI%iFZ6l6 44 Lc1!8A;$iwvzI~lb—T9Ns3X܊,x_QZVO6f!"!"*r,iKl"ܵ9)}b\ߒ^Y"*- )nztZ^\,R8^ǒh7Іj&dpe8|-XDQL٨X/IZ@&dRx:r:BRw<(mڨkOSfrJ#hˊm=K) qQj|Vd4m$}Jdu`ZAEU/E%kK% xցc,'B0|k3ҋtLѥO$`# U7UrC ]CQ6hN4H6~, gU"Mr#D<;6vգe432&: 82F!eR6SnW:Wy1-qh|iu(8_`CQ_XCd6'C U;uWd'qL=1PA9_|{8ohRH댛(OFʬnʈW./2BZ 9tL> d\9n vFYF0<9AoF)&" [i__uPq.L5E>8p6`G/%!eV:h/ɔAabA޸|:" }"_!~Jl>M_Ymk8]=lr"~wDDڒX<Q\TD$+w+3|CmGo+!TLjΣ67p8[dq"#CyibR\/g!u!-'xs4>F=ˈ;/~$8ӝk&0~G8vL̬5ID3DVp uh4M847?U?#5\1 K<7Ӵݹ~"?pUP SIJ/HcKH+d۸'B5Oʣs=J'ɜ4I|"HM:ɧ*Qif-U#Ӟ+ië."ja -JBӑ/^M\񠼅/ivs>b#Sbm wHHlU&o;X\Ǿk6I%޾BR7_u(9lUļ!œEÿ"0H^VnsctGpGm;IRգvh91Hytwn^"qÖ,|"%# ?%{hWZxG6Qce|&4q%`εg&,)P _s( FE4yfQ&kcPFR'nS Ò~ߕF!בqBoHAʀE&ĤnʍxPE!R#(КQ{@ rZBSrjlBoM"&E"$NeL&GU@;7+>fnɱoOma# F""#Z-a !Q˜A`#7K-RWm+}@YafoǤ"cjM7S)F!=  bٱF5Zv9i8FNHy4I 1sWئ鿺LX4LUJ>6 n%!l(msI1Zg3"R,XܷI;tĦ?WFb53cfi›O2s n1y׿sŻ:kl9DpGc,Hū{\1m:۩cmw xv˘j>YkSc2=;ڞI`#΄ݤ*زN40 B6GbiGZK,У `)}$3<'u\7m\{JR;n fhTj,xN2hL:OG p3YF25x2I./FK#G&bPp,>Me:׉ :3,/Uf]G("fc0%f vXkUEC<:4(@]"l9:ϫJ>AGM$UuvSgrGoIrf1\cیIUK"I))z:u ,5#rDDl\K,!_)$dl_$%)v㉬egAK#5L#*U\$"/ rVE$Ixv!7̲sw#a:iF?=i7$G JovjaeR_ʿ`s f+R^WǑG_]UNA]~4n1j[Ug34+E`w+ʪyd g^3YG]Q6)~ܢ v͝RWH2gI6 Qb\ø{jR:huqDplEH֧dϜϛd9ڪuDc7Wvmߓɷu&VL6zOjgߦ'N9b 2-؂ LbN,IS/1/TD9$Ǩ)*_Z祑]8J'[vmqߊ5AQ[KbT,7/BPZ?Q?$ЃFM/ZXu]}_DN{M4Q~Quʎ/+<m!fWT&}'e4pbX[e64|6WL+MIDcNU( n`b1I1ǩz'˿&#eg[޾3z$Aw n$exCo̿ģ>˜*;G >9DsHw@1 W' ,alԨΓ~mbInEN{.F[_حDnZv3 B\!^v5z2? -O& j <'%~ܗ±8v;WD=kTai|W iZ؈܍\9' J@$lO<12e/j"S5p ȉd6yZPVvĎS"nhNB *GE蔐~_NYZM?-FqN_<%?ip-ց-O,j*kў5JmV(c2G4]NTɉεkw,$' 2(4ra)ģQt4122&Ӱ䕂r=9 5lI(:.I\nU+QF\KkQˈJ&2c5˵Fjzg2X1(L}7COrG&.+&wA+ *I%n~<4c%)NZStM6q:ֿ8?$Qw^x޽_Y50 Shqڡ74-, md1J)6%ȊA[j~}yDX&Ǖ+u.%^DFem;ZB>~J΂>i,u;Q}L+km i"/.gdi?XBp6c;*v,=Ce`2ZέFz5P,. t4Glt ]KHaCZ5h22w|gx2KEQusRh򶍛S΄edw*hhvPz\ v~0q=AM;dJ%h.utû \o0i "N@ce2 <OQLm[ bkZ,kFzIZ!!IkBs9)2ˍ{. =U)<Y$4y#h8,B|_5זie/O.2ӡ%w \SSh6.?wH %LG;lZɋΡ5xZhs iKut']5q퇄&v*FP:LޔǡE Z'lZrc0ēeOlqRhg244|j8$4yHȘN$L&ŜY~kgIݗ<9&{`R+x+Wtt/GRXH#B1MfӉ8zz?qrVJ?JW㹦tys@3(o,ESWKSt &Rg0hnXhtTfN I b71I &JM#gMsC#V<+'$4C"%Nww m؇{.ސFvXEMM76|M]쵁AMNF(N[3O)\^HyF&MJFX4t7a슊A=ǺzKiJocʹG=pͅ< @On|T.7yDhhj^(/?κm<7«aO.!F.(?m{9BZ l5W|1GUXJ%׮un# iS21{:j{@Ư4N LQBܠE5lQpl .Ц7x˽*4Ee jZMI'rz hgbl K&' )N?nu(j+&nAijamȺ̍ʗސM MTW881>͹ىbQ=o/-h([T-(Au$b60y/ц&< qyJ2#IP|GR!i!ȇr‚˭6 ZZ1i[rl+ڠF# b^fK" PٙY${wQW\ ]:P7B&ݣ?bS, @ #]杤\XkKu`n%|Z xD<$Eh!jCoH`hв$.wzSn!}]w%rHd/Tv9ZY6uR'.-,5;ꌺ2&V r|\)ygt<9nb/ 6,jaanx+HsÇJŧ5٭O"ORga:AQLa2 s)RU#eߍ+4#NxI997# ]Gy^6(Y.7\aST\/H5̑WƍNL#d<.JnT&Φ k ĆT%s'6 ,!~8@shaOԚ8?a;g^qHrJW6fLIՠrlH .uJRPuPNI#(lL@ L̻/@V$MNPLN3G^33ܶ8n֕UB%VN]N Qk9rcYHPHeizZ1Uڂ|"{2<ոqi=ANI{h&K@\Ĺ5. ,Ȟ`}ӌhAwd8oƂNܒ{m!k mSFhPˡ}}ԓOG;2,[ZcQi;AV˒-=q$T"ܤ-(_YNiϡ;(ѵkJP5f V\tju3gnm`7Tcn& @4AAjh;d@!lTӲ%7%CqKklLY4IG䋥c!_sbhf9ÔZ)t* oedR\ )}JrgrXlJiAx"M[kmcbtV+095>hCKw?솗΢-2t]Pq"F0r]@689;;-O`AɐÊ55+>eZwRrpSC8hW/-$,@?sp Q|LPW֥t܁G&5J'6mTu%c` ŋ΢[Jbwj$mT%"/`p UZ(D Mg(,F&nj3|=AfT5/YeQ C+}2U b;tH欇 ,iڒw3 J /|R'[zZ? f݃P7)]qlY?MV蓡# őX Hdg/I:9G#0n7 $9 ጃ6_@1b{ _4O+ɩMq~n.KM趚NP Hc@.{.,-wzT (j[d&NISs1r㩯y`ڀBsm |lCuAW3Oz(Ӗt|Cf.H/twz^F,)LNLP# z>BtFd(0Ii0ixˡeob״y0pzTZ J!bq꺆G1>ǫWwHR4ߍKɫeX| X׏٧F&:R;^ԹVQ.f2Q/=``EJ-R@r=мVt]~Q#Qs\ǵ] ʖLxRaahfC#[C+GR {!M`lz-D's 8 VM]PpR.ӆl݉bZ_݅sL@}ZnRqW$j'``'b08|v1Hk Ntυu$zy`k;L몾%J,L6JNJ8FZ@6VqY:ct3NpM[ 0?$&0Z:*rmbټA- =s9x8h ͔-K@F Qb\fԁ$cC"}wJ#dͯ=-6ڇri9H U$Ay0jw`]Jlt4(z;F}uĵӴNk42O ֪QY ŽT3:dҚoåQt"ͥR}yI"_ҮǂRGWGتˎAeJ:6O!ԙ636m4Pסe$K) ujzZ>ϵ%.H 0ԸƫC[n_꡺ڌGܗ Pepm`P7LQ:vOP뤓Z?OrXШB lww_+ےD\qyhc\:O.'Ds Z( ZNqV5xvqѮBllc IB ܴ6D^j}q&bt(3pmZP腐|q\QSF+k,ΥD<㺾λ[@<2<ͬuL:KٕYθ Ҥz\[7؍`A:B_hrHAHe\Pߑ]3hX@;G$0` gT.[./*`ݍN*0Fc)6S3nelm\%SytKushYY;]}b-DClʶqv}SBܒD+Ɏ 4.A b4WEuęoI9.!&w\ICt0*1xLWD#r'J$ s$<TC\vѲ? 9k&%xyC7K+Z)3mm.4.=EQd5ul$gdt"_b~6! (U:vc%Ɛ}bH,.+}v2֩!Q` #G uƨtaW &nr}$`n A~1[gi5c­.FZ} .#ILcglP#ܓdqiHvq)~r@_(\ځͭW㰅׼#{Tw6=,G:A른{t.k$D4v(ڼKd e'@| E3r $]y1me`LWoPL ;축(i͜|w/N kI ءY1h{UON#Z&Ty[flZA(G 7 262D vDA˩"_ht:4IҀ0E4ȹJj#4.T7,l$N"u@SݫZ\ Feؔ|mT h܁0*a .*øbԂu,X߈r{`:xIfr*v Zޢ0`Y|555b\&whBt mAJR|_4uA(7ԝ>ھ(g]9Nj'K}Y‘9r z y@ckAF-sCv.aT_V=/!"J*'w>kavgVui❼u|5$. =ph 9˹r%ҁet՝3xu!BVXSj-CTC7j8Y)7̿8>w?9SmҪ,צ1R`btʹzI+i~J hA Uމ~90a?m@D=$@ٲF80)92moB~]t*׈PAۊ E ب\IsjEEC L~jGfjE-7l+i\@3Wڶo;ɢI>$zJ4OW/`*xئfa?.GQw/E\O'̓ zVԷE"Ӵ{;0WuEZL:hH3+j7uvGC`2a j/6Ǹ\i="EŎc},~EyDS*k;h9 Xxu?䧫umʿٮuE5ho9gځ}۩[A❑ܢe ];dSn ps.Mޠ}Oڒuo'_ 񝷩;õ5_%ɨYX_]h]qJ/E L.Q\b*a7XI|*$0X2;xEha.dLQhQ"1%Sז VH!bZ=Z16Wpʣ7MJ.@5,hC;T r=$9HҲQ%R6ֹteʠZ\f]^k NYܪ$e0; DrKvb_bͻ $+渃 dnphš\ q90DWp˺nhꭾj9t2\:3|rW\&kw\S.fT/)0ho6*-g9{ nD?hZѭ ԽSu` (v.#PPVnFK?sa9䤀>yOd4u8DO.hիP2V|:1M\*$!>x 6][Ք$w_i_?Mȹ.-: *\A 4cNԌx.w/aژ6f:˹!v= V5tŹW!IR]|~4û ɒYaۜy0k%_ ;Ҧ<ػ>:bY<Ӿv{O/xo~7navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SB.svgz000066400000000000000000000010511221777731700221240ustar00rootroot000000000000003(zHcountry_SB.svgTo0xs/NBDЪ8V]zUF d $L.y7*&lB T6Qi"1QaCϵh-LJ7DRפsa94 Nuʹv ~~gkٿ@l2 GLލݺX^&o{dzu!,'`ML-V7#F};gtQ>ת-Y#K)PGz0/LB.ebz>m znV;)9N(I`HЉM`l>Jm3'{=0ltql=zο̟ FA pnnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SC.svgz000066400000000000000000000004161221777731700221310ustar00rootroot000000000000001(zHcountry_SC.svgmбn0w8]DqujnP0تkPbu,VdtOS]&5iBmLf9Nӽ_v<2K\ eD|q㬕*ӺYE#Z+9D /QuЁU ńAIcc%v/9A;:5',mIk[,m;҂`E2jMrRYei0M.~~!navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SD.svgz000066400000000000000000000003511221777731700221300ustar00rootroot000000000000005(zHcountry_SD.svgAj0E90ݺX6nJ XʌܾJiVgfw>X4{aUIyvϯs{]Qݠ<*}o|Ə.NFL**E~ݻ]}UOnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SE.svgz000066400000000000000000000004011221777731700221250ustar00rootroot00000000000000:(zHcountry_SE.svg}MK1t\=|ݼ٭FLazf=]t]8)%zι)S?]^&~}uxq{oe/zn7w;b/7Oۯ۷gl3gopw}߻÷}uo}Ŝw民X{xGQp+n/o# 6/oy_KޯכWw7;y~|X5>|x[:ElO]|sObMԖq1E_R׻EB|٭vmѹOK~ZL(Vڑ𻻇g݄O0t kՆ8>eξ?^Yt?R1Ox|G6gQywzhD{nfsxɋjl1{$޾8ڬ:QJsT'mPiS̙9Ԛ?9"gP.J?WG!߽;|rC-o\vM$[8iiuN@)h$RRcYJghTj8j(ybSyDa NQjmRXr䐷~l!r/i,mv9Tfޭcyn)'Nqԛ>1Y\?(+ z%W*k{:z~fwXFI1rjb0'ߛ*&W-d&P-+Y()WB{IB`DJbCVJ[s\Aa0Db,񙔎LS Q$Bt˱OJ' ʇ_DeV/Kդ/")ɓ>p\ ұOIUq8STU̡tuеJ/%Ns\Ӗm*YMfo:[Tx$"$ ''tHI aʫ&%KөtvȎMj>2۽sޙԉ(+hX#8zӫV˖@ز*&i"[H!邞$WQ>5vԪ4IJth$*%Y r9S(M YH1gm,;Wpvrzۼ$>-"N 1s5кLV /s1q1m^I"d" Y9c鱙K!\+o/gλE)W:њpɠԓxŞ$+.nl'v75 eM'-8iՐk&P]M+p}*JEjmz) j(&{^KMҫNЬPs$-dQP9 PţLۣ`&TԘGz XW^` N.pJ#NH9NG!_eS_to4hQA1!uR=6ZVY[s/p7dH&RWE_JF-Ƙs) )iQ&*%X.s[N@+\]8U<TC=C W -H@}sse-f[R#jKXFm5bFV2bI}DnV"yJ$L/PeT\ׄ>*>/>kfu8V ۅ9P-Û=xoһ`1-p JT$~L'T$="4 Q0.D=%$tR'PI|@qB .E[I! yiJEPڣsX1De,  j QiR@%ZAjRY(.FԭPP@erh!S}blR%ve/m M ^I%,@y&)#ʎezk\$H@K!F/wi%#聴ULj G 1k2ז9i X8$VaA >M+&ten.da(u:90䌩PZ<5K pD3)#͓GTb/L{!$(jA8|I4`)4ǣRЃGnn$$Z(V!Ȫ.bwk3~ T_ Gr899).ua?I-ǡ9lup (Xc`$&9.: eu\\A;/v4cb؏r)I"5EdVoBTe"#|͚!rE偭|Ognu%t|ds[h>4$ɍNX:^R A X[mpTV[p{@9`NL[|4pD;49CE+š^7@4HSUhaBϵ^Yt }()h +yl1v+e-WVtͽzGn+hEjO2չ[wȆAcs LG?V¡T ,O T7&sF$Ʋb3q,PHe}1$(/=؊RHlS뗁JӺKC)H|Plv f9A?jĈj\`큑75ϑe1d ;KrO$2!4\1n/Iݻjb8^) ߵDK|'?K,70ᚳ`Us=,ۣjU{M"$!ږR+NMQƄ W ںDZ*~,Zq7I~$1jX`#MW_uZ+JW&"{xQ`&īS7Lr^>(yno>kA^``\s|UR,.)8R#<#&^֏f OD uS=@>ťdF՞לj䅠d9fGJ7HkN;⊎WУ0jo*v^Ca=4 2na"6_ i7oz) 7|)u0h(/䪽3*@3O3‹&Foid(%ᡗA#C!{'Y%NvԬ5 ׶׉277uvNeì+dY6 Ewm};-c]ʹ USjGŰF5'cj%-b^;@XRaؾ>d%^_<] $oD1=7]eubex <6%`I8cEr$>3ѧ^z35.]jm)w/M€BJ8-VMRń&Ioo‚]vAq2Gq@DzJRfU P} }R^)%8Uhۥ[+l$&Woeٙw1ocȺ[%(TaZ b=Y`f>ᄎB{4P."˿!pv`HϊXD'p,,\6Mu s9ql(1Pknٜ͜%-t\PN򝅨AqmG<&utTMwNi;_>긣 1Yl#IiU!nSh2+NV|Khw3||>E{NyኛQtd {z9R̚--=T&ޘu{s#'#W/Va 6`tDb0&Øj O43x_J>P-T 7_Y 0O as[c΃Lލ`NuHM}?]~A,4[q2Ӱ\Z-c4  =p~-rLAʷ}gw튉^"W![:|f=ڥ'W/# Hz o~8&aGx@DzA_9Ŀy_]9 7dƠD[䱹- bway }>*77ᦢ0ZsYOI^&5 \qhCe0`eǷ@b¼iq^= PQӏ ӄEPDѨyGhxlIS|_YH]EǏEFGoumn ǑMˏ+ jHO^ԋMJ3v F6)66i 7Kn%A KC^qp<&( )~u%:/կoo.W«AaJcƠ/[=%b+00S2x|./䗇!ps8$60 8UtYl!f/nOOBW S-)rJdk$xڼ:/KvbPfxGiqPxrhC%J邵Jsc[[I}3CXaƓK"mb<|X('M;" *;їPvoF˰ -=sGǑ)pe._Y`uR 7<G):΍?t$O=f>l.ae:%CTyȗ_M#\J0#taO(_U9S՝qky-AGhQOh?D[vax] {ؼc 0/ahb{vpDd.S-eV3j $϶`A C=ކa|YnF7~ci2i$~oN DXCĶ.>0djE+ف36Ƿ$~ }XJ<.87q"CjZ#c=.L䬗zHo@tk3e T?\76VW;;h'w_4[[#DF ?|[&}BT1\fOTiCrdvT -@x\+]9{Emϔ|6ˆp83ƏiǚaLO3]#E,/5r+e"'@߱*+J:Y[mD7M)!ȀYT< ?lv=Is',FdɟDZ(oirfTZ.- Go|MYnD=cH"tk,ߓfJY٭}rvt_3x4qKS"cU<+Y w4<-SI7PC„Rkō56D[K{qg&{*G)Ql' ư"j M +hS퐴`QV?1f16"nʷY^m< 6RRC"#r=bw8he=d$PCoq1H_%B?nm/4Z2yZcmէ!J3;HJ<0&}`}:2,$e:䀋T]4V^Fpk 3.h`z'7?M4ctF=⼬.MLiwMWa*T IH6@Spb]tDڊh#="YA.t}>2W3/!q%e @zb #.6]+shyJ.Uk[bʚIch]/a5v:\.sXLg#-!S> tR-zYH1. 9q9.mY,#wgі6sۆ?$@ݡяAc@xhb.RumNBm5.F}95G]8|m({ UHA.9a('`Q1]蕭&Ⱥ6!k$PW19:|`[}wkfTfZ 8 *U8 _yU* l[s3cԓ˘o#^1TV{ձ]^h[iO$ҸBuz.V| Ȁ(2f %׬(b8ў>#wŤ]WIrX\t*\~#vO06pP/'G=+lai*O|)+=6vjF!8.vg@97.sD}pAAȽW\U;.=5Cqrl(yqhf.ׂDCEO)y<;9߳.h0OIr:mUGav6tk[(99\^,m r@-ǚtQܚC9n@j* :8=aM)Kq+?iҍYąfSa\iTis]ЩfZ0 Hä|[O4|$}PƨaXcpPp̍YpInyq2EVO>- IcO9fAF>Or$sM]j;&\iƤ6vmƂ+sjIƧ:#mV>F ) 7Y7eIS & C3E8_]/-JUGBJ3BZ0-Tݙ`f'TƫKyx8 %t pe;G !7a'+ޡa6!:37S:$gĉ 0$ gXwF'Y) ,cC[\P>@Z\iVMnQ^E!*f+;QT#h'iJhUhUu36ݖz;+a5s_SSH$lyjAh0B9xfY:x HiSUN+ f\9^cjGi" KԵ@qв̙OXu1,5r_c"0\dk?"rFRyԘuWlq}7N{ą/ip_tijsq;Н $2skZƲ@ ?`殜33 zFfft|jHc4Qu=I09}^Oip'CySjțRԕipG㨼<+%2Y©@$u;HpRwՎVZ18Y1c*.9LwLl~  n祫7F;Vd =ڱ$IJy~;὜tx9/_}M\*<{M;uy#uj<~ q)9Ʒ1ܚD5VY;`1y2%=)J-SS2:0]qPiȟZS&17?USmQb!^7v1,i>X$=d)cC"}QE&a\x f8%{#+mZ~"$批Jb羵3JeѾl 15Ǒ{ulTOVmfx߰Эzt!`J:r` 9ޕ+3hrs?2* k!#g҅*lq/[G5_vkTfҵf*{ \K)_*lީPŔQs6hó<-XOh!,28SdlTslXSY=Qة{#lZۯDJl}傩EL,ԷU;9p5 r Lč`2J)Hַ 0bt5ix*նIPyҲR:o ^6t02(Zks @!^vHԾ.`EЫbbU ~O'vׯVJ-l 90z|.ePmDg?3ǢTiٮ2WqTqcLnK /2ϥI@!kYrl?dVȭettS0b,v{cf"jݹ]-gǡ1MvX(/=hmG(Ld~T & H-8fٺzrR22YKŅ9ެrGZ`S:|r8W#P͋]X]cVEMz[?XbamDy@b}:dmNU~bΩ?oݵDl1xv|6k E0/tzYq7KҸ#mi@fnnUU_)0IjY({T0,=PYuq(iDrL/%ǽ葜IdLMoL=y4 j7V~潢K=m0Zo!,1Q^& ,+6"1XRqfPyw7q Q , ?`d_`~[_=k\Z6PEadkL9E.9>` `S8e־aܥ (`>F1+B -8dMt0m|g˵O´N?0݊sr#T]Pffw5.cUR0uL}Ԣ7veg ,,~B]E}dwM4߉&,>K@Ym"6pV4Hvt[Um,>ca#V<ۍS3'eإi8 I/pj)<7*;:0)~[ V{)#X)Vo$RqF?PWĨ&U(bfō*njvv|;I^ti Ldj풖Uemޫzj6.fD ,?󷉺OW>RyCHlEKé<rP*PLn M\H4F.<XBHʙmiD%77JzLRByxfA7ؽ2jGyLx\7 P& LCF= ݷZ1EWYsY6_;6y3\0ҼDe`3)9'b+ 1}JpzkrAVYDÀJ~~_8u5 v:]1igtʜLpu.tcIt^V,1[͙O6Vw=^^{@%U߳g5͏nN1<:4^Fy)ټQ+axgMnHPiKY6l|[#%m'$;A|{#]"UÖJuRqDYmhYzSn8*.@uҵ8]L3Q::-[+=z?PFtX$!kr'IdK 8,^N%*J(JB};U, 1n_O1s½4ڦ&)F4#bv0TN;iJ j=4tlenc wٝR=Nc{"7Zv=gXR gO#OvڒގB"]+:]+i,U8ϛaŷX$Prʟ:?&/u$'Ĭu=-7,'3yN5#٨$B㼠7FHG^GH`cm #^rNQz9[N %[)6]rMcFIK%,dn2g]ԏIJ$vθ8gÑ6;yA /|E>弎/GۀA6,bE$s|x'M dp&2s>>ŖX@T~x}/lA X[?N 8T^WIPEoDT}c\Q3nMJ%d瞘q Jq8̨̎V.X>/D5Փ40I6*d:=&;jRHoM{E<~]}]Fg?Q@Q1X,Ε ɿiFQpV.ȩ)u}+ ~!2D_-5 t Y"1<䰹.]ixB1ޝB.Ig"Ug^T"3i1>"(Md5/E?O O05'y}]W[@tO,?xPBGkbG;'J3-#ŋ<)hoǡ08nu\_(,*FdE]8x~.*VvJ25/3_d; *Q[xQVw&ebik|^sUeÜo'[FDF~4ӾX7wgO2w}*ȻC[@c|`7?eu¯ ,H#cHvA2ƓmOqh!aZS8eKcFG @%*չDܵ'Ľo+TyTgN0ZI{ U /Ɵ+pJʰtɩ Y+ɉu?g]0Gʧz-El(0jߎz|&AWR['/sZ ue <)gNj7M՘]8{URyTACfcd]$Wb% ^PT=vfYa1Q5Xӣ n}gLj;cE^aYQ;;8JTi<[p16ycF%ami5!WJMVls|q:V$s~GJQ;(hD1Ik)Jٌ,^(Y6`:ݨ(ױw@bvTޚgvEac|ͩYD#Pg SY" Nz#2^|8K rIJJ^"RC2qG˛ۭԝ3 crҿgc"{bU3bN}&JwDxkGk:p:3 (}/cg<<W+[a8h1D?KCPd GQ HKPFB_nm&Js =՜M/([/oM{%h)(j#$̩I&2S/L3,ۑU-VAAʺ!06Q6K'a0{YubZv4Yػ@"̋]zMA*Z|+^ܣ^ ~`z\Dr|91 KCۜG^|-سλj~0rIB@c"xp+ kW8DUhH@Dq9'7t`5簫JYڬ>4oY7|M|HAME('( ~Y0oLkvb2Y{}+~֐&WymQ]_\)_V{`vB'VW(eVvPMFVк!06خelG8tB%c[joF Q dLHVG[YIdU ݓnU-Hgs*H>)UdըG|["H:I')Dۺ6c =jˠ/쭅0@`FwnsquQ¨gSx­I-=Z9LBΈrbR2GS1ِǤQ+6/HLY9:]w7!Fц>;" 9jd~K<4qČz!j$6]u Ug.nefv6&?WTvfc%5 'a,kո&ԹdQcYD]֫ΒQuϟE#R!V!V1P Ը7S>8RUeZ G@5 ʍ dU WvAAYUfy<K2Ҝa8׊K/ -L'CІvc@$bY%2"PdR =Ƃ!3YUM^,fʗ!|1 +]`2mF6'2H%G?8*i?Ο3>(% P>q$Ta|7AypQbin9DQmy<vtD/Ɍh>ŚGkĮ9hM>3Ljj_9؏1@(X}^RQR6+5ql 5g]BՀ/zu[dem3t|V~`N7>8B%}x#xP@y8v\IXӤF3ćlY 0b`#1ʃ7(ղ7QariOv$|tY\A8]m  _@V!]7Ak#N2D5 +7$BDH: LH"ޗҮ_FWoApjY*s[!Dcxo5>H}df_^W:}& Ex=K @ʄrsApH"5_bl6T E^pV[37APƯ9T{Bdq=AجwD嚝Zqe&]K{Z@7NKF grBuBp(<!~c@ W~Edm٩!X ˘ƒc\8'N{MNCA= OF1ʄ !a4F nDJ$R\)C8zU,7U\OSppK=O˘B0&X=7=}U ua+?$\NyЅtp1t LbV-س_ޕ+]%H gCؕJUjْx\z\VbEuxUUe*-Fn}0  !yAVk1h Y&d̮p`/66Kx!Rtybguac䕟;AVpQ ; .sUrt>*Ka MG-|a_vF?~crX*rtWN$7RCt_n +Lv؈{a7@ s`pެ7B^zIB2˗vusP%>ĩWNLC+ʍpϵGvs#h%:ak2a k:wW~(_wΒ0J+7:M`Ӂ71aWntn?p UR-W~(uzv?Yڕ: Dt>EכNUmছ:pm~F?Z=GߟF+}ЋҮ(S)`r!Wk@GMx:|c?EiW^IWa"<3)}ЋҮ(FF։lw窯Ժ_t Z !qpݯܕe =W֕;A/J +Vrt 饲7H>Ei2n2!|~ЋҮ(`XU^nrfd:fRNZ~Ѕ1D'wӮw\<2ptWnt;ʇR)Os?CiRRHKo~pk"%b.OZotc d8Wnt_7Q6#0aǾroruN_ !q6K(ꉉ9ʍ~p]%ۛnbt2F?,@f֒_nt9YF]V2'}2Y?AQƞ˃K(۝_V&$@m\0}6rlۓLbC"ܝpǕm_SΊ,ha侏uF?)E ~F?!7bm~yۥfcs2n`']Ie zhkzOz<*A __n+JoW_qߚ֘"v FFF_yO 8,i"!?=WrQcf?ޓ~=9d1ߙ(zGK!9k~F?ƕdlC&pկAɸLy%Q+7:>q2dpd\yO|% N9zDx.pph;leyF?鮼'kT~/'&K0J#)čfFţcGÊ0XkΪ Ai\vG@:'y* @RqH,aT3./PɰO(6#Gc8o;à:F&v?4Ƣ(k7ӁקߘkfX;"oPR|g<͔Tk`FG+z;5rBܼHyA;~tgՍKc\O]H ZShONM8jV#2'?hTpWkS+ɘ?#T‚FY%HDZTT*yl JtVu|,up*T+sB+8ɫ8Rv_}<> (ɉz°Y`2=3mc:q y$źԴB_(G KpەC*? `LgpO0SPfJ'^Gj:u +0}|΂NFVVyʮ|vA,Ӳڹձ7Gd+ޥg@ duz%)X;,G FƠ^C MJWZc咐 ;]ƌ7 jKQi'YTeIfyJP/ե*)NXnePo`EԜ`@&,i/Y&{YqzK_YEtd*2tt N y$ye0F;ZNJB|`dv#] .)W"%KŜ L7fp,TV ҠU0JG9]XI4%ɍBђ\o C&P. QiDhpgx#GFr]nӣEVrh!6*shS?uUAMIYX!vsUxG2n-#2[sޙK_f/*0c{UaR^(i(8[\VM8)l'ZC q LCmjY19fŚ]J(/^VTnVpbTqЬ6fy䅯*ψ9<Pg029iVҤ&J'qgMO<۷QܚwN覕6* Q.4*Tw4ӠQ3[;K9v=STRV)!e*f-b>NGoc51Ac@b؞YxH(\nWUZR읰y(UΘ躞[m!Ȫ˴]gO-Рj㰿P,e2d;Eo:;s9X$aVKrr-H3Yw2I Pzݗ5kGQC8挪Lg#LjF]=qgfL]q {SzK[4CLST.+wME)V׊:;qk> Ǽ$o%rVخ4\'N0/J*{+gJU<ǭY M%cij>?&tEq<-F|AGn 铳ti%TV =7b#=zS=A;ŭjq5QFٴ\+'`WUPsJY.Vhjwٍ;3?(uVP|w]!à kTڒwaaO4=ŭ*K|a:L +~"DR%LUOt@3a艮Ԛ:qk_ =ɺY!TCBJ6DhijfluZJ.Mg뫂-D'?إt%eR݇Ջ!WKu oB%3z3w1ZީgT<'n8ʅFK)+82~"bt1 j6e*e3tɉ%K4xuSNa1V z82:ٜ Uk FtBs^\> \-hl\U_MȊ!+6o˶h]ݻ (&{hY2m؍Su=@zn֫]ʷ]tg1mXO?TuMaA 2mr=e+eW2D(Eu3)X,Qm%`k,%KefQ9@+Pp=$rgN KS:9I6_rwbO}Z[rID$(.^,:z\Vi M8 ߈%e̬~l` nìkWoȉԬ4&\RS/ &i ;`%dNkcAhgMRdv66~)H++ L;pR6&d[E0OV5vPk}Im<bvfq`mQxEe}DB|tzϣK@=QiexѶF-0ôwк͵ejM~ ڤoE\=3ya1Q-;*+g׷f6suMmSm^sh!3Nhy[!Ary>q7[&Ox!:m+X'F!ҷ mV:+r18>{"HقU |m 'J05[{#PsLBg&`S }CnCِ0ĦԴ<7=4BPucR L6E.Hw0D:_8ZZK}JjhV9 U *ʅPCn4k+mt#T:_[@ypMRFNۻ٥o7g#!eLZ^%ڷnD/HhGC^$3-a>KB KB):̈6o+tSt,%֕}~SU*94 X&$`*0li'xP߼Ra>P\K}K! Vɢ/e`Pzz}JtƚˍzKRWhTJq%'ր7e B[sAz;2Ǵ@E]eM%V;m" }lgO^+"`acHs90ҎL4)> T`\aJM%k' A&զ±ĉrF&@\5IrMY8a~So N9:v ˊzXuv9p&jRׇvHǕt%͠ h=ey\cЄq -P%0wՑ`;Frb;2 JRl3s4N>HLfqT=YP(&0 fb1wZ;7V6haJOŸwNgO@\w6 cR7 6D_ʶjQ7"؟YMP0x%rǩ>nRmt‰ahl>u0NΝGێ'vܑFA89jk0я;:5R*mn)`(}E;,ԏsODL#EZ!i!%K]/jOwTp<7S. )+{vI,K)'h7vϙ*;PngX# Z&u3 d`|bW!iJЊqWS39JqG?h~nu }):hs0u`fSYSǠ]JoLm%.Țҏ+Ns!' ÷`f~0wp;mEak>Cu&Gќ4q5Ki01!ߠ!bf<@ἴR4-MjfM~e2sfdl`j3wىU2}dCx!/xW gԝEdHnL[S9-qKtpag*D· .QV ' kٰAy"iQEd'3A'}9Jo}2haݺV\El)ͅ0>JsJ 9m^\W8(yWb

{lZzx%ejҭjA_,DO}g6Qfϖd|;Whs;x0٢so QֱW,`nmZPcwT61k'dR'j塥>bRN`@+Ef-JHԤ 5oIYʰ Z~h5j}n֡[I5"HomQDbMRv U2-v@PJ1uF)}T!UTbZAt:6] 18a&{(!F훳'۫rLEf󿏙/GVvE8^{='ߔ$VFڣ(ǟ64LZ{ eȮO]s)w +Rp?v1jVw5Բs$9R+9m U2Lu6ԅAԒeR(D%uy4IԘ0X$VCIBrJ_Ͽj ^i"}N}rQkZF/r:],)/7诧#־YcY19;Vki'8p%>ޙwO+FɌI} H{)cݝC>_&d?q*-'1pի(=mM{z٣tX́OXz J^dUzżY_(a7Ul2Mptm3ywY~4Z9}1aن/d!^'u (S2ު2fTLX[Om=) cdRm%j;CťjINs}=`5~‰.J7i+k.19Srn7DfN̯-֑ÜC=qvaf=4!)4ԀTNdÌ=?8X"UI}sAq32wΨ6a.t pT@qdcg&tWU*D߽̅Ҽ*6Wn]BFѤ:ݦk錊yHT߻&K/,!S0ȕ^, Kf3FßуQA:Gfnxkj`e)qmDPXn;L24GU55'%Cʊىdơ5zGN:28G.csu/,T .GA?y`GF,P®m P pyoN\,3T}] HZsXe6.WAfSK/ tdAw_>ĭ[ JfEtJ4XZw}]c4cDr%PV-aܗĢP%ya9~y!"_i\0NYr{-Ps #o*)5S/V4cRQ]tr!=28izB?<ڊ=U0]ެ bgXs'!#'JU}PxG߹*nlSu eѢgf [hZϲq4UL].(!)"=1ӝo fҖY_P*#V·]m `l. r"Ȟq>.oBP~KtG CVbFŒ!t%=}aS+*@Fm$Z䁏Odi/9Λ#2t㐾;¶'ox`1BvrPAP;e N26q(ObAg3X&ўg*6\ 7qK[hx*#2b`&ngK;bNJ(uA"-3>AnVPLO 틐bMFQT^ ##I|ij mBvGeW<\o]?WRHkynw#轚,ˍ혉&BXcr<^`z!ޱnoJ# h"=ޗ>,Og$HKIz׹ lw8g*ܾICkA*Ņo-yXY˽Y N7QJ 39m/@a Sz[|ow^u"LS.L3x5fqwxYܪ 3h| c*z2OUfQ`*K)@Ե2&&XZYݲ-*ߔ?s8ĝQwE`ZJ>$ːo:F7)ׇzm'7\R̓7n sA exq]m3s]LkmU]۠u-x|!!n ,ILKŖeᜥbѓ#]ar &^O?qcy)~hFA+ ;H˾Ki.n68Of{k'c}YӮ&&VZH?Мy ,uC矸5VM"( \[z7#)>òW%$6feǚ ErK,;^v]*9 AXdA! a,js}(QW(g7+iļj~Gs>=ψWD7+*ڵd,Ċ\]p.\6^4é2k;#< Vx>:M긷Fǯ5-~\Wd,{390cGfoRBv^(E: E %/J-DTj+a*InUHN0P\,T ^0^mE.@zbeBV1{ U*jLkr Q`+0΁=a}ݐ>H@x{6 *c z: B<@\P Dmcq3P+>1(~Ne8 pZ9#gZra ?#w1{iqx'ޗl*uP@W©ưe3 TN43mqsom2a h/޶̏хS3v xh]c. \S[;:$-tJH|ZSs{k/ 69F䕚F"ROJJ03d%>1sJxXGC閌.]ONhm*0 S7IW^CS|w! 58+)*o0eZ}A/]XrGu0*ڕgM$O@o~*D?CO?qoי?\z13bpBƒELZES$^7Fe*%oBtԝ,[;1'3mhauC vO1N(:sg|-SN|mDEqIV +\֖2;;jd'45~GMd7m;Nb?ǿ_pY( |H7?H$RM?u#&y' k_M2ߛ%kRnz=JE |b?U᜻޿a?/Znavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SI.svgz000066400000000000000000000054531221777731700221450ustar00rootroot000000000000003(zHcountry_SI.svgYMo7W^@j*~(sm%Di~_vk$V>XSÏ⫪W۟~r7z}/w?nz>\{_v?ϧaqz=L~pxxems|w4a | ^Ȇ|[Frpeoo>~ܽ\4t{wwO ؎v=|?>~_#//I_> X)4ϼ( F%(0ً0ќ(0$6?O9'*<#΂sQؖ,3>g> D3 IeNlcšfΗx XetrYB S<$Bgy"6l^Uk}D8G3i؇f+㜜y𝒟C3R sT0PʳLq%<@L2G!H},|fDK5sR'{b\qJDT8,88Rt-ugʈ+dL)2!H$eDƧ[ OyʰOM4-G. GB1 GԘ`'O7FPvZ@;- + \gsJD|uO8: =I.zUZT$UhOY(+ [[h (׉ D^ =EͫioŏgJZJ2~eL}+[$>}ߟ̐}|!vm p{@T,0n|GRIxL!z|%-:Ts]m8̸L!XN $-;/[mqxrtyDQ/Cl,  8agH))Ni풤KiO=H$W% ҹؾki/E.ԏvXZ4U=04˪fsP~*)|vYJ.f$|U͸6d4H%sB9GL+ǵrC e8"QઍkXT:V ٧Z)1.Ş#BJq%F|"8Ybty  V:"ab^ڀsv! E8@G.6ZQn$ŷ.ˍu{KcgZbnE<YnJW5@R$mtM9YΟ6[A] +冫$lR |9c&n͊+^!k}!;Chz 40e؀\3JX*W \ACa#%SЋ h "g0UV)k3Ij6T-6 iZ*1 i8tAAfn ]d 99ii@^I"f *Xl[:9(o#nEN*hj ϯlů=L:oQ]_nkz XiIXw@qns8 C8a׸M+>cC cX>G13 3%u8$~r'm\5?q@)ٱ6)8PFe}&t,3t*navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SK.svgz000066400000000000000000000033571221777731700221500ustar00rootroot000000000000002(zHcountry_SK.svgXMs7 Wl/͌DXL3ӓ{kk˲Z[Ȋ+re'OICȷ$黏7b{ڬ-6r^ۿ}*ms;__l֋y޴޾:Xj3Lnw7;9y||4l֞[ۯ檑" <.w6nzX-w6o66tؕ +t]nn/WWWˤp%*Z'R4O^,8rwׇ&%#O5Ky$2)TKh3>:$q6M"D_3; 9Bօ  d Y&-$G&Er~BQL6^qM(a煛$eO FM `'`S#] R&b 9or΁+ź[ղ,82v`"ё%np#ʹ.;to0T46ܐD.aaZߗ-ťb7v"` D(H&CYcsVB2xia P %+z|nz> j3 {b4np-vbF؏3zqq~7nYgb{@zVɩm_vޞﶫj ~x/`0y=$>Ԃ"ףÎS O8לU0l2⨐!I,%xoi2L ܼP o$D]@ -J '^ҢM3S?jNe=߻?@$ O)#);EB3&3dosr,=lqnI38dd)r,q@BAxSdxEMhY#MsRk#!u7@xEeMg.DhneL}򃑜F! V.Qu+iz+VZ n0g{?hRءx(ih^F($AF vH(zf<*23z8RIlpmD >”-/4`J+Y 68S +G"4 H:gR4 "Mr}<\_e8j0a`J<{_?#GT گRZ`5YzU YRGo%bF, `%} $'ˠ(|tWTe ~Fوrx *sFmNv{ίf vdg\R FEYrIQDFnۋϕ %d-<@8\e?#B9ՀP6NU ^H&x*{^ eA=CkC'e#_ܽ,<(xRfbŊ3-ԯHZ!jG5V߰B{+ ;Y GNTrLr74bd~I[)v ,I17v//g!xPE.R_I;`c+p_v?ӀG[Q P}>g)'V0$[03.ƪXǺ.)P'h^$!wDvܩץ=ERmm(}.襶DAKc!Y̚h⌦!Ft !'!R`( Qbbw~p>ɩ'M>Lao:n+navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SL.svgz000066400000000000000000000003121221777731700221350ustar00rootroot000000000000002(zHcountry_SL.svg Ͻ yf5'jyu. 0ɻ9kyޟy`҄bjz9˹]YSF3 @SG9 sc} g@^NPX!V0Ʌ!a`WnR) qz:?x&FZm h귊mvܼlɛ? AL#navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SM.svgz000066400000000000000000000577641221777731700221650ustar00rootroot00000000000000/(zHcountry_SM.svgͽ˒m%8cObKx?A()JI$V*}8'"toMFbp8o _=}ۯ:WOO?|oۿ<==7o?7_-ꇿ)kӧ ۯFП?~ L(~_˿?}_ïs?Wgco[_W_Ϸ_ӟ~07ßw?oϿ?}o|{k_0W#Y~;9?|a:3%_sW~ֹVwޟӓRlmSbm;qSlm6NǕw*ܣ]ک6AW\bw3 >bSZFjWݩ[|8pXm3pPO}m6>A_d9MZ{7k)l-լ5c;#B!{ v׿7׿o+?7~ͫaSi>ӧTҞk9UfOgsa-ߩFyTYØdVF'{t{VdRTfWAbT2;_g@Jԝf[$k-Mپ헳}ex\<e}W0+6OYPٺ.ṵm\[sêawGf߆ͭ>iپokcMVaF̎1Q0p!sfM'sm{uAoҔNZe c]ߣL'ϐʠF ;hzg} ei`Z\\.]ssѝ<,;_khI۳qakq.IqPIvD ;6ڳ m5>t1GDUܹK`_c~䖸0y4.YM P 1fA{Ya\u^aW )0zoaݱ=΁v~>Av*Wܢ_6pN.vڠH1=`⁘AwUJqzk#NVl}xsyS;4V,6<4ٌY(`PE#ZQL(ҍ&Ai)#6eOG+دόcf߷-+xg;@N-߈vwk=8g&<5P6&资J5FO8p/aZ$%N F9cD𡜄?+PjOP> e}y1!l{U+}# Qs* B=Jh%y`REYzP1}6teBIxolj>G$LI6-R*EcԚ}zMps(Fqiw]>1Erǘ!븕 K :K@%#s% H$&ԃ3CkB~a5D2o* [Cۧ+0]O16.CJs~~s6!^SBH ʇ!;GJ8.%_imZHo 5:U}m qU/mVr nDvI)&=dR¦q[h&bq&ePm;Uiŗn BD8a1e#4P7i}lψMPd l7\R,}ه7%5,t>. 25|JƾЇfƹYn=⊽R_cSzQ_2fnbW1{5?fSkſwпNM-w +fD'F~2SUΝ`و^)Sb|qJ7w7tzT_Q l;i|Fi<(7kVF@ tpf '(xϖsK<0_5z<B  3'e+uTvlUDSXi.I 2dU6&մؼ%Pcr}uj~.d9y bm!"sA~V]Eb#wa9n~ YRcV8wgMf#{XnƋ G#"%rC YIqL|oR%|DQ4oBSPbSmVe㭘yrG9xf78pIщUV_"eSR\Yyz"otuy%Yř6;#ʳlG˸OZ9WJd8{͕g2P+"5JV5xx49 E%?-IoQ \,>^wGNGmc05f|q};gRhg!Y1ip]ܥ̡mL 0bƽ 75;`ctimYP+]R, Jum>kJT&^BzGSh$Q}D-ͯxa]L %%y96M+hxzoBC}9>Haoh? h,LNh&Hl#5Y3 :L=@tajE j66b4H'f6{Nf(2KYiNM?GZXOʅ4#V]u^͛*כƺ6cr!)Am#<&7dq5v\sJ-w:p2Mj׵74P%ywt)G?o>d(B\S^ Mu uNuAQ *da XK @#gƌ[G o4\B% ?Mٕm@Guu~3ɧTecDݴ^bOe<-f\313:N-6B'7jEx^#Gj/׆NZmօ'p  J ̸k7*]5|_\|}_^Mϳ(BȈGzy4<{aSڟIe>OW;^&9bZ6'7҉< !E =ޖ N&NfFpl {* wi2l } g0t)V']-31̾?e#%[cogl^`vz1vyjKv-D27ߖ ?&\cRvG*Td{ ƒDpC,6E־P-.x&S[Dsfl]s\o6m@x Yר*Z"#ZcSůqy85:b) !_bW`-D E>m;Wc??=!x'hIUF_}좋ҏWfY`$ 3PXO0DdMy3Sen039-lm8ڣ)-bWA1~)øb edϞ5 娑ҐH_򭄷.!9(- ȉe@ټb,YaAڑCkK9[/;Ū4z] 늧[4dgzL],g*V-@E [ApP]3 ]66;dvͨ:o AL8cx(~8hpP4Aь"c%FX$V3os s%0F4$H+VU0ԡ'j\y@Ϲ=1~+3ojrILR*W3 93=vx!k}JjRYc"/MT*f"0a'l >% 4>F p`6% _0(;~8{ԉmP@.26W2P  l1s`hm8@QI \r?BLkԍX7ez MHIt*6Xp9@yPQzKLU^l>_TȤI(f2hpEWȎBi)\jԘn!y|ՉYb k펍|2 cU4Ih<2T`,KDQ…T5$U g6bɰ x<*`͇ s+BW8A7r8c\dAa;` vSb}1YDbkr`A\W74 Y1}iU#醌>ݵ!zu殩Rb> RD}864Uk(rT]R tw˂W<cC6 RH۵JzMPo%:MM34 qv%Pgr3$51P.dj.+`uñS`AQRhBuw@fJ}!h{o>f(N52R`CI o>f(B:iuRV'"/' %^HBTjkyH%J .tǴk)1C .Rl'W$w~ *k>ζГg2WMMׇM?7b3%vrHO%=v< 3o>f(2g`.#Q5&-2cB#4)Єx@2W1CnXw\#&mhhfL  U&֫BpD)k.9klƓO_x̐`F_s\ci?7VnBƱ 2T%G1rϙVcY. x@]рKT1ydl㴧Hl%jN>f`3iBS*T8>Jp'\3f(<(r{60>T!9g/jV|Vɍ^OU=ty}ݧ& ep]O;L>Oq\p/4}84&/"zhN&RHd}8G 1뉆S@ 7t_l9& \b79eg3Ξ.4rѥL54ZlnNk粱$m=3cL?qr >ŕx>g>ц"<߇`'$.%D\}8/VsvAq<=g-6H П 듆\ʍhZA \l T)Lͤ󏙏 %VtË =Ñ#W\aGq \jPOW'~!.ed_}l9 Fw@sa߬ OQMBV>y5H0W N!Mg&j;h :TWȃ.{vt@j1zc;F;^ qax@}YZ؁ݥnF)zA x Qrbb:m%:FWhpIT7V3ȅ+(ISRB `!p1{^"3-fJ-/tւ֑6r]wܒGt"EN$fo T;S&7BAţt:|tv1AR*73Dfx PCr.؞Vi)]pN9,=Aw`ɫVed6f cV뼦C,pߴna5ۡuT'=Vxر'0!e^5YTz aZ-Mqq=Ob֑&6Bd*$r)s+j.kvbsg%DSrPחq0KB8NL-!8NJBI§Vm|̔b皑B4(#3|{F*tjA4#F۰CU"fD_>$N0A9~ Tᔏ;}< mA#5Onf/QJu>g1s^ud0drT+ai_(hdw2cskqίijM7dWYo.`pW+*q w{EZ/5IGB?/jdJ>4k3fb+=Q? krst͠*Jl5Z+:o&)x sFDFbpm!ORHj_}b76DG)F>fP4=N+Bݬi*HG7t-;x$;^F9x5wc/SS=O ߥt H#&Ƚ l!kˀ^si1N *0uˈ+5wn#J^I?wh D9W*֚󁡐ta z7E5>PIK+h*$=#xd!BWOm^ ޛV7 àf( LxsENIz(P AH˨2~H"A둙2[j70q`FYx&y! `u 'pjOVMkWJYuS)gҀL|0 cỹ%c xftš㨞0mw=':H#I;1ilaJ#2n"^LLLk3sɦ2̔+#!_Gd B w\+?8ƂzL i䗥"!'- ӟ!_H2UV! fUIHlvar`Uϩ&.t?bK?A+/#/^P3 ry@ʂe_U) [z窱_؅D#/>} 7=m){wbJzʾd7<$8KP8sls@7g@BH"8vn=oD-H~n0}"O&2FS?zD9m޸}9gٔ34|p( 0N FDnz#GJbΛc\HXݑfna"`Zf ۦrs @O ~ xd M?ۚ_^;4NHhy3{k%\1_H8Br|S"[ÿA[OjJS=6}x[UTbh;PllTc<@ ޠr7?D(*"aRξAMJU;V ,oRpSXz ;ѩ\S7flu܃P2 a#uʗqCZXx00;".iЎD$Lw ^JɀH^3 Em =\3LPց$72ג6JmqX6)hm*}TA%8($y%nH5yi _RzC"&-W]RQ 4RV0`TC^K}v+T`l)$mp`?آ/i&)c7ЩPq[Tn !" UZlij6 R{L)7Vc\%90$U|%/\3؆c; HP@AQoG5I=@ ,{phWS_gɚ{۬e¯0WclYXN_aA;D^}hwd}WXhvǑZUPxA4ՋZw{ZJ]qCVWeJ8$a7Y)Psѿ3Q-h۾rv'jOsZбT^S"Ѿ>ϑHًQ`!VrrhS;}+liO.;Ӻ<72INE_<*7RM]cQ`jS= ,-JpSܡ6 AWFqБaZUuB7~&U\uZj!kg/ʾ+e 8Q&| >8údRy=|8|&q!`:-!-ߐQ883ͯ,.Wm-t~|Lo{%#O*NW;qrpiյj,%6^ԩlX&{d>;]> Z: <-HިWQAEm/Yv"a,; 祝lHxA7#IfM|o IV$ihROKcAAq!ll?E{OO} M!ϧT6oM[Ow!pLGQ *cǚL ֡"Òg: x#j\>1#i6}-+T9:%= ُ(=]_DP0eEsfm+=^'-OL0%yXTl%ÿ́rPTyp xĒۛ?-/YYS#PA b+L"I{ٴ=o[qeț1ױ{]̈́÷!Oq%V5h8L*҃̈́:|3U͔-TP0v}?S20p<|*}"j)|B*sw_]=I(lnbxs"D6k{\OBHYɧѤ>PDyX2K@5rL22ϷjdG-0 ! YWp2Vĝ]C:W4ʂ`/,B`8{ϧڷzZ|{NK,HѽlZ`Y6!܅TShB!A-Où:)_8NǡP<]!4]0l(CMu!.7u 4(?Y:Wa_bz3[k3VzdWfTu2 \n9[ &D:R߲yd=i+FRsx'/(ejPe:m rg40͘v N6rykWmHޖ}&NZ=% vmKq,D!۹om\Ž nCJ%4 CSGm:>"|k޸k(]Cy,ƥ[~(]V jҕOHcڦ(5bajk3HKvRtMR,-xSƴAlTxIP\&MI&1<%uV`7.50km$yIk#]ΉJ:%U.r^ZdyKUT)!Cg1U̾ b6SB%ʍʤ(ICW.Magb]p 9RKegZs ļoXת xap=Qo0ʩQP9VF߻OU!P'6*% Hin4D \s#_N W9A$JT*v|6L†ݨGi6wؐ#>M" Hy[qن~󲪅(yL> _:q@A0̺ST & dRbub*QE'-_ՉtbL9p.CЍ(t:1łŸ3G7Zubķ)@_-PJ7@\!xJ&ຓ4䝍 ^t.2tr{Eu6pٖ&ζAw~jEǵQU=4GF9-]~[r P/T/e2/'iBsC̔2k[* yGD#6qu01GFBmԅ՜d02y #AWm[igV*7^6@:Zy8[a s|"Jn<=raQn$Uem@kE2=W:D*K=c@v7y-bF:0<8̲׶v^i( j(d V2|;e.fKe6Un2&:F[zUΑ]hӰ.DChLHRYf}'2vN&i"ajs"pFP6E8ڄ|ʂQ1wKj5O>M>KIZs>CkܧgΚܬ;3шA{xuHgF ce3R6 65qKџ~˫ IK`1y,%n%_xh0&6vč4$w.RL)+ ^(8̗S6Õ1x!)=kM1ďclR 2<`y`G)~28Fe4D+cW}L{NQnyxhDq̽y`leN%6O{>w5(#m3i~t`ɍtd^ 6"b RN{>` 79q! &f/k%~4- `P 6S;d+Lt4.10ïb} C1c cpk>y@doV%o61IށY` P"Rb0ecQX MJw c?8CĨf͝ RM#F+ͨww=455],Ei\Ms,%W ~yxw R,/A=~0vf)gn无I?ZY%eR0keRfd~ *T/+Y_:&ˊ6f)c.无I岒쮉Y%aRN7,%T0)}i`f_~ /+ڗ|Y_%Je)^嗠vBuYJs%\⸬ k\e[~ 8.+ږlY_%:-gYbiY\:_%Z,_WbiW\⺕_j%ʮf+WUbiU~J/n:_J%]+טsvQK ]4S1v,#:q{=5>:quȷ6W^u c{fgMU;lXL[zЋr'ǂV~y~w5ga7>aNP\B?1?i;:  Ui>9ZAbl:.e[aHweO2Pg?Q8/ɝ%Zmr'=4ǚ<YiLG$nIvg|.mXg\%Dž204>0LZrJ`$ojݏ,ޡ6kȴ#Cp-]wCc'G$_,UˆbShfҥaùX4 ϛSޡn6 ;||ԀƘɓcw)ۍ<;uv|N2?0/ebEUeNKlc\̳ "wjŏ%6knxEdxQEKגH">Y.a[wEywEvMuE؞RMv" i '۔GHqR-7fwʹ+[ӏ</ª<RTVLYSf\6!FD gij1{nTbSxEBg2|+ dJ0|F$Qp//C4S$Vl5 Oն{' C)k]5+S ThVq{7p5cXsq9u)<֜i>k)k}QZ BE\>9Z&;Ym~<gO;-3 _-Ў Ǻ_9WKÁlqmF=QU˒n[?bLYoB&? oc}|8 1.4;B5Wwp$$}έ؂d=<(F/5Ȼ'زh[8g^ zyXڵRZAYeDqKt |B:B(`Fcd>+rSPJHcL-=ŠVU -{Χv=ؓX(< tjĉ i pm^]ƁO4P"a*hEIuӎ isTEHC#P%C Ӱ9+:F=p>}R@&N 1j1d6{>wr/C" C@ms15قY f9~Knsmϲ@P Me}k9R[B-sD)!Rvo? 'y pڼ*,яgyPWH 8OEzu*_l^U ,g't ݟg"3i6Z9/t4f'] hf0/NopE?U@*M@2i~A]ýlE^ .l=/MԊ ushAGG($ѽv{ {=wq eK+'Y)yI*#\@9{ކj9 7Bf;q NF`BٵGT1i60!sM^NMgM}s;g&(F<"b6ahS`'\M8ùfk쓼D&b"D@1{p4s$Qa,d$_8I&^($O@.~u$:^id~ It"`Dhx/Pq(f.}:6*/%"%YWr/SI2/eJ7TΪin:/jco*LuWVU*g[Hy}mʥHx XtfԖWU~%wcSJoamj7}]ާrVY #.NtY!_5e(Bqx X)cQS*'S +m֤} nA@#22(i6hO:Nqd fIF /vZyTu0F 0Ax F V\F;t@^ U-(5*BklwOK@`I*Y8ᔮt2tti[#LԅqNr;1&2oc#0cօj+ R5ī)<oMU Ku_n/46-&S3"D\CM1g3eY"Fij3@DHbCI,8{kʍΏWnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SR.svgz000066400000000000000000000021651221777731700221530ustar00rootroot000000000000006(zHcountry_SR.svgWKo6W%AWzgj^hky;¨j7oC)'ٴR l[ʔ(<ɉlռTLJn8[# >Wmki[k]'u*%RM<ۧƲ,XjMDRnd[ 3<|@lնو &A$cSRN4v^rcl3ubSUW'Q%{FB0ѪGF5d;-wԎ1ŵ,N` zH!#F!c騇='?~>q{XR hrHO%ϯۦ0d*zإiu{xBv3pbsR5}!ϑIA} <:e{BuMO/JmLTFyNsj{>A^HfQ2`8 g=1fI{r/Yw:cɚrBFՋ^v-{ :YCpFޫ J0Jא?jq`+}_gb0ߴp[ c?CKh"D<έ 1 E|n cy3Ac]AP3-u*6A+^NaMrl f1i`}2aLy(f$@Kb8ǒFK f686XA H,"^a50ZGO{2B-$5ZBCY!`qRn/֔f)KB/^`L4;bߏ3Rn0y navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ST.svgz000066400000000000000000000010661221777731700221540ustar00rootroot000000000000000(zHcountry_ST.svgn0 y M@l}[VPv0lAnщeǨ"$ϳ{ؤx(Cu?Hj2I7mlI!vVD)m"7 Z.o&dzok>U`z1B_lc]foX nQРq?< 4Rf`|rKF[SۇD)^ϛ7u-3HS썥e= >"7fnkI=TTPA\2BIR~wbuz=]N/ϫv]rs{s;v}~t .;Go'ba^uƘ <{c.ޯ>dttl#?OӵU]O}sn&wGX|Z==.ayy}EZ}ؽ9)ysC~Lm> ~͒Sys~qnsm~'/˿/_~\ݬg?Of[-l߂G' ڿOoU\^eDagǡ[Q}1>?a{7Oktlv1M-bJEY>@`^;Ϳ^=νʞ7^5=zb{Yԅ)"=wsK& D .: Cw t9Eȵ`;}W}+tҗ:>t׹uX|l.X1<ߚOgV|Ф }0@ȘBJRN/[{E4%3_l+6Zw~=f,:ca1ͱe zNalJ .K Gdy B͇6wSj ^:;3tiD s'Kgrd3~д6ߴ`7Ju@ /܅)Y]tiΙb 7CR _^EG=pF@иOLwJ,cø>llp4UZq##&czd`/3D`pdΗj͆ O!2VL(a"`cW ΍1PY ?s秌ʎ*B-XZTl0O618! lSL#D6+3ٕڐ 0]IU(Q9א7i2l"U{6mv)E=BVY:/]' $X]::۴?mB?7 "{= ^JKtVO1@< ,|p|^/ҝ( I䐫 Bmm'rb-{r*3Yd;&f2yT@&fFNj! XxHq"{12 Iu ǷevZN@Hת(kݟȱ` 5'd-r+@ \YXK <}c1jTe @#iH2)AW&DF'-Qr iȪh2'ZDWL"۔j9yh<@eXp>?lbm@?yl;Cƅ5u}pʰ(+-i]d'ya;a `V$.TP!ζI(`TsT}j5 RAA9H[Na{G/T-8}d>g )d{0T/L5|!|ze@VZ U,493DSuX@eL&;|x K EH s$><Ѐl8NRK˃&֦gAhNa;d8zF?ޛgE{/8M27Gւ,W}^m#Hd S_)NIB; +CtL^^֭ؽCO:LPknAwV;?4 w룖8~!#I~^iq`[mcdeF6dxJͩ~usQqD+i3bjIdA4Nߘ&(IAHDD,rԓ cR&U8dd^7Uٶ h5\QŜg?j5\Kwr`{]:ZlUfZLxK@Yׇ '`B? (YFxj{W[;=Ȫ:\ O5Z)iChG]6|_|o PB.Gñ@{$-% cie 9kڒi6hKg c؋vl9 ~IFǪTA)Do4{]1% 2h 24 i$0[_fDŽNy޲NbLfցT uNIf -6 ƻČ*X ɽ윦 m&It?ÍUNK$$᮲k@:' ;BlNfmVz+(Oٴ-wO6Ϊ;ږQG$tPS4\1@ 1v*m)@2[ 9: ]{t@9=u}r/3N}ʹ^K"^P6d-UQseM0 }AVX٢)N0KʐL!0 gR/ƴ] _Ssފd3"c͈ܞ葜ٶ8:%l&B:fISE}n=)_譠ܱ2EȂ>)6w69/Ӓ.D MG7rUը*7ۉxjW*[*4\Z*a oE$X24~oNV*1ȉIڊ|QPEgӐH>ŴCA"EhxAtT{/l8e'.%0~2i;%;3O7eʙ>{)}:lݨJ'Oy]Zw^֡d;sT"L_H ןQ}ulj %+Gׅ|O+,G4d()an@TaPЊ@dmbaUtڎ3C@"Qձ{WO!2EcǑ):%3֋ (B'&$A$]%Ԁ]K/¸G8}'Pퟟրׇ 'B/q)nw UHEj~ kpGdVY3]#uÄK YPt=XP%K "+Xy9RCA.3d"魐byo#BN+0)k/H-F(2&JU20]WIE)AФ1$VC/̤ ޹)C`i}j&IKm? aМkHhxT Y}\60b ^ZWG-r _ zHYBGNPC9-oMI'""PQ?PY`'nx?ijxdɺIWGOT`WR$aAX6dRe(Fz rqTd=YtQ2>ﱇ!6w-)^j9^"IpGʾ>j9a e"1Pc?Ut[ 6g,FgR-,{^\ GITρ?/9R̼O0BPe[;GUw3 WM8E/B!M-a:.P'U?צ2}–e"Ѣ(W!% +oSR舱kO?F[x=O5LdyY5 JmA(1\$u'(VTN @p>WBSB2k)%re'RPֻAf}S1JU|}}1*B-m>XLY\xJ !c%*UBu{)0u~O EsW (oOr zALe%q<{W6''s%#KW߮ !|óO <YGR#x#<$}qd)چo^2 ߼hF*QB)2[}oexWo&Q ckS&!$z.H&|_nυ3w$҈]!]b/: 'XbݓjPb"r߮wfj3xAl޶ %>UF6 Rz k@\ 1ɢ9,͹gۇ,({h pHh5 Kj:pg}VBI:H؏%xݢ~,u%7gl΢ )džɳW>0- g@+!* ϨᅧJ6Y%k@t{Ǥʰk*_u8h^u R&s'`/Rיz2nu%3dRK4P!0@phj;K1ۢap_o_Grt5BBoàiRUFo3fVJ޼Mp.OVO>v2M8Ig:I _5z>|;z,29JYb7; I7,دo_y>H?s_oZd&6&\w1e+ПmEҳE4 [i}]QaAzC GIp:( ()Y;/;~uIê$֠Ui6`&oTקٷg˽ :UOOѾ]:piV$ȫɆV!}R!aϜRDQzݓM.Xݔoۇ:pO()Xj*I/0NXYnb>jUY}P߮w Ҩ 3 NurH6.tuk8"]E\u4X6ɾ[dѶJA'2DC!rd Tnv$AmCl!22I7#jWՕ[ǯ=_KIp3z32)hiVH{?%J'T/z%ŗTA"K_Wz+Rs`keEnkP&$ˈt(L:d@{@_S3UFK鉴VhIF𺥅XN#14몗[_ ٜtr.=WҍXH4:̸غi*, gG=ku7S[+"2eI n{ H[/?5׍ ,^oFOv\4lg Y OL^˴¤$b};sDٟ?hL|Gf$229x9]h2!,sEkFr+c-,xh{M VJ1Qk$#Ѐ AJ. otIl^tؼ'l"c?tX%+2BJ^4tWawoӪg ׌Nm34#l'TV7pY3kDY碆i9 =l!q^t~5 pO(e;E&^_F^oFvRdǖzSS؊Jv'ah%|1_O@ɹضuxlWCcEJ%HɼJ+Sf%/ f1Vkng *meZ%&VĽpd~Hs[Q6B|Nz%þwz+i2bЊ~[hY7:i]nw9]6I*KWlyL_±Vb"qd@,N{ˍ~`C:j@wiwi:`+./bȍ0O+?U va\a$vm4yh\9$Qu]5=F|Fn-Jjegx ϧ\\v^4m%V%٨GՄMBTU$eǭ3;y!׊C5o P++S6jpIZA^7(inӪ֏7KR`Seʲ bj1D])T) ao5d2\1(2s@*a?Iik c^gz|kmOs5-җ018d 0/6FxzIokm@']~ILAOmd1cLFQ!_m4O}aW>oׁ;}Β^8=m44JhH;cC!l ~F@ Ko!᧷v?gQ/fzJmн:|&fe0o7v_/%ۀ"?:p0'Z!#Wq ̒ d!O }q {IbdLR%>(,1F"| Soh%d11O}w.JCbaK4.sIFd'ƾ8c%cWPs/0YrMyݙ2GmJPp5p+]&jf&)eHZV{dҠBe_nMֹ|>7u.vŎeEf(> åp$`I'wǏm^6[)6 I-O/MZ}KOybl?e%0J_Lg\ Й*S0r1aD><3uά+zVI>ez:a4ؓS":}_eGj2-IqᑕeiSHHôFpWwwe߆"m_1ǢpeaW9y*a >~5ӓte}†kjwXKh ypqV+ÊZvC_ppFybBLʉ8N@ޮwl7^QuuN.yqD.<_"OQ3 @xK>~]׳-K~m D,:'#`[cSfLj; sUpB2hB;?<  ZTca+[^Ý@O&k5/$0݊ N 5$ݲy*Ti9 2ˆٌ#Cp29 fV_yܙ5y!C;egHշ]fOb_fJ&XJX.)M>&[#"&| Ee*a\M`y@, _g 2gV.RrɎ何h$9ũal:l%}nⰱA߮yZuS ˮbS҄5yc%R$/ؽ]ngug3u{b$#SfhlЂX.q,eŌkH( 0Zc r`V)aˈz`GHC_|EJY Gd7 E~xdaS^JƺLu#ۗwq[dw!Z~)r_.x]yXO>SA~- ,Q+pyLpۮ8N*cˇU9վűc,3Rϙ8s7ۑGٱ"DTg4IaL$:c@5ѯ?Ec{kSGQglgbF1uT'0_ǮZ8Yhܑc,H=910 6!‘+\K`F?92a/h5_Kig1a{D8)}ìmaDvYP) o?nLQ} G>~L-RƲ=ξʋ5_fd2㯟];SsH.PI{nJE)^ 0D ]yp$eN}J!DU{AVu^א1LE^q-Κky)>+U\d Л _'no E.$4uzK׋W"2(p{Hd"S8 rkS#þ/Ӽ yB@9/l0rv3S?,NrTe.8GVH+C2tz`Eulud=JF-rEqrE x8!D mc_"k.k(7pb2 U4?$B.(OuX'|!@nk,\ǮRdZdͱ3&kCZՕДd<::k@]y> Q'whܓKek%b>QEOBw&Eҵ8*tc,yusAd) Jլ4biX󗨉Q h&!D=1*I6fn!id%~ 裂ݪzNWDޮwnBV+R>4g? G1^ e&}/Vvv۷sISAn&Jr|;" Y..Ƙ_ v /ev677}견Z1Q8s:pgCLk!~;T9CnP) J mdч|7ǎ>*vrc~X]|U*`J Z$dF:w5cJ2U6YQy_҄GsRhC&YW,)rԭ[~Ǯ-a I왾IhR^)lP-U J䓭l}Psёɾd 3y2-}Q=k')dSj̼a@ $Y?SAOaC"q}}/X>eJ4cl~3S%o]2r+)tz. S&IޛP9'G&*^Y(Tbh8!KU%rBEbi:@](Y 86Wn!:7&QjeYyi#؄@čߍ?4}eߵfFv3?an짴\ g#)Ld-&ju-gDWoܿ&sY+] v^q%dץ:#͗2me6 b|4tҗ3[N YʭF 94-~ Vِ<٤|gڔO=m ۴$7ؼi4t]ȣyݐh7y(6!>Tej*a6PM+*} Y3zp)}@Q$H'>hKbIT Ľ"/մHot'i&TAvfAb CK_M$2h]r=Gd&LNs=b3⸒]v668/{O8IqCoE)WAC DyZSCgP#; @u N>Kt҂n6SZ]\iS8:T F3hd.M*p&.2znuyByoׁg]Ee`._6WlettA":B" *9Ide=EU:2Iɺ;p 8t[cah;tk3oQ!+C Om/cMjTHdU94MM㞜Tp:pg`FƓx%؁;7k$ML9R~:XEMsb@0Mml;lmf /l,CQmG'<;z#ir+{¾bFwVIv@cL鐱pBpKH,<& 22=XżBF,DXɵ(^@M< .#ɬ6a9- g rNdK#, I3>o% 4VLSJ2.M _E>юJS%#,[;&P*'HO\A1ya;C<)Vqge6e:QJ u}vz&8z 2vd0eLX/ (-6y~!*~zƓjk.VL*K]sE=4KG7yo r)RCo4Dl\bnzjS E3?YTC+G+̅ڦFY0s-WQ6Rc&JwV,-|4,dwE1$TL6Rjk Pe2a UH)uf M8 ,!v7|UFPMQr5UU&I<YBZ?|g*:qd*Q&K-[RQ_PE, \&5 Xˠ\Yy[fڝƔƍ21Ôprs7F/Slov*DYe*neSwG(̜^63T Xei&[mg] ]ޭuҘ-T*1c,!FhFOZT۴U#WOch{-XeD~ d.Z}w&'R!Tǜ9Ih%(2+^T'Rƒ쨒8CfV-T^=eHA2N3r9%tb̠|t*wI ۂɆv(q4X9T޲Kw!nuIogeX5 ,znWp "f4#o!-t\zGQ_̎{E။?#c35L+/T{LLLJ"9lIcwB[X4,]ЀyB~klәEC|;;|VKeN]TzZ+YQo9VT0lHl&%u"_F^kLSzzδ2G K0b0 =兕MWab8ަӈd:Ęګܴh1ৢwğw%P^<ɺpHU {KP!V6 ]ҥIqg$nɗSQ㷐U1|`5vUr knYȦ^l2@]*`إ^汝b q2!̷[;3;Y!7Vw@%[e@IC줂I8xA15J`VRgovh~׎ Iv~AʽBS΅\f8 '%GX̠)RmAnYPhax.TWM|_o^ҪSV}RD0F&iM7)KSlXci4LlrAItx\ cY6YoU1&U%Yrw*z'&T@1i%;7o+%A_ nۈHNY[wd1=yf0ͫU0X4jM$Gn\%KjФ%gp]*Eڔe:diL/)К6KP߉̦5\Ȣ|&Bko; $e-aT҇|5y(ML$"Z>X1vk ՆEd> `""Iͺ-߈uvъ ȥ_WQ?K4 )]U3­jL{,0E]R5]RSKׂ&D"Lcq0 f$)8D"b.b\7f_:2L,3bfd3.kt26iX8 _$?^3/$])^P.w8Hfxch9:4V;vrA_Ar*O4,62=e|l%r^{ x&_H翰̿HhI~&[ܸPNMIB6yo3G;\XPD~a \QtX9IhֿHyEz}ѷD^Iw?*iEAl"OcCUx݂&/zvٖxroǩ~:]tz}#TIeu{3Yz(mXt(-.>AmpF]I kɰDY,Q;N=%iNJؼX(02)u30SUQ$FWsn^LrWiؚ .g)t6qkخNlDξ tRdۿ ,XTJUPL2RsGX j(|VagmwG#C q6_/l/k&H`j, 14m [iB1tIRh/RYNh%"jb:K蓂tAaʰFv98-gFr>)ڗ{Oa_ 2zlxE'k%,)1x+*6 |oryAEt f㟣Ð[|9XVtQMLK׶ߨ[=uv}Nڶt!~Òѿ>8"M!"^_Uw -5m~@]&Eciϱ?~UC<EDa\HfۚPĐLH l!5A'mvJE6R֒H̭K"K_]$ږ :sp1O _Yo"U9"IFW]փDGzH+ Ҕw uͷՠNe]\ \#Iu&H=v}Zp;uVP'-Jo%trs};5+]~E#:IIۚ٬5F?R\ɶlى]v׋M -.gqH?(~[ X*'}q:(sxNYMuԠ*wiOxPqy[}rͯt7hl3] 3g΁;*  Y|B ஻4rBSPͩ‪Ar#UǮ\nntߥZ/!nlvZ~/R䮖wPbkۣhGv> vpnv<bhÚ]:i:.؊Rkhg)V{3'ˡbhx %Őۣ&S7)oa2fGfUba3ҏ󩜐6h'ny$ƗiqxxA3U ۀj퍫6oB&ܔw9MRDF:$N "TS8˜.T}6B[դ]3w JrsXwk&r򞜆)&ZbZu7KH {̤&&15M9ԼKV ʦT ޽~{=vRٕnyO66<_ |z6rt\QV8){>9?W9 I c:yqEXN3ܮ\)\ F< ]!˭/xj}S9⪹iV wSOf5Pc"^.)c!U;ISR#a*S v ?D<];.VbI(G F+J7yݍ?j$`ݐw4aYSr@#xzjq)ڡ_WO|񰴋7ySy^b{gTSkzJ0`;;PW<.xUOsOq0Q/d:ڪVL$+vrߴotaXe`{|99T~e6RlS w76% j5ܑ✾! i12|Yj,I)eX}h{L4_N%&%U/svmiǞ{O ~-y'nɛЛm~x=0{صcZ凇Z~)<ǔ*y=qu_'ډhqV߽ǭҶE__bDw5Xƛ-?<;>ofKnzw 6CgrB̧CPc a1lL~m>o"}1_Jx;·3^=sx&̡gvM39%6W#cTC?7*/ CC#iKf\z_5o,hPu-ٓPuCq5hJS(m8ɝ7ѠNzą!ݍr{4{yM(dpK**Ln"p܂rC{)ʕYHRоSеcfbf?zotje*k쨯[64|**ʓ?Refq%,Fċx5O]<~*L3u3Deƕ =^4M*kzڵx77,OOR.RgJ#*R#PL$y4eh#ڱ![Ss]'(`4CȀt+%eМLUe^Kh %OUkcBčlq ,"]D+ĎD_v:E4ܮo/lC=ѹ&w5Du~3ᡎt ð}QqMϮʭh{߮>]Gc"Vl'4y?b}wkMv< Q-$ ' C vv(859nYPNJʅvx9UDzM#/rr [`*k,p'8h"Vu:~,ӵRJ~xOן'<]6e20:ffs>i*nࡵeY{9,jZ]׋)Ǫi㺒Mr `I޿ [;sy//6RW\EW‰Z-m,;'u:-w'{[Sֽw@KE)? W^H@s%K*:@+n3\!Z|M^]{K w Uw ݎ^T5c8k960UNuhXķ1Ҿ$]ڗ\:]Z{?OO?5H+mԘlquypK uK'lե">D8xuw,cߌn;sEʗ!'KVRض,Ȕ`(כW9'p+ G+* MJx .16(.ŧޕqz7WKŕ Ln _?!u$!1ka\_\i\9"i7zH~^%TՈJـy4Rj9 A?õ A0/,%力y6Ru:@(J>K,y3szwp%-(6EtN[ŅN.P^1/u:eWkq]Ԯrbװ :x;;$XttH>%6rUeŶ_,ffֽ]^=L,=X5xr'n7\2&` 3hu%BaspO8v.]g !oGZb|]v1o>yug_?n6l]% 齀%;tw@t4,l^6 K].! h=~=@bI  'vyw{릤i7;qC@wu:n X-qx񓣵hEWbVawe~$3Wz 1Dnxl k6~BN t2@W`G*CKmB֑BwJO*O|e|3WX1u`Cv; 4?]ݒJY|}(v:RTtuЂ" 7@akӏXi/΁@_ X2Ѭud+XKkr`'7n&%i4nxlhΠcB]i_.1صzp:..VmM:3$ v8xmׁ  B|ˍM,>d'(J52>Ots{hwL3W;.(J;]-k<-yBuHVMtXC6}ٿ= RVONj] $71ϰK8u;x]^#01Rl`q], Q /GML+=X,] 6MG ,Xd8{.y~ų4>oaas`6r3!@Bl"qoQomn9{,ޥIC6jBYNJވ "acM4 ?[0Vni=8(9%,HIE-J o&PcWU?bRf)4MMꀕe1 %~[.eWCjꦖvO" N֧]ts,D+JP) QHAԾ~S%Y/A1+qPu I"c~*owC4V J`$(ҹN*35CbWR5K)}H>@/''!:!(c!j~rq /])*}bcY}Y1myuV02ԩxnOaC ձ.- Ys/·T$W+^b9+D 1^w/d凾][e|+@4Dy\î -iMs; `={%)0YvCLR8?9FHMW7,ҥOS:xܙYW7GVĴ{M!:ʐJìATȋn~B=T<ʸacϵ4|ׁm7=픧i'ʯk#kdI;Ks=0 bj+ƙji j/t[h~b :AsמwFƙf4uE>tn:!`*TQ?˯aHr݁rq55vpo2ࣂMF_fCt(@|Q\7%O>nljoDu㴙\rUdŎ+nVj'ffF;Iigpb6|IhΜ`fAݴ'}NPZ(j7 Tf%yysjׄ~vū䡛HKɌj5 tY"WI aKvèBQMx|WskwC&w)9[Ȗ"~ u3F=yI6ZX}`ꣲ_⻖NGuWkW\e,oY߸3/}$3+˔=P`}WM'0p]ҡcM eJЎWT%tɀK8<-n{zMe#|i'B|vcAˡ2@ӸnWj_USj~)8bAa)bJ+NBPȌ8ES"l zo 3x-1hq{k\1Š!CL@~2ZF#C,o1[ )E ,PFf(cPCCc߄PDߗ20 e4OM#[zH(@$c#12ƣx(JC[ {2'=t!1D;"o Ӳ2b$"sV00`a!hf f|X"ˌf`>>9Ͱ:;-ŢujHlv8w[4~32Og8c1q gC9Er9=~If<3 s+1+ ϨBC;E)+a+l3/-Ia%AO .O[DPih6/ 4#z'.yxe8w }ZVL#3 pi$۰7ΐׂ<םvc9جHleA zm*wA pS=ԇ5lZghOa6_1^D]#szoOa]v;lYpCܘWͳЂpWV9`H,WyI}6p(kVG6΁vo u7 M7ub ,~ӓ:CdwCf9<9#l9Ϸf+ؓeɺ[\oCUuZ)6]_UnJsEӈ-~fLsZY()6y3G/&Fe[?sqUzY|L sqθ>W.ʶg^TfyQ`ZT[aZTlo\bVT'iẘZiQiZK{iMTmGnyQqԦcL#1m0d`bT{?r=IV\d\j+Lf1e+]Is%R]_`3aNX+J魺L܊g6cZժ?ߵD?_&P NT(bAZg RSB3&c+9bhx&)IQ\<Cjlz01<VoJCuV-ubja(UpA2Z{0ӂROE1.K4l"mxUVHV31{e뜡&eݍ=tyܨh?K2gd7]:+9t(Q Ps9X>nG R> y;rg+Z5YHwBIfb'yO"YDd>63DȎ c 3UR:P 41h2-h5 h}*\h4x ;h1؎ ,Dffb|qX*DD¬ 0C2NF>wHUT25u/~ZFV16 Kd%/0-/'AV>d8 B<˭|F!1RĜF25/Ջb.l2i?Yd>.d.n) tʲbv'3[w0Y.h{NweC, ` 0ĎXf {*B`Xv};bzCz :$S`j9|AZ'wƬ}#'xq|nd)\\Nh1YX/ QHU6|5Ed<0Χa%}+߉Xzjr?b wh;dAG̯ s2zd1/U/7.Y}Bic/|&ТxIl?^i}Kfn](F9Yd|?@ [OBA@ ;h/^>6#'fIz\ 9nqa&3I$: ,m6Ȋ|>dzΚ~E 4'-PfVUc?Ps=E"yȞ,㗏}22|gYl](d`uQXqC̼ȅXȀ>0ڄ ,=5f3c̵g)MYzl PY#ÆYUZ=0/rau]E|}깝/J͝Ʊ+YYQ;lL`3jEa&6s% 6;AYe-݅ܨE[k39E-52)@4c֢!$3Yz 2A>Yv>f 5J3>!.V:!c..\ VX qKӑEVxF]vXT# b>keG>ŊXEV,2 |CLb *z-0 nyEњ70KOYnV4uBuI:Ld^S!ubIݩY/qw"1l,ꁘŋ11_I&eI,ưCR> ^ N"֞wj;v2wEd-j+3 ,$fPT?= `J)R8.I/9 %y$_9Dr8hr@őiაOEn,HVb.Ęw!K9{((dH;|w8fMmd?<.dNbV1JnfUdttI0k]0s\ee.Y0хىX*I%.~'b!5fRk d4.ZY,m [J4bQh8 5mYY_ [ MB) __PhάM@[AG fmYE,r`&t +bֵ~ >b.,h^.!YtGLU- NbY'b`U}ρX(x1 [aV{?1႙$;fT|Yv3 6yf-w0xdh;xRt=w?|`qy,V4!Afec 2v\YaVz>1+61\@ƃwAV>dQO 2.z@f+jd< ZMC2'bN] 1F nGo@V!{5?nΎoq,4CÉX]2 NYL8K38 ? 1E 1yW KO ΆE /+_I-/be"m2 t8̫ҝ{[~4e˜bO$~A&5 2+6̬*saV490#άڔ:-:x Ҙw@K 9rsvfZT $kv.3,\YGDuBV; s5!f4J*6$#&ZJ}LBl=Q(^g, d Ԑ.*tdqG^fEB 2NȚźC k #EyohrΡ >d̈;f]\|KܟzbL2yf¬ d^s 2I:0⤲ 蕲߅ٻH;bY:6.YTiY00+_0\gVn7Ai/ЊhFg@θ Nx/YOKh'dȶX!fevby!Fg$`&?` --rVr{xЇ|[Ҿ"fD!X*XT򱉘bqRdbE5,ZH8=$ LE^CV-YX0b֏ p̨B 3+J0s*ܞYeYdcEKb7#u.i?? b(pALKiFO$`&ZiIZ+̠ccSB5[Ĉep+ bƊe `)0VĊVeNļ &igE 1KYIɼ!f1 hXehA,X~+;`+X˚ `pzv_ 0͜xEͥ2*^HA8"fqī|"r96X0%gꅗ,zY8«hm Ga@ m]x+plaa ^MO֌0xWm#|iK-Ez?Ikpwj\S5Nj^ 'Z/Vqpvl`?a+-+!QD] \L 8ď.W:aF7r= Zu٢i.KW ī)mMGZ<wFɿ> \1ݫXʀ$KMZ\\qbh;Z^&Y"yGU{pO?6/W Wg9XwfWv_O&b / {zը=.\IbR%%yx7X_вWlZnƣ b51zQ#ՏܧB+n[W\ .F*q *X]Bn۲ė_H͋E*' Q]E*̰Awǂʁy0n7*7HOTMcʛj+*Vdbg?X`oy y_gPwsOT Tn3Nj8qʱܤ0blTEûfЊ`ASUjNVN4&ZU‡UԒ=d\8麬 ŧVNA]ZR ԉU1UXP @ȗp˩00?SxnD*ZbX_)re qԧS!+ʗcEȗyj^0|9߅TTH} fbܦ3r_dzzڠʳ@%g慕W!DJVHQa=HoR!^6)K R=!PYP"wuwē_P9-y5]\PX-)j`2jf˧n VӢqkaVX5̡XIӕefX9g&047*SZ,XoV]6+Wɐv:hDu6 eCJZrW|SU sV1b~v3IJVXMJ&bNuX/X: XI`k`ڰ< ,ZO$q@%7]*[eHq׋*q&Tƾ\o#U)/`+4V՘XrYVrFX*S,57qb%']:ㆤ-c`g+(7z9RC‰UQXDeXt+XydUb{*SAaJO'RR{>EDerhNzs]7b@*"TWEV"eTPY ~BekLJ:Cn+=r `(iއwBRy%Պ/Bߑ $MR%dOSb'RvHG۵#߃TynB=FUR>j~HY~"%.Ej-d0N*P:s8C3LPW.Mz<ſ ?(v4Mu U6mźoͼHwߔ#SwIA(+ʚ@OKrz@Ypw%~V'O8r> 'ޮ?SxXDz+}j60&N0IJx:q-l⤌ mhfwTNSᔎ '|>q2c] >Mlyź؀a'N@uk=OtKE_{\LJ]o8}1좧{݁`_qStLjXh VlKXPVOif oL(1`LC=uw n ѠJFx0y^*5(lmeC;O{=Sxw0ZNy 㩝mZdmA+LdM7]ݴTF7ʘy Xpa@<#TP z5^F<)SpJzXv9A;[V<^NXmdA}zhdnʓv Um]%2[Fqr&h'jL5rҍ"r$(S9P =Gs*jqW -tbͻ,g񥖿CkY:W3{_=s{ uӏ{#5e=.C&?n :i:{萒s||0̰7c;>3=Yci}>s,ۦ8{9CC+;B"}ٱZw5yalnܱj_=ty&Ϥ?8Oa’=[rybN$Àmz3$-<ЇʽG~8 d-qBnW#(j=&u.l:##a1fI\وU?`R *"J/ΊI2<}UAb Dؖ)ՓR3 W}HzC gɋ̎K8_~)?_gEN/)I]M_JTn60g6ڀ5 j d2TDDXn >ڼ{,$IկCp3R)ȁ*'ދ:f>'2A_OK3 Lw|nFO Eo eI{)h[^;%WlWZ"Q yTy.0_Wh 1vQ/oׁߗ5r?e /-j᤾-R' Lp Gm8D$XΏmT!k){Zl:JHtY wae&g1s< u'r+~s~{RuT!YǐǒO RY)J/X3g K h!b%L:LhKwRU *LIkm:q5|܍&ޞӴfE`ڧ]0Uݳd~(-p޴5GeJGC:E4_2;Ul"'m܅|SN/%0aSz)nBT[tsEvm czi=p?:ps@orGɗ=D:5 M@P u@718a>1:9Pː:6*Avo-C'M]XdQW,ӭ^h]fYr̩`h^TvLt;w73Iv:a<*L@w-O R^"@MBԕ6׫(U{dq!%olKq)3&}[>Sg6[ yx. e[b,u٤ɆkAMvbI-o@z+\ zH񜐔 q/j=Hlȝb$LHn_0:4ޡ(ud:_^8f3|P271Nnb CLw!:g=һӌf {+/݁sHcT8* ¡&$5J6sTkWb#`$q7!2l(7 /z(oo2j(!c/Ƙ99y>feؑ^(vFQ@L(|=Sd h:6Xobg$ݷ^FD9E!<#'9_ٶ.H0 _?8UGMA TQ>P$S9~acltcFIH8`7ԝ"g}FY!X`1e"*!1 Ċ$̵(.E Ptˇ(+}JqM֋([G*D붠$.?<ݒvIe02]E-Ev{QwkdwԗU-n&Ml^Z&&jjfUn+եY]ݮnìͬsl3:o}c}14 겙7[zY u5 zM l#>2[iz[M*b+Adʜ+GDtmoN=>Mڦ.:oUE'{q)h(<>YcV#Ё:1c@}CZǬǧL42Bt"wXc:wšۥǧM:Ryvږtn pONIq:|7:j_NܦFDGы'E4)i|Qr_ 4Q#':!3%*JMkkSv%((<~u $/b5Qn0V![;D*h)=>ڮ^ZsqN| WFI7~4L.7Z*Ϫ&vכ &)TrLgHX)ި=>ڮ jӆ[WƏh$6S(w[bDZ|k9/ڃ_xuKTOĜeN\F$$"H^9mbez1 l.̉'*"^p>0IAH> KxocR򫌸cH$m|Y^h-fѳƄc$hd6^4yh+E`/o^0kOk 0ev:W{cw ~Ъ^]lsJ*צSyXS,x#_u.# 3{ivA Ե5m7oj_REVD@+nZS">}g Q nz7^Iu#%arYgoԚ\@Q0WG{zL>wC)qV^swE& ~CvoZ$ GפZ8)y^Iz3':r F?NuPYEsh'E+t D5m_U}|]^ĒyEs4?Hsy !J> RSZ:sZқM/U=<#RnETC(Rec6nA1/wMS DџWr.+Klj~o4㩢ۚGs|S{Qu&EuAG'|Ĕ:\j8HES=Txϐ;h>IN=K}rojܚ 9iʩX3^,eÒ:`Zje *)^嗇ş۞E.bP4MJeU ?Ou%^EzRߵ7l`Kʧ6^raf~#<ӫV!%2M t))wv t^+{{l&V\Ae3ˏ.,QQsIvMn&3ؠA!90TՓex݀wYTe^zۜz2-iB[gMxX>tCuY `D(ӚKVNQ"7V%2Zבa?eez9Of<~])]34 /л5l2c- d#h OLԢLVvì{h#c:m~ LL-'I†1Lۥ<~[h…x-}j熶o+Wpe<<~w#phf$nvp┕@ E7߲6Oq~lB;..IC=ĕ9LU=nTϐE6I-_⥚ mrNF;vF/vGY!jivPԕ#z-ۖy J͋=9#mhh~Mk4rCQO{MFkCi5f_Ќ=%&*s` cF450VrLC}C· R~ZrV_Qx)~O~g?cg{8߯,g{Z^t)~g;"GM{TK{~p~7~ϗxS/RZ.n ?7W@'tZ/o_'ϙ\6]pTrQh(P Քّȃ S 1iBC{`j9>/` ɫpk\088w&sd{}M]t mtEw`Cp9Ap:d\/<>rv%IB_"<*p㽌]\IM܋&/Ɇg.?\5@j7Ng2 QOƬ1R#@#p&yǰ@4XNVU& h 㔐~kŶ"2"'&, p=GQ=svrF4dd+G~2戅RK! eQagB2 *`F. E CK̭ͺ-L`K7 (o M%* 1kWºE-{/污 _?vnm >[w 0~hp!qw*b'!Tou#.@ :L1_0myjgy?ʇ_) »@Iր AF} { }/'3͓wH?ғ^)A87.Qn; xq L%Dh'_"֠$Z4*ذ+*U[ j23+hՐ.gH cIpjd2x/`߱cKisw=܀Ioίm t;g lUp2]"=̑–i)9Nhׅ?)OXnsdY<3 ,5'US+_ő} }H0pߙ\e1|Γ)*ҩ{7"DޏI|!E΍>Me;v܆8֒,jwg?zq/ f Iz ь;mD"0' 0dz@Z DC̵f hQ49@dEup3X3x\7)fex[GVR+y?J©䘕-&rF+}"o!ݽsQ8~!Fg!tm /Ꮣ(+brΝV\/+w> P#uq|G7q0t~,;.xjKB2Px$[amC HB dm800$K!'p#OBpc+L#6a ,~ag/R# Ƞ)l< +"X~J+n K#N01Ռ߾j W^TM c&%C_?vG ޕe K .W8QF_8 /W$7ti~ziʃeࢡqaD# u+KOy #0_bi\=/1*mP95,*xr*`g:N˘\j0r42_x,3Op ElbSDBE$_&}{nK'˝2*9 A53c| T\@=kLK#J8֋и~vv sWq\P ֑|K"2.#qGm yB[d_cӻJ(*3fO2v"$i] L^Gh]?a6!1jfD+h_|IM0Y:/#g,L:4 RY"娌4KN5[ӯf0Fb_; rU"x*9-w]6款}(ު SDO |L'49KveN5X?Wƭ[MV28-bcSk&m)äwjY۷*$: 7NZPY2;Hm{nS)2f6ʕRSI]8r4%-N).yψef\=BV8fm_/Je29Znnӗ .R p֦5aY0gAܲa@хSAb0e|1?P*0!#Sh,ɎIR\pFN!ؽ]ųexɻϊErW*k(}I E[9gCdIZrc7Kt"nڹv|q=N)c_9LI1}\de œ`ЈF/#aCUn]Ȑmy'%Ȩad#Xqҳt;*,G?~ljqs=*]2.-! } Q"Ʒ߽wSI]yy&/.1j7ݠ| H, ^\-cf0K sgET(E¸X b$I1#6ݹ4WZL\liCİ-?ߴ3b'˩|rV(61R.NW -SulZ ,1DXcRw$4=u&2Ff$#SyWRߟ('IHZŵUfXnw]rF']TE',^:AuPݚ GSKQKyx+eS+)PK~S+`u8E+YryM+RTJd6)A䰔2|/"ʪnq*%ϔӍ bzUkLppZ 3o"j%rJR ]<^N/^CSC[zND%Ƥ)SVI\URI*iÂటu*Iqi!MƠJATK\*vNp1U%MUz;xkOS.,L]JAd+ 7ݐAo>ORpxRb=2ӑ1tt;ÉNnxy2SS'.RpȪQzp,ܐTËW/d5)YJȐRZ>pN*ed)K))U{zUgcP9J)Ʀƒ+SD[5*B|+!MFt>1/ ix ^~Y=w~g"n3 㦖ڦܧt ]/C/C/^_7(@g>&&<H̃Z[k!h.`$#Vic1䮹8 -5nk>&<exnQ`ZهQȐO ⩤ߊxG>x،=]SޙG>uKMW|V- m塓kFzS8G>b҆o7ן:?pO{wC7gC c];[A}i9wc[z"%RSW}٫Q=xy"'CP_ٮǃyD~Jvஔ_v=ۃ*GeBX hNቼ[w+S'rXxk=O]xރ'r[n<~yZ=B85e8Z_ ĐhiڙMJC)8jN.anW jZ"2uvu2=F#KqdVnThbx .*DT!7AƉR!G)H;l Q!DJnTY,ET`5e\s.dTAދeBFSIx dhntX"=R\Y-E+q7IX!!IDt%#c 4n#qi͊B4H?L)ҍod}kfa.ጕtA{ {E檗C%3lp6Τ A `d: [@wlEBI `oFr [&_O+Ӈ(U2j &tHM RRUE~}Wka'E7l3" Ly*xHRnHkLaBE˹ Ǯ qQqS O"yc?l32YB%Q3룡"~j(xwx즤 i?x]ZJ,)N0c]Ɇ䚺c3HPǢ| hX]fM!ebjņDkiؿai9{;STȷ;uwR:pqR{\ݲrD ~o/&,!(]pqi\ JVhN歊nJN Mz +B==UУZ[sm9b[,]R}Mz_Oq+0 N-Vw&? „[H,N֣`/q$@,ԊM Z$ʎRKgli_71\,ZCm:XHфQe:OIZegrLe;P1j~7hnh=tn y6"[`Flky+{[Pb˓ EA 4hML"5F )8ۿsnP>rgw.^_ON83r@;תc7aL +*4 -XJ: ڒb8`rvߦi„f"){,1QE_t㌗~QP!@)gH5nd_neRS !=̐zر_Oq$Y=қhW WSy4%qsx\0gU/i2!oL 0NJ)}ȯy)_>*'y,Lz LMk.۳>-BIN'2h'ED){)#\W[0{e#ܷz'8Q]A1Յ[n.T֮P crHMp; ?v]4n_x티ov_/&e`.U@vz|;(5fB~f{h nLV0.Z~v`KS轵T|R%9#s*wTE M*0Ԭ3צz'6 ]f T*TtAC>QT1C7*QKW};p9Mn@ Cf"^ ^Na~vw*aG'O4:\*U_(rB>9M/瀋E~:5oԷcN}gϲʄ<;iFRQR1\MHL' BGo򷤛.Z;n.m|n7FmOxbM}Y(K}3\D79kA-TL$%{j."*^v,bݿ I p.zSI45-7Ri2OKiT4\Ve16|> 62o@+[M~ kVW7lVIHů!f~R= !˼vR\g.$ E}Ngt,"S}OKM~ F+7ht_Eyխ{;PVレg,J.wwOQ8*F-]%ynTz70*Cu$LjoUys)1R*[ ¢%ʏY:D;]׋YN!Eْnr+@K@9ojR%k ~`ͅyvh8l,H1tй7'W-;}|qSE{gpOb?rcHvs^{ƌcM|pJl)ƒM|ԥ^Κ-iile3*|x~N7da!%@3!bd|S,F0~7QUnX^OVX o6nFuWܾ5{fU޸@~]*>'SVT&TX?,L$xȮHE?` TY+`Gx/9 Y]E"g]1eoՍʄX^VXe SO]by];o9C v3I#*ӆǾ]̊s̎Y12zSeeNL7W^/!Zո97MNFMmD<v<~SjC{Wl);}Z+D׋!*HZ |*?Vu;~)ށ$&:2t겳^d)u+מ"̗m ŢEYM0pm?hZ_CnSdf*v2?joaX!2!Z@h* ry귋|Kq?9u:tAg[@5Xe^deo.n3ܨ;hg yp'rp!:M)M6پ*ʻ|89QؒpV}wl-P? R*7j ?W-_GC  ExC_1a[WAt6 &,Z!!!hS5:ДL.G/A,ae_=hZ WD me6qZ&'5Ļf2G|R8. ~UKئ{wߡ"Zux44h]iPqPidȌW' hCM^W|; |m;E':z;?\@|Chye Cb' Xb JАODj(<䛴6c bKb 7 P Lt%Mth ç#D%ǀ>Sr/)zь5aDCÎI [9jn.D7D.|cfaCR$Yglz b8 "F&NFy5leZp"0&!gsw8dd5#び/ڜ{8dԁ!F'?ŵC:KK\1}ϸˆSu dF Di]o=tHoJi PD. 8H-tŠǜ),!ۂy.%~ Dw#N Y >L(si\yYX=j]͟}2u,"SװVXWB3bd'q9('<<8xv;%s'0an b(}g XwDӗ.sgUN?7;1*S=.s811픇O4x>0ѝLrϩ^hW9gol87S=Gew:^ܴZ9WħBjz0td._1ޑOËZy7{V| B=a szzbx؎xY_Xe+S;o,~I^\oVGFe9 r1tóy]7AF5?"Wlc<;@LƊYilF'֌m 6XYhzʌ_Wh.:V; -vQ>CZBݑBCDw ] !*H"ˌ\@,m*:[(Y&)Yb-쁋XNc =Og[3ߎ\E.ri-r1ĨA.SY{2 j{rqYž{.f \ }VBuq!9!n󶰅a VآhZ.ŠZѨEgE-l֭EgBnjZtVXԢlZt^uͨEg@Eۣ lZA ${Xo Zܡ!cD_!C bȢpY%oQJy1S9}6s,ti̢fY ÷,Rz|M;քK+fљ,NFb0g f,>@h}*Q]7n^GmmuF,JޏXK#qP3W13h Wt6mpw]۾x5]/ypmv$ܯ7_pE~eNI@g~WO3L/ؼ;K:4s ع+0ŴrN)U<-F]=ճpo*+NQبSߵSS 1):5P㺩&<<]5`J<)vz_t qfԳ:R㼙hгVym9{98d!Gtу}yOgj`>gxA3D:Bz_r=.aNR)A-ՐL<5m@'|Ɗ}[xF)7o^v!G9=3-W֘ïŕqP|xKkTg~Vڳel-mWZ*fILEdTY ToTuĉrsFgښ%pmjmS8 #'s#6}yRfNN`Sä2CddٚeSۖ4S\ôtJ`|4kT#MѳɬSe󇚭cӲ/RsEZ:M+ nMjT6jh̿$;,7;o+&C"h]_*H?4,¥a/QDf<$/+v, NDp\˿C*dE 3ߘ ,w?)sQs\yeo(&n`loH\mK 5Pf<|9*~7\maͱkcLOs,ŚdyCN>~'+wĩGUoj-;*# K%RPuLevqFl/A*QpO0&[8|$g81,ˎS.oo 򉑓`E4?o7bc$%6э## 룂XI0ˆ}1KR(i? r=-q(5u=׉w@ PQ9 ewٍ!1BAib!B؆\cTK0. !/eJ]܃:Ae)^XHaP0N65h(OZ;J%M7v =} wĝ6b eza#S DBA)"ve BTsa>I:A4 x`8F#7/(Q@ʬw=@B,۽[@*rk@jKc Rhǖr F_aܱ#rّpi11ѼP|;FaDt P Q֎F1J^#nky1a$p^:qBFQ*Azyy"WQ (4#Wȥxb#wغ2o(RdNf;JAS;LLNnͽMw`A)<3JRßRpZ(DEHP -1x! jA<$(t5tdQ OCN] $55qr-;HAV $(6+ (}|wC(p"Zbn!{9!B% " mP]y(YIKAT>DiߌBZdUmpbĤTQg`J@H@)06:_w$xm m?ZU/#o0haĤ;R麎F/6ԃ0,[؊#ei0htb$E/A #-%Z1ka$%z.THvB xj= ߁.ï=(F1SjzEaQ0u1k!DDR7!`` KJv_sZ׼ XCrF9+ErT㼦JD/U}@ QJ~_p܊ bW6,pN: j$|\>"HI:TaN+:9|I cn7c#Iz`/ˈ' #B0K2AK Q4Ϻ1u Q;Djp@ D 7,J'Dˈ-`$q0*)Gж[M;%=?Fh $'0:Ҽo dmc .-+5m$)4|$|_;U!yGy )ܞ6|/'B&תP*D( j)` h2dDQj* " EL$ ='(J Z7H;FQaaUIvGUI #f,%FQtc2e9vKxMB>D]bQܷϭI!z>ҫsC-&7gkg }DAHɱUHd!"eJ7N["wlX]Dzs.ZZEƸ,:0nckBoCޅ(??D~G[LSU|B>y'k0CU@Qr~ &Ք n@AHN}]4oD!CHk(@z%;r]wBEJ)+9 Ov} 3KKjim ]N@%3^iX&ݗ\pဧ󾛐_M;<ĸi "LͲ{_I~1q < nO |0~ZJqH5@n7q! /N @)&̛P(}(ыq -^;zo#SynA.U}(ƪQҎP>VPOmo/jC<NBo7 pUoN|vJ&'- > ,C(wVb1f3}jq P@[>\ \NG V'Ӂ2ź;|Zć}>#y qIޣ\tkj襄p11Iv,tZ-?D#xas >{G wxܹGl⮩;Ox~#RçY=-|> (d;/§}|/$4*@4NRf-9#+iBqY()Q[ta u*3NsӀㄑVt%CKImvՠ4e^2t$FjLMAGBG-}YS'ԀoK|Pxj;a?Us2(9aSnif{3S}W7t],X)Xa끅*]=$̙O[mphϥ>8ҰHIGL p!pj.†MIX9H ێM#7)}NxbtJ:9,{D r'CqW \ B6ٕRլeؤwKiM[@FF/q@rx^Yк% @9 29: 0噁uF@(0ѲR[*Bӂ&mACЂXהaRPsV)dd yqf,ʐɛ=s^\=f~..8np[Wӳ ҿ KxkӃ’{`eeO),wB3$w`Zo8l4`ėۀA1hCzoSM( &zNd_04*+4*mկVh LLu:߃/OL^l玌^eFb@IRv""ӎy3B>4噡q& WmF/ 410X Hu8c=Pl[)6 `#T}c S`CV+ņ1VhJ;6"B`i鵊Ԥհ" 8&g36%KZUpLpZ9O]F Nn@苦 i#GUNS| hЄR7hZ?wqMdj= &2j,bEE&ZV!gSr4@'4n7i;2>+h Ez CDݠ0i.=Ȕ'F Ҁϳ2{"S?6E&c ukzBK3j,aSQuOh\TsVcм hX }ƮLMd(4 O`ՀqǐBٔⰳΨV4rxThPRaL q̏ yy%jUe:e[ǰO_s7~L|Sڷn(E>4[Vq4S4 X8 iVBJyFq8@MղdmxHjiݚ7'Ν.yH{mcw G ձ j攨cji~㡖˦U/S=eɮMNvC/YrtZga%" wt_{oMС@K&hd9SИdZ$h38A!~gm8>>mj75Y@Z3j*ԒbRPr'H1x}S .1pFS+w)%mg8k)\R0mhڰ!-p=jb}5ȕT+Jyiŷzh] Zyy*f+pqi&C-YWWDW%B-y+o;z1{)9p͐Fo97GqNnu׸Dd;ޠ |v\+ dJ A;jirFۨN?lE] 8~K+=YXC^Z9UE]B{ om^j8ᦇ'Szhq퐡^"̸耢=C^¼%pQP-5![=nQT[ZxO`rxG-tĿ=d-Z PK.M];UQ5?^Z}^lѵTO[_i 8ʷrؿ=Z4;d(9[lԔ2Rg\+jy-h<NJ͸Nai"V~|@۴[jK]5FЄ^o0ހ|_cy\먃 WC7PCvi瞴Ņ Gwuur؍zwVm ^~IL.Q6\p5YFGYn1TƋ: ,MX7rcZߚ^p* /ZG?o/QR<ӗ*s%; _kfZj"<^ @Ӄ<=sr- =)=A/ ۵EI??x_/?qO kRؔ4)QP()aR}0ZAUU:V|LJ3[y mb_x[i 7{բf{Ry|)z䚿xUN |bU!2[D$wPڋ'#?2_'|4pȾ71ˑ9TNE7ϑ GD@9U:Q.,=x8jE߇2ooM?t ;'`?d@Uh8,`-@H*l4X[潪MylL׼/˔ļDG|E"t*|o J͇PAJmXz~b:5 /IUY'zQN°mawQμО@U0NXsL6,<S"GG}Pa,HUPt1]AVSP V+WoX[SU)Ioo<BK!ЇKʲͫb$);4FYqeB`KV;6$&Io2|:NV+灾Zc-ɪ;KFUׁPQ:#JRC"д;:%ϴ<&fu\\@=P~3 W4lX|+0bmDi?l!zLq/Eז`ULU&U .Y6jRW]аaܰQ/E#bݏ'Ps&@xdzs+@Gl[ҵ7ֲaj[hk{P93tJ~SpPxjAPlo~RnO#O31*(1CK]U 0mFm ĉ)ccضܰ4 c,aLa|`ϰ\P͆ >> Ci$*QbHE=lPnUQkVCˣ&.x "9`ვ0BV?B%~ xU\2vsM1UC<F+\Cp}ȅDUpx8i5@uAx .XyߕYI6 ($em#+2yĭѣƐTFv{0e\H p DQ |L 3˶yECI"t Xk>Ӆ=H=czⅱjKpC4; 0<$Hsk#w " BDC#i_B2|pU`/% ĩI I/` mUL?ʓg71D*͚!&ī=i+bf SA/񆄯C͠D bꦜ2 Ζ`y*kt[{y'hʦ&`OOvg =?A Е+", QF2ﴋ>'%Jjž gGhPOÅuGaUK+.(6"gwicw`Å j!7mg --|X'O)k"*/!|:|(J#E ᠨ##Bl-9#y-]:\sCmZ2d`F Svԑ3o|8Q@/-MV F^OareN*Ps}8'O_&s!pa̩]#k{ G{Ĝf@د ș2pܶY_Ϩ.0%abĝ髚Q8ں/ (B7=lOF{ہ<}zӹZ9X82=Ky,_ ydOtsh/֛Mi\-$ûY, 敜E69ӣ~-8) ( ݚmM Ѻ'O;-O8k]Hs˽xo{ٯq1=uhC(sZBY] `qqwI>?u_F-c$ %r C24y:煂2W\.my,!<23ϿlCduxZ6n nJ|ѱܠ[RvIR3Ha9)e*mӥv䉗ogHH~4/3b;Gzz]7%yWUKܺTQԍTn~cڒD䉛@ZٽpAR?6ô)™2!&>Its,xI۸#O,ˇΛ,} ۸ʖ61J"˽>g:'n;*)d1o397iU6GocVn&8ͬ#7æ)G9k^/|`+789C/% Ǵub{5 ߓ'^Q~X2΋K  [eEB^ddf,KRLD̅<13C?ӿ=?ϔ͹ڈ=FQսMŜF|]gBe5|-fE˂]H4=~<'2xAh<VD#!S@Ϟ$?e1gSƂiN*/7-vRd^w5;0č;pÝJݳr@0 1DXM5Ͷ!UmBIj몘 yf1@. fUv 8}!u%c*EN^.䉗iGy0x/-h!7){z81m5K졼ps!Ol`2[˜TD/^eE5I+[-w Nlɔ<\ eo\+vey˳ܓGʍ쁩2dmFr 9Sʰ0ePdK.dQ۪H ybo{B%/H% @Gf;ĚtD=p>arBZ/ْh|ٔ&B3_nO>Tvf#mV'`)˕!.J4G;Ęu$Jib' D$J1lyTE Aq 0ו8czi9:-0;=Tjlq%3sBNwɴje{{nV: `!*(!.2xRZpz"y.?|-aJ0L؏5Pj߅i@o<4JRBЃWZdHG G Y 8APwJȣH¥dxvpFK>9`/o,:|x q&M4V/H{=|Г-0qd--K݇%dpqϖ^V+eǔ2>ē&O o}˚ qd3Xhc"pU+o| #Ǚ$ }+MJ0rEh="Nk[Gų?җ>[RW=W*} LS4ckL,1IX>vlmN|6*O|yچ_?_<-c)8FJkv.P \/oZ?/R5ō(|ٱf{ܱGB#G6~-GjZgd '48pO6мrė7mtKHwQsˑ xaZɔLQʤ-2L!*OLyܦL$zn, .J2ݡxdM$4d<Ǧ;_4KM1\ Wɕ&]жA%yil "8yRU["KYԿDW*s䡃+MxjB 2c+o4#C' l c0]`B{m /upݑ}v=MOIH VLG,|I|A;&g&lj-og'5_'R׹laeWT[r(I_L_4߾~<_m,G^iK }&_@$YIHhӝ ϞkH/eэƖVZݡ F-bWIĕ7\aNS"`/Em\[|)oZ DD'7 n ҋn օ+OOn EWR,c{lVW6A "[|l)R%'[rսi޴dz5x_Ycb.lMidA΄p6'ir'0T38TDPͥu'pʛ7׏TXlug\A(* QY.n)ud[|lqiɾzB Q/y,vIIM3Oly(|wQJs%)Lb ʕsR.BQү=q =/͕ 7KAW+!W@+ٶ@Ln= ǏGd9: [ rԤwS ɃbNdv:޾U/_}ph>+ʕ,8<bp%2grJT {~4W\iW&qR WR ;P| ˲[ް}?A mkI/%Y-iė7,n-|qE[YM- [\ԡm(S`L]U| & $'\o"O;>#zo A3V?*b %. ?z- ge,9Aq÷jkP_\(Is#&dHV<&w4uz' QwP1xTBy( дډP1 M[ 0V}n͖׀K3ZtIer-A7U0Dž@PľEI*':NJn]~'&=Ĉ?*I mkb$,|[Otq!8mD4o/%<h*`DElIՠUYEq!8Pz)q&&7PPڐ `7"yXwA/d |Uy:y}!\6J _9!?I7fї |jgwz?҇2VB9!Ox%gǡ 4{Zaԕ\pÐYn ѬA BЀ°e84JX؎֫=fV~tGSIXۥKt% Tq@ZٵELG_aJHq%"0#ym'Or/ ƶNl0VU˶0Ia\?h)ie¦ g cWlR`Uey~*z,AĕY"* HV2$OpM(VE:*DOV\l2]@s1v]rEϥPu74VG:vK}ZqQIJc΢q@HxsؔI -srluv4kJX$va/'{\yc vv]Srșiu~]njL۷BndAu! Ktmi:.4I6/Kpus\ 4_]^^  ۲fɻ@ iʄ^{R̵ăAys2 s d#YЕ9!]~rT>We<%K¯&Vn5gz !7\]%dx y !zG%L <||'VyY.]P6TSiNlR,.b0^`s۠R1qYo1ö,Xcӷ ,M?xڟ{7^֎[o iTz^T$Bɥ/t`Fm%v6UX9l;`؀εe) ^oflf[@y'p,h*pK_-3k =!*]oauS3$pYc{7'.`dUpT1ХrT9 uk5S a,Ϩ Q=];5rҷ~@(-ubm\&_\2yNdnNSK oj;ܦ*!kX:9`vvп~m3m x#89mcVɦ:,M4WAAWr_ I-m7'\ bǽWԪ')?,Ց~==8ܥDYmld*5HB~-+ͫtĤСBI #_lʋt;Yǭ.痣ĚXKHd '8FcEv~IZ 2U/9lr3[/R9ĦqVf5Ҹ&W=צ؞<)%SXׇtܜ¹FK:Wq g^dtOA"?9b\e Svi˼]qPKӉH9<-3-@WS!EFyT=ۥV-uM"~.tQ s&X:1h娒ݑ-D-.HD (q+Qmd8iǾǖׅ.]*1b,p-6Xx )O"f\@o9A1D^>>&]\uҊ'\nAs{R4UwCtYLI]iV&-0=+,7Qu>tgSiz`gf~ %Il&LFd[EH6q敏+<LM&Baِc64Ӽ@_m)Dǐ۫"kqJQF+d9Ec}Е cݓLE2w.JU$Rc)Pշ\.Y^ <\f-q<}ہ?ǖG&X_)fxGJuFv+_J6$ U nEFm0@O݉VHWㄩHog*l1ࡦ!Bo;PO"ZڿCW)G`üQ!W;+x͊Eիo WC "ICb-e7k =ykw7kTi[SK!,@._rQVabw!?y92wE:0-Mjqd>Y'Y U?ˬn0J U@ FIǺ@_M/'V]ϕUVGPZU1fTKBqtRlqaȶ f- Ye>uJZ!D;*7i<Ms0m *ptφ灾l ~l!Fk:uI2 D*K; &Z\@u e$EN]Rh*[HR T GU-ݳy/ǷH7bB5ZKI-cv##^+u%f˅!TL3 7(2E MB-(j8n3aUV1]0ʲmTJ0s6='B'>pݣrXiqbyr&%Ti$)vM0dc2[z,ܨuUz~ b Wi82*F:*uω> 7g9ۿI[HLfC(:`U*\> FU/7r..T$nw@ - Yk 11ZH*\4 *hPZ_IT'ys{F<lÍdۭaRe[$MN g>X\D.tm͕ NN))Z^ SJi-d/sCY7f/fJlcsy/n9A['ި9쉫o2Q_M@N8%Q&Z0Q`j)̺Ez5)]E'j"&YGԶT IϵAG3@msy/[~BV7 ҟIi$'|{\9Td1BJ-r2UBn]j4T*;_OBrno:PF)6=BoQ[$=tRԙɈEHȨz䤼4ȤB]6zH ƔPZeJIeiR<|ԡ6=a}w?!IdS:A)`ȜQmH\@rJ-r]ѧFE.j7v+Jk}9T"pu'WSAܹ^s4Ч̂9y/}-QcdɌ=jBTS`('e5\06P*ŚfV?G7%V$n؃AU֭Et4%븩ݳy/$Ѱ˟*a"$DSVZ+W98*4dԲ8_EfhIҐg{E/vb% e %řfj(U~2{Bo;LӈZ%hm 5넹OW\pי X@HFTK"(\dzJx )<:Jˏ4aj.[WtȪsa:=Bo{LO"ٞVJђ X3Cx8 Ct0Q`Ac5K9[ݒ$#ԫ9JΜfnYJZ~Bhlᛝt{&<YM_?\Њ\ä,Mۖ9zIի\$Y(-Nqb%9ڴ9),+cJ͢*%"QZ)QZ~SŲL [dw]l!2g@_5HIbFVƥ\glIl[`U*0Ď`mrt3c$4vWI]RrtE lSIksnTTCuA䚦g@_ȵ\' ,NP<6Q˄l5Λ`][aH 4LǙj-{l4CP6 jXu¢T0Lx 7}oD,Xs@”IԞd60DYf$T<5*teZMBY꾒Hwڀ;ބ(B?aD;\j=kA8ܓgF"Df7}"MD/@XlE'9MPۈ=Oj)hV4K,ђyOZ6Jˈ9T$"*= {BoKIdZB l@ F< ;قYwFUU!LsrM-[i6`Զ*_Mg ⟝j0"nYNpz U˃h Cv rmpua~~R\A4 VTEnjmR\IWe<@ϲ`=AyS\x /3V7{l41|sW( NN@dg7 @l'_Ѡl;f҄R4A!z+R=.A Xy:iq# }!mD˔S1Zd`(ؘ9e36% |4Afv ",lKiD%UHIY/H Ui98&mt32@_P'jVJk3}`a"B<C&z7b$2s[&<3z55UlŨmUUvP켦Czv H%n}!7oگDA%4<̩eRE#Nyl"WЬʠ ""%LZ3b*"J.@ ֨9\Qp%15Qx`5ՈX3zsFD[*gl-7M>h~9}>O?z1+6$t4UM&GTb (4<5ZSWX嬟4j HEUB8gzv5$!)iGl)$ lZr~AHWݗ|=di2_ͺEY|27>®'VmX?|A)0( #b:fH%hMM͇*=*_ k{TNhj 7t <Fwg?jOEo.~wPh3 `h p!&^^XMy@3  &یMdD6Mf;2K?Qo[x/IсHo8i. 7*HH*2ݣ!K6V#?9Yb:z_-Z.)u.Cfnقh~hV}[R aG+B~VN螼 %Nig8*)U%ow(r|O\qxW|VH\"pwޫ_4Jz]׉&"ǒŚ 2ԴI;-BP}E8oN$_.qWd5okA,lhE^1,R~9ӳwttpgO5vYlȜڎ࠙&ic miTOVJsd@[%c4j*t ]R䏞\kPk(|4t4#XɄpcnbcVxz+H%rXI rckJՋ,􅚽zvAE'xh4Ui ޤdSw#i$:Z( HVY4IVPHuzc|VڛT nF44$ >hhR%# Q [#JIeƌ$ͷ\XE&bE_'MLP$<R_U{Q&óX%$ S66-SIMV& fyzX%AHHfr1P2 ƸItަ)N /@ix)æ #VL/q^bv)oфc:7[ |CI6LN #n&_8hȡw#?#o-^ f.S:~uAOf I0α7g[@ja(c0h5ig@z!GiEF]YFCvmrȨ!ø>֌!t]8Mw^xih-먳v9d`n!4:ǔ,&5:(in%\n4gWmˆN3{53&kl`:qN.7u {cVyV-6 sC&:vQw  :F ˜EwQ2gA3iŎF.VܺbK&nL l0|*u;U?K|l:}xgD{"RZz!kґ+!$ضvKӝ,[nn];naů+8EM7$~T0C*wݶ>ې Ͼ:6jbrѐsk],cڭbHnSZ] <;{m!9,2&B[g]G_{dC&_-pQ*ŋ`;k֏XG]n4꼅uiqv^vG}U2=>tET-#p˝NjܝjN۫H}[r$]ĝnJLeegk丂uW;N Ak'E2l+I]Q.}.r|Q+K~Banvꠊݨ_GwqzvE#B yx/'O%!SH;dݖZW|pƻpZO1?wgD)%v(K}%wߧ\tc&MцNAOe\u`7_*p{XK3oݮwnߨV\9Fp/YuO* \ G]& &'aRv#% dKJSǻy,-A;isLEp&LP:UuOLu;'Ooo7g2ңPikG "HYĻag*;H=ms*Adqm/D Pi%C12l KSL{b_zWy|*V %U\G'dNlڬ÷TlrTyT^"45.Ɩd ls_wBMrЖ灾Dc&ѿ_%iW 1Spt@@zH19|)=q*}Aa؟E/.;ZgBˢBMvi4 7υڠu]lCg#tDo(߿( WGǖz1V$?BT3w}FnszEB&4:\_' jR߳菙9QyZuxhtíc ; <8iEb*R!凜Ǿ yi|[t(yaCԌUC(Po<޹dg!Y_d~`5iM(aAOG1bzHà,~b-U{Q*SVϠRf[8𛱱[-nح,R־v4zMUlOrlH^Kdix=89Kv頊^;tL]Z~_;,@]O"[i@Lb2|ldCvF3>i*6͞t [ºRmM%uXgvr`C2X\2C`NB^$ UBq'8$݁%~,XR*H4Mto=(rq%'бuԋt[O+C Ie:sଡ଼zKGi8 >&zL8)}DZo;xp }l90lyz2`#J6AحTm݈0v$pz FB1>k OXiByĖt8QƶW)7PK;vEvcQȖo26`@7'O#mw)vc*5lrCZ&006HO\#-1HKJA{`T lNCL|<N/R`" 8mZj=%xoߠ@Y *he=xJq!@[O\C)H{T$R x "1hֳ;LlD&5jh2l̦Q"9Zr4l8ҾޫRXw'6|N<70ؼ%?↯xJ`-8_7p<+"H^kٍUYfg#͝&iJxx;um 3bp,, cWMʉ,iN#O-Tvt8!P@Wep ZR)MLlm:{'|~[Ӧlc#[еHTfW. Z2ۗ>oa\)9 4[|l82 7±gpi0˴}4XWN%␜~v<ƃd=]r|uGU]Nԉ-l2p^M3> j۳uZ+J##kr,dR~Z =Al jc1ȓ&ɕ`7ai9)I J W4BҴ's5vdJvw` rf ŞC-lh[ ;9vIu 6C,ΒZ]Ec 1htx"S2';wk]x\*6Lr45Ӌ$5`j\Jx,QNVQ8Hù -gD3hwa$j6Wn&LAD6:;42dr^Ȇ lIq>gp ߲ DnPr-m:,ʀ%)\ ԠZThgr6͒ȝ.frW~-G=-7ch$†6$&zg 9"#wu|ĕ[$ [)G*vz9~z;*ZCDR6IpJpleܱs5JgC0treT9aF 2V* pVJz?CM;fDYRlђ;TtEۢ%aɌTD+qZDqCǘpliF6%Bm`Qʕ$X gKe',"liB-PȡJpv4GƚT>9@w(B:νw vA5DQfDi5b;ȗ~,c+XCED7˟cg[reZZZ(Wcӯ eQ8^&t0d[2~!8sو%@O82ҡC`gpNCő3j9 c-r]zgR*wsI\r T3 5=j[o* q_ Nu &;O䈷1E +8=jJ1 v !o(ynAt*㍱Dyy{~w"j/?j+ZtL7o9cNje*>$ݢd}ߍ`Yj `ddݷVJc7}ʤ*,]P>%Jup< Z U27ޠ$Fh rs :BLIԖP;5E"c͙ *Ç1tʧ4z&HXG: H)&Ul 0UhäⰘM[4 6_9% ^:B<9}ߧ4rz͍i0+A r4rҦ>VXoPT+5gPQQ95A[iS>ߣpGs[(9y2sWǚYNp"tENDwď+ kgDh^G;9tR'g FdK\1b28P rM4g蓂ZLNlv?N^d9cYjqȤqQ]$ 4_YR?1n'P ;pa0X$u 6%Uvԕ$z WNOq?F]E,VMN/8G-Q8AiT%^5oii`_7cVRvYHԷ>3&u I2E; A%] mr6h"̈FKB%~TVnPg$k->òE5$DZޠ"iGﲥubUn泾2^䦍X҃튃vP%e&HbXBh s4O,ΠN#-w?G#N2 m|~rbvl7(13l> 0+ cf@{I&_ـiV(<[=o8oPDfҟ)+ $ zSVccuf!7-+I0қ H)$v)}Nly%\A4*r%G!SW)gbA,A̭yJ\}Jr`S>w3c Ò)<o!ևpeJkpnao@T' 8灁b`O*&+!'t1\Tĕr؉c6v,s&'C-zbX,TXݠ {.m1) P._xf;ٌ ]c.o$  p$8 l|?.A 'b FLD@=Y"lIR'"aFqF61'UXo9X#tf[q]fVz ܉29&9Yl g|*9: ͸5A/J?yz"<[%YK -;l-[HHl($"UEeb gіED8UE$d͌Ɔ6iōv&Kd%Yˆ 0ҴuՄɧ"FY0žv $|>- hPIn \R.&@m᧳<^"M+I5pc+e$֙6wQ'>qaj1O]kLTD՚gQlք! 6p,zʉ Xi; 3n/SrT@:)9eP,1=[eAPCиHץ&&ኆ0@5XSɂ&yubXUL3$wyKȅ"nMQaB@E=:zbf5F:199lŐ¾j9e⸃i<*:%YRdK$q 7@ *.{Xs|YPhgz8QcE3PM}K!ˉ#mCoNc w8i3EXF2l4H/@uڢޠ.!{5mFZsR5=P48lzlBج@ק[M:zU5% f}'mq7(p4q6=Oڪ+bqNc w80)q{[,.φ27n5ǚnq8$'c-:I%Iw-bv:HbrOiՓ\ Kܙ"@psݠR\T"F%bgeK%0H%A%ZqϰK$#%:+wjPK^IC_blΨe@ Oق !(}] &6)o4G@K$PLe;kF/Q2ZtbMÉU)V gQ>7ryttnЀ PAPHԲ erD'eOKoFy&&oP5c6^G7;Xf `649mj&r_fQfq_v&xw}1x:NE'qNĆk،`bXKMLXx~.rAr6@ĝr.qPX@^,G ń ̲{e0Bj,M .o6ה{{ h+.3 &M-M|vm{L5s4yPY5-˫`Xtjsnz' 8MvuӈP^wl'u<8ܙ- a4QԚ^k,ً46/q'%IV3 2'9?^s<,-/SE^{d%Sq[s&p h!(8p/[7nrL).AڝXG!_dOow9Kl$rL 68 5o|ze؁)Ocű8,!ԑԒ]!1嘷nΒ^NI1SB>搎sH9%fXR2"Ւw4tN? ^۽ /G{*` >K xd^|Hdmz6Ag&_JQL9+5/>3εl $eR8 L2SYk+gJiO 4X`j03L YB<}tCb. ;Tg~R]ֱBR-4oFH MFcXôl%фuQH?r0OIH IHoPTiDl.ԛ-ݎO 1 }mX۩b%@FC\e$uoJZєT1  :1f=d<+_N=@ $_I:TM͒J1le4t 4b}#!IeRVC5דoq&Eo_M ׋Ѷ[~EI-x> sC"!Īq9@{.r/|ZnyWO$Mi4F-d9管<.=҂uf0a> DB6c@lIhքw/QIV6vX6 ٣<#i(!P5/=jU)EH ־fkGwW(0W^9n)6 燮 49"Z [+p=u WJ( #!5k,5 iI1 `fYqݙ]<\/`?&tQ|LA8n J~LaksbA (dn LҤ7Rw=\i6t3yGuV+-gWP(6ް8TjX]h$#yoE,/h]=m=vRawER[my# ʄȈ%jpotAuPBqZUej>l\억cxqDQIr*M[ bK:g[x])xcvW2$ 53;#8X, KeHF&4p#Ȏ[[BE#^C:7(fIGK^0WlBzDʱA*'K9 1&ly]Q 0f)Em2v̜%+w^.SC%V$7. bX6kѰ {n` ZKʖh, AUhc 3::<fsDJ:6% h(]1;|A^ d"Es\rVt?Οn :KR5)iP-A5#/Jإd Ổ ȝx+;;}SQ,aNRN% X_;vpbPXXs}7Xs ۓeZ5Edh|A!ds#ueJ mƭקq֘G~ CGO' }DQ]G6^QU:rE$%u  JKv;JN-B&Ié҂Pa/ddROQ܂T 9d*me<:VL3yeTNv2w( Du=24R\|]c1LQ=Ld3R)2/&rcO-Rn0ޔ̦Jy2c¤lezleM i <"Hk,v=]j|DOة=ΝgkΎYi'R)T$]}8@>.d_cK*/0vQ^xՋ$-(aa@E ,Bļ%Em;ID)x#>>).o-ϓk2_M79|KnsR&&Fр*ȱXtOV @oQN\L,,a|X%VY2Hcx6F6;,18$2(1IX -cT #H !t8x%XS:|jﰦqxj2{Jfr)=9^~8DUvLhtI(㇑ܐ!S U#6z <;:8_UㅋM-vs`RhCˌhwS%CٶMVe]Wr jX 2k`ap֠c~\c4ljf2"BѦ6{{\TmY9|j鏟x[܋fA[,db"9g}`mfyЧM_>:7OW$\,pݑ S _8ېVM77ࠧ @h vՄ"1wnn B s<-;Ifu⽷ft|~JaKE |JgF= 2R9mˇdzN6/Xqc S| B7C {F~kh`3F8Aqz tn*zˀt[N%*X2d` RCe/cX+D/< jj3n۝\ˡPsTȤ6"%{] =ܕt Ji(TDE Dd e…jYD&I2czӭe06nNjܖ;6az'MAlUs_k_/S*#,p4F g)񱲺I5Oz`o(RnJLר"O"Mo@BϷOD]_`F>#dd@8er~W<h&ֆ$p %߆%^`H>r68ˁp'Tqzhyn5W~4F&;]_ ,;ѥȞg?١^7!Kyphyn4?GRMCy~Å Ʉ~ryn_̿f1!;r .@v=ԬfsӅ Kڡl._0-@inZ\vS]͎/?]`Hyo4(z0}Wkr.ĚÅ$$jq:,~pE&4^`X쓄YYjM !ΓK"Ox>x P@69JH\m}5fG >/w)CA =>B_`0 1Hl?q( H]R\ R#52GtbT"T"W`S4$V&)ɟW^8+wfWLUٳHL`W(؂ ٵl DEHb,ߕpƆ&6Rؒ.Lڸz;+D6w'.8J6# U h4P1u}iN ы!8ZB \8JQ%Y/\,3]Hz1,/cM|xA`2<*u~H 9դb嫏{<q<@4/ 3;\)9Wa1׈m4`Bzajez?w}x0߇;@G2?g&DCcImKZ/j%/0Q,+EԵ!MK4\ 8(KÖ(DV\Ƀϋȳ5I~KE58; FcObpr76ּfTazlUPf^&j&f<0Q3n {ne+rRUvYILAȞG&q}67 ~= ry1쿄@H]wN͋n4C(: 쟽2'cq<ŗO%bN=,L=>|16lmK3oQ@W-(o|s~("I MElj:aa ~,Ί(2Q)$}?zm0Jz+;6NMNǕA&6!!eVNes 8:r1@+,3dH M,Ϙkrd鸫J<Ȥ?C=%AWg. }ivG*"hu "*q4]"ZVHW*}@~ӥ#Z,kV灾xS]k``ZVa@<7 g^FfUwmBRWCFN>ug'l)]+eE˅5K]֥=/upѧ'Eɳo)H|p${ҏK["+lr%+`cK 0y*iOtV^muW03—Nw\hQ ZOZFu| -xo ]+K+H*pB 0a+UGU7=r Jd,y }+G8''1-#E2#x=7=S)hF⁆fz%z/*f!%Ӽ.og&5L*lT3g 4TnI(lR3 W. jA}+//`#/ҳt}dR5`yS3MC 1rQTA%3XMƞSzgebak$6J0L[bQ9gnߥ>T,RKHjQ@Tk,{Iq8t_[ԅFhT!agXyWor #W B>?ңysvd  =GR_kw;eRJ+sE|3[ se/?__}\Ky$navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SY.svgz000066400000000000000000000005241221777731700221570ustar00rootroot00000000000000;(zHcountry_SY.svgmQn0 {{$"C64*J/t]6bw[rvtdߗmv*DN4Ǒv!刘FmȌ1 dl`0]s50ج)z jCUUYsqSj- #D4NE6&_p! QYF 5el"D`NUΉRrTJ&"v7ټ zL&i=y}pj]wۄCG g[,&`N|XWYνY}v=navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_SZ.svgz000066400000000000000000000110461221777731700221610ustar00rootroot000000000000007(zHcountry_SZ.svg\ko[_q|QrEvN iiZE@WHʏ3%-;EE#}ٝGj:NOZT'I_wR{Ao4WOZI닧?yy1{yZ|W~sT:}Y?Zuz:/W^l9v_eϏ:Yv]U9Z8/QQh88z/Oϟ[94m=}RGӪ7ū ֻϚڲ?9C-[pjȪ`?騚o6ί6^~C5_Hִ@`~eP xe`@5-.8\N :UtZ <66y5 z (N'?<_ QӪ&@fӑ|ը:YWz$K1ތםVMH~L-Hbxr .?0Gb)rݠË9DTڬWl]W Ꝯ5!kr<62q/q5ɨwzstf6<okQmFrmdh8;#@,_BrYj4Mt }+Fqd2ɍ-B8nc]Tܞkq)M(>\MTq v7:Ygj-]ˡT½#Oқq2;oՁ6@a>:QuPƓszk~/M s%D&(iXpGJmK:)j)9rr2JRR*}2mK1.jRMK9֪mM㶵 &gחuM1/:F!R;KkZ[QPdeEѕ:,8SFZ,T?|n. sxChB n&2T|V!LZVֆ2h'UQj1oEbN^ >u?7s?oS$[fmS|fg ­N?Qv/3vI;$Abn=%Ab0POUGw"\L 'Rpvc !h$Ԝjb2((HF!> _:d ̊eEAdLBE8":EyKm}2w6;H!쇸tm[p 6fej˫ AV@( 8L^m 7PcM(4P21pI;'x 8ub0Ő"q` (mVi)Ctm孡'Gr Uh^R2/{~GЄ$p"\aL\## FZk7ER-x7">+ZZʀ1pXuT X){֐tQl&l Τ 'L҄_ p5s(lVS,'89Pr ,It )+@f 8ib`T$;bBc@?z(!BTH0B(BZf  F O65xJXwm@\#ceLecك(eQy>Az]QQ'@$^C=&Ob}Q&g {YaTD]n "`u/a!".&=;f )+ŎBB#FȄM"H4{sFN*a vPfdu ;X;uz9GkśwcqwIqm@^{ ^<6HqʾR\g+n)\x/{$a1hxFj۩:&^Pt_S 6i 6mB*I7JZΤt*IN)p&{$VLwIgGoS?< U8]R1™߿N}p&{$xW8s-A*n^<ES!y&܀{ S_{dP!ɹ(< (3G&9$ rd :S2WG[\j<Ԗe&)?DI/ZRZ$KLZ@C2M y&bYrSh|6!OUPhbkrshJ@5n!GKDqK#;-Rf Y!f6s;l(Yy\` 62 ,쇸mI{3~/M.vi$)'>;zY u6Qp1&]CHxLt9(Znavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TC.svgz000066400000000000000000000174151221777731700221410ustar00rootroot00000000000000@(zHcountry_TC.svg[YǕ}ϯ f׾t2r a3nRZM9يgl Bb^w9wOf]Rgr>K[nwv/dw 7vw}:n^msi4n߾]md8r~> }n s>Wܘ38;ޟ‧9?m,y7w/Wכe9s,6꼍>Sa=,fڗwWf߷nև&~'6zuXܵdeA. e%V?n߀m/{juzC|8|z3-ZmZ|Wn8_|vy^Zq>yP]eHՇ˹y z~.C?W!nwgMS*}?5n Tmf;vw9"ȟťZs34:ߓkaoov;hfW Hz|?mJ5}ڽϻ_HQ35_mGqNqwsȽ){Qk{vw+^Won.O^/&6S 5']xZ_j|rnݖ?Μo᧳G te~C)Ki>l'K _qz6gJlrЏ^ej>. IU3,C4Q]pB-o6t=$ [ȗsZqj("MvJl[託%fOONm%rnla=kMXZ夗.j6 ,uep&/ z=f'.臑1vqXqjv &ھ9yA7ZpX T+u_'ғ~Tz & *&l3əSy ?Flkgo,G$%JY$(?̽hV#cN ÊS۸O9M9{?*+3ubBFwKL[bX)|QfSc()؅7-(eL$ vː{IGZm)~BI[ m4[8-I~2 VhiB3$7rD%A; ]!b&m| @J JKzf9F4hBCHgкP:%[kACX! re QIc$-45-:{$t !S3LHβ~Pl+d&uu϶zJ#+kLْm,L-$\yM [/vsd&E"# R4A(ʖ%D-$8 $Pشv{?i[q}6r+V0:Nkcˎ)zXNPY i\Z蠋uҼ] fK-<:hgqKȷ+(P B! a0UKZ8TFEi!' `L|hEHQyϟ] wB>!\QW(FF@ $l0zu42ZwLCZ9O0>e (r Q)ڶ<<yQ(U:OQZ_,`ݠ3`Dr!z;Ѹ=̦4N;i@$B8#EAnFH`aB $v` 8 tТ`xhYCzz1kR{j1m!LAxXUN!V^Rp m 4V:'KA8ĩU9W-3tYJj9(N{MA([>\;*?FPL Z‡JGmXU 2FQ[6#)3pʴ#;hfTs{!XªU@X΂n_0ͱݐhOgagHu ,С5Kd0 &-!eBWH- 0 r,I_E8%3 yHIz&oXf$z@G5)&*Ca 98-3reGW<퀼3s2c eqg4.׸*to0iCZDgIHv?z !QM^JeB)R fB#@r8Z zz؍A'?;[nN.e2O Vٌ1r(inn2:ȊFR.pQ34h$E3w(JWqYRa2b*v&eE/ j4IL-m^Tcd/ekOί?YWU?EDZ9.@LYk"Wi3rLx8"E 5J7i%A#mHG`ReDr4x]@"OuF!MwC\$ 3c|Y`ـ&:!% @똡/QzbIpGԉtH A#L:y[Ȁ`(FWgxJb=Η;IaȬC88|KPdrF$U" @\w~N?%!>qiii,4vmU9Pi8[N =aic~:0tan펌⑚t0 L(O\ &.KfF9 CF$;Z4iH5man$DQ<=j,l&f7)ZXqT!IMG[L,e @IAؚɱ% W 9Rh+\vjge5g)MVHAd],ͫ@qhZU,≡b4v~M.Z"FV q.)+U?֊sVDB8AńJ$AvA#Ɉu%uPN:Xf8ki)>8Tbu^*C@saWF1UQJHlZ"!u/Ƃ!)([L q:C.gKB#زPڳZ$)E3m-3tRִw##zK5Re.Z3\ѥHdW9Wj~iBXcM.9剉%ochÀcUt2j?ueFŢ,Vz((Kb6os'0h`rNl.Qrk-#lp7pҟ`_fFZoyF0}d WRmuEZz1zt3^.ڤJ 2*D]MVfT gJ}=#т8OG vlFWfh%oqeI+-%.&t)=̗SZF]~;r8AKRtrRHB(4xa[Y$akv'> zv"E,tTO Utl_L kI*Z'%-VĚ\ZM_!qCA ~z)ҵU`%x4X!i*}C8 RϳX}AZq&.pˆ@8B>2m@9j4@Qi˒ъ;OR"UC 1^ġ& ;ٍ;^N>FitFm ֙(6Zt-1:"Jґ+gdaXٓ|\iߥ |p\v 4tX)dA^:\D)h%:S I>NG 10ل}JW&srBu32k1^yNV^\Y2[񂢌eٶ5vÀYn[|`Ǔshf+e+d(̳2}w8h =Q{7k)4 iA3-u7hQC/>eG_>: MnKvRdH^फ़ )P!"uw[t(:/ñ*-RtF{ϥ TyK[x2NYhk~H.Rt2Cew6!".gphIAO~Ơ#{`' [)AחAgFol XwSGC ?Θ_Lθn g,?a&cUdrƆ'o Zн1Hd36NE8MΘdW'uʫOqƠw3_{컻b}&= j!H;+|6_\쾘G3||1?/Q}1%cg~z| /.+v_\T%* θZtƆʘ1׳it0.~ߝq[9䍫woؼq5|{sejܱO 䏉) Mhٔ3A IcxȽɜ8'|4Xt|DNIُ =N#jh ,ݶ|SdtF ɡ5T\hV!MbUH#W`.HOlln#?$b0`KQu5s ^8kp xl759Ø% ZVM?8h"H?>LU7a 0X6A8cU] ^}6M3?: Krw5` i=b(! |oZtZ2YZAx/Et XgMp#Y+\Jf#O)v<25NZ9.K'^A (c|&y{ێꛁP[ĽXy%C@ܕX23H/H%RSh|0`ы)z<4h[.p_1ЎTs)bM/32W^%v>';x.N<0ƣyq I0YhB[6{cSGH#4ۀsE.}"iUqY|䴅XBnR4օU\NvRHk:0Di_+Z_x_'u Σ.iį τa~OBH7KW8)7KWSAB:oΆst" d޻пNMtA*Bzq?is`͍d,2Bz3E1fr2]H`'Z;QMڡ>ya|=O'Ef*Z{v Fӟ VW:1oNL'ߞ=0ϊ՝ƣXj|C덒&Nԣ-LyV?{9=MCK<'_ 뮑^?? mt h,?^'U@),V\}vWr{*U2ߦnx|iBa&u~'\=o9/wgNuV {dSutJ#gPnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TD.svgz000066400000000000000000000005261221777731700221350ustar00rootroot00000000000000'zHcountry_TD.svgO0$E& pd< )kKKo!1z{׾v8 –hA:3\s!iΔт68[Ë  t<'VC쫧5LE&sa!Jn "^YV\4:oG V0Sc7ЧJ$IpTbBu!d^8 9T&8C+2eHR%!Q`cɡޜ 5& |H8LMj&;D L㸌k7?ebʎAqJOrZƪ~>.ךe)mo*%xEf(wQp}.-ir1Xb!C /ΚH*a?:N} jgYt4Қѐ bjE1!\Pc>N 63%" 4Bnfse]]J`*cVp*Z^~,=6{#(MjUEV핰+j=eQuq 8Dboֽ|ed JyfnsٯֽOwmM #f L 2T [̚X͉?<x^D#&xShv ! >C5E|El Ӳgfn>Ho+[<y?]s.47P罵Cڿ /LREŸ9oiIwtYFǑ G-V9ni}Į8##ć<"8Q I k_ `|# 9XhE?sMw̮?q3)c {LpH]Jh1 &3*Z U^^HOeaK J@ռtXF9EBJr'|!v Ʃa@eYa@Q^Sy.5LSz.OD";ap8D :0(!UMUDJRS/85&kCI1AE;źG!Tlp?wp˗7j82dF>/q.i&&f f,]SAdQJA4m !c Q 8+J8y8AIZp6,@y9: d3qRl&=*l7 rM@era_HvPX]Jr )A < t;@NT#n⿔^vq~׺~eYH} ^!k$|*QM4<N0V#4;B -Wy~`x;&bQjkj߾3^uL_V[VYm#}zF0@E!%& !SO_[SV[o6 _67:yA79f!| IE iL0 >7+Hf֬6Epoj navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TG.svgz000066400000000000000000000007431221777731700221410ustar00rootroot00000000000000=(zHcountry_TG.svgAo0 pb(%%SRtl#0h XR#Bd cj͍ީ s \JuhZ-&z֮iY[ֈ2o?ӗ1F$9 ]i.bse}zkK>]-SYSvc,-!vSJvl|h|<-\+z.ΰBY(p`N <F>tw-~ma[T,#gr_ſLB9E|cy/(~Snavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TH.svgz000066400000000000000000000005611221777731700221400ustar00rootroot00000000000000<(zHcountry_TH.svgr0G+6[sTnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TJ.svgz000066400000000000000000000036661221777731700221530ustar00rootroot00000000000000<(zHcountry_TJ.svgXێ}C{:ꮾ b jpVAXqG) )qϩ!9C1F/${zrԩZB}i7j9HJ~|VwT}oy]Ө7VՇV],>owHFZu^mvCvT~w7jAՏoUL&tדɫʫi2Rn~1{wzyܭ'r/M`H+on~zjXGC˭liZTD5*XS@g^cw]y/trΓpnz1)2eӮ]J,ۉ(K0ʬ*{+Bq7| \eQx սhw6ilj| خfZomJ}q+×M;۩9igu(SVTMF.]{EFr'˿kfN홇M{n7xw?%bo}{<*]yB7Y,\;ctƸL3&X_&tM|DNGYm eX@a!ZzI^g+^\4.CC:{Mᄊ|L@t4LB)vV`,ȑImlDlFBC^MˆއdK`gaLL8lsl(d}H.ӝ@e!`N *05Y%qtz4}LXb7>q?fR+AP;lԂ6-bmD!ȼEq'AAL.4SjI(% & 19wMz<o3)o reqCH3xT R6R4xs˧p\˥Og38զ\ goX{[hM΁Ix4>է;v9_Ib)L.RzJAmGdAq'ކ*-'YwF#D40fp(O,#n= SbB!>ŠoD. NحNըNg$iC5Ѹm%֘@<֗ gTX?r⡐9o}v@rG :htuᑥ+ebO%( LQeE Z#Tr`ct=c"`^-~X-Y^͗;lK2Mrm> T>3BIF ![U@aF FAĊ(0;} I1,93B 3:cf89y0xrT^yΚbdRi3-$'{meF D ˩*Q3ǮP#S((;]دeCp$tgY< |hxl(\;@;(*SQѹ*w3@3.BڅeP|_Gd1p+ ΍{`LӤ"PӮ,O{>LGc-HEQR³s)>)\8h%H; c.R6 w= }Sv!9aҽ<𝈰z; vA4ϱ沮1o:hdwjRE4t];Ֆi4/a4h|^><-/c܌i1N^b20`Kly%Y*U3ny fC5C`B|>nZwiA)ȮijhԚ ښfnU=΂l0k(}i6"hhQ|MAxtӼT(Ɨ A).t7/c]t"sȮfz渻dVM﫧 ,߰Pney(lVU=f7B/"aR}HzK-[OM=-7^O-8+̽i0\ҩ'r(iOf8!3,()$k͍GmlJ7q{D^EGa! kCA)t 6zE1PX';m2!ıX_eQr}Cptx"ŴYY$ѓ")-P)Ժ*+w9($N[!mTd=%mk ^ITןZ ;e4o NH|N޻VhPA=Ķ簇Ʀy/}ȞYv1 cT5IͶ-uuE9S\R Ȟ Doj>i{E=Lst,@^3lS*/ =7-c i6[#tv1i|kk >z?Ǯ/}SCU navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TL.svgz000066400000000000000000000020001221777731700221320ustar00rootroot00000000000000=(zHcountry_TL.svgUێ8}`]-\͆d[ieGEN`Nә2#XBU:>.ǶelmɊ+QT&y*ٕ?f To-kiѺN=:TN庐پ,˂U #5eܓJAijp~w5U9?E6buA1aQm?ܪ}{f[sD<(in K`z_ `Gi@V'%JwY)!N7dF4`1pλ[X>p@[D($7w3XV<ѯP7T>E5?kD`] `|G{9 ]m%Ҕ?dy"$$ E%ġ >)$$$;~_(zl qDߧ,0GI0p)x)A4h4Bq@3WIpPBQ'IЄ`B;3DÄ%whXM;5}?@MŅ navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TM.svgz000066400000000000000000000414241221777731700221500ustar00rootroot00000000000000@(zHcountry_TM.svg]_s7Oӽl1x\uUWv[qd|5fØ,Jzԃ~`ۯ?[rԹͫo޼^,>^޼|Ojx凫ş~xϟؽw w~͟{9xqQٗ{k_l _߾ş~7_ݔ]__./\ųrxoW܄ ^׶{o/.R\jH6W>xt.^ĞNɱ˛O?󋋟/o?^gbtᎂr^w.ir| 5x8 t2jQz}9үF\ G@7O׿_='_zH~]=tOW9V#7|sukNUC\Ew{eĎ6pO.oߎM ǂcTu] o(!kAr!.&;JeR. :|". ERq, (m;&_(ډg.]u20u^|͇S bu:sgrf\.Uc'%ٺ xt% I.B]Ag͸ixv8.Ǜ$۰tj vmPds0uQk6GUGMY`NTEޕݕ_!ۂ.lexoix~GR3R;v[*=72Kܩ6Q[׶;R@n,cfcs>۔QpKr^(z|ˊc(mLSy4G$PQ$"@eα8*Shvp-PE9lWSMq(Up 3ԢsQ:Њ+&ѢnVሇQإJPҢ{9Yjq(zLꃃC-Z0ICu9Z$}APwx _LB"xRK(-yl7~]@> gPHx\q'q"0[yQY!2c4ZGyC`K!1焍PNB%h .vPWgJ'3)  <-1z&"sQ\^a HDaLa<wPg{l$- /y-FG=#/SY|vSUٲ@AȟНOP/_.kTQP!CZT6 >Ha;(l׋q(Fh$MAHVx%{МȱJ9V.-[Nt7k-"*Zl@ *K8|j–Y}LϏPHrASj4.}wJˑ3VZ թ9'uj]|{xH3$3O$3gC} w̑&*f6G'9?Qedn!&3 N=4y1ڒRy i3s&Gsl|4[5#nsb%GJىUYMbNm6ymܡ<Iˋ74d& Õm}0-|3ɗWWֆ+{G͒\yd׶q ܩ!!D(aͽ= ?dK٫2OCCD5i!jɭX!mxm6$$+(M Zي*kOZՍѣǍ˰QJؾRl#+Ril)tSZMUZs)2OH1;HH:O2-{QH4a;1CFH6WdߢS _M@oԖZ^1l#T#M89Z?zREUֺVݸȚ۱Hk>I=՝n_Gk7fMs26eP/n {m=Q>ZTꂳ˕UhId_8._g1u>$sؔO yۏlMf!¸{ݖa Ɗ!Fr^Ql Iio-qټz٭^hwQW Ah,gCE UPVPm  b[S$]R8l"ӎ>_sw+:wڕ},޸Ksy-l$[ kؤ) uwXU7VHG*} VPv7O=R( )~:QOAGC?1 TRHehH5ǃe.AR(/B>-SdsO,g[o67lAFB{= k P^*K1ȣ8Pb۹R>qLΣ ΒE*.# 䞶3_*߳G(X^2]Ѡw/@ ΓYC{=_Aqqa!-s|70!)oH` ]懄.c:n]lnb϶D'G<OQÃ!x๼^9s 4E$vv8T R ͬɕ]=cQ;"׻w}蓝>y$r{TLmە}i[w6[d(p9e0YuS&a [skr4 FT1U+&ݪIb)Lv@UFIimb&UOj&5ZŤ7uҺzD񳓼IZ}Q(+?'+rՓIM.X[&0iݛϻ;T^c5ﺃg,p`ygQc@Տ(#}UT-|Nm[ ?n̝B ><2^S+bQeQ {Џ]9 0Lխ#ȩ?m&gBbRnW{;|%;c9Zq*i?;TҪ?!{scS5yuţ҈Ilcr6AvHu9Mw^3c+wCkVVWԊCչ9:ﳨ"*Eة S7=6n,j]Y}Ii\SGB%ΨąL0nH-bҐ~L z+ލ='`ҸqFrmvCYݛù^/E+ek;vd$)O$>7sCg_ff f_gC!lC"޷XXJ<1_}0Μn0lm E*"(m)+vUNOk%)ԅ zS>pRAmU`Mݚ>Ӻw\bۦ[~0`MCEʯ7~`K7?A~[mEͅlzo) (BJ_ĭf[?RZ^M| xlRo4enk4]u>惜~ qtn>S2h e>^徾[>M[h~o_glۣ}7>W!msf\ǪKm_,$Å5?, ^!^pڒIvae %m7*Fa 9r0bmkjBl6ɵSz3.e<$VǰZ-6D-np>jD|"հc8hLq@fR=1B/,hK;GTHE ). Q<4zjJH6&&0-kxDIMF51 ?:)J$ll F9V6F /RL5lZw ל8c` n%nf VѶ5ǠӤ'(ezցp2tSHjZYүC)mb$kbU6HCwOX rSOEc9`,,Y LzmTD1`YC#ۘFH/heXsg>ZXLգ~В)V++r٣ e ړs-r欫8@on{Y_ &J8Mͣ[k8o.[& r+&F_9Y79'kyWXd/hijOv(X˭Vޘ]򖼱~䝶sL e7}R71d.Vxc`qZf@٪Ge|3 :X1QF|lKv_.r׈!Ԅz !GYa՜|y(Xb__JvDT()0¤/Sƒܿ! ֿH~1FBݴ&si"gM5(o:HO:.v%qխ0y5|t^/<_KPej|/mIڕB;)ׁ7.m76\7 qO|t/<>z]]Yuty3&K[ZOD׋2Fr Hv6?>3Y^rvB\8~ R=$Zg=Z_+:P1Py0h# v %N:NQN* L4LFߢt^y,PK2L:)jiXeܚӡlnH5ojIʿ4|恊̚i: Tvn2^j[]DVvCbWbD9^Άychq'ֵS>8hWwGuIš˓dD;9LgB9E2CHwAp8ڭ fe wĕXar ,I ,'L>4X1F=uS n|Wqŕ:B+u+/`WF1ʶr'bxV5ދ57҆|,ZV9Mc#sgEg9 m K h3ضXy$p]33ضR=+ z()1t٠S zPg5`s™4v+/;|2i8j1(~6⼀w?zuG)rO%~OG( o:Hwy?:qw&=*KH IJsVƬp?ڦ3ơ:TS<ɵi%xg=uԞx$kpL;X6o4ԁZ|OrX燌>V=p$ :%5~UvMH^sc'>Jz?ڬ]%qֻثj߲6y/եw;^sSJY_iRM34wWZ@‡.hdvrQkwZd'%05.`dOX\@B^% |G9ڭd?demq KU.sThNX/ 70Jo+7$#2?Ĺ(#1H ySRzBylo)YViKmєrhIUdWH,"4ĵe>/Iek2 M!Hm*XYXS baUK8E=5QC3N';;96b bkO=S0Rl9Du"_ưc~QعKN|O$ftΉ`͖q/I6Hqu"R(!Ε*yd #2G+zb ^$Hgwus%K@,ڰOee l߉z4qEpOq>ocsz85~|nUE#Ń%DNEί_AίZtdS'GSB>$:Is"v.:WjikAJF 8mFf7|ZoGOl߶T{ $/4Jlĸe~ߺjWFv߈xc*3wlK|3y+b{=L| 8I6)>gE/mR ass7 > < siKFv?^HG[> %NjS?V %C%C>2 ǂts*c'2TTϓGuә`K씲yxd\|gˣf3Nnzs1hX\ER!|D1{IO~֍}xn\Zqlw<k0jlxܙkJ?yi]1Jʔxo[ʶCems~9jEگ_Ɂ"1@ 314i󛱺;~VLRBx[yRySyHE[*KNYJ-N-eDSji)+|Sn21ىrqMNd$əTO"zɄq{l5m18Rȥ5Th?RaŨbV uVՍR0(M9V)- nJqd_ЊX؎p,A/:UIGHM4ŀT`}$wt*Ýp @P-,]eSp vZzcjLzɦ4c{9&}($!qfU3^W㙎dSǪђ]msᄉ90j(wy,F^X7~̹FD|lqJ4 MW#.xh;|I;rzXNT0a[N7 {tnû nyGyఝFo=}&1lm7WM". "zXQi'LTa1ԔSт+Xmq 7NN+,݋R8V%qy~Rf:LuӇΥ]6KCEZAo|q >s{f2WΗfBW 5Y}KxSq|½{ĵVM vG55㽹ܴC]x0bWj{}#MG\[ +X39OQ\mwjk&jC)-=dQY(2,aYTgk&2]4u2YmID 8;&g!vmϵ3q+1y1\RNoxܪ%`7ոE-o4KMXdm7fj2o.`° y1ĪԔU\ Է̗6ERHoI[[Vli;ewz ַ[UU-Sf#vzVdN|;&olVQr=5rH) 4aWI}ys{͉s%hI%%%`6 5Y2} ں/[pFƶc̼ؖZ{X&[;,aD8ߴ6^mnr RG;wAOu)US{S7=NTWbvOz!Pd3V'vmt_=_"faK@`ݖ,!4Ci_M.uo Ec/k7ww)NdhB^*[) yH+uw(][ +\͵@b@B#PPed (]*2jeIu';y4ᷜ'í<yձa =Ͳxkm'8c]ɫ޻VLTt1pmH5ʯ `wc/ջíz6Ǽ9S<GB l:ƏUGQ㧣>OG}m<9~DFV07ԻaHst鉏'>&>NG|@ <^:у1aP0p*z%Ҽ_"KZs^?yQ<쨱V2Ե?sI=4chPpFA<2EAQǖ]JojyN>ݔU_RsQ_9,Kl;j^vE]DZ؝jꑍ2M(O:֨ K}+_=@ F͹(nC3wj (FYbOXOZX8Yk8AQp/fYv5-P:j[r$u'"SoCb -WZ†"KpxzjԇMDG)9;Pc  Tt5e|m|a(LN,:b4F;b4=VMQ0[f|Zukij1:G>`/J;~wQF ,6IVK*|6Bs=;_.О4TV#_R=J2q/s9c)Rj(6/w#J ۀ)q8JM=jRwNg\!bARb4f׃Jbu"FR^;E 5ω,+Wezz2;F|i@Q)aRecm`,e+Mp73aif0"p\ᄡ3oҪ/X:)/拥|E_%uϹ6ܳ@nڝk(=fK7ńk׉iwW0g8B& KTX8hSQĤY^#3 Y~G\5Q0$4+-ڜΕ+9r* 4|Jkqrqk0VXhi%#$C48/=l)D,Pb(fkC`lyJZVP\N gOǍkQ E_4u6`>cad 3 eׂ̓f](ɇ) H3m! 7CuJR2lڥIkә|f~{5!ܭf*nvw\V Y|/sWY[$&3K#lނ/hU߂ aRv8"cX0{LI<++ %)ڇ^ Ea;3)̵]IJG WM:`T JqԷ|aU '\!1taP阆-Pk~<&bVneׂF\`"׉r*gcoSξ9.I1k[T~ >c&oΧW[$sϤ99"Orr\ZNeKY85\k' vڄjhH chFgPNl{D}?[rȎ~{O "ԉRg+,qzƖ<_;}x7B%GT(KV `/_<zHG^F+޽# &NS =)eB8ѵ}31Mi9ב7X@lft(N̕ԃJ z)B;5_{a] ۝n8f/] E] LP ;lGb;??dl9hT鿭%KB(qӿ)tɡ|I E>s=2G&/ε !/g @B[=|[uz~} H' /tOnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TO.svgz000066400000000000000000000003751221777731700221520ustar00rootroot00000000000000>(zHcountry_TO.svgAn0E9h.'B=@, )АTr`Ta!(SJ1ETh,]>B sBx#l߈=`uZ,o*ݴ1Ng=j_셑 K NT&yJ7l8+rԺJzjxË6^b,i92Uh@Vj+4 O^|Qnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TR.svgz000066400000000000000000000007551221777731700221570ustar00rootroot00000000000000?(zHcountry_TR.svgRak0_q1H$MФ-ng+*Y?YNld_|{ޝ' /4B YD*t)T& 46We.xb >}\|K,WKX!mFmiS[ojQ4Ё#c,*mNcnEik5Um3ORQfx# VCpT)+g[)z6N: +͐1 vVRfh8>$#^؃?_USHf[C9v ٯtur{4XfS>C79"|h)ݻ9 *lUZ{kD*$6Z(,`Aޔddp Ն3|?" YHow} kǯȿai:~UE|navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TT.svgz000066400000000000000000000004711221777731700221540ustar00rootroot00000000000000>(zHcountry_TT.svgmn E׍m ~AdmH]6Q\_RUubΙa#w8E Uy^g͘E"vKƆaCB}0,VdyWȕR lZ M425Ý?j@$A%!"R zS]2&_KI"#w Z̄_[pD "-te?"y(ޫ仄i&U$KT>!iZ`! 9fE{navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TV.svgz000066400000000000000000000032611221777731700221560ustar00rootroot00000000000000A(zHcountry_TV.svgYn8}WhkQCv_],(P(}8!qߡ"u 93̈hfmݪXe&ۖJ,YN`[$Zgifx5qwJJ/uGe^j ]wۡU-DYp-ǁeY0mZIѝgdžR iV`8R۟;jsP{U:%:i;#nTbU߸ , .|ے "(>QR:63h%[`z)%3|TvKZ,*Kb\@\_:{AVmf;pX͆Z}7JGI#Zp#yiV_8'˯.\ Yf}ъIB Dbu- ߁)~:&qM$YAGZ?Ilm 1uEJjDmCP9^=Z{&Ud;P:Vf'd >Vޕc€xcCݘX Acs6'Ep E-n`)3HK Z[)lgjq(ew!iRuyiL5E'_PeAC& #^TNO0:@Y7hKh#Z&Τk9Djx(JޘSCo*T*͒MZ)hu+$FeW[UB3ݲ`Z1L`̭?,Qf)p|"hAZb> 8>b_ad)(=d9X_difd R >܇@0 Rg)V*$ثa'̷lQog G!8򽀐TIQ 2E0:a5UGSE3SE0E\5Y埨:*򓲊 gI%=NLnnR <~a0Wv~~å~/W_xv_1`L?*1UOJnb1<4^1W>PU 5*+E&30 "AVKijC>C qΤ GjgI: H$^9;44lcYc =HHD=?29{IQL9<aN0FӵXbV-j[v~2ɯjB fޯ_o`6մBoU®E[mj|'}|d.ajdUcyy*ZR:1<#-+2W}(Oxi௿`L_W?2߶ *I9{BjVRZ*ՙ Nާސׇˢap*a^8B^A??tjNι 8t_2ZЏno ؈Ό3vu \%'Fda =`p,3払2Nr0&Y&00x !NPH;65xpqRYqX9fhyYTu W6:`7 [2i){f=yLw lnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_TZ.svgz000066400000000000000000000006401221777731700221600ustar00rootroot00000000000000<(zHcountry_TZ.svgN0EWanBTu!+nb8Ug l̝sg7φժԅDY!MNJLMa[q1) >CJG?%k{WYnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_UA.svgz000066400000000000000000000004121221777731700221250ustar00rootroot00000000000000A(zHcountry_UA.svgAK@q<ɚjU-"*ʒ$qSKW؃0{j7Y"X']oG|6'Sy]-Xmo 3 *7%FxDunCO|CCA[]Y bR0d,Nb̉>a\_Ϳ?xc iü/73\,9r|\j'g~pڹMs<\<\[ޜ_ u{;7zys|_C.ַ뻇qvq:i?A#.9>\f1ݰ^ p=_yCI}7;CE~u\䃭w"TW>MdD;/Ctq cR}nO^^(\. yܯ\a=ݞoW?ŋt0/Ǟ%Q\'"eA gJ5NQ}&u5 TR0 nt=hz jMcoC.8Sbg]!_ [W~`/9(cα`pdQ`uEa0qcśJ{TsT,Rqr;Jy$,#į&c-PRteOB"(4 PPKďa9"T,c)8R14ir4XS\Dkf}W .S=}'C(>ƀʐ!o^̱@~ЛvMCP;H][lcn ,"sPXH\~C&$KAXXHΫ#v fH;$D=@%uxޭ;14E^])%&L^Ed df$)ZXŦWW±$3#;1-tMm,*c Si-鍼JܭXf>/2U8D 1@尭$ȞCer2g6جDҤp$[5)-!Bc@UXaɩ9vK~L}F]`~tBmgv2po@; &а$TbVEu˵]2@OSH`5 +~ްY3ab(]Ix8(PF4!moUr\M{GD A"#a{cHʆ-UDY1@`BU)MWw^ 墬oPyd꠶t\7؟B5FXY| Z C0Vkc/7zV"p^ } #kyS W,i`j%g1L[ 2f1*Rm@1ܒ5#8Z4 ^8^ [eFH-:l}&=@(C!Xd Uil j7vIeOl+1v,Rx<bh).Y֧du@4 jg f( 2Džh?B4ޛ@MhN!1ybSeqUS j1 ndsItVwHjʘ<bgv/qqm 3?D1Cۓ%¬/YrJv-uFsf{go'ge`چ^.{RIIZ]Atbޚg_W,gmy@6eGG/ҤstC | *lB3I8025j@7jAUgHݬz RIٴA lN:W~4[Q[06M/[%${ Ezx驢MO1X =N#b/j45kWom:z \$?=[r43. C?!=hjvu] DAw3YfѶCS1(h/ MͺCTxE0#Zf>eqrm7n8;e:˳V:{ld-`]dn%(Po&;_ZũrC9j-| ônavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_UM.svgz000066400000000000000000000011161221777731700221430ustar00rootroot00000000000000C(zHcountry_UM.svgUKo@WL6[2c vEHuZR lwE`{,38WCOAQY"A8 ]tj=q.6_wP>pwOcv?nh"!UU镡gEo /}%+a)G I-㤥CgGݴTy5U>"].9EPž$Aa$\dqPgs.FZӜꝓ롼vpml@b ;vYgeƨX/Ie0(aS%<(JZr`">rS[].=U%@qĊ8\ѽs Aj w3?ԙJO 9a#09G`#"siu贖f[vftE󘨕Ŝ. e+>kG~;֓@#navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_US.svgz000066400000000000000000000011161221777731700221510ustar00rootroot00000000000000B(zHcountry_US.svgUKo@WL6[2c vEHuZR lwE`{,38WCOAQY"A8 ]tj=q.6_wP>pwOcv?nh"!UU镡gEo /}%+a)G I-㤥CgGݴTy5U>"].9EPž$Aa$\dqPgs.FZӜꝓ롼vpml@b ;vYgeƨX/Ie0(aS%<(JZr`">rS[].=U%@qĊ8\ѽs Aj w3?ԙJO 9a#09G`#"siu贖f[vftE󘨕Ŝ. e+>kG~;֓@#navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_UY.svgz000066400000000000000000000016261221777731700221650ustar00rootroot00000000000000C(zHcountry_UY.svgVKO@+*Nm 5mU+V Nld3k*|8͟ SFt*Mp/Bմ}\<ϊEqk l@KGФױܤȋ&c!mrj~%T*Z2cp`,d9H­AoX ĩ%d|+chn,ՅӨf)іdlK+ZNˠҲ̫U&m3z|jUF_\RŕZD 0\Eh.xLƀY2#~ c&XC t| oli]Ŋ>9c&L]F_O[w85K׬D_ݭ,Wᷠ<., _~WI:Ζ.^=y~Is918v XnU[ I֨#} F-^~8C1T q<|4]sGp$;QGq bbܹ?ֽiy3Jn#)Z)>4)C0ʓQ)mMC;cqpomXS6cG7#q#xhnXMD{Rrn%#X50 KA=eBBgBн9Qm@ ㍐p^"1}r hjF`pVףƭ@V-<õz~?@ȤAWPD+ܙy>{˫PzҘ|k;f4Vg%<ߒM'}dm6~n>lH_KΫ0:Y,ԼdP&1#wa6~z~z:__NEI-oF+ry۫6IOR9[!˫0]Uz^ܴYܮonׯl#5.=&x>[&' QB,QAzC Y,_FoE}~9GGտ/ 7Y=i>m"j6Mg?ُHwVyV Zl㬱g>ӷ̷ HI߻|4!)z;(_b*o~XNeuAm\/fE[Kv].Pl1[1h*$ZoR`dUJY++Uxւ ʑ,U jqÇofs)(X {Uӱ:xzgJ-NjmRt(F]EˋMV1tXWw,o$Ͷ(YIb6Xh4}\U$|v!MװPu:a+nWg12&; jcU(n.'k< SS: OKNd`2' tNd (t' `Nd`2`2Љ L;RP!hZPQ0@AiS<!HТqFDmP{u|3艞|QR'D!|Qm#&M>E>|VOA>X9h#`c6JM4)~hMߗw))Hd8% #TId8U NT8YDS:TId'2 ,3nHkwj1_W?so>|w5οK <=/&V]7䜫u1׺N@Y*'n* )p %NPuiR>@h嶶7c36]+\TЍUF{E'!M^Րٻɰe$7lhk܃00kczKhMIB J}hӺ6RWflU)Ԫ!">J.ͅ}Tsg)4}f$T"KFG`7W.9UΟ嬧I\ne.\Ұq0A+c𵯵\ʨtZ[sIRJ5$듃/SWw*nԺY>^/힦O?z^7Zn9X XX-&2=R'J5aJBQT* Φ79Zf Mm^ہq;=={O!^jhm-a3\w1`2WX syl"~mє֒x-42K:[Φ߹-ah}.oXDϾlaV &V6c{0y 4ΰy5D<_ ޜGy-㢚f1[! 1@^ѮC+ő@?0ҩ H\/CM>M"e&zW"s 1Dv;SH!kyP3c%|~8GWx7q3a<iws^ G`||Z1ߝF`/y~*yĜgaW^!G֫Y!vD ՉIz@JLi?s7y#4,QOEתsiPF Bg؂N3; vڐ:bz{Mp/MT~-o>Q3>CqNƓAIS<_FF!,Yg\V`r/9$9bƷ"}ex-e<cf_}|ES|EtWTuE+jz{=ǧtRv|EaQ C6{2>hw̌c|kW=xsԦ>y+cTi8< ](DrT;PDxlKiAl=;vjH`E^[(9^B(a l"V&@00šqhخF!ӂy{xKcxA}ntY9 vd pn irˆcmd.I]|c7Vml]k$V&:y#'rb =}s^oi`Cz eM!4_yoJ==|(mGys-"% OE92[*5u $4g/, /aM*gcv.Xd`7 رic!XSG#]]|@kn"*LKu!v2K,B4G,H O2ce(Ln]V+V "cgg"~)SBaJ&6m0r7 H;P|E`pC;;t9Z#% Z @RetKJTicyk}3lcgFM0D>Y+z#J;GIFLV-:}C|}[%JOQ i5."rÒ1g^KIr:*q쥐jnϔst*2A6|2aC;49_q|Yrd LVbHa #%9Lo'A"s 9lWC05rC- ֝7d9_m$pr*:$1zꄵ64oT܆·^GZW>8t"8,xYW*UF>z5D ^ c 8r>6첂H> {)|`S]#u.\F`;4;vLT7|[o5kSL{]y$JSȔw_@Q6ϼa)dG!e){ ka1DY>EMx,"'|8_ZTګbMҧzorptJL0D$ uI P{2z$~mɹ@Ya+&LE#XVjdύ_EKm [&>L)Kk/*&jYIŞЇ47L$RudB6Ul&r7-6iai9PlIa4NGh-"G+ULq0)ΖI0y_1f[9RZ$i >ޫ.KqT4ӯswƱoJwu(*H;J_ 6?QdՋ/~azZIk|uaDbIutu7P?dJsn"EG"wS"rH d*!t*PcBR5D䤬nJEDO֑b"ߧqmh"&)Spq) ·MzՐqkq1p 3!,Ɩ&J Pp̯WMӊIpP0x-HFW@[mܯwy?sF>rF3TEOf$R@aOA&mIdI)B7"·i E(~,akdL=-@ LXfjjjF2ri5b6]W5 T¯s.svPdהٴR4_LϜօ6*{Kd~~kz`( S3M1fl5[L4lmHeQ\SjOԑ=Zu&!CT:6*>?1Y ȍ!%?ʉ)dSOnN[i^ysX)g?Tm*Ygd(#Xz6Zύƭj=@W=œ){'[y֌dvpڣЭtg擘G}dЮA(fgqȗǏef_e4Ӓ}a#Pj?E}Px%ʠbZ^2ڃk-^O4SX{|.fҠC}xiz=kDn%9fo:4@i:L,&ǥSd` bq!AlR S 4"&xb,ajz"=gWl۟C 4A r`>.<`! )1ɩdYn1<|?N;/kqlyf4%_1&{Q֝@bрa ˶l h[suyxs=2G2g3;&BJ3I) |mtٶkm4#}ݬ%sJ3 ̚эLJC͈_Yy<ڵva6 k$ZkۈROneC1~xf,`^^P9K\zzrBxjfj&:k"F(aI7m^^Ҩ3ZAK66-]5.䖍&* ma` -Q1a=.ݿR+1춦2UKn2_Ҁ&E/î9?M^ʕb&ez]W4,痥w5C7}/lzSe2gr/sRSc^B$ `^p;_IW>WiNC*Ǿ@R[:QϲN&-M 펶3rGϾ]Fj3} ZY:#٨:t̕QIgEI7rKNe4xږq^7iE6HדHf%Uڤsv4~W{x<&jO3|WUvjvyW|jl)dxe,̂z9M?W63> oL;{?a L-K:*V ͘\&L'⍛]c`P:f&GYb|"YHQx CgΧ ?r*ܝ̎dA.K0^./1A9ёӥɧn!:]~r3Z9y[?x>8Hh;&yNȆ͍˷>8lܽ(j7Ϛa@Ӵ0SsÌ}K)W9a̳a._uw3kOͣT7ќB/ Gd MMӬcfXj_FIEDWDqf8t+b[y$i|` k={8!bTֹ4M =̶>Bj[6R^ նgMPʋT[Pʦ_P8bQ _M9^Fp96 hU>\tvRd,kw Fk?h @y)XmkvJ}&i56lwoJ{J=鍙[s'}|7 oXƨtT!5>ư'E;x/ #]ԙrcB:Y"8 R:`}F}:,e˼=ɗ}K^}+~ݥ}À}1Ixۆ2xϏ E8T+e6۷v2 c6SaZc{gi4^pcoŒ3/H/WꇷB~'B|{zFҗZ^> 5 +|m0`qdO}+;Mܮc.8#Vwa_ Bu;dBx S܍$7yrE7e̿HcŔa/Wtt͍st7 Z~R,v{S;ˉ^bl;hn{7 ~LlWůƼ;雳]l\'i>_4`}Àf[_Np͔y Ʊy - }pWcm0`>jӯVvy2ʛl܋qwa=MyGY 4|Oin]mmFl|7#vk4+|Xkw*[cwxq?\q ͳm՛{aؾ ӿNj:tܛm\wy四aܾGz8SO:9Ig9N]#}I﩮`\|^<Dh= &8*_0]oj> !Mp'N!q[#eW{'{`.рteRˁns\'L ϲ9sNO89wW.qr\898/pr)acp_qr<)'NN!M9hgĚrUzBI 0$"P9D$/r;%i*TNP9&z /rz~ʱ%TN̏P9<@6ʁ%TP9WTT/r{*'vP9 o8dGr/yʹ~ *'ە7@rNC~9sio+W8\UrұUO0ދ6P9epʹ.Tiaruށ`)D +Bq JKS`j(rt!Su,xFf_Td*#lizG'.Tf l+I g!;njFۆO) 0 A2؎?z+-Tڮ ?$Y`RMq4T !$hyN/3j22e50Q4LFTHD[hs>mM2˔X'19K9S$[h[&CϦjD0R**(EX`5=\u_uj bSfD|%W [Tz3N|3|teuz`3Ik3IhQ g'쯼C)s)ϰp=9#eǓ#T\3.Tu IC^J!.Vd UBnR#5T]oKQUq ?5G8(dJaX #DP|IyNBPǫStСX^5opue1*ǯ&԰þ̪JY nh>%k R@$&XUHlMh?|K!$/ۻ9amm/^ ;iI)uBo šoku$j,>}+/'ח@@q[m͍jDF?c\G^wZ33|P]XtӚ<(=*r`B @}'AP-ȱRkr}1S l[,w%r)yS]8Uڌ6*y~tw"Z]hY}@Y}x 3-xQ}@,hS| p _jY#SЬXq0EO 4yC83R#72۰bd4Ó& <uVvܕNT%tH҄ՋAe sD02g-đ2\槚ӛv%E># ٗO p_=o%Kʦ`o *+WLҽ9sk*3f7q ,֐nBvbBڋk K*{ߔ,7瓹{N_};3kߋI'Mȕ|>uBmEjRtbBZstד86C.q Ε⿻ki&KHAy bOy@$WEy Og| HԘ5qN۬:]%ƪ>.Ȇpi(&)*-a!E=8Tb f5#p NO cVVx*z*{+P)ǚ:b*&M0^WŽ@-Uk@?' ׻I,γ36ܚZdG"1T|iUR:!'Z"-V'ݖ2.s eZ2䍎OC}]ax37l4^' nf7w-<@ToRpp<(>yO'IzM'9>swS\;-zK$!na,[j4s)67mp_YⳎ+ϳG>6u^r{E} Y?W,:}FxygNx?7{y؛e=M &fO3{'-87mbvB7e=XW] 7F|x]wOl']ie03/OEYEb-B}9x^YKʩ͉ek!nqއl QS`ց+f环UWO0&{m\>gRQ imTcjTW*plLXt^9N5⣨WjMS3ӒӍڽ.BD$OU#mه ]'T ) 噃 Qo~ݽUX38,% V fw05tªkpQ0EFmAnK5$/ &*wE or%zTp{SQNU 1%/%TpkemN =It~}՗AMNg%<t~S{2dN uL8/Semўn`WpΦ7u; 2f8O{3I8ӄLifoF Tp; -TpގN Vp}mi iHNr rP])8jܮx,'| ric&["},Z]76@*nMg.LQuNꗜz,1^0 "-63y}b&=U[ZQ-j\)*?qΪl?gUMmUΪ?UE>gU}џxlSVu3.sDf*D՝Ԗ)hsY< TS!.ghgnjϨ+$E|zMLm6ipm<\6xS&|HYD/N>g}K;Q28S^7vwnYKL9-Dj\5,:{=P'gT+y7鏬D xW̥W/%HkɇȺVK+>njo/`{3V Eŕng]M]mRNN?~ƥ~\$-ԙoJl"{htE7&Dd귮_ЪbzX^օwloV[eV鋱a/>ݥ.OVrop{Q<]{~2W/,X;м'9`yKmp>(iSO^o(] }/Sj n#uuNw؍YOc  8vzjʦ.v1r~(ӝL]e=ԧ!7%-jbnc>i/hfk[&)hbA7l:/[T #.p75 be#Ԥ7FHW$]NO+JK8#D?/on6s~< "rWGtuBsv6򇉎Ioݨz+Ji-,2o#X[y=~мO맱O!m߄Vo 7G"۫nǧ“B{Z81Ya%yskԸu9 ay~ 'cwj<ҝu~?}K{RYe{zI9KwˈO6.MS, -@T>*GԪ&!OӯK Hax\lhuBהKzd4VnʋzYT 9u@OE>ۜCvj{Te2'\c'roՏ+U 3A$uI@x\U#+qռ{[ir3)U3`o&ݐ2S }!4ZI(7o*$y[#@[4 eY5gksƵPI栀k*\}ШUDxPϚ q1ֳQ^ңQ^v<2w^wu-DI>OӃH.Ż1RCñtɉaPC[FH2 'Y.t)f"JneJe8k(Z@k!u]MCf˧Ae DD ÂkS 44 ˃]qpdvd@.YbSKc:'Y{5IyFV`KUΠX6qԵB4bpf"*fc$n4S~%4Wq  N=Bz2$1)gXckJT$NCBImrxpMu!D\?7A'͈:m@|3@N joi-گ G?$.)zvF$ <_ dn7iVch<,"m7cg?dl_3(&%m-϶>f.>Cg,!/LwS.>Lt) ~K<̚+Gz+E86< Rs8hpM6x\nvդ#b,.욄xbӴREӌu?MW|v7z'[z"4,{q~\b) 9\;x(M>vTfmdЦEw%׼~ުZ\d(a TwJ/LQS^oFٵqTXdZAwdo>of$㈿9'?olb\jq.݂y*QB*+)l,(J2>Nm(G !<3x NӋnpΟ8r@v`[ʯr^1U@ZP57$bQe"qw߉.;au;ٹ,@Q+Zm[֡7ٹ)K֞t$$([e+MPz%? p*pMtnsBqFvJ  'Zi .+iSs̱>SG'a1EIe`9&;k$@Kv"[(s2mP0毛ʕs,Z lZ\'$jA gGHk S{kY00+IĴPopEluD6; R󓹗Ev{y/w$U-C-,p2nm-e~$Bţ>1+|ͶT Hxlߧq3>8a1IХ.@Kk0D+n^^HvgWz4m$\tYoT@MA3턗We+~`SةLM H-pB^Im:8;e{~}ӮȉVե Pi-Oو.;!4ΨSf7[^Bȉ\NS7JR=9.z8ƴ6چfŞ ԜJ]WvP+V~m8E˻A4 e{]eT ⊔wM&g$ȚP2[^+׶<Zq\u;Oel!7&p} sFV&D첕r-Y΂ )oŘ-,V\B^ L k.[ul=tGҴufRj`N1n׶]Cǐe6Yy&ʂ0ι]vgr-uVs`ãOARjO> qvkBڏ~ Z PX1C)g3Iϝ貿s曺 ];^b[βvTWYy5kMo#*xL'fBGkvVRx*q *(plCzeO2?$1pn/}:'r%4Mq_?-yPTUV 3zʣ3c%7 W߮R,Xʘ򕊧MGcgO?*_ˡqA,r}hK^k'ٞ|`%DN¹S _*:!R7T!|li#v~"dI,$#5i!]J#5UNxs)`dc{X>b2W"4 zɋxt:@xh98hD{ѳfP{܄R>A{=nou&c~æy2aP:4ҋ,IΜ '?ftŻU?S[4?H/"a"ͩw8ԾFNa^0z+:i7J'Fn hEW,cCGY'Ih 6\mMTMnRwhCPVz:U}r΁V(?YPu'섉nRDIQuZera\\ƠlP K87+ג)3⼢j M@`lgu/܌EmӏoÊhQ1#.y!A<-J3)QK0 Ud5мQH62ؗR\֠0g6v=?Nb'|9w6Etܚ U&?AM%z+'9~<%(яHEv\wb洕]RgeTX4J#' pwͪ3j6SmAT͐U5!f3+C'tؼH39JXbSBz7VߦmДe :"﫛r Rʪ,W5PIS9뿷cʵĹ+iUW8# uŁH^ g+q= "!y4զ~mJj2cQk#ݪH8q4u8w߉:uh>_Kz#Hvz4WVN@V-Pj:4mURP_!U5- jMa=;AYkEu,/#3iQQ9 '.4GQGהWHufŪys1N 3j GfV>UqeL=}yCSt0^^㶮.O Szj0p#'e W*=uLBT$zR=;&ZM%tM0E5]W$赮-xg$!#oمryY.FRLXl,5F쫺 }-\I UsSk ST95_,)D=y dS 3K|XL1yN=F-ĜY*F!VFxy^ kyia gT(ض˖v+ xz]5nN$#tjVJ׿J.LP` ﹅湅Zک_xȘ)Kq*\.]6ulVfzY[Ŕ;U k'uV'{qݸSkv HVcԲ=[lhn]Y*EW1VpzEIy;?蠙azkJ\~vO /\Ts<&b6r;mq)רP+0Լ!4ar$. >j|]"VHr%Sj]mhjs^4zmZbtvw7o@6 jR$Qb5ݓ`@(ZݡR+hgH9=ʷluD2.^>h1H+2#JK`R8ڰjډ Z"8*X)6룮-ǂNa,pZ&I\ }6|wiNgp*mD: 9\ajIJ4NȣǏeCѰYu4G!iX5W&'J)>zsR9(}y2%mF}I_lY]cq1q`jI(KSiB}ϓ 1m57Mihç.xqW~W_[UUe?)"ohckio|lka;@WL)кx흿V{[@0kW`4)^ѵ_]{(i.E5&Չ:0xͿZ{o^!h޵u=w %̕OGmsHEjpZpqdm7#AU9cRUg.| tP_UdH.3j5)Ð`` 6%2zCLu0SzXtks+It!osj֎Wu-@_%~fR1H;qUm(L%q), @B+7* /ZBԅ];ɾP?;]Lׄx8ݯ*:REj8&_TԾ;&2-CQY&ůQ ߹H gɷhEe#;O4{b & jUHF_zVzO" `貽~F&<.ZlEۧ?[Pb{)ld퉅n?BД;!*ԥ9U&+k˰N]Wf@&Dw r4%S)@2 , 69=r{2:?jW"0:t'4dx&*(E۝9FoI-& ǖQ[hCohzԁaV<.>вLqF&y‘28!"kqAoc8u~FD#G A6M{B'EM@ـdK`!i8+TD+#g0:{nӕ*K#E;D9C &0 A;e%We7]ȶ"NUWr,+0+amŋ i/c[  >BWD300ƶFrȺu[ pG0f՛[q1k O>t,1нI]M;e'7;g&ʖ<E'LsȦc lГʣ䲑AEU囸~hc¬2 R}lvuY7m_/9貽qd#"AwOۙ#G;Ј)[9V`:`oDGC{:@!Rk Msa4 X&=p{gwO˜Ih!ۈ.;!fX2wVnk Ww+܉.0eE/Dp1/iƅ@1a!zFt^Wq)š-#t #$^aZF1䲑Aw_OB5I.AV1_E׈Leef'4ІX uG7fVGP,^() QvyJr7,T nJ 8Kx2itCqY3p"&k'tA9S:EE,.NET3iinvw:mGEh9~}{D#6`qpu"Ztoڜ WH 1i--Eݹ 2bv#SFs!X2?EJO YPmztע}h׵)*ao"0WK&r`9\Ai+m|mfk u_fTrM }(0Ο,`~lcկq5;dwh^g$OE4qEg@S| lh^ pf< 1E}c۞i֒<*Ԓ$ e~aiǎM [Xw%rxR3@ntQ=Ew/5, ml#$wxY&J5l\gp{ݫ$?(ld: Z_"\NwBMaK`f1V> ] ,H6PmRdIt܅4ip]Kr[:LP4¹]W&J m>aR -ƾbqlu%$SX(ޒMMMŖդ=TX,DwXżF]W&ѽɘ4q4l|Fiv$֨E0eUW MdܙAf6?%Hd,Y.9]9gpe*?XXKc4WW3 7,j ^7w+r"eѴM`V=b/;Q6v{` )r:37~qU46eHZ_D1̕ :Jm@)Q s8`oϤV5#`u t@~gUqBm,C]vB"xl 'څvK,,f[*Zނ)Uq+m7@.L;Or@V r5W)J:s\e҉_}`]0Z>BcP+/6LI3 ٜ] su|3PeO+qO)ռtXdSOVD? >Xc|Qt 3,"]ytQYH;[&U#US(uV@i ue L}6`d_䣍Ie2 -IPkUA3/ԲLuK`ʢLUhFn)ΖEmf:0OE=eͧSeּ">e+I S9xf0T /? lzT(s ķTq-tƶ2+Ym ] ibmȒG܏6ow}g47I|1p8ϒX/xD޵Q7K)~zR؞(K2TR2IiH~)?C0R'6rl Y(❫>.kwK:kXy roҋ o+LjjikYKzu˫m:Qv_̇@mURi9ʩ*/hݶ@w4͏~9ž"g7 n8OTWRl~l> +Oz%E2pYoP6INs94?3H@ p/K*0yd'IGWؘـS8M5ѹӇv?"yc~#{wLxaR`û?> f{]FS$ h>9{NSH{$6 p]j(fTZѤE̵yt%hɤR3}XS0@gw*"S"d5"xߪPv{0GoNZ6?I'+eʼnc_Z&~?-M+·\}.p0onQ~-CHA;2wsk.^i%lq֦AՂz¢5@V::]I0_%Qbk|<ܷI^O2?|Ly=d ft'uf) d,s_EfcTZӴn-xΣ$j e?ſy?GU*|ʦK2Vq3ʣ=4[% iB Zafh y?6mXjvѐ8{kNTp"h?zʻߒ.vΥDI~Hm%f .-70fhlRuN/wj9\`G ̕Kʣў9-rLHp:'dziNx>!<k`,2aԡRW'8;]֓:%N7#P  <˧&coڜw:1$y6HNaPu t=NW`Km~s~g :2RL):7NN!+ ) ӈf_~߀. /$L{ʸ#XƆ⤜NpԽ66 Qo_;AkuWzFh6|2R&ÜvLԪyBPtrҙ|l&)[nN^:I]i=a=^-Sd@` 1`,-s˔.%N;swME%j(wY@*-dly^wVLFOXAL!qZ);1Y"lX@VE*u\YNSH/KB4S>hi[sI!N[(1̨|3UyABRϨ6ljߛjg:wިUj?vVOARgf9k%ȴ ^8һ?jzFwUT=XNEdyGyWu{uϢT`fQ(_,d똪0U5s.6xz8sv)F(疥4bY(E01@n,dm~awG] I셑o+;BlUfpA"텗׮-f/OQP{K=yuƽʵ] " ,)XBSl-W^;T46+ AbM줿8 ^4V7wЕ}Dw4@ BX몰Tmz]S+Ĭ ̹ iom74kh ?|1\;xQ@b[VüM79{ L&RkSo@`"|*bƢgnyect]{k]M chZfj`#OjYzخ+B}쓭 5R)t}1J FBw$ڿ(AxyZpK0Bt(Ɣ~& Pp$7> ϴ'선hb3p8ʒ'' q!uuIPVv_٩甥ONN8ҼS8 \.kA1a,;e'ýz]C^ oOS9ڒVt ռSwV@ZwQ0b9@n`~E4 !uh)m\)A"|&Ap*U]u$~  w,LVI->ThZ"l aj.LM9(NvJ.K<܇5A^պ ^2t xAϢ첕biѰO,46tjԲ7f_ةIW/@.+),AZnX(OIcJg:gd~ jnaFt 1Mq#e.u3zBۄN0'< ,2hi#J| ;dGa%.wx^ʿzvi.C4׮VAkG.y"X2^)v[í >9{)l /]+]FzGqYY+-^lU϶ޛ fqsI@+W;C~Qcֽ &eYx՞ KH;ey1U%!Pg¶eFxsųK>S¬k,\毀LB4de8)[C#Zr& FJfDN3A0 ED4[ pwC*D:=;BɌ>w<$s eyx\< mNshD>&|t&nрoT=r)% " Ne2e{bD %4nGت@M(2MEH$Qণ.V s{.9VᳳzǻTljQGٸj n0?"AH) 2% ;&.\?q nܲH M͹ ]UE;ܨX 0HfW9O 1-B|:ɍzCxNQ2틅݇&cUe [k1(Y).hP}~ 38 c8K f&0|w|,#Jc<7M%zHN{']N+]x?05|Il<%D#'EdYMMAkȰ7@P> )2w!4f‚(L3cpr9 uY  3^=VDbf(<+kgA aPm:[kwN',Cᗊ̼4fscjIwjrQb(lhsݲKe"Fر9"~`c;16B~稸8sA]ڸŖCdcs%u*gc3Z~nI_uL< 1#;BD*X [Tt^%i'4j[K >u/lJ Ljc)sUٴ:@Y6Cn ɀRqΡcEĔD 5 !(Fǧ0^Z8Z0Dź$Fɥ*9xnGV#$ ̣M RfXV0we'l 5zcX'2wE d(c^)9qy%-Gi:0 NqNcBy'ltY7f ؟H#rȚ5(I&?"/[iqajJ{P,#4n8Rl.S- S]l*d5>'lgvF)_1a ׷5f/'~%TVwIiLJ"4l}s܊].Du&L,I< 6XIzmIDn)i7*J[9]m!bz,;ϠDJ*ޛ$m8'Lj[e%J*a$h'+A)A1<6 ,"k" lMBZjJ728%5f25meBn_-to.3|]pEL]SR3Pl .&:@JBۇDżSzԅaͷVEa0Ļ[ZJ*;UL9;dFۑM+;g^0~_!*fWm+lKa1V ?A|"1&*Yp]WYJ:g$ ܆>H{r-P\t(ǝm-P "#^seC>x}/rl7!|QQT-+X fEWN!&(Wjv$SvEe/Տ"7kM 7w͎܋-]c9Ht7ē~PgG[T0pTbF~S:iUh> 5T]U= .6B<ʬiX:<uþgp@^CG@јd/q66n8ˉkpIg犚fF+#IV}XF45ݡ;m'q)K R{_D~Uq}Ȝz +:HCN#z0k@>!^ZU&Ӳ]ć ۧy1J,Ԅ0F 3g1\šE8y嫝}f a('g6bu^,p,s YUg.8&1t[{[U,FίH/^)amo! >LlÞq "뼨$?.j%6˃4%y*oۇ2d˫W۫ ֝-ҖgOK:6f׌hE>_|ê@} sPuvU ..ٰH?C)2|NȢ8yL8d#? J ۠gq +g'}e&8yDu)]-Av2t"__eVMv 9(ⲳi}e%[Ӊ3J'GQAN (7sBMd~@@<[ٿ_e 33oS=Lgx -5qoW_{o:igho|Nљ9'lsa kWsk/љ'vs?<<ϡf\-slBCPE&?,!@FYUڔzU(GQ{;{%3 Eס(_(?` TSӰeTOFI,f U@y8#\#̶ 拽3 dLyP>t+ S@.3z+iUjzN7x$n:~8Cx՜}-?̎J^찓Y]>wc m*MF sIO*}ZYv^57ݽwOS_@IMbNx7R'oC0+yx*I8HWt@fxd,;w*B(w6;vxq%^d͙*}D;~q.}5Bp4Cz%0C[(=D\'.qe8a3Kngt)CUѰ(eJ*mZ)v/On29LTYSZT?3N'q}#ꏶ1mS'MyP_I~OsS<uB|y4Ai45q<3T4ZϷjgtiWͧ( 2Xl uA& @j{~믧^-2 Z`WCm1`"< 䘦lZyT9zp$Xb{kO_02N4(C@[ UJ* 2Mm P] ބ Uw{BY9֏mTAE ¥f FT"sѬ#Bl"c-i/u(` @ "dz`A&!H•Bv FV_m۔++ M]-v@$Tĭ2by14hA3uS`'_6=V^At h6Y)ee;lՈZSQSys8BR ?b<U . ryATJaf" tV C#E d`=As!a.Bl- Lcx%MP&![&5}Qƶԗ=mػ,ʡ-`Biqd0'ZrE~rT5Fq BҮ5i+˰nj8%yZ,Oo_1hMYMG)ܭҠ;onmbi*,4K/C['-{$T [In:b9VklS6BS{QU}뼛 F`ǩ?g[ߐH}ef􋽵3jNm߮!qk)~}n޿Jki @v| Wk?_*7E=a?ĚZyW/=7S9Y 7~ӎ'D96Ύ^N9OT<TU,-"NNjIN.Lj25= ᜇonMˮm} p~m1YTc$w85Pb'eɰB:Ï_T?7ʃ~ g,hF YRF&'٩pfRncwUcU7z1^?%i"uReջ u iABLab :\0 (*#^(> M=BʇM9 phRv40pH./Y`cEG%4; w l1x:w1Aehy&FĪ Bâd(VMDC:Y?WMճ3P(N?2Ŷ:5%5G30+PG &[GjՕqp,7 St__f F7|7e8Ck'3 24Vp:ʽOA6mMa~ ]ץ,=Js ? hu7{l%BS\t3CtLsN0 `ePJ VxM+-hBЇn]$!=xzs9wF:c+ܛQz7@Z J`FNmM/RVT6C8wq O7+#5s0,Ya8>('>0vtBUr5AϒnnM7ПARm7;m8飮OV&7qW#g ==Y+^"NQ(Ű} m66]؜(fTCnxj^f R=J͝~s9X v1p3'R /3DS V ~"]eYc]z4{Y&1O_Q7 *lÛ𳴔^S-t(VZ/"{\i%352 @F~Rz>vdѣBia2&~x/.JF:PR{xqFy\h2gK~A,Qyۻ_EwwE{ ~1U Kǜ~}=mc$7Ce 8*N棔""xN0:\7/T-h>`[\ 6T~KjF!9iiiTQdR~ݷ>;LL9@]݆t= zt@v{W%/}=2x.uq4DL$.”;ׯ98gҜr'@|U%'zMMZJ1_tuf˪˝eņ%So˛Clܩ6tA0Sdiv%@8,eSÆVӋd-̬ެ<%U!&|tL:e.Eh<̨=f.)tVC6ՉCl,cf`颁eJ+gu^4wS_ꐬ%XǚZ?S$ D{.2J)# u͙rhyhOM8A #ܘF>ߴvF7,EgCjFi-ФjѴ%i߬k-]ۏ"Kf Nٳ.3I1$߇ N8mte[lI2[+=JfJ~EcE2[m@vh1V$˦+3-- yz!aD޺pOmMf/iLf,u4IS*cw¡&YcKrwϬj?{Z.˓TEjermA"`%fqn&5/?ޫ$ ^$EKjLffb[KVvj"KZ`aF&Y+#϶)c: 8q=gsR za"BɼٝBϒNM23+GȠSD_d_7|IEd5J{v#r<}3=˹Jfڍٿnh$syy_H{QV8ad1rE1@ l[FYLZH%u;Dm#|jm'jGxb#FO#G|5cFe¡&!4¶,/яu역 tUzPn|U–Lz kIdШ)fqd/?9,p>}p̌kr}ld63Shӥ)sDέhݢɰq3j)} Q{;9m_i;v&8@,<]f.xZ8cu/tA}zhcQS5fa5 {1] KdnTỵoQYz5IDKmFdt%y}db7D.7M/Q6_1ue~}<;ϘbՌ ȳ_3(W湧O1"y ZȲ |xS06)-`̖c2V4y8 k+>G&;>?2}!2D)K4G\"Ѷ(o{TJ~ ]gJ|>˚ŐM&k-De ){kX3_SIy+kBQ,qZ#@?e%tVf_FᎸG-n6ѷP6ȥ^--UkFYKg/ImJGRM]fhF@[7'⻮Y"|#S8a?GL Svť6Y2KqYKGu'3sɪl)д´ FXWC o6osWsqP99dԘWr`LXױ~Z,_8#jUlU)q1N#NaO`ڣ* YvڀSKgFAlQT ]/LIm6 Si<h$On&Y("{4Izjy˦K;vRr:vc>^p?6[Z7J,n"Y?9l7EksԪXH3wRoUkQ :bHc~Cٱ]*7gQ+V)iḮ<Mݰzs&|J!F;h( Y@ԯN>$eHV~l$}$ǐ0CGO2XEGד\D[Z@Fk11<*ЙlhFUx޾M 0ΈNmˆ6d<u߶MFL|r/}{Z%AC#k *~=R|H8=ќ9ux(n^~ySe;-̘e Zg+\^(=*YCǃ5cTq2$ˇaC 'gpyp, EkeQxEYq& ]Y6:\nw$[_ W]sQ{˖)e+yC/cWԈ2leT| mf%1~e7eQyt >JG-L۷9:E&3p!1L.b}B5prKmnͲ%p;gێ>0e(tݳ "̶ڤk\h5paI')IJ˽j7I /'*nLeFP [b:LֲUd!2n|抻yt=p Fz6DߠNHSۡLدJ`zWv$k_7WEV涖&0Ŭױyەi/ϥ;"=)6wA .Z/| R8}kx2-˔9}rgܒ\y%U|LtE D2Q3  bbcB4O3>fUM̼A }'V#+.ZP2vS#KCY9Zdʕ"(ǖ;/i༺Xd5Vc-9%?hktѐ9N%N?^^󜀻?)9 0,$C.=ЃfHWݢ$&bѭ9|FMm~֥O.TjL;ςW$ u;Ώu(;MT&R [J+Eݍߪp*d0E&ăd^sᶏXXi򜡽vV,"Z(kp(sMY)[E)k)=ySF"FBSf[NODmy>ͧ0h)Yz$eF#Hj&0W2'J{g;à _>j$+c'n50>^_(TQj1S1 Tb&tMИDTm 0궝8Qi L1Ef>al"Bno#q'1`aIT'?PqvN`(b&t1SxzMB2;}G}+&Xh E2mU"xL6r!>+m.sLkѾkZ h׺ޢhXiۜDž#+OW?T5uֶۭl/ e !ɒ>ןE?*̶vpH̫͉dԑu l_w3w]~{ƻ{{ro'y4sthh ~ԾIqrw$qw#+8[=+8-qO/4/Ҏ}~*j4diwo sc;ȳH/]jE_ EQb=t>>) 5{)jS,΍ucͶGJ(8-st۴jJO.lSpFϊ[kL+V>qGw1хd(K@u.Nﯳ\;JH-Kz|oA[OkA; [ !tW+#^T)͛jU\nVeI>y5_vdm36ܤi3kT[eNaCֳ"Ȧi>N=ݰɰץZB(Ҥ"pPRz1SzvH=!;dhCݼCn~hoP7P7^懇ww[? >;Џ!t~w B褼?;!tߟBǁ:!AA!~, q;;NB:OCCm4 !!= !!: r} N[~!!':-XO5EGx+vv W0~O 3 4Ko$1Kg 4ޠo,3FH(f#ZX1vCsvgPl@A;^ f;¯7 O8_[G'lcj77URC!4g@Py5ޯh/>AOH#j,(ǹ Kr<0mfgx fDMt@F }2.FO 0+szEZb> 3u.n8ѭzG-Bs\EPW3Zq7ĽovӶ^{+PJ 塎F9~3F dLۊH+L Jh9'`+s;OVe kGr|߆=AΘCj;x'eٽo-yf6ؗ@G5QsmO=@o=%ݰ{CO co=\ff}3nvޚo=ycGz8Ψ=JϠ= y~Zg;n ? LYT= #Ez$=zLOQzt]koP=ݫy7F}@ķD1zFI-:$zK, f+ ?lP=cԨMF P##}ߦѬEYKAA1^{P8<<63z@}9vgMl0'o3tJ7:}F=\.@GX7Tݣбzq-=@{[GwAx ǻ,gΈ=jsW #18g%'2' S-%֣~HZjngۜ8gTi##vVGWX|h Ƕ3,yg%^w>=Uk`vB?=4I CJQ;1+xC FQt ZWNx(shhmjKT q v 8%Dc-QUWzb&U:"0_&=z ]E/KmyAxm6I*1葈íx( DZk [`ф|}ALΔ]p}=T#,BцT4&4H#CPɬ\&'KS}#}1ark6: 1dH\I8<>m G=4n*~PmׂkT%*]eѸDy A}xϒ S"*i8g%..Y]-xVerD^gQJ7BfT 2h%Q+>qka륹Pdz\J|ۥ $xRJW"xgR>zX,j*[.c!%˩NJI*%H =+,;XT<[zu\0E [e$gE;*}Ck%7mr !_nxγz;Q~<&*?f}vEi};4(\7ϙI:kiz4xvm)]Sϙ-4u[k }5eGS6L )vec) navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_VE.svgz000066400000000000000000000010341221777731700221330ustar00rootroot00000000000000D(zHcountry_VE.svgێ07Oa7f<6c;k ڐ6АkeV =6k-ڮjKKUx-gImWl}s~PYT9ƶ*fs`0>ayo$A J4*AHӲ-^=oulM7vA8-(!"mI#ARr:ELO}gb5oI#|, |SԞ/=VH$g8oC%GoBxsy:80Nhw9{mjIzrRQ1q#IsXZ@6}_-@…6Ղ2Snavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_VG.svgz000066400000000000000000000363201221777731700221430ustar00rootroot00000000000000F(zHcountry_VG.svg]ksW_/q-4~Q$OT$_RBВ#PȒyiږ1 }yG>b(й68Z m[ܾx|R̦u>̋?~Ho0j(Z8 *KOGJ*zE;fe^\ -.`"~>߸0Mf+~K4EYNʯrN‹d%%  vs}va?gkZ1 a`}pA.Ҡ:\E>q ͖M9|;<Ϸzb0,k,%\[SN ߇Ó?_C [xEJ|:,ƋItVtVħUZQ^ $.s}=g>\6Jd\_!G^)nl{h,>d8WpFrZ~IxQVKI7'Fz ש[u%nP^'|AiؕE?f@\NUC׳b[Ѱsʉųas6@-z=X_#Rw0@y7^bF<3^Sx2&iVO|Z<>n2z07ryӰ*4UM[6W͏-|%_7vHnKqoqp KeWea FE9 F- c>}>+Z֯hV8-De!E/p[)<p@m~ e?5h|=#s}ګ5(W`b%<#yme0Q1 &֛yUmٜɌ9[q^dZs׬s k-3YYI/ӂ*8L 4V[}~ ݺ-DY{{?M&gnP|&*xD_gv2tᙂOq8Ƥ+d1[7T}EZYPҜq{V)g (38Wq$wե|]48\sTW3H#jܙ㳔mam( j?Z[4[V'$\K7TcL&qFnԁ3'b>q#&FuhZ=>͡ش5w.fEpqsx29yEwXgd,}rC[rp04]f&Lno'I1Fr}'4^k) 'C.jӓ"/"!2dI:\`SHzrZ͘p3ZdĜ~!+ۑTxk[X±z3Y錇Td|IyFo\hl[jѓQӑ6zxF ͼNPo2 +ט8![ 8%)YwۙL ',*z{qVh7N O1*;DoЛ"yUZiDђlCcކAD*@ KPeN e&C2ӲYV4{n`"|ln'$p0tR*8"ue6ý57$skO wqzn͍э~sKY0h\! CǓ%bdи6Gt2q) FA 5ҕ*OmԾ&>g%7z|>f 7tψ!E*`V UX)0u82iZCrxZ褑Q'|)eƶۈm`DdˢeR@ pV#X:!9 nȄl 4dJO~|Pg@%1Hx4ZېH&|g\%pKiMX1v8r- !qHxF* 3n(Ȩ{56|@ͨ֔?<= GbؘN\@*UU(OZ:Ad24/Vz8ɃDjZLTAdbF]a\tca`ܐ'=]~-/E#buZB/-q8GB N0D zsF Bha }¡qj#I3B8Bx; GD 㠅D -LiaiaBzOg-LM8tGO `Aìer=>݆#g)rha"-i!/J'D -n- EW:/fx!8]c> /W!%s:JxxUM x;[`@2SѠ5ֆeԁ PfCiR?I(RЭ" TڅPn.=eua$)aلM"(t%'QJyHC}T*;2e)ha60::ɿ7IB \\KSABٖqPf`7$zά!:A"G?G HIev[cLZTH$'m$Ru=\ ͹ޓ?Q~A+T]8̓v^[wSG AHYA!μ6ܮlc3FWȢ/*Io[q3xKO#I0 uLGW,sEo V|@l*e)O%y36 8xAy"xZ-9[ '5 )vG,({Q~DaAHP2 kM`IҋLM.!g@5 Y퀹H -U\7D)IfRzU(b<.US"  icHt{D[6x$2YiE)Q mIޅ`"ш Ō-=^ʂA/uoWŭ.R*Lr\z? :(Vn> u4$U Ձj#z{b32 tg6D MLEh$5"Y|!sCw,TwwnyS r`QrnsdrK"@XQ֜eY1%@]5j /R&Yf<m>OIkKCBl&=)EL{N. wD/҃rʜD6אp4o^Fo` ^0j]zdמ~~f앿؝=j-c^ƩM>OmSrE [0p,ssc)XY^ӫ+;1z=VCz Ռ ;V& Bc - >sZFzP)ӫXu'myX@®7he;SIm!EZ5d,kբ.p) qqq >ޢgELjy!\S(.G%95:$J.ȇZjmI&93Ro[Aq4E.jc$tq ŮМKğt.>VT<ڰ0eKLVM]=\q(A7CmCxyK*Wok00uۦAKx`.{"h-[lg*:&D`G)]MM'9c'#yI5``M*W')PKDs[ti%>P`3nAG}2a.bץeI눾7\1ֈj )wnE4V"n<>#9 ;:2mW9:+a=`h,Kw ^R@Zf%#咤L#e3bQNvW`#3pwhyFvK;Od";}Q)'|~ȯO0ͦIM5sKDHHN;͓CQTI~\]Z \S錳k>2볫],-=qG^^[*K`TԪM+w>2R D P_&(ʺ-N&+E*hN눴G/Tr0ۛR؏FO癝K[.ds'4]H@~5z"g>qG hOפ]jCK#@}Ne0{/}/K"OuS7oÉJ%g؎¿Ս-'$8t qV])͞R |ts_<ILёkg?=t39n=}9*S@/K%A\c^s:_W }>v{%FeZI%yn>L{dx9W|hELmê% {C1o@\7اnK %/I>|%*^N}aȎMR$BF )qIذڧѻBTy}zU?7*lZj-Y( \r[ %dcH*wXifZGZ+d1UUW-??.K~t|] [_#j?bQcmk>J@?I@H,}qG:T~KaWZx{8=w8v䢭S  .?8i\gv/rJxRP6 SmHy%&Oں.d+6Dh<1t >NK5FɦBbG5'}dQ5"%v[DnN}BqۼТ(+,LwϤrR xwǠ8:ӾH1Qov"D` EV;f:}K)'(n UoR?K"^Mu$ŰV$9Q.K(=ZLJA4v a*wRQyΡ9 HўjRm%vQH(d&A~ڶ&Ka4W?rUyuHdrT?bf֎Ybߋ6I(I`cvUj̝zqN V!B.ȿ:V~#<+LFdя'RIGg2>7W_?߿Ca&Yser@1y@e&L=ÂRaҍ X<LZ=gxf4,wc0/o#Î2fxEgM$4,3%'5ztGV椿L6GSrc0[͕2lKZn0w*Yn[x̂yxO:tx lO]'ԁFn8pdwF5dTocխ/#*b7Q:h&k;V^u k41`2Y/\V't2 +^<ˬF؄%L#KN&R j);Ԩ0`D6"T__Ų3V e j;鱿̲*ZV6 q9`IDF* bfpBf".,jwj'L[ }4.tF}MK}wsDqՑM9>:r٘hxv(N'&u $2']!FA䉦l:$ŕQ#xZS7ܪd=hƅK+dWdF`2@~=3w-l7wR,+ǯe*9߸ěō6=ΫR0wՁa/7$[ aR iXK;Eu ^v^n<;$##]#mRc 7<Š'~ .x4Q;֔sDHúX=WТ+PK(h2@6#]1VGI|5֓ѣFm?ฝ|^a:ZW\"U([x#.q9ls1.@ΐnqokV%S4J/ _Z %^P3fbhجYg`"QW';HGNkxLaqDsߙ:IZz?_ZRz f0&fZw 2fciKlB1VVh6|3Fll66͔7_8'ܿF;^z5Fc'is4%, ao'{SbѺO`m =h+Fu/#=jIqf }ec 1=C&N$Mfg2(Lat&QXb$ˊKHW4beTabtIڝr1l 5+NCsBy& FgS9mˎ]+pf8E8 KP޻+1 zԍ1;%Ei/ 4 qr1 BK$>sj2tٱʅ1Ƞp!$R`Ef2Sܭe0eq,l>0d^c3i!8,N9c 'x5&3 u^H:8Cp3mpp A~`1٘D%| ;jW} MbM^*N',AjK*.R#RG^H.j-zLEU&+9W輦B D2)4]ۙjC(̢lڟIv@$VAV0oZA W32f] OCcxъ1V0N~ämcqDnc!Ɗv,k+rl̓cOp䣓I3ܞqtp6Oe`N;+X F4x#J1!}g's-!~tkL~[/nXRU=xFs Sn"nn:"+)s;a9vߔTW`+utuy%-Nj>#U@9ΖeTg^d&SN[$+G}wp2Iga5T~ |ُq7RuUdƁm!E$keVn-o 4 0)oANЁý+y0Y"P xiІeRz0j l[Q|1zQ"͘\1&#JpA>W7=0Uo(k;2&총d [٤ٶ'S+@St8ӽd;a23jv2n|5.18ډi˟ m(\`Ce#Z-aJ 1w;2Rm ŮSj2J\;0n^:"BIC,!q'MG+Rf qǰff\af=s3ɕ–=5dx#7MjD3lP1M,nybFngxѽv\!LWN*>kczcf|/|`^b+L?O"og/nXgH蝇:$l?tY|(DWb+.}|3u Ekn#߀MfoxZ8-=9Subv'!7A RXzHkt$GrZu.jR Ssznh3Rw#)ep Cb&[]<!uqW/KӐ>v63#X#9FA~xRÑeDB=O4z kQ7E]=@ mҊߴq2 cE0TvC Bpk$HK>CԾ{Sd+( [FBo.h`Я Av TjPg)ATnGl;b`x\oY/(̣'@Xwv]FJuD㸺:Ur"m~Z$+ٽFVgG@JjRWDŋwcڅ;dm}UҠShm KWwj @sFhUs5v.S=][ZrFDuR],QCƄy,pe*3OK{EpC?%*:x7obmbۮ$j7$Xe)tVP^.g`7xހbŏs7M4RKN%cosF {jN(1>-|!jHw+D~ GwCyoGyq Mns '-ܿ7}tm)&HҭVœ ծR*@ Q>ߥk-.ioQ|/ ?_6Z[navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_VI.svgz000066400000000000000000000221561221777731700221470ustar00rootroot00000000000000F(zHcountry_VI.svg\ioG_QKżJ`cb#BD&_EVddͬKQyFF8xj=_.Ύt~1]˳}q:j֛b6Z.O/z/M'~7oWr?lnNON@m듣?6Ǩ~U4x>M϶nnWWruy2WuجOtOŧwEմjaP9eN9FfbAU V(Nm_Jn+>_[O'7}[FvoN^~d[X젙m{bߋuL _`y|vvAzrz1Y,Bo^ bwIt?6˛Q+ѷW77o[!-_m 4=_]Bv˰];T5n>ۼ=;2z7aei |}~o&f’e[(8o/NOgz7?\,o;t3\/di.>4//ub7eM-jʔaOvky֯jNZ^na>< ԫa ,j>b?Zr!UMҭO[P$cw`GMV{^({dȍޘJY3:sѤ&[, |Qpxf! h 7X`e &jod\s iPzL: sQB>j#n/|KD:$#4*!2 %lh1Fkr2BQH}]cЊmhrz.Vd=W spRq*2ٸ T_@ ߆B!Bb\?hV2|^ $Blط33YO7Qto=>%`y=?(708^^-϶bSN5QtRj2S {4SQ`W X|{zi!:"$pY RrCV mDUKE\8#dCj [C}UK`(,!C{`)(H~B,DirU:%`*V DaUl*8QЍҲH%@` A`4Ջ@@胀 p.`4Ltv*-QM@ 1č)](~6caoݽuxk |AHg[tR0UA@ɚ 2IbS|rY=(`ƔZy(.!2 ?2E#acr^d1 j^=S)_ve旾oJv 7b͐QjHF#o~t77p q^qCv)AA`wEF4 h]a-8Qhp0+V-*'P< P h6 4dlŏpL)&(6D8ѶT;70QE /50`|2&Q)~E럠tR\Qx>tC,|LЃ?=c!*45\(+V <>:Pmx 4&Qs(np zÝw6ƔV^%'5ZL9ٕq/ hk ` V\88>Hp織Cy̴~UKa#њC=K]ޗqBF^AO䈵P RqRѪH\z*)1\-]D 0Xhz r4 SSSnM.|,&ʥ$BWE% S!l1Y~Ɗ0].~#NE^dFZ - 2d :i*K;`5O)"=ʌkghL;g\\MFaakpn61+,fiSSyOByEH#T뢫cPVSꘕN}l \KlG(*Q@>d l r` "1_x[4a"u0ňa-\}Ou`<ԃ1 QםJrĴ2AUK \׊E@ ;s^<\&g$SfLRǔ#4Z:;qL`KtB`!BUKA)yLe}"3i@|jjSnJ.1Q*i>C("3BӃO#295SJVָg?—'˳OqeÐëCE$ R\dZ%b4^|G˰$[tOI[z:chg|@JVAİ1}RJx\a(j7Á;K8 b^%OXJ|\7#Ïh@Ɗ-5?!R Ib.i3%J[FPf%%?^< %h nТ(Z1i'<<|lͯ8`i㘸ȲY2P6㊨ rkjn?xZ1l԰1Q#chdUy1/t40(mV͝`fYq9&#fjxjqW8rA7ʠ>N:2u)@J?%Пz@*=%kO @)'е~JWb%е}JW1j)tRzħzͳ)^BɋQO)Rl{1˝&IP,Pf$-ut15?/DX7$cF"hr݀>4PM3[y##H RN`xQqryo%wq܏୔~! J/uG<_}n1(5gor*0e=x3Rc%8w&"Ec)b 6M,\[x:'S(|m-\ŘxhnKCNURh4 ̴"ɷs6/aQ*R ;K r j y$EU5H"{K25qL:şxy)ޗk]1e9sx|Dgiym""/74#vbcvjBd䞫$$MRykϧ`4 c D3v~i0N4D(*y-WN)=c-=EbF^#d9RC1i=C&l7 3 oANCyCca(#U\}q nD_id*D hLjiA:H]mmi\ϼY98_ýTIshLA "+ ,VPX6] H!%X7ȓ$*2`(ZԁۦgGS]V䐗w'ش0j,dQ:eɸrxD_y< oٓQؓnw$od3SJx̡p,9zV;du^6c/US7U.\ƘM.q4$#~-[}l'Ҭ1% &+sXCw0A Pf[#C&Dt.8wm?h;ѡB͖L8(dC;"#ųRBma5q%7entr=00 t*4̗Qlx3S \bk&HVccJW-w0H#ILDZ?YKtT0_1ٕA d?77풦Cl|uwJ$;LvQ|]c>Zˑ)"psgQ/x&K"PfF>tRN݉ET+- d_pARg@Xoq2tR| HϺ&g8KaZ>AdV(]Ԗ{# .y)^_ > 7u* JW-2 Y"$]q6 t"\w1rPP<`JQ䱞Da8Bj Ē5$4_yAp~Q3f5Yh]U(]n~y%9/.Q*d&%eE &3PVGvbTtRt c&xsAT0IK(<<1VOE&rQ2NEOH14Scf+D/5a艎<#ItgJ^x]YJz3n}fBH|!^v]qg>ѵb;+FhcRKτ;ow`BQS`h293,>N\2㹜0<4I͂ll]0>r$Js4.{B"x$-E}~xgHmD7KԚ3d0vīd;_ L :M $*AB$^1a'Ic\12 |#l*[N&mUN2?D[M"{1?jaL"y;M|ШlR$,`L!@ R3]e؊>k$f)~ʛkUW=$h10Q yv?Ydf&JQa;>m]}y g]aaޯD+~R9{>/ۉ,A C= rSb]|=ȶ#hDglMF$TR|J @nzSɪ40 CM{mRvTU^i溒|hm'2. p33ij .UM}o.'$ԴC&BAtDe8b8*5io\0I㞊ZSU,ZأeMwPV>N$٧4PCٟH4ejQ3A"A2DͰ΃3f€{?J)]zȅTj7^tIOjSG{PQ5oLdGx/ށ5gՃEs(j"r`o:%SWzyB#Dϯ|)=̮xD!MPxbS6!dgWZ=rs%x~@:ӑ,U쨊Doi$ކh@XT@$]XՑ^kL[[W~wnX[iwdw'{K'>t/yKAB2V5]IV82ۉ]vNa~)f&C-˪6`(ՠ*}x3DHDg[ggG'[ZݖHB2#ZeU]sB2zRL\ 8Un;'(Bp.5-m(ؖIQ)Z/mFpGR'8?@Yw}gmgS 'ahSEf+byݸ9 IyRQVyT@#U 9qKO* $'QvGB ZFoM&hjjT'APk;X_` 1Zܩ+M-`:W/oJ:feP`TyxY%`J H-_45 krKQM# 1!յlLi@w@yxlY=saoJd*vΛΫa ߤ(!I֨zbqz^?Pah,DPDC9gW[t c83*RЁy9e{]JBıXɬ"wHG$&3vx$dCF.ig9Imj  vK{@XE_ +[pL`DNNo $ۿ B]Q15NdT"p ТSUYT'vjxOXOK{p@['I{To|`:*YeYӏȲPlzKZe|JDɊ#DLE刬o6cVɢVOLDѻ,}Y&]f4ѽi;gsƦfjgɢryޠbͧ.2F)D=(SPΨ8F" [-,%s[diw+*Sx&mUKH=/`/å̝U*Yt.SPfe DJ٢0LhSzEL$^CdiN;$M ,^aU5+:;{e'4縗8O$N Dc3+ANKho\M=R?\gM?R2NѲӖ'Ie[ N Eܔ*c 9vNp]#Tx: ק54a6}iY}{Zh>a V2Ui0:eYbnl>4rDuM2BH$0hj TJ${JF~6&4#@L!JJhYan6#"qD Jb |ԎaZ_{/6~Av*,Z@9it\1p{4[tJ{jܫڛ)3Z`uVn~}RiOfa-VyXPns%#B޼g62Asj혷)$z@?M sa]$٧$`@}oc'pt4tp qdsyd&Է_U]״ χSɗ ߃q荂>o3HSݝ #~yzfk_~{O[֬dM'=d/}+^&HJ2`= rfe;U|1ȩW#KG<"ϭ@`c4;S R~Y~d|C)|"~-j&"Dpow?^T*GfxdCygiHnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_VN.svgz000066400000000000000000000006721221777731700221530ustar00rootroot00000000000000E(zHcountry_VN.svgQk0 KK4q u2[aiǞg+*Yo?َºAh4nCV6R?+A ZQ<Қ] 4C*2c2&]y7>'-UYLGPgQʍZ8+3]*5R;z_S1tK>qT8`@4n ;>3navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_VU.svgz000066400000000000000000000057651221777731700221720ustar00rootroot00000000000000D(zHcountry_VU.svgZmol %Ae.A!@P)Ҵ 8)x,)$'vqfgw^w䋯wǪ=rjUmS?gѱͮW}3?,U[m.f苻;We-eޮ yx:"P?˙M\Wms>}۝]vRfþro<_nWծqz,e[Se۱d[ CBB9R* 8>b|3 =5VJ`m41:);~C{vV}խ}njYv+qͶ:*hC]vw3gwU}{]Lt]^Tނu_{j,*ǎ҄B )v[MPL]mn&ft(Yb߂EYqfъVc]= hÌ6,\7mY~'Xj u4x9 گ׏wp.gtצScMM43glgl o⴯;(SۢnTEx<ܶ=Uӝ=,]P:CJ9&n2[Ƶæ{XL%=u7edZ=&O__nk(ª}spN9xèoB\n >YY3IզUr֒vsQ1(R!nnE<ܺ#χlIo$uFwf &RKYp SgYϽ3y4.5#$lqtmZf.z=|n\@7jcazIs^Wͪ9jwX*I,_ 2{({x лu{{}[7`x^=|W}fϷxxim6YՔ!dҀNĵΗI3 @jX "Ud|AY'ρ*f-ǫȥ3t*au^Zt٦lr?^E)ٞ#'R9m$ܒ~@]1&&ҢXܓlEyI 5%œ|◲/Jt?6^Ԁx1Ҥ10|'LHƐk cnoPEq N4U9Uvy'ߞ#Db(dLUME Hh|d>)Y43b:j09:4-Q|Rp0@V݄,"200`kXTٜ3/(ҘOذ,P++dXRu&]ጃ''5Te9eܗ_KC*6i/=9 n#ڟy1(]JeG_Mܚg\| ;bCՌc-)o1mH;Hf YgqΨ#M(å!_MhJjQ9V5RcP& knlX+Ӝ6scxLITbMolZSy5gp{VH&.$ t΀ab`aHwh7+tW.C,H?J}Lx>Y7Oђfnw*Ԅ,(L#ٗ ;ۯz0Sl!Y`X.eHc(Pg+S9 q/J@yf>4\.Q='Y|Eք*`Y%!rZc)g} ȭoQ#c:wbdH;59ƷU =V||Acl=Vizo1WtH\%2GA*8Fz8U1U ǽ=V `Lz `hē 6j<~(4Oj{j9_Rwc*#|nC%D3pZѐ*p/ŸW h8(ԈVK WRR6hcҐ_R|[h*xf sIgCnG}~'@2rfiTA\2irj ~UBPgHK1hH[\ޯ5M1i;Ѐ*I Fb@ +d@ΐ*hhHe@-:ң*TAk?|C;#dAO 0\byE b4< rԥ7ICiy|N 7L{\z?燋9 o_ sB%navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_WF.svgz000066400000000000000000000004211221777731700221340ustar00rootroot00000000000000F(zHcountry_WF.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_WS.svgz000066400000000000000000000016451221777731700221620ustar00rootroot00000000000000/(zHcountry_WS.svgVn6}WKZ)}MѶYt):;u@̜33"<|TΫMQL#k^/nej>qH9Z?9n=͕ص#w`aGi QҼ~Ũ%3۝y#YCڰ=tn7;=4HlGd-D/ #4Bd0 7rWҮ/07.渕cS~o~ؔ6{4eUfA7: L녶V!k$]0$;ⵔ۷_օڻ2Qn#~B[ ߬9r *fPk׬O^(]H=U@JGӅl>l4*+x}W6@ 8Jc?C4y[m0$a}'O 5wZV(vRSBc6#R?d WF?5Fp%wc+Zגw+%Ԩ?[T;H}Ipi:T} n­.?0H P&o*:$ I ԁK=exz;nvvt hMhu'gI[A$5M\n#wjw? 01XI}] he˥ 1MV`!,eߐ;%fw\efw navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_YE.svgz000066400000000000000000000005361221777731700221440ustar00rootroot00000000000000G(zHcountry_YE.svgQK0_qm;}ns DNeOk6${:Da%l.[8rИbEωd: l]/kX?ܭf@"ė q . {ڏj\všA׈ % e“ànlNF3`~Lv֕lK8t 2M9ڢ]K2\( NRKx3Q 8p%ognEFDBm8(iYF:Ӂkmsrɫt2;tWj<3Z 稓sxR%:(6navit-0.5.0~svn5643+dfsg.1/navit/xpm/country_YT.svgz000066400000000000000000000004211221777731700221540ustar00rootroot00000000000000(zHcountry_YT.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ZA.svgz000066400000000000000000000007211221777731700221350ustar00rootroot000000000000003(zHcountry_ZA.svgSMo WUJbmZT:ilbT &!ݯ$SM]/|Wv4B+bj+8?9RUQ#4<,#Uswjk7q윛DOz a%p`Q `,CS (Rl~Q[#QFoUsfʣbŀ&D>G=$%z£((D!5ug#V5b-,$p#~O]k#je,]-,_.gӾ>JnWn#,=ER̋rNZ <5pr~~ac4>'v$]*.Y鄭7&vx]j\mS= c>s1즽1Yc|[dwCɛa&ӵ+IYw.ajyX[J?Mnavit-0.5.0~svn5643+dfsg.1/navit/xpm/country_ZM.svgz000066400000000000000000000125561221777731700221620ustar00rootroot00000000000000G(zHcountry_ZM.svgko\GrWpL/2dM|#D ز} X$@V էuy7?y=yzgw6mn^]߼|zo{Φۛӳ۳|ٓ_ルx9joqZ}&ͶZ}gn^V޽߯s~o{K ^iRKOvs5޾ݽ׏_ZoVgO>~ͩA^mrsĖEz]fwo6q84?Ԓӳݛ7jsVv-]>nlfw۷G]o.|#z_iؓ͋{B,YLxCWwy_?/no\ׯ/~{tΈ_o.6?lnn~97n\O˳5Y,)ͮҾccev%З?>=e]51ټWvݷ:Jm2k{{_|}?vh!T۩-kzr.}9-R(_mlvp>Kr(89 %Sq^>8t]˄yzr{wK!|1ҹǿ,bЂ%/ҜbnzU^n_zu]?oo.nqstBzJSqZfℒF=)騾3"SVCS}!͡P'>Z n.U=z>)C R*U3d )0 7V!ӿIKOm =IPCcTOڳ{$Ek/:c>tHF,=3 }a)6-ڬz;DK+S˳Oڴ)mRk0`A3WboW; fUgY\:dzUɘ֍1Y HKhMƹ*:tF"T2U+N> G߫5:e¸N}E-{2ļ":5])NfuDfStA]Rt Z*|kL0 EG9C%F9}9-':J$.=F cc<ȳ˒gxW{@<#%%fۍNJiZ>% _#R/q qXwo~Fw-NFvEwSK#Ld3,׭IuԢ%Di ʕpDm+k L(g!Q:M$ʕ8zHڙ^3I}fkBdWc3I؍{;=30SGYm DVYy4r@Y_O~ۮUXTFȥږ䬏qgo.̎9 Hb 0I쎱هG^d&4[cՋXUf&q$o~f/_Hg`(dBN_ڸH+椵qkm>qcg3w[R Wqr6r(F{g#4ORk&A {R8J#+~ ,?;9 sEBeX.B!ʚ~j;iR6 B YJ&p ĥb@%{It4&w.NN%8T%pHOC_]|&gh-q9H:'p͚b5M(z E*ug &a!I"beI 0 3 G;h $_L Ʉ P%dnNn0y/*`ȳFv5d/D &@Et.tFZ _SI"ݑSі@]aK2;!+ qEr+Y5ap"{$ N^pR:umq`fP|ć`L{ًvRG8OݟH[0t#pHY@+04Z^vSS&G>vki 3tI5ܷi)ʂn`/0HS J9ačꁁ7 >c̐lwQPF=##RF~pF+ĵU,TT oS}z}YSؤ> = fzq{#JH]|GB-` GD:`ʎ%mLؼCTU2 uݎw'v}Y¶Y_(y\}&&+E*%/~ h}yѣ9C0V2Pbzq#ӥG-fI8.tBRJYKvDdWW.܂;#h;l2W0`d_h 0X5 M>J Hud6h:n 8hX|7|&$Qڶ _*lJFڤh! M)4՗eDQό)ZMQkpn$A(Q4Gܹq2FaH`" <\˸n'BGcҒA Ef96JFH -i$Ü[tvPe&PTw#͒u=pJLd$GGιۄt$QhwuRUo98aěK;EZ5y.#28eN9aGScZ]-6(58D i)"-Rvyj jEZ) q@rwI*-y5Dqr4ZeGb Z2D*iZc)1RHo.=!+$.퐨fu*8D+Tb:f[o8ROI]m#T H˚"Q$b,`XV@gfah bi$5Y3[ 8 NInuHxfQdWbiM KgV.bɦФ4+w;`Mі[@U $;Ɋ@ua"bSdURm4[2إVLu9Rԁ\У5* ]S!'ج"ѾP7hZrVg 0eb3YzHZcU*h,d%tHhF> M:3SXxROXj01.j֪V/fr&Y5 :S[#m N -YHXt`ZL96i|T瀇Λ;eR V6;Ypmݲڑ%:7ܱ&ނn0"Uj3i>b40V\ěq ըYvu;Rr)y fP[A]0r:(K+b4z4UZ>9 :4F4Y~is)d,W-ӠNN9)jv)z* d$FeDXe`BBlJ*"I EzqZpENSXjbG!Y/􇹰pC!5R $B&58sFe[huĿA+#rAK#lKZ,ZU bk+ ֶFa&ydԂGaK7$z b RPGaudb"% fԂLm)[Vk0tףJOKq$YD7K4vO1x@!AclyÎk&@}ڂf8iȋKK)>>J:r}5bRL(ص]$),ΝP"0)~~ ~0K4ɦ ah h+ h 늕(ph| y)-)_D1Nbs`5Iء%]FaO*@S|Ew/:7 WAA]ZmhJxkUeS8-VHCz}޿t@* ]LH(7< `3k,A$^`Hj7k@uڊp2[$ljG,&Ne%0 ^_ ְcX0#dPq)^t!g,EV|,z N}90?2#:XtA@;ے @Hw))D-aӲ%'x$B',vy|척xXO 8 վxq ͟xIYS&&A]'ݘO>5PhaQ hMFoΒFԏQ>qg{eP %2%yrX,@+%H.ˀ''G2ޤPU? 'tZh'0UhVwq L|#xcpx3yF8P"h<#'DQx+k)7tVd/ۈ1aKn?o 0QXaZ:҉xXObtRJt/RY &0h~Lc?`7*$+ԡ[SbU DՕG~}=^)@?=ʼn̍4pT@/0K%R$uI,C{/0r#\{m%fy"\:unzs-W|8Kl>5ف4{(Wz=:<.C&C(5OZGlyHוRU~vFh"z=j"nk0jȐqjNdmffjv!T'gjj #Ɏ]/P+\ɓQKO͠?9^ԏ'qL=:M6{Ƿ?1TBQ4R]% m`˹ 3wyO77|}r7tz2ԙ՟GvLJ;"mҞWy[^v\?Ymf|uXތk?^w7ɸއ?c.żGi]|Y6v1p9c A7Z?pr*R|YuB?^vWE(\랽 %/kWl̥$y֞W?T6̏aY)GS&t9rw}- Q8mmt!;Ͷߝr'.2,6\uT<;sj<\L\wUJY똜JP@H.bx$$L /k d=$j<j q4dmd i6[rHRem6& G@J Q"jQ@Ss\rqzShc\t>`[YkD#'1U;eʱԞA\qU):gxU(c`m`0ɢc8U${4 >ubIf) JQ=#.H)Ѳ0ህ,[cj,AǪ U# 7 E\K SB: Y8eoR5ʊjvD*LYBci |~Xvna\Rz+QLլ_n(ru50~]yJ`p:a"U'8TUcz^ af"!u }sS+d׸bB7dRd.pfNxJ̀=Ph&:K?` image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor.xml000066400000000000000000000036751221777731700211770ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor2.png000066400000000000000000000015141221777731700212330ustar00rootroot00000000000000PNG  IHDRĴl;bKGDIDAT8O\Uϼ@k2-Fk7 v],4MѸjWv44jT1j-! T~ {00{s}܄.Dcq*++z0p gAs?0<\7~ C"@u`~RlkaA;v+ʑn&._̀K0zZD<#8B<~ywG04W*٭B!s8`}>F,:yIn}oĢSְ4THGrtk7]^jž$R0@k(?;y1|+N?ʲ~zM'uo' ڒ UDTsvyWfM9a 5แ.Kع"v!-|w&'WI5#},7@ ]#n\X չv{8q ^}"U`}%t6)6nHݔӊz[׫s73MZ$ظ."b+V(CgюsEA,z~[L7-k mH&<%vƢh"4;|?J̺[ Ra jԒ<+B1 XV( ,%rA,j`EtEB\,@DhTD image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor450.png000066400000000000000000000014471221777731700214070ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KTQ8wldD) F 2 !Z$d h#rEA."A pW5f0M%IX0C3Χ·3N ssjR  B"ZsT$`@-2bcʨ v㌞v QR(.;7@K6VcYಈLX&X)3GσQSFix2~X+,,p>8>ZluڍJv"1&o^7s)k[8wK'LHԊ;O9y@D36蚖lD2Rh"1:bՌ*ƆW^h27ZxRMunuү\Ux41Z`/]h!zۈUEpoJ3 [V95NVXk7sC<+럙_؀f+_q*c-(Zt4懲>_pY<6#4b0 *YxY ًg/x$A"mh u|@{;y,dx*G|-2(ruzNȧu(aU\iW vj'#=?Uq{ lX|&τ(͆}:m;f;k*Zlg +IENDB`navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor450.svg000066400000000000000000000144751221777731700214270ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor675.png000066400000000000000000000017641221777731700214220ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDAT8KlU?ĵ[jJ$iijHA*X - H @UU.hxH.ZEĆT;DMR5g image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor_still.png000066400000000000000000000011621221777731700223570ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT81haﮡ^4УC1bA%8 ](TtP1["AH"e"RJ%&/]#o޽}{*$"s@!4&T՟U5a @NH@}p3|^9{|ެE?8GBDn/Yn Ks?hoඪnX,">ea slb&|hT5E>EVq_Yx=H3;= Ch ;[̸奓lvT qx^|Q3= \kԌ5Vs1Fq]<{Jt\P_0 ;Ӕ'=9o VkT_hF_MR ZKuh!xz-Ozp`{Um3nj{B!kC(ԞX)_ lX0 IENDB`navit-0.5.0~svn5643+dfsg.1/navit/xpm/cursor_still.svg000066400000000000000000000160231221777731700223740ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/dam.svg000066400000000000000000000371521221777731700204170ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/danger.svg000066400000000000000000000101631221777731700211070ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/daymark.svg000066400000000000000000000126311221777731700213010ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/desktop_icons/000077500000000000000000000000001221777731700217715ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/xpm/desktop_icons/128x128/000077500000000000000000000000001221777731700227265ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/xpm/desktop_icons/128x128/navit.png000066400000000000000000000337331221777731700245660ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs B(xtIME㟹 IDATxye}{ẑ v ˀ $XE2*)RqIɉ-W\)+Ir)ؤ\RH)R"X `f/{w9?ιY1s;py$ \rJfb4DE9%/hPuNERbQ΃ Tﳠ| ϜS\x7JDDD2U %- +朒*4!2R[d9%DBgAb`sCAcBHr1I /LS+gUZݷ;i i"_D:86$ ".,DG1`F8:5%cMՁ/$ D>^ѦAۿ‘S g>rpDͯHUEs(rÀJZxnBmVJn(24"z׀$S PS[]^r b_$ȧxjyjoCUo!Ufs9Z b(yB+Jf-4Rk! $jsPXq$Z`7;XZ4SHQ+߹a,㏎sU~E>>C3ۦ q乲ka|/h̼#۶F%G?-ȈxGWz=/0#/  JC!Dfւ:0+]ef^?XZ8AQT?3+O^w Ï?)>cqa:(rGTf&:o}ޔ;H,Ϋ\y@ePcw~,` ""G+O0"UTUEvLg~,br̐Ps=Tk}@b.e/GQ~QAPu^k)s>@}WWPl1 ءn^넼 UTE|ȁ>)N y5jS›z0gvZC{k])/4* LP>ZD!אJ:~elQF VV|p>ZEUEDڪzuAv>`HSzp<VyC\b *:yar?;X*k VdKD]Wx}>AUUvmZ o*qc=|VD`knQ`/j/Sz #*RM{][ IGHko up^#]).NyWo*|ŷVI""$ 4!uX_2`% #mR#RxUa|47 Knn]BS^>7洦eV LL hj~@"FI\ :XEq07i q VC,SD-e:hr8@C \,t )*zr `W-xHY]jP_ Q[ 8AKc7ѾhyQY jZ= LnD`BV}Gm.j-Cݹ UF \Jdz &~FQa]>Z놋Zj\pἃBk0V) 2(Cv,*>(|,Һ{n^KUqUP宦=K8wijr)Orᴦmx)( ], rLYXP+6 "Xh|y E6Zr.@\Un&WbFF0G^ФKyiJZAEH<'q34 SN(D# ~D$`8UPUy -U=酟=gX|W:|)y^mT"*| $KȮF"< c$htZ4P5HpOĿF!=8ހ1@-׾$,J+\LiDn #:gT*zn40wB䅐>HSDXQe0PO iqđ,e_)(5Xz x ?c1@Kyrzŗ} kA1 i1H#<_xtM!#9)Sc)[R[SWU]RV; kgJzUq(ǑO)ܗx6MtB3_#Ś- z)D4*D܀Zϣ7d ūyfvuC)M*wJ+Xi$FIhJۖo2;&đ#q1ɛ$J ,ql#%͕,'Af$[OPq vg)ptZY Tףk5k=D/=VXYkKHbW@dDL ALLf=P:H,޲S@l?z ݶ9xw^`~004ce)i4 4ca Re3=t{ $$8%X[bbP@+I7 _*{C'ɭoۏ[0&<"e-e/A .: uy;o572j B#1D\bclG"4c0 ("GC np*R *ǝt)^~k?|zO>r^B0m?} יt&d'"  tG:wä,`=`/m벍(n߱]sG#XYSާV{䃬"b ai ͆h02T0go$NRGթ֨[t nPıOצ99b嵄Kd,&rيl1mm{VLވa3z$Lb\u#Yә$$y7|Ga[90Q旕U,uF!M2^gPOآveđ&AaV}ì z  dx\lWkӼ~j3Mo+AnAF&w1:18#cFh;XBUս~H N:Rg(O qƾ;3o"18=X\nIۃfڱ^zҎRFGȃG? J)RAJ\2l-*88^  =(FӻӜ^lK#ee[`jnV8ۦu$]4 iY o␠5]qUI X+U{1bC3a&&~^d WX'2t2~<3䉟4;҂юG%6`T ozG ֭7AÈPrV2~F r9<5Hr̎WZMacX\VWF;B Q$tZ~l3whQ|A[f*JYվ+T]x'wDF9rv^= RoMg7u+;L4#vM4uM;Bozje4K a)"X±wbڮ>%8ADHEbONRXG?sJ̚nql^P#"^?3?{xc lFo}bوee`$)g c#^ za(2GPȭ6Pz/g#1BAW_WfonnHNw _rpCCl, +w/zino؉l۝5 n ?юrGjΪ7"B8+x˕cvH||MAqg-:"9kN3=^eԤ&Ǽ \Eiy\?<$ Pu; d?"|dės0H2h}{Y+)8 צfčٮd6;9v7qUa/8W*t-̧tFBޯѰ^6($ p*r 3ci=N^Dw[ ,ԗ/P͆09mw,,A1iT}>3s@Dk|u4S=+X='4Xd /fD>$-t(nf|4 կA3=xɳf11qv%eiEqN8d( Pa4am͖JZM #i'pַu JeqjN*vf`)~j3.ǎn0|mڬFIeK$ϧ`H!8qŊPED©]a2苢g`:&t|G'q)؅p˧wYf Y?Qt`kw*,.[VEs3Gi3bO'3 qIMX8}a-f ĉxVSTxݺ aip3mM3pC 9TŎw2ь=©bӴIRK3vvN`n~jn#Lv>m1XE޽"KbZB0Pr% e~`C5|4r7tlm&3b,$ώ9A?Skli>u`&դ 0eP}Y)])(!^. ft 3UN6KiO8g}Йq)dmPdej2zY̮i33sۧX#-o\#32y'k(-Ј`i+JMZV2Ԧ:JHC뚮kND쎩wT^`께)/n?V| EڿE&-4Ȕps,ز`Ъ˱C]IyR,w^(9|}OPi)C:0">vI~kw[!bϼFf#~䁓^YY1mXm[}IVizZM^hDЈ aY:]_>@*(qXr!,gcDϫ:SmwGĚGmS6GH5GZ+(OIDAT < &DWN/ E;xפּ@ @;(c~? gaDΉ>>Kn#QWg |YҶo1ܲՐfp⬥_k#Nsw g+*'48| jFۆa|4bF[NӬǠTSm~fm/ >FlA1S~1F#;0ͻvPX7v4d˿rF~N.yBc"}y\-}~/H^e|G|ѣf@o)h;fdճh7SAr83p7ոfd)ۧ:+0.zV0RZ_Pd}T dQºrѓX}.Z'8 ?&؉:#LJʻvp@PZژQzN- o!/ ZGsˏhCJp-ܾygb>So~vvN{Drfɑӻ[3GBoO)IS"Wڱenֳun}\9[>sb&ks6nB>="Pv͎P};GP \|P%"X KgͬuJI5 vi$𳏽#{ɭٴ^ s_{TbvgRѶkڿ#`Uhy^IZFq|XoHHe߆7?:e1f0(xu͎"Í˭#{L${Tl)&v!ISy~].2*.de$lVɡ }x2$2v/Za>h,lb94t~M>[Xw;6s"޳gfv-+aYee5Y24& qܷe/,vؠFExԱڞ^diEA%~{DP 5dP\"oz76hy&奷V88 ESzkG@M9*rUzg=Ͼp)-\U^=3I;ؽH3vܺSNCع09Oh5^!->4y"鋚jfE /rMIwnX4#huf1_mg7] IW/\b&T7 Nd=FZSeK':å$c%x GEF NN>an^TKM:{Ǟ+"Hy4NS<~o}$ҭoiuٕCgBwxd-df~Gn#>|"S>F`Wkq4 tdl8ijj%dJ @yEK ( "|SdD pZQf=[b2< ]amPxP[ކ(H|&,^R!rI^k]A_)"-fT[ШB.3kL]p߷*UUUQ+/hoh_D&=}`z=P5Ќ /ZLϻ2^6j$9,=MO8@. TM-U!͕nHODamAcnc>h]z5΃oz̋Hep:S#-U3T۩fx}Oרq뙀=Jă{fgR]]%ʺ0Trb͠UrI]ƥ6&m~'i|,Y8&&Icw8U7Na(:v:|cjr?_0y$|]'$y{{U[c: ٗRN#A(:[;2N ;ytCO8i9+I#<_~yՁ%5"̮f:ĎrZ?O1oᜲo*wJ'|7 ά8/e?bf{ ¦FpeߪX ,љdÌkX7\w3m`YpwaSq` ދ11?;ǏgK'ׂy@h=-Vyt,5w|ߛWs_AJYZq,~_!K?hʠ X~RL%9@~W~7Np'^E%*YY:NYCKBm^ɵ0 ~:$Ώ8{_Hg o- 8<X?j:A!9)Ξ->肫-ݺj71 bސڥWw -'{v.P!ygz߆a|xW}gofAהCcaARV,C #4\lb+אxL3G*Ѫ[uV1 nܿs!N(,>e=ZxrUsIh,~ITr'/6rR7?"8bCL ?S hVZoIʳ, C"gse꧊-P=(U>Z-1$z֮SB+*2/G ylσh uܿY; nctFf,k!Ԫ_'3WD&QͪSM&ׄ rϠ֧ޮuM~טINi{o!Z+Cʹ-`.Nk%F,9>eY-zWuGxC99:lӭ}[f^\FrSw{[VIi8מ - XPB6Y4cnpZzeǟX6֪b2c>E39hC٢ j,f YCf?<{T[ċ'ch *舗N`s62|]a%ְshQ(ߙ8c}oby_WܩC닍Rqi hFC`a@r */v.bdˌ7RZ1Et}- Y9KdE4lZZ)XSCgjsDL5@l?37~+~dAm;{{CnUwp5_9Ho%.|ϡv QL_@ɻ/\5_6r88gO||6LOˎߐ2^8+Ź|.EECB( 1:||};Yx3g:Hy.b@7ttkzvdj%aCˎn1bGv_EiNΥ3>y?4qԸH[H.ߨ^RC$G{_?@Z@ DULw+1U0)޳7D10r. W]7u)¯rqc= k5 Ju㸀o`i|ၝ>ɯN,XwO/չ¼>CKXMuR 4a# es Ӯ7}]*Q?Q9.\ vS/ѥ/y(Pջk2cq`\z΀m%s6㫙Yw-|إ#51r =<_t,X j!Pa k\>^I_m]) n٭a*}/Y"鳥^ƒ L4#ˎo.8uZbVlbETW[CAPLDBG?$ lAQ㷷{ C]t\1j#Zvq%@ȭ0J|wSXh3fMVs92uJ6s!,ؠb3oUwa%Y1.vv JWك("guO:Ƣe~37=_x;{^EoT ଛ)/[r`~ ה{wHʆ<\ם0)3}ɞcvY:2l>+8<9'5#gm? h Kn^ra*Zû㿭!{#0ّꀹQ(8NS=D9mcvg/:_?&K{$I\ Jk67i尰X,UI,\ @>ꎒQ9a #MjO)FLXOӮ@9D 88 W9q/yi*$W2X\SE""_WsJ#}A.".0~T.wI[X\%pf_NV! nHC"*/ǾʩPVwgܲ 蘟i.P8x{U ՅyK7?7G4kW9aL֓P]PBE+O_j-['P~ '%hNEǥ{&XWG^z4,R+Ou-U] | Ey\α|e}剧V7oq0BIENDB`navit-0.5.0~svn5643+dfsg.1/navit/xpm/desktop_icons/22x22/000077500000000000000000000000001221777731700225505ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/xpm/desktop_icons/22x22/navit.png000066400000000000000000000016741221777731700244070ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME&"w 7^3d/A-U0Q= r28) ND p!.]+vln1_.=gr(S.5H,UN߬>?_!"#oпa_B )S-Ʒؿ\!˿!pI"܋CЌ_~Wv’3W ʊAuU5vs^EmG`_#|>ZbP(ۭF.oP;]PUD9w6[6C!kE,@:!o,s`l(_Dq t k-=]-(٫gX{b"ۗIENDB`navit-0.5.0~svn5643+dfsg.1/navit/xpm/desktop_icons/navit.desktop000066400000000000000000000006251221777731700245100ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=Navit Name[de]=Navit Name[fr]=Navit Comment=The open source vector based navigation program with routing engine Comment[de]=Ein vektorbasiertes Navigationsprogramm Comment[fr]=Le logiciel opensource de navigation vectorielle Exec=navit Icon=navit StartupNotify=true Terminal=false Type=Application Categories=GTK;Utility;Geography; GenericName=Navit GenericName[de]=Navit navit-0.5.0~svn5643+dfsg.1/navit/xpm/drinking_water.svg000066400000000000000000000212221221777731700226540ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/dumping_station.xpm000066400000000000000000000041211221777731700230550ustar00rootroot00000000000000/* XPM */ static char * dumping_station_xpm[] = { "16 16 93 2", " c #899EBF", ". c #5170A1", "+ c #516FA2", "@ c #526FA1", "# c #748CB4", "$ c #516FA1", "% c #5270A1", "& c #AEBBD1", "* c #5C78A6", "= c #325692", "- c #5572A3", "; c #FBFCFD", "> c #FFFFFF", ", c #FEFEFE", "' c #F8F9FB", ") c #EEF1F6", "! c #DFE4EE", "~ c #E3E7EF", "{ c #F1F3F7", "] c #506EA0", "^ c #899BBD", "/ c #8399BD", "( c #A9B9D1", "_ c #C1CCDC", ": c #BDC9D9", "< c #8DA0C1", "[ c #8196BA", "} c #8498BC", "| c #6D86B0", "1 c #315693", "2 c #889CBE", "3 c #325593", "4 c #F8F9FA", "5 c #46679B", "6 c #879CBC", "7 c #9EAEC8", "8 c #47669B", "9 c #DCE2E9", "0 c #FFFFFE", "a c #FFFEFE", "b c #FDFEFE", "c c #FEFFFD", "d c #748DB6", "e c #DDE2EC", "f c #CFD6E3", "g c #B8C4D6", "h c #F9FAFC", "i c #325691", "j c #DAE0EB", "k c #FBFBFC", "l c #D2DBE5", "m c #C9D3E0", "n c #C3CDDC", "o c #F3F5F8", "p c #E1E6EE", "q c #9FAEC7", "r c #CCD5E1", "s c #CBD4E1", "t c #CAD3E0", "u c #5876A5", "v c #6D86AD", "w c #48679C", "x c #6F88B0", "y c #6983AC", "z c #49679C", "A c #E8ECF2", "B c #D6DEE8", "C c #4D6B9E", "D c #647DA9", "E c #5572A2", "F c #49679B", "G c #94A6C4", "H c #9CACC8", "I c #A0B0CA", "J c #D5DCE7", "K c #CAD3E1", "L c #BDC7DA", "M c #BDC8DA", "N c #DCE2EA", "O c #FFFEFF", "P c #5F7AA7", "Q c #AAB9D0", "R c #A1B2CD", "S c #7A91B5", "T c #375994", "U c #335792", "V c #FEFFFE", "W c #7990B5", "X c #AEBCD1", "Y c #98AAC5", "Z c #BCC7D8", "` c #FAFAFA", " . c #F3F3F3", " . + @ # @ @ + @ $ @ @ % % % & ", "* = = - ; > , ' > ) ! ~ { ] = ^ ", "* = = / ; ( _ > : < [ } > | 1 2 ", "* = 3 } 4 5 6 > 7 8 5 5 9 | 1 2 ", "* = 3 } 0 a b > , a a , c | 1 2 ", "* = d e > > > f g h > > c | 1 2 ", "* i j k l m n o p q r s t u 1 2 ", "v w x y z w z A B C D E z z F G ", "> > > > > > > > > > H I > > > > ", "> > > > > > > J K K L M K K N O ", "> > > > > > > P i i Q R = i S 0 ", "> > > > > > > P = = T U = = S V ", "> > > > > > > P = = = = = = W V ", "> > > > > > > X Y Y Y Y Y Y Z 0 ", "> > > > > > > V V V V V V V > > ", "` > > > > > > > > > > > > > > ."}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/emergency.svg000066400000000000000000000401251221777731700216260ustar00rootroot00000000000000 image/svg+xml en style="overflow:visible"> navit-0.5.0~svn5643+dfsg.1/navit/xpm/exit.svg000066400000000000000000000150131221777731700206170ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/fastfood.svg000066400000000000000000000231001221777731700214470ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/firebrigade.svg000066400000000000000000000114311221777731700221110ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/flag_bk_tr.xpm000066400000000000000000000012221221777731700217420ustar00rootroot00000000000000/* XPM */ static char *flag_bk_tr[] = { "22 22 2 1 0 21", " c None", "+ c #000000", "+++++++ ", "+ +++++++++ ", "+ +++ +++++++++ ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ + ", "+ ++++++ +++ + ", "+ +++ ++++++ + ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++++++++ +++ + ", "+ +++++++++ + ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/flag_bk_wh.xpm000066400000000000000000000012401221777731700217330ustar00rootroot00000000000000/* XPM */ static char *flag_bk_wh[]={ "22 22 3 1 0 21", " c None", "+ c #000000", "* c #ffffff", "+++++++ ", "+***+++++++++ ", "+***+++***+++++++++ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++***+++***+++**+ ", "+***++++++***+++**+ ", "+***+++***++++++**+ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++++++++***+++**+ ", "+ +++++++++**+ ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/flag_bl_wh.xpm000066400000000000000000000012401221777731700217340ustar00rootroot00000000000000/* XPM */ static char *flag_bl_wh[]={ "22 22 3 1 0 21", " c None", "+ c #0000ff", "* c #ffffff", "+++++++ ", "+***+++++++++ ", "+***+++***+++++++++ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++***+++***+++**+ ", "+***++++++***+++**+ ", "+***+++***++++++**+ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++++++++***+++**+ ", "+ +++++++++**+ ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/flag_wh_bk.xpm000066400000000000000000000012401221777731700217330ustar00rootroot00000000000000/* XPM */ static char *flag_bk_wh[]={ "22 22 3 1 0 21", " c None", "+ c #ffffff", "* c #000000", "+++++++ ", "+***+++++++++ ", "+***+++***+++++++++ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++***+++***+++**+ ", "+***++++++***+++**+ ", "+***+++***++++++**+ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++++++++***+++**+ ", "+ +++++++++**+ ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/fountain.svg000066400000000000000000001042431221777731700214750ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/fuel.svg000066400000000000000000000215321221777731700206040ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_event.xpm000066400000000000000000000013071221777731700214460ustar00rootroot00000000000000/* XPM */ static char *gc_event[] = { /* columns rows colors chars-per-pixel */ "16 16 19 1", " c #393000", ". c #393041", "X c #396541", "o c #7B3041", "O c #7B6541", "+ c #7B008B", "@ c #7B308B", "# c #7B658B", "$ c #399541", "% c #7B9541", "& c #7B958B", "* c none", "= c #BD9541", "- c #838383", "; c #BD95B4", ": c #BDCAB4", "> c #FFCA8B", ", c #C5C5C5", "< c #FFFFFF", /* pixels */ "****************", "****************", "*****+$&&%o*****", "***$O>>>>>>=.***", "** >><<<<<<<>X**", "*X><<,,,,,,,<<.*", "*%><<--;;;;;<<:-", "*%><<<<,,,,,<<<+", "*%><<<<----;<<:-", "*o:<<<<<<<<<<< *", "** ,<<<<<<<<< **", "***#X;<<<<< c #7B958B", ", c #7B95B4", "< c #FF3000", "1 c none", "2 c #BD9500", "3 c #BDCA00", "4 c #FF9500", "5 c #FFCA00", "6 c #FFFF00", "7 c #838383", "8 c #BDCAB4", "9 c #FFFFFF", /* pixels */ "1111111111111111", "1111111111111111", "1111=;######%..1", "11- %2222222;3+1", "117;%%%%%%%;X:*1", "111@99&2456X 9*1", "111O-%4<4;;& 9$1", "11-;4<4;;;,9 @11", "1.#222X;-999o111", "1+;%%; 9999@1111", "1OX%X9&99>@11111", "1.9899&9X>111111", "1=:>:>X=11111111", "1111111111111111", "1111111111111111", "1111111111111111" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_mystery.xpm000066400000000000000000000012701221777731700220400ustar00rootroot00000000000000/* XPM */ static char *gc_mystery[] = { /* columns rows colors chars-per-pixel */ "16 16 18 1", " c black", ". c #000041", "X c #003041", "o c #396500", "O c #7B0041", "+ c #414141", "@ c #00308B", "# c #0030B4", "$ c #7B008B", "% c #7B658B", "& c #399500", "* c #009541", "= c #0095B4", "- c #7B95B4", "; c none", ": c #838383", "> c #BD95B4", ", c #C5C5C5", /* pixels */ ";;;;;;;;;;;;;;;;", ";;;;;:$$O:;;;;;;", ";;;;+X###%o;;;;;", ";;;:@#XX@#-o;;;;", ";;;*#X,;:@#-;;;;", ";;;*#%O;;X#%;;;;", ";;;>X#%,;X#&;;;;", ";;;;>*$;*#o;;;;;", ";;;;;;;+X+;;;;;;", ";;;;;;,X$;;;;;;;", ";;;;;;$ :;;;;;;;", ";;;;;;,+,;;;;;;;", ";;;;;:.#+:;;;;;;", ";;;;;:X=+:;;;;;;", ";;;;;;:$:;;;;;;;", ";;;;;;;;;;;;;;;;" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_question.xpm000066400000000000000000000007271221777731700222010ustar00rootroot00000000000000/* XPM */ static char *gc_question[] = { /* columns rows colors chars-per-pixel */ "16 16 3 1", " c black", ". c none", "X c #FFFFFF", /* pixels */ ".....XXXX.......", "....XX XX......", "....X X......", "....X X......", ".XXXXX XXXX....", "X X....", "X XXX..", "X XX X X.", ".X..X X", ".X..X X", "X XX X X.", "X XXX..", "X XX X....", "X X..X X....", "X XX X....", ".XXXXX..XXX....." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_reference.xpm000066400000000000000000000012741221777731700222660ustar00rootroot00000000000000/* XPM */ static char *gc_reference[] = { /* columns rows colors chars-per-pixel */ "16 16 18 1", " c #00656A", ". c #00658B", "X c #39658B", "o c #39958B", "O c #3995B4", "+ c #7B958B", "@ c #7B95B4", "# c #7BCAB4", "$ c #7BCAD5", "% c none", "& c #B4B4B4", "* c #BDCAD5", "= c #BDCAFF", "- c #C5C5C5", "; c #D5D5D5", ": c #FFFFD5", "> c #E6E6E6", ", c #FFFFFF", /* pixels */ "%%%%%%%%%%%%%%%%", "%%%%%**&$*;%%%%%", "%%%%@#*=;-#@%%%%", "%%%@*,>,>,>*@%%%", "%%@*,,,,,,>>*%%%", "%*#,,,>$*>,,>@;%", "%&*,,*o. O>,>**%", "%$>,>@.X..*,,;$%", "%&>,>@ .X $,,;*%", "%$*,:*X..o>,,*$%", "%*#,,;*@@;,,>#*%", "%%@*,,>>,,,,*@%%", "%%%@*,,,,,,*+%%%", "%%%%@#*>>*#@%%%%", "%%%%%*&&$&*%%%%%", "%%%%%%%%%%%%%%%%" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_stages.xpm000066400000000000000000000014051221777731700216120ustar00rootroot00000000000000/* XPM */ static char *gc_stages[] = { /* columns rows colors chars-per-pixel */ "16 16 23 1", " c black", ". c #802000", "X c #804000", "o c #A04000", "O c #A06000", "+ c #804040", "@ c #806040", "# c #A06040", "$ c #C06040", "% c #A08040", "& c #C08040", "* c #808080", "= c #A08080", "- c #A0A0A4", "; c #C08080", ": c #C0A080", "> c #E0A080", ", c #C0A0C0", "< c #C0C080", "1 c #C0C0C0", "2 c #C0DCC0", "3 c #FFFBF0", "4 c #FFFFFF", /* pixels */ " ", " 41-:3444434434 ", " 3#..#244444444 ", " 1X.X.;43444344 ", " 1X.X.%4442:=14 ", " 3@.oX%433#..@3 ", " 4:Xo##34-.X..1 ", " 43&#&:33:..XX1 ", " 442<33,31XXoX1 ", " 3441+X#42#OX$3 ", " 4443=&:33&&&>3 ", " 44433334333434 ", " 44434444,++*34 ", " 444444431%#:44 ", " 44444443332334 ", " " }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_tradi.xpm000066400000000000000000000013051221777731700214260ustar00rootroot00000000000000/* XPM */ static char *gc_tradi[] = { /* columns rows colors chars-per-pixel */ "16 16 19 1", " c black", ". c #003000", "X c #393000", "o c #393041", "O c #396500", "+ c #396541", "@ c #414141", "# c #7B6541", "$ c #7B308B", "% c #7B658B", "& c #399541", "* c #7B9541", "= c #7B958B", "- c none", "; c #838383", ": c #BD95B4", "> c #BDCAB4", ", c #C5C5C5", "< c #FFFFFF", /* pixels */ "----------------", "----------------", "----------------", "-------%X+@++ -", "------oOOXO+oo+-", "----+@OXO*oo@>$-", "--&@*+#*@oo;<<=-", "-.@@@@@o ;<<<<*-", "-X@@@oo@<<<<<+--", "-+ oo@<%<<<:+---", "-X<,<<<#<<+-----", "-.<<<<<%=+------", "--&====+--------", "----------------", "----------------", "----------------" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gc_webcam.xpm000066400000000000000000000013631221777731700215650ustar00rootroot00000000000000/* XPM */ static char *gc_webcam[] = { /* columns rows colors chars-per-pixel */ "16 16 22 1", " c black", ". c #393000", "X c #393041", "o c #006500", "O c #396541", "+ c #7B3041", "@ c #414141", "# c #7B6541", "$ c #7B008B", "% c #7B308B", "& c #7B658B", "* c #7B9541", "= c #7B958B", "- c #7BCA8B", "; c #BD308B", ": c #BD30B4", "> c none", ", c #838383", "< c #BD95B4", "1 c #BDCAB4", "2 c #C5C5C5", "3 c #FFFFFF", /* pixels */ ">>>>>>:$$;>>>>>>", ">>>>>.1333=2>>>>", ">>>>.3322331,>>>", ">>>O33 @@ 13->>>", ">>>X3@2,&,X312>>", ">>>*3&2<<,X31,>>", ">>>O3#3,<< 3<,>>", ">>>O3<,3<@&3O,>>", ">>>,O32##<3<&>>>", ">>>>&X1333O+>>>>", ">>>>>>OXXO>>>>>>", ">>>>>>: @:>>>>>>", ">>>>>>:.=:>>>>>>", ">>>>>&*<=@%>>>>>", ">>>>oO<<>>>", ">>>>>>>>>>>>>>>>" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/golf.svg000066400000000000000000000603761221777731700206110ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_about.svg000066400000000000000000000447771221777731700216470ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Dialog Information dialog info information navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_actions.svg000066400000000000000000000541701221777731700221610ustar00rootroot00000000000000 image/svg+xml Games category August 2006 Andreas Nilsson http://www.gnome.org games entertainment fun joystick controller Jakub Steiner Lapo Calamandrei navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_active.svg000066400000000000000000000221061221777731700217660ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_arrow_down.svg000066400000000000000000000044721221777731700227020ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_arrow_left.svg000066400000000000000000000044641221777731700226660ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_arrow_right.svg000066400000000000000000000044601221777731700230450ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_arrow_up.svg000066400000000000000000000044621221777731700223560ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_bookmark.svg000066400000000000000000000442271221777731700223300ustar00rootroot00000000000000 image/svg+xml New Bookmark text plaintext regular document Andreas Nilsson http://www.gnome.org Luca Ferretti Jakub Steiner Lapo Calamandrei December 2006 navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_display.svg000066400000000000000000002323311221777731700221630ustar00rootroot00000000000000 image/svg+xml Computer Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_formerdests.svg000066400000000000000000000373561221777731700230650ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_fullscreen.svg000066400000000000000000000264141221777731700226630ustar00rootroot00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_help.svg000066400000000000000000000441171221777731700214510ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_home.svg000066400000000000000000000225641221777731700214530ustar00rootroot00000000000000 image/svg+xml Go Home go seek home Rodney Dawes Jakub Steiner navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_inactive.svg000066400000000000000000000234761221777731700223300ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_leave_fullscreen.svg000066400000000000000000000432501221777731700240340ustar00rootroot00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_log.svg000066400000000000000000000311441221777731700212760ustar00rootroot00000000000000 image/svg+xml Justify fill October 2006 Andreas Nilsson http://www.gnome.org justify format align left navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_map.svg000066400000000000000000001227631221777731700213020ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Web Browser navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_maps.svg000066400000000000000000000473401221777731700214620ustar00rootroot00000000000000 image/svg+xml Map Map image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_menu.svg000066400000000000000000001656601221777731700214740ustar00rootroot00000000000000 image/svg+xml System Applications Jakub Steiner http://jimmac.musichall.cz system applications category navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_minus.svg000066400000000000000000000051211221777731700216440ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_plus.svg000066400000000000000000000062701221777731700215020ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_quit.svg000066400000000000000000000170461221777731700215040ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_rules.svg000066400000000000000000001073761221777731700216620ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei System Run run launch exec navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_search.svg000066400000000000000000001637311221777731700217720ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_select_country.svg000066400000000000000000000234761221777731700235700ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_select_house_number.svg000066400000000000000000000234761221777731700245600ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_select_street.svg000066400000000000000000000221061221777731700233600ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_select_town.svg000066400000000000000000000234761221777731700230540ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_settings.svg000066400000000000000000000552251221777731700223630ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Desktop Preferences preferences desktop user settings navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_sound.svg000066400000000000000000000742771221777731700216630ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Audio Volume High navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_sound_32.xpm000066400000000000000000000115201221777731700221520ustar00rootroot00000000000000/* XPM */ static char *gui_sound______[] = { /* columns rows colors chars-per-pixel */ "32 32 166 2", " c black", ". c #030303", "X c #070707", "o c #03070C", "O c #050C15", "+ c #050C16", "@ c #141413", "# c #141514", "$ c #161615", "% c #141616", "& c #161716", "* c #171716", "= c #161818", "- c #171919", "; c #181818", ": c #191919", "> c #191A19", ", c #191B1B", "< c #1C1C1B", "1 c #1C1D1C", "2 c #1F201F", "3 c #222321", "4 c #232424", "5 c #232525", "6 c #242626", "7 c #252727", "8 c #272726", "9 c #282827", "0 c #272B2C", "q c #292A29", "w c #2D2E2D", "e c #2A2F30", "r c #2B2F30", "t c #303231", "y c #333533", "u c #343635", "i c #343636", "p c #373737", "a c #383A38", "s c #383A39", "d c #3B3C3A", "f c #393D3C", "g c #3C3E3D", "h c #3F3F3F", "j c #193A69", "k c #1B3F73", "l c #404040", "z c #404241", "x c #454544", "c c #444744", "v c #464645", "b c #454948", "n c #4A4B4A", "m c #4A4E4D", "M c #4E504F", "N c #50514E", "B c #4C5050", "V c #505452", "C c #555957", "Z c #575A56", "A c #595B56", "S c #585B5A", "D c #5C5D59", "F c #5D5E5B", "G c #5B5F5D", "H c #5C5C5C", "J c #5F605B", "K c #636561", "L c #606462", "P c #656564", "I c #656764", "U c #656866", "Y c #686A67", "T c #676A69", "R c #6B6D68", "E c #6E6F6D", "W c #6E6E6E", "Q c #737571", "! c #747874", "~ c #767A78", "^ c #7A7B7A", "/ c #787C7A", "( c #7B7E7A", ") c #7D7E7D", "_ c #7E7F7C", "` c #7D807B", "' c #7F817A", "] c #7F807E", "[ c #204A87", "{ c #838683", "} c #868686", "| c #898D89", " . c #8C8E8B", ".. c #8F938F", "X. c #91938A", "o. c #90918F", "O. c #949793", "+. c #959793", "@. c #959695", "#. c #969795", "$. c #959894", "%. c #9C9C9C", "&. c #9D9F9C", "*. c #9DA099", "=. c #A1A1A0", "-. c #A2A5A1", ";. c #A5A8A5", ":. c #A9ACA8", ">. c #ADAEAB", ",. c #AEB0AD", "<. c #B0B2AE", "1. c #B0B0B0", "2. c #B1B3B0", "3. c #B4B5B5", "4. c #B7B8B5", "5. c #BABDB6", "6. c #BBBEB7", "7. c #B9B9B8", "8. c #B9BAB9", "9. c #B9BABA", "0. c #BABABA", "q. c #BCBCBC", "w. c #BDC0B9", "e. c #BEC1BC", "r. c #BFC0BE", "t. c #BFC1BE", "y. c #C1C5BE", "u. c #C2C4BF", "i. c #C4C5C2", "p. c #C5C5C4", "a. c #C6C6C6", "s. c #C6C7C6", "d. c #C8C9C7", "f. c #CBCFC7", "g. c #CACBCA", "h. c #CDCFCD", "j. c #D0D1CF", "k. c #D1D3CE", "l. c #D1D4CD", "z. c #D1D2D1", "x. c #D2D2D1", "c. c #D3D5D1", "v. c #D5D6D5", "b. c #D9DAD8", "n. c #D9DAD9", "m. c #DCDCDA", "M. c #DDDEDD", "N. c #DFE0DD", "B. c #DFE1DE", "V. c #E0E1DF", "C. c #E1E2E0", "Z. c #E1E3E0", "A. c #E4E5E3", "S. c #E5E6E3", "D. c #E5E6E4", "F. c #E5E6E5", "G. c #E6E7E5", "H. c #E7E8E7", "J. c #E9E9E7", "K. c #EAEBEA", "L. c #ECEDEA", "P. c #EDEDEB", "I. c #EEEFED", "U. c #F0F0EF", "Y. c #FAFBFA", "T. c None", /* pixels */ "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.y.w.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.' f.w.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.I l.6.T.T.T.T.T.T.[ T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.n y.K.i.T.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.", "T.T.T.5.5.5.5.T.T.T.I 0.D I.q.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.T.T.", "T.T.T.C.A.S.V.T.N %.=.d ) M.<.T.T.T.[ T.T.T.T.[ T.T.T.T.[ T.T.T.", "T.T.T.A.5.5.V.Y 0.E } 7.O.n.:.T.T.T.T.[ T.T.T.[ T.T.T.T.[ T.T.T.", "T.T.Q U.c.k.F.2.v ^ q.a.#.x.-.T.T.T.T.[ T.T.T.T.T.T.T.T.[ T.T.T.", "T.K *.Y.P.J.K.E v ) <.x.#.d.$.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.", "T.J X.H.m.m.F.a 8 w q 4 x y...U T.T.T.T.[ T.T.T.[ T.T.T.T.T.T.T.", "T.D ' V.i.i.M.y $ : < 1 z 3.| m T.T.T.T.[ T.T.T.[ T.T.T.T.T.T.T.", "T.A R n.>.>.v.B $ $ : 1 g ,.~ T.T.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.", "T.T.Z x.+.+.h.T 8 # - : a ;./ T.T.T.T.[ T.T.T.T.T.T.T.T.[ T.T.T.", "T.T.T.g.) ' a.i H i @ $ i *.L T.T.T.[ T.T.T.[ T.T.T.T.[ T.T.T.", "T. $ 0.a.a.3.- 8 l v = t #.J + k T.T.T.T.[ T.T.T.T.[ T.T.T.", " 0 r r 0 . : 4 g t .S + o T.T.[ T.T.T.T.T.T.T.T.T.", " X , a { B T.T.T.T.T.T.T.[ T.T.T.T.", " . 5 ( m j [ T.T.T.T.T.T.T.T.T.T.", " 7 ! b T.T.T.T.T.T.[ T.T.T.T.T.", "T. $ S f T.T.T.T.T.T.[ T.T.T.T.T.T.", "T.T. - . T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.", "T.T.T.T.T. T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_sound_off.svg000066400000000000000000000673421221777731700225100ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Audio Volume High navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_sound_off_32.xpm000066400000000000000000000113641221777731700230120ustar00rootroot00000000000000/* XPM */ static char *gui_sound_off______[] = { /* columns rows colors chars-per-pixel */ "32 32 160 2", " c black", ". c #030303", "X c #070707", "o c #141413", "O c #141514", "+ c #161615", "@ c #141616", "# c #161716", "$ c #171716", "% c #161818", "& c #171919", "* c #181818", "= c #191919", "- c #191A19", "; c #191B1B", ": c #1C1C1B", "> c #1C1D1C", ", c #1F201F", "< c #222321", "1 c #232424", "2 c #232525", "3 c #242626", "4 c #252727", "5 c #272726", "6 c #282827", "7 c #272B2C", "8 c #292A29", "9 c #2D2E2D", "0 c #2A2F30", "q c #2B2F30", "w c #303231", "e c #333533", "r c #343635", "t c #343636", "y c #373737", "u c #383A38", "i c #383A39", "p c #3B3C3A", "a c #393D3C", "s c #3C3E3D", "d c #3F3F3F", "f c #404040", "g c #404241", "h c #454544", "j c #444744", "k c #464645", "l c #454948", "z c #4A4B4A", "x c #4A4E4D", "c c #4E504F", "v c #50514E", "b c #4C5050", "n c #505452", "m c #555957", "M c #575A56", "N c #595B56", "B c #585B5A", "V c #5C5D59", "C c #5D5E5B", "Z c #5B5F5D", "A c #5C5C5C", "S c #5F605B", "D c #636561", "F c #606462", "G c #656564", "H c #656764", "J c #656866", "K c #686A67", "L c #676A69", "P c #6B6D68", "I c #6E6F6D", "U c #6E6E6E", "Y c #737571", "T c #747874", "R c #767A78", "E c #7A7B7A", "W c #787C7A", "Q c #7B7E7A", "! c #7D7E7D", "~ c #7E7F7C", "^ c #7D807B", "/ c #7F817A", "( c #7F807E", ") c #838683", "_ c #868686", "` c #898D89", "' c #8C8E8B", "] c #8F938F", "[ c #91938A", "{ c #90918F", "} c #949793", "| c #959793", " . c #959695", ".. c #969795", "X. c #959894", "o. c #9C9C9C", "O. c #9D9F9C", "+. c #9DA099", "@. c #A1A1A0", "#. c #A2A5A1", "$. c #A5A8A5", "%. c #A9ACA8", "&. c #ADAEAB", "*. c #AEB0AD", "=. c #B0B2AE", "-. c #B0B0B0", ";. c #B1B3B0", ":. c #B4B5B5", ">. c #B7B8B5", ",. c #BABDB6", "<. c #BBBEB7", "1. c #B9B9B8", "2. c #B9BAB9", "3. c #B9BABA", "4. c #BABABA", "5. c #BCBCBC", "6. c #BDC0B9", "7. c #BEC1BC", "8. c #BFC0BE", "9. c #BFC1BE", "0. c #C1C5BE", "q. c #C2C4BF", "w. c #C4C5C2", "e. c #C5C5C4", "r. c #C6C6C6", "t. c #C6C7C6", "y. c #C8C9C7", "u. c #CBCFC7", "i. c #CACBCA", "p. c #CDCFCD", "a. c #D0D1CF", "s. c #D1D3CE", "d. c #D1D4CD", "f. c #D1D2D1", "g. c #D2D2D1", "h. c #D3D5D1", "j. c #D5D6D5", "k. c #D9DAD8", "l. c #D9DAD9", "z. c #DCDCDA", "x. c #DDDEDD", "c. c #DFE0DD", "v. c #DFE1DE", "b. c #E0E1DF", "n. c #E1E2E0", "m. c #E1E3E0", "M. c #E4E5E3", "N. c #E5E6E3", "B. c #E5E6E4", "V. c #E5E6E5", "C. c #E6E7E5", "Z. c #E7E8E7", "A. c #E9E9E7", "S. c #EAEBEA", "D. c #ECEDEA", "F. c #EDEDEB", "G. c #EEEFED", "H. c #F0F0EF", "J. c #FAFBFA", "K. c None", /* pixels */ "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.0.6.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K./ u.6.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.H d.<.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.z 0.S.w.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.,.,.,.,.K.K.K.H 4.V G.5.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.n.M.N.b.K.v o.@.p ! x.=.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.M.,.,.b.K 4.I _ 1.} l.%.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.Y H.h.s.V.;.k E 5.r...g.#.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.D +.J.F.A.S.I k ! =.g...y.X.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.S [ Z.z.z.V.u 5 9 8 1 h 0.] J K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.V / b.w.w.x.e + = : > g :.` x K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.N P l.&.&.j.x + + = > s *.R K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.M g.| X.p.L 5 O & = u $.W K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.i.! / r.y A y O + t +.F K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K. O 4.r.r.:.& 5 s k % w ..S K.K.K.K.K.K.K.K.K.K.K.K.K.K.", " . 7 0 0 7 . = 1 f w ' B K.K.K.K.K.K.K.K.K.K.K.K.", " X ; u ) b K.K.K.K.K.K.K.K.K.K.K.K.", " . 2 Q x K.K.K.K.K.K.K.K.K.K.K.K.", " 4 T l K.K.K.K.K.K.K.K.K.K.K.K.", "K. + B a K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K. & . K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K. K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_stop.svg000066400000000000000000000205651221777731700215070ustar00rootroot00000000000000 image/svg+xml Stop Process December 2006 Jakub Steiner Andreas Nilsson stop halt navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_strength_0.svg000066400000000000000000000056401221777731700225740ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_strength_1.svg000066400000000000000000000056621221777731700226010ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_strength_2.svg000066400000000000000000000057041221777731700225770ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_strength_3.svg000066400000000000000000000057261221777731700226040ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_strength_4.svg000066400000000000000000000057511221777731700226030ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_strength_5.svg000066400000000000000000000057721221777731700226070ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_tools.svg000066400000000000000000000352761221777731700216670ustar00rootroot00000000000000 image/svg+xml System Preferences Andreas Nilsson category system preferences settings control center Jakub Steiner navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_town.svg000066400000000000000000000064231221777731700215060ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_vehicle.svg000066400000000000000000000120331221777731700221300ustar00rootroot00000000000000 image/svg+xml image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_vehicle_pedestrian.svg000066400000000000000000000051611221777731700243520ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_zoom_in.svg000066400000000000000000000555751221777731700222050ustar00rootroot00000000000000 image/svg+xml Find document search find Lapo Calamandrei Jakub Steiner 2006-04-21 navit-0.5.0~svn5643+dfsg.1/navit/xpm/gui_zoom_out.svg000066400000000000000000000552561221777731700224020ustar00rootroot00000000000000 image/svg+xml Find document search find Lapo Calamandrei Jakub Steiner 2006-04-21 navit-0.5.0~svn5643+dfsg.1/navit/xpm/heliport.svg000066400000000000000000000031001221777731700214660ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/highway_exit.xpm000066400000000000000000000020551221777731700223460ustar00rootroot00000000000000/* XPM */ static char * highway_exit_xpm[] = { "16 16 46 1", " c None", ". c #035E9F", "+ c #77A8CB", "@ c #D4E3EE", "# c #337CB1", "$ c #CFE0EC", "% c #4688B8", "& c #8DB6D3", "* c #A5C5DC", "= c #488AB9", "- c #4588B8", "; c #B0CDE1", "> c #8EB7D4", ", c #DEEAF2", "' c #5C97C1", ") c #5592BE", "! c #7EACCE", "~ c #E6EFF5", "{ c #F5F8FB", "] c #2E79AF", "^ c #FFFFFF", "/ c #166AA6", "( c #EAF1F7", "_ c #8CB5D3", ": c #2674AC", "< c #83B0CF", "[ c #76A7CB", "} c #5894BF", "| c #FEFEFE", "1 c #1469A5", "2 c #0A63A2", "3 c #74A6CA", "4 c #EFF4F8", "5 c #3880B3", "6 c #EEF4F8", "7 c #72A5C9", "8 c #CADDEB", "9 c #ACCADF", "0 c #2272AB", "a c #3C82B4", "b c #3B81B4", "c c #045F9F", "d c #196CA7", "e c #1B6DA8", "f c #367EB2", "g c #1C6EA8", "................", "................", "................", "................", "................", "................", "+@@@#$%&*=@-@@@;", ">,').!~{])^/](_:", ">~<[.}|~1)^2.~3.", ">4;;56789)^2.~3.", "0aaa:bcdaeac.fg.", "................", "................", "................", "................", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/hindu.svg000066400000000000000000000255541221777731700207700ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/hospital.svg000066400000000000000000000072531221777731700215000ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/hotel.svg000066400000000000000000000124501221777731700207630ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/hunting_stand.xpm000066400000000000000000000006501221777731700225210ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 4 1", ". c None", "a c #000000", "b c #808080", "# c #c0c0c0", ".....#..........", ".....aaab#......", ".....aaaaaa.....", ".....aa..aa.....", ".....aaaaaa.....", ".....aaaaaa.....", ".....aaaaaa.....", ".....aaaaaa.....", "....aaaaaaa.....", "....aa....a.....", "...a.a....a.....", "...a.a....a.....", "..a..a....a.....", "..a..a....a.....", ".....a....a.....", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/information.svg000066400000000000000000000104151221777731700221740ustar00rootroot00000000000000 image/svg+xml i navit-0.5.0~svn5643+dfsg.1/navit/xpm/islamic.svg000066400000000000000000000241011221777731700212650ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/jain.svg000066400000000000000000000250131221777731700205700ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/jewish.svg000066400000000000000000000234101221777731700211370ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/justice.svg000066400000000000000000000152751221777731700213260ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/level_crossing.xpm000066400000000000000000000014021221777731700226660ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 27 1", ". c None", "a c #cb0000", "# c #cc0000", "w c #cf1818", "b c #d01a1a", "y c #d85151", "d c #db5656", "x c #df7676", "c c #e07b7b", "s c #e19090", "e c #e49898", "v c #ecb8b8", "j c #ecbcbc", "p c #f0f0f0", "r c #f4f4f4", "o c #f5f5f5", "q c #f6f6f6", "l c #f7f7f7", "h c #f8f8f8", "k c #f9f9f9", "t c #faefef", "u c #fbfbfb", "f c #fcf3f3", "g c #fcfcfc", "m c #fdfdfd", "n c #fefefe", "i c #ffffff", "....#......#....", "...a#.....###...", "...a##...###....", "....#bc..d##....", "....efg.hij.....", ".....kilmno.....", "......niig......", "......gin.......", "......gin.......", ".....pniih......", ".....kiqgir.....", "....stu.hnv.....", "....#wx..ya#....", "...###...###....", "...##.....a##...", "....a......#...."}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/library.svg000066400000000000000000000131711221777731700213150ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/library.xpm000066400000000000000000000007321221777731700213210ustar00rootroot00000000000000/* XPM */ static char *library[] = { /* columns rows colors chars-per-pixel */ "8 16 12 1", " c black", ". c #404040", "X c #464646", "o c #808080", "O c #8F8F8F", "+ c #BCBCBC", "@ c #BFBFBF", "# c #DCDCDC", "$ c #FBFBFB", "% c #FCFCFC", "& c #FFFFFF", "* c None", /* pixels */ "*** * ", "** X&X ", "* @&&.o ", " @&@ @& ", " .. &@@ ", " && @.& ", " && &o@ ", " && O@@ ", " && @.@ ", " && #&& ", " && &&& ", " && &&. ", " && &X *", " && X **", " && ***", ". ****" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/mark.svg000066400000000000000000000047431221777731700206100ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/memorial.svg000066400000000000000000002777631221777731700215010ustar00rootroot00000000000000 image/svg+xml en style="overflow:visible"> navit-0.5.0~svn5643+dfsg.1/navit/xpm/memorial.xpm000066400000000000000000000015151221777731700214620ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 32 1", ". c None", "m c #625112", "f c #646464", "a c #707070", "l c #736118", "i c #957d1d", "# c #999999", "b c #9c9b95", "e c #9f9c92", "h c #a08723", "o c #a5a08b", "r c #aaa386", "A c #aba384", "z c #aca383", "g c #afa580", "D c #b0a67e", "s c #b1a77e", "u c #b2a77d", "w c #b2a77e", "k c #b3a87c", "j c #b4a97b", "t c #b5a97a", "B c #b7aa77", "n c #b8ab76", "y c #baac74", "x c #c4b269", "C c #c5b368", "v c #c6b368", "q c #d9b830", "p c #dab934", "c c #ddc04e", "d c #e2c349", ".......##.......", ".....######.....", "....#######a....", "....##bcde#f....", "....##ghij#f....", "....##klmn#f....", "....##opqr#f....", "....###st##f....", "....#######f....", "....#uvwxyzf....", "....#######f....", "....#ABCDvtf....", "....#######f....", "....#######f....", "....#######f....", "....#######f...."}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/menu.svg000066400000000000000000000065421221777731700206210ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/menu.xpm000066400000000000000000000227121221777731700206230ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "96 96 2 1", ". c None", "# c #808080", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "...........................................####.................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................######################................................................", ".........................#######################................................................", ".........................#######################................................................", ".........................#######################................................................", ".........................#######################................................................", "..........................######################................................................", "................................................######################..........................", "................................................#######################.........................", "................................................#######################.........................", "................................................#######################.........................", "................................................#######################.........................", "................................................######################..........................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", ".................................................####...........................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/military.svg000066400000000000000000000272711221777731700215110ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/mini_roundabout.svg000066400000000000000000000151661221777731700230550ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/museum.svg000066400000000000000000000146141221777731700211670ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_destination_bk.svg000066400000000000000000000103211221777731700235040ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_destination_wh.svg000066400000000000000000000105551221777731700235370ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_1.xpm000066400000000000000000000105361221777731700216760ustar00rootroot00000000000000/* XPM */ static char * turn_left_90_v2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " . ", " ............. . ", " ........................ ", " ................................. ", " ............................... ", " ............................ ", " .......................... ", " ........................ ", " ...................... ", " ...................... ", " ....................... ", " ........................ ", " ......................... ", " ......................... ", " .......................... ", " .......................... ", " .......................... ", " .......................... ", " ........................... ", " ....... ................. ", " ...... ................ ", " .... ................ ", " ... .............. ", " .. ............. ", " .. ............. ", " . ............ ", " ........... ", " ............ ", " ........... ", " ........... ", " .......... ", " .......... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_1_32.xpm000066400000000000000000000024231221777731700221760ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ " .........................", ". ..............", ".. ...............", "... ................", ".... .................", "..... ...............", "...... .............", "....... ............", "........ ...........", "......... .........", ".......... .. .........", "........... .... ........", "............ ..... .......", "................... .......", "................... .......", ".................... .......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_1_bk.svg000066400000000000000000000011431221777731700223370ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_1_wh.svg000066400000000000000000000011431221777731700223610ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_2.xpm000066400000000000000000000105331221777731700216740ustar00rootroot00000000000000/* XPM */ static char * turn_left_v2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " ", " .. ", " ..... ", " ...... ", " ......... ", " ........... ", " ............. ", " ................ ", " ........................ ", " ................................. ", " ....................................... ", " ............................................. ", " ................................................. ", " ................................................... ", " .................................................. ", " ................................................ ", " .............................................. ", " ............................................ ", " ................ ....................... ", " ............. .................. ", " .......... ............... ", " ........ ............. ", " ..... ............. ", " ... ............ ", " ........... ", " .......... ", " ........... ", " .......... ", " .......... ", " .......... ", " .......... ", " ........... ", " ........... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " .......... "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_2_32.xpm000066400000000000000000000024231221777731700221770ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ "............... ................", "............. ................", ".......... ................", "....... .................", "..... ...........", ".. ........", ". ......", ".. .....", "..... ....", "........ . ...", "........... ...... ..", ".............. ........ ..", "......................... ..", "......................... .", "......................... .", "......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", "......................... .", "......................... .", "......................... .", "......................... .", ".......................... ." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_2_bk.svg000066400000000000000000000011431221777731700223400ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_2_wh.svg000066400000000000000000000011431221777731700223620ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_3_bk.svg000066400000000000000000000011451221777731700223430ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_left_3_wh.svg000066400000000000000000000011451221777731700223650ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_1.xpm000066400000000000000000000105371221777731700220620ustar00rootroot00000000000000/* XPM */ static char * turn_right_90_v2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " .. ", " ............... ", " ......................... ", " ................................. ", " ............................... ", " ............................ ", " .......................... ", " ........................ ", " ...................... ", " ....................... ", " ....................... ", " ........................ ", " ......................... ", " ......................... ", " .......................... ", " .......................... ", " .......................... ", " ........................... ", " ........................... ", " ................. ....... ", " ................ ...... ", " ............... ..... ", " ............... ... ", " ............. ... ", " ............. .. ", " ............ . ", " ........... ", " ............ ", " ........... ", " ........... ", " .......... ", " .......... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", ".......... ", ".......... ", ".......... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_1_32.xpm000066400000000000000000000024231221777731700223610ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ ".................. .......", "........ ........", "........ .........", ".......... ..........", ".......... ...........", "........ ............", "....... .............", "..... ..............", ".... ...............", "... ................", ".. .. .................", ". .... ..................", ". ..... ...................", ". .........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ...........................", " ...........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " .........................." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_1_bk.svg000066400000000000000000000011421221777731700225210ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_1_wh.svg000066400000000000000000000011421221777731700225430ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_2.xpm000066400000000000000000000105331221777731700220570ustar00rootroot00000000000000/* XPM */ static char * turn_rightv2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " . ", " .. ", " ..... ", " ...... ", " ......... ", " ............ ", " ............. ", " ................ ", " ........................ ", " ................................. ", " ....................................... ", " ............................................. ", " .................................................. ", " ................................................... ", " .................................................. ", " ................................................ ", " .............................................. ", " ............................................ ", " ....................... ............... ", " .................. ............ ", " ............... ......... ", " ............. ........ ", " ............. ..... ", " ........... ... ", " ........... ", " ........... ", " ........... ", " .......... ", " .......... ", " .......... ", "........... ", "........... ", "........... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_2_32.xpm000066400000000000000000000024231221777731700223620ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ "............... ................", "............... ..............", "............... ...........", "................ ........", ".......... ......", "....... ...", "..... .", ".... ...", "... ......", ".. . .........", ". ...... ............", ". ........ ...............", ". ..........................", " ..........................", " ..........................", " ..........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ..........................." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_2_bk.svg000066400000000000000000000011421221777731700225220ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_2_wh.svg000066400000000000000000000011421221777731700225440ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_3_bk.svg000066400000000000000000000011451221777731700225260ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_right_3_wh.svg000066400000000000000000000011451221777731700225500ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l1_bk.svg000066400000000000000000000015141221777731700237450ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l1_wh.svg000066400000000000000000000015141221777731700237670ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l2_bk.svg000066400000000000000000000014701221777731700237470ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l2_wh.svg000066400000000000000000000014701221777731700237710ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l3_bk.svg000066400000000000000000000015141221777731700237470ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l3_wh.svg000066400000000000000000000015141221777731700237710ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l4_bk.svg000066400000000000000000000014661221777731700237560ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l4_wh.svg000066400000000000000000000014661221777731700240000ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l5_bk.svg000066400000000000000000000015131221777731700237500ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l5_wh.svg000066400000000000000000000015131221777731700237720ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l6_bk.svg000066400000000000000000000014671221777731700237610ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l6_wh.svg000066400000000000000000000014671221777731700240030ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l7_bk.svg000066400000000000000000000015141221777731700237530ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l7_wh.svg000066400000000000000000000015141221777731700237750ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l8_bk.svg000066400000000000000000000014701221777731700237550ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_l8_wh.svg000066400000000000000000000014701221777731700237770ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r1_bk.svg000066400000000000000000000015141221777731700237530ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r1_wh.svg000066400000000000000000000015141221777731700237750ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r2_bk.svg000066400000000000000000000014671221777731700237630ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r2_wh.svg000066400000000000000000000014671221777731700240050ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r3_bk.svg000066400000000000000000000015131221777731700237540ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r3_wh.svg000066400000000000000000000015131221777731700237760ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r4_bk.svg000066400000000000000000000014661221777731700237640ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r4_wh.svg000066400000000000000000000014661221777731700240060ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r5_bk.svg000066400000000000000000000015141221777731700237570ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r5_wh.svg000066400000000000000000000015141221777731700240010ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r6_bk.svg000066400000000000000000000014701221777731700237610ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r6_wh.svg000066400000000000000000000014701221777731700240030ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r7_bk.svg000066400000000000000000000015141221777731700237610ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r7_wh.svg000066400000000000000000000015141221777731700240030ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r8_bk.svg000066400000000000000000000014701221777731700237630ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_roundabout_r8_wh.svg000066400000000000000000000014701221777731700240050ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_straight.xpm000066400000000000000000000105341221777731700223470ustar00rootroot00000000000000/* XPM */ static char * turn_straight_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " ", " . ", " . ", " .. ", " ... ", " .... ", " ..... ", " ..... ", " ...... ", " ....... ", " ....... ", " ........ ", " ......... ", " ......... ", " ........... ", " ........... ", " ............ ", " ............. ", " ............. ", " .............. ", " ............... ", " ............... ", " ................ ", " ................. ", " .................. ", " ................... ", " ................... ", " .................... ", " ..................... ", " ..................... ", " ...................... ", " ....................... ", " ....................... ", " ......................... ", " ......................... ", " .......................... ", " ........................... ", " .... ............ .... ", " .. ............ ... ", " . ............ . ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ........... "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_straight_32.xpm000066400000000000000000000024231221777731700226510ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ "................................", "............... ................", ".............. ................", ".............. ...............", ".............. ...............", "............. ...............", "............. ..............", "............ ..............", "............ .............", "............ .............", "........... .............", "........... ............", "........... ............", ".......... ............", ".......... ...........", ".......... ...........", "......... ...........", "......... ..........", "........ ..........", "........ ... .. .........", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............." }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_straight_bk.svg000066400000000000000000000011411221777731700230100ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_straight_wh.svg000066400000000000000000000011411221777731700230320ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_svg.html000066400000000000000000000042271221777731700214630ustar00rootroot00000000000000 Overview of Navit navigation icons

Overview of Navit navigation icons

navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_turnaround_left_bk.svg000066400000000000000000000011511221777731700243770ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_turnaround_left_wh.svg000066400000000000000000000011511221777731700244210ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_turnaround_right_bk.svg000066400000000000000000000011511221777731700245620ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/nav_turnaround_right_wh.svg000066400000000000000000000011511221777731700246040ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/navit_svg2png000077500000000000000000000027461221777731700216530ustar00rootroot00000000000000#!/bin/sh svgtopng() { case $svgtopng in *ksvgtopng|*ksvgtopng4) $svgtopng $* ;; *rsvg-convert) $svgtopng --width=$1 --height=$2 --output $4 $3 ;; *inkscape) $svgtopng --without-gui --export-width=$1 --export-height=$2 --export-png=$BUILDDIR/$4 $3 ;; *convert) $svgtopng $3 -resize $1x$2 $4 ;; esac } if [ "$OSTYPE" != "cygwin" -a "$OSTYPE" != "msys" ]; then ulimit -t 10 fi svgtopng=$1 png=$2 w=$3 h=$4 case "$png" in *_[1-9]*_[1-9]*.png) svg=${png%_*_*.png}; h=${png##*_} w=${png%_$h} h=${h%.png} w=${w##*_} ;; *) svg=${png%.png} ;; esac if [ ! -f $svg.svg -a ! -f $svg.svgz ] then svg="$SRCDIR/$svg" fi if [ -f $png -a ! -f $svg.svg ]; then # width and height seems to be defined as part of the file name touch $png else # use width and height from the svg image if [ -f $svg.svg ] then if [ -z "$w" ] then w=$(grep 'width="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*width="//' -e 's/[pxt]*".*//') fi if [ -z "$h" ] then h=$(grep 'height="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*height="//' -e 's/[pxt]*".*//') fi svgtopng $w $h $svg.svg $png elif [ -f $svg.svgz ] then gzip -dc <$svg.svgz >$svg.svg if [ -z "$w" ] then w=$(grep 'width="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*width="//' -e 's/[pxt]*".*//') fi if [ -z "$h" ] then h=$(grep 'height="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*height="//' -e 's/[pxt]*".*//') fi svgtopng $w $h $svg.svg $png rm -f $svg.svg fi fi exit 0 navit-0.5.0~svn5643+dfsg.1/navit/xpm/osd_minus.png000066400000000000000000000005111221777731700216300ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME@tEXtCommentCreated with The GIMPd%nIDATxٱ 0 Wə.p^oI*+d:|kWb3.d}xjQp\ V՘$I}8orMuOZKwIENDB`navit-0.5.0~svn5643+dfsg.1/navit/xpm/osd_plus.png000066400000000000000000000005411221777731700214630ustar00rootroot00000000000000PNG  IHDR@@iqbKGDC pHYs  tIME5k]1tEXtCommentCreated with The GIMPd%nIDATx 0 PNn 8Ъ$o8r9kHLPSӷe$(};of0 X%\[.{O-}WU 8s?NsUUX>B*)QpIENDB`navit-0.5.0~svn5643+dfsg.1/navit/xpm/pagan.svg000066400000000000000000000121111221777731700207300ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/parking.svg000066400000000000000000000057231221777731700213100ustar00rootroot00000000000000 image/svg+xml P navit-0.5.0~svn5643+dfsg.1/navit/xpm/pastafarian.svg000066400000000000000000000247261221777731700221520ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/peak.svg000066400000000000000000000113221221777731700205650ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/pharmacy.svg000066400000000000000000000067621221777731700214650ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/picnic.svg000066400000000000000000000123551221777731700211210ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/picnic.xpm000066400000000000000000000012051221777731700211160ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 15 20 1", ". c None", "d c #020202", "e c #080808", "q c #0c0c0c", "n c #161616", "i c #212121", "o c #282828", "k c #2a2a2a", "m c #2d2d2d", "f c #393939", "# c #424242", "p c #474747", "g c #4c4c4c", "b c #555555", "l c #686868", "j c #6a6a6a", "c c #757575", "h c #808080", "r c #838383", "a c #9a9a9a", "................", "................", "..#abbbbbbbbb#..", "...cdddddddde...", ".....fdggddh....", ".....id..dd.....", "....jdk..ldi....", "..mmednkmndemm..", ".odddddeddddddd.", "...pd#....#dd...", "...dq#.....mdl..", "..hdf......fdb..", "..rbc.......bb..", "................", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/police.svg000066400000000000000000000104731221777731700211260ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/post.svg000066400000000000000000000063411221777731700206370ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/potable_water.xpm000066400000000000000000000010601221777731700225000ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 13 1", ". c None", "# c #000000", "e c #0000a5", "h c #0000b2", "c c #0000cc", "d c #0000cd", "g c #0000d3", "b c #0000db", "k c #0000e8", "f c #0000e9", "j c #0000eb", "a c #0000ec", "i c #0000ff", "......####......", "........#.......", "...########.....", "...##########...", "...###########..", "............##..", "............##..", ".....aaab...##..", "....caaad...##..", "....eaaaa...##..", ".....faag.......", ".....gaah....i..", ".....gaa.....i..", "......jk........", "............ii..", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/public_office.xpm000066400000000000000000000010771221777731700224510ustar00rootroot00000000000000/* XPM */ static char * public_office_xpm[] = { "16 16 13 1", " c None", ". c #888888", "+ c #FFFFFF", "@ c #D5D5D5", "# c #5A5A5A", "$ c #E4E4E4", "% c #676767", "& c #000000", "* c #737373", "= c #C4C4C4", "- c #555555", "; c #C9C9C9", "> c #C1C1C1", " . ", " .+. ", " .+++. ", " .+@#$+. ", " .+%&*+. ", " .+=-;+....", ". . . .++++++++.", "..+.. .+>>>+>>+.", ".+++. .+>>>+>>+.", ".+>+. .++++++++.", ".+>+...+>>>+>>+.", ".++++++++++++++.", ".+>>>>+>>>>+>>+.", ".+>>>>+>>>>+>>+.", ".+++++++++++>>+.", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/restaurant.svg000066400000000000000000000140441221777731700220410ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/restroom.xpm000066400000000000000000000046501221777731700215320ustar00rootroot00000000000000/* XPM */ static char * restroom_xpm[] = { "16 16 115 2", " c None", ". c #262CA6", "+ c #2C32A8", "@ c #6D71C2", "# c #3A3FAE", "$ c #2A30A8", "% c #8689CB", "& c #484DB4", "* c #3C42AF", "= c #9699D4", "- c #FEFEFE", "; c #CACBE8", "> c #2E34A9", ", c #E0E0F1", "' c #4E53B6", ") c #FCFCFD", "! c #EDEEF6", "~ c #2D33A9", "{ c #8286CB", "] c #FCFCFC", "^ c #ACAFDC", "/ c #484DB3", "( c #F6F7FA", "_ c #E4E5F3", ": c #2C31A8", "< c #484EB4", "[ c #A0A2D7", "} c #B4B6E0", "| c #A3A6D8", "1 c #4F54B6", "2 c #6065BD", "3 c #A8ABDB", "4 c #BBBDE2", "5 c #B2B4DF", "6 c #A1A4D8", "7 c #272DA6", "8 c #D0D1EA", "9 c #FFFEFE", "0 c #FFFFFF", "a c #FFFFFE", "b c #DADBEE", "c c #E1E1F1", "d c #BEBFE3", "e c #3D42AF", "f c #DFE0F0", "g c #E8E8F4", "h c #EEEFF7", "i c #CED0E9", "j c #474CB3", "k c #262CA5", "l c #E9EAF6", "m c #E7E8F4", "n c #E7E7F4", "o c #C6C6E6", "p c #7D80C9", "q c #B8B9E0", "r c #FEFEFD", "s c #AEB0DD", "t c #898CCE", "u c #AAADDC", "v c #A9ACDB", "w c #C8C9E8", "x c #BDBFE2", "y c #B6B9E0", "z c #B0B2DE", "A c #CBCDE8", "B c #AAACDB", "C c #CBCCE9", "D c #8184CA", "E c #C8C9E7", "F c #CED0EA", "G c #7A7EC8", "H c #E3E4F2", "I c #A8AADA", "J c #A7AADA", "K c #C5C7E6", "L c #343AAC", "M c #F9F9FB", "N c #3B41AE", "O c #3439AB", "P c #9B9ED5", "Q c #DDDEF0", "R c #777BC6", "S c #3036AA", "T c #4A50B4", "U c #A7AADB", "V c #DADBEF", "W c #E6E7F4", "X c #A9ACDC", "Y c #5156B7", "Z c #2F34AA", "` c #CCCEEA", " . c #F6F6FA", ".. c #767AC6", "+. c #AAADDB", "@. c #A5A8DA", "#. c #C0C2E4", "$. c #E0E1F0", "%. c #AAAEDC", "&. c #A6A9DA", "*. c #C0C3E5", "=. c #AAAEDB", "-. c #A7A9DA", ";. c #A0A3D6", ">. c #9598D3", ",. c #B8BAE0", "'. c #9498D2", "). c #C9CAE8", "!. c #F2F3F8", "~. c #7276C4", "{. c #282EA6", "]. c #2A2FA7", "^. c #292FA7", "/. c #7074C3", "(. c #4248B1", ". . + @ # . . $ % . . . & * . . ", ". . = - ; . . > , . . ' ) ! ~ . ", ". . { ] ^ . . > , . . / ( _ : . ", ". < [ } | 1 . > , . 2 3 4 5 6 ' ", "7 8 9 0 a b . > , . c 0 0 0 0 d ", "e f g 0 h i j > , k l m 0 a n o ", "p q - 0 r s t > , . g u 0 a v w ", "x y 0 0 0 z A > , . g u 0 a B C ", "D E 0 0 0 F G > , k H I 0 a J K ", "L M 0 0 0 ] N > , . O P Q M R S ", "T U Q V W X Y Z , . . P ` .... ", ". . +.@.#.. . > $.. . P ` .... ", ". . %.&.*.. . > , . . P ` .... ", ". . =.-.*.. . > , . . P ` .... ", ". . ;.>.,.. . > , . . '.).!.~.. ", ". . {.. ].. . ^./.. . S * (.+ . "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/ruins.svg000066400000000000000000001346121221777731700210150ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/school.svg000066400000000000000000000112721221777731700211400ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/shelter.svg000066400000000000000000000217621221777731700213240ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/shelter.xpm000066400000000000000000000013061221777731700213210ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 23 1", ". c None", "g c #000000", "r c #010101", "f c #080808", "o c #0a0a0a", "p c #101010", "n c #111111", "j c #121212", "t c #202020", "u c #2e2e2e", "b c #303030", "s c #313131", "k c #333333", "e c #353535", "a c #373737", "q c #414141", "c c #444444", "m c #505050", "i c #525252", "h c #6c6c6c", "# c #6e6e6e", "l c #727272", "d c #7d7d7d", "................", "................", "................", "................", "................", "......#abc......", "....defggfeh....", "...ijggggggfkl..", ".mnggopqqpprggs.", ".tuagm.....faut.", "...mgm.....fm...", "...mgm.....fm...", "...mgm.....fm...", "...mgm.....fm...", "...mgm.....fm...", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/shinto.svg000066400000000000000000000255101221777731700211550ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/shop_apparel.svg000066400000000000000000000416411221777731700223310ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/shop_computer.svg000066400000000000000000000244451221777731700225460ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/shop_department.svg000066400000000000000000000525761221777731700230610ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/shopping.svg000066400000000000000000000157111221777731700215020ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/sikh.svg000066400000000000000000000345531221777731700206160ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/skiing.svg000066400000000000000000000260121221777731700211330ustar00rootroot00000000000000 image/svg+xml Hotel is near a ski area Hotel is near a ski area navit-0.5.0~svn5643+dfsg.1/navit/xpm/sport.svg000066400000000000000000000076761221777731700210350ustar00rootroot00000000000000 image/svg+xml en image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/sport.xpm000066400000000000000000000022651221777731700210270ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 56 1", ". c None", "v c #000000", "V c #0c0c0c", "o c #121212", "Y c #131313", "C c #141414", "u c #191919", "F c #1e1e1e", "D c #232323", "c c #292929", "T c #2b2b2b", "1 c #2d2d2d", "g c #2e2e2e", "b c #2f2f2f", "K c #303030", "y c #343434", "d c #363636", "a c #393939", "B c #3b3b3b", "L c #3d3d3d", "k c #404040", "m c #414141", "f c #444444", "p c #454545", "U c #474747", "t c #494949", "n c #4d4d4d", "J c #4e4e4e", "j c #525252", "e c #575757", "# c #5a5a5a", "E c #5b5b5b", "w c #5d5d5d", "l c #676767", "x c #6d6d6d", "z c #6f6f6f", "r c #757575", "O c #787878", "Q c #7f7f7f", "G c #808080", "N c #878787", "R c #888888", "Z c #8a8a8a", "X c #8c8c8c", "W c #a7a7a7", "H c #adadad", "0 c #b3b3b3", "h c #b6b6b6", "I c #c5c5c5", "P c #c8c8c8", "S c #d6d6d6", "M c #dadada", "A c #dfdfdf", "i c #e8e8e8", "s c #fcfcfc", "q c #fefefe", "................", "................", "................", ".....#abcde.....", "....fghijklm....", "...nopqqrsqlt...", "...uvwxyvzABC...", "...DEqqFvvGxv...", "...HGqIJKLqMB...", "...NkBOqqOPQR...", "...BvvySspvTU...", "...#uVWhXvvY....", "....#LZ0hc1.....", "................", "................", "................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/stadium.svg000066400000000000000000000174221221777731700213220ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/swimming.svg000066400000000000000000000301671221777731700215070ustar00rootroot00000000000000 image/svg+xml Hotel has pool Hotel has pool navit-0.5.0~svn5643+dfsg.1/navit/xpm/taoist.svg000066400000000000000000000162741221777731700211630ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/tec_common.svg000066400000000000000000002634651221777731700220110ustar00rootroot00000000000000 image/svg+xml traffic light by http://commons.wikimedia.org/wiki/User:Manuel_Strehl camera by KDE e.V. navit-0.5.0~svn5643+dfsg.1/navit/xpm/telephone.svg000066400000000000000000000077211221777731700216400ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/theater.svg000066400000000000000000000236521221777731700213120ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/theater.xpm000066400000000000000000000022141221777731700213060ustar00rootroot00000000000000/* XPM */ static char * theater_xpm[] = { "16 15 54 1", " c None", ". c #FFFFFF", "+ c #CFCFCF", "@ c #808080", "# c #D8D8D8", "$ c #F7F7F7", "% c #F5F5F5", "& c #DEDEDE", "* c #A2A2A2", "= c #393939", "- c #606060", "; c #9D9D9D", "> c #929292", ", c #E5E5E5", "' c #4F4F4F", ") c #5A5A5A", "! c #474747", "~ c #3F3F3F", "{ c #8B8B8B", "] c #979797", "^ c #767676", "/ c #E9E9E9", "( c #000000", "_ c #575757", ": c #494949", "< c #232323", "[ c #050505", "} c #2E2E2E", "| c #333333", "1 c #EBEBEB", "2 c #7D7D7D", "3 c #BABABA", "4 c #BEBEBE", "5 c #666666", "6 c #1D1D1D", "7 c #AAAAAA", "8 c #2B2B2B", "9 c #505050", "0 c #B7B7B7", "a c #272727", "b c #121212", "c c #161616", "d c #D6D6D6", "e c #9A9A9A", "f c #C3C3C3", "g c #6D6D6D", "h c #0A0A0A", "i c #343434", "j c #454545", "k c #6B6B6B", "l c #EEEEEE", "m c #787878", "n c #0C0C0C", "o c #CACACA", " ... ..++.", " .. .+@#$%&*=-.", ".;>. .,'')'!!)~%", ".{]^$./!(_(=@==%", ".{.*---:<][}}_|1", ".23*4.,567!83#94", "&2/>&/0)a^:@bc'3", "def3@#g='(}](h9/", ".g..),.$'}c]@ij%", ".k70_l*1<:@>7mk.", ".@7}fmk9{:2n8~+.", ".#g8(|_o.m:9=@. ", " .-7k_7. .*>d$ ", " .+9^)$ ... ", " .%/% "}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/toggle_fullscreen.svg000066400000000000000000000054001221777731700233500ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/toggle_fullscreen.xpm000066400000000000000000000227121221777731700233620ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "96 96 2 1", ". c None", "# c #808080", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "........................######################..................................................", "........................#######################.................................................", "........................#######################.................................................", "........................#######################.................................................", "........................#######################.................................................", "........................######################..................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", ".........................####...................................................................", "................................................................................................", "................................................................................................", "...................................................................####.........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................######################........................", ".................................................#######################........................", ".................................................#######################........................", ".................................................#######################........................", ".................................................#######################........................", "..................................................######################........................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/toilets.svg000066400000000000000000000137441221777731700213420ustar00rootroot00000000000000 image/svg+xml 26.06.2008 Jakub Klawiter toilet sign man woman navit-0.5.0~svn5643+dfsg.1/navit/xpm/tower.xpm000066400000000000000000000010131221777731700210060ustar00rootroot00000000000000/* XPM */ static char *tower[] = { /* columns rows colors chars-per-pixel */ "10 16 13 1", " c black", ". c #131313", "X c #141414", "o c #1B1B1B", "O c #1E1E1E", "+ c #252525", "@ c #262626", "# c #363636", "$ c #404040", "% c #797979", "& c #AEAEAE", "* c #D7D7D7", "= c #FFFFFF", /* pixels */ "==========", "====%%====", "===& &===", "===&oo&===", "===* *===", "==== ====", "==== ====", "====##====", "====$#====", "====o@====", "====OO====", "====.X====", "====@@====", "====..====", "==== ====", "==== ====" }; navit-0.5.0~svn5643+dfsg.1/navit/xpm/townhall.svg000066400000000000000000000240241221777731700215000ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/townhall.xpm000066400000000000000000000033071221777731700215060ustar00rootroot00000000000000/* XPM */ static char * townhall_xpm[] = { "16 18 88 1", " c None", ". c #BF0000", "+ c #CE0000", "@ c #A80000", "# c #C20000", "$ c #5C652F", "% c #5D6630", "& c #808C42", "* c #818D42", "= c #5B642F", "- c #5D662F", "; c #808C41", "> c #5B632E", ", c #111208", "' c #2B2F16", ") c #535A2A", "! c #535B2B", "~ c #535C2A", "{ c #545C2B", "] c #555C2B", "^ c #555D2B", "/ c #535B2A", "( c #292D14", "_ c #454C23", ": c #565F2C", "< c #5D6730", "[ c #5A632E", "} c #424822", "| c #363B1C", "1 c #414621", "2 c #4A5026", "3 c #484F25", "4 c #454B23", "5 c #495026", "6 c #484E25", "7 c #444922", "8 c #3A401D", "9 c #32361A", "0 c #484D2A", "a c #888888", "b c #66685F", "c c #4E542D", "d c #72736F", "e c #6C6E66", "f c #51582E", "g c #6E6E68", "h c #80807F", "i c #4C512B", "j c #272B14", "k c #6B743E", "l c #9E9E9E", "m c #7D7E76", "n c #75803C", "o c #8F8F8F", "p c #7E7E7A", "q c #7F8B41", "r c #81827E", "s c #6A743C", "t c #75716C", "u c #68665D", "v c #7C5A20", "w c #6E531E", "x c #33371E", "y c #505730", "z c #9A9A9A", "A c #75766E", "B c #58602D", "C c #78571E", "D c #684F1D", "E c #5C6430", "F c #7B7C78", "G c #989898", "H c #50572E", "I c #4B5227", "J c #5D6531", "K c #67695B", "L c #5A5D45", "M c #59602E", "N c #564A1F", "O c #554B20", "P c #5D6430", "Q c #5F624E", "R c #626454", "S c #5C6431", "T c #444A23", "U c #373C1C", "V c #434922", "W c #393E1D", " .+ ", " @# ", " ", " $% ", " $&**&= ", " -&******;> ", ",')!~~{{{{]^^/( ", "_:<<<<<<<<<<<<[}", " |123456}3578 ", " 90abcdefghij ", " klmnopqrls ", " klmnopqrls ", " klmnopqrls ", " klmntuqrls ", " klmnvwqrls ", " xyzABCDEFGH ", " IJKLMNOPQRST ", "UV_4444444444_VW"}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/traffic_signals.svg000066400000000000000000000131761221777731700230140ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/trailerpark.xpm000066400000000000000000000033221221777731700221730ustar00rootroot00000000000000/* XPM */ static char * trailerpark_xpm[] = { "16 16 91 1", " c #325692", ". c #335692", "+ c #335592", "@ c #325592", "# c #325591", "$ c #335690", "% c #335593", "& c #8195B7", "* c #BCC7D9", "= c #C4CEDE", "- c #CCD5E3", "; c #D3DAE3", "> c #D8DEE8", ", c #DDE3EB", "' c #DFE5EC", ") c #D9E1E9", "! c #D5DCE6", "~ c #D2D8E2", "{ c #CAD3E0", "] c #C1CCDB", "^ c #8D9FBD", "/ c #345590", "( c #F3F5F8", "_ c #FEFEFD", ": c #FDFEFD", "< c #FDFFFD", "[ c #FFFFFF", "} c #FEFFFE", "| c #FCFFFC", "1 c #FDFEFE", "2 c #DFE5EB", "3 c #F6F9FA", "4 c #C0C9DA", "5 c #3B5B94", "6 c #3A5B93", "7 c #B3C0D5", "8 c #FCFDFE", "9 c #3D5C92", "0 c #C9D1DE", "a c #335591", "b c #BCC8DA", "c c #B1BED4", "d c #FBFDFE", "e c #355791", "f c #C8D0DD", "g c #DFE4EB", "h c #CED6E1", "i c #6A83AC", "j c #6B83AC", "k c #C4CFDF", "l c #FFFFFE", "m c #FCFDFD", "n c #6C84AC", "o c #6A83AD", "p c #D6DCE4", "q c #FFFEFE", "r c #E0E6ED", "s c #99AAC5", "t c #D1DAE4", "u c #FEFEFE", "v c #355793", "w c #37588E", "x c #F6F8FA", "y c #F4F7F8", "z c #869AB9", "A c #E3EBF0", "B c #95A7C1", "C c #E0E5ED", "D c #DEE4EB", "E c #788FB7", "F c #A9BAD2", "G c #ADBBD1", "H c #91A4C2", "I c #C7D1DE", "J c #3D5F94", "K c #D0D7E2", "L c #7C92B6", "M c #8FA1C1", "N c #5C79A6", "O c #92A2C2", "P c #A6B5CB", "Q c #B7C2D4", "R c #C3CCDB", "S c #325693", "T c #3E5E98", "U c #546FA1", "V c #395994", "W c #7087B1", "X c #3F5F99", "Y c #345593", "Z c #345592", " . ++@#$%+++ ", " .&*=-;>,')!~{]^", " /(_:<:[}|<__:12", " $34567[89666502", " a3b+.c[de+.++fg", " a3hijklmniiiopg", " a3[[[}[[[[[[lqg", " a3[[[[l[l[[[[lg", " a3[[[[rstu[[[lg", "vwxuuuyzABCuuuuD", "EFGGGGHIJKLGGGGM", "NO PQR% S", "TU VWX S", " Y Z % S", " S", " ++++++++++++++."}; navit-0.5.0~svn5643+dfsg.1/navit/xpm/unknown.svg000066400000000000000000000074371221777731700213600ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/viewpoint.svg000066400000000000000000000016641221777731700217010ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/wifi.svg000066400000000000000000000110261221777731700206040ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/worship.svg000066400000000000000000000171451221777731700213510ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0~svn5643+dfsg.1/navit/xpm/zoo.svg000066400000000000000000000022631221777731700204600ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xpm/zoom_in.svg000066400000000000000000000066501221777731700213270ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xpm/zoom_out.svg000066400000000000000000000072001221777731700215200ustar00rootroot00000000000000 image/svg+xml navit-0.5.0~svn5643+dfsg.1/navit/xslt/000077500000000000000000000000001221777731700173135ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/navit/xslt/android.xslt000066400000000000000000000061701221777731700216530ustar00rootroot00000000000000 32 86400 android: 1 android 1 navit-0.5.0~svn5643+dfsg.1/navit/xslt/android_all_densities.xslt000066400000000000000000002101261221777731700245500ustar00rootroot00000000000000 1 1 32 android: 1 android navit-0.5.0~svn5643+dfsg.1/navit/xslt/android_hdpi.xslt000066400000000000000000000020131221777731700226470ustar00rootroot00000000000000 1.33 1.5 2 470 32 32 64 10 0 navit-0.5.0~svn5643+dfsg.1/navit/xslt/android_ldpi.xslt000066400000000000000000000020131221777731700226530ustar00rootroot00000000000000 1.33 0.7 2 250 32 48 64 2 -1 navit-0.5.0~svn5643+dfsg.1/navit/xslt/android_mdpi.xslt000066400000000000000000000020101221777731700226510ustar00rootroot00000000000000 1.33 1 2 200 32 32 64 3 0 navit-0.5.0~svn5643+dfsg.1/navit/xslt/binding_dbus.xslt000066400000000000000000000005751221777731700226650ustar00rootroot00000000000000 yes navit-0.5.0~svn5643+dfsg.1/navit/xslt/cursor_scale.xslt000066400000000000000000000042451221777731700227200ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/default_plugins.xslt000066400000000000000000000022541221777731700234170ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/gui_gtk.xslt000066400000000000000000000017051221777731700216630ustar00rootroot00000000000000 no yes navit-0.5.0~svn5643+dfsg.1/navit/xslt/iphone.xslt000066400000000000000000000032431221777731700215130ustar00rootroot00000000000000 86400 iphone: 1 iphone navit-0.5.0~svn5643+dfsg.1/navit/xslt/map_sdcard_navitmap_bin.xslt000066400000000000000000000004371221777731700250570ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/map_secondary_sdcard_navitmap_bin.xslt000066400000000000000000000006661221777731700271320ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/navit_drag_bitmap.xslt000066400000000000000000000005611221777731700237030ustar00rootroot00000000000000 yes navit-0.5.0~svn5643+dfsg.1/navit/xslt/null.xslt000066400000000000000000000005631221777731700212050ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/openmoko.xslt000066400000000000000000000007141221777731700220600ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/osd_android_minimum.xslt000066400000000000000000000052151221777731700242520ustar00rootroot00000000000000 1 1 navit-0.5.0~svn5643+dfsg.1/navit/xslt/osd_enable_zoom.xslt000066400000000000000000000006241221777731700233700ustar00rootroot00000000000000 yes navit-0.5.0~svn5643+dfsg.1/navit/xslt/osd_minimum.xslt000066400000000000000000000045301221777731700225510ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/pedestrian.xslt000066400000000000000000000024141221777731700223660ustar00rootroot00000000000000 1 navit-0.5.0~svn5643+dfsg.1/navit/xslt/pedestrian_button.xslt000066400000000000000000000014601221777731700237610ustar00rootroot00000000000000 Pedestrian ]]> navit-0.5.0~svn5643+dfsg.1/navit/xslt/pedestrian_plugin.xslt000066400000000000000000000010201221777731700237340ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/plugin_menu.xslt000066400000000000000000000014151221777731700225520ustar00rootroot00000000000000 Plugins Plugins ]]> navit-0.5.0~svn5643+dfsg.1/navit/xslt/samplemap.xslt000066400000000000000000000005351221777731700222110ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/xslt/speech_espeak.xslt000066400000000000000000000005721221777731700230320ustar00rootroot00000000000000 espeak navit-0.5.0~svn5643+dfsg.1/navit/xslt/vehicle_null.xslt000066400000000000000000000006171221777731700227040ustar00rootroot00000000000000 null: navit-0.5.0~svn5643+dfsg.1/navit/xslt/windows.xslt000066400000000000000000000011741221777731700217240ustar00rootroot00000000000000 navit-0.5.0~svn5643+dfsg.1/navit/zipfile.h000066400000000000000000000140721221777731700201400ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __ZIPFILE_H__ #define __ZIPFILE_H__ #ifdef HAVE_PRAGMA_PACK #pragma pack(push) #pragma pack(1) #endif #ifdef __GNUC__ #define ATTRIBUTE_PACKED __attribute__ ((packed)) #else #define ATTRIBUTE_PACKED #endif #define zip_split_sig 0x08074b50 #define zip_split_sig_rev 0x504b0708 struct zip_split { int zipsplitsig; }; #define zip_lfh_sig 0x04034b50 #define zip_lfh_sig_rev 0x504b0304 //! ZIP local file header structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_lfh { int ziplocsig; //!< local file header signature short zipver; //!< minimum zip spec version needed to extract short zipgenfld; //!< general purpose flags short zipmthd; //!< compression method short ziptime; //!< file modification time short zipdate; //!< file modification date int zipcrc; //!< CRC-32 checksum unsigned int zipsize; //!< file size (after compression) unsigned int zipuncmp; //!< file size (uncompressed) unsigned short zipfnln; //!< file name length unsigned short zipxtraln; //!< extra filed length (unused?) char zipname[0]; //!< file name (length as given above) } ATTRIBUTE_PACKED; #define zip_cd_sig 0x02014b50 #define zip_cd_sig_rev 0x504b0102 //! ZIP central directory structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_cd { int zipcensig; //!< central directory signature char zipcver; //!< zip spec version of creating software char zipcos; //!< os compatibility of the file attribute information char zipcvxt; //!< minimum zip spec version needed to extract char zipcexos; //!< unused (?) short zipcflg; //!< general purpose flag short zipcmthd; //!< compression method short ziptim; //!< file modification time short zipdat; //!< file modification date int zipccrc; //!< CRC-32 checksum unsigned int zipcsiz; //!< file size (after compression) unsigned int zipcunc; //!< file size (uncompressed) unsigned short zipcfnl; //!< file name length unsigned short zipcxtl; //!< extra field length unsigned short zipccml; //!< comment length unsigned short zipdsk; //!< disk number of file unsigned short zipint; //!< internal attributes unsigned int zipext; //!< external attributes unsigned int zipofst; //!< offset to start of local file header char zipcfn[0]; //!< file name (length as given above) } ATTRIBUTE_PACKED; /** * @brief Placeholder value for size field in the central directory if * the size is 64bit. See the documentation for the Zip64 Extended * Information Extra Field. */ #define zip_size_64bit_placeholder 0xffffffff /** * @brief Header ID for extra field "ZIP64". */ #define zip_extra_header_id_zip64 0x0001 //! ZIP extra field structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_cd_ext { short tag; //!< extra field header ID short size; //!< extra field data size unsigned long long zipofst; //!< offset to start of local file header (only valid if the struct is for a ZIP64 extra field) } ATTRIBUTE_PACKED; struct zip_enc { short efield_header; short efield_size; short version; char vendor_id1,vendor_id2; char encryption_strength; short compress_method; } ATTRIBUTE_PACKED; #define zip_eoc_sig 0x6054b50 #define zip_eoc_sig_rev 0x504b0506 //! ZIP end of central directory structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_eoc { int zipesig; /* end of central dir signature */ unsigned short zipedsk; /* number of this disk */ unsigned short zipecen; /* number of the disk with the start of the central directory */ unsigned short zipenum; /* total number of entries in the central directory on this disk */ unsigned short zipecenn; /* total number of entries in the central directory */ unsigned int zipecsz; /* size of the central directory */ unsigned int zipeofst; /* offset of start of central directory with respect to the starting disk number */ short zipecoml; /* .ZIP file comment length */ char zipecom[0]; /* .ZIP file comment */ } ATTRIBUTE_PACKED; #define zip64_eoc_sig 0x6064b50 #define zip64_eoc_sig_rev 0x504b0606 struct zip64_eoc { int zip64esig; /* zip64 end of central dir signature */ unsigned long long zip64esize; /* size of zip64 end of central directory record */ unsigned short zip64ever; /* version made by */ unsigned short zip64eneed; /* version needed to extract */ unsigned int zip64edsk; /* number of this disk */ unsigned int zip64ecen; /* number of the disk with the start of the central directory */ unsigned long long zip64enum; /* total number of entries in the central directory on this disk */ unsigned long long zip64ecenn; /* total number of entries in the central directory */ unsigned long long zip64ecsz; /* size of the central directory */ unsigned long long zip64eofst; /* offset of start of central directory with respect to the starting disk number */ char zip64ecom[0]; /* zip64 extensible data sector */ } ATTRIBUTE_PACKED; #define zip64_eocl_sig 0x07064b50 struct zip64_eocl { int zip64lsig; int zip64ldsk; long long zip64lofst; int zip74lnum; } ATTRIBUTE_PACKED; struct zip_alignment_check { int x[sizeof(struct zip_cd) == 46 ? 1:-1]; }; #ifdef HAVE_PRAGMA_PACK #pragma pack(pop) #endif #endif navit-0.5.0~svn5643+dfsg.1/po/000077500000000000000000000000001221777731700156165ustar00rootroot00000000000000navit-0.5.0~svn5643+dfsg.1/po/CMakeLists.txt000066400000000000000000000126351221777731700203650ustar00rootroot00000000000000FIND_PROGRAM(XGETTEXT xgettext) set(POTFILES ${PROJECT_SOURCE_DIR}/navit/main.c ${PROJECT_SOURCE_DIR}/navit/navigation.c ${PROJECT_SOURCE_DIR}/navit/navit.c ${PROJECT_SOURCE_DIR}/navit/popup.c ${PROJECT_SOURCE_DIR}/navit/country.c ${PROJECT_SOURCE_DIR}/navit/start_real.c ${PROJECT_SOURCE_DIR}/navit/route.c ${PROJECT_SOURCE_DIR}/navit/vehicle.c ${PROJECT_SOURCE_DIR}/navit/bookmarks.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/destination.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/gui_gtk_action.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/gui_gtk_statusbar.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_bookmark.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_command.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_html.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_menu.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_poi.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_search.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_widget.c ${PROJECT_SOURCE_DIR}/navit/osd/core/osd_core.c ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitDialogs.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitGraphics.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/Navit.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitMapDownloader.java ${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.c ${CMAKE_CURRENT_BINARY_DIR}/strings_xml.c ) if (XGETTEXT_GLADE) list(APPEND POTFILES ${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.glade) endif() # Trick gettext to get translateable strings out of navit_shipped.xml ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.c DEPENDS ${PROJECT_SOURCE_DIR}/navit/navit_shipped.xml COMMAND ${CMAKE_COMMAND} -D SRC=${PROJECT_SOURCE_DIR}/navit/navit_shipped.xml -D DST=${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.c -P ${PROJECT_SOURCE_DIR}/cmake/navit_xml_parser.cmake ) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.glade DEPENDS ${PROJECT_SOURCE_DIR}/navit/navit_shipped.xml COMMAND ${CMAKE_COMMAND} -D SRC=${PROJECT_SOURCE_DIR}/navit/navit_shipped.xml -D DST=${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.glade -P ${PROJECT_SOURCE_DIR}/cmake/navit_xml_parser_glade.cmake ) # Trick gettext to get translateable strings out of android strings.xml ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/strings_xml.c DEPENDS ${PROJECT_SOURCE_DIR}/navit/android/res/values/strings.xml COMMAND ${CMAKE_COMMAND} -D SRC=${PROJECT_SOURCE_DIR}/navit/android/res/values/strings.xml -D DST=${CMAKE_CURRENT_BINARY_DIR}/strings_xml.c -P ${PROJECT_SOURCE_DIR}/cmake/strings_xml_parser.cmake ) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/navit.pot DEPENDS ${POTFILES} COMMAND ${XGETTEXT} --no-location --default-domain=navit_tmp --add-comments --keyword=_ --keyword=_n --keyword=navit_nls_gettext --keyword=navit_nls_ngettext:1,2 ${POTFILES} COMMAND ${CMAKE_COMMAND} -DMATCHES="CHARSET" -DREPLACE="utf-8" -DSRC=${CMAKE_CURRENT_BINARY_DIR}/navit_tmp.po -DDST=${CMAKE_CURRENT_BINARY_DIR}/navit.pot -P ${PROJECT_SOURCE_DIR}/cmake/replace.cmake ) FILE(GLOB POIN_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.po.in") string(REPLACE ".po.in" "" LANGUAGES "${POIN_FILES}") foreach (LANG ${LANGUAGES}) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/navit.pot ${CMAKE_CURRENT_SOURCE_DIR}/${LANG}.po.in COMMAND ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/${LANG}.po.in -D DST=${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po.tmp -DPACKAGE_STRING=${PACKAGE_STRING} -P ${PROJECT_SOURCE_DIR}/cmake/navit_po_version.cmake COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --no-fuzzy-matching --verbose --quiet -o "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po" "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po.tmp" ${CMAKE_CURRENT_BINARY_DIR}/navit.pot COMMAND ${CMAKE_COMMAND} -E remove "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po.tmp" ) endforeach(LANG ${LANGUAGES}) foreach (LANG ${LANGUAGES}) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check --verbose --statistics --output-file="${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo" "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po" COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/locale/${LANG}/LC_MESSAGES" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo" "${PROJECT_BINARY_DIR}/locale/${LANG}/LC_MESSAGES/navit.mo" ) SET(MOFILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo ${MOFILES}) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo DESTINATION ${LOCALE_DIR}/${LANG}/LC_MESSAGES RENAME navit.mo) endforeach(LANG ${LANGUAGES}) add_custom_target(locales ALL DEPENDS ${MOFILES}) navit-0.5.0~svn5643+dfsg.1/po/Makefile.am000066400000000000000000000116011221777731700176510ustar00rootroot00000000000000CATALOGS = @MOFILES@ CLEANFILES = $(CATALOGS) navit.pot # keep this sorted EXTRA_DIST = @POIFILES@ \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDialogs.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitGraphics.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/Navit.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitMapDownloader.java \ $(top_srcdir)/navit/android/res/values/strings.xml POTFILES = \ $(top_srcdir)/navit/main.c \ $(top_srcdir)/navit/navigation.c \ $(top_srcdir)/navit/navit.c \ $(top_srcdir)/navit/popup.c \ $(top_srcdir)/navit/country.c \ $(top_srcdir)/navit/gui/gtk/destination.c \ $(top_srcdir)/navit/gui/gtk/gui_gtk_action.c \ $(top_srcdir)/navit/gui/gtk/gui_gtk_statusbar.c \ $(top_srcdir)/navit/gui/internal/gui_internal.c \ $(top_srcdir)/navit/gui/internal/gui_internal_bookmark.c \ $(top_srcdir)/navit/gui/internal/gui_internal_command.c \ $(top_srcdir)/navit/gui/internal/gui_internal_html.c \ $(top_srcdir)/navit/gui/internal/gui_internal_menu.c \ $(top_srcdir)/navit/gui/internal/gui_internal_poi.c \ $(top_srcdir)/navit/gui/internal/gui_internal_search.c \ $(top_srcdir)/navit/gui/internal/gui_internal_widget.c \ $(top_srcdir)/navit/osd/core/osd_core.c \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDialogs.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitGraphics.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/Navit.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitMapDownloader.java \ $(top_builddir)/navit/navit_shipped.c \ $(top_builddir)/navit/strings.c if XGETTEXT_GLADE POTFILES += $(top_builddir)/navit/navit_shipped.glade endif SUFFIXES = .po .mo .po.mo: dir=`basename $@ .mo` ;\ $(MSGFMT) --check --verbose --statistics --output-file=$@ $< && \ mkdir -p ../locale/$$dir/LC_MESSAGES && \ cp $@ ../locale/$$dir/LC_MESSAGES/navit.mo all: @MOFILES@ # Trick gettext to get translateable strings out of navit_shipped.xml $(top_builddir)/navit/navit_shipped.glade: $(top_srcdir)/navit/navit_shipped.xml sed -e "s/vehicleprofile/atkaction/" -e "s/name=/description=/" -e 's/$(top_builddir)/navit/navit_shipped.glade $(top_builddir)/navit/navit_shipped.c: $(top_srcdir)/navit/navit_shipped.xml sed -e 's/|//g' -e 's/^/|/' -e 's/$$/|/' -e 's/\(_("[^"]*")\)/| \1; |/g' -e 's/|[^|]*|//g' <$(top_srcdir)/navit/navit_shipped.xml >$(top_builddir)/navit/navit_shipped.c # Trick gettext to get translateable strings out of android/strings.xml $(top_builddir)/navit/strings.c: $(top_srcdir)/navit/android/res/values/strings.xml sed -e "s/\\\\'/'/g" -e 's%.*]*name="\(.*\)">\(.*\)%// Android resource: @strings/\1\n_("\2")%g' -e '\%^//%!d'<$(top_srcdir)/navit/android/res/values/strings.xml >$(top_builddir)/navit/strings.c @POFILES@: navit.pot sed 's/^"Project-Id-Version:.*/"Project-Id-Version: $(PACKAGE_STRING)\\n"/' < $(top_srcdir)/po/$@.in | $(MSGMERGE) --no-fuzzy-matching --verbose -o $(top_builddir)/po/$@ - navit.pot navit.pot: $(POTFILES) $(XGETTEXT) --no-location --default-domain=navit \ --add-comments --keyword=_ --keyword=_n --keyword=navit_nls_gettext --keyword=navit_nls_ngettext:1,2 $(POTFILES) if cmp -s navit.po navit.pot; then \ rm -f navit.po; \ else \ mv -f navit.po navit.pot; \ fi install-data-local: $(CATALOGS) $(mkinstalldirs) $(DESTDIR)$(datadir)/locale chmod 755 $(DESTDIR)$(datadir)/locale for n in $(CATALOGS) __DuMmY ; do \ if test "$$n" -a "$$n" != "__DuMmY" ; then \ l=`basename $$n .mo`; \ $(mkinstalldirs) $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ chmod 755 $(DESTDIR)$(datadir)/locale/$$l; \ chmod 755 $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ $(INSTALL_DATA) -m 644 $$n $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ fi; \ done uninstall-local: for n in $(CATALOGS) __DuMmY ; do \ if test "$$n" -a "$$n" != "__DuMmY" ; then \ l=`basename $$n .mo`; \ rm -f $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ fi; \ done distclean-local: rm -f $(top_builddir)/navit/navit_shipped.glade $(top_builddir)/navit/navit_shipped.c $(top_builddir)/navit/strings.c for n in $(CATALOGS) __DuMmY ; do \ if test "$$n" -a "$$n" != "__DuMmY" ; then \ l=`basename $$n .mo`; \ rm -f ../locale/$$l/LC_MESSAGES/navit.mo; \ rm -f $$l.po; \ fi; \ done navit-0.5.0~svn5643+dfsg.1/po/af.po.in000066400000000000000000001066351221777731700171640ustar00rootroot00000000000000# Afrikaans translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # mdhull, 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 20:36+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Afrikaans \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: af\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Loop vanaf bron gids\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "verander '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulste" msgid "first" msgstr "eerste" msgid "second" msgstr "tweede" msgid "third" msgstr "derde" msgid "fourth" msgstr "vierde" msgid "fifth" msgstr "vyfde" msgid "sixth" msgstr "sesde" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulste uitgang" msgid "first exit" msgstr "eerste uitgang" msgid "second exit" msgstr "tweede uitgang" msgid "third exit" msgstr "derde uitgang" msgid "fourth exit" msgstr "vierde uitgang" msgid "fifth exit" msgstr "vyfde uitgang" msgid "sixth exit" msgstr "sesde uitgang" #, c-format msgid "%d m" msgstr "%d meter" #, c-format msgid "in %d m" msgstr "na %d meter" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "na %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "na %d.%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "een kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "na een kilometer" msgstr[1] "na %d kilometer" msgid "exit" msgstr "afrit" msgid "into the ramp" msgstr "na die afrit" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sin die straat %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sin die %s%s%s|" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sin die %s%s%s|" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sin die %s%s%s|" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sin die %s in" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "regs" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "links" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "maklik " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "skerp " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "regtig sterk " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "onbekend " msgid "When possible, please turn around" msgstr "Draai asseblief om wanneer moontlik" msgid "Enter the roundabout soon" msgstr "Gaan kortliks in die sirkel in" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "verlaat dan die sirkel by die %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Verlaat die sirkel by die %s" #, c-format msgid "Follow the road for the next %s" msgstr "Volg die pad vir die volgende %s" msgid "soon" msgstr "kortliks" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Neem die %1$s pad na %2$s" #, c-format msgid "after %i roads" msgstr "na %i paaie" msgid "now" msgstr "nou" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "neem dan die %1$s pad na %2$s" msgid "error" msgstr "fout" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Draai %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "draai dan %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Jy het jou bestemming bereik %s" msgid "then you have reached your destination." msgstr "dan het jy jou bestemming bereik." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisie" msgid "Command" msgstr "Bevel" msgid "Length" msgstr "Lengte" msgid "km" msgstr "kilometer" msgid "m" msgstr "meter" msgid "Time" msgstr "Tyd" msgid "Destination Length" msgstr "Bestemming lengte" msgid "Destination Time" msgstr "Bestemming tyd" msgid "Roadbook" msgstr "Padkaart" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Stel as posisie" msgid "Set as destination" msgstr "Stel as bestemming" msgid "Add as bookmark" msgstr "Voeg as boekmerk by" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skerm koordinaat : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Verenigde Arabiese Emirate" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigue en Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanië" #. 051 msgid "Armenia" msgstr "Armenië" #. 530 msgid "Netherlands Antilles" msgstr "Nederland Antille" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentinië" #. 016 msgid "American Samoa" msgstr "Amerikaanse Samoa" #. 040 msgid "Austria" msgstr "Oostenryk" #. 036 msgid "Australia" msgstr "Australië" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Eiland" #. 031 msgid "Azerbaijan" msgstr "Azerbaidjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnië en Herzegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesj" #. 056 msgid "Belgium" msgstr "België" #. 854 msgid "Burkina Faso" msgstr "Boerkina Fasso" #. 100 msgid "Bulgaria" msgstr "Bulgarye" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Boeroendi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "St. Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Broenei" #. 068 msgid "Bolivia" msgstr "Bolivië" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilië" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhoetan" #. 074 msgid "Bouvet Island" msgstr "Bouveteiland" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Wit-Rusland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos- (Keeling) eilande" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratiese Republiek van die" #. 140 msgid "Central African Republic" msgstr "Sentraal-Afrikaanse Republiek" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Switserland" #. 384 msgid "Cote d'Ivoire" msgstr "Ivoorkus" #. 184 msgid "Cook Islands" msgstr "Cookeilande" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kameroen" #. 156 msgid "China" msgstr "Sjina" #. 170 msgid "Colombia" msgstr "Kolombië" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kaap Verdie" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kerseiland" #. 196 msgid "Cyprus" msgstr "Siprus" #. 203 msgid "Czech Republic" msgstr "Tjeggiese Republiek" #. 276 msgid "Germany" msgstr "Duitsland" #. 262 msgid "Djibouti" msgstr "Djiboeti" #. 208 msgid "Denmark" msgstr "Denemarke" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikaanse Republiek" #. 012 msgid "Algeria" msgstr "Algerië" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Esland" #. 818 msgid "Egypt" msgstr "Egipte" #. 732 msgid "Western Sahara" msgstr "Wes-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanje" #. 231 msgid "Ethiopia" msgstr "Etiopië" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fidji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-eiland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesia, Federale state van" #. 234 msgid "Faroe Islands" msgstr "Faroëreilande" #. 250 msgid "France" msgstr "Frankryk" #. 266 msgid "Gabon" msgstr "Gaboen" #. 826 msgid "United Kingdom" msgstr "Verenigde Koninkryk" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgië" #. 254 msgid "French Guiana" msgstr "Frans-Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambië" #. 324 msgid "Guinea" msgstr "Guinië" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekwatoriaal-Guinee" #. 300 msgid "Greece" msgstr "Griekeland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgië en die Suid Sandwich Eilande" #. 320 msgid "Guatemala" msgstr "Gautemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinee-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Eiland en McDonald Eiland" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroasië" #. 332 msgid "Haiti" msgstr "Haïti" #. 348 msgid "Hungary" msgstr "Hongarye" #. 360 msgid "Indonesia" msgstr "Indonesië" #. 372 msgid "Ireland" msgstr "Ierland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man eiland" #. 356 msgid "India" msgstr "Indië" #. 086 msgid "British Indian Ocean Territory" msgstr "Brits Indiese oseaan gebiede" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Ysland" #. 380 msgid "Italy" msgstr "Italië" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanië" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Kambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts en Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Noord-Korea" #. 410 msgid "Korea, Republic of" msgstr "Suid-Korea" #. 414 msgid "Kuwait" msgstr "Koeweit" #. 136 msgid "Cayman Islands" msgstr "Kaaimanseilande" #. 398 msgid "Kazakhstan" msgstr "Kazakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberië" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litoue" #. 442 msgid "Luxembourg" msgstr "Luxenburg" #. 428 msgid "Latvia" msgstr "Letland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libië" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldawië" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "St. Martin" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall-eilande" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Masedonië" #. 466 msgid "Mali" msgstr "Malie" #. 104 msgid "Myanmar" msgstr "Mianmar" #. 496 msgid "Mongolia" msgstr "Mongolië" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Noordmarianaeilande" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mouritanië" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Maleisië" #. 508 msgid "Mozambique" msgstr "Mosambiek" #. 516 msgid "Namibia" msgstr "Namibië" #. 540 msgid "New Caledonia" msgstr "Nieu-Kaledonië" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk-eiland" #. 566 msgid "Nigeria" msgstr "Nigerië" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Noorweë" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Naoeroe" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nieu-Seeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Frans Polinesië" #. 598 msgid "Papua New Guinea" msgstr "Papoea Nieu-Guinee" #. 608 msgid "Philippines" msgstr "Filippyne" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pole" #. 666 msgid "Saint Pierre and Miquelon" msgstr "St. Pierre en Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn Eilande" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestynse Gebied, Besette" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguaai" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roemenië" #. 688 msgid "Serbia" msgstr "Serwië" #. 643 msgid "Russian Federation" msgstr "Rusland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saoedi-Arabië" #. 090 msgid "Solomon Islands" msgstr "Solomon-eilande" #. 690 msgid "Seychelles" msgstr "Seychelle" #. 736 msgid "Sudan" msgstr "Soedan" #. 752 msgid "Sweden" msgstr "Swede" #. 702 msgid "Singapore" msgstr "Singapoer" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slovenië" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard en Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakye" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalië" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé en Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirië" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkse en Caicos Eilande" #. 148 msgid "Chad" msgstr "Tsjaad" #. 260 msgid "French Southern Territories" msgstr "Franse Suidelike gebiede" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Oos-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisië" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkye" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad en Tobago" #. 798 msgid "Tuvalu" msgstr "Toewaloe" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanië" #. 804 msgid "Ukraine" msgstr "Oekraïne" #. 800 msgid "Uganda" msgstr "Oeganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Verenigde State Kleiner uitliggende eilande" #. 840 msgid "United States" msgstr "Vereenigde State" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Oesbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikaan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent en die Grenadine" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britse Maagde eilande" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikaanse Maagde eilande" #. 704 msgid "Viet Nam" msgstr "Viëtnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- en Futuna-eilande" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Suid-Afrika" #. 894 msgid "Zambia" msgstr "Zambië" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Onbekend, voeg is_in merkers by daai stede" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kaart punt" msgid "Car" msgstr "Kar" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Pos" msgid "Town" msgstr "Dorp" msgid "District" msgstr "Distrik" msgid "Street" msgstr "Straat" msgid "Number" msgstr "Nommer" msgid "Enter Destination" msgstr "Kies Bestemming" msgid "Zip Code" msgstr "Poskode" msgid "City" msgstr "Stad" msgid "District/Township" msgstr "Distrik/Kontrei" msgid "Map" msgstr "Kaart" msgid "Bookmark" msgstr "Boekmerk" msgid "Destination" msgstr "Bestemming" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Skerm" msgid "_Route" msgstr "Roete" msgid "_Former Destinations" msgstr "Voorige bestemmings" msgid "_Bookmarks" msgstr "Boekmerke" msgid "_Map" msgstr "Kaart" msgid "_Layout" msgstr "Uitleg" msgid "_Projection" msgstr "Skatting" msgid "_Vehicle" msgstr "Voertuig" msgid "Zoom_Out" msgstr "ZoomUit" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Herbereken" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Inligting" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop Navigasie" msgid "Test" msgstr "Toets" msgid "_Quit" msgstr "_Sluit af" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Koppel aan Pad" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Padkaart" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Outozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Volskerm" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "SO" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nee" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Roete %4.0fkm %02d:%02d aankomstyd" msgid "Route 0000km 0+00:00 ETA" msgstr "Roete 0000km 0+00:00 aankomstyd" msgid "Help" msgstr "Hulp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Besigtig in blaaier" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Strate" msgid "House numbers" msgstr "Huis Nommers" msgid "View Attributes" msgstr "Besigtig eienskappe" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Belangpunte" msgid "View on map" msgstr "Beloer op kaart" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Boekmerke" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Boekmerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Wys Satelliet Inligting" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Wys NMEA data" msgid "car" msgstr "Motor" msgid "bike" msgstr "Motorfiets" msgid "pedestrian" msgstr "voetganger" #, c-format msgid "Current profile: %s" msgstr "Huidige Profiel: %s" #, c-format msgid "Change profile to: %s" msgstr "Verander profiel na: %s" msgid "Set as active" msgstr "Maak aktief" msgid "Show Satellite status" msgstr "Wys satelliet inligting" msgid "Show NMEA data" msgstr "Wys NMEA data" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Voertuig" msgid "Rules" msgstr "Reëls" msgid "Lock on road" msgstr "Koppel aan pad" msgid "Northing" msgstr "Draai kaart noord" msgid "Map follows Vehicle" msgstr "Kaart volg voertuig" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kaarte" msgid "Layout" msgstr "Uitleg" msgid "Height Profile" msgstr "Hoë profiel" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Voorige bestemmings" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Boodskap" msgid "Back" msgstr "Terug" msgid "Back to map" msgstr "Terug kaart toe" msgid "Main Menu" msgstr "Hoofkieslys" msgid "House number" msgstr "Huis Nommer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Voertuig posisie" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hoofkieslys" msgid "" "Show\n" "Map" msgstr "" "Wys\n" "Kaart" msgid "Settings" msgstr "Instellings" msgid "Tools" msgstr "Gereedskap" msgid "Route" msgstr "Roete" msgid "About" msgstr "" msgid "Actions" msgstr "Aksies" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Verlaat" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "Navigasie" msgid "Display" msgstr "Skerm" msgid "Fullscreen" msgstr "Volskerm" msgid "Window Mode" msgstr "Venster Modus" msgid "Description" msgstr "Beskrywing" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "In %s, gaan in die sirkel in" #~ msgid "Cursor" #~ msgstr "Plekaanduier" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometer" navit-0.5.0~svn5643+dfsg.1/po/ar.po.in000066400000000000000000001202701221777731700171670ustar00rootroot00000000000000# Arabic translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Metehyi, 2009 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-02-01 17:37+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "جاري التنفيذ من المجلد المصدر\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "وضع حالة '%s' إلى '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "(الرقم) صفر" msgid "first" msgstr "الأوّل" msgid "second" msgstr "الثّاني" msgid "third" msgstr "الثّالث" msgid "fourth" msgstr "الرّابع" msgid "fifth" msgstr "الخامس" msgid "sixth" msgstr "السادس" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "المخرج ذو الرقم صفر" msgid "first exit" msgstr "المخرج الأول" msgid "second exit" msgstr "المخرج الثاني" msgid "third exit" msgstr "المخرج الثالث" msgid "fourth exit" msgstr "المخرج الرابع" msgid "fifth exit" msgstr "المخرج الخامس" msgid "sixth exit" msgstr "المخرج السادس" #, c-format msgid "%d m" msgstr "%d م" #, c-format msgid "in %d m" msgstr "بعد %d متر" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d متر" #, c-format msgid "in %d meters" msgstr "بعد %d متر" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d كلم" #, c-format msgid "in %d.%d kilometers" msgstr "بعد %d%d كلم" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "كلم واحد" msgstr[1] "%d كلم" msgstr[2] "%d كلم" msgstr[3] "%d كلم" msgstr[4] "%d كلم" msgstr[5] "%d كلم" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "بعد كلم واحد" msgstr[1] "بعد %d كلم" msgstr[2] "بعد %d كلم" msgstr[3] "بعد %d كلم" msgstr[4] "بعد %d كلم" msgstr[5] "بعد %d كلم" msgid "exit" msgstr "خروج" msgid "into the ramp" msgstr "إلى داخل الطريق المنحدر" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s إلى داخل الشارع %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sإلى داخل %s%s%s|صفة الذكر" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sإلى داخل %s%s%s|صفة الأنثى" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sإلى داخل %s%s%s|غير محدد الجنس" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s إلى داخل %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "إلى اليمين" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "إلى اليسار" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "بسهولة " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "بكل شدة " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "بشدة حادة " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "غير معروف " msgid "When possible, please turn around" msgstr "حيث ممكن الرجاء اللف" msgid "Enter the roundabout soon" msgstr "قريباً الدخول إلى المستديرة" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "ثم أخرج من المستديرة عند الــ%s" #, c-format msgid "Leave the roundabout at the %s" msgstr "أخرج من المستديرة عند الــ %s" #, c-format msgid "Follow the road for the next %s" msgstr "تابع الطريق لل- %s التالية" msgid "soon" msgstr "قريبا" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "خذ الطريق %1$s إلى ال%2$s" #, c-format msgid "after %i roads" msgstr "بعد %i طرقات" msgid "now" msgstr "الآن" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "ثم خذ الطريق %1$s إلى ال- %2$s" msgid "error" msgstr "خطء" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "حوّل %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "ثم حوّل %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "لقد وصلت إلى هدفك %s" msgid "then you have reached your destination." msgstr "و بعدها تكون قد وصلت إلى هدفك" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "الموقع" msgid "Command" msgstr "الأمر" msgid "Length" msgstr "الطول" msgid "km" msgstr "كلم" msgid "m" msgstr "م." msgid "Time" msgstr "الوقت" msgid "Destination Length" msgstr "بُعد الهدف" msgid "Destination Time" msgstr "الوقت في مكان الوصول" msgid "Roadbook" msgstr "سجل خريطة الطريق" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "عين كموقع حالي" msgid "Set as destination" msgstr "عيّن كهدف" msgid "Add as bookmark" msgstr "أضف كعلامة مراجعة" #, c-format msgid "Point 0x%x 0x%x" msgstr "الموقع 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "إحداثيات الشاشة :%d %d" #. 020 msgid "Andorra" msgstr "أندورا" #. 784 msgid "United Arab Emirates" msgstr "الإمارات العربيّة المتّحدة" #. 004 msgid "Afghanistan" msgstr "أفغانستان" #. 028 msgid "Antigua and Barbuda" msgstr "أنتيغوا وباربودا" #. 660 msgid "Anguilla" msgstr "أنغويلا" #. 008 msgid "Albania" msgstr "ألبانيا" #. 051 msgid "Armenia" msgstr "أرمينيا" #. 530 msgid "Netherlands Antilles" msgstr "الأنتيل الهولندية" #. 024 msgid "Angola" msgstr "أنغولا" #. 010 msgid "Antarctica" msgstr "أنتاركتيكا" #. 032 msgid "Argentina" msgstr "الأرجنتين" #. 016 msgid "American Samoa" msgstr "ساموا الأميركية" #. 040 msgid "Austria" msgstr "النمسا" #. 036 msgid "Australia" msgstr "أستراليا" #. 533 msgid "Aruba" msgstr "أروبا" #. 248 msgid "Aland Islands" msgstr "جزر أولان" #. 031 msgid "Azerbaijan" msgstr "أذربيجان" #. 070 msgid "Bosnia and Herzegovina" msgstr "البوسنة والهرسك" #. 052 msgid "Barbados" msgstr "بربادوس" #. 050 msgid "Bangladesh" msgstr "بنغلادش" #. 056 msgid "Belgium" msgstr "بلجيكا" #. 854 msgid "Burkina Faso" msgstr "بوركينا فاسو" #. 100 msgid "Bulgaria" msgstr "بلغاريا" #. 048 msgid "Bahrain" msgstr "البحرين" #. 108 msgid "Burundi" msgstr "بوروندي" #. 204 msgid "Benin" msgstr "البنين" #. 652 msgid "Saint Barthelemy" msgstr "سانت بارتيليمي" #. 060 msgid "Bermuda" msgstr "جزر البرمودا" #. 096 msgid "Brunei Darussalam" msgstr "بروناي دار السّلام" #. 068 msgid "Bolivia" msgstr "بوليفيا" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "البرازيل" #. 044 msgid "Bahamas" msgstr "جزر البهاما" #. 064 msgid "Bhutan" msgstr "بوتان" #. 074 msgid "Bouvet Island" msgstr "جزيرة بوفيت" #. 072 msgid "Botswana" msgstr "بوتسوانا" #. 112 msgid "Belarus" msgstr "روسيا البيضاء \\ بيلاروس" #. 084 msgid "Belize" msgstr "بيليز" #. 124 msgid "Canada" msgstr "كندا" #. 166 msgid "Cocos (Keeling) Islands" msgstr "جزر الكوكوس (كيلنك)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "جمهورية الكونغو الديمقراطيه" #. 140 msgid "Central African Republic" msgstr "جمهورية إفريقيا الوسطى" #. 178 msgid "Congo" msgstr "الكونغو" #. 756 msgid "Switzerland" msgstr "سويسرا" #. 384 msgid "Cote d'Ivoire" msgstr "ساحل العاج" #. 184 msgid "Cook Islands" msgstr "جزر كوك" #. 152 msgid "Chile" msgstr "تشيلي" #. 120 msgid "Cameroon" msgstr "الكامرون" #. 156 msgid "China" msgstr "الصين" #. 170 msgid "Colombia" msgstr "كولومبيا" #. 188 msgid "Costa Rica" msgstr "كوستاريكا" #. 192 msgid "Cuba" msgstr "كوبا" #. 132 msgid "Cape Verde" msgstr "الرأس الاخضر كاب فيردي" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "جزر الكريسماس" #. 196 msgid "Cyprus" msgstr "قبرص" #. 203 msgid "Czech Republic" msgstr "جمهورية التشيك" #. 276 msgid "Germany" msgstr "ألمانيا" #. 262 msgid "Djibouti" msgstr "جيبوتي" #. 208 msgid "Denmark" msgstr "الدنمارك" #. 212 msgid "Dominica" msgstr "الدّومينيكا" #. 214 msgid "Dominican Republic" msgstr "جمهورية الدومينيكان" #. 012 msgid "Algeria" msgstr "الجزائر" #. 218 msgid "Ecuador" msgstr "الإكوادور" #. 233 msgid "Estonia" msgstr "أستونيا" #. 818 msgid "Egypt" msgstr "جمهورية مصر العربية" #. 732 msgid "Western Sahara" msgstr "الصحراء الغربية" #. 232 msgid "Eritrea" msgstr "أريتريا" #. 724 msgid "Spain" msgstr "إسبانيا" #. 231 msgid "Ethiopia" msgstr "الحبشة" #. 246 msgid "Finland" msgstr "فنلندا" #. 242 msgid "Fiji" msgstr "فيجي" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "جزر فولكلاند (مالفيناس)" #. 583 msgid "Micronesia, Federated States of" msgstr "ميكرونيزيا، ولايات ميكرونيزيا الفدرالية" #. 234 msgid "Faroe Islands" msgstr "جزر الفارو" #. 250 msgid "France" msgstr "فرنسا" #. 266 msgid "Gabon" msgstr "الغابون" #. 826 msgid "United Kingdom" msgstr "المملكة المتّحدة" #. 308 msgid "Grenada" msgstr "غرناطة" #. 268 msgid "Georgia" msgstr "جورجيا" #. 254 msgid "French Guiana" msgstr "جويانا الفرنسية" #. 831 msgid "Guernsey" msgstr "غويرنسي" #. 288 msgid "Ghana" msgstr "غانا" #. 292 msgid "Gibraltar" msgstr "جبل طارق" #. 304 msgid "Greenland" msgstr "جرينلاندا" #. 270 msgid "Gambia" msgstr "غامبيا" #. 324 msgid "Guinea" msgstr "غينيا" #. 312 msgid "Guadeloupe" msgstr "جوادلوب" #. 226 msgid "Equatorial Guinea" msgstr "غينيا الاستوائيه" #. 300 msgid "Greece" msgstr "اليونان" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "جورجيا الجنوبيّة و جزر ساندويتش الجنوبيّة" #. 320 msgid "Guatemala" msgstr "جواتيمالا" #. 316 msgid "Guam" msgstr "غوام" #. 624 msgid "Guinea-Bissau" msgstr "غينيا بيساو" #. 328 msgid "Guyana" msgstr "غيانا" #. 344 msgid "Hong Kong" msgstr "هونغ كونغ" #. 334 msgid "Heard Island and McDonald Islands" msgstr "جزيرة هيرد وجزر مَكْدونالد" #. 340 msgid "Honduras" msgstr "الهوندوراس" #. 191 msgid "Croatia" msgstr "كرواتيا" #. 332 msgid "Haiti" msgstr "هايتي" #. 348 msgid "Hungary" msgstr "المجر (هنغاريا)" #. 360 msgid "Indonesia" msgstr "إندونيسيا" #. 372 msgid "Ireland" msgstr "إيرلندا" #. 376 msgid "Israel" msgstr "فلسطين المحتلة" #. 833 msgid "Isle of Man" msgstr "جزيرة مان" #. 356 msgid "India" msgstr "الهند" #. 086 msgid "British Indian Ocean Territory" msgstr "مقاطعة المحيط الهندي البريطانيّة" #. 368 msgid "Iraq" msgstr "العراق" #. 364 msgid "Iran, Islamic Republic of" msgstr "إيران، الجمهوريّة الإسلاميّة الإيرانيّة" #. 352 msgid "Iceland" msgstr "آيسلندا" #. 380 msgid "Italy" msgstr "إيطاليا" #. 832 msgid "Jersey" msgstr "جيرسي" #. 388 msgid "Jamaica" msgstr "جامايكا" #. 400 msgid "Jordan" msgstr "الأردن" #. 392 msgid "Japan" msgstr "اليابان" #. 404 msgid "Kenya" msgstr "كينيا" #. 417 msgid "Kyrgyzstan" msgstr "قرغيزستان" #. 116 msgid "Cambodia" msgstr "كامبوديا" #. 296 msgid "Kiribati" msgstr "كيريباتي" #. 174 msgid "Comoros" msgstr "جزر القمر" #. 659 msgid "Saint Kitts and Nevis" msgstr "سانت كيتس ونيفيس" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "كوريا، جمهورية كوريا الشّعبيّة الدّيموقراطيّة" #. 410 msgid "Korea, Republic of" msgstr "كوريا، جمهوريّة كوريا" #. 414 msgid "Kuwait" msgstr "الكويت" #. 136 msgid "Cayman Islands" msgstr "جزر الكايمان" #. 398 msgid "Kazakhstan" msgstr "كازاخستان" #. 418 msgid "Lao People's Democratic Republic" msgstr "جمهوريّة لاو الدّيموقراطيّة الشّعبيّة" #. 422 msgid "Lebanon" msgstr "لبنان" #. 662 msgid "Saint Lucia" msgstr "سانت لوسيا" #. 438 msgid "Liechtenstein" msgstr "ليشتنشتاين" #. 144 msgid "Sri Lanka" msgstr "سريلانكا" #. 430 msgid "Liberia" msgstr "ليبريا" #. 426 msgid "Lesotho" msgstr "ليسوتو" #. 440 msgid "Lithuania" msgstr "ليثوانيا" #. 442 msgid "Luxembourg" msgstr "اللكسمبورغ" #. 428 msgid "Latvia" msgstr "لاتفيا" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "الجماهيريّة العربيّة اللّيبيّة" #. 504 msgid "Morocco" msgstr "المغرب" #. 492 msgid "Monaco" msgstr "موناكو" #. 498 msgid "Moldova, Republic of" msgstr "مولدوفا، جمهوريّة مولدوفا" #. 499 msgid "Montenegro" msgstr "المونتنيغرو" #. 663 msgid "Saint Martin (French part)" msgstr "سانت مارتين (القطاع الفرنسي)" #. 450 msgid "Madagascar" msgstr "مدغشقر" #. 584 msgid "Marshall Islands" msgstr "جزر المارشال" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "مقدونيا" #. 466 msgid "Mali" msgstr "مالي" #. 104 msgid "Myanmar" msgstr "مينامار" #. 496 msgid "Mongolia" msgstr "منغوليا" #. 446 msgid "Macao" msgstr "ماكاو" #. 580 msgid "Northern Mariana Islands" msgstr "جزر ماريانا الشّمالية" #. 474 msgid "Martinique" msgstr "مارتينيك" #. 478 msgid "Mauritania" msgstr "موريتانيا" #. 500 msgid "Montserrat" msgstr "مونتسيرات" #. 470 msgid "Malta" msgstr "مالطة" #. 480 msgid "Mauritius" msgstr "موريشيوس" #. 462 msgid "Maldives" msgstr "جزر المالديف" #. 454 msgid "Malawi" msgstr "مالاوي" #. 484 msgid "Mexico" msgstr "المكسيك" #. 458 msgid "Malaysia" msgstr "ماليزيا" #. 508 msgid "Mozambique" msgstr "الموزمبيق" #. 516 msgid "Namibia" msgstr "ناميبيا" #. 540 msgid "New Caledonia" msgstr "قلدونيا الجديدة" #. 562 msgid "Niger" msgstr "النّيجر" #. 574 msgid "Norfolk Island" msgstr "جزيرة نورفولك" #. 566 msgid "Nigeria" msgstr "نيجيريا" #. 558 msgid "Nicaragua" msgstr "نيكاراغوا" #. 528 msgid "Netherlands" msgstr "هولندا" #. 578 msgid "Norway" msgstr "النروج" #. 524 msgid "Nepal" msgstr "نيبال" #. 520 msgid "Nauru" msgstr "ناورو" #. 570 msgid "Niue" msgstr "نيوي" #. 554 msgid "New Zealand" msgstr "نيوزيلاندا" #. 512 msgid "Oman" msgstr "عُمان" #. 591 msgid "Panama" msgstr "باناما" #. 604 msgid "Peru" msgstr "البيرو" #. 258 msgid "French Polynesia" msgstr "بولينيزيا الفرنسية" #. 598 msgid "Papua New Guinea" msgstr "بابوا غينيا الجديدة" #. 608 msgid "Philippines" msgstr "الفلبّين" #. 586 msgid "Pakistan" msgstr "باكستان" #. 616 msgid "Poland" msgstr "بولونيا" #. 666 msgid "Saint Pierre and Miquelon" msgstr "سانت بيير وميكولون" #. 612 msgid "Pitcairn" msgstr "بتكايرن" #. 630 msgid "Puerto Rico" msgstr "بورتوريكو" #. 275 msgid "Palestinian Territory, Occupied" msgstr "فلسطين المحتلّة، الأراضي الفلسطينيّة المحتلّة" #. 620 msgid "Portugal" msgstr "البرتغال" #. 585 msgid "Palau" msgstr "بالاو" #. 600 msgid "Paraguay" msgstr "الباراغواي" #. 634 msgid "Qatar" msgstr "قطر" #. 638 msgid "Reunion" msgstr "ريونيون" #. 642 msgid "Romania" msgstr "رومانيا" #. 688 msgid "Serbia" msgstr "صربيا" #. 643 msgid "Russian Federation" msgstr "الإتّحاد الروسي" #. 646 msgid "Rwanda" msgstr "رواندا" #. 682 msgid "Saudi Arabia" msgstr "المملكة العربيّة السّعوديّة" #. 090 msgid "Solomon Islands" msgstr "جزر سليمان" #. 690 msgid "Seychelles" msgstr "السّيشل" #. 736 msgid "Sudan" msgstr "السودان" #. 752 msgid "Sweden" msgstr "السّويد" #. 702 msgid "Singapore" msgstr "سنغفورة" #. 654 msgid "Saint Helena" msgstr "سانت هيلينا" #. 705 msgid "Slovenia" msgstr "سلوفينيا" #. 744 msgid "Svalbard and Jan Mayen" msgstr "سفالبارد وجان مايان" #. 703 msgid "Slovakia" msgstr "سلوفاكيا" #. 694 msgid "Sierra Leone" msgstr "سيراليون" #. 674 msgid "San Marino" msgstr "سان مارينو" #. 686 msgid "Senegal" msgstr "السنيغال" #. 706 msgid "Somalia" msgstr "الصّومال" #. 740 msgid "Suriname" msgstr "سورينام" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "ساو تومي وبرينسيبي" #. 222 msgid "El Salvador" msgstr "السلفادور" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "الجمهوريّة العربيّة السّوريّة" #. 748 msgid "Swaziland" msgstr "السّوازيلاند" #. 796 msgid "Turks and Caicos Islands" msgstr "جزر تركس وكايكوس" #. 148 msgid "Chad" msgstr "التشاد" #. 260 msgid "French Southern Territories" msgstr "المقاطعات الجنوبية الفرنسية" #. 768 msgid "Togo" msgstr "توغو" #. 764 msgid "Thailand" msgstr "تايلندا" #. 762 msgid "Tajikistan" msgstr "طاجكستان" #. 772 msgid "Tokelau" msgstr "توكلو" #. 626 msgid "Timor-Leste" msgstr "تيمور الشرقية" #. 795 msgid "Turkmenistan" msgstr "تركمانستان" #. 788 msgid "Tunisia" msgstr "تونس" #. 776 msgid "Tonga" msgstr "تونجا" #. 792 msgid "Turkey" msgstr "تركيا" #. 780 msgid "Trinidad and Tobago" msgstr "ترينيداد وتوباغو" #. 798 msgid "Tuvalu" msgstr "توفالو" #. 158 msgid "Taiwan, Province of China" msgstr "تايوان، محافظة صينية" #. 834 msgid "Tanzania, United Republic of" msgstr "تنزانيا، جمهوريّة تنزانيا المتّحدة" #. 804 msgid "Ukraine" msgstr "أوكرانيا" #. 800 msgid "Uganda" msgstr "اوغندا" #. 581 msgid "United States Minor Outlying Islands" msgstr "جزر الولايات المتحدة البعيدة الصغيرة" #. 840 msgid "United States" msgstr "الولايات المتّحدة الأمريكية" #. 858 msgid "Uruguay" msgstr "الأوروغواي" #. 860 msgid "Uzbekistan" msgstr "أوزبكستان" #. 336 msgid "Holy See (Vatican City State)" msgstr "الكرسي الرسولي (دولة الفاتيكان)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "سانت فنسنت والجرينادينز" #. 862 msgid "Venezuela" msgstr "فنزويلا" #. 092 msgid "Virgin Islands, British" msgstr "جزر فيرجن البريطانية" #. 850 msgid "Virgin Islands, U.S." msgstr "جزر فيرجن ، الولايات المتحدة" #. 704 msgid "Viet Nam" msgstr "الفييتنام" #. 548 msgid "Vanuatu" msgstr "فانواتو" #. 876 msgid "Wallis and Futuna" msgstr "واليس و فوتونا" #. 882 msgid "Samoa" msgstr "ساموا" #. 887 msgid "Yemen" msgstr "اليمن" #. 175 msgid "Mayotte" msgstr "مايوت" #. 710 msgid "South Africa" msgstr "جنوب إفريقيا" #. 894 msgid "Zambia" msgstr "زامبيا" #. 716 msgid "Zimbabwe" msgstr "زيمبابوي" msgid "* Unknown, add is_in tags to those cities" msgstr "* غير معروف، أضف تسميات is_in إلى تلك المدن" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "النقطة على الخريطة" msgid "Car" msgstr "سيارة" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "الدولة" msgid "Postal" msgstr "بريدي" msgid "Town" msgstr "البلدة" msgid "District" msgstr "حي" msgid "Street" msgstr "الشارع" msgid "Number" msgstr "الرقم" msgid "Enter Destination" msgstr "أدخل الهدف" msgid "Zip Code" msgstr "الرمز البريدي" msgid "City" msgstr "المدينة" msgid "District/Township" msgstr "الحي/البلدة" msgid "Map" msgstr "الخريطة" msgid "Bookmark" msgstr "إشارة مرجعية" msgid "Destination" msgstr "الهدف" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "المظهار" msgid "_Route" msgstr "الطريق" msgid "_Former Destinations" msgstr "الأهداف السابقة" msgid "_Bookmarks" msgstr "إشارات مرجعية" msgid "_Map" msgstr "الخريطة" msgid "_Layout" msgstr "التصميم" msgid "_Projection" msgstr "الإسقاط" msgid "_Vehicle" msgstr "وسيلة التنقل" msgid "Zoom_Out" msgstr "صغّر الروئية" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "كبّر الروئية" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "إعادة الحساب" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "معلومات" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "قف الملاحة" msgid "Test" msgstr "اختبار" msgid "_Quit" msgstr "_إنهاء" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "إقفال على الطريق" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "سجل خريطة الطريق" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "تكبير/تصغير تلقائي" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "ملء الشاشة" msgid "Data" msgstr "المعطيات" msgid "N" msgstr "ش." msgid "NE" msgstr "ش. ش." msgid "E" msgstr "ش." msgid "SE" msgstr "ج. ش." msgid "S" msgstr "ج." msgid "SW" msgstr "ج. غ." msgid "W" msgstr "غ." msgid "NW" msgstr "ش. غ." #. Android resource: @strings/no msgid "No" msgstr "لا" msgid "2D" msgstr "ثنائي الأبعاد" msgid "3D" msgstr "ثلاثي الأبعاد" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fكلم %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "الطريك 0000كلم 0+00:00 ETA" msgid "Help" msgstr "المساعدة" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "أعرض في المتصفح" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "الشوارع" msgid "House numbers" msgstr "أرقام المنازل" msgid "View Attributes" msgstr "أعرض الصفات" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "مواقع ذات أهمية" msgid "View on map" msgstr "أعرض على الخريطة" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "إشارات مرجعية" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "علّم %s كإشارة مرجعية" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "أعرض حالة القمر الإسطناعي" msgid " Elevation " msgstr " الإرتفاع " msgid " Azimuth " msgstr " السمت " msgid "Show NMEA Data" msgstr "أعرض المعطيات NMEA" msgid "car" msgstr "سيارة" msgid "bike" msgstr "دراجة" msgid "pedestrian" msgstr "مشاة" #, c-format msgid "Current profile: %s" msgstr "التعريف الحالي: %s" #, c-format msgid "Change profile to: %s" msgstr "غيّر التعريف إلى: %s" msgid "Set as active" msgstr "عيّن كــفعلي" msgid "Show Satellite status" msgstr "أعرض حالة القمر الإسطناعي" msgid "Show NMEA data" msgstr "أعرض المعطيات NMEA" msgid "Add Bookmark" msgstr "أضف إشارة مرجعية" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "وسيلة التنقل" msgid "Rules" msgstr "القواعد" msgid "Lock on road" msgstr "إقفال على الطريق" msgid "Northing" msgstr "شمالي دائم" msgid "Map follows Vehicle" msgstr "الخريطة تتبع وسيلة التنقل" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "الخرائط" msgid "Layout" msgstr "التصميم" msgid "Height Profile" msgstr "لمحة عن الإرتفاع" msgid "Route Description" msgstr "وصف الطريق" msgid "Show Locale" msgstr "أعرض المحليات" msgid "Former Destinations" msgstr "الأهداف السابقة" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "الرسالة" msgid "Back" msgstr "السابق" msgid "Back to map" msgstr "إرجع إلى الخريطة" msgid "Main Menu" msgstr "اللائحة الرئيسية" msgid "House number" msgstr "رقم المنزل" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "موقع وسيلة التنقل" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "اللائحة الرئيسية" msgid "" "Show\n" "Map" msgstr "" "أعرض\n" "الخريطة" msgid "Settings" msgstr "الإعدادات" msgid "Tools" msgstr "العدة" msgid "Route" msgstr "الطريق" msgid "About" msgstr "" msgid "Actions" msgstr "أفعال" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "أخرج" msgid "" "Stop\n" "Navigation" msgstr "قفّ" msgid "Display" msgstr "المظهار" msgid "Fullscreen" msgstr "ملء الشاشة" msgid "Window Mode" msgstr "نمط النافذة" msgid "Description" msgstr "الوصف" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "خيل/فرس" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "بعد %s ، أدخل المسستديرة" #~ msgid "Cursor" #~ msgstr "المزلاق" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d كلم" navit-0.5.0~svn5643+dfsg.1/po/ast.po.in000066400000000000000000001101521221777731700173520ustar00rootroot00000000000000# Asturian translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # Xuacu Saturio 2010 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-21 17:35+0000\n" "Last-Translator: Xuacu Saturio \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ast\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando dende'l direutoriu fonte.\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Conseñando '%s' como '%s'.\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "cero-ésimu" msgid "first" msgstr "primeru" msgid "second" msgstr "segundu" msgid "third" msgstr "terceru" msgid "fourth" msgstr "cuartu" msgid "fifth" msgstr "quintu" msgid "sixth" msgstr "sestu" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "cero-ésima salida" msgid "first exit" msgstr "primera salida" msgid "second exit" msgstr "segunda salida" msgid "third exit" msgstr "tercera salida" msgid "fourth exit" msgstr "cuarta salida" msgid "fifth exit" msgstr "quinta salida" msgid "sixth exit" msgstr "sesta salida" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "en %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "en %d metros" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d quilómetros" #, c-format msgid "in %d.%d kilometers" msgstr "en %d,%d quilómetros" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un quilómetru" msgstr[1] "%d quilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "nun quilómetru" msgstr[1] "en %d quilómetros" msgid "exit" msgstr "salida" msgid "into the ramp" msgstr "pal enllaz" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s pa la cai %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s pal %s%s%s|male form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s pa la %s%s%s|female form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s pal %s%s%s|neutral form" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s pa la %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "drecha" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "izquierda" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "selemente " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "enforma " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "dafechu " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "desconocío " msgid "When possible, please turn around" msgstr "Cuando seya posible, de la vuelta" msgid "Enter the roundabout soon" msgstr "Entre ceo na rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "llueu dexe la rotonda pola %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Dexe la rotonda pola %s" #, c-format msgid "Follow the road for the next %s" msgstr "Siga pela carretera los siguientes %s" msgid "soon" msgstr "aína" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tome la carretera %1$s dica %2$s" #, c-format msgid "after %i roads" msgstr "tres %i carreteres" msgid "now" msgstr "agora" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "llueu tome la carretera %1$s dica %2$s" msgid "error" msgstr "error" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Xire %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "llueu xire %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Llegó al destín %s" msgid "then you have reached your destination." msgstr "entós llegará al destín." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posición" msgid "Command" msgstr "Comandu" msgid "Length" msgstr "Llonxitú" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tiempu" msgid "Destination Length" msgstr "Distancia del destín" msgid "Destination Time" msgstr "Tiempu a destín" msgid "Roadbook" msgstr "Llibru de ruta" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Conseñar como posición" msgid "Set as destination" msgstr "Conseñar como destín" msgid "Add as bookmark" msgstr "Amestar marcador" #, c-format msgid "Point 0x%x 0x%x" msgstr "Puntu 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coord. pantalla : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afganistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua y Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Holandeses" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Islles Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaiyán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolomé" #. 060 msgid "Bermuda" msgstr "Bermudas" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhután" #. 074 msgid "Bouvet Island" msgstr "Islla Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorrusia" #. 084 msgid "Belize" msgstr "Belice" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Islles Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democrática del" #. 140 msgid "Central African Republic" msgstr "República Centroafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suiza" #. 384 msgid "Cote d'Ivoire" msgstr "Costa de Marfil" #. 184 msgid "Cook Islands" msgstr "Islles Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerún" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Islla Christmas" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemania" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Argelia" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Exiptu" #. 732 msgid "Western Sahara" msgstr "Sáhara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "España" #. 231 msgid "Ethiopia" msgstr "Etiopía" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiyi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Islles Falkland (Malvines)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Estaos Federaos de" #. 234 msgid "Faroe Islands" msgstr "Islles Feroe" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "Gabón" #. 826 msgid "United Kingdom" msgstr "Reinu Xuníu" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Xeorxia" #. 254 msgid "French Guiana" msgstr "Guyana Francesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Xibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Ecuatorial" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Islles Georgia del Sur y Sandwich del sur" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Islla Heard ya Islles McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croacia" #. 332 msgid "Haiti" msgstr "Haití" #. 348 msgid "Hungary" msgstr "Hungría" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Islla de Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territoriu Oceánicu de la India Británica" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán, República Islámica de" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Xordania" #. 392 msgid "Japan" msgstr "Xapón" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirguistán" #. 116 msgid "Cambodia" msgstr "Camboya" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts y Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, República Popular Democrática de" #. 410 msgid "Korea, Republic of" msgstr "Corea, República de" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Islles Caimán" #. 398 msgid "Kazakhstan" msgstr "Kazakhstán" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, República Popular Democrática de" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Llucía" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Jamahiriya Árabe Libia" #. 504 msgid "Morocco" msgstr "Marruecos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, República de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Parte Francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Islles Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, antigua República Yugoslava de" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Islles Marianes del Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricio" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nueva Caledonia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Islla Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Holanda" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nueva Zelanda" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinesia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papúa Nueva Guinea" #. 608 msgid "Philippines" msgstr "Filipines" #. 586 msgid "Pakistan" msgstr "Paquistán" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre y Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina, Territoriu Ocupáu" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunión" #. 642 msgid "Romania" msgstr "Rumanía" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federación Rusa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudí" #. 090 msgid "Solomon Islands" msgstr "Islles Sólomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Suecia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard y Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovaquia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leona" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Santo Tomé y Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe de Siria" #. 748 msgid "Swaziland" msgstr "Suazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Islles Caicos y Turks" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "Territorios Franceses del Sur" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Tayikistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Oriental" #. 795 msgid "Turkmenistan" msgstr "Turkmenistán" #. 788 msgid "Tunisia" msgstr "Túnez" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquía" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad y Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Provincia de China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, República Xunía de" #. 804 msgid "Ukraine" msgstr "Ucrania" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Islles Perifériques Menores d'Estaos Xuníos" #. 840 msgid "United States" msgstr "Estaos Xuníos" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbequistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Ciudá Estáu del Vaticanu)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente y les Granadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Islles Vírxenes, Britániques" #. 850 msgid "Virgin Islands, U.S." msgstr "Islles Vírxenes, EE.XX." #. 704 msgid "Viet Nam" msgstr "Viet Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis y Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sudáfrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabue" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconocíes, amestar etiquetes is_in a eses ciudaes" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Puntu del mapa" msgid "Car" msgstr "Coche" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Ciudá" msgid "District" msgstr "Distritu" msgid "Street" msgstr "Cai" msgid "Number" msgstr "Númberu" msgid "Enter Destination" msgstr "Escribir destín" msgid "Zip Code" msgstr "Códigu postal" msgid "City" msgstr "Ciudá" msgid "District/Township" msgstr "Distritu/Barriu" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destín" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Amosar" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Destinos anteriores" msgid "_Bookmarks" msgstr "Marcadores" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Disposición" msgid "_Projection" msgstr "Proyeición" msgid "_Vehicle" msgstr "Vehiculu" msgid "Zoom_Out" msgstr "Amenorgar" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Aumentar" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalcular" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Parar navegación" msgid "Test" msgstr "Probar" msgid "_Quit" msgstr "_Colar" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Arcoxar carretera" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Llibru de ruta" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Pantalla completa" msgid "Data" msgstr "Datos" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d TED" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 TED" msgid "Help" msgstr "Aida" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ver nel navegador" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Cais" msgid "House numbers" msgstr "Númberos de portal" msgid "View Attributes" msgstr "Ver atributos" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "PDIs" msgid "View on map" msgstr "Ver nel mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cortar marcador" msgid "Copy Bookmark" msgstr "Copiar marcador" msgid "Rename Bookmark" msgstr "Renomar marcador" msgid "Paste Bookmark" msgstr "Apegar marcador" msgid "Delete Bookmark" msgstr "Desaniciar marcador" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Marcadores" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Amestar carpeta de marcadores" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Apegar marcador" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Amosar estáu de satélite" msgid " Elevation " msgstr " Altor " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Amosar datos NMEA" msgid "car" msgstr "coche" msgid "bike" msgstr "bici" msgid "pedestrian" msgstr "peatón" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Camudar perfil a: %s" msgid "Set as active" msgstr "Conseñar como activo" msgid "Show Satellite status" msgstr "Amosar estáu de satélite" msgid "Show NMEA data" msgstr "Amosar datos NMEA" msgid "Add Bookmark" msgstr "Amestar marcador" msgid "Rename" msgstr "Renomar" msgid "About Navit" msgstr "Tocante a Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "Y tou l'equipu de Navit" msgid "members and contributors." msgstr "miembros y collaboradores." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehiculu" msgid "Rules" msgstr "Regles" msgid "Lock on road" msgstr "Arcoxar a carretera" msgid "Northing" msgstr "Llatitú" msgid "Map follows Vehicle" msgstr "El mapa sigue al vehículu" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapes" msgid "Layout" msgstr "Disposición" msgid "Height Profile" msgstr "Perfil d'altures" msgid "Route Description" msgstr "Descripción de ruta" msgid "Show Locale" msgstr "Amosar local" msgid "Former Destinations" msgstr "Destinos anteriores" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mensax" msgid "Back" msgstr "Atrás" msgid "Back to map" msgstr "Tornar al mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Númberu de portal" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posición del vehículu" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menú principal" msgid "" "Show\n" "Map" msgstr "" "Ver\n" "Mapa" msgid "Settings" msgstr "Axustes" msgid "Tools" msgstr "Ferramientes" msgid "Route" msgstr "Ruta" msgid "About" msgstr "Tocante a" msgid "Actions" msgstr "Aiciones" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Colar" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegación" msgid "Display" msgstr "Amosar" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Mou ventana" msgid "Description" msgstr "Descripción" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "caballu" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "En %s, entre na rotonda" #~ msgid "Cursor" #~ msgstr "Cursor" navit-0.5.0~svn5643+dfsg.1/po/bg.po.in000066400000000000000000001161741221777731700171650ustar00rootroot00000000000000# Bulgarian translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # MalamiR 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 20:36+0000\n" "Last-Translator: Alex Stanev \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулев" msgid "first" msgstr "първи" msgid "second" msgstr "втори" msgid "third" msgstr "трети" msgid "fourth" msgstr "четвърти" msgid "fifth" msgstr "пети" msgid "sixth" msgstr "шести" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "няма изход" msgid "first exit" msgstr "първия изход" msgid "second exit" msgstr "втория изход" msgid "third exit" msgstr "третия изход" msgid "fourth exit" msgstr "четвъртия изход" msgid "fifth exit" msgstr "петия изход" msgid "sixth exit" msgstr "шестия изход" #, c-format msgid "%d m" msgstr "%d м" #, c-format msgid "in %d m" msgstr "след %d м" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d метра" #, c-format msgid "in %d meters" msgstr "след %d метра" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "след %d.%d километра" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "един километър" msgstr[1] "%d километра" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "след един километър" msgstr[1] "след %d километра" msgid "exit" msgstr "изход" msgid "into the ramp" msgstr "на рампата" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "надясно" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "наляво" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "леко " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "силно " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "Когато е възможно обърнете" msgid "Enter the roundabout soon" msgstr "Скоро навлизате в кръгово" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "след това излезте от кръговото на %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Излезте от кръговото на %s" #, c-format msgid "Follow the road for the next %s" msgstr "Следвайте пътя през следващите %s" msgid "soon" msgstr "скоро" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "след %i пресечки" msgid "now" msgstr "сега" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "тогава хванете пътя %1$s към %2$s" msgid "error" msgstr "грешка" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Завийте %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "тогава завийте %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Достигнахте до целта %s" msgid "then you have reached your destination." msgstr "след това пристигате на местоназначението" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиция" msgid "Command" msgstr "Команда" msgid "Length" msgstr "Дължина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Време" msgid "Destination Length" msgstr "Разстояние до целта" msgid "Destination Time" msgstr "Време до целта" msgid "Roadbook" msgstr "Пътна книга" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Установете като позиция" msgid "Set as destination" msgstr "Задай като цел" msgid "Add as bookmark" msgstr "Добави като Отметка" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Координати на екрана: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Обединени Арабски Емирства" #. 004 msgid "Afghanistan" msgstr "Афганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигуа и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангуила" #. 008 msgid "Albania" msgstr "Албания" #. 051 msgid "Armenia" msgstr "Армения" #. 530 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аржентина" #. 016 msgid "American Samoa" msgstr "Американска Самоа" #. 040 msgid "Austria" msgstr "Австрия" #. 036 msgid "Australia" msgstr "Австралия" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Айландски Острови" #. 031 msgid "Azerbaijan" msgstr "Азърбайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Белгия" #. 854 msgid "Burkina Faso" msgstr "Буркина Фасо" #. 100 msgid "Bulgaria" msgstr "България" #. 048 msgid "Bahrain" msgstr "Бахрейн" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Сен Бартелми" #. 060 msgid "Bermuda" msgstr "Бермудски острови" #. 096 msgid "Brunei Darussalam" msgstr "Бруней" #. 068 msgid "Bolivia" msgstr "Боливия" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразилия" #. 044 msgid "Bahamas" msgstr "Бахамски острови" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Остров Буве" #. 072 msgid "Botswana" msgstr "Ботсвана" #. 112 msgid "Belarus" msgstr "Беларус" #. 084 msgid "Belize" msgstr "Белийз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосови Острови" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Демократична Република Конго" #. 140 msgid "Central African Republic" msgstr "Централна Африканска Република" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швейцария" #. 384 msgid "Cote d'Ivoire" msgstr "Кот Д'Ивоар" #. 184 msgid "Cook Islands" msgstr "Острови Кук" #. 152 msgid "Chile" msgstr "Чили" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Китай" #. 170 msgid "Colombia" msgstr "Колумбия" #. 188 msgid "Costa Rica" msgstr "Коста Рика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кейп Верде" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Коледни острови" #. 196 msgid "Cyprus" msgstr "Кипър" #. 203 msgid "Czech Republic" msgstr "Чешка република" #. 276 msgid "Germany" msgstr "Германия" #. 262 msgid "Djibouti" msgstr "Джибути" #. 208 msgid "Denmark" msgstr "Дания" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканска Република" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естония" #. 818 msgid "Egypt" msgstr "Египет" #. 732 msgid "Western Sahara" msgstr "Западна Сахара" #. 232 msgid "Eritrea" msgstr "Еритрея" #. 724 msgid "Spain" msgstr "Испания" #. 231 msgid "Ethiopia" msgstr "Етиопия" #. 246 msgid "Finland" msgstr "Финландия" #. 242 msgid "Fiji" msgstr "Фиджи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендски Острови (Малвини)" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронезия, Обединени щати" #. 234 msgid "Faroe Islands" msgstr "Острови Фаро" #. 250 msgid "France" msgstr "Франция" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Обединеното Кралство" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузия" #. 254 msgid "French Guiana" msgstr "Френска Гвиана" #. 831 msgid "Guernsey" msgstr "Гърнси" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренландия" #. 270 msgid "Gambia" msgstr "Гамбия" #. 324 msgid "Guinea" msgstr "Гвинея" #. 312 msgid "Guadeloupe" msgstr "Гваделупа" #. 226 msgid "Equatorial Guinea" msgstr "Екваториална Гвинея" #. 300 msgid "Greece" msgstr "Гърция" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Южна Джорджия и Южни Сандвичеви острови" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинея-Бисау" #. 328 msgid "Guyana" msgstr "Гаяна" #. 344 msgid "Hong Kong" msgstr "Хонг Конг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Острови Хърд и МакДоналд" #. 340 msgid "Honduras" msgstr "Хондурас" #. 191 msgid "Croatia" msgstr "Хърватска" #. 332 msgid "Haiti" msgstr "Хаити" #. 348 msgid "Hungary" msgstr "Унгария" #. 360 msgid "Indonesia" msgstr "Индонезия" #. 372 msgid "Ireland" msgstr "Ирландия" #. 376 msgid "Israel" msgstr "Израел" #. 833 msgid "Isle of Man" msgstr "Остров Ман" #. 356 msgid "India" msgstr "Индия" #. 086 msgid "British Indian Ocean Territory" msgstr "Британска територия в Индийския океан" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Ислямска република" #. 352 msgid "Iceland" msgstr "Исландия" #. 380 msgid "Italy" msgstr "Италия" #. 832 msgid "Jersey" msgstr "Джърси (остров)" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Йордания" #. 392 msgid "Japan" msgstr "Япония" #. 404 msgid "Kenya" msgstr "Кения" #. 417 msgid "Kyrgyzstan" msgstr "Киргизстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Комори" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сейнт Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Корея, Демократична народна република" #. 410 msgid "Korea, Republic of" msgstr "Корея, Република" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Кайманови острови" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаоска народнодемократична република" #. 422 msgid "Lebanon" msgstr "Ливан" #. 662 msgid "Saint Lucia" msgstr "Сейнт Лусия" #. 438 msgid "Liechtenstein" msgstr "Лихтенщайн" #. 144 msgid "Sri Lanka" msgstr "Шри Ланка" #. 430 msgid "Liberia" msgstr "Либерия" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвия" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Либийска Арабска Джамахирия" #. 504 msgid "Morocco" msgstr "Мароко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдова, Република" #. 499 msgid "Montenegro" msgstr "Черна гора" #. 663 msgid "Saint Martin (French part)" msgstr "Свети Мартин (френска част)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалови острови" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македония, Бивша Югославска Република" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мианмарският съюз" #. 496 msgid "Mongolia" msgstr "Монголия" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Северни Мариански острови" #. 474 msgid "Martinique" msgstr "Мартиника" #. 478 msgid "Mauritania" msgstr "Мавритания" #. 500 msgid "Montserrat" msgstr "Монсерат" #. 470 msgid "Malta" msgstr "Малта" #. 480 msgid "Mauritius" msgstr "Мавриций" #. 462 msgid "Maldives" msgstr "Малдивски острови" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексико" #. 458 msgid "Malaysia" msgstr "Малайзия" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибия" #. 540 msgid "New Caledonia" msgstr "Нова Каледония" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Остров Норфолк" #. 566 msgid "Nigeria" msgstr "Нигерия" #. 558 msgid "Nicaragua" msgstr "Никарагуа" #. 528 msgid "Netherlands" msgstr "Кралство Холандия" #. 578 msgid "Norway" msgstr "Кралство Норвегия" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ниуе" #. 554 msgid "New Zealand" msgstr "Нова Зеландия" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Френска Полинезия" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинея" #. 608 msgid "Philippines" msgstr "Филипини" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Полша" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Свети Пиер и Микелон" #. 612 msgid "Pitcairn" msgstr "Острови Питкерн" #. 630 msgid "Puerto Rico" msgstr "Пуерто Рико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестинска територия, Окупирана" #. 620 msgid "Portugal" msgstr "Португалия" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реюнион" #. 642 msgid "Romania" msgstr "Румъния" #. 688 msgid "Serbia" msgstr "Сърбия" #. 643 msgid "Russian Federation" msgstr "Руска Федерация" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудитска Арабия" #. 090 msgid "Solomon Islands" msgstr "Соломонови острови" #. 690 msgid "Seychelles" msgstr "Сейшелски о-ви" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швеция" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Света Елена" #. 705 msgid "Slovenia" msgstr "Словения" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Шпицберген и Ян Майен" #. 703 msgid "Slovakia" msgstr "Словакия" #. 694 msgid "Sierra Leone" msgstr "Сиера Леоне" #. 674 msgid "San Marino" msgstr "Сан Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалия" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принсипи" #. 222 msgid "El Salvador" msgstr "Ел Салвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сирийска Арабска Република" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Острови Тюрк и Кайкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Френски Южни Територии" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Тайланд" #. 762 msgid "Tajikistan" msgstr "Таджикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Източен Тимор" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турция" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тайван, Китайска провинция" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзания, Обединена република" #. 804 msgid "Ukraine" msgstr "Украйна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Малки далечни острови на САЩ" #. 840 msgid "United States" msgstr "Съединени Амеркански Щати" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватикана" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сейнт Винсънт и Гренадини" #. 862 msgid "Venezuela" msgstr "Венецуела" #. 092 msgid "Virgin Islands, British" msgstr "Британски Вирджински острови" #. 850 msgid "Virgin Islands, U.S." msgstr "Американски Вирджински острови" #. 704 msgid "Viet Nam" msgstr "Виетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Уолис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Йемен" #. 175 msgid "Mayotte" msgstr "Майот" #. 710 msgid "South Africa" msgstr "Република Южна Африка" #. 894 msgid "Zambia" msgstr "Замбия" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карта" msgid "Car" msgstr "Автомобил" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "Държава" msgid "Postal" msgstr "Пощенски" msgid "Town" msgstr "Град" msgid "District" msgstr "Окръг" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Номер" msgid "Enter Destination" msgstr "Въведете мостоназначение" msgid "Zip Code" msgstr "Пощенски код" msgid "City" msgstr "Град" msgid "District/Township" msgstr "Община" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Отметка" msgid "Destination" msgstr "Местоназначение" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Показване" msgid "_Route" msgstr "Маршрут" msgid "_Former Destinations" msgstr "Предишни Местоназначения" msgid "_Bookmarks" msgstr "Отметки" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Изглед" msgid "_Projection" msgstr "Проекция" msgid "_Vehicle" msgstr "Превозно средство" msgid "Zoom_Out" msgstr "Отдалечи" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Приближи" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Преизчисляване" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Информация" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Спри Навигацията" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Изход" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Придържай към пътя" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Пътна книга" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Цял екран" msgid "Data" msgstr "Данни" msgid "N" msgstr "С" msgid "NE" msgstr "СИ" msgid "E" msgstr "И" msgid "SE" msgstr "ЮИ" msgid "S" msgstr "Ю" msgid "SW" msgstr "ЮЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Помощ" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Виж в Браузър" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улици" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "Виж Атрибутите" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "Виж на картата" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Отметки" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Отметка %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Покажи Състояние на Сателити" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Покажи NMEA Данни" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "Укажи като активен" msgid "Show Satellite status" msgstr "Покажи състояние на Сателити" msgid "Show NMEA data" msgstr "Покажи NMEA Данни" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Превозно средство" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "Картата следва Автомобила" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Карти" msgid "Layout" msgstr "Изглед" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Предишни Местоназначения" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Обратно към картата" msgid "Main Menu" msgstr "Основно меню" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Позиция на автомобил" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Главно меню" msgid "" "Show\n" "Map" msgstr "" "Покажи\n" "Картата" msgid "Settings" msgstr "Настройки" msgid "Tools" msgstr "Инструменти" msgid "Route" msgstr "Маршрут" msgid "About" msgstr "" msgid "Actions" msgstr "Действия" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Излез" msgid "" "Stop\n" "Navigation" msgstr "" "Спри\n" "Навигацията" msgid "Display" msgstr "Показване" msgid "Fullscreen" msgstr "Цял екран" msgid "Window Mode" msgstr "Режим Прозорец" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "След %s влезте в кръговото" #~ msgid "Cursor" #~ msgstr "Курсор" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d километра" navit-0.5.0~svn5643+dfsg.1/po/ca.po.in000066400000000000000000001040421221777731700171470ustar00rootroot00000000000000# Catalan translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # peremayol@gmail.com, 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 09:31+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "S'està executant des del directori arrel\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "s'està establint '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "primera" msgid "second" msgstr "segona" msgid "third" msgstr "tercera" msgid "fourth" msgstr "quarta" msgid "fifth" msgstr "cinquena" msgid "sixth" msgstr "sisena" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "primera sortida" msgid "second exit" msgstr "segona sortida" msgid "third exit" msgstr "tercera sortida" msgid "fourth exit" msgstr "quarta sortida" msgid "fifth exit" msgstr "cinquena sortida" msgid "sixth exit" msgstr "sisena sortida" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "d'aquí a %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metres" #, c-format msgid "in %d meters" msgstr "d'aquí a %d metres" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d quilòmetres" #, c-format msgid "in %d.%d kilometers" msgstr "d'aquí a %d,%d quilòmetres" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un quilòmetre" msgstr[1] "%d quilòmetres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "d'aquí a un quilòmetre" msgstr[1] "d'aquí a %d quilòmetres" msgid "exit" msgstr "surt" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s al carrer %s %s %s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "dreta" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "esquerra" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "fàcilment " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "fortament " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "realment fort " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "desconegut " msgid "When possible, please turn around" msgstr "Quan sigui possible, doneu mitja volta" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "aleshores deixeu la rotonda a la %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Deixeu la rotonda a la %s" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "ara" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "després, agafeu la %1$s carretera a la %2$s" msgid "error" msgstr "error" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "Heu arribat a la destinació %s" msgid "then you have reached your destination." msgstr "aleshores heu arribat a destí" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posició" msgid "Command" msgstr "Ordre" msgid "Length" msgstr "Durada" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Temps" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Unió dels Emirats Àrabs" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "Albània" #. 051 msgid "Armenia" msgstr "Armènia" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Holandeses" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antàrtida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Àustria" #. 036 msgid "Australia" msgstr "Austràlia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Illes Aland" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bòsnia i Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bèlgica" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "Bulgària" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "Illes Bermudes" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorússia" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "Canadà" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democràtica del" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suïssa" #. 384 msgid "Cote d'Ivoire" msgstr "Costa d'Ivori" #. 184 msgid "Cook Islands" msgstr "Illes Cook" #. 152 msgid "Chile" msgstr "Xile" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "Xina" #. 170 msgid "Colombia" msgstr "Colòmbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cap Verd" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "Xipre" #. 203 msgid "Czech Republic" msgstr "República Txeca" #. 276 msgid "Germany" msgstr "Alemanya" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Algèria" #. 218 msgid "Ecuador" msgstr "Equador" #. 233 msgid "Estonia" msgstr "Estònia" #. 818 msgid "Egypt" msgstr "Egipte" #. 732 msgid "Western Sahara" msgstr "Sàhara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Espanya" #. 231 msgid "Ethiopia" msgstr "Etiòpia" #. 246 msgid "Finland" msgstr "Finlàndia" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronèsia, Estats Federats de" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "França" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "Regne Unit" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "Geòrgia" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "Gàmbia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Equatorial" #. 300 msgid "Greece" msgstr "Grècia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Illa Heard i Illes McDonald" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "Croàcia" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "Hongria" #. 360 msgid "Indonesia" msgstr "Indonèsia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Illa de Man" #. 356 msgid "India" msgstr "Índia" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "Islàndia" #. 380 msgid "Italy" msgstr "Itàlia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "Jamàica" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "Japó" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libèria" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "Lituània" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "Marroc" #. 492 msgid "Monaco" msgstr "Mònaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldàvia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "Mongòlia" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "Mauritània" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mèxic" #. 458 msgid "Malaysia" msgstr "Malàisia" #. 508 msgid "Mozambique" msgstr "Moçambic" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nova Caledònia" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "Nigèria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "Nova Zelanda" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "Panamà" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "Polònia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre i Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Sèrbia" #. 643 msgid "Russian Federation" msgstr "Rússia" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suècia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "Eslovènia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovàquia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somàlia" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Síria" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "Txad" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailàndia" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "Timor Oriental" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquia" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzània" #. 804 msgid "Ukraine" msgstr "Ucraïna" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "Estats Units d'Amèrica" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ciutat del Vaticà" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i les Grenadines" #. 862 msgid "Venezuela" msgstr "Veneçuela" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "Zàmbia" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconegut, afegiu etiquetes is_in a aquestes ciutats" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punt del mapa" msgid "Car" msgstr "Cotxe" msgid "Iso2" msgstr "iso2" msgid "Iso3" msgstr "iso3" msgid "Country" msgstr "Estat" msgid "Postal" msgstr "Codi postal" msgid "Town" msgstr "Població" msgid "District" msgstr "Districte" msgid "Street" msgstr "Adreça" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introduïu una destinació" msgid "Zip Code" msgstr "Codi postal" msgid "City" msgstr "Ciutat" msgid "District/Township" msgstr "" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "Destinació" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Pantalla" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Destinacions anteriors" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Disposició" msgid "_Projection" msgstr "Projecció" msgid "_Vehicle" msgstr "Vehicle" msgid "Zoom_Out" msgstr "Allunya" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Apropa" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalcula" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informació" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Atura la navegació" msgid "Test" msgstr "Prova" msgid "_Quit" msgstr "_Surt" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Zoom automàtic" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Pantalla completa" msgid "Data" msgstr "Dades" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Ajuda" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Visualitza al navegador" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Carrers" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "Visualitza els atributs" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Punts d'interès" msgid "View on map" msgstr "Visualitza al mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Afegeix %s a les adreces d'interès" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Mostra l'estat del satèl·lit" msgid " Elevation " msgstr " Elevació " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Mostra les dades NMEA" msgid "car" msgstr "cotxe" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "vianant" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Canvia el perfil a: %s" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "Mostra l'estat del satèl·lit" msgid "Show NMEA data" msgstr "Mostra les dades NMEA" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Regles" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "El mapa segueix el vehicle" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapes" msgid "Layout" msgstr "Disposició" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "Descripció de la ruta" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Destinacions anteriors" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Missatge" msgid "Back" msgstr "Enrere" msgid "Back to map" msgstr "Torna al mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Número de casa/portal" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posició del vehicle" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menú principal" msgid "" "Show\n" "Map" msgstr "" "Mostra\n" "Mapa" msgid "Settings" msgstr "Configuració" msgid "Tools" msgstr "Eines" msgid "Route" msgstr "Ruta" msgid "About" msgstr "" msgid "Actions" msgstr "Accions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Surt" msgid "" "Stop\n" "Navigation" msgstr "" "Atura la\n" "Navegació" msgid "Display" msgstr "Pantalla" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Mode de la finestra" msgid "Description" msgstr "Descripció" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cavall" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Cursor" #~ msgstr "Cursor" navit-0.5.0~svn5643+dfsg.1/po/cs.po.in000066400000000000000000001213121221777731700171700ustar00rootroot00000000000000# translation of navit_cs.po to Čeština # Copyright (C) 2007, 2008 The Navit Team # This file is distributed under the same license as the navit package. # Vaclav Cerny , 2007. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-29 00:13+0400\n" "PO-Revision-Date: 2013-08-30 08:53+0100\n" "Last-Translator: lenochod \n" "Language-Team: Čeština\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Poedit 1.5.7\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Běží ze zdrojového adresáře\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nastavuji '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nultý" msgid "first" msgstr "první" msgid "second" msgstr "druhý" msgid "third" msgstr "třetí" msgid "fourth" msgstr "čtvrtý" msgid "fifth" msgstr "pátý" msgid "sixth" msgstr "šestý" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nultý exit" msgid "first exit" msgstr "první exit" msgid "second exit" msgstr "druhý exit" msgid "third exit" msgstr "třetí exit" msgid "fourth exit" msgstr "čtvrtý exit" msgid "fifth exit" msgstr "pátý exit" msgid "sixth exit" msgstr "šestý exit" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "za %d m" #, c-format msgid "%d feet" msgstr "%d stop" #, c-format msgid "in %d feet" msgstr "za %d stop" #, c-format msgid "%d meters" msgstr "%d metrů" #, c-format msgid "in %d meters" msgstr "za %d metrů" #, c-format msgid "%d.%d miles" msgstr "%d.%d mílí" #, c-format msgid "in %d.%d miles" msgstr "za %d.%d mílí" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrů" #, c-format msgid "in %d.%d kilometers" msgstr "za %d.%d kilometrů" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d míle" msgstr[1] "%d míle" msgstr[2] "%d mílí" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "za %d míli" msgstr[1] "za %d míle" msgstr[2] "za %d mílí" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometr" msgstr[1] "%d kilometry" msgstr[2] "%d kilometrů" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "za %d kilometr" msgstr[1] "za %d kilometry" msgstr[2] "za %d kilometrů" msgid "exit" msgstr "konec" msgid "into the ramp" msgstr "na přivadeč" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s do ulice %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s o%s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s do %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s do %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "vpravo" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "vlevo" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "mírně " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "silně " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "opravdu silně " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "neurčitě " msgid "When possible, please turn around" msgstr "Až to bude možné, otočte se" msgid "Enter the roundabout soon" msgstr "Brzy najeďte na kruhový objezd" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Najeďte na kruhový objezd %s" #, c-format msgid "then leave the roundabout at the %s" msgstr "pak opusťte kruhový objezd na výjezdu %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Opusťte kruhový objezd na výjezdu %s" #, c-format msgid "Follow the road for the next %s" msgstr "Pokračujte po další %s" msgid "soon" msgstr "brzy" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Jeďte na %1$s silnici %2$s" #, c-format msgid "after %i roads" msgstr "za %i silnice" msgid "now" msgstr "nyní" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "pak jeďte %1$s silnici %2$s" msgid "error" msgstr "chyba" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Zabočte %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "pak odbočte %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "%s dorazíte do cíle" msgid "then you have reached your destination." msgstr "pak budete v cíli." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Poloha" msgid "Command" msgstr "Příkaz" msgid "Length" msgstr "Délka" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Čas" msgid "Destination Length" msgstr "Cílová vzdálenost" msgid "Destination Time" msgstr "Cílový čas" msgid "Roadbook" msgstr "Itinerář" #, c-format msgid "Waypoint %d" msgstr "Bod trasy %d" msgid "Visit before..." msgstr "Navštívit nejdříve..." msgid "Set as position" msgstr "Použít jako pozici" msgid "Set as destination" msgstr "Nastavit jako cíl" msgid "Add as bookmark" msgstr "Použít jako záložku" #, c-format msgid "Point 0x%x 0x%x" msgstr "Bod 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Souřadnice obrazovky: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Spojené arabské emiráty" #. 004 msgid "Afghanistan" msgstr "Afghánistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua a Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albánie" #. 051 msgid "Armenia" msgstr "Arménie" #. 530 msgid "Netherlands Antilles" msgstr "Nizozemské Antily" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Americká Samoa" #. 040 msgid "Austria" msgstr "Rakousko" #. 036 msgid "Australia" msgstr "Austrálie" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ålandy" #. 031 msgid "Azerbaijan" msgstr "Ázerbájdžán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna a Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladéš" #. 056 msgid "Belgium" msgstr "Belgie" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulharsko" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Svatý Bartoloměj" #. 060 msgid "Bermuda" msgstr "Bermudy" #. 096 msgid "Brunei Darussalam" msgstr "Brunej" #. 068 msgid "Bolivia" msgstr "Bolívie" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Svatý Eustach a Saba" #. 076 msgid "Brazil" msgstr "Brazílie" #. 044 msgid "Bahamas" msgstr "Bahamy" #. 064 msgid "Bhutan" msgstr "Bhútán" #. 074 msgid "Bouvet Island" msgstr "Bouvetův ostrov" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bělorusko" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosové (Keelingovy) ostrovy" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, demokratická republika" #. 140 msgid "Central African Republic" msgstr "Středoafrická republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švýcarsko" #. 384 msgid "Cote d'Ivoire" msgstr "Pobřeží slonoviny" #. 184 msgid "Cook Islands" msgstr "Cookovy ostrovy" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Čína" #. 170 msgid "Colombia" msgstr "Kolumbie" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapverdy" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Vánoční ostrov" #. 196 msgid "Cyprus" msgstr "Kypr" #. 203 msgid "Czech Republic" msgstr "Česká republika" #. 276 msgid "Germany" msgstr "Německo" #. 262 msgid "Djibouti" msgstr "Džibutsko" #. 208 msgid "Denmark" msgstr "Dánsko" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikánská republika" #. 012 msgid "Algeria" msgstr "Alžírsko" #. 218 msgid "Ecuador" msgstr "Ekvádor" #. 233 msgid "Estonia" msgstr "Estonsko" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Západní Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Španělsko" #. 231 msgid "Ethiopia" msgstr "Etiopie" #. 246 msgid "Finland" msgstr "Finsko" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandy (Malvíny)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronésie, federativní státy" #. 234 msgid "Faroe Islands" msgstr "Faerské ostrovy" #. 250 msgid "France" msgstr "Francie" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Spojené království" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzie" #. 254 msgid "French Guiana" msgstr "Francouzská Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grónsko" #. 270 msgid "Gambia" msgstr "Gambie" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Rovníková Guinea" #. 300 msgid "Greece" msgstr "Řecko" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Jižní Georgie a Jižní Sandwichovy ostrovy" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hongkong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardův a McDonaldovy ostrovy" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Chorvatsko" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Maďarsko" #. 360 msgid "Indonesia" msgstr "Indonésie" #. 372 msgid "Ireland" msgstr "Irsko" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Ostrov Man" #. 356 msgid "India" msgstr "Indie" #. 086 msgid "British Indian Ocean Territory" msgstr "Britské indickooceánské území" #. 368 msgid "Iraq" msgstr "Irák" #. 364 msgid "Iran, Islamic Republic of" msgstr "Írán, islámská republika" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Itálie" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordánsko" #. 392 msgid "Japan" msgstr "Japonsko" #. 404 msgid "Kenya" msgstr "Keňa" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstán" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komory" #. 659 msgid "Saint Kitts and Nevis" msgstr "Svatý Kryštof a Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korejská lidově demokratická republika" #. 410 msgid "Korea, Republic of" msgstr "Korejská republika" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanské ostrovy" #. 398 msgid "Kazakhstan" msgstr "Kazachstán" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoská lidově demokratická republika" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Svatá Lucie" #. 438 msgid "Liechtenstein" msgstr "Lichtenštejnsko" #. 144 msgid "Sri Lanka" msgstr "Srí Lanka" #. 430 msgid "Liberia" msgstr "Libérie" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Lucembursko" #. 428 msgid "Latvia" msgstr "Lotyšsko" #. 434 msgid "Libya" msgstr "Libye" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavská republika" #. 499 msgid "Montenegro" msgstr "Černá Hora" #. 663 msgid "Saint Martin (French part)" msgstr "Svatý Martin (francouzská část)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallovy ostrovy" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonie, bývalá jugoslávská republika" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolsko" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Severní Mariany" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mauritánie" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricius" #. 462 msgid "Maldives" msgstr "Maledivy" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malajsie" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibie" #. 540 msgid "New Caledonia" msgstr "Nová Kaledonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkský ostrov" #. 566 msgid "Nigeria" msgstr "Nigérie" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Nizozemsko" #. 578 msgid "Norway" msgstr "Norsko" #. 524 msgid "Nepal" msgstr "Nepál" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nový Zéland" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francouzská Polynésie" #. 598 msgid "Papua New Guinea" msgstr "Papua Nová Guinea" #. 608 msgid "Philippines" msgstr "Filipíny" #. 586 msgid "Pakistan" msgstr "Pákistán" #. 616 msgid "Poland" msgstr "Polsko" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Svatý Pierre a Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairnovy ostrovy" #. 630 msgid "Puerto Rico" msgstr "Portoriko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinské území, okupované" #. 620 msgid "Portugal" msgstr "Portugalsko" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Rumunsko" #. 688 msgid "Serbia" msgstr "Srbsko" #. 643 msgid "Russian Federation" msgstr "Ruská federace" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saúdská Arábie" #. 090 msgid "Solomon Islands" msgstr "Šalamounovy ostrovy" #. 690 msgid "Seychelles" msgstr "Seychely" #. 736 msgid "Sudan" msgstr "Súdán" #. 752 msgid "Sweden" msgstr "Švédsko" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Svatá Helena" #. 705 msgid "Slovenia" msgstr "Slovinsko" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Špicberky a Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovensko" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somálsko" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Jižní Súdán" #. 678 msgid "Sao Tome and Principe" msgstr "Svatý Tomáš a Princův ostrov" #. 222 msgid "El Salvador" msgstr "Salvádor" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Svatý Martin (nizozemská část)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrská arabská republika" #. 748 msgid "Swaziland" msgstr "Svazijsko" #. 796 msgid "Turks and Caicos Islands" msgstr "Ostrovy Turks a Caicos" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francouzská jižní a antarktická území" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thajsko" #. 762 msgid "Tajikistan" msgstr "Tádžikistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Východní Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistán" #. 788 msgid "Tunisia" msgstr "Tunisko" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turecko" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad a Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tchaj-wan, provincie Číny" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanie, sjednocená republika" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Drobné odlehlé ostrovy Spojených států" #. 840 msgid "United States" msgstr "Spojené státy" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Svatý stolec (Vatikánský městský stát)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Svatý Vincenc a Grenadiny" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britské Panenské ostrovy" #. 850 msgid "Virgin Islands, U.S." msgstr "Americké Panenské ostrovy" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu (Nové Hebridy)" #. 876 msgid "Wallis and Futuna" msgstr "Wallis a Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Jihoafrická republika" #. 894 msgid "Zambia" msgstr "Zambie" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Není známo, přidejte is_in atributy do těchto měst" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" "Použití navit:\n" "navit [volby] [konfigurační soubor]\n" "\t-c : Použijte jako konfigurační soubor\n" "\t-d : Nastavení souhrnné výstupní ladící úrovně v (0-3). Přepíše " "nastavení z konfiguračního souboru.\n" "\t-h: Zobrazí tuto nápovědu a skončí.\n" "\t-v: Zobrazí verzy a skončí.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Nenalezen konfigurační soubor navit.xml a navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Chyba při zpracování konfiguračního souboru '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Používáte konfigurační soubor '% s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Interní selhání inicializace, končím. Zkontrolujte předchozí chybové " "zprávy.\n" msgid "unknown street" msgstr "neznámá ulice" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nepojmenované vozidlo" msgid "Failed to write bookmarks file" msgstr "Nepodařilo se zapsat do souboru s záložkama" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Bod na mapě" msgid "Car" msgstr "Automobil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Země" msgid "Postal" msgstr "Poštovní" msgid "Town" msgstr "Město" msgid "District" msgstr "Kraj/Okres" msgid "Street" msgstr "Ulice" msgid "Number" msgstr "Číslo" msgid "Enter Destination" msgstr "Zadejte cíl" msgid "Zip Code" msgstr "PSČ" msgid "City" msgstr "Město" msgid "District/Township" msgstr "Kraj/Okres" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Záložka" msgid "Destination" msgstr "Cíl" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Zobrazit" msgid "_Route" msgstr "Trasa" msgid "_Former Destinations" msgstr "Minulé cíle" msgid "_Bookmarks" msgstr "Záložky" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Rozvržení" msgid "_Projection" msgstr "Projekce" msgid "_Vehicle" msgstr "Vozidlo" msgid "Zoom_Out" msgstr "Zmenšit" msgid "Decrease zoom level" msgstr "Zmenší zvětšení" msgid "Zoom_In" msgstr "Zvětšit" msgid "Increase zoom level" msgstr "Zvýší zvětšení" msgid "_Recalculate" msgstr "Přepočítat" msgid "Redraw map" msgstr "Překreslí mapu" msgid "_Info" msgstr "Informace" msgid "Set _destination" msgstr "Nastavit _cíl" msgid "Opens address search dialog" msgstr "Otevře vyhledávání adres" msgid "_Stop Navigation" msgstr "Přestat navigovat" msgid "Test" msgstr "Vyzkoušet" msgid "_Quit" msgstr "_Konec" msgid "Quit the application" msgstr "Zavře aplikaci" msgid "Show position _cursor" msgstr "Zobrazit pozici _kurzoru" msgid "_Lock on Road" msgstr "Jet jen po silnici" msgid "_Keep orientation to the North" msgstr "_Orientovat na sever" msgid "Switches map orientation to the north or the vehicle" msgstr "Přepíná orientaci mapy podle směru vozidla nebo severu" msgid "_Roadbook" msgstr "Itinerář" msgid "Show/hide route description" msgstr "Zobrazí/skryje popis cesty" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Povolí/zakáže automatické změny úrovně zoomu" msgid "_Fullscreen" msgstr "Celá obrazovka" msgid "Data" msgstr "Data" msgid "N" msgstr "S" msgid "NE" msgstr "SV" msgid "E" msgstr "V" msgid "SE" msgstr "JV" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trasa %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Trasa 0000km 0+00:00 ETA" msgid "Help" msgstr "Nápověda" #, c-format msgid "Waypoint %s" msgstr "Bod trasy %s" msgid "Select waypoint to insert the new one before" msgstr "Vyberte bod trasy pro vložení nového před něho" msgid "View in Browser" msgstr "Zobrazit v prohlížeči" msgid "Item type" msgstr "Typ položky" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "Čísla domů" msgid "View Attributes" msgstr "Zobrazit atributy" msgid "Set as position (and deactivate vehicle)" msgstr "Nastavit jako polohu (a deaktivovat vozidlo)" msgid "POIs" msgstr "Body zájmu" msgid "View on map" msgstr "Zobrazit na mapě" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "Zobrazit výsledky na mapě" msgid "Cut Bookmark" msgstr "Vyjmout záložku" msgid "Copy Bookmark" msgstr "Kopírovat záložku" msgid "Rename Bookmark" msgstr "Přejmenovat záložku" msgid "Paste Bookmark" msgstr "Vložit záložku" msgid "Delete Bookmark" msgstr "Smazat záložku" msgid "Delete waypoint" msgstr "Smazat bod trasy " msgid "Bookmarks" msgstr "Záložky" msgid "Bookmarks as waypoints" msgstr "Záložky jako body trasy" msgid "Save waypoints" msgstr "Uložit body trasy" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Přidat složku záložek" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Vložit záložku" #, c-format msgid "Bookmark %s" msgstr "Záložka %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "Mapa ke stažení" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "Stáhnuto kompletní" msgid "Show Satellite Status" msgstr "Ukázat stav satelitu" msgid " Elevation " msgstr " Převýšení " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Ukázat NMEA data" msgid "car" msgstr "auto" msgid "bike" msgstr "kolo" msgid "pedestrian" msgstr "chodec" #, c-format msgid "Current profile: %s" msgstr "Aktuální profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Změnit profil na: %s" msgid "Set as active" msgstr "Nastavit jako aktivní" msgid "Show Satellite status" msgstr "Ukázat stav satelitu" msgid "Show NMEA data" msgstr "Ukázat NMEA data" msgid "Add Bookmark" msgstr "Přidat značku" msgid "Rename" msgstr "Přejmenovat" msgid "About Navit" msgstr "O Navitu" #. Authors msgid "By" msgstr "Od" #. Contributors msgid "And all the Navit Team" msgstr "A další z Navit týmu" msgid "members and contributors." msgstr "členové a přispívající" msgid "Waypoints" msgstr "Body trasy" msgid "Enter Coordinates" msgstr "Zadejte souřadnice" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "Zeměpisná délka Zeměpisná šířka" msgid "Enter coordinates, for example:" msgstr "Zadejte souřadnice, například:" msgid "Vehicle" msgstr "Vozidlo" msgid "Rules" msgstr "Pravidla" msgid "Lock on road" msgstr "Uchytit na cestu" msgid "Northing" msgstr "Severně" msgid "Map follows Vehicle" msgstr "Mapa sleduje vozidlo" msgid "Plan with Waypoints" msgstr "Plán s bodama trasy" msgid "Maps" msgstr "Mapy" msgid "Layout" msgstr "Rozvržení" msgid "Height Profile" msgstr "Výška profilu" msgid "Route Description" msgstr "Popis trasy" msgid "Show Locale" msgstr "Zobrazit jazyk" msgid "Former Destinations" msgstr "Minulé cíle" msgid "- No former destinations available -" msgstr "- Minulé cíle nejsou dostupné -" msgid "Message" msgstr "Zpráva" msgid "Back" msgstr "Zpět" msgid "Back to map" msgstr "Zpět na mapu" msgid "Main Menu" msgstr "Hlavní menu" msgid "House number" msgstr "Číslo domu" msgid "Next" msgstr "Další" msgid "Prev" msgstr "Předchozí" msgid "Return to route!" msgstr "Vraťte se zpět!" #. warning told msgid "Look out! Camera!" msgstr "Podívejte se! Kamera!" #. warning told msgid "Please decrease your speed" msgstr "Prosím snižte rychlost" msgid "partial match" msgstr "Částečná shoda" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Vyhledat" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Města" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Cestovat sem" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Mapová data (c) přispěvatelé OpenStreetMap, ODBL" msgid "Downloaded maps" msgstr "Stažené mapy" msgid "Whole Planet" msgstr "Celá planeta" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Kanárské ostrovy" msgid "Asia" msgstr "Asie" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "Spojené arabské emiráty+ostatní" msgid "Oceania" msgstr "Oceánie" msgid "Tasmania" msgstr "Tasmánie" msgid "Victoria" msgstr "Viktorie" msgid "New South Wales" msgstr "Nový Jižní Wales" msgid "Europe" msgstr "Evropa" msgid "Western Europe" msgstr "Západní Evropa" msgid "Azores" msgstr "Azory" msgid "BeNeLux" msgstr "Benelux" msgid "Alsace" msgstr "Alsasko" msgid "Aquitaine" msgstr "Akvitánie" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Dolní Normandie" msgid "Bourgogne" msgstr "Burgundsko" msgid "Bretagne" msgstr "Bretaň" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "Champagne-Ardennes" msgid "Corse" msgstr "Korsika" msgid "Franche-Comte" msgstr "Franche-Comté" msgid "Haute-Normandie" msgstr "Horní Normandie" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lotrinsko" msgid "Midi-Pyrenees" msgstr "Jižní Pyreneje" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Pikardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provensálsko-Alpy-Azurové pobřeží" msgid "Rhone-Alpes" msgstr "Rhone-Alpy" msgid "Baden-Wuerttemberg" msgstr "Baden-Württembersko" msgid "Bayern" msgstr "Bavorsko" msgid "Mittelfranken" msgstr "Střední Franky" msgid "Niederbayern" msgstr "Dolní Bavorsko" msgid "Oberbayern" msgstr "Horní Bavorsko" msgid "Oberfranken" msgstr "Horní Franky" msgid "Oberpfalz" msgstr "Horní Falcko" msgid "Schwaben" msgstr "Švábsko" msgid "Unterfranken" msgstr "Dolní Franky" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Braniborsko" msgid "Bremen" msgstr "Brémy" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hessensko" msgid "Mecklenburg-Vorpommern" msgstr "Meklenbursko-Pomořansko" msgid "Niedersachsen" msgstr "Dolní Sasko" msgid "Nordrhein-westfalen" msgstr "Severní Porýní-Vestfálsko" msgid "Rheinland-Pfalz" msgstr "Porýnsko-Falcko" msgid "Saarland" msgstr "Sársko" msgid "Sachsen-Anhalt" msgstr "Sasko-Anhaltsko" msgid "Sachsen" msgstr "Sasko" msgid "Schleswig-Holstein" msgstr "Šlesvicko-Holštýnsko" msgid "Thueringen" msgstr "Thueringen" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galície" msgid "Scandinavia" msgstr "Skandinávie" msgid "England" msgstr "Anglie" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Jižní Yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Skotsko" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Kréta" msgid "North America" msgstr "Severní Amerika" msgid "Alaska" msgstr "Aljaška" msgid "Hawaii" msgstr "Havaj" msgid "USA" msgstr "USA" msgid " (except Alaska and Hawaii)" msgstr "(mimo Aljašky a Havaje)" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Tichý oceán" msgid "South" msgstr "" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Washington D.C." msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginie" msgid "West Virginia" msgstr "Západní Virginie" msgid "West" msgstr "" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornie" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nové Mexico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Stát Washington " msgid "South+Middle America" msgstr "Jižní+Střední Amerika" msgid "Guyane Francaise" msgstr "Francouzská Guyana" msgid "downloading" msgstr "stahuji" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "mapa připravena" msgid "Error downloading map!" msgstr "Chyba při stahování mapy!" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Není dostatek volného místa" msgid "Error writing map!" msgstr "Chyba při zápisu mapy!" msgid "Map download aborted!" msgstr "Stahování mapy přerušeno!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Zbývající čas" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Mapa ke stažení" msgid "Vehicle Position" msgstr "Poloha vozidla" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Ano" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Startuje Navit" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit běží" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Vítejte v Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Děkujeme za instalaci Navit!\n" "\n" "Pro začátek, vyberte \"Stáhnout mapy\" z menu pro stažení map. Poznámka: " "Velikost souboru map mohou být velké (>50MB) - wifi připojení je " "doporučeno.\n" "\n" "Mapdata: (c) OpenStreetMap a přispěvovatelé\n" "\n" "Užijte si Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Přiblížit" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Oddálit" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Stáhnout mapy" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Ukončit Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Zálohovat / Obnovit" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Smazat tuto mapu?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Stahuji:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Chyba při stahování map." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Stahování map přerušeno" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Žádné umístění. Zkuste znovu po opravě umístění." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapy obsahující nynější umístění" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Hledat dle adresy" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Zadejte cíl" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Shoda částí adresy" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Vyhledávám..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adresa nebyla nalezena" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Výsledky hledání" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Načítání výsledku vyhledávání" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Výsledky nenalezeny." #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Text nebyl zadán" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Nastavení cíle v:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Vyberte akci" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Prosím vložte SD kartu" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Zálohuji..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Obnovuji..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Nezdařilo se vytvořit adresář pro zálohu" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Záloha se nezdařila" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Záloha nenalezena" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Obnova se nezdařila" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Záloha byla úspěšná" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Obnova byla úspěšná.\n" "Restartujte prosím Navit." #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Záloha nenalezena" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Obnova selhala" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Vyberte zálohu" #. Android resource: @strings/backup msgid "Backup" msgstr "Zálohování" #. Android resource: @strings/restore msgid "Restore" msgstr "Obnova" msgid "Main menu" msgstr "Hlavní menu" msgid "" "Show\n" "Map" msgstr "" "Ukázat\n" "mapu" msgid "Settings" msgstr "Nastavení" msgid "Tools" msgstr "Nástroje" msgid "Route" msgstr "Trasa" msgid "About" msgstr "O programu" msgid "Actions" msgstr "Akce" msgid "" "Former\n" "Destinations" msgstr "" "Minulé\n" "cíle" msgid "Quit" msgstr "Konec" msgid "" "Stop\n" "Navigation" msgstr "" "Ukonči\n" "Navigaci" msgid "Display" msgstr "Zobrazit" msgid "Fullscreen" msgstr "Celá obrazovka" msgid "Window Mode" msgstr "V okně" msgid "Description" msgstr "Popis" msgid "" "Drop last \n" "Waypoint" msgstr "" "Zrušit minulý \n" "bod trasy" msgid "" "Drop next \n" "Waypoint" msgstr "" "Zrušit příští \n" " bod trasy" msgid "Satellite Status" msgstr "Stav satelitu" msgid "NMEA Data" msgstr "NMEA Data" msgid "car_shortest" msgstr "auto nejkratší" msgid "car_avoid_tolls" msgstr "auto bez mýtného" msgid "car_pedantic" msgstr "auto puntičkářské" msgid "horse" msgstr "kůň" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "kamión" #~ msgid "Libyan Arab Jamahiriya" #~ msgstr "Libyjská arabská džamáhíríje" #~ msgid "In %s, enter the roundabout" #~ msgstr "Za %s, najeďte na kruhový objezd" #~ msgid "Cursor" #~ msgstr "Kurzor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometrů" navit-0.5.0~svn5643+dfsg.1/po/da.po.in000066400000000000000000001071551221777731700171600ustar00rootroot00000000000000# Danish translation for Navit # Copyright (C) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Glenn Sommer , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 09:31+0000\n" "Last-Translator: Lasse Luttermann \n" "Language-Team: Glenn Sommer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Kører fra kildekode mappen\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "sætter '%s' til '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulte" msgid "first" msgstr "første" msgid "second" msgstr "anden" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjerde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjette" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulte afkørsel" msgid "first exit" msgstr "første afkørsel" msgid "second exit" msgstr "anden afkørsel" msgid "third exit" msgstr "tredje afkørsel" msgid "fourth exit" msgstr "fjerde afkørsel" msgid "fifth exit" msgstr "femte afkørsel" msgid "sixth exit" msgstr "sjette afkørsel" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "om %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "om %d.%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "én kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om én kilometer" msgstr[1] "om %d kilometer" msgid "exit" msgstr "afkørsel" msgid "into the ramp" msgstr "op på rampen" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s ind i gaden %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s ind i %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s ind i %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s ind i %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sind i %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "højre" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "venstre" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "blødt " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "skarpt " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "meget kraftigt " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ukendt " msgid "When possible, please turn around" msgstr "Når muligt, vend venligst om" msgid "Enter the roundabout soon" msgstr "Kør snart ind i rundkørslen" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "forlad så rundkørslen ved den %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Forlad rundkørslen ved den %s" #, c-format msgid "Follow the road for the next %s" msgstr "Følg vejen de næste %s" msgid "soon" msgstr "snart" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tag den %1$s vej til %2$s" #, c-format msgid "after %i roads" msgstr "efter %i veje" msgid "now" msgstr "nu" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "tag så den %1$s vej til %2$s" msgid "error" msgstr "fejl" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Drej %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "drej så %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Du er fremme ved destinationen %s" msgid "then you have reached your destination." msgstr "og så ankommer du til din destination" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Længde" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tid" msgid "Destination Length" msgstr "Længde til destinationen" msgid "Destination Time" msgstr "Tid til destinationen" msgid "Roadbook" msgstr "Vejbog" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Sæt som position" msgid "Set as destination" msgstr "Sæt som destination" msgid "Add as bookmark" msgstr "Tilføj som bogmærke" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skærm koordinater %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Forenede Arabiske Emirater" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" #. 530 msgid "Netherlands Antilles" msgstr "Nederlandske Antiller" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikansk Samoa" #. 040 msgid "Austria" msgstr "Østrig" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ålands Øerne" #. 031 msgid "Azerbaijan" msgstr "Aserbajdsjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "St Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetøen" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Hviderusland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocosøerne (Keelingøerne)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Den Demokratiske Republik" #. 140 msgid "Central African Republic" msgstr "Centralafrikanske Republik" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Svejts" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbenskysten" #. 184 msgid "Cook Islands" msgstr "Cook-øerne" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Columbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island (Indiske Ocean)" #. 196 msgid "Cyprus" msgstr "Cypern" #. 203 msgid "Czech Republic" msgstr "Tjekkiet" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikanske Republik" #. 012 msgid "Algeria" msgstr "Algeriet" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypten" #. 732 msgid "Western Sahara" msgstr "Vestsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Etiopien" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøerne" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien, de forenede stater af" #. 234 msgid "Faroe Islands" msgstr "Færøerne" #. 250 msgid "France" msgstr "Frankrig" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannien" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Fransk Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ækvatorialguinea" #. 300 msgid "Greece" msgstr "Grækenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sydgeorgien og Sydsandwichøerne" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard-øen og McDonald-øerne" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Det britiske territorium i Indiske Ocean" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Den Islamiske Republik" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comorerne" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sankt Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Den Demokratiske Folkerepublik" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republikken" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman-øerne" #. 398 msgid "Kazakhstan" msgstr "Kasakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Letland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libysk-arabisk Jamahiriya" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republikken" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Sankt Marin (Fransk del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall-øerne" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonien, Den Tidligere Jugoslaviske Republik" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar (Burma)" #. 496 msgid "Mongolia" msgstr "Mongoliet" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nordmarianerne" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiverne" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ny Kaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk-øen" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Holland" #. 578 msgid "Norway" msgstr "Norge" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Filippinerne" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sankt Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palæstinensiske Territorie, Det Besatte" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romænien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Rusland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabien" #. 090 msgid "Solomon Islands" msgstr "Salomon-øerne" #. 690 msgid "Seychelles" msgstr "Seychellerne" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sankt Helena" #. 705 msgid "Slovenia" msgstr "Slovenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakiet" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Den arabiske republik Syrien" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøerne" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Fransk sydlige territorier" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Tyrkiet" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Den Kinesiske Provins" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, Den Forenede Republik" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "USA, mindre omliggende øer" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sankt Vincent og Grenadinerne" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britiske jomfruøer" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikanske Jomfruøer" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis og Futunaøerne" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sydafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Ukendt, tilføj is_in mærke til disse byer" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kort punkt" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "By" msgid "District" msgstr "Område" msgid "Street" msgstr "Gade" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Indtast destination" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "By" msgid "District/Township" msgstr "Distrikt" msgid "Map" msgstr "Kort" msgid "Bookmark" msgstr "Bogmærke" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Vis" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "Tidligere destinationer" msgid "_Bookmarks" msgstr "Bogmærker" msgid "_Map" msgstr "Kort" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Visning" msgid "_Vehicle" msgstr "Køretøj" msgid "Zoom_Out" msgstr "Zoom ud" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom ind" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Genberegn" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop Navigation" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Afslut" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Stop Navigation" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Vejbog" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Fuldskærm" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NØ" msgid "E" msgstr "Ø" msgid "SE" msgstr "SØ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nej" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rute %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Rute 0000km 0+00:00 ETA" msgid "Help" msgstr "Hjælp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vis i Browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gader" msgid "House numbers" msgstr "Hus numre" msgid "View Attributes" msgstr "Vis attributter" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Vis på kort" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bogmærker" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Bogmærke %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vis satellit status" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Vis NMEA data" msgid "car" msgstr "Bil" msgid "bike" msgstr "cykel" msgid "pedestrian" msgstr "fodgænger" #, c-format msgid "Current profile: %s" msgstr "Aktuel profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Skift profil til: %s" msgid "Set as active" msgstr "Sæt til aktiv" msgid "Show Satellite status" msgstr "Vis satellit status" msgid "Show NMEA data" msgstr "Vis NMEA data" msgid "Add Bookmark" msgstr "Tilføj Bogmærke" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Køretøj" msgid "Rules" msgstr "Regler" msgid "Lock on road" msgstr "Lås til vej" msgid "Northing" msgstr "mod nord" msgid "Map follows Vehicle" msgstr "Kort følger køretøj" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kort" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Lodret profil" msgid "Route Description" msgstr "Route Beskrivelse" msgid "Show Locale" msgstr "Vis Lokale" msgid "Former Destinations" msgstr "Tidligere destinationer" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Meddelelse" msgid "Back" msgstr "Tilbage" msgid "Back to map" msgstr "Tilbage til kort" msgid "Main Menu" msgstr "Hovedmenu" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Køretøjsposition" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hovedmenu" msgid "" "Show\n" "Map" msgstr "" "Vis\n" "Kort" msgid "Settings" msgstr "Indstillinger" msgid "Tools" msgstr "Værktøj" msgid "Route" msgstr "Rute" msgid "About" msgstr "" msgid "Actions" msgstr "Funktioner" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Luk" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "Navigation" msgid "Display" msgstr "Vis" msgid "Fullscreen" msgstr "Fuldskærm" msgid "Window Mode" msgstr "Vinduestilstand" msgid "Description" msgstr "Beskrivelse" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hest" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Om %s, kør ind i rundkørslen" #~ msgid "Cursor" #~ msgstr "Markør" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometer" navit-0.5.0~svn5643+dfsg.1/po/de.po.in000066400000000000000000001163441221777731700171640ustar00rootroot00000000000000# German translations for navit # Copyright (C) 2007,2008 The Navit Team # This file is distributed under the same license as the navit package. # Martin Schaller , 2007. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-01 22:09+0000\n" "Last-Translator: Achim Behrens \n" "Language-Team: Martin Schaller \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Aufruf aus Quellverzeichnis\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setze '%s' auf '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullte" msgid "first" msgstr "erste" msgid "second" msgstr "zweite" msgid "third" msgstr "dritte" msgid "fourth" msgstr "vierte" msgid "fifth" msgstr "fünfte" msgid "sixth" msgstr "sechste" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullten Ausfahrt" msgid "first exit" msgstr "ersten Ausfahrt" msgid "second exit" msgstr "zweiten Ausfahrt" msgid "third exit" msgstr "dritten Ausfahrt" msgid "fourth exit" msgstr "vierten Ausfahrt" msgid "fifth exit" msgstr "fünften Ausfahrt" msgid "sixth exit" msgstr "sechsten Ausfahrt" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "in %d m" #, c-format msgid "%d feet" msgstr "%d Fuss" #, c-format msgid "in %d feet" msgstr "in %d Fuss" #, c-format msgid "%d meters" msgstr "%d Meter" #, c-format msgid "in %d meters" msgstr "In %d Metern" #, c-format msgid "%d.%d miles" msgstr "%d.%d Meilen" #, c-format msgid "in %d.%d miles" msgstr "in %d.%d Meilen" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d Kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "In %d,%d Kilometern" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "eine Meile" msgstr[1] "%d Meilen" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "in einer Meile" msgstr[1] "in %d Meilen" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "einen Kilometer" msgstr[1] "%d Kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "In einem Kilometer" msgstr[1] "In %d Kilometern" msgid "exit" msgstr "Ausfahrt" msgid "into the ramp" msgstr "auf die Autobahnauffahrt" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sauf die Straße %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sauf den %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sauf die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sauf das %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sauf die %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "rechts" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "links" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "leicht " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "scharf " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "scharf " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "unbekannt " # msgid "When possible, please turn around" msgstr "Wenn möglich bitte wenden" msgid "Enter the roundabout soon" msgstr "Demnächst in den Kreisverkehr einfahren" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "%s in den Kreisverkehr einfahren" #, c-format msgid "then leave the roundabout at the %s" msgstr "dann verlassen Sie den Kreisverkehr an der %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Den Kreisverkehr an der %s verlassen" #, c-format msgid "Follow the road for the next %s" msgstr "Dem Straßenverlauf %s folgen" msgid "soon" msgstr "Demnächst" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Die %1$s Straße %2$s abbiegen" #, c-format msgid "after %i roads" msgstr "nach %i Straßen" msgid "now" msgstr "Jetzt" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "dann die %1$s Straße %2$s abbiegen" msgid "error" msgstr "Fehler" # c-format #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s %1$s%2$s abbiegen%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "dann %3$s %1$s%2$s abbiegen%4$s" #, c-format msgid "You have reached your destination %s" msgstr "%s haben Sie ihr Ziel erreicht" msgid "then you have reached your destination." msgstr "dann haben Sie Ihr Ziel erreicht." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Befehl" msgid "Length" msgstr "Länge" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Zeit" msgid "Destination Length" msgstr "Verbleibende Strecke zum Ziel" msgid "Destination Time" msgstr "Fahrzeit zum Ziel" msgid "Roadbook" msgstr "Wegbeschreibung" #, c-format msgid "Waypoint %d" msgstr "Wegpunkt %d" msgid "Visit before..." msgstr "Als Wegpunkt setzen vor..." msgid "Set as position" msgstr "Als Position setzen" msgid "Set as destination" msgstr "Als Ziel setzen" msgid "Add as bookmark" msgstr "Als Lesezeichen aufnehmen" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Bildschirm %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Die Vereinigte arabische Emirate" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua und Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" # #. 530 msgid "Netherlands Antilles" msgstr "Niederländische Antillen" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentinien" #. 016 msgid "American Samoa" msgstr "Amerikanisch-Samoa" #. 040 msgid "Austria" msgstr "Österreich" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Aserbaidschan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien und Herzegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesch" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivien" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius und Saba" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetinsel" #. 072 msgid "Botswana" msgstr "Botsuana" #. 112 msgid "Belarus" msgstr "Weißrussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosinseln" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratische Republik" #. 140 msgid "Central African Republic" msgstr "Zentralafrikanische Republik" #. 178 msgid "Congo" msgstr "Republik Kongo" #. 756 msgid "Switzerland" msgstr "Schweiz" #. 384 msgid "Cote d'Ivoire" msgstr "Côte d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Cookinseln" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China, Volksrepublik" #. 170 msgid "Colombia" msgstr "Kolumbien" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "Curaçao" #. 162 msgid "Christmas Island" msgstr "Weihnachtsinsel" #. 196 msgid "Cyprus" msgstr "Zypern" #. 203 msgid "Czech Republic" msgstr "Tschechische Republik" #. 276 msgid "Germany" msgstr "Deutschland" #. 262 msgid "Djibouti" msgstr "Dschibuti" #. 208 msgid "Denmark" msgstr "Dänemark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikanische Republik" #. 012 msgid "Algeria" msgstr "Algerien" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Ägypten" #. 732 msgid "Western Sahara" msgstr "Westsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Äthiopien" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fidschi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandinseln" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien" #. 234 msgid "Faroe Islands" msgstr "Färöer" #. 250 msgid "France" msgstr "Frankreich" #. 266 msgid "Gabon" msgstr "Gabun" #. 826 msgid "United Kingdom" msgstr "Grossbritannien" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Französisch-Guayana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Äquatorialguinea" #. 300 msgid "Greece" msgstr "Griechenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Südgeorgien und die Südlichen Sandwichinseln" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hongkong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- und McDonald-Inseln" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Insel Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Britisches Territorium im Indischen Ozean" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamische Republik" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanien" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. 116 msgid "Cambodia" msgstr "Kambodscha" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoren" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts und Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Demokratische Volksrepublik" #. 410 msgid "Korea, Republic of" msgstr "Südkorea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kaimaninseln" #. 398 msgid "Kazakhstan" msgstr "Kasachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, Demokratische Volksrepublik" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libysch-Arabische Dschamahirija" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldawien" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (franz. Teil)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallinseln" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Mazedonien, ehem. jugoslawische Republik" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Burma" #. 496 msgid "Mongolia" msgstr "Mongolei" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nördliche Marianen" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediven" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Neukaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsel" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Niederlande" #. 578 msgid "Norway" msgstr "Norwegen" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Neuseeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Französisch-Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua-Neuguinea" #. 608 msgid "Philippines" msgstr "Philippinen" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre und Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairninseln" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palästinensische Autonomiegebiete" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Rumänien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Rußland" #. 646 msgid "Rwanda" msgstr "Ruanda" # #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabien" #. 090 msgid "Solomon Islands" msgstr "Salomonen" #. 690 msgid "Seychelles" msgstr "Seychellen" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Schweden" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slowenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard und Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakei" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Südsudan" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé und Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (niederl. Teil)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrien, Arabische Republik" #. 748 msgid "Swaziland" msgstr "Swasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- und Caicosinseln" #. 148 msgid "Chad" msgstr "Tschad" #. 260 msgid "French Southern Territories" msgstr "Französische Süd- und Antarktisgebiete" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadschikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Osttimor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türkei" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad und Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Republik China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania, Vereinigte Republik" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "Vereinigte Staaten von Amerika" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstadt" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent und die Grenadinen" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britische Jungferninseln" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikanische Jungferninseln" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis und Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Südafrika" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Simbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "*Unbekannt, füge Etikett \"ist in\" zu diesen Städten hinzu" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" "navit Benutzung:\n" "navit [Optionen] [Konfigdatei]\n" "\t-c : als Konfigdatei benutzen\n" "\t-d : Den globalen Debug-Level auf (0-3) setzen. Überschreibt die " "Einstellung aus der Konfigurationsdatei.\n" "\t-h: Diesen Text ausgeben und das Programm beenden.\n" "\t-v: Die Version ausgeben und das Programm beenden.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Keine Konfigurations-Datei navit.xml oder navit.xml.local gefunden\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Fehler beim Parsen der Konfigurations-Datei '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Benutze Konfigurations-Datei '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Interne Initialisierung fehlgeschlagen, Programm wird beendet. Frühere " "Fehler beachten.\n" msgid "unknown street" msgstr "unbekannte Straße" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Namenloses Fahrzeug" msgid "Failed to write bookmarks file" msgstr "Lesezeichen-Datei konnte nicht geschrieben werden" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartenpunkt" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" # msgid "Postal" msgstr "PLZ" msgid "Town" msgstr "Ort" msgid "District" msgstr "Gegend" msgid "Street" msgstr "Straße" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Reiseziel eingeben" msgid "Zip Code" msgstr "Postleitzahl" msgid "City" msgstr "Stadt" msgid "District/Township" msgstr "Ortsteil/Gemeinde" msgid "Map" msgstr "Karte" msgid "Bookmark" msgstr "Lesezeichen" msgid "Destination" msgstr "Reiseziel" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Anzeige" msgid "_Route" msgstr "_Route" msgid "_Former Destinations" msgstr "_Vorherige Ziele" msgid "_Bookmarks" msgstr "_Lesezeichen" msgid "_Map" msgstr "_Karte" msgid "_Layout" msgstr "_Erscheinungsbild" msgid "_Projection" msgstr "_Projektion" msgid "_Vehicle" msgstr "_Fahrzeug" msgid "Zoom_Out" msgstr "Ver_kleinern" msgid "Decrease zoom level" msgstr "Verkleinern" msgid "Zoom_In" msgstr "Ver_größern" msgid "Increase zoom level" msgstr "Vergrößern" msgid "_Recalculate" msgstr "_Neu berechnen" msgid "Redraw map" msgstr "Karte neuzeichnen" msgid "_Info" msgstr "_Info" msgid "Set _destination" msgstr "Als _Ziel setzen" msgid "Opens address search dialog" msgstr "Öffnet Adresssuche-Dialog" msgid "_Stop Navigation" msgstr "Navigation be_enden" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Beenden" msgid "Quit the application" msgstr "Die Anwendung beenden" msgid "Show position _cursor" msgstr "Positions_marke zeigen" msgid "_Lock on Road" msgstr "Auf Straße _zeigen" msgid "_Keep orientation to the North" msgstr "_Nordorientierung" msgid "Switches map orientation to the north or the vehicle" msgstr "" "Die Kartenorientierung zwischen Norden und Fahrzeugausrichtung wechseln" msgid "_Roadbook" msgstr "_Wegbeschreibung" msgid "Show/hide route description" msgstr "Routenbeschreibung anzeigen/schließen" msgid "_Autozoom" msgstr "_automatischer Zoom" msgid "Enable/disable automatic zoom level changing" msgstr "Automatischen Zoom einschalten/ausschalten" msgid "_Fullscreen" msgstr "_Vollbild" msgid "Data" msgstr "Daten" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "SO" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nein" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Hilfe" #, c-format msgid "Waypoint %s" msgstr "Wegpunkt %s" msgid "Select waypoint to insert the new one before" msgstr "Auswählen, wovor der Wegpunkt eingefügt werden soll" msgid "View in Browser" msgstr "Im Browser anzeigen" msgid "Item type" msgstr "Elementtyp" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Straßen" msgid "House numbers" msgstr "Hausnummern" msgid "View Attributes" msgstr "Attribute anzeigen" msgid "Set as position (and deactivate vehicle)" msgstr "Als Position setzen (und Fahrzeug deaktivieren)" msgid "POIs" msgstr "Interessante Kartenpunkte" msgid "View on map" msgstr "Auf der Karte zeigen" msgid "Remove search results from the map" msgstr "Suchergebnisse aus Karte löschen" msgid "Show results on the map" msgstr "Ergebnisse in Karte anzeigen" msgid "Cut Bookmark" msgstr "Lesezeichen ausschneiden" msgid "Copy Bookmark" msgstr "Lesezeichen kopieren" msgid "Rename Bookmark" msgstr "Lesezeichen umbenennen" msgid "Paste Bookmark" msgstr "Lesezeichen einfügen" msgid "Delete Bookmark" msgstr "Lesezeichen entfernen" msgid "Delete waypoint" msgstr "Wegpunkt löschen" msgid "Bookmarks" msgstr "Lesezeichen" msgid "Bookmarks as waypoints" msgstr "Lesezeichen als Wegpunkte" msgid "Save waypoints" msgstr "Wegpunkte abspeichern" msgid "Replace with waypoints" msgstr "Durch Wegpunkte ersetzen" msgid "Delete Folder" msgstr "Ordner löschen" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Lesezeichen-Ordner hinzufügen" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lesezeichen einfügen" #, c-format msgid "Bookmark %s" msgstr "Lesezeichen %s" #, c-format msgid "Download %s" msgstr "%s herunterladen" msgid "Map Download" msgstr "Kartendownload" msgid "Active" msgstr "Aktiv" msgid "Download Enabled" msgstr "Download aktiviert" msgid "Download completely" msgstr "Komplett herunterladen" msgid "Show Satellite Status" msgstr "Satellitenstatus anzeigen" msgid " Elevation " msgstr " Höhe " msgid " Azimuth " msgstr " Längengrad " msgid "Show NMEA Data" msgstr "zeige NMEA Daten" msgid "car" msgstr "Auto" msgid "bike" msgstr "Fahrrad" msgid "pedestrian" msgstr "Fußgänger" #, c-format msgid "Current profile: %s" msgstr "Aktuelles Profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Profil ändern nach: %s" msgid "Set as active" msgstr "Als Aktiv setzen" msgid "Show Satellite status" msgstr "Satellitenstatus anzeigen" msgid "Show NMEA data" msgstr "NMEA Daten anzeigen" msgid "Add Bookmark" msgstr "Lesezeichen hinzufügen" msgid "Rename" msgstr "Umbennenen" msgid "About Navit" msgstr "Über Navit" #. Authors msgid "By" msgstr "Von" #. Contributors msgid "And all the Navit Team" msgstr "Und das ganze Navit Team" msgid "members and contributors." msgstr "Mitglieder und Mitarbeiter" msgid "Waypoints" msgstr "Wegpunkte" msgid "Enter Coordinates" msgstr "Koordinaten eingeben" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "Längengrad Breitengrad" msgid "Enter coordinates, for example:" msgstr "Koordinaten eingeben, z.B.:" msgid "Vehicle" msgstr "Fahrzeug" msgid "Rules" msgstr "Regeln" msgid "Lock on road" msgstr "Auf Straße zeigen" msgid "Northing" msgstr "Einnorden" msgid "Map follows Vehicle" msgstr "Karte folgt Fahrzeug" msgid "Plan with Waypoints" msgstr "Planung mit Wegpunkten" msgid "Maps" msgstr "Karten" msgid "Layout" msgstr "Erscheinungsbild" msgid "Height Profile" msgstr "Höhenprofil" msgid "Route Description" msgstr "Wegbeschreibung" msgid "Show Locale" msgstr "Lokalisierung anzeigen" msgid "Former Destinations" msgstr "Vorherige Ziele" msgid "- No former destinations available -" msgstr "- Keine vorherigen Ziele -" msgid "Message" msgstr "Benachrichtigung" msgid "Back" msgstr "Zurück" msgid "Back to map" msgstr "Zurück zur Karte" msgid "Main Menu" msgstr "Hauptmenü" msgid "House number" msgstr "Hausnummer" msgid "Next" msgstr "Vor" msgid "Prev" msgstr "Zurück" msgid "Return to route!" msgstr "Zurück zur Route!" #. warning told msgid "Look out! Camera!" msgstr "Achtung Blitzer!" #. warning told msgid "Please decrease your speed" msgstr "Bitte Geschwindigkeit verringern" msgid "partial match" msgstr "ungefähr" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Suche" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Städte" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Ziel setzen" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "Heruntergeladene Karten" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "Fertig in" msgid "Error downloading map!" msgstr "Fehler beim Kartendownload" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Nicht genug freier Speicher" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Fertig in" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Kartendownload" msgid "Vehicle Position" msgstr "Fahrzeugposition" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit gestartet" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit läuft" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Willkommen bei Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Vielen Dank für die Installation von Navit!\n" "\n" "Bitte zuerst im Menu \"Karten herunterladen\" auswählen und eine Karte für " "die gewünschte Region herunterladen. Die Kartendatei ist sehr groß, bitte " "Flatrate oder ähnliches aktivieren!\n" "\n" "Kartendaten: (c) OpenStreetMap contributors\n" "\n" "Viel Spaß mit Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Mehr Infos" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Vergrößern" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Verkleinern" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Karten herunterladen" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "POI ein/aus" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Navit beenden" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Sichern / Wiederherstellen" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Diese Karte löschen?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Laden:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Fehler beim Kartendownload" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Download der Karte abgebrochen" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Position noch nicht bekannt." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Karten passend zur aktuellen Position" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Adresse suchen" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Ziel eingeben" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Ungefähr" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Suche läuft..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Keine Adresse gefunden" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "lade Suchergebnisse" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Lädt Suchergebnisse" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Suche liefert kein Ergebnis!" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Keine Eingabe" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Neues Fahrziel:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Bitte auswählen" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Bitte eine SD Karte einlegen" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Sichern..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Sicherungsverzeichnis konnte nicht erstellt werden" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Sicherung Fehlgeschlagen" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Keine Sicherung gefunden" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Fehler beim Wiederherstellen" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Sicherung erfolgreich" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Sicherung Erfolgreich\n" "Navit bitte neustarten" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Backup nicht gefunden" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Wiederherstellen fehlgeschlagen" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Backup auswählen" #. Android resource: @strings/backup msgid "Backup" msgstr "Sichern" #. Android resource: @strings/restore msgid "Restore" msgstr "Wiederherstellen" msgid "Main menu" msgstr "Hauptmenü" msgid "" "Show\n" "Map" msgstr "" "Karte\n" "anzeigen" msgid "Settings" msgstr "Einstellungen" msgid "Tools" msgstr "Werkzeuge" msgid "Route" msgstr "Route" msgid "About" msgstr "Über" msgid "Actions" msgstr "Aktionen" msgid "" "Former\n" "Destinations" msgstr "" "Vorherige\n" "Ziele" msgid "Quit" msgstr "Ende" msgid "" "Stop\n" "Navigation" msgstr "" "Navigation\n" "beenden" msgid "Display" msgstr "Anzeige" msgid "Fullscreen" msgstr "Vollbild" msgid "Window Mode" msgstr "Fenstermodus" msgid "Description" msgstr "Beschreibung" msgid "" "Drop last \n" "Waypoint" msgstr "" "Letzten Wegpunkt\n" "entfernen" msgid "" "Drop next \n" "Waypoint" msgstr "" "Nächsten Wegpunkt\n" "entfernen" msgid "Satellite Status" msgstr "Satellitenstatus" msgid "NMEA Data" msgstr "NMEA Daten" msgid "car_shortest" msgstr "Auto kürzeste" msgid "car_avoid_tolls" msgstr "Auto ohne Maut" msgid "car_pedantic" msgstr "Auto pedantisch" msgid "horse" msgstr "Pferd" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "LKW" navit-0.5.0~svn5643+dfsg.1/po/de_CH.po.in000066400000000000000000000755711221777731700175440ustar00rootroot00000000000000# German (Switzerland) translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 08:49+0000\n" "Last-Translator: \n" "Language-Team: German (Switzerland) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" msgid "exit" msgstr "" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" navit-0.5.0~svn5643+dfsg.1/po/el.po.in000066400000000000000000001222201221777731700171620ustar00rootroot00000000000000# Greek translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Vassilis, 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-24 14:51+0000\n" "Last-Translator: aitolos \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Λειτουργία από τον πηγαίο κατάλογο\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ρύθμιση '%s' στο'%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "τρέχουσα" msgid "first" msgstr "πρώτος" msgid "second" msgstr "δεύτερος" msgid "third" msgstr "τρίτη" msgid "fourth" msgstr "τέταρτος" msgid "fifth" msgstr "πέμπτος" msgid "sixth" msgstr "έκτος" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "τρέχουσα έξοδο" msgid "first exit" msgstr "πρώτη έξοδο" msgid "second exit" msgstr "δεύτερη έξοδο" msgid "third exit" msgstr "τρίτη έξοδο" msgid "fourth exit" msgstr "τέταρτη έξοδο" msgid "fifth exit" msgstr "πέμπτη έξοδο" msgid "sixth exit" msgstr "έκτη έξοδο" #, c-format msgid "%d m" msgstr "%d μ" #, c-format msgid "in %d m" msgstr "σε %d μ" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d μέτρα" #, c-format msgid "in %d meters" msgstr "σε %d μέτρα" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d χιλιόμετρα" #, c-format msgid "in %d.%d kilometers" msgstr "σε %d %d χιλιόμετρα" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "Ένα χιλιόμετρο" msgstr[1] "%d χιλιόμετρα" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "σε ένα χιλιόμετρο" msgstr[1] "σε %d χιλιόμετρα" msgid "exit" msgstr "έξοδος" msgid "into the ramp" msgstr "στη ράμπα" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s στην οδό %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sστον %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sστην %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sστο %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s στην %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "δεξιά" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "αριστερά" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "ελαφρά " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "Κλειστά " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "πολύ κλειστά " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "άγνωστο " msgid "When possible, please turn around" msgstr "Όταν είναι δυνατόν, κάνε αναστροφή" msgid "Enter the roundabout soon" msgstr "Μπές στη κυκλική πορεία άμεσα" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "και βγείτε απο την κυκλική πορεία στην %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Εξοδος απο την κυκλική πορεία στην %s" #, c-format msgid "Follow the road for the next %s" msgstr "Ακολουθήστε το δρόμο για τα επόμενα %s" msgid "soon" msgstr "σύντομα" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Πάρτε τον %1$s δρόμο για το %2$s" #, c-format msgid "after %i roads" msgstr "μετά από %i δρόμους" msgid "now" msgstr "τώρα" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "στη συνέχεια πάρτε το %1$s δρόμο για το %2$s" msgid "error" msgstr "σφάλμα" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Στρίψτε %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "και στρίψτε %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Φτάσατε στον προορισμό σας %s" msgid "then you have reached your destination." msgstr "τότε έχετε φτάσει στον προορισμό σας." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Θέση" msgid "Command" msgstr "Εντολή" msgid "Length" msgstr "Μήκος" msgid "km" msgstr "χλμ" msgid "m" msgstr "μ" msgid "Time" msgstr "Χρόνος" msgid "Destination Length" msgstr "Απόσταση Προορισμού" msgid "Destination Time" msgstr "Χρόνος που απομένει" msgid "Roadbook" msgstr "Οδηγίες Διαδρομής" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Ορισμός ως αφετηρία" msgid "Set as destination" msgstr "Ορισμός ως προορισμός" msgid "Add as bookmark" msgstr "Προσθήκη ως σελιδοδείκτης" #, c-format msgid "Point 0x%x 0x%x" msgstr "Σημείο 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Συντεταγμένες οθόνης : %d %d" #. 020 msgid "Andorra" msgstr "Ανδόρα" #. 784 msgid "United Arab Emirates" msgstr "Ηνωμένα Αραβικά Εμιράτα" #. 004 msgid "Afghanistan" msgstr "Αφγανιστάν" #. 028 msgid "Antigua and Barbuda" msgstr "Αντίγκουα και Μπαρμπούντα" #. 660 msgid "Anguilla" msgstr "Ανγκίλα" #. 008 msgid "Albania" msgstr "Αλβανία" #. 051 msgid "Armenia" msgstr "Αρμενία" #. 530 msgid "Netherlands Antilles" msgstr "Ολλανδικές Αντίλλες" #. 024 msgid "Angola" msgstr "Ανγκόλα" #. 010 msgid "Antarctica" msgstr "Ανταρκτική" #. 032 msgid "Argentina" msgstr "Αργεντινή" #. 016 msgid "American Samoa" msgstr "Αμερικανική Σαμόα" #. 040 msgid "Austria" msgstr "Αυστρία" #. 036 msgid "Australia" msgstr "Αυστραλία" #. 533 msgid "Aruba" msgstr "Αρούμπα" #. 248 msgid "Aland Islands" msgstr "Νήσοι Όλαντ" #. 031 msgid "Azerbaijan" msgstr "Αζερμπαϊτζάν" #. 070 msgid "Bosnia and Herzegovina" msgstr "Βοσνία-Ερζεγοβίνη" #. 052 msgid "Barbados" msgstr "Μπαρμπέιντος" #. 050 msgid "Bangladesh" msgstr "Μπαγκλαντές" #. 056 msgid "Belgium" msgstr "Βέλγιο" #. 854 msgid "Burkina Faso" msgstr "Μπουρκίνα Φάσο" #. 100 msgid "Bulgaria" msgstr "Βουλγαρία" #. 048 msgid "Bahrain" msgstr "Μπαχρέιν" #. 108 msgid "Burundi" msgstr "Μπουρουντί" #. 204 msgid "Benin" msgstr "Μπενίν" #. 652 msgid "Saint Barthelemy" msgstr "Αγιος Βαρθολομαίος" #. 060 msgid "Bermuda" msgstr "Βερμούδες" #. 096 msgid "Brunei Darussalam" msgstr "Μπρουνέι Νταρουσαλάμ" #. 068 msgid "Bolivia" msgstr "Βολιβία" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Βραζιλία" #. 044 msgid "Bahamas" msgstr "Μπαχάμες" #. 064 msgid "Bhutan" msgstr "Μπουτάν" #. 074 msgid "Bouvet Island" msgstr "Νήσος Μπουβέ" #. 072 msgid "Botswana" msgstr "Μποτσουάνα" #. 112 msgid "Belarus" msgstr "Λευκορωσία" #. 084 msgid "Belize" msgstr "Μπελίζ" #. 124 msgid "Canada" msgstr "Καναδάς" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Νήσοι Κόκος (Κήλινγκ)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Δημοκρατία του Κονγκό" #. 140 msgid "Central African Republic" msgstr "Δημοκρατία Κεντρικής Αφρικής" #. 178 msgid "Congo" msgstr "Κονγκό" #. 756 msgid "Switzerland" msgstr "Ελβετία" #. 384 msgid "Cote d'Ivoire" msgstr "Ακτή Ελεφαντοστού" #. 184 msgid "Cook Islands" msgstr "Νήσοι Κουκ" #. 152 msgid "Chile" msgstr "Χιλή" #. 120 msgid "Cameroon" msgstr "Καμερούν" #. 156 msgid "China" msgstr "Κίνα" #. 170 msgid "Colombia" msgstr "Κολομβία" #. 188 msgid "Costa Rica" msgstr "Κόστα Ρίκα" #. 192 msgid "Cuba" msgstr "Κούβα" #. 132 msgid "Cape Verde" msgstr "Πράσινο Ακρωτήριο" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Νήσοι Χριστουγέννων" #. 196 msgid "Cyprus" msgstr "Κύπρος" #. 203 msgid "Czech Republic" msgstr "Δημοκρατία της Τσεχίας" #. 276 msgid "Germany" msgstr "Γερμανία" #. 262 msgid "Djibouti" msgstr "Τζιμπουτί" #. 208 msgid "Denmark" msgstr "Δανία" #. 212 msgid "Dominica" msgstr "Ντομίνικα" #. 214 msgid "Dominican Republic" msgstr "Δομινικανή Δημοκρατία" #. 012 msgid "Algeria" msgstr "Αλγερία" #. 218 msgid "Ecuador" msgstr "Εκουαδόρ" #. 233 msgid "Estonia" msgstr "Εσθονία" #. 818 msgid "Egypt" msgstr "Αίγυπτος" #. 732 msgid "Western Sahara" msgstr "Δυτική Σαχάρα" #. 232 msgid "Eritrea" msgstr "Ερυθραία" #. 724 msgid "Spain" msgstr "Ισπανία" #. 231 msgid "Ethiopia" msgstr "Αιθιοπία" #. 246 msgid "Finland" msgstr "Φινλανδία" #. 242 msgid "Fiji" msgstr "Νησιά Φίτζι" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Νήσοι Φώκλαντ (Μαλβίνες)" #. 583 msgid "Micronesia, Federated States of" msgstr "Μικρονησία, Ομόσπονδες Πολιτείες της" #. 234 msgid "Faroe Islands" msgstr "Νήσοι Φερόε" #. 250 msgid "France" msgstr "Γαλλία" #. 266 msgid "Gabon" msgstr "Γκαμπόν" #. 826 msgid "United Kingdom" msgstr "Ηνωμένο Βασίλειο" #. 308 msgid "Grenada" msgstr "Γρενάδα" #. 268 msgid "Georgia" msgstr "Γεωργία" #. 254 msgid "French Guiana" msgstr "Γαλλική Γουινέα" #. 831 msgid "Guernsey" msgstr "Νήσος Guernsey" #. 288 msgid "Ghana" msgstr "Γκάνα" #. 292 msgid "Gibraltar" msgstr "Γιβραλτάρ" #. 304 msgid "Greenland" msgstr "Γροιλανδία" #. 270 msgid "Gambia" msgstr "Γκάμπια" #. 324 msgid "Guinea" msgstr "Γουινέα" #. 312 msgid "Guadeloupe" msgstr "Γουαδελούπη" #. 226 msgid "Equatorial Guinea" msgstr "Ισημερινή Γουινέα" #. 300 msgid "Greece" msgstr "Ελλάδα" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Νότια Τζόρτζια και Νότιοι νήσοι Σάντουιτς" #. 320 msgid "Guatemala" msgstr "Γουατεμάλα" #. 316 msgid "Guam" msgstr "Γκουάμ" #. 624 msgid "Guinea-Bissau" msgstr "Γουινέα-Μπισσάου" #. 328 msgid "Guyana" msgstr "Γουιάνα" #. 344 msgid "Hong Kong" msgstr "Χονγκ Κονγκ" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Νήσος Χερντ και Νήσοι ΜακΝτόναλντ" #. 340 msgid "Honduras" msgstr "Ονδούρα" #. 191 msgid "Croatia" msgstr "Κροατία" #. 332 msgid "Haiti" msgstr "Αϊτή" #. 348 msgid "Hungary" msgstr "Ουγγαρία" #. 360 msgid "Indonesia" msgstr "Ινδονησία" #. 372 msgid "Ireland" msgstr "Ιρλανδία" #. 376 msgid "Israel" msgstr "Ισραήλ" #. 833 msgid "Isle of Man" msgstr "Αϊλ οφ Μαν" #. 356 msgid "India" msgstr "Ινδία" #. 086 msgid "British Indian Ocean Territory" msgstr "Βρετανικά Εδάφη Ινδικού Ωκεανού" #. 368 msgid "Iraq" msgstr "Ιράκ" #. 364 msgid "Iran, Islamic Republic of" msgstr "Ισλαμική Δημοκρατία του Ιράν" #. 352 msgid "Iceland" msgstr "Ισλανδία" #. 380 msgid "Italy" msgstr "Ιταλία" #. 832 msgid "Jersey" msgstr "Τζέρσεϋ" #. 388 msgid "Jamaica" msgstr "Τζαμάικα" #. 400 msgid "Jordan" msgstr "Ιορδανία" #. 392 msgid "Japan" msgstr "Ιαπωνία" #. 404 msgid "Kenya" msgstr "Κένυα" #. 417 msgid "Kyrgyzstan" msgstr "Κιργκιστάν" #. 116 msgid "Cambodia" msgstr "Καμπότζη" #. 296 msgid "Kiribati" msgstr "Κιριμπάτι" #. 174 msgid "Comoros" msgstr "Κομόρες" #. 659 msgid "Saint Kitts and Nevis" msgstr "Σαιντ Κίτς και Νέβις" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Κορέα, Λαϊκη Δημοκρατία της" #. 410 msgid "Korea, Republic of" msgstr "Κορέα, Δημοκρατία της" #. 414 msgid "Kuwait" msgstr "Κουβέιτ" #. 136 msgid "Cayman Islands" msgstr "Νήσοι Κέυμαν" #. 398 msgid "Kazakhstan" msgstr "Καζακστάν" #. 418 msgid "Lao People's Democratic Republic" msgstr "Λαϊκή Δημοκρατία του Λάος" #. 422 msgid "Lebanon" msgstr "Λίβανος" #. 662 msgid "Saint Lucia" msgstr "Αγία Λουκία" #. 438 msgid "Liechtenstein" msgstr "Λίχτενσταϊν" #. 144 msgid "Sri Lanka" msgstr "Σρι Λάνκα" #. 430 msgid "Liberia" msgstr "Λιβερία" #. 426 msgid "Lesotho" msgstr "Λεσότο" #. 440 msgid "Lithuania" msgstr "Λιθουανία" #. 442 msgid "Luxembourg" msgstr "Λουξεμβούργο" #. 428 msgid "Latvia" msgstr "Λεττονία" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Λυβική Αραβική Τζαμαχιρία" #. 504 msgid "Morocco" msgstr "Μαρόκο" #. 492 msgid "Monaco" msgstr "Μονακό" #. 498 msgid "Moldova, Republic of" msgstr "Δημοκρατία της Μολδαβίας" #. 499 msgid "Montenegro" msgstr "Μαυροβούνιο" #. 663 msgid "Saint Martin (French part)" msgstr "Άγιος Μαρτίνος (Γαλλικό τμήμα)" #. 450 msgid "Madagascar" msgstr "Μαδαγασκάρη" #. 584 msgid "Marshall Islands" msgstr "Νήσοι Μάρσαλ" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Π.Γ.Δ.Μ." #. 466 msgid "Mali" msgstr "Μάλι" #. 104 msgid "Myanmar" msgstr "Μιανμάρ" #. 496 msgid "Mongolia" msgstr "Μογγολία" #. 446 msgid "Macao" msgstr "Μακάο" #. 580 msgid "Northern Mariana Islands" msgstr "Νήσοι Βόρειες Μαριάνες" #. 474 msgid "Martinique" msgstr "Μαρτινίκα" #. 478 msgid "Mauritania" msgstr "Μαυριτανία" #. 500 msgid "Montserrat" msgstr "Μοντσεράτ" #. 470 msgid "Malta" msgstr "Μάλτα" #. 480 msgid "Mauritius" msgstr "Μαυρίκιος" #. 462 msgid "Maldives" msgstr "Μαλδίβες" #. 454 msgid "Malawi" msgstr "Μαλάουι" #. 484 msgid "Mexico" msgstr "Μεξικό" #. 458 msgid "Malaysia" msgstr "Μαλαισία" #. 508 msgid "Mozambique" msgstr "Μοζαμβίκη" #. 516 msgid "Namibia" msgstr "Ναμίμπια" #. 540 msgid "New Caledonia" msgstr "Νέα Καληδονία" #. 562 msgid "Niger" msgstr "Νίγηρας" #. 574 msgid "Norfolk Island" msgstr "Νήσοι Νόρφολκ" #. 566 msgid "Nigeria" msgstr "Νιγηρία" #. 558 msgid "Nicaragua" msgstr "Νικαράγουα" #. 528 msgid "Netherlands" msgstr "Ολλανδία" #. 578 msgid "Norway" msgstr "Νορβηγία" #. 524 msgid "Nepal" msgstr "Νεπάλ" #. 520 msgid "Nauru" msgstr "Ναουρού" #. 570 msgid "Niue" msgstr "Νιούε" #. 554 msgid "New Zealand" msgstr "Νέα Ζηλανδία" #. 512 msgid "Oman" msgstr "Ομάν" #. 591 msgid "Panama" msgstr "Παναμάς" #. 604 msgid "Peru" msgstr "Περού" #. 258 msgid "French Polynesia" msgstr "Γαλλική Πολυνησία" #. 598 msgid "Papua New Guinea" msgstr "Παπούα-Νέα Γουινέα" #. 608 msgid "Philippines" msgstr "Φιλιππίνες" #. 586 msgid "Pakistan" msgstr "Πακιστάν" #. 616 msgid "Poland" msgstr "Πολωνία" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Σεν Πιερ και Μικελόν" #. 612 msgid "Pitcairn" msgstr "Πίτκερν" #. 630 msgid "Puerto Rico" msgstr "Πόρτο Ρίκο" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Κατεχόμενα Παλαιστινιακά Εδάφη" #. 620 msgid "Portugal" msgstr "Πορτογαλία" #. 585 msgid "Palau" msgstr "Παλάου" #. 600 msgid "Paraguay" msgstr "Παραγουάη" #. 634 msgid "Qatar" msgstr "Κατάρ" #. 638 msgid "Reunion" msgstr "Ρεουνιόν" #. 642 msgid "Romania" msgstr "Ρουμανία" #. 688 msgid "Serbia" msgstr "Σερβία" #. 643 msgid "Russian Federation" msgstr "Ρωσική Ομοσπονδία" #. 646 msgid "Rwanda" msgstr "Ρουάντα" #. 682 msgid "Saudi Arabia" msgstr "Σαουδική Αραβία" #. 090 msgid "Solomon Islands" msgstr "Νήσοι Σολομώντος" #. 690 msgid "Seychelles" msgstr "Σεϋχέλλες" #. 736 msgid "Sudan" msgstr "Σουδάν" #. 752 msgid "Sweden" msgstr "Σουηδία" #. 702 msgid "Singapore" msgstr "Σινγκαπούρη" #. 654 msgid "Saint Helena" msgstr "Νήσος Αγίας Ελένης" #. 705 msgid "Slovenia" msgstr "Σλοβενία" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Νήσοι Σβάλμπαρντ και Γιαν Μάγιεν" #. 703 msgid "Slovakia" msgstr "Σλοβακία" #. 694 msgid "Sierra Leone" msgstr "Σιέρα Λεόνε" #. 674 msgid "San Marino" msgstr "Άγιος Μαρίνος" #. 686 msgid "Senegal" msgstr "Σενεγάλη" #. 706 msgid "Somalia" msgstr "Σομαλία" #. 740 msgid "Suriname" msgstr "Σουρινάμ" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome και Principe" #. 222 msgid "El Salvador" msgstr "Ελ Σαλβαδόρ" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Αραβική Δημοκρατία της Συρίας" #. 748 msgid "Swaziland" msgstr "Σουαζιλάνδη" #. 796 msgid "Turks and Caicos Islands" msgstr "Νήσοι Τούρκς και Καΐκος" #. 148 msgid "Chad" msgstr "Τσαντ" #. 260 msgid "French Southern Territories" msgstr "Γαλλικές Νότιες Περιοχές" #. 768 msgid "Togo" msgstr "Τόγκο" #. 764 msgid "Thailand" msgstr "Ταϊλάνδη" #. 762 msgid "Tajikistan" msgstr "Τατζικιστάν" #. 772 msgid "Tokelau" msgstr "Τοκελάου" #. 626 msgid "Timor-Leste" msgstr "Τιμόρ-Λέστε" #. 795 msgid "Turkmenistan" msgstr "Τουρκμενιστάν" #. 788 msgid "Tunisia" msgstr "Τυνησία" #. 776 msgid "Tonga" msgstr "Τόνγκα" #. 792 msgid "Turkey" msgstr "Τουρκία" #. 780 msgid "Trinidad and Tobago" msgstr "Τρίνινταντ και Τομπάγκο" #. 798 msgid "Tuvalu" msgstr "Τουβάλου" #. 158 msgid "Taiwan, Province of China" msgstr "Ταϊβάν, Επαρχία της Κίνας" #. 834 msgid "Tanzania, United Republic of" msgstr "Τανζανία, Ενωμένη Δημοκρατία της" #. 804 msgid "Ukraine" msgstr "Ουκρανία" #. 800 msgid "Uganda" msgstr "Ουγκάντα" #. 581 msgid "United States Minor Outlying Islands" msgstr "Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών" #. 840 msgid "United States" msgstr "Ηνωμένες Πολιτείες της Αμερικής" #. 858 msgid "Uruguay" msgstr "Ουρουγουάη" #. 860 msgid "Uzbekistan" msgstr "Ουζμπεκιστάν" #. 336 msgid "Holy See (Vatican City State)" msgstr "Αγία Έδρα (Κράτος της Πόλης του Βατικανού)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Άγιος Βικέντιος και Γρεναδίνες" #. 862 msgid "Venezuela" msgstr "Βενεζουέλα" #. 092 msgid "Virgin Islands, British" msgstr "Παρθένοι Νήσοι, Βρετανικές" #. 850 msgid "Virgin Islands, U.S." msgstr "Παρθένοι Νήσοι, Η.Π.A." #. 704 msgid "Viet Nam" msgstr "Βιετνάμ" #. 548 msgid "Vanuatu" msgstr "Βανουάτου" #. 876 msgid "Wallis and Futuna" msgstr "Νήσοι Γουόλις και Φουτούνα" #. 882 msgid "Samoa" msgstr "Σαμόα" #. 887 msgid "Yemen" msgstr "Υεμένη" #. 175 msgid "Mayotte" msgstr "Μαγιότ" #. 710 msgid "South Africa" msgstr "Νότιος Αφρική" #. 894 msgid "Zambia" msgstr "Ζάμπια" #. 716 msgid "Zimbabwe" msgstr "Ζιμπάμπουε" msgid "* Unknown, add is_in tags to those cities" msgstr "* Άγνωστη, προσθέστε ετικέτες is_in σε αυτές τις πόλεις" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Σημείο Χάρτη" msgid "Car" msgstr "Αυτοκίνητο" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Χώρα" msgid "Postal" msgstr "Ταχυδρομική" msgid "Town" msgstr "Πόλη" msgid "District" msgstr "Επαρχία" msgid "Street" msgstr "Οδός" msgid "Number" msgstr "Αριθμός" msgid "Enter Destination" msgstr "Εισάγετε προορισμό" msgid "Zip Code" msgstr "Ταχ. Κώδικας" msgid "City" msgstr "Πόλη" msgid "District/Township" msgstr "Επαρχία/Οικισμός" msgid "Map" msgstr "Χάρτης" msgid "Bookmark" msgstr "Σελιδοδείκτης" msgid "Destination" msgstr "Προορισμός" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Προβολή" msgid "_Route" msgstr "Διαδρομή" msgid "_Former Destinations" msgstr "Προγενέστερες διαδρομές" msgid "_Bookmarks" msgstr "Σελιδοδείκτες" msgid "_Map" msgstr "Χάρτης" msgid "_Layout" msgstr "Διάταξη" msgid "_Projection" msgstr "Προβολή :" msgid "_Vehicle" msgstr "Όχημα" msgid "Zoom_Out" msgstr "Σμίκρυνση" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Μεγέθυνση" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Επαναϋπολογισμός" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Πληροφορίες" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Διακοπή πλοήγησης" msgid "Test" msgstr "Δοκιμή" msgid "_Quit" msgstr "_Έξοδος" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Κλείδωμα στο δρόμο" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Οδηγίες Διαδρομής" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Αυτόματο Ζουμ" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Πλήρης Οθόνη" msgid "Data" msgstr "Δεδομένα" msgid "N" msgstr "Β" msgid "NE" msgstr "ΒΑ" msgid "E" msgstr "Α" msgid "SE" msgstr "ΝΑ" msgid "S" msgstr "Ν" msgid "SW" msgstr "ΝΔ" msgid "W" msgstr "Δ" msgid "NW" msgstr "ΒΔ" #. Android resource: @strings/no msgid "No" msgstr "Όχι" msgid "2D" msgstr "2Δ" msgid "3D" msgstr "3Δ" msgid "OT" msgstr "ΟΤ" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Διαδρομή %4.0fχλμ Χρόνος που απομένει %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Διαδρομή 0000χλμ Χρόνος που απομένει 0+00:00" msgid "Help" msgstr "Βοήθεια" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Επισκόπηση σε Φυλλομετρητή" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Οδοί" msgid "House numbers" msgstr "Αριθμοί σπιτιών" msgid "View Attributes" msgstr "Προβολή Ιδιοτήτων" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Σημεία Ενδιαφέροντος" msgid "View on map" msgstr "Προβολή στο χάρτη" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Αποκοπή Σελιδοδείκτη" msgid "Copy Bookmark" msgstr "Αντιγραφή Σελιδοδείκτη" msgid "Rename Bookmark" msgstr "Μετονομασία Σελιδοδείκτη" msgid "Paste Bookmark" msgstr "Επικόληση Σελιδοδείκτη" msgid "Delete Bookmark" msgstr "Διαγραφή Σελιδοδείκτη" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Σελιδοδείκτες" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Πρόσθεση φακέλου Σελιδοδείκτη" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Επικόληση σελιδοδείκτη" #, c-format msgid "Bookmark %s" msgstr "Σελιδοδείκτης %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Εμφάνιση Κατάστασης Δορυφόρων" msgid " Elevation " msgstr " Υψόμετρο " msgid " Azimuth " msgstr " Αζιμούθιο " msgid "Show NMEA Data" msgstr "Εμφάνιση Δεδομένων ΝΜΕΑ" msgid "car" msgstr "αυτοκίνητο" msgid "bike" msgstr "ποδήλατο" msgid "pedestrian" msgstr "Πεζός" #, c-format msgid "Current profile: %s" msgstr "Τρέχον προφίλ: %s" #, c-format msgid "Change profile to: %s" msgstr "Αλλαγή προφίλ σε: %s" msgid "Set as active" msgstr "Καθορισμός ως ενεργό" msgid "Show Satellite status" msgstr "Εμφάνιση Κατάστασης Δορυφόρων" msgid "Show NMEA data" msgstr "Εμφάνιση δεδομένων ΝΜΕΑ" msgid "Add Bookmark" msgstr "Προσθήκη σελιδοδείκτη" msgid "Rename" msgstr "Μετονομασία" msgid "About Navit" msgstr "Περί του Navit" #. Authors msgid "By" msgstr "Από" #. Contributors msgid "And all the Navit Team" msgstr "Και όλη την ομάδα του Navit" msgid "members and contributors." msgstr "μέλη και συνεισφέροντες" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Όχημα" msgid "Rules" msgstr "Κανόνες" msgid "Lock on road" msgstr "Κλείδωμα στο δρόμο" msgid "Northing" msgstr "Χάρτης στο βορρά" msgid "Map follows Vehicle" msgstr "Ο χάρτης ακολουθεί το Όχημα" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Χάρτες" msgid "Layout" msgstr "Διάταξη" msgid "Height Profile" msgstr "Ύψος προφίλ" msgid "Route Description" msgstr "Περιγραφή Διαδρομής" msgid "Show Locale" msgstr "Eμφάνιση Εντοπιότητας" msgid "Former Destinations" msgstr "Προγενέστερες διαδρομές" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Μήνυμα" msgid "Back" msgstr "Προηγ." msgid "Back to map" msgstr "Πίσω στο χάρτη" msgid "Main Menu" msgstr "Κύριο Μενού" msgid "House number" msgstr "Αριθμός σπιτιού" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Θέση Οχήματος" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Κύριο Μενού" msgid "" "Show\n" "Map" msgstr "" "Εμφάνιση\n" "Χάρτη" msgid "Settings" msgstr "Ρυθμίσεις" msgid "Tools" msgstr "Εργαλεία" msgid "Route" msgstr "Διαδρομή" msgid "About" msgstr "Περί" msgid "Actions" msgstr "Ενέργειες" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Έξοδος" msgid "" "Stop\n" "Navigation" msgstr "Διακοπή" msgid "Display" msgstr "Προβολή" msgid "Fullscreen" msgstr "Πλήρης Οθόνη" msgid "Window Mode" msgstr "Λειτουργία παραθύρων" msgid "Description" msgstr "Περιγραφή" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "άλογο" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Σε %s, μπες σε κυκλική πορεία" #~ msgid "Cursor" #~ msgstr "Δρομέας" #~ msgid "%d.%d kilometer" #~ msgstr "%d %d χιλιόμετρα" #~ msgid " PRN " #~ msgstr " PRN " #~ msgid " SNR " #~ msgstr " SNR " navit-0.5.0~svn5643+dfsg.1/po/en_AU.po.in000066400000000000000000001101221221777731700175470ustar00rootroot00000000000000# English (Australia) translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # Athol Mullen, 2010 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-09-12 05:53+0000\n" "Last-Translator: Athol Mullen \n" "Language-Team: English (Australia) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Running from source directory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setting '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroth" msgid "first" msgstr "first" msgid "second" msgstr "second" msgid "third" msgstr "third" msgid "fourth" msgstr "fourth" msgid "fifth" msgstr "fifth" msgid "sixth" msgstr "sixth" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zeroth exit" msgid "first exit" msgstr "first exit" msgid "second exit" msgstr "second exit" msgid "third exit" msgstr "third exit" msgid "fourth exit" msgstr "fourth exit" msgid "fifth exit" msgstr "fifth exit" msgid "sixth exit" msgstr "sixth exit" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "in %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metres" #, c-format msgid "in %d meters" msgstr "in %d metres" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometres" #, c-format msgid "in %d.%d kilometers" msgstr "in %d.%d kilometres" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "one kilometre" msgstr[1] "%d kilometres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in one kilometre" msgstr[1] "in %d kilometres" msgid "exit" msgstr "exit" msgid "into the ramp" msgstr "into the ramp" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sinto the street %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sinto the %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sinto the %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sinto the %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinto the %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "right" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "left" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "easily " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "strongly " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "really strongly " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "unknown " msgid "When possible, please turn around" msgstr "When possible, please turn around" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "then leave the roundabout at the %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Leave the roundabout at the %s" #, c-format msgid "Follow the road for the next %s" msgstr "Follow the road for the next %s" msgid "soon" msgstr "soon" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Take the %1$s road to the %2$s" #, c-format msgid "after %i roads" msgstr "after %i roads" msgid "now" msgstr "now" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "then take the %1$s road to the %2$s" msgid "error" msgstr "error" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turn %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "then turn %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "You have reached your destination %s" msgid "then you have reached your destination." msgstr "then you will have reached your destination" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Command" msgid "Length" msgstr "Length" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Time" msgid "Destination Length" msgstr "Destination Length" msgid "Destination Time" msgstr "Destination Time" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Set as position" msgid "Set as destination" msgstr "Set as destination" msgid "Add as bookmark" msgstr "Add as bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Screen coord : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Island" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Democratic Republic of the" #. 140 msgid "Central African Republic" msgstr "Central African Republic" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Switzerland" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire (Ivory Coast)" #. 184 msgid "Cook Islands" msgstr "Cook Islands" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Czech Republic" #. 276 msgid "Germany" msgstr "Germany" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Western Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spain" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "United Kingdom" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Greece" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Italy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Cambodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Democratic People's Republic of" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republic of" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman Islands" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libyan Arab Jamahiriya" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall Islands" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Netherlands" #. 578 msgid "Norway" msgstr "Norway" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russian Federation" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Islands" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkey" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Province of China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "United States" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Unknown, add is_in tags to those cities" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Car" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Country" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Town" msgid "District" msgstr "District" msgid "Street" msgstr "Street" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Enter Destination" msgid "Zip Code" msgstr "Post Code" msgid "City" msgstr "City" msgid "District/Township" msgstr "District/Township" msgid "Map" msgstr "Map" msgid "Bookmark" msgstr "Bookmark" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Display" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Former Destinations" msgid "_Bookmarks" msgstr "Bookmarks" msgid "_Map" msgstr "Map" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Vehicle" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "Decrease zoom level" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "Increase zoom level" msgid "_Recalculate" msgstr "Recalculate" msgid "Redraw map" msgstr "Redraw map" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "Set destination" msgid "Opens address search dialog" msgstr "Opens address search dialogue" msgid "_Stop Navigation" msgstr "Stop Navigation" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quit" msgid "Quit the application" msgstr "Quit the application" msgid "Show position _cursor" msgstr "Show position cursor" msgid "_Lock on Road" msgstr "Lock on Road" msgid "_Keep orientation to the North" msgstr "Keep orientation to the North" msgid "Switches map orientation to the north or the vehicle" msgstr "Switches map orientation to the north or the vehicle" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "Show/hide route description" msgid "_Autozoom" msgstr "AutoZoom" msgid "Enable/disable automatic zoom level changing" msgstr "Enable/disable automatic zoom level changing" msgid "_Fullscreen" msgstr "FullScreen" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Help" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "View in Browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Streets" msgid "House numbers" msgstr "House numbers" msgid "View Attributes" msgstr "View Attributes" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "View on map" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cut Bookmark" msgid "Copy Bookmark" msgstr "Copy Bookmark" msgid "Rename Bookmark" msgstr "Rename Bookmark" msgid "Paste Bookmark" msgstr "Paste Bookmark" msgid "Delete Bookmark" msgstr "Delete Bookmark" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bookmarks" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Add Bookmark folder" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Paste bookmark" #, c-format msgid "Bookmark %s" msgstr "Bookmark %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Show Satellite Status" msgid " Elevation " msgstr " Elevation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Show NMEA Data" msgid "car" msgstr "car" msgid "bike" msgstr "bike" msgid "pedestrian" msgstr "pedestrian" #, c-format msgid "Current profile: %s" msgstr "Current profile: %s" #, c-format msgid "Change profile to: %s" msgstr "Change profile to: %s" msgid "Set as active" msgstr "Set as active" msgid "Show Satellite status" msgstr "Show Satellite status" msgid "Show NMEA data" msgstr "Show NMEA data" msgid "Add Bookmark" msgstr "Add Bookmark" msgid "Rename" msgstr "Rename" msgid "About Navit" msgstr "About Navit" #. Authors msgid "By" msgstr "By" #. Contributors msgid "And all the Navit Team" msgstr "And all the Navit Team" msgid "members and contributors." msgstr "members and contributors." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Rules" msgid "Lock on road" msgstr "Lock on road" msgid "Northing" msgstr "Northing" msgid "Map follows Vehicle" msgstr "Map follows vehicle" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Maps" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Height Profile" msgid "Route Description" msgstr "Route Description" msgid "Show Locale" msgstr "Show Locale" msgid "Former Destinations" msgstr "Former Destinations" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Message" msgid "Back" msgstr "Back" msgid "Back to map" msgstr "Back to map" msgid "Main Menu" msgstr "Main Menu" msgid "House number" msgstr "House number" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Vehicle Position" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Main menu" msgid "" "Show\n" "Map" msgstr "" "Show\n" "Map" msgid "Settings" msgstr "Settings" msgid "Tools" msgstr "Tools" msgid "Route" msgstr "Route" msgid "About" msgstr "About" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Quit" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "Navigation" msgid "Display" msgstr "Display" msgid "Fullscreen" msgstr "FullScreen" msgid "Window Mode" msgstr "Window Mode" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "horse" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Enter the roundabout soon and leave it at the %s" #~ msgstr "Enter the roundabout soon and leave it at the %s" #~ msgid "In %s, enter the roundabout" #~ msgstr "In %s, enter the roundabout" navit-0.5.0~svn5643+dfsg.1/po/en_GB.po.in000066400000000000000000001075711221777731700175500ustar00rootroot00000000000000# English (United Kingdom) translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Jeff Bailes 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-29 13:38+0000\n" "Last-Translator: Matthew Gall \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Running from source directory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setting '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroth" msgid "first" msgstr "first" msgid "second" msgstr "second" msgid "third" msgstr "third" msgid "fourth" msgstr "fourth" msgid "fifth" msgstr "fifth" msgid "sixth" msgstr "sixth" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zeroth exit" msgid "first exit" msgstr "first exit" msgid "second exit" msgstr "second exit" msgid "third exit" msgstr "third exit" msgid "fourth exit" msgstr "fourth exit" msgid "fifth exit" msgstr "fifth exit" msgid "sixth exit" msgstr "sixth exit" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "in %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metres" #, c-format msgid "in %d meters" msgstr "in %d metres" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometres" #, c-format msgid "in %d.%d kilometers" msgstr "in %d.%d kilometres" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "one kilometre" msgstr[1] "%d kilometres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in one kilometre" msgstr[1] "in %d kilometres" msgid "exit" msgstr "exit" msgid "into the ramp" msgstr "onto the slip road" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sonto the street %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sonto the %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sonto the %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sonto the %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sonto the %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "right" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "left" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "easily " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "strongly " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "really strongly " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "unknown " msgid "When possible, please turn around" msgstr "When possible, please turn around" msgid "Enter the roundabout soon" msgstr "Enter the roundabout soon" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "then leave the roundabout at the %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Leave the roundabout at the %s" #, c-format msgid "Follow the road for the next %s" msgstr "Follow the road for the next %s" msgid "soon" msgstr "soon" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Take the %1$s road to the %2$s" #, c-format msgid "after %i roads" msgstr "after %i roads" msgid "now" msgstr "now" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "then take the %1$s road to the %2$s" msgid "error" msgstr "error" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turn %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "then turn %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "You have reached your destination %s" msgid "then you have reached your destination." msgstr "then you have reached your destination" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Command" msgid "Length" msgstr "Length" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Time" msgid "Destination Length" msgstr "Destination Length" msgid "Destination Time" msgstr "Destination Time" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Set as position" msgid "Set as destination" msgstr "Set as destination" msgid "Add as bookmark" msgstr "Add as bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Screen coord : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Island" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Democratic Republic of the" #. 140 msgid "Central African Republic" msgstr "Central African Republic" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Switzerland" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Cook Islands" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Czech Republic" #. 276 msgid "Germany" msgstr "Germany" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Western Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spain" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "United Kingdom" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Greece" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Italy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Cambodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Democratic People's Republic of" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republic of" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman Islands" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libyan Arab Jamahiriya" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall Islands" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Netherlands" #. 578 msgid "Norway" msgstr "Norway" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russian Federation" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Islands" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkey" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Province of China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "United States" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Unknown, add is_in tags to those cities" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Car" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Country" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Town" msgid "District" msgstr "District" msgid "Street" msgstr "Street" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Enter Destination" msgid "Zip Code" msgstr "Post Code" msgid "City" msgstr "City" msgid "District/Township" msgstr "District/Township" msgid "Map" msgstr "Map" msgid "Bookmark" msgstr "Bookmark" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Display" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Former Destinations" msgid "_Bookmarks" msgstr "Bookmarks" msgid "_Map" msgstr "Map" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Vehicle" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalculate" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop navigation" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quit" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr " Lock on road" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Fullscreen" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "QT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Help" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "View in browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Streets" msgid "House numbers" msgstr "House numbers" msgid "View Attributes" msgstr "View attributes" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "View on map" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cut bookmark" msgid "Copy Bookmark" msgstr "Copy bookmark" msgid "Rename Bookmark" msgstr "Rename bookmark" msgid "Paste Bookmark" msgstr "Paste bookmark" msgid "Delete Bookmark" msgstr "Delete bookmark" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bookmarks" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Add bookmark folder" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Paste bookmark" #, c-format msgid "Bookmark %s" msgstr "Bookmark %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Show satellite status" msgid " Elevation " msgstr " Elevation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Show NMEA data" msgid "car" msgstr "car" msgid "bike" msgstr "bike" msgid "pedestrian" msgstr "pedestrian" #, c-format msgid "Current profile: %s" msgstr "Current profile: %s" #, c-format msgid "Change profile to: %s" msgstr "Change profile to: %s" msgid "Set as active" msgstr "Set as active" msgid "Show Satellite status" msgstr "Show satellite status" msgid "Show NMEA data" msgstr "Show NMEA data" msgid "Add Bookmark" msgstr "Add bookmark" msgid "Rename" msgstr "Rename" msgid "About Navit" msgstr "About Navit" #. Authors msgid "By" msgstr "By" #. Contributors msgid "And all the Navit Team" msgstr "And all the Navit Team" msgid "members and contributors." msgstr "members and contributors." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Rules" msgid "Lock on road" msgstr "Lock on road" msgid "Northing" msgstr " Orient map North" msgid "Map follows Vehicle" msgstr " Map follows vehicle" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Maps" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Height Profile" msgid "Route Description" msgstr "Route Description" msgid "Show Locale" msgstr "Show Locale" msgid "Former Destinations" msgstr "Former Destinations" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Message" msgid "Back" msgstr "Back" msgid "Back to map" msgstr "Back to map" msgid "Main Menu" msgstr "Main Menu" msgid "House number" msgstr "House number" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Vehicle Position" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Main Menu" msgid "" "Show\n" "Map" msgstr "Show Map" msgid "Settings" msgstr "Settings" msgid "Tools" msgstr "Tools" msgid "Route" msgstr "Route" msgid "About" msgstr "About" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Quit" msgid "" "Stop\n" "Navigation" msgstr "Stop" msgid "Display" msgstr "Display" msgid "Fullscreen" msgstr "Fullscreen" msgid "Window Mode" msgstr "Window Mode" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "horse" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "In %s, enter the roundabout" #~ msgid "Cursor" #~ msgstr "Cursor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometre" #~ msgid " SNR " #~ msgstr " SNR " #~ msgid " PRN " #~ msgstr " PRN " navit-0.5.0~svn5643+dfsg.1/po/eo.po.in000066400000000000000000000761651221777731700172050ustar00rootroot00000000000000# Esperanto translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # OlivierWeb, , 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 20:37+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nula" msgid "first" msgstr "unua" msgid "second" msgstr "dua" msgid "third" msgstr "tria" msgid "fourth" msgstr "kvara" msgid "fifth" msgstr "kvina" msgid "sixth" msgstr "sesa" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metroj" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "unu kilometro" msgstr[1] "%d kilometroj" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" msgid "exit" msgstr "" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "dekstren" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "maldekstren" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "facile " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "baldaŭ" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "nun" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "eraro" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "Komando" msgid "Length" msgstr "Longo" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Horo" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andoro" #. 784 msgid "United Arab Emirates" msgstr "Unuiĝintaj Arabaj Emirlandoj" #. 004 msgid "Afghanistan" msgstr "Afganio" #. 028 msgid "Antigua and Barbuda" msgstr "Antigvo-Barbudo" #. 660 msgid "Anguilla" msgstr "Angvilo" #. 008 msgid "Albania" msgstr "Albanio" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "Legosignoj" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Legosignoj" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" navit-0.5.0~svn5643+dfsg.1/po/es.po.in000066400000000000000000001135411221777731700171770ustar00rootroot00000000000000# Spanish translations for navit # Copyright (C) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Chris Eubank 2007 # Emilio Gómez Fernández 2008 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2013-04-20 00:00+0000\n" "Last-Translator: Mariano Muñoz \n" "Language-Team: Chris Eubank \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgid "Running from source directory\n" msgstr "Ejecutando desde el directorio fuente\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "configurando '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "cero" msgid "first" msgstr "primera" msgid "second" msgstr "segunda" msgid "third" msgstr "tercera" msgid "fourth" msgstr "cuarta" msgid "fifth" msgstr "quinta" msgid "sixth" msgstr "sexta" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "salida cero" msgid "first exit" msgstr "primera salida" msgid "second exit" msgstr "segunda salida" msgid "third exit" msgstr "tercera salida" msgid "fourth exit" msgstr "cuarta salida" msgid "fifth exit" msgstr "quinta salida" msgid "sixth exit" msgstr "sexta salida" #, c-format msgid "%d m" msgstr "%d metros" #, c-format msgid "in %d m" msgstr "en %d metros" #, c-format msgid "%d feet" msgstr "%d pies" #, c-format msgid "in %d feet" msgstr "en %d pies" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "en %d metros" #, c-format msgid "%d.%d miles" msgstr "%d,%d millas" #, c-format msgid "in %d.%d miles" msgstr "en %d,%d millas" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilómetros" #, c-format msgid "in %d.%d kilometers" msgstr "en %d,%d kilómetros" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "una milla" msgstr[1] "%d millas" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "en una milla" msgstr[1] "en %d millas" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilómetro" msgstr[1] "%d kilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "en un kilómetro" msgstr[1] "en %d kilómetros" msgid "exit" msgstr "salir" msgid "into the ramp" msgstr "en la salida" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s en la calle %s %s %s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s en el %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s en la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s en %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s en la %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "a la derecha" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "a la izquierda" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "ligeramente " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "bruscamente " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "de forma muy pronunciada " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "desconocido " msgid "When possible, please turn around" msgstr "Dé la vuelta cuando sea posible" msgid "Enter the roundabout soon" msgstr "Entre en la próxima rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Entre en la rotonda %s" #, c-format msgid "then leave the roundabout at the %s" msgstr "después salga de la rotonda por la %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Salga de la rotonda por la %s" #, c-format msgid "Follow the road for the next %s" msgstr "Continúe en esta carretera durante %s" msgid "soon" msgstr "próximamente" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tome la %1$s carretera %2$s" #, c-format msgid "after %i roads" msgstr "después de %i carreteras" msgid "now" msgstr "ahora" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "entonces tome la %1$s salida %2$s" msgid "error" msgstr "error" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Gire %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "luego gire %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Ha llegado a su destino %s" msgid "then you have reached your destination." msgstr "entonces ha llegado a su destino." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posición" msgid "Command" msgstr "Orden" msgid "Length" msgstr "Longitud" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tiempo" msgid "Destination Length" msgstr "Distancia a destino" msgid "Destination Time" msgstr "Tiempo a destino" msgid "Roadbook" msgstr "Guía" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Definir como origen" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Agregar como favorito" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenadas de pantalla : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afganistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua y Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antillas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Islas de Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbaiyán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia y Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benín" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolomé" #. 060 msgid "Bermuda" msgstr "Bermudas" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bután" #. 074 msgid "Bouvet Island" msgstr "Isla Bouvet" #. 072 msgid "Botswana" msgstr "Botsuana" #. 112 msgid "Belarus" msgstr "Bielorrusia" #. 084 msgid "Belize" msgstr "Belice" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Islas de Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democrática del" #. 140 msgid "Central African Republic" msgstr "República Centroafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suiza" #. 384 msgid "Cote d'Ivoire" msgstr "Costa de Marfil" #. 184 msgid "Cook Islands" msgstr "Islas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerún" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Isla Natividad" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemania" #. 262 msgid "Djibouti" msgstr "República de Yibuti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Argelia" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipto" #. 732 msgid "Western Sahara" msgstr "Sahara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "España" #. 231 msgid "Ethiopia" msgstr "Etiopía" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiyi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Islas Malvinas" #. 583 msgid "Micronesia, Federated States of" msgstr "Estados Federados de Micronesia" #. 234 msgid "Faroe Islands" msgstr "Islas Feroe" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "Gabón" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guayana Francesa" #. 831 msgid "Guernsey" msgstr "Guernesey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Ecuatorial" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Islas Georgias del Sur y Sandwich del Sur" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guayana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Islas Heard y McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croacia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungría" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isla de Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territorio Británico en el Océano Indico" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japón" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirguistán" #. 116 msgid "Cambodia" msgstr "Camboya" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoras" #. 659 msgid "Saint Kitts and Nevis" msgstr "San Cristóbal y Nieves" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, República Democrática Popular de" #. 410 msgid "Korea, Republic of" msgstr "Corea, República de" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Islas Caimán" #. 398 msgid "Kazakhstan" msgstr "Kazajstán" #. 418 msgid "Lao People's Democratic Republic" msgstr "República Democrática Popular Lao" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lucía" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libia" #. 504 msgid "Morocco" msgstr "Marruecos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, República de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "San Martín (zona francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Islas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Antigua República Yugoslava de Macedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Islas Marianas del Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricio" #. 462 msgid "Maldives" msgstr "Maldivas" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nueva Caledonia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Isla Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Países Bajos" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nueva Zelanda" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinesia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papúa Nueva Guinea" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Pakistán" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "San Pedro y Miquelón" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Territorio Palestino Ocupado" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Catar" #. 638 msgid "Reunion" msgstr "Reunión" #. 642 msgid "Romania" msgstr "Rumania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federación de Rusia" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudita" #. 090 msgid "Solomon Islands" msgstr "Islas Salomón" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Suecia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard y Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovaquia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leona" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Santo Tomé y Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe de Siria" #. 748 msgid "Swaziland" msgstr "Suazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Islas Turcas y Caicos" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "Territorios Australes Franceses" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Tayikistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Oriental" #. 795 msgid "Turkmenistan" msgstr "Turkmenistán" #. 788 msgid "Tunisia" msgstr "Túnez" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquía" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad y Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwán, Provincia de China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, República Unida de" #. 804 msgid "Ukraine" msgstr "Ucrania" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Islas Ultramarinas Menores de los Estados Unidos" #. 840 msgid "United States" msgstr "Estados Unidos" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Ciudad Estado del Vaticano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente y las Granadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Islas Vírgenes, Británicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Islas Vírgenes, EE.UU." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis y Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sudáfrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabue" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconocido, añadir etiquetas is_in a estas ciudades" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "No hay fichero de configuración navit.xml, encontrado navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Error cargando el fichero de configuración '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Usando el fichero de configuración '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "calle desconocida" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Vehículo sin nombre" msgid "Failed to write bookmarks file" msgstr "Error al escribir el fichero de marcadores" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punto del Mapa" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Pueblo" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Calle" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introducir destino" msgid "Zip Code" msgstr "Código postal" msgid "City" msgstr "Ciudad" msgid "District/Township" msgstr "Distrito" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Visualizar" msgid "_Route" msgstr "_Ruta" msgid "_Former Destinations" msgstr "Destinos _anteriores" msgid "_Bookmarks" msgstr "_Favoritos" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "D_iseño" msgid "_Projection" msgstr "_Proyección" msgid "_Vehicle" msgstr "_Vehículo" msgid "Zoom_Out" msgstr "A_lejar" msgid "Decrease zoom level" msgstr "Reducir el nivel de zoom" msgid "Zoom_In" msgstr "A_umentar" msgid "Increase zoom level" msgstr "Aumentar el nivel de zoom" msgid "_Recalculate" msgstr "_Recalcular" msgid "Redraw map" msgstr "Redibujar mapa" msgid "_Info" msgstr "_Información" msgid "Set _destination" msgstr "_Fijar destino" msgid "Opens address search dialog" msgstr "Abre el dialogo de busqueda de dirección" msgid "_Stop Navigation" msgstr "_Detener navegación" msgid "Test" msgstr "Prueba" msgid "_Quit" msgstr "_Salir" msgid "Quit the application" msgstr "Salir de la aplicación" msgid "Show position _cursor" msgstr "_Mostrar posición del cursor" msgid "_Lock on Road" msgstr "_Bloqueo en la ruta" msgid "_Keep orientation to the North" msgstr "Mantener _orientación al Norte" msgid "Switches map orientation to the north or the vehicle" msgstr "Cambia la orientación del mapa entre el norte y el vehículo" msgid "_Roadbook" msgstr "Guía" msgid "Show/hide route description" msgstr "Mostrar/ocultar descripción de la ruta" msgid "_Autozoom" msgstr "_Autoampliar" msgid "Enable/disable automatic zoom level changing" msgstr "Activa/desactiva nivel de zoom automático" msgid "_Fullscreen" msgstr "Pantalla completa" msgid "Data" msgstr "Datos" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d TEL" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 TEL" msgid "Help" msgstr "Ayuda" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ver en el navegador" msgid "Item type" msgstr "Tipo de objeto" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Calles" msgid "House numbers" msgstr "Números de portal" msgid "View Attributes" msgstr "Ver atributos" msgid "Set as position (and deactivate vehicle)" msgstr "Definir como origen (y desactivar el vehículo)" msgid "POIs" msgstr "PDIs" msgid "View on map" msgstr "Ver en el mapa" msgid "Remove search results from the map" msgstr "Quitar los resultados de búsqueda del mapa" msgid "Show results on the map" msgstr "Mostrar los resultados en el mapa" msgid "Cut Bookmark" msgstr "Cortar marcador" msgid "Copy Bookmark" msgstr "Copiar marcador" msgid "Rename Bookmark" msgstr "Renombrar marcador" msgid "Paste Bookmark" msgstr "Pegar marcador" msgid "Delete Bookmark" msgstr "Eliminar marcador" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Favoritos" msgid "Bookmarks as waypoints" msgstr "Marcadores como puntos de ruta" msgid "Save waypoints" msgstr "Guardar puntos de ruta" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "Borrar carpeta" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Añadir carpeta de marcadores" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Pegar marcador" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "Descargar %s" msgid "Map Download" msgstr "Descargar mapa" msgid "Active" msgstr "Activo" msgid "Download Enabled" msgstr "Derscaga activada" msgid "Download completely" msgstr "Descargar completo" msgid "Show Satellite Status" msgstr "Mostrar estado de satélite" msgid " Elevation " msgstr " Elevación " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Mostar datos NMEA" msgid "car" msgstr "automóvil" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "peatón" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Cambiar perfil a: %s" msgid "Set as active" msgstr "Establecer como activo" msgid "Show Satellite status" msgstr "Mostrar estado de satélite" msgid "Show NMEA data" msgstr "Mostar datos NMEA" msgid "Add Bookmark" msgstr "Añadir marcador" msgid "Rename" msgstr "Renombrar" msgid "About Navit" msgstr "Acerca de Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "Y todo el equipo de Navit" msgid "members and contributors." msgstr "miembros y colaboradores" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehículo" msgid "Rules" msgstr "Reglas" msgid "Lock on road" msgstr "Bloqueo en la ruta" msgid "Northing" msgstr "Hacia el Norte" msgid "Map follows Vehicle" msgstr "El mapa sigue al vehículo" msgid "Plan with Waypoints" msgstr "Plan con puntos de ruta" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Diseño" msgid "Height Profile" msgstr "Perfil de altura" msgid "Route Description" msgstr "Descripción de ruta" msgid "Show Locale" msgstr "Mostrar locale" msgid "Former Destinations" msgstr "Destinos anteriores" msgid "- No former destinations available -" msgstr "- No hay destinos anteriores -" msgid "Message" msgstr "Mensaje" msgid "Back" msgstr "Atrás" msgid "Back to map" msgstr "Volver al mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Número de portal" msgid "Next" msgstr "Siguiente" msgid "Prev" msgstr "Anterior" msgid "Return to route!" msgstr "Vuelva a la ruta" #. warning told msgid "Look out! Camera!" msgstr "!Atención! Radar" #. warning told msgid "Please decrease your speed" msgstr "Reduzca velocidad por favor" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posición del vehículo" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menú principal" msgid "" "Show\n" "Map" msgstr "" "Mostrar\n" "Mapa" msgid "Settings" msgstr "Configuración" msgid "Tools" msgstr "Herramientas" msgid "Route" msgstr "Ruta" msgid "About" msgstr "Acerca de" msgid "Actions" msgstr "Acciones" msgid "" "Former\n" "Destinations" msgstr "" "Destinos\n" "anteriores" msgid "Quit" msgstr "Cerrar" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegación" msgid "Display" msgstr "Visualizar" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Modo ventana" msgid "Description" msgstr "Descripción" msgid "" "Drop last \n" "Waypoint" msgstr "" "Quitar último \n" "Punto de ruta" msgid "" "Drop next \n" "Waypoint" msgstr "" "Quitar el siguiente \n" "Punto de ruta" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "automovil_ruta_mas_corta" msgid "car_avoid_tolls" msgstr "automovil_evitar_peajes" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "caballo" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "Camión" #~ msgid "" #~ "navit usage:\n" #~ "navit [options] [configfile]\n" #~ "\t-c : use as config file\n" #~ "\t-d : set the global debug output level to (0-3).\n" #~ "\t-h: print this usage info and exit.\n" #~ "\t-v: Print the version and exit.\n" #~ msgstr "" #~ "navit uso:\n" #~ "navit [opciones] [configfile]\n" #~ "\t-c : usar como fichero de configuración.\n" #~ "\t-d : Establecer nivel de depurado a (0-3).\n" #~ "\t-h: Muestra esta ayuda y sale.\n" #~ "\t-v: Muestra la versión y sale.\n" #~ msgid "Internal initialization failed, exiting\n" #~ msgstr "Falló el arranque interno, saliendo\n" #~ msgid "Replace Waypoints" #~ msgstr "Sustituir puntos de ruta" navit-0.5.0~svn5643+dfsg.1/po/et.po.in000066400000000000000000001052651221777731700172040ustar00rootroot00000000000000# Estonian translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Andres Kaaber 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 12:23+0000\n" "Last-Translator: Andres Kaaber \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Käivitan lähtekataloogist\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "määran '%s' -i '%s' -ks\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "%d m pärast" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meetrit" #, c-format msgid "in %d meters" msgstr "%d meetri pärast" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d kilomeetri pärast" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "üks kilomeeter" msgstr[1] "%d kilomeetrit" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ühe kilomeetri pärast" msgstr[1] "%d kilomeetri pärast" msgid "exit" msgstr "välju" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s %s%s%s tänavale" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s %s%s%s tänavale| mees vorm" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s %s%s%s tänavale| nais vorm" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s %s%s%s tänavale| neutraalne vorm" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "paremale" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "vasakule" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "kergesti " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "tugevalt " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "teadmata " msgid "When possible, please turn around" msgstr "Kui võimalik, palun pööra ümber" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Mööda teed järgmise %s" msgid "soon" msgstr "varsti" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "nüüd" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "viga" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Pööra %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "Sa oled jõudnud sihtpunkti %s" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "Käsk" msgid "Length" msgstr "Pikkus" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Aeg" msgid "Destination Length" msgstr "Sihtkoha kaugus" msgid "Destination Time" msgstr "Kohalejõudmise aeg" msgid "Roadbook" msgstr "Teekonna raamat" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Määra asukohaks" msgid "Set as destination" msgstr "Määra sihtpunktiks" msgid "Add as bookmark" msgstr "Lisa järjehoidjasse" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekraani koordinaadid: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Araabia Ühendemiraadid" #. 004 msgid "Afghanistan" msgstr "Afganistaan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua ja Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albaania" #. 051 msgid "Armenia" msgstr "Armeenia" #. 530 msgid "Netherlands Antilles" msgstr "Hollandi antillid" #. 024 msgid "Angola" msgstr "Angoola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentiina" #. 016 msgid "American Samoa" msgstr "Ameerika Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Austraalia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandi saared" #. 031 msgid "Azerbaijan" msgstr "Azerbaidžaan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia ja Hertsegoviina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benini" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Boliivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasiilia" #. 044 msgid "Bahamas" msgstr "Bahama" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet' saar" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Valgevene" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kookosesaared" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokraatlik Vabariik" #. 140 msgid "Central African Republic" msgstr "Kesk-Aafrika Vabariik" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Šveits" #. 384 msgid "Cote d'Ivoire" msgstr "Elevandiluu rannik" #. 184 msgid "Cook Islands" msgstr "Cooki saared" #. 152 msgid "Chile" msgstr "Tšiili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Hiina" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuuba" #. 132 msgid "Cape Verde" msgstr "Roheneeme saared" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Jõulusaar" #. 196 msgid "Cyprus" msgstr "Küpros" #. 203 msgid "Czech Republic" msgstr "Tšehhi Vabariik" #. 276 msgid "Germany" msgstr "Saksamaa" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Taani" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikaani Vabariik" #. 012 msgid "Algeria" msgstr "Alžeeria" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Eesti" #. 818 msgid "Egypt" msgstr "Egiptus" #. 732 msgid "Western Sahara" msgstr "Lääne-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Hispaania" #. 231 msgid "Ethiopia" msgstr "Etioopia" #. 246 msgid "Finland" msgstr "Soome" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandi (Malviini) saared" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikroneesia Liiduriigid" #. 234 msgid "Faroe Islands" msgstr "Fääri saared" #. 250 msgid "France" msgstr "Prantsusmaa" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Suurbritannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Prantsuse Guajaana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Gröönimaa" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatoriaal-Guinea" #. 300 msgid "Greece" msgstr "Kreeka" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Lõuna-Georgia ja Lõuna-Sandwichi saared" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guajaana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardi ja McDonaldi saarte ala" #. 340 msgid "Honduras" msgstr "Honduuras" #. 191 msgid "Croatia" msgstr "Horvaatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungari" #. 360 msgid "Indonesia" msgstr "Indoneesia" #. 372 msgid "Ireland" msgstr "Iirimaa" #. 376 msgid "Israel" msgstr "Iisrael" #. 833 msgid "Isle of Man" msgstr "Man'i saar" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Briti India ookeani territoorium" #. 368 msgid "Iraq" msgstr "Iraak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iraani Islamivabariik" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Itaalia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordaania" #. 392 msgid "Japan" msgstr "Jaapan" #. 404 msgid "Kenya" msgstr "Keenia" #. 417 msgid "Kyrgyzstan" msgstr "Kõrgõstan" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoorid" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts ja Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea Rahvademokraatlik Vabariik" #. 410 msgid "Korea, Republic of" msgstr "Korea Vabariik" #. 414 msgid "Kuwait" msgstr "Kuveit" #. 136 msgid "Cayman Islands" msgstr "Kaimani saared" #. 398 msgid "Kazakhstan" msgstr "Kasashtan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laose Demokraatlik Rahvavabariik" #. 422 msgid "Lebanon" msgstr "Liibanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libeeria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Leedu" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Läti" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Liibüa Araabia Džamahirija" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova Vabariik" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "St. Martin (Prantsuse osa)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalli saared" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedoonia, endine Jugoslaavia vabariik" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongoolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Põhja-Mariaani saared" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Marutaania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiivid" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mehhiko" #. 458 msgid "Malaysia" msgstr "Malaisia" #. 508 msgid "Mozambique" msgstr "Mosambiik" #. 516 msgid "Namibia" msgstr "Namiibia" #. 540 msgid "New Caledonia" msgstr "Uus Kaledoonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolki saar" #. 566 msgid "Nigeria" msgstr "Nigeeria" #. 558 msgid "Nicaragua" msgstr "Nikaraagua" #. 528 msgid "Netherlands" msgstr "Holland" #. 578 msgid "Norway" msgstr "Norra" #. 524 msgid "Nepal" msgstr "Nepaal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Uus-Meremaa" #. 512 msgid "Oman" msgstr "Omaan" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peruu" #. 258 msgid "French Polynesia" msgstr "Prantsuse Polüneesia" #. 598 msgid "Papua New Guinea" msgstr "Paapua Uus-Guinea" #. 608 msgid "Philippines" msgstr "Filipiinid" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poola" #. 666 msgid "Saint Pierre and Miquelon" msgstr "St. Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestiina okupeeritud ala" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumeenia" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Venemaa" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Araabia" #. 090 msgid "Solomon Islands" msgstr "Saalomoni saared" #. 690 msgid "Seychelles" msgstr "Seišellid" #. 736 msgid "Sudan" msgstr "Sudaan" #. 752 msgid "Sweden" msgstr "Rootsi" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Sloveenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ja Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakkia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somaalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome ja Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Süüria Araabia Vabariik" #. 748 msgid "Swaziland" msgstr "Svaasimaa" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks ja Caicose saared" #. 148 msgid "Chad" msgstr "Tšaad" #. 260 msgid "French Southern Territories" msgstr "Prantsuse Lõunaalad" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tai" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Ida-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tuneesia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türgi" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad ja Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansaania Ühendvabariik" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Ühendriikide hajasaared" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Püha Tool (Vatikan)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent ja Grenadines" #. 862 msgid "Venezuela" msgstr "Venetsueela" #. 092 msgid "Virgin Islands, British" msgstr "Neitsisaared, Briti" #. 850 msgid "Virgin Islands, U.S." msgstr "Neitsisaared, USA" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis ja Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jeemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Lõuna-Aafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Riik" msgid "Postal" msgstr "Postiindeks" msgid "Town" msgstr "Linn" msgid "District" msgstr "Linnaosa" msgid "Street" msgstr "Tänav" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Sisesta sihtpunkt" msgid "Zip Code" msgstr "Postiindeks" msgid "City" msgstr "Linn" msgid "District/Township" msgstr "Linnaosa" msgid "Map" msgstr "Kaart" msgid "Bookmark" msgstr "Järjehoidja" msgid "Destination" msgstr "Sihtkoht" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Kuva" msgid "_Route" msgstr "Teekond" msgid "_Former Destinations" msgstr "Eelmine sihtkoht" msgid "_Bookmarks" msgstr "Järjehoidjad" msgid "_Map" msgstr "Kaart" msgid "_Layout" msgstr "Paigutus" msgid "_Projection" msgstr "Projektsioon" msgid "_Vehicle" msgstr "Liiklusvahend" msgid "Zoom_Out" msgstr "Vähenda" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Suurenda" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Arvuta uuesti" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Teave" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Peata navigatsioon" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Välju" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lukusta tee peale" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Teekonna raamat" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Täisekraan" msgid "Data" msgstr "Andmed" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Teekond %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Teekond 0000km 0+00:00 ETA" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Järjehoidjad" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Liiklusvahend" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "Põhjasuund" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "Paigutus" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Eelmine sihtkoht" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "Teekond" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "Kuva" msgid "Fullscreen" msgstr "Täisekraan" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Cursor" #~ msgstr "Kursor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilomeeter" navit-0.5.0~svn5643+dfsg.1/po/eu.po.in000066400000000000000000001106651221777731700172050ustar00rootroot00000000000000# Basque translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # Inaki Saez # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-08-27 18:11+0000\n" "Last-Translator: Inaki Saez \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Iturburu direktoriotik ari\\n\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' '%s'ra ezartzen\\n\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "lehen" msgid "second" msgstr "bigarren" msgid "third" msgstr "hirugarren" msgid "fourth" msgstr "laugarren" msgid "fifth" msgstr "boskarren" msgid "sixth" msgstr "seigarren" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zerogarren irteera" msgid "first exit" msgstr "lehenengo irteera" msgid "second exit" msgstr "bigarren irteera" msgid "third exit" msgstr "hirugarren irteera" msgid "fourth exit" msgstr "laugarren irteera" msgid "fifth exit" msgstr "boskarren" msgid "sixth exit" msgstr "seigarren irteera" #, c-format msgid "%d m" msgstr "%d metro" #, c-format msgid "in %d m" msgstr "%d metrotan" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metro" #, c-format msgid "in %d meters" msgstr "%d metrotan" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilometro" #, c-format msgid "in %d.%d kilometers" msgstr "%d,%d kilometrotan" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "kilometro bat" msgstr[1] "%d kilometro" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "kilometro batean" msgstr[1] "%d kilometrotan" msgid "exit" msgstr "irteera" msgid "into the ramp" msgstr "maldan" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s %s %s %s kalean" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s %s%s%s-an" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s %s%s%s-an" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s %s%s%s-en" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s %s-an" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "eskuina" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "ezkerra" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "pizka bat " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "gogorki " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "benetan gogor " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ezezaguna " msgid "When possible, please turn around" msgstr "Ahal duzunean eman itzulia, mesedez" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "gero, irten errotondatik %s-ean" #, c-format msgid "Leave the roundabout at the %s" msgstr "Irten errotondatik %s-ean" #, c-format msgid "Follow the road for the next %s" msgstr "Jarraitu bidean urrengo %s-arte" msgid "soon" msgstr "hurrengotan" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Hartu %1$s bidea %2$s-ean" #, c-format msgid "after %i roads" msgstr "%i bideen ondoren" msgid "now" msgstr "orain" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "orduan hartu %1$s irteera %2$s-era" msgid "error" msgstr "akatsa" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Biratu %1$s%2$s-ra %3$s%4$s-tan" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "ondoren biratu %1$s %2$s-ra %3$s%4$s-raino" #, c-format msgid "You have reached your destination %s" msgstr "%s helburura iritsi zara" msgid "then you have reached your destination." msgstr "dagoeneko helburura iritsi zara" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "kokalekua" msgid "Command" msgstr "Agindua" msgid "Length" msgstr "Luzera" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Denbora" msgid "Destination Length" msgstr "Helbururaino urruntasuna" msgid "Destination Time" msgstr "Helbururaino denbora" msgid "Roadbook" msgstr "Gida" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Kolekua finkatu" msgid "Set as destination" msgstr "Heburuz hautatu" msgid "Add as bookmark" msgstr "Nahikotzat gehitu" #, c-format msgid "Point 0x%x 0x%x" msgstr "Puntu 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Pantaila koordenatuak: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Arabiar Emirerri Batuak" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua eta Barbuda" #. 660 msgid "Anguilla" msgstr "Angila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Herbeheren Antillak" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikar Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland uharteak" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia-Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgika" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolome" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bruneiko Sultanerria" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Uhartea" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorrusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Uharteak" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongoko Errepublika Demokratikoa" #. 140 msgid "Central African Republic" msgstr "Ertafrikar Errepublika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Suitza" #. 384 msgid "Cote d'Ivoire" msgstr "Bolikosta" #. 184 msgid "Cook Islands" msgstr "Cook uharteak" #. 152 msgid "Chile" msgstr "Txile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Txina" #. 170 msgid "Colombia" msgstr "Kolonbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Uhartea" #. 196 msgid "Cyprus" msgstr "Txipre" #. 203 msgid "Czech Republic" msgstr "Txekiar Errepublika" #. 276 msgid "Germany" msgstr "Alemania" #. 262 msgid "Djibouti" msgstr "Djibuti" #. 208 msgid "Denmark" msgstr "Danimarka" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikar Errepublika" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipto" #. 732 msgid "Western Sahara" msgstr "Mendebaldeko Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Espainia" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Malvinak Uharteak (Falkland Uharteak)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesiako Estatu Federatuak" #. 234 msgid "Faroe Islands" msgstr "Faroe Uharteak" #. 250 msgid "France" msgstr "Frantzia" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Erresuma Batua" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guayana Frantsesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Ginea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekuatore Ginea" #. 300 msgid "Greece" msgstr "Grezia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Hegoaldeko Georgia eta Hegoaldeko Sandwich Uharteak" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Ginea-Bissau" #. 328 msgid "Guyana" msgstr "Guayana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Uhartea eta McDonald Uharteak" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroazia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungaria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man Uhartea" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Indiako Ozeanoko Britainiar Lurraldea" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Errepublika Islamikoa" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japonia" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizistan" #. 116 msgid "Cambodia" msgstr "Kanbodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoroak" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts eta Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Herri-errepublika Demokratikoa (Ipar Korea)" #. 410 msgid "Korea, Republic of" msgstr "Korea, Errepublika (Hego Korea)" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kaiman Uharteak" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos Herri Errepublika Demokratikoa" #. 422 msgid "Lebanon" msgstr "Libano" #. 662 msgid "Saint Lucia" msgstr "Santa Luzia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxenburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libiar Arabiar Jamahiriya" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, errepublika" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Frantziar zatia)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall Uharteak" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Mazedonia, Antzineko Jugoslabiar Errepublika" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Ipar Mariana Uharteak" #. 474 msgid "Martinique" msgstr "Martinika" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurizio" #. 462 msgid "Maldives" msgstr "Maldibak" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambike" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Kaledonia Berria" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Uhartea" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Herbehereak" #. 578 msgid "Norway" msgstr "Norvegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Zelanda Berria" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinesia Frantsesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Ginea Berria" #. 608 msgid "Philippines" msgstr "Filipinak" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre eta Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinar Lurralde Okupatuak" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Errumania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Errusiako Federazioa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Uharteak" #. 690 msgid "Seychelles" msgstr "Seychelleak" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suedia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard eta Jan Mayen Uharteak" #. 703 msgid "Slovakia" msgstr "Eslovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leona" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome eta Printze" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Siriako Arabiar Errepublika" #. 748 msgid "Swaziland" msgstr "Swazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Turk eta Caico uharteak" #. 148 msgid "Chad" msgstr "Txad" #. 260 msgid "French Southern Territories" msgstr "Hegoaldeko Lurralde Frantsesak" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Ekialdeko Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad eta Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Txinako Errepublika" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzaniako Errepublika Batua" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Estatu Batuetako Itsas Bestaldeko Uharte Txikiak" #. 840 msgid "United States" msgstr "Estatu Batuak" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanoko hiria" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent eta Grenadinak" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Birgina Uharteak, Britainarrak" #. 850 msgid "Virgin Islands, U.S." msgstr "Birjina Uharteak, A.E.B." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis eta Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Hegoafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Ezezaguna, gehitu -en_dago etiketak hiri hauentzat" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Mapako puntua" msgid "Car" msgstr "Berebila" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Herrialdea" msgid "Postal" msgstr "Posta" msgid "Town" msgstr "Herria" msgid "District" msgstr "Barrutia" msgid "Street" msgstr "Kalea" msgid "Number" msgstr "Zenbakia" msgid "Enter Destination" msgstr "Sartu helburua" msgid "Zip Code" msgstr "Posta-kodea" msgid "City" msgstr "Hiria" msgid "District/Township" msgstr "Auzoa" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Gogokoa" msgid "Destination" msgstr "Helburua" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Bistaratzea" msgid "_Route" msgstr "Ibilbidea" msgid "_Former Destinations" msgstr "Aurreko Helburuak" msgid "_Bookmarks" msgstr "Gogokoak" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Antolaketa" msgid "_Projection" msgstr "Proiekzioa" msgid "_Vehicle" msgstr "Ibilgailua" msgid "Zoom_Out" msgstr "Hurrundu" msgid "Decrease zoom level" msgstr "Txikitu zooma" msgid "Zoom_In" msgstr "Hurbildu" msgid "Increase zoom level" msgstr "Handitu zooma" msgid "_Recalculate" msgstr "Birkalkulatu" msgid "Redraw map" msgstr "Mapa Birmargotu" msgid "_Info" msgstr "Datuak" msgid "Set _destination" msgstr "Helburua ezarri" msgid "Opens address search dialog" msgstr "Ireki helbidea bilatzeko lehioa" msgid "_Stop Navigation" msgstr "Nabigazioa Gelditu" msgid "Test" msgstr "Saiatu" msgid "_Quit" msgstr "_Irten" msgid "Quit the application" msgstr "Irten programatik" msgid "Show position _cursor" msgstr "Erakutsi kurtsore kokalekua" msgid "_Lock on Road" msgstr "Bidean oztopoa" msgid "_Keep orientation to the North" msgstr "Iparralderantz begira" msgid "Switches map orientation to the north or the vehicle" msgstr "Maparen norabidea iparralde edo berebilaren artean aldatu" msgid "_Roadbook" msgstr "Gida" msgid "Show/hide route description" msgstr "Erakutsi/ezkutatu hibilbidearen berri" msgid "_Autozoom" msgstr "Autohanditu" msgid "Enable/disable automatic zoom level changing" msgstr "Zoom automatikoa onartu/debekatu" msgid "_Fullscreen" msgstr "Pantaila osoa" msgid "Data" msgstr "Datuak" msgid "N" msgstr "I" msgid "NE" msgstr "IE" msgid "E" msgstr "E" msgid "SE" msgstr "HE" msgid "S" msgstr "H" msgid "SW" msgstr "HM" msgid "W" msgstr "M" msgid "NW" msgstr "IM" #. Android resource: @strings/no msgid "No" msgstr "Ez" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ibilide %4.0fkm %02d:%02d EDI" msgid "Route 0000km 0+00:00 ETA" msgstr "Ibilbide 0000km 0+00:00 EDI" msgid "Help" msgstr "Laguntza" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ikusi nabigatzailean" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Kaleak" msgid "House numbers" msgstr "Etxebizitza zenbakiak" msgid "View Attributes" msgstr "Atributoak erakutsi" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "PIak" msgid "View on map" msgstr "Mapan Ikusi" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Moztu Gogokoa" msgid "Copy Bookmark" msgstr "Kopiatu Gogokoa" msgid "Rename Bookmark" msgstr "Gogokoa berrizendatu" msgid "Paste Bookmark" msgstr "Itsatsi Gogokoa" msgid "Delete Bookmark" msgstr "Ezabatu Gogokoa" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Gogokoak" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Gehitu Gogokoen direktorioa" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Itsatsi gogokoa" #, c-format msgid "Bookmark %s" msgstr "%s marka" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Sateliteen egoera erakutsi" msgid " Elevation " msgstr " Garaiera " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "NMEA datuak erakutsi" msgid "car" msgstr "berebila" msgid "bike" msgstr "bizikleta" msgid "pedestrian" msgstr "oinezkoa" #, c-format msgid "Current profile: %s" msgstr "Oraingo profila: %s" #, c-format msgid "Change profile to: %s" msgstr "Profila aldatu: %s-ra" msgid "Set as active" msgstr "Lanean ezarri" msgid "Show Satellite status" msgstr "Sateliteen egoera erakutsi" msgid "Show NMEA data" msgstr "NMEA datuak erakutsi" msgid "Add Bookmark" msgstr "Gogokoa gehitu" msgid "Rename" msgstr "Izena aldatu" msgid "About Navit" msgstr "Naviti buruz" #. Authors msgid "By" msgstr "Egileak" #. Contributors msgid "And all the Navit Team" msgstr "Eta Navit talde osoa" msgid "members and contributors." msgstr "partaide eta laguntzaileak." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Ibilgailua" msgid "Rules" msgstr "Arauak" msgid "Lock on road" msgstr "Bidean oztopoa" msgid "Northing" msgstr "Iparrerantz" msgid "Map follows Vehicle" msgstr "Mapak ibilgailua jarraitzen du" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapak" msgid "Layout" msgstr "Antolaketa" msgid "Height Profile" msgstr "Garaiera ikusi" msgid "Route Description" msgstr "Ibilbidearen nondik-norakoa" msgid "Show Locale" msgstr "Locale erakutsi" msgid "Former Destinations" msgstr "Aurreko Helburuak" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mezua" msgid "Back" msgstr "Atzera" msgid "Back to map" msgstr "Mapara itzuli" msgid "Main Menu" msgstr "Menu nagusia" msgid "House number" msgstr "Etxebizitza zenbakia" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Berebilaren kokalekua" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu nagusia" msgid "" "Show\n" "Map" msgstr "" "Mapa\n" "Erakutsi" msgid "Settings" msgstr "Ezarpenak" msgid "Tools" msgstr "Tresnak" msgid "Route" msgstr "Ibilbidea" msgid "About" msgstr "Honi buruz" msgid "Actions" msgstr "Ekintzak" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Irten" msgid "" "Stop\n" "Navigation" msgstr "" "Nabigazioa\n" "Gelditu" msgid "Display" msgstr "Bistaratzea" msgid "Fullscreen" msgstr "Pantaila osoa" msgid "Window Mode" msgstr "Lehio modua" msgid "Description" msgstr "Zehazketa" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "zaldia" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Enter the roundabout soon and leave it at the %s" #~ msgstr "Hurrengoan sartu errotondan eta atera %sean" #~ msgid "In %s, enter the roundabout" #~ msgstr "%s-tan sartu errotondan" navit-0.5.0~svn5643+dfsg.1/po/fi.po.in000066400000000000000000001102651221777731700171660ustar00rootroot00000000000000# Finnish translations for navit # Copyright (C) 2007,2008 The Navit Team # This file is distributed under the same license as the navit package. # Ossi Berg , 2007. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-08 07:37+0000\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Ossi Berg \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Ajetaan lähdehakemistosta\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "asetetaan '%s' arvoon '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nollas" msgid "first" msgstr "ensimmäinen" msgid "second" msgstr "toinen" msgid "third" msgstr "kolmas" msgid "fourth" msgstr "neljäs" msgid "fifth" msgstr "viides" msgid "sixth" msgstr "kuudes" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nollannesta liittymästä" msgid "first exit" msgstr "ensimmäisestä liittymästä" msgid "second exit" msgstr "toisesta liittymästä" msgid "third exit" msgstr "kolmannesta liittymästä" msgid "fourth exit" msgstr "neljännestä liittymästä" msgid "fifth exit" msgstr "viidennestä liittymästä" msgid "sixth exit" msgstr "kuudennesta liittymästä" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "%d m päästä" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metriä" #, c-format msgid "in %d meters" msgstr "%d metrin päästä" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometriä" #, c-format msgid "in %d.%d kilometers" msgstr "%d,%d kilometrin päästä" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "yksi kilometri" msgstr[1] "%d kilometriä" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "Yhden kilometrin päästä" msgstr[1] "%d kilometrin päästä" msgid "exit" msgstr "poistumistie" msgid "into the ramp" msgstr "rampille" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%skadulle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%skadulle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%skadulle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%skadulle %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%stielle %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "oikealle" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "vasemmalle" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "loivasti " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "jyrkästi " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "todella voimakkaasti " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "tuntematon " msgid "When possible, please turn around" msgstr "Kun mahdollista, tee u-käännös" msgid "Enter the roundabout soon" msgstr "Liity liikenneympyrään pian" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "poistu sitten liikenneympyrästä %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Poistu liikenneympyrästä %s" #, c-format msgid "Follow the road for the next %s" msgstr "Seuraa tätä tietä %s" msgid "soon" msgstr "pian" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Valitse %1$s tie suuntaan %2$s" #, c-format msgid "after %i roads" msgstr "%i tien jälkeen" msgid "now" msgstr "nyt" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "valitse sitten %1$s tie suuntaan %2$s" msgid "error" msgstr "virhe" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Käänny %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "käänny sitten %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Olet saavuttanut kohteesi %s" msgid "then you have reached your destination." msgstr "sitten olet perillä." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Sijainti" msgid "Command" msgstr "Komento" msgid "Length" msgstr "Pituus" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Aika" msgid "Destination Length" msgstr "Kohde" msgid "Destination Time" msgstr "Kohde" msgid "Roadbook" msgstr "Ohjeistaja" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Aseta sijainniksi" msgid "Set as destination" msgstr "Aseta kohteeksi" msgid "Add as bookmark" msgstr "Lisää kirjanmerkiksi" #, c-format msgid "Point 0x%x 0x%x" msgstr "Piste 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ruutu %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Yhdistyneet Arabiemiirikunnat" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua ja Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Alankomaiden Antillit" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Etelänapamanner" #. 032 msgid "Argentina" msgstr "Argentiina" #. 016 msgid "American Samoa" msgstr "Amerikan Samoa" #. 040 msgid "Austria" msgstr "Itävalta" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ahvenanmaa" #. 031 msgid "Azerbaijan" msgstr "Azerbaizan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia ja Hertsegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilia" #. 044 msgid "Bahamas" msgstr "Bahamasaaret" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet'n saari" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Valko-Venäjä" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kookossaaret (Keeling-saaret)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongon tasavalta" #. 140 msgid "Central African Republic" msgstr "Keski-Afrikan tasavalta" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Sveitsi" #. 384 msgid "Cote d'Ivoire" msgstr "Norsunluurannikko" #. 184 msgid "Cook Islands" msgstr "Cook-saaret" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kiina" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Joulusaari" #. 196 msgid "Cyprus" msgstr "Kypros" #. 203 msgid "Czech Republic" msgstr "Tsekin tasavalta" #. 276 msgid "Germany" msgstr "Saksa" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Tanska" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikaaninen tasavalta" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Viro" #. 818 msgid "Egypt" msgstr "Egypti" #. 732 msgid "Western Sahara" msgstr "Länsi-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Espanja" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Suomi" #. 242 msgid "Fiji" msgstr "Fidzi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-saaret (Malvinas-saaret)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesian liittovaltio" #. 234 msgid "Faroe Islands" msgstr "Färsaaret" #. 250 msgid "France" msgstr "Ranska" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Iso-Britannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Ranskan Guinea" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönlanti" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Päiväntasaajan Guinea" #. 300 msgid "Greece" msgstr "Kreikka" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Etelä-Georgia ja Eteläiset Sandwichsaaret" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardin saari ja McDonaldin saaret" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Unkari" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanti" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Mansaari" #. 356 msgid "India" msgstr "Intia" #. 086 msgid "British Indian Ocean Territory" msgstr "Brittiläinen Intian valtameren alue" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iranin islamilainen tasavalta" #. 352 msgid "Iceland" msgstr "Islanti" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japani" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodza" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorit" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts ja Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Pohjois-Korea" #. 410 msgid "Korea, Republic of" msgstr "Etelä-Korea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Caymansaaret" #. 398 msgid "Kazakhstan" msgstr "Kazakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laosin demokraattinen tasavalta" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Liettua" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libya" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (Ranskan osa)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallinsaaret" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Entinen Jugoslavian tasavalta Makedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Pohjois-Mariaanit" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediivit" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Malesia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Uusi-Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsaaret" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Alankomaat" #. 578 msgid "Norway" msgstr "Norja" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Uusi-Seelanti" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Ranskan Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua Uusi-Guinea" #. 608 msgid "Philippines" msgstr "Filippiinit" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Puola" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre ja Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestiinalaisalueet, miehitetyt" #. 620 msgid "Portugal" msgstr "Portugali" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Venäjä" #. 646 msgid "Rwanda" msgstr "Ruanda" # #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. 090 msgid "Solomon Islands" msgstr "Salomonsaaret" #. 690 msgid "Seychelles" msgstr "Seychellit" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Ruotsi" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ja Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome ja Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syyrian arabitasavalta" #. 748 msgid "Swaziland" msgstr "Swazimaa" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- ja Caicossaaret" #. 148 msgid "Chad" msgstr "Tšad" #. 260 msgid "French Southern Territories" msgstr "Ranskan eteläiset alueet" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thaimaa" #. 762 msgid "Tajikistan" msgstr "Tadzikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Itä-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkki" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad ja Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Kiinan maakunta" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania, yhdistynyt tasavalta" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Yhdysvaltojen Tyynenmeren erillissaaret" #. 840 msgid "United States" msgstr "Yhdysvallat" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikaanivaltio (Pyhä Istuin)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent ja Grenadiinit" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Neitsytsaaret, brittiläiset" #. 850 msgid "Virgin Islands, U.S." msgstr "Neitsytsaaret, Yhdysvaltojen" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- ja Futunasaaret" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Etelä-Afrikka" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Tuntematon, lisätä is_in koodit näistä kaupungeista" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Karttapiste" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Maa" # msgid "Postal" msgstr "Postinumero" msgid "Town" msgstr "Paikkakunta" # msgid "District" msgstr "Alue" msgid "Street" msgstr "Katu" msgid "Number" msgstr "Numero" # msgid "Enter Destination" msgstr "Anna kohde" msgid "Zip Code" msgstr "Postinumero" msgid "City" msgstr "Kaupunki" msgid "District/Township" msgstr "Maakunta" msgid "Map" msgstr "Kartta" msgid "Bookmark" msgstr "Kirjanmerkki" msgid "Destination" msgstr "Kohde" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Näyttö" msgid "_Route" msgstr "Reitti" msgid "_Former Destinations" msgstr "Aiemmat kohteet" msgid "_Bookmarks" msgstr "Kirjanmerkit" msgid "_Map" msgstr "Kartta" msgid "_Layout" msgstr "Pohja" msgid "_Projection" msgstr "Projektio" msgid "_Vehicle" msgstr "Kulkuneuvo" msgid "Zoom_Out" msgstr "Loitonna" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Lähennä" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Laske uudelleen" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Lopeta navigointi" msgid "Test" msgstr "Testi" msgid "_Quit" msgstr "Sulje" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lukitse tiehen" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Ohjeistaja" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autom. suurennus" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Koko ruutu" msgid "Data" msgstr "Tieto" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Ei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Reitti %4.0fkm, arvioitu aika %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Reitti 0000km, arvioitu aika 0+00:00" msgid "Help" msgstr "Ohje" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Näytä selaimessa" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Kadut" msgid "House numbers" msgstr "Talojen numerot" msgid "View Attributes" msgstr "Näytä ominaisuudet" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIt" msgid "View on map" msgstr "Näytä kartalla" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Leikkaa kirjanmerkki" msgid "Copy Bookmark" msgstr "Kopioi kirjanmerkki" msgid "Rename Bookmark" msgstr "Nimeä kirjanmerkki uudelleen" msgid "Paste Bookmark" msgstr "Liitä kirjanmerkki" msgid "Delete Bookmark" msgstr "Poista kirjanmerkki" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Kirjanmerkit" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Lisää kirjanmerkkikansio" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Liitä kirjanmerkki" #, c-format msgid "Bookmark %s" msgstr "Tee kirjanmerkki %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Näytä satelliittien tila" msgid " Elevation " msgstr " Korkeus " msgid " Azimuth " msgstr " Atsimuutti " msgid "Show NMEA Data" msgstr "Näytä NMEA-tiedot" msgid "car" msgstr "auto" msgid "bike" msgstr "Pyörän" msgid "pedestrian" msgstr "jalankulkijoiden" #, c-format msgid "Current profile: %s" msgstr "Nykyinen profiili: %s" #, c-format msgid "Change profile to: %s" msgstr "Muuta profiilin: %s" msgid "Set as active" msgstr "Aseta aktiiviseksi" msgid "Show Satellite status" msgstr "Näytä satelliittien tila" msgid "Show NMEA data" msgstr "Näytä NMEA-tiedot" msgid "Add Bookmark" msgstr "Lisää kirjanmerkki" msgid "Rename" msgstr "Nimeä uudelleen" msgid "About Navit" msgstr "Tietoja - Navit" #. Authors msgid "By" msgstr "Tekijä" #. Contributors msgid "And all the Navit Team" msgstr "sekä koko Navit-tiimi" msgid "members and contributors." msgstr "jäsenet ja osallistujat." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Kulkuneuvo" msgid "Rules" msgstr "Säännöt" msgid "Lock on road" msgstr "Lukitse tiehen" msgid "Northing" msgstr "Pohjoinen ylhäällä" msgid "Map follows Vehicle" msgstr "Kartta seuraa ajoneuvoa" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kartat" msgid "Layout" msgstr "Pohja" msgid "Height Profile" msgstr "Korkeusprofiili" msgid "Route Description" msgstr "Reitin kuvaus" msgid "Show Locale" msgstr "Näytä maa-asetusto" msgid "Former Destinations" msgstr "Aiemmat kohteet" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Viesti" msgid "Back" msgstr "Takaisin" msgid "Back to map" msgstr "Takaisin karttaan" msgid "Main Menu" msgstr "Päävalikko" msgid "House number" msgstr "Talon numero" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Ajoneuvon sijainti" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Päävalikko" msgid "" "Show\n" "Map" msgstr "" "Näytä\n" "kartta" msgid "Settings" msgstr "Asetukset" msgid "Tools" msgstr "Työkalut" msgid "Route" msgstr "Reitti" msgid "About" msgstr "Tietoja" msgid "Actions" msgstr "Toiminnat" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Lopeta" msgid "" "Stop\n" "Navigation" msgstr "" "Lopeta\n" "Suunnistus" msgid "Display" msgstr "Näyttö" msgid "Fullscreen" msgstr "Koko ruutu" msgid "Window Mode" msgstr "Ikkunatila" msgid "Description" msgstr "Kuvaus" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hevonen" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "%s, liity liikenneympyrään" #~ msgid "Cursor" #~ msgstr "Osoitin" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d kilometri" #~ msgid " SNR " #~ msgstr " SNR " #~ msgid " PRN " #~ msgstr " PRN " navit-0.5.0~svn5643+dfsg.1/po/fo.po.in000066400000000000000000001074041221777731700171750ustar00rootroot00000000000000# Faroese translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Cyberish 2009 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 12:19+0000\n" "Last-Translator: Cyberish \n" "Language-Team: Faroese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fo\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Koyrur frá keldumappuni\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setur '%s' til '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullta" msgid "first" msgstr "fyrsti" msgid "second" msgstr "annar" msgid "third" msgstr "triði" msgid "fourth" msgstr "fjórði" msgid "fifth" msgstr "fimti" msgid "sixth" msgstr "sætti" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "sjeyndi" msgid "first exit" msgstr "fyrsta avkoyring" msgid "second exit" msgstr "onnur avkoyring" msgid "third exit" msgstr "triða avkoyring" msgid "fourth exit" msgstr "fjórða avkoyring" msgid "fifth exit" msgstr "fimta avkoyring" msgid "sixth exit" msgstr "sætta avkoyring" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "um %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metrar" #, c-format msgid "in %d meters" msgstr "um %d metrar" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrar" #, c-format msgid "in %d.%d kilometers" msgstr "um %d.%d kilometrar" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ein kilometur" msgstr[1] "%d kilometrar" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "um ein kilometur" msgstr[1] "um %d kilometrar" msgid "exit" msgstr "avkoyring" msgid "into the ramp" msgstr "uppá rampuna" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sinná gøtuna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sinto the %s%s%sur" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sinto the %s%s%sa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sinná %s%s%si" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinná %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "Høgra" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "Vinstra" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "lætt " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "knapt " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "sera knapt " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ókent " msgid "When possible, please turn around" msgstr "vend um skótast tilber" msgid "Enter the roundabout soon" msgstr "Um lítið bil verður koyrt inní rundkoyringina" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "far so út úr rundkoyring við %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "far út úr rundkoyring við %s" #, c-format msgid "Follow the road for the next %s" msgstr "fylg vegnum tær næstu %s" msgid "soon" msgstr "skjótt" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "tak tann %1$s vegin til %2$s" #, c-format msgid "after %i roads" msgstr "eftir %i vegir" msgid "now" msgstr "nú" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "so tak tann %1$s vegin til %2$s" msgid "error" msgstr "feilur" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "dreya %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "dreya síðan %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Tú hevur nátt tínum ferðamáli %s" msgid "then you have reached your destination." msgstr "tá hevur tú nátt tínum ferðamáli" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Stað" msgid "Command" msgstr "Boð" msgid "Length" msgstr "Longd" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tíð" msgid "Destination Length" msgstr "Longd til ferðamál" msgid "Destination Time" msgstr "Tíð til málið" msgid "Roadbook" msgstr "Vegbók" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Set sum stað" msgid "Set as destination" msgstr "Set sum ferðamál" msgid "Add as bookmark" msgstr "legg til sum bókamerkið" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "SKíggja krosspunkt : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Sameindu Arabisku Emuraturnar" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikanskt Samoa" #. 040 msgid "Austria" msgstr "Eysturríki" #. 036 msgid "Australia" msgstr "Avstralia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Áland" #. 031 msgid "Azerbaijan" msgstr "Aserbajdsjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesj" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Barain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilia" #. 044 msgid "Bahamas" msgstr "Bahamasoyggjar" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Bouvet oyggjin" #. 072 msgid "Botswana" msgstr "Botsvana" #. 112 msgid "Belarus" msgstr "Hvítarussland" #. 084 msgid "Belize" msgstr "Belis" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyggjarnar" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, tann demokratiska lýðveldið" #. 140 msgid "Central African Republic" msgstr "Miðafrikalýðveldið" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Sveis" #. 384 msgid "Cote d'Ivoire" msgstr "Fílabeinsstrondin" #. 184 msgid "Cook Islands" msgstr "Cookoyggjarnar" #. 152 msgid "Chile" msgstr "Kili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Grønhøvdaoyggjarnar" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Jólaoyggjin" #. 196 msgid "Cyprus" msgstr "Kýpros" #. 203 msgid "Czech Republic" msgstr "Kekkia" #. 276 msgid "Germany" msgstr "Týskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmørk" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Domingo lýðveldið" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egyptaland" #. 732 msgid "Western Sahara" msgstr "Vestur Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsoyggjarnar" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesia, tær sameindu statirnir av" #. 234 msgid "Faroe Islands" msgstr "Føroyar" #. 250 msgid "France" msgstr "Frakland" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Stórabretland" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Fransk Guinea" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvator Guinea" #. 300 msgid "Greece" msgstr "Grikkaland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Suður Georgia og Suður Sandwich oyggjarnar" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Gujana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- og McDonald-oyggjarnar" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Írland" #. 376 msgid "Israel" msgstr "Ísrael" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Bretskt-indiska sjóøki" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamiska lýveldi av" #. 352 msgid "Iceland" msgstr "Ísland" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jameika" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenja" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisia" #. 116 msgid "Cambodia" msgstr "Kambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorooyggjarnar" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Tað Demokratiska Folkalýveldi" #. 410 msgid "Korea, Republic of" msgstr "Korea, Lýveldi" #. 414 msgid "Kuwait" msgstr "Kuvait" #. 136 msgid "Cayman Islands" msgstr "Cayman oyggjarnar" #. 398 msgid "Kazakhstan" msgstr "Kasakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lusia" #. 438 msgid "Liechtenstein" msgstr "Liktenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litava" #. 442 msgid "Luxembourg" msgstr "Luksemborg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libyan" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldovia, Lýveldi" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Franski parturin)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalloyggjarnar" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, tað fyrrverandi Jugoslaviska Lýveldi" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar (Burma)" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Norður Mariana oyggjarnar" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Móritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Móritius" #. 462 msgid "Maldives" msgstr "Maldivuoyggjarnar" #. 454 msgid "Malawi" msgstr "Malavi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Maleisia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ný Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk oyggjin" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Niðurlond" #. 578 msgid "Norway" msgstr "Noreg" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Ný Sæland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua Nýguinea" #. 608 msgid "Philippines" msgstr "Filipsoyggjar" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pólland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn oyggjar" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguei" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion oyggin" #. 642 msgid "Romania" msgstr "Rumenia" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arábia" #. 090 msgid "Solomon Islands" msgstr "Sálomonoyggjarnar" #. 690 msgid "Seychelles" msgstr "Seyskelloyggjarnar" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Svøríki" #. 702 msgid "Singapore" msgstr "Singapor" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome og Prinsipi" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sýria" #. 748 msgid "Swaziland" msgstr "Svasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks og Caicos oyggjarnar" #. 148 msgid "Chad" msgstr "Kjad" #. 260 msgid "French Southern Territories" msgstr "Fraklands suður øki" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadsjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkaland" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taivan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania, Sameinda lýveldi av" #. 804 msgid "Ukraine" msgstr "Ukreina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "USA umkringliggjandi oyggjar" #. 840 msgid "United States" msgstr "Sambandsríki Amerika" #. 858 msgid "Uruguay" msgstr "Uruguei" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanríkið" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vinsent og Grenadinoyggjar" #. 862 msgid "Venezuela" msgstr "Venesuela" #. 092 msgid "Virgin Islands, British" msgstr "jomfrúðoyggjarnar, Bretsku" #. 850 msgid "Virgin Islands, U.S." msgstr "jomfrúðoyggjarnar, U.S" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- og Futunaoyggjarnar" #. 882 msgid "Samoa" msgstr "Sámoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotta" #. 710 msgid "South Africa" msgstr "Suðurafrika" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Simbabvi" msgid "* Unknown, add is_in tags to those cities" msgstr "* Ókent, knýt is_in tag til hasar býirnar" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kort Punkt" msgid "Car" msgstr "Bilur" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Adressa" msgid "Town" msgstr "Bygd" msgid "District" msgstr "Distrikt" msgid "Street" msgstr "Gøta" msgid "Number" msgstr "Nummar" msgid "Enter Destination" msgstr "Slá inn ferðamál" msgid "Zip Code" msgstr "Postnr." msgid "City" msgstr "Býur" msgid "District/Township" msgstr "Distrikt/Kommuna" msgid "Map" msgstr "Kort" msgid "Bookmark" msgstr "Bókamerki" msgid "Destination" msgstr "Ferðamál" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Skíggji" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Gomul Ferðamál" msgid "_Bookmarks" msgstr "Bókamerki" msgid "_Map" msgstr "Kort" msgid "_Layout" msgstr "Snið" msgid "_Projection" msgstr "Sýning" msgid "_Vehicle" msgstr "Akfar" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Umrokna" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stegga Navigering" msgid "Test" msgstr "Roynd" msgid "_Quit" msgstr "_Gevst" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Læs til veg" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Vegbók" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Sjálvvirkið zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Fullur skermur" msgid "Data" msgstr "Dáta" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d Tíðarmeting" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 Tíðarmeting" msgid "Help" msgstr "Hjálp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vís í kagara" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gøtur" msgid "House numbers" msgstr "Húsanummur" msgid "View Attributes" msgstr "Vís eginleikar" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Áhugaverd støð" msgid "View on map" msgstr "Vís á mappu" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bókamerki" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Bókamerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vís Satilit Støðu" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Vís NMEA Dáta" msgid "car" msgstr "bilur" msgid "bike" msgstr "Súkla" msgid "pedestrian" msgstr "fótgangari" #, c-format msgid "Current profile: %s" msgstr "Núverandi profilur %s" #, c-format msgid "Change profile to: %s" msgstr "Broyt profil til: %s" msgid "Set as active" msgstr "Set sum virkið" msgid "Show Satellite status" msgstr "Vís Satelit støðu" msgid "Show NMEA data" msgstr "Vís NMEA dáta" msgid "Add Bookmark" msgstr "Legg bókamerki afturat" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Akfar" msgid "Rules" msgstr "Reglur" msgid "Lock on road" msgstr "Læs til veg" msgid "Northing" msgstr "Mót norðan" msgid "Map follows Vehicle" msgstr "Kort fylgur akfari" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kort" msgid "Layout" msgstr "Snið" msgid "Height Profile" msgstr "Hæddar profilur" msgid "Route Description" msgstr "Rutulýsing" msgid "Show Locale" msgstr "Staðarlýsing" msgid "Former Destinations" msgstr "Gomul Ferðamál" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Boð" msgid "Back" msgstr "Aftur" msgid "Back to map" msgstr "Aftur til kort" msgid "Main Menu" msgstr "Høvuðsvalmynd" msgid "House number" msgstr "Húsanummur" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Akfars stað" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Høvuðsvalmynd" msgid "" "Show\n" "Map" msgstr "Vís Kort" msgid "Settings" msgstr "Setingar" msgid "Tools" msgstr "Tól" msgid "Route" msgstr "Ruta" msgid "About" msgstr "" msgid "Actions" msgstr "Gerðir" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Enda" msgid "" "Stop\n" "Navigation" msgstr "Enda navigering" msgid "Display" msgstr "Skíggji" msgid "Fullscreen" msgstr "Fullur skermur" msgid "Window Mode" msgstr "Vindeyga støða" msgid "Description" msgstr "Frágreiðing" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hestur" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "um %s verður koyrt inní rundkoyringina" #~ msgid "Cursor" #~ msgstr "Markør" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometur" #~ msgid " SNR " #~ msgstr " SNR " #~ msgid " PRN " #~ msgstr " PRN " navit-0.5.0~svn5643+dfsg.1/po/fr.po.in000066400000000000000000001146111221777731700171760ustar00rootroot00000000000000# French translations for navit # Copyright (C) 2007, 2008 The Navit Team # This file is distributed under the same license as the navit package. # 'KaZeR' # 'Nekohayo' # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-18 19:16+0000\n" "Last-Translator: yannick56 \n" "Language-Team: KaZeR \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Execution depuis le dossier d'origine\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' mis à '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zéroième" msgid "first" msgstr "première" msgid "second" msgstr "deuxième" msgid "third" msgstr "troisième" msgid "fourth" msgstr "quatrième" msgid "fifth" msgstr "cinquième" msgid "sixth" msgstr "sixième" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zéroième sortie" msgid "first exit" msgstr "première sortie" msgid "second exit" msgstr "deuxième sortie" msgid "third exit" msgstr "troisième sortie" msgid "fourth exit" msgstr "quatrième sortie" msgid "fifth exit" msgstr "cinquième sortie" msgid "sixth exit" msgstr "sixième sortie" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "dans %d m" #, c-format msgid "%d feet" msgstr "%d pieds" #, c-format msgid "in %d feet" msgstr "dans %d pieds" #, c-format msgid "%d meters" msgstr "%d mètres" #, c-format msgid "in %d meters" msgstr "dans %d mètres" #, c-format msgid "%d.%d miles" msgstr "%d.%d milles" #, c-format msgid "in %d.%d miles" msgstr "dans %d.%d milles" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilomètres" #, c-format msgid "in %d.%d kilometers" msgstr "dans %d.%d kilomètres" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "un mille" msgstr[1] "%d milles" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "dans un mille" msgstr[1] "dans %d milles" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilomètre" msgstr[1] "%d kilomètres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "dans un kilomètre" msgstr[1] "dans %d kilomètres" msgid "exit" msgstr "sortie" msgid "into the ramp" msgstr "vers la sortie" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%ssur %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%ssur le %s%s%s|male form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%ssur la %s%s%s|female form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%ssur l'%s%s%s|neutral form" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%svers la %s" # tournez à droite #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "à droite" # tournez à gauche #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "à gauche" # utilisé pour les changements de voie pour les sorties? #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "légèrement " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "fortement " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "très fortement " # attention à l'espace à la fin #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "inconnu " msgid "When possible, please turn around" msgstr "Dès que possible, faites demi-tour" msgid "Enter the roundabout soon" msgstr "Préparez vous à vous engager dans le rond-point" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Entrer dans le rond-point %s" #, c-format msgid "then leave the roundabout at the %s" msgstr "puis sortez du rond-point à la %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Sortez du rond-point à la %s" #, c-format msgid "Follow the road for the next %s" msgstr "Suivez la route sur %s" msgid "soon" msgstr "bientôt" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Prenez la %1$s route vers la %2$s" #, c-format msgid "after %i roads" msgstr "après %i rues" msgid "now" msgstr "maintenant" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "puis prenez la %1$s route à %2$s" msgid "error" msgstr "erreur" # espace important après le 2 #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s, tournez %1$s%2$s %4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "puis tournez %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Vous êtes arrivé à destination : %s" msgid "then you have reached your destination." msgstr "ensuite vous serez à destination" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Commande" msgid "Length" msgstr "Distance" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Durée" msgid "Destination Length" msgstr "Distance à parcourir" msgid "Destination Time" msgstr "Temps de parcours" msgid "Roadbook" msgstr "Carnet de route" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Définir comme position" msgid "Set as destination" msgstr "Définir comme destination" msgid "Add as bookmark" msgstr "Ajouter aux favoris" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coord. à l'écran : %d %d" #. 020 msgid "Andorra" msgstr "Andorre" #. 784 msgid "United Arab Emirates" msgstr "Émirats Arabes Unis" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua et Barbuda" #. 660 msgid "Anguilla" msgstr "Anguille" #. 008 msgid "Albania" msgstr "Albanie" #. 051 msgid "Armenia" msgstr "Arménie" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Néérlandaises" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctique" #. 032 msgid "Argentina" msgstr "Argentine" #. 016 msgid "American Samoa" msgstr "Samoa américaines" #. 040 msgid "Austria" msgstr "Autriche" #. 036 msgid "Australia" msgstr "Australie" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland, îles" #. 031 msgid "Azerbaijan" msgstr "Azerbaïdjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnie Herzégovine" #. 052 msgid "Barbados" msgstr "Barbades" #. 050 msgid "Bangladesh" msgstr "Bengladesh" #. 056 msgid "Belgium" msgstr "Belgique" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarie" #. 048 msgid "Bahrain" msgstr "Bahreïn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudes" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivie" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brésil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhoutan" #. 074 msgid "Bouvet Island" msgstr "Îles Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Biélorussie" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Iles Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Répulique démocratique du Congo" #. 140 msgid "Central African Republic" msgstr "République Centrafricaine" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suisse" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Îles Cook" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Cameroun" #. 156 msgid "China" msgstr "Chine" #. 170 msgid "Colombia" msgstr "Colombie" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cap Vert" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Île Christmas" #. 196 msgid "Cyprus" msgstr "Chypre" #. 203 msgid "Czech Republic" msgstr "République Tchèque" #. 276 msgid "Germany" msgstr "Allemagne" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danemark" #. 212 msgid "Dominica" msgstr "Dominique" #. 214 msgid "Dominican Republic" msgstr "République Dominicaine" #. 012 msgid "Algeria" msgstr "Algérie" #. 218 msgid "Ecuador" msgstr "Equateur" #. 233 msgid "Estonia" msgstr "Estonie" #. 818 msgid "Egypt" msgstr "Égypte" #. 732 msgid "Western Sahara" msgstr "Sahara occidental" #. 232 msgid "Eritrea" msgstr "Erythrée" #. 724 msgid "Spain" msgstr "Espagne" #. 231 msgid "Ethiopia" msgstr "Ethiopie" #. 246 msgid "Finland" msgstr "Finlande" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Les Malouines (les Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronésie, États fédérés de" #. 234 msgid "Faroe Islands" msgstr "Îles Feroe" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Royaume-Uni" #. 308 msgid "Grenada" msgstr "Grenade" #. 268 msgid "Georgia" msgstr "Géorgie" #. 254 msgid "French Guiana" msgstr "Guyanne française" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambie" #. 324 msgid "Guinea" msgstr "Guinée" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinée équatoriale" #. 300 msgid "Greece" msgstr "Grèce" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Géorgie du Sud et Îles Sandwich du Sud" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinée-Bissau" #. 328 msgid "Guyana" msgstr "Guyane" #. 344 msgid "Hong Kong" msgstr "Hong-kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard, Île et McDonald, Îles" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatie" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hongrie" #. 360 msgid "Indonesia" msgstr "Indonésie" #. 372 msgid "Ireland" msgstr "Irlande" #. 376 msgid "Israel" msgstr "Israël" #. 833 msgid "Isle of Man" msgstr "Ile de Man" #. 356 msgid "India" msgstr "Inde" #. 086 msgid "British Indian Ocean Territory" msgstr "Océan Indien, Territoire britannique de l'" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, République islamique d'" #. 352 msgid "Iceland" msgstr "Islande" #. 380 msgid "Italy" msgstr "Italie" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaique" #. 400 msgid "Jordan" msgstr "Jordanie" #. 392 msgid "Japan" msgstr "Japon" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghizstan" #. 116 msgid "Cambodia" msgstr "Cambodge" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores, Les" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts et Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corée, République populaire démocratique de" #. 410 msgid "Korea, Republic of" msgstr "Corée, République de" #. 414 msgid "Kuwait" msgstr "Koweït" #. 136 msgid "Cayman Islands" msgstr "Îles Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Sainte-Lucie" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuanie" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Lettonie" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libye" #. 504 msgid "Morocco" msgstr "Maroc" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, République de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Îles Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macédoine" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolie" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Îles Mariannes du Nord" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritanie" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malte" #. 480 msgid "Mauritius" msgstr "Iles Maurice" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexique" #. 458 msgid "Malaysia" msgstr "Malaisie" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibie" #. 540 msgid "New Caledonia" msgstr "Nouvelle Calédonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Île Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Pays-Bas" #. 578 msgid "Norway" msgstr "Norvège" #. 524 msgid "Nepal" msgstr "Népal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nouvelle-Zélande" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Pérou" #. 258 msgid "French Polynesia" msgstr "Polynésie Française" #. 598 msgid "Papua New Guinea" msgstr "Papouasie-Nouvelle-Guinée" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pologne" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" #. 612 msgid "Pitcairn" msgstr "Îles Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestine" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roumanie" #. 688 msgid "Serbia" msgstr "Serbie" #. 643 msgid "Russian Federation" msgstr "Russie" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arabie Saoudite" #. 090 msgid "Solomon Islands" msgstr "Îles Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suède" #. 702 msgid "Singapore" msgstr "Singapour" #. 654 msgid "Saint Helena" msgstr "Sainte Hélène" #. 705 msgid "Slovenia" msgstr "Slovènie" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard et île Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovaquie" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "Saint-Marin" #. 686 msgid "Senegal" msgstr "Sénégal" #. 706 msgid "Somalia" msgstr "Somalie" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé-et-Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrie" #. 748 msgid "Swaziland" msgstr "Souaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Îles Turques et Caïques" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Terres australes françaises" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailande" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisie" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquie" #. 780 msgid "Trinidad and Tobago" msgstr "Trinité et Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, province de la Chine" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanie, République unie de" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Îles périphériques mineures des Etats-Unis" #. 840 msgid "United States" msgstr "États-Unis" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Ouzbékistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Saint-Siège (état de la cité du Vatican)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint-Vincent-et-les Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Îles Vierges britanniques" #. 850 msgid "Virgin Islands, U.S." msgstr "Îles Vierges des États-Unis" #. 704 msgid "Viet Nam" msgstr "Viêt Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis et Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Afrique du Sud" #. 894 msgid "Zambia" msgstr "Zambie" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Inconnu, ajoutez des étiquettes d'is_in à ces villes" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Véhicule sans nom" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Point sur la carte" msgid "Car" msgstr "Voiture" msgid "Iso2" msgstr "iso2" msgid "Iso3" msgstr "iso3" msgid "Country" msgstr "Pays" msgid "Postal" msgstr "Code postal" msgid "Town" msgstr "Ville" msgid "District" msgstr "Quartier" msgid "Street" msgstr "Rue" msgid "Number" msgstr "Numéro" msgid "Enter Destination" msgstr "Entrez une destination" msgid "Zip Code" msgstr "Code postal" msgid "City" msgstr "Ville" msgid "District/Township" msgstr "Canton" msgid "Map" msgstr "Carte" msgid "Bookmark" msgstr "Favoris" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Affichage" msgid "_Route" msgstr "Itinéraire" msgid "_Former Destinations" msgstr "Destinations précédentes" msgid "_Bookmarks" msgstr "Favoris" msgid "_Map" msgstr "Carte" msgid "_Layout" msgstr "Thème" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Véhicule" msgid "Zoom_Out" msgstr "Zoom arrière" msgid "Decrease zoom level" msgstr "Réduire le zoom" msgid "Zoom_In" msgstr "Zoom avant" msgid "Increase zoom level" msgstr "Augmenter le zoom" msgid "_Recalculate" msgstr "Recalculer" msgid "Redraw map" msgstr "Redessiner la carte" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "Fixer _destination" msgid "Opens address search dialog" msgstr "Ouvrir la fenêtre de recherche d'adresse" msgid "_Stop Navigation" msgstr "Annuler le trajet" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quitter" msgid "Quit the application" msgstr "Quitter l'application" msgid "Show position _cursor" msgstr "Montrer la position _curseur" msgid "_Lock on Road" msgstr "Coller à la route" msgid "_Keep orientation to the North" msgstr "Garder l'orientation au Nord" msgid "Switches map orientation to the north or the vehicle" msgstr "Changer l'orientation de la carte pour nord ou véhicule" msgid "_Roadbook" msgstr "Carnet de route" msgid "Show/hide route description" msgstr "Montrer/Masquer la description de la route" msgid "_Autozoom" msgstr "Zoom automatique" msgid "Enable/disable automatic zoom level changing" msgstr "Activer/désactiver le changement automatique du zoom" msgid "_Fullscreen" msgstr "Plein écran" msgid "Data" msgstr "Données" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Autre" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trajet restant %4.0f km heure d'arrivée estimée %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Trajet 0000 km temps estimé 0+00:00" msgid "Help" msgstr "Aide" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Voir dans le navigateur" msgid "Item type" msgstr "Type d'objet" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Rues" msgid "House numbers" msgstr "Numéros de maison" msgid "View Attributes" msgstr "Voir les attributs" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Points d'intérêt" msgid "View on map" msgstr "Voir sur la carte" msgid "Remove search results from the map" msgstr "Supprimer les résultats de la carte" msgid "Show results on the map" msgstr "Montrer les résultats sur la carte" msgid "Cut Bookmark" msgstr "Couper le signet" msgid "Copy Bookmark" msgstr "Copier le signet" msgid "Rename Bookmark" msgstr "Renommer le signet" msgid "Paste Bookmark" msgstr "Insérer le signet" msgid "Delete Bookmark" msgstr "Supprimer le signet" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Favoris" msgid "Bookmarks as waypoints" msgstr "Favoris comme points de passage" msgid "Save waypoints" msgstr "Sauvegarder les points de passage" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "Supprimer le dossier" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Ajouter un dossier de signets" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Insérer le signet" #, c-format msgid "Bookmark %s" msgstr "Ajouter %s aux favoris" #, c-format msgid "Download %s" msgstr "Télécharger %s" msgid "Map Download" msgstr "Télécharger la carte" msgid "Active" msgstr "Actif" msgid "Download Enabled" msgstr "Téléchargement activé" msgid "Download completely" msgstr "Télécharger completement" msgid "Show Satellite Status" msgstr "Afficher les infos satellite" msgid " Elevation " msgstr " Elévation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Afficher les données NMEA" msgid "car" msgstr "voiture" msgid "bike" msgstr "vélo" msgid "pedestrian" msgstr "piéton" #, c-format msgid "Current profile: %s" msgstr "Profil actuel : %s" #, c-format msgid "Change profile to: %s" msgstr "Définir le profil à : %s" msgid "Set as active" msgstr "Activer" msgid "Show Satellite status" msgstr "Afficher les infos satellite" msgid "Show NMEA data" msgstr "Afficher les données NMEA" msgid "Add Bookmark" msgstr "Ajouter au favoris" msgid "Rename" msgstr "Renommer" msgid "About Navit" msgstr "A propos de Navit" #. Authors msgid "By" msgstr "par" #. Contributors msgid "And all the Navit Team" msgstr "Et tous les membres du projet Navit" msgid "members and contributors." msgstr "membres et contributeurs" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Véhicule" msgid "Rules" msgstr "Règles" msgid "Lock on road" msgstr "Coller à la route" msgid "Northing" msgstr "Orientation toujours au Nord" msgid "Map follows Vehicle" msgstr "La carte suit le véhicule" msgid "Plan with Waypoints" msgstr "Définir avec points de passage" msgid "Maps" msgstr "Cartes" msgid "Layout" msgstr "Thème" msgid "Height Profile" msgstr "Profil de hauteur" msgid "Route Description" msgstr "Description de la route" msgid "Show Locale" msgstr "Afficher la locale" msgid "Former Destinations" msgstr "Destinations précédentes" msgid "- No former destinations available -" msgstr "- Pas de destinations précedentes -" msgid "Message" msgstr "Message" msgid "Back" msgstr "Retour" msgid "Back to map" msgstr "Retourner à la carte" msgid "Main Menu" msgstr "Menu principal" msgid "House number" msgstr "Numéro de maison" msgid "Next" msgstr "Suivant" msgid "Prev" msgstr "Précédent" msgid "Return to route!" msgstr "Retour à la route!" #. warning told msgid "Look out! Camera!" msgstr "Attention! Radar!" #. warning told msgid "Please decrease your speed" msgstr "Veuillez ralentir" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Chercher" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Villes" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Conduire ici" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "Cartes téléchargées" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "prêt" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Pas assez d'espace libre" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Temps restant" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Carte téléchargement" msgid "Vehicle Position" msgstr "Position du véhicule" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Oui" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit commencé" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit exécute" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Bienvenue chez Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Nous vous remercions d'avoir installé Navit!\n" "\n" "Pour commencer, sélectionnez \"Télécharger des cartes\" du menu et " "télechargez une carte de votre région. Les cartes sont volumineuses, donc il " "est préférable d'avoir une connection internet illimitée!\n" "\n" "Cartes: (c) OpenStreetMap contributors\n" "\n" "Amusez-vous avec Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Plus d'infos" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Zoom-avant" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Zoom-arrière" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Télécharger des cartes" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Quittez Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Supprimer cette carte?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Télécharger:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Erreur de téléchargement carte" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Carte télécharger avortée" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Cherchez adresse" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Entrez votre destination" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Correspondance partielle" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Recherche en cours..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adresse introuvable" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Obtenir des résultats de recherche" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Chargement des résultats de recherche" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Pas de résultats trouvés" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Aucun texte entré" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Destination fixée à:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu principal" msgid "" "Show\n" "Map" msgstr "" "Afficher\n" "la carte" msgid "Settings" msgstr "Configuration" msgid "Tools" msgstr "Outils" msgid "Route" msgstr "Itinéraire" msgid "About" msgstr "À propos" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" "Destinations\n" "précédentes" msgid "Quit" msgstr "Quitter" msgid "" "Stop\n" "Navigation" msgstr "" "Arrêter\n" "La navigation" msgid "Display" msgstr "Affichage" msgid "Fullscreen" msgstr "Plein écran" msgid "Window Mode" msgstr "Mode fenêtré" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" "Sauter le dernier \n" "Point de passage" msgid "" "Drop next \n" "Waypoint" msgstr "" "Sauter le prochain \n" "point de passage" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "voiture _le plus court" msgid "car_avoid_tolls" msgstr "voiture _sans péage" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cheval" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "Camion" #~ msgid "Replace Waypoints" #~ msgstr "Remplacer les points de passage" navit-0.5.0~svn5643+dfsg.1/po/fr_CH.po.in000066400000000000000000001110131221777731700175410ustar00rootroot00000000000000# French/Switzerland translations for navit # Copyright (C) 2007-2010 The Navit Team # This file is distributed under the same license as the navit package. # 'KaZeR' # 'Nekohayo' # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-02-06 10:37+0000\n" "Last-Translator: KaZeR \n" "Language-Team: KaZeR \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Execution depuis le dossier d'origine\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' mis à '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zéroième" msgid "first" msgstr "première" msgid "second" msgstr "deuxième" msgid "third" msgstr "troisième" msgid "fourth" msgstr "quatrième" msgid "fifth" msgstr "cinquième" msgid "sixth" msgstr "sixième" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "la zéroième sortie" msgid "first exit" msgstr "la première sortie" msgid "second exit" msgstr "la deuxième sortie" msgid "third exit" msgstr "la troisième sortie" msgid "fourth exit" msgstr "la quatrième sortie" msgid "fifth exit" msgstr "la cinquième sortie" msgid "sixth exit" msgstr "la sixième sortie" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "dans %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d mètres" #, c-format msgid "in %d meters" msgstr "dans %d mètres" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilomètres" #, c-format msgid "in %d.%d kilometers" msgstr "dans %d.%d kilomètres" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilomètre" msgstr[1] "%d kilomètres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "dans un kilomètre" msgstr[1] "dans %d kilomètres" msgid "exit" msgstr "sortie" msgid "into the ramp" msgstr "vers la sortie" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%ssur %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%ssur le %s%s%s|male form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%ssur la %s%s%s|female form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%ssur l'%s%s%s|neutral form" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%svers la %s" # tournez à droite #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "à droite" # tournez à gauche #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "à gauche" # utilisé pour les changements de voie pour les sorties? #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "légèrement " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "fortement " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "très fortement " # attention à l'espace à la fin #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "inconnu " msgid "When possible, please turn around" msgstr "Dès que possible, faites demi-tour" msgid "Enter the roundabout soon" msgstr "Préparez vous à vous engager dans le rond-point" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "puis sortez du rond-point à la %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Sortez du rond-point à la %s" #, c-format msgid "Follow the road for the next %s" msgstr "Suivez la route sur %s" msgid "soon" msgstr "bientôt" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Prenez la %1$s route vers la %2$s" #, c-format msgid "after %i roads" msgstr "après %i rues" msgid "now" msgstr "maintenant" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "puis prenez la %1$s route à %2$s" msgid "error" msgstr "erreur" # espace important après le 2 #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s, tournez %1$s%2$s %4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "puis tournez %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Vous êtes arrivé à destination : %s" msgid "then you have reached your destination." msgstr "ensuite vous serez à destination" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Commande" msgid "Length" msgstr "Distance" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Durée" msgid "Destination Length" msgstr "Distance à parcourir" msgid "Destination Time" msgstr "Temps de parcours" msgid "Roadbook" msgstr "Carnet de route" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Définir comme position" msgid "Set as destination" msgstr "Définir comme destination" msgid "Add as bookmark" msgstr "Ajouter aux favoris" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coord. à l'écran : %d %d" #. 020 msgid "Andorra" msgstr "Andorre" #. 784 msgid "United Arab Emirates" msgstr "Émirats Arabes Unis" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua et Barbuda" #. 660 msgid "Anguilla" msgstr "Anguille" #. 008 msgid "Albania" msgstr "Albanie" #. 051 msgid "Armenia" msgstr "Arménie" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Néérlandaises" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctique" #. 032 msgid "Argentina" msgstr "Argentine" #. 016 msgid "American Samoa" msgstr "Samoa américaines" #. 040 msgid "Austria" msgstr "Autriche" #. 036 msgid "Australia" msgstr "Australie" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland, îles" #. 031 msgid "Azerbaijan" msgstr "Azerbaïdjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnie Herzégovine" #. 052 msgid "Barbados" msgstr "Barbades" #. 050 msgid "Bangladesh" msgstr "Bengladesh" #. 056 msgid "Belgium" msgstr "Belgique" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarie" #. 048 msgid "Bahrain" msgstr "Bahreïn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudes" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivie" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brésil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhoutan" #. 074 msgid "Bouvet Island" msgstr "Îles Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Biélorussie" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Iles Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Répulique démocratique du Congo" #. 140 msgid "Central African Republic" msgstr "République Centrafricaine" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suisse" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Îles Cook" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Cameroun" #. 156 msgid "China" msgstr "Chine" #. 170 msgid "Colombia" msgstr "Colombie" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cap Vert" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Île Christmas" #. 196 msgid "Cyprus" msgstr "Chypre" #. 203 msgid "Czech Republic" msgstr "République Tchèque" #. 276 msgid "Germany" msgstr "Allemagne" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danemark" #. 212 msgid "Dominica" msgstr "Dominique" #. 214 msgid "Dominican Republic" msgstr "République Dominicaine" #. 012 msgid "Algeria" msgstr "Algérie" #. 218 msgid "Ecuador" msgstr "Equateur" #. 233 msgid "Estonia" msgstr "Estonie" #. 818 msgid "Egypt" msgstr "Égypte" #. 732 msgid "Western Sahara" msgstr "Sahara occidental" #. 232 msgid "Eritrea" msgstr "Erythrée" #. 724 msgid "Spain" msgstr "Espagne" #. 231 msgid "Ethiopia" msgstr "Ethiopie" #. 246 msgid "Finland" msgstr "Finlande" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Les Malouines (les Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronésie, États fédérés de" #. 234 msgid "Faroe Islands" msgstr "Îles Feroe" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Royaume-Uni" #. 308 msgid "Grenada" msgstr "Grenade" #. 268 msgid "Georgia" msgstr "Géorgie" #. 254 msgid "French Guiana" msgstr "Guyanne française" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambie" #. 324 msgid "Guinea" msgstr "Guinée" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinée équatoriale" #. 300 msgid "Greece" msgstr "Grèce" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Géorgie du Sud et Îles Sandwich du Sud" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinée-Bissau" #. 328 msgid "Guyana" msgstr "Guyane" #. 344 msgid "Hong Kong" msgstr "Hong-kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard, Île et McDonald, Îles" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatie" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hongrie" #. 360 msgid "Indonesia" msgstr "Indonésie" #. 372 msgid "Ireland" msgstr "Irlande" #. 376 msgid "Israel" msgstr "Israël" #. 833 msgid "Isle of Man" msgstr "Ile de Man" #. 356 msgid "India" msgstr "Inde" #. 086 msgid "British Indian Ocean Territory" msgstr "Océan Indien, Territoire britannique de l'" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, République islamique d'" #. 352 msgid "Iceland" msgstr "Islande" #. 380 msgid "Italy" msgstr "Italie" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaique" #. 400 msgid "Jordan" msgstr "Jordanie" #. 392 msgid "Japan" msgstr "Japon" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghizstan" #. 116 msgid "Cambodia" msgstr "Cambodge" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores, Les" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts et Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corée, République populaire démocratique de" #. 410 msgid "Korea, Republic of" msgstr "Corée, République de" #. 414 msgid "Kuwait" msgstr "Koweït" #. 136 msgid "Cayman Islands" msgstr "Îles Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Sainte-Lucie" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuanie" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Lettonie" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libye" #. 504 msgid "Morocco" msgstr "Maroc" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, République de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Îles Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macédoine" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolie" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Îles Mariannes du Nord" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritanie" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malte" #. 480 msgid "Mauritius" msgstr "Iles Maurice" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexique" #. 458 msgid "Malaysia" msgstr "Malaisie" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibie" #. 540 msgid "New Caledonia" msgstr "Nouvelle Calédonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Île Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Pays-Bas" #. 578 msgid "Norway" msgstr "Norvège" #. 524 msgid "Nepal" msgstr "Népal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nouvelle-Zélande" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Pérou" #. 258 msgid "French Polynesia" msgstr "Polynésie Française" #. 598 msgid "Papua New Guinea" msgstr "Papouasie-Nouvelle-Guinée" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pologne" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" #. 612 msgid "Pitcairn" msgstr "Îles Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestine" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roumanie" #. 688 msgid "Serbia" msgstr "Serbie" #. 643 msgid "Russian Federation" msgstr "Russie" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arabie Saoudite" #. 090 msgid "Solomon Islands" msgstr "Îles Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suède" #. 702 msgid "Singapore" msgstr "Singapour" #. 654 msgid "Saint Helena" msgstr "Sainte Hélène" #. 705 msgid "Slovenia" msgstr "Slovènie" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard et île Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovaquie" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "Saint-Marin" #. 686 msgid "Senegal" msgstr "Sénégal" #. 706 msgid "Somalia" msgstr "Somalie" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé-et-Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrie" #. 748 msgid "Swaziland" msgstr "Souaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Îles Turques et Caïques" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Terres australes françaises" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailande" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisie" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquie" #. 780 msgid "Trinidad and Tobago" msgstr "Trinité et Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, province de la Chine" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanie, République unie de" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Îles périphériques mineures des Etats-Unis" #. 840 msgid "United States" msgstr "États-Unis" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Ouzbékistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Saint-Siège (état de la cité du Vatican)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint-Vincent-et-les Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Îles Vierges britanniques" #. 850 msgid "Virgin Islands, U.S." msgstr "Îles Vierges des États-Unis" #. 704 msgid "Viet Nam" msgstr "Viêt Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis et Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Afrique du Sud" #. 894 msgid "Zambia" msgstr "Zambie" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Inconnu, ajoutez des étiquettes d'is_in à ces villes" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Point sur la carte" msgid "Car" msgstr "Voiture" msgid "Iso2" msgstr "iso2" msgid "Iso3" msgstr "iso3" msgid "Country" msgstr "Pays" msgid "Postal" msgstr "Code postal" msgid "Town" msgstr "Ville" msgid "District" msgstr "Quartier" msgid "Street" msgstr "Rue" msgid "Number" msgstr "Numéro" msgid "Enter Destination" msgstr "Entrez une destination" msgid "Zip Code" msgstr "Code postal" msgid "City" msgstr "Ville" msgid "District/Township" msgstr "Canton" msgid "Map" msgstr "Carte" msgid "Bookmark" msgstr "Favoris" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Affichage" msgid "_Route" msgstr "Itinéraire" msgid "_Former Destinations" msgstr "Destinations précédentes" msgid "_Bookmarks" msgstr "Favoris" msgid "_Map" msgstr "Carte" msgid "_Layout" msgstr "Thème" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Véhicule" msgid "Zoom_Out" msgstr "Zoom arrière" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom avant" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalculer" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Annuler le trajet" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quitter" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Coller à la route" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Carnet de route" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Zoom automatique" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Plein écran" msgid "Data" msgstr "Données" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Autre" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trajet restant %4.0f km heure d'arrivée estimée %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Trajet 0000 km temps estimé 0+00:00" msgid "Help" msgstr "Aide" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Voir dans le navigateur" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Rues" msgid "House numbers" msgstr "Numéros de maison" msgid "View Attributes" msgstr "Voir les attributs" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Points d'intérêt" msgid "View on map" msgstr "Voir sur la carte" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Favoris" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Ajouter %s aux favoris" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Afficher les infos satellite" msgid " Elevation " msgstr " Elévation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Afficher les données NMEA" msgid "car" msgstr "voiture" msgid "bike" msgstr "vélo" msgid "pedestrian" msgstr "piéton" #, c-format msgid "Current profile: %s" msgstr "Profil actuel : %s" #, c-format msgid "Change profile to: %s" msgstr "Définir le profil à : %s" msgid "Set as active" msgstr "Activer" msgid "Show Satellite status" msgstr "Afficher les infos satellite" msgid "Show NMEA data" msgstr "Afficher les données NMEA" msgid "Add Bookmark" msgstr "Ajouter au favoris" msgid "Rename" msgstr "" msgid "About Navit" msgstr "A propos de Navit" #. Authors msgid "By" msgstr "Développé par" #. Contributors msgid "And all the Navit Team" msgstr "Et tous les membres du projet Navit" msgid "members and contributors." msgstr "membres et contributeurs" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Véhicule" msgid "Rules" msgstr "Règles" msgid "Lock on road" msgstr "Coller à la route" msgid "Northing" msgstr "Orientation toujours au Nord" msgid "Map follows Vehicle" msgstr "La carte suit le véhicule" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Cartes" msgid "Layout" msgstr "Thème" msgid "Height Profile" msgstr "Profil de hauteur" msgid "Route Description" msgstr "Description de la route" msgid "Show Locale" msgstr "Afficher la locale" msgid "Former Destinations" msgstr "Destinations précédentes" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Message" msgid "Back" msgstr "Retour" msgid "Back to map" msgstr "Retourner à la carte" msgid "Main Menu" msgstr "Menu principal" msgid "House number" msgstr "Numéro de maison" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Position du véhicule" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu principal" msgid "" "Show\n" "Map" msgstr "" "Afficher\n" "la carte" msgid "Settings" msgstr "Configuration" msgid "Tools" msgstr "Outils" msgid "Route" msgstr "Itinéraire" msgid "About" msgstr "À propos" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Quitter" msgid "" "Stop\n" "Navigation" msgstr "" "Arrêter\n" "La navigation" msgid "Display" msgstr "Affichage" msgid "Fullscreen" msgstr "Plein écran" msgid "Window Mode" msgstr "Mode fenêtré" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cheval" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Dans %s, engagez vous dans le rond-point" #~ msgid "Cursor" #~ msgstr "Curseur" #~ msgid " SNR " #~ msgstr " Rapport Signal/Bruit " #~ msgid " PRN " #~ msgstr " PRN " navit-0.5.0~svn5643+dfsg.1/po/gl.po.in000066400000000000000000000774231221777731700172020ustar00rootroot00000000000000# Galician translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Iván Pérez , 2009. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 09:32+0000\n" "Last-Translator: andreout \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando desde o directorio fonte.\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Establecendo '%s' a '%s'.\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "cero-ésimo" msgid "first" msgstr "primeiro" msgid "second" msgstr "segundo" msgid "third" msgstr "terceiro" msgid "fourth" msgstr "cuarto" msgid "fifth" msgstr "quinto" msgid "sixth" msgstr "sexto" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "cero-ésimo" msgid "first exit" msgstr "primeria saída" msgid "second exit" msgstr "segunda saída" msgid "third exit" msgstr "terceria saída" msgid "fourth exit" msgstr "cuarta saída" msgid "fifth exit" msgstr "quinta saída" msgid "sixth exit" msgstr "sexta saída" #, c-format msgid "%d m" msgstr "%d m." #, c-format msgid "in %d m" msgstr "en %d m." #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "en %d metros" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "en %d.%d quilómetros" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un quilómetro" msgstr[1] "%d quilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "nun quilómetro" msgstr[1] "en %d quilómetros" msgid "exit" msgstr "saída" msgid "into the ramp" msgstr "na rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s na rúa %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s no %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s na %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s no %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s na %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "á dereita" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "á esquerda" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "suavemente " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "bruscamente " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "moi bruscamente " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "descoñecido " msgid "When possible, please turn around" msgstr "Cando sexa posible, dea a volta" msgid "Enter the roundabout soon" msgstr "Métase pronto na rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "logo saia da rotonda pola %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Saia da rotonda pola %s" #, c-format msgid "Follow the road for the next %s" msgstr "Siga a estrada durante os próximos %s" msgid "soon" msgstr "cedo" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tome a estrada %1$s cara o %2$s" #, c-format msgid "after %i roads" msgstr "despois de %i estradas" msgid "now" msgstr "agora" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "logo tome a estrada %1$s cara %2$s" msgid "error" msgstr "erro" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Xire %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "En %s, entre na rotonda" #~ msgid "%d.%d kilometer" #~ msgstr "quilómetro %d.%d" navit-0.5.0~svn5643+dfsg.1/po/he.po.in000066400000000000000000001133751221777731700171710ustar00rootroot00000000000000# Hebrew translation for navit # Copyright (c) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Rintintin , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 20:37+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "מופעל מתיקיית המקור\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "הגדרת '%s' ל־'%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "במקום ה־0" msgid "first" msgstr "ראשון" msgid "second" msgstr "שני" msgid "third" msgstr "שלישי" msgid "fourth" msgstr "רביעי" msgid "fifth" msgstr "חמישי" msgid "sixth" msgstr "שישי" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "היציאה ה-0" msgid "first exit" msgstr "היציאה הראשונה" msgid "second exit" msgstr "היציאה השנייה" msgid "third exit" msgstr "היציאה השלישית" msgid "fourth exit" msgstr "היציאה הרביעית" msgid "fifth exit" msgstr "היציאה החמישית" msgid "sixth exit" msgstr "היציאה השישית" #, c-format msgid "%d m" msgstr "%d מ'" #, c-format msgid "in %d m" msgstr "בעוד %d מ'" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d מטרים" #, c-format msgid "in %d meters" msgstr "בעוד %d מטרים" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "בעוד %d.%d קילומטרים" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "קילומטר אחד" msgstr[1] "%d קילומטרים" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "בעוד קילומטר אחד" msgstr[1] "בעוד %d קילומטרים" msgid "exit" msgstr "יציאה" msgid "into the ramp" msgstr "אל הרמפה" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s אל רחוב %s %s %s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s אל רחוב %s %s %s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s אל רחוב %s %s %s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s אל רחוב %s %s %s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sאל תוך ה%s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "ימינה" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "שמאלה" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "מעט " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "בצורה חדה " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "באופן חזק מאד " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "לא ידוע " msgid "When possible, please turn around" msgstr "כשיתאפשר לך, פנה חזרה" msgid "Enter the roundabout soon" msgstr "הכנס לכיכר הקרובה" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "אחר כך צא מהכיכר ב%s" #, c-format msgid "Leave the roundabout at the %s" msgstr "צא מהכיכר ב%s" #, c-format msgid "Follow the road for the next %s" msgstr "המשך בדרך זו למשך %s" msgid "soon" msgstr "בקרוב" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "קח את הכביש ה%1$s אל %2$s" #, c-format msgid "after %i roads" msgstr "לאחר %i כבישים" msgid "now" msgstr "כעת" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "ואז קח את הכביש ה%1$s אל ה%2$s" msgid "error" msgstr "שגיאה" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "פנה %1$s %2$s %4$s %3$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "ואז פנה %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "הגעת ליעדך %s" msgid "then you have reached your destination." msgstr "ואז הגעת ליעד." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "מיקום" msgid "Command" msgstr "פקודה" msgid "Length" msgstr "אורך" msgid "km" msgstr "ק\"מ" msgid "m" msgstr "מ'" msgid "Time" msgstr "זמן" msgid "Destination Length" msgstr "מרחק ליעד" msgid "Destination Time" msgstr "זמן ליעד" msgid "Roadbook" msgstr "הוראות נסיעה" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "קבע כמיקום נוכחי" msgid "Set as destination" msgstr "קבע כיעד" msgid "Add as bookmark" msgstr "צור סימניה למקום זה" #, c-format msgid "Point 0x%x 0x%x" msgstr "נקודה 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "קואורדינטת מסך: %d %d" #. 020 msgid "Andorra" msgstr "אנדורה" #. 784 msgid "United Arab Emirates" msgstr "איחוד האמירויות הערביות" #. 004 msgid "Afghanistan" msgstr "אפגניסטן" #. 028 msgid "Antigua and Barbuda" msgstr "אנטיגואה וברבודה" #. 660 msgid "Anguilla" msgstr "אנגווילה" #. 008 msgid "Albania" msgstr "אלבניה" #. 051 msgid "Armenia" msgstr "ארמניה" #. 530 msgid "Netherlands Antilles" msgstr "האנטילים ההולנדיים" #. 024 msgid "Angola" msgstr "אנגולה" #. 010 msgid "Antarctica" msgstr "אנטארקטיקה" #. 032 msgid "Argentina" msgstr "ארגנטינה" #. 016 msgid "American Samoa" msgstr "סמואה האמריקאית" #. 040 msgid "Austria" msgstr "אוסטריה" #. 036 msgid "Australia" msgstr "אוסטרליה" #. 533 msgid "Aruba" msgstr "ארובה" #. 248 msgid "Aland Islands" msgstr "איי אלאנדה" #. 031 msgid "Azerbaijan" msgstr "אזרבייג'אן" #. 070 msgid "Bosnia and Herzegovina" msgstr "בוסניה והרצגובינה" #. 052 msgid "Barbados" msgstr "ברבדוס" #. 050 msgid "Bangladesh" msgstr "בנגלדש" #. 056 msgid "Belgium" msgstr "בלגיה" #. 854 msgid "Burkina Faso" msgstr "בורקינה פאסו" #. 100 msgid "Bulgaria" msgstr "בולגריה" #. 048 msgid "Bahrain" msgstr "בחריין" #. 108 msgid "Burundi" msgstr "בורונדי" #. 204 msgid "Benin" msgstr "בנין" #. 652 msgid "Saint Barthelemy" msgstr "סנט ברתלמי" #. 060 msgid "Bermuda" msgstr "ברמודה" #. 096 msgid "Brunei Darussalam" msgstr "סולטנות ברוניי" #. 068 msgid "Bolivia" msgstr "בוליביה" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "ברזיל" #. 044 msgid "Bahamas" msgstr "איי בהאמה" #. 064 msgid "Bhutan" msgstr "בהוטאן" #. 074 msgid "Bouvet Island" msgstr "אי בובט" #. 072 msgid "Botswana" msgstr "בוטסואנה" #. 112 msgid "Belarus" msgstr "בלרוס" #. 084 msgid "Belize" msgstr "בליז" #. 124 msgid "Canada" msgstr "קנדה" #. 166 msgid "Cocos (Keeling) Islands" msgstr "איי קוקוס (קילינג)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "הרפובליקה הדמוקרטית של קונגו" #. 140 msgid "Central African Republic" msgstr "רפובליקת מרכז אפריקה" #. 178 msgid "Congo" msgstr "קונגו" #. 756 msgid "Switzerland" msgstr "שוויץ" #. 384 msgid "Cote d'Ivoire" msgstr "חוף השנהב" #. 184 msgid "Cook Islands" msgstr "איי קוק" #. 152 msgid "Chile" msgstr "צ'ילה" #. 120 msgid "Cameroon" msgstr "קמרון" #. 156 msgid "China" msgstr "סין" #. 170 msgid "Colombia" msgstr "קולומביה" #. 188 msgid "Costa Rica" msgstr "קוסטה ריקה" #. 192 msgid "Cuba" msgstr "קובה" #. 132 msgid "Cape Verde" msgstr "קייפ ורדה" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "אי כריסמס" #. 196 msgid "Cyprus" msgstr "קפריסין" #. 203 msgid "Czech Republic" msgstr "צ'כיה" #. 276 msgid "Germany" msgstr "גרמניה" #. 262 msgid "Djibouti" msgstr "ג'יבוטי" #. 208 msgid "Denmark" msgstr "דנמרק" #. 212 msgid "Dominica" msgstr "דומיניקה" #. 214 msgid "Dominican Republic" msgstr "הרפובליקה הדומיניקנית" #. 012 msgid "Algeria" msgstr "אלג'יריה" #. 218 msgid "Ecuador" msgstr "אקוודור" #. 233 msgid "Estonia" msgstr "אסטוניה" #. 818 msgid "Egypt" msgstr "מצרים" #. 732 msgid "Western Sahara" msgstr "סהרה המערבית" #. 232 msgid "Eritrea" msgstr "אריתריאה" #. 724 msgid "Spain" msgstr "ספרד" #. 231 msgid "Ethiopia" msgstr "אתיופיה" #. 246 msgid "Finland" msgstr "פינלנד" #. 242 msgid "Fiji" msgstr "פיג'י" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "איי פוקלנד" #. 583 msgid "Micronesia, Federated States of" msgstr "מיקרונזיה" #. 234 msgid "Faroe Islands" msgstr "איי פארו" #. 250 msgid "France" msgstr "צרפת" #. 266 msgid "Gabon" msgstr "גבון" #. 826 msgid "United Kingdom" msgstr "אנגליה" #. 308 msgid "Grenada" msgstr "גרנדה" #. 268 msgid "Georgia" msgstr "גאורגיה" #. 254 msgid "French Guiana" msgstr "גיאנה הצרפתית" #. 831 msgid "Guernsey" msgstr "גרנזי" #. 288 msgid "Ghana" msgstr "גאנה" #. 292 msgid "Gibraltar" msgstr "גיברלטר" #. 304 msgid "Greenland" msgstr "גרינלנד" #. 270 msgid "Gambia" msgstr "גמביה" #. 324 msgid "Guinea" msgstr "גינאה" #. 312 msgid "Guadeloupe" msgstr "גוואדלופ" #. 226 msgid "Equatorial Guinea" msgstr "גינאה המשוונית" #. 300 msgid "Greece" msgstr "יוון" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים" #. 320 msgid "Guatemala" msgstr "גואטמלה" #. 316 msgid "Guam" msgstr "גואם" #. 624 msgid "Guinea-Bissau" msgstr "גיניאה ביסאו" #. 328 msgid "Guyana" msgstr "גיאנה" #. 344 msgid "Hong Kong" msgstr "הונג קונג" #. 334 msgid "Heard Island and McDonald Islands" msgstr "האי הרד ואיי מקדונלד" #. 340 msgid "Honduras" msgstr "הונדורס" #. 191 msgid "Croatia" msgstr "קרואטיה" #. 332 msgid "Haiti" msgstr "האיטי" #. 348 msgid "Hungary" msgstr "הונגריה" #. 360 msgid "Indonesia" msgstr "אינדונזיה" #. 372 msgid "Ireland" msgstr "אירלנד" #. 376 msgid "Israel" msgstr "ישראל" #. 833 msgid "Isle of Man" msgstr "האי מאן" #. 356 msgid "India" msgstr "הודו" #. 086 msgid "British Indian Ocean Territory" msgstr "הטריטוריה הבריטית באוקיינוס ההודי" #. 368 msgid "Iraq" msgstr "עיראק" #. 364 msgid "Iran, Islamic Republic of" msgstr "אירן" #. 352 msgid "Iceland" msgstr "איסלנד" #. 380 msgid "Italy" msgstr "איטליה" #. 832 msgid "Jersey" msgstr "ג'רסי" #. 388 msgid "Jamaica" msgstr "ג'מייקה" #. 400 msgid "Jordan" msgstr "ירדן" #. 392 msgid "Japan" msgstr "יפן" #. 404 msgid "Kenya" msgstr "קניה" #. 417 msgid "Kyrgyzstan" msgstr "קירגיסטן" #. 116 msgid "Cambodia" msgstr "קמבודיה" #. 296 msgid "Kiribati" msgstr "קיריבאטי" #. 174 msgid "Comoros" msgstr "איי קומורו" #. 659 msgid "Saint Kitts and Nevis" msgstr "סנט קיטס ונוויס" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "קוריאה הצפונית" #. 410 msgid "Korea, Republic of" msgstr "קוריאה הדרומית" #. 414 msgid "Kuwait" msgstr "כווית" #. 136 msgid "Cayman Islands" msgstr "איי קיימן" #. 398 msgid "Kazakhstan" msgstr "קזחסטן" #. 418 msgid "Lao People's Democratic Republic" msgstr "לאוס" #. 422 msgid "Lebanon" msgstr "לבנון" #. 662 msgid "Saint Lucia" msgstr "סנט לוסיה" #. 438 msgid "Liechtenstein" msgstr "ליכטנשטיין" #. 144 msgid "Sri Lanka" msgstr "סרי לנקה" #. 430 msgid "Liberia" msgstr "ליבריה" #. 426 msgid "Lesotho" msgstr "לסוטו" #. 440 msgid "Lithuania" msgstr "ליטא" #. 442 msgid "Luxembourg" msgstr "לוקסמבורג" #. 428 msgid "Latvia" msgstr "לטביה" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "לוב" #. 504 msgid "Morocco" msgstr "מרוקו" #. 492 msgid "Monaco" msgstr "מונקו" #. 498 msgid "Moldova, Republic of" msgstr "מולדובה" #. 499 msgid "Montenegro" msgstr "מונטנגרו" #. 663 msgid "Saint Martin (French part)" msgstr "סנט מרטיו (החלק הצרפתי)" #. 450 msgid "Madagascar" msgstr "מדגסקר" #. 584 msgid "Marshall Islands" msgstr "איי מרשל" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "מקדוניה" #. 466 msgid "Mali" msgstr "מאלי" #. 104 msgid "Myanmar" msgstr "מיאנמר" #. 496 msgid "Mongolia" msgstr "מונגוליה" #. 446 msgid "Macao" msgstr "מקאו" #. 580 msgid "Northern Mariana Islands" msgstr "איי מריאנה הצפוניים" #. 474 msgid "Martinique" msgstr "מרטיניק" #. 478 msgid "Mauritania" msgstr "מאוריטניה" #. 500 msgid "Montserrat" msgstr "מונטסראט" #. 470 msgid "Malta" msgstr "מלטה" #. 480 msgid "Mauritius" msgstr "מאוריציוס" #. 462 msgid "Maldives" msgstr "האיים המלדיביים" #. 454 msgid "Malawi" msgstr "מלאווי" #. 484 msgid "Mexico" msgstr "מקסיקו" #. 458 msgid "Malaysia" msgstr "מלזיה" #. 508 msgid "Mozambique" msgstr "מוזמביק" #. 516 msgid "Namibia" msgstr "נמיביה" #. 540 msgid "New Caledonia" msgstr "קלדוניה החדשה" #. 562 msgid "Niger" msgstr "ניז'ר" #. 574 msgid "Norfolk Island" msgstr "האי נורפוק" #. 566 msgid "Nigeria" msgstr "ניגריה" #. 558 msgid "Nicaragua" msgstr "ניקרגואה" #. 528 msgid "Netherlands" msgstr "הולנד" #. 578 msgid "Norway" msgstr "נורבגיה" #. 524 msgid "Nepal" msgstr "נפאל" #. 520 msgid "Nauru" msgstr "נאורו" #. 570 msgid "Niue" msgstr "ניואה" #. 554 msgid "New Zealand" msgstr "ניו-זילנד" #. 512 msgid "Oman" msgstr "עומן" #. 591 msgid "Panama" msgstr "פנמה" #. 604 msgid "Peru" msgstr "פרו" #. 258 msgid "French Polynesia" msgstr "פולינזיה הצרפתית" #. 598 msgid "Papua New Guinea" msgstr "פפואה גינאה החדשה" #. 608 msgid "Philippines" msgstr "הפיליפינים" #. 586 msgid "Pakistan" msgstr "פקיסטן" #. 616 msgid "Poland" msgstr "פולין" #. 666 msgid "Saint Pierre and Miquelon" msgstr "סנט פייר ומיקלון" #. 612 msgid "Pitcairn" msgstr "פיטקרן" #. 630 msgid "Puerto Rico" msgstr "פורטו ריקו" #. 275 msgid "Palestinian Territory, Occupied" msgstr "פלסטין" #. 620 msgid "Portugal" msgstr "פורטוגל" #. 585 msgid "Palau" msgstr "פלאו" #. 600 msgid "Paraguay" msgstr "פראגוואי" #. 634 msgid "Qatar" msgstr "קטאר" #. 638 msgid "Reunion" msgstr "ריוניון" #. 642 msgid "Romania" msgstr "רומניה" #. 688 msgid "Serbia" msgstr "סרביה" #. 643 msgid "Russian Federation" msgstr "רוסיה" #. 646 msgid "Rwanda" msgstr "רואנדה" #. 682 msgid "Saudi Arabia" msgstr "ערב הסעודית" #. 090 msgid "Solomon Islands" msgstr "איי שלמה" #. 690 msgid "Seychelles" msgstr "איי סיישל" #. 736 msgid "Sudan" msgstr "סודן" #. 752 msgid "Sweden" msgstr "שבדיה" #. 702 msgid "Singapore" msgstr "סינגפור" #. 654 msgid "Saint Helena" msgstr "סנט הלנה" #. 705 msgid "Slovenia" msgstr "סלובניה" #. 744 msgid "Svalbard and Jan Mayen" msgstr "סוולבראד ויאן מאיין" #. 703 msgid "Slovakia" msgstr "סלובקיה" #. 694 msgid "Sierra Leone" msgstr "סיירה ליאונה" #. 674 msgid "San Marino" msgstr "סן מרינו" #. 686 msgid "Senegal" msgstr "סנגל" #. 706 msgid "Somalia" msgstr "סומליה" #. 740 msgid "Suriname" msgstr "סורינאם" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "סאו תומה ופרינסיפה" #. 222 msgid "El Salvador" msgstr "אל סלוודור" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "סוריה" #. 748 msgid "Swaziland" msgstr "סווזילנד" #. 796 msgid "Turks and Caicos Islands" msgstr "איי טורקס וקאיקוס" #. 148 msgid "Chad" msgstr "צ'אד" #. 260 msgid "French Southern Territories" msgstr "הטריטוריות הדרום צרפתיות" #. 768 msgid "Togo" msgstr "טוגו" #. 764 msgid "Thailand" msgstr "תאילנד" #. 762 msgid "Tajikistan" msgstr "טג'יקיסטן" #. 772 msgid "Tokelau" msgstr "טוקלאו" #. 626 msgid "Timor-Leste" msgstr "טימור מזרח" #. 795 msgid "Turkmenistan" msgstr "טורקמניסטן" #. 788 msgid "Tunisia" msgstr "טוניסיה" #. 776 msgid "Tonga" msgstr "טונגה" #. 792 msgid "Turkey" msgstr "טורקיה" #. 780 msgid "Trinidad and Tobago" msgstr "טרינידד וטובגו" #. 798 msgid "Tuvalu" msgstr "טובלו" #. 158 msgid "Taiwan, Province of China" msgstr "טאיוואן" #. 834 msgid "Tanzania, United Republic of" msgstr "טנזניה" #. 804 msgid "Ukraine" msgstr "אוקראינה" #. 800 msgid "Uganda" msgstr "אוגנדה" #. 581 msgid "United States Minor Outlying Islands" msgstr "איים מזעריים ומרוחקים השייכים לארה\"ב" #. 840 msgid "United States" msgstr "ארצות הברית" #. 858 msgid "Uruguay" msgstr "אורוגוואי" #. 860 msgid "Uzbekistan" msgstr "אוזבקיסטן" #. 336 msgid "Holy See (Vatican City State)" msgstr "וותיקן" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "סנט וינסנט והגרנדינים" #. 862 msgid "Venezuela" msgstr "ונצואלה" #. 092 msgid "Virgin Islands, British" msgstr "איי הבתולה (בריטיים)" #. 850 msgid "Virgin Islands, U.S." msgstr "איי הבתולה (ארה\"ב)" #. 704 msgid "Viet Nam" msgstr "וייטנאם" #. 548 msgid "Vanuatu" msgstr "ונואטו" #. 876 msgid "Wallis and Futuna" msgstr "ואליס ופוטונה" #. 882 msgid "Samoa" msgstr "סמואה" #. 887 msgid "Yemen" msgstr "תימן" #. 175 msgid "Mayotte" msgstr "מיוט" #. 710 msgid "South Africa" msgstr "דרום אפריקה" #. 894 msgid "Zambia" msgstr "זמביה" #. 716 msgid "Zimbabwe" msgstr "זימבבואה" msgid "* Unknown, add is_in tags to those cities" msgstr "*לא ידוע,הוסף תגי is_in לערים אלו" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "נקודה במפה" msgid "Car" msgstr "מכונית" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "ארץ" msgid "Postal" msgstr "דואר" msgid "Town" msgstr "עיירה" msgid "District" msgstr "מחוז" msgid "Street" msgstr "רחוב" msgid "Number" msgstr "מס'" msgid "Enter Destination" msgstr "הכנס יעד" msgid "Zip Code" msgstr "מיקוד" msgid "City" msgstr "עיר" msgid "District/Township" msgstr "מחוז/איזור העיר" msgid "Map" msgstr "מפה" msgid "Bookmark" msgstr "סימניה" msgid "Destination" msgstr "יעד" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "תצוגה" msgid "_Route" msgstr "מסלול" msgid "_Former Destinations" msgstr "יעדים קודמים" msgid "_Bookmarks" msgstr "סימניות" msgid "_Map" msgstr "מפה" msgid "_Layout" msgstr "מערך" msgid "_Projection" msgstr "תכנון" msgid "_Vehicle" msgstr "רכב (ׂGPS)" msgid "Zoom_Out" msgstr "התרחק" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "התקרב" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "חשב מחדש" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "מידע" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "עצור ניווט" msgid "Test" msgstr "בדיקה" msgid "_Quit" msgstr "_יציאה" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "הנעל על הדרך" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "הוראות נסיעה" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "זום אוטומטי" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "מסך מלא" msgid "Data" msgstr "מידע" msgid "N" msgstr "צ'" msgid "NE" msgstr "צפון מזרח" msgid "E" msgstr "מז'" msgid "SE" msgstr "דרום מזרח" msgid "S" msgstr "ד'" msgid "SW" msgstr "דרום מערב" msgid "W" msgstr "מע'" msgid "NW" msgstr "צפון מערב" #. Android resource: @strings/no msgid "No" msgstr "לא" msgid "2D" msgstr "דו-מימד" msgid "3D" msgstr "תלת מימד" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "נשארו עוד %4.0f ק\"מ, זמן הגעה משוער %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "מסלול 0000ק\"מ 0+00:00 זמן הגעה משוער" msgid "Help" msgstr "עזרה" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "צפה בדפדפן אינטרנט" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "רחובות" msgid "House numbers" msgstr "מספרי בתים" msgid "View Attributes" msgstr "צפה בתכונות" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "נ\"צ" msgid "View on map" msgstr "צפה במפה" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "סימניות" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "סימנייה %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "הצגת מצב הלוויינים" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "הצגת נתוני NMEA" msgid "car" msgstr "מכונית" msgid "bike" msgstr "אופניים" msgid "pedestrian" msgstr "הולך רגל" #, c-format msgid "Current profile: %s" msgstr "פרופיל נוכחי: %s" #, c-format msgid "Change profile to: %s" msgstr "שנה את הפרופיל ל: %s" msgid "Set as active" msgstr "הגדרה כפעיל" msgid "Show Satellite status" msgstr "הצגת מצב הלוויינים" msgid "Show NMEA data" msgstr "הצגת נתוני NMEA" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "רכב (ׂGPS)" msgid "Rules" msgstr "כללים" msgid "Lock on road" msgstr "נעול על הדרך" msgid "Northing" msgstr "הצפנה" msgid "Map follows Vehicle" msgstr "מפה עוקבת אחר הרכב" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "מפות" msgid "Layout" msgstr "מערך" msgid "Height Profile" msgstr "פרופיל גובה" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "יעדים קודמים" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "הודעה" msgid "Back" msgstr "חזרה" msgid "Back to map" msgstr "חזור למפה" msgid "Main Menu" msgstr "תפריט ראשי" msgid "House number" msgstr "מספר בית" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "מיקום רכב" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "תפריט ראשי" msgid "" "Show\n" "Map" msgstr "" "הצגת\n" "מפה" msgid "Settings" msgstr "הגדרות" msgid "Tools" msgstr "כלים" msgid "Route" msgstr "מסלול" msgid "About" msgstr "" msgid "Actions" msgstr "פעולות" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "יציאה" msgid "" "Stop\n" "Navigation" msgstr "" "עצור\n" "ניווט" msgid "Display" msgstr "תצוגה" msgid "Fullscreen" msgstr "מסך מלא" msgid "Window Mode" msgstr "מצב חלון" msgid "Description" msgstr "תיאור" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "ב%s, הכנס לכיכר" #~ msgid "Cursor" #~ msgstr "סמן" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d קילומטר" navit-0.5.0~svn5643+dfsg.1/po/hr.po.in000066400000000000000000001035621221777731700172030ustar00rootroot00000000000000# Croatian translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # klajo 2010 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-03-21 04:05+0000\n" "Last-Translator: klajo \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "prvi" msgid "second" msgstr "drugi" msgid "third" msgstr "treći" msgid "fourth" msgstr "četvrti" msgid "fifth" msgstr "peti" msgid "sixth" msgstr "šesti" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "prvi izlaz" msgid "second exit" msgstr "drugi izlaz" msgid "third exit" msgstr "treći izlaz" msgid "fourth exit" msgstr "četvrti izlaz" msgid "fifth exit" msgstr "peti izlaz" msgid "sixth exit" msgstr "šesti izlaz" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "za %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metara" #, c-format msgid "in %d meters" msgstr "za %d metara" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometara" #, c-format msgid "in %d.%d kilometers" msgstr "za %d.%d kilometara" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometar" msgstr[1] "%d kilometara" msgstr[2] "%d kilometara" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "za %d kilometar" msgstr[1] "za %d kilometara" msgstr[2] "za %d kilometara" msgid "exit" msgstr "izlaz" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%su ulicu %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%su %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "desno" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "lijevo" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "jednostavno " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "teško " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "vrlo teško " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "nepoznatno " msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Pratite cestu za idući %s" msgid "soon" msgstr "uskoro" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "nakon %i ceste" msgid "now" msgstr "sada" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "greška" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Krenite %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "onda krenite %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "nakon toga ste stigli do cilja" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozicija" msgid "Command" msgstr "Naredba" msgid "Length" msgstr "Dužina" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Vrijeme" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "Vrijeme dolaska" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Ujedinjeni Arapski Emirati" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albanija" #. 051 msgid "Armenia" msgstr "Armenija" #. 530 msgid "Netherlands Antilles" msgstr "Nizozemski Antili" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Američki Samoa" #. 040 msgid "Austria" msgstr "Austrija" #. 036 msgid "Australia" msgstr "Australija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "Azerbejdžan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna i Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeš" #. 056 msgid "Belgium" msgstr "Belgija" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bugarska" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "Bolivija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "Bocvana" #. 112 msgid "Belarus" msgstr "Bjelorusija" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosovi (Keeling) otoci" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "Srednjoafrička Republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švicarska" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "Cookovi otoci" #. 152 msgid "Chile" msgstr "Čile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Zelenortski otoci" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Božićni otoci" #. 196 msgid "Cyprus" msgstr "Cipar" #. 203 msgid "Czech Republic" msgstr "Češka Republika" #. 276 msgid "Germany" msgstr "Njemačka" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "Danska" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikanska Republika" #. 012 msgid "Algeria" msgstr "Alžir" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estonija" #. 818 msgid "Egypt" msgstr "Egipat" #. 732 msgid "Western Sahara" msgstr "Zapadna Sahara" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "Španjolska" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Finska" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "Otočje Faroe" #. 250 msgid "France" msgstr "Francuska" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Velika Britanija" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grenland" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvineja" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorska Gvineja" #. 300 msgid "Greece" msgstr "Grčka" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gvineja-Bissau" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Otok Heard i MacDonaldovi otoci" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Hrvatska" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Mađarska" #. 360 msgid "Indonesia" msgstr "Indonezija" #. 372 msgid "Ireland" msgstr "Irska" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Britanski Teritorij Indijskog Oceana" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italija" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanski otoci" #. 398 msgid "Kazakhstan" msgstr "Kazahstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Sveta Lucija" #. 438 msgid "Liechtenstein" msgstr "Lihtenštajn" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberija" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libijska Arapska Jamahirija" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Crna Gora" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Maršalovi otoci" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonija" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricijus" #. 462 msgid "Maldives" msgstr "Maledivi" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibija" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "Nigerija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nizozemska" #. 578 msgid "Norway" msgstr "Norveška" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "Novi Zeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francuska Polinezija" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "Filipini" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poljska" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "Rumunjska" #. 688 msgid "Serbia" msgstr "Srbija" #. 643 msgid "Russian Federation" msgstr "Ruska Federacija" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "Saudijska Arabija" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Švedska" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Sveta Helena" #. 705 msgid "Slovenia" msgstr "Slovenija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "Slovačka" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalija" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirijska Arapska Republika" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajland" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunis" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turska" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Kineska Pokrajina Tajvan" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "Sjedinjene države" #. 858 msgid "Uruguay" msgstr "Urugvaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikan (država Vatikanskog grada)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "Venecuela" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "Vijetnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "Južna Afrika" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Država" msgid "Postal" msgstr "Poštanski" msgid "Town" msgstr "Grad" msgid "District" msgstr "Područje" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Broj" msgid "Enter Destination" msgstr "Ubacite odredište" msgid "Zip Code" msgstr "Poštanski broj" msgid "City" msgstr "Grad" msgid "District/Township" msgstr "" msgid "Map" msgstr "Karta" msgid "Bookmark" msgstr "Oznaka" msgid "Destination" msgstr "Odredište" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Ekran" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Nekadašnji odredište" msgid "_Bookmarks" msgstr "Oznake" msgid "_Map" msgstr "Karta" msgid "_Layout" msgstr "Izgled" msgid "_Projection" msgstr "Projekcija" msgid "_Vehicle" msgstr "Vozilo" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Ponovno izračunaj" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop navigaciju" msgid "Test" msgstr "Provjera" msgid "_Quit" msgstr "_Izlaz" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Cijeli ekran" msgid "Data" msgstr "Podaci" msgid "N" msgstr "S" msgid "NE" msgstr "SI" msgid "E" msgstr "I" msgid "SE" msgstr "JI" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Pomoć" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "kućni broja" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Gledaj na kartu" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Oznake" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Pokaži status satelita" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "auto" msgid "bike" msgstr "biciklo" msgid "pedestrian" msgstr "pješak" #, c-format msgid "Current profile: %s" msgstr "Trenutni profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Mijenjaj profil na: %s" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "Pokaži status satelita" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "Dodaj oznaku" msgid "Rename" msgstr "" msgid "About Navit" msgstr "Sve od Navit" #. Authors msgid "By" msgstr "Od" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vozilo" msgid "Rules" msgstr "Pravila" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Karte" msgid "Layout" msgstr "Izgled" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Nekadašnji odredište" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Poruka" msgid "Back" msgstr "Natrag" msgid "Back to map" msgstr "Vrati kartu" msgid "Main Menu" msgstr "Glavni meni" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Pozicija vozila" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Glavni izbornik" msgid "" "Show\n" "Map" msgstr "" "Pokaži\n" "kartu" msgid "Settings" msgstr "Postavke" msgid "Tools" msgstr "" msgid "Route" msgstr "Ruta" msgid "About" msgstr "O programu" msgid "Actions" msgstr "Akcije" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Izlaz" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "navigaciju" msgid "Display" msgstr "Ekran" msgid "Fullscreen" msgstr "Cijeli ekran" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Opis" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "konj" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Cursor" #~ msgstr "Kursor" navit-0.5.0~svn5643+dfsg.1/po/hu.po.in000066400000000000000000001110761221777731700172050ustar00rootroot00000000000000# Hungarian translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # WintermuteHun , 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 12:25+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Futtatás a forráskönyvtárból\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' beállítása erre: '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulladik" msgid "first" msgstr "első" msgid "second" msgstr "második" msgid "third" msgstr "harmadik" msgid "fourth" msgstr "negyedik" msgid "fifth" msgstr "ötödik" msgid "sixth" msgstr "hatodik" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulladik kijáraton" msgid "first exit" msgstr "első kijáraton" msgid "second exit" msgstr "második kijáraton" msgid "third exit" msgstr "harmadik kijáraton" msgid "fourth exit" msgstr "negyedik kijáraton" msgid "fifth exit" msgstr "ötödik kijáraton" msgid "sixth exit" msgstr "hatodik kijáraton" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "%d m után" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d méter" #, c-format msgid "in %d meters" msgstr "%d méter után" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilométer" #, c-format msgid "in %d.%d kilometers" msgstr "%d,%d kilométer után" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "egy kilométer" msgstr[1] "%d kilométer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "egy kilométer után" msgstr[1] "%d kilométer után" msgid "exit" msgstr "kijárat" msgid "into the ramp" msgstr "a felhajtóra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sa(z) %s%s%s utcába" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sa(z) %s%s%s útra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sa(z) %s%s%s útra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sa(z) %s%s%s útra" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%shajtson rá a(z) %s útra" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "jobbra" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "balra" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "enyhén " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "élesen " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "nagyon élesen " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ismeretlen " msgid "When possible, please turn around" msgstr "Amint lehet, fordujon meg" msgid "Enter the roundabout soon" msgstr "Hajtson be a körforgalomba hamarosan." #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "majd hagyja el a körforgalmat a(z) %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Hagyja el a körforgalmat a(z) %s" #, c-format msgid "Follow the road for the next %s" msgstr "Haladjon az úton a következő %sig" msgid "soon" msgstr "hamarosan" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "A(z) %1$s útnál forduljon %2$s" #, c-format msgid "after %i roads" msgstr "%i út után" msgid "now" msgstr "most" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "aztán a(z) %1$s útnál forduljon %2$s" msgid "error" msgstr "hiba" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Forduljon %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "aztán forduljon %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Elérte az úticélját: %s" msgid "then you have reached your destination." msgstr "majd eléri az úticélját." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozíció" msgid "Command" msgstr "Parancs" msgid "Length" msgstr "Hossz" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Idő" msgid "Destination Length" msgstr "Távolság a céltól" msgid "Destination Time" msgstr "Menetidő" msgid "Roadbook" msgstr "Útikalauz" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Beállítás pozícióként" msgid "Set as destination" msgstr "Beállítás úticélként" msgid "Add as bookmark" msgstr "Hozzáadás a könyvjelzőkhöz" #, c-format msgid "Point 0x%x 0x%x" msgstr "Pont 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Képernyő koordinátái: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Egyesült Arab Emirátusok" #. 004 msgid "Afghanistan" msgstr "Afganisztán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua és Barbuda" #. 660 msgid "Anguilla" msgstr "Angola" #. 008 msgid "Albania" msgstr "Albánia" #. 051 msgid "Armenia" msgstr "Örményország" #. 530 msgid "Netherlands Antilles" msgstr "Holland Antillák" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktisz" #. 032 msgid "Argentina" msgstr "Argentína" #. 016 msgid "American Samoa" msgstr "Amerikai Szamoa" #. 040 msgid "Austria" msgstr "Ausztria" #. 036 msgid "Australia" msgstr "Ausztrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland-sziget" #. 031 msgid "Azerbaijan" msgstr "Azerbajdzsán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosznia és Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Banglades" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgária" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudák" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Szultanátus" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazília" #. 044 msgid "Bahamas" msgstr "Bahamák" #. 064 msgid "Bhutan" msgstr "Bhután" #. 074 msgid "Bouvet Island" msgstr "Bouvet-sziget" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Fehéroroszország" #. 084 msgid "Belize" msgstr "Belizé" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) -szigetek" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongói Demokratikus Köztársaság" #. 140 msgid "Central African Republic" msgstr "Közép-afrikai Köztársaság" #. 178 msgid "Congo" msgstr "Kongó" #. 756 msgid "Switzerland" msgstr "Svájc" #. 384 msgid "Cote d'Ivoire" msgstr "Elefántcsontpart" #. 184 msgid "Cook Islands" msgstr "Cook-szigetek" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kína" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Zöldfoki-szigetek" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Karácsony-szigetek" #. 196 msgid "Cyprus" msgstr "Ciprus" #. 203 msgid "Czech Republic" msgstr "Csehország" #. 276 msgid "Germany" msgstr "Németország" #. 262 msgid "Djibouti" msgstr "Dzsibuti" #. 208 msgid "Denmark" msgstr "Dánia" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikai Köztársaság" #. 012 msgid "Algeria" msgstr "Algéria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Észtország" #. 818 msgid "Egypt" msgstr "Egyiptom" #. 732 msgid "Western Sahara" msgstr "Nyugat-Szahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanyolország" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Finnország" #. 242 msgid "Fiji" msgstr "Fidzsi-szigetek" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-szigetek" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronéz Államszövetség" #. 234 msgid "Faroe Islands" msgstr "Feröer-szigetek" #. 250 msgid "France" msgstr "Franciaország" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Egyesült Királyság" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Grúzia" #. 254 msgid "French Guiana" msgstr "Francia Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghána" #. 292 msgid "Gibraltar" msgstr "Gibraltár" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Egyenlítői Guinea" #. 300 msgid "Greece" msgstr "Görögország" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Dél-Georgia és Déli-Sandwich-szigetek" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hongkong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard-sziget és McDonald-szigetek" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Horvátország" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Magyarország" #. 360 msgid "Indonesia" msgstr "Indonézia" #. 372 msgid "Ireland" msgstr "Írország" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Man sziget" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Brit Indiai Óceáni Terület" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán" #. 352 msgid "Iceland" msgstr "Izland" #. 380 msgid "Italy" msgstr "Olaszország" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordánia" #. 392 msgid "Japan" msgstr "Japán" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizisztán" #. 116 msgid "Cambodia" msgstr "Kambodzsa" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comore-szigetek" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts és Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Koreai Demokratikus Népköztársaság" #. 410 msgid "Korea, Republic of" msgstr "Koreai Köztársaság" #. 414 msgid "Kuwait" msgstr "Kuvait" #. 136 msgid "Cayman Islands" msgstr "Kajmán-szigetek" #. 398 msgid "Kazakhstan" msgstr "Kazahsztán" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoszi Demokratikus Népköztársaság" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litvánia" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettország" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Líbiai Arab Jamahiriya" #. 504 msgid "Morocco" msgstr "Marokkó" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldáv Köztársaság" #. 499 msgid "Montenegro" msgstr "Montenegró" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (francia oldal)" #. 450 msgid "Madagascar" msgstr "Madagaszkár" #. 584 msgid "Marshall Islands" msgstr "Marsall-szigetek" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedónia, korábban Jugoszláv Köztársaság" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongólia" #. 446 msgid "Macao" msgstr "Makaó" #. 580 msgid "Northern Mariana Islands" msgstr "Északi Mariana-szigetek" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritánia" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Málta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldív-szigetek" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexikó" #. 458 msgid "Malaysia" msgstr "Malajzia" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Új-Kaledónia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk-sziget" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Hollandia" #. 578 msgid "Norway" msgstr "Norvégia" #. 524 msgid "Nepal" msgstr "Nepál" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Új-Zéland" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francia Polinézia" #. 598 msgid "Papua New Guinea" msgstr "Pápua Új-Guinea" #. 608 msgid "Philippines" msgstr "Fülöp-szigetek" #. 586 msgid "Pakistan" msgstr "Pakisztán" #. 616 msgid "Poland" msgstr "Lengyelország" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre és Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn-szigetek" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palesztin Megszállt Területek" #. 620 msgid "Portugal" msgstr "Portugália" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Románia" #. 688 msgid "Serbia" msgstr "Szerbia" #. 643 msgid "Russian Federation" msgstr "Orosz Föderáció" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Szaúd-Arábia" #. 090 msgid "Solomon Islands" msgstr "Salamon-szigetek" #. 690 msgid "Seychelles" msgstr "Seychelles-szigetek" #. 736 msgid "Sudan" msgstr "Szudán" #. 752 msgid "Sweden" msgstr "Svédország" #. 702 msgid "Singapore" msgstr "Szingapúr" #. 654 msgid "Saint Helena" msgstr "Szent Ilona" #. 705 msgid "Slovenia" msgstr "Szlovénia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard-szigetek és Jan Mayen-sziget" #. 703 msgid "Slovakia" msgstr "Szlovákia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Szenegál" #. 706 msgid "Somalia" msgstr "Szomália" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé és Príncipe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Szíriai Arab Köztársaság" #. 748 msgid "Swaziland" msgstr "Szváziföld" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks és Caicos-szigetek" #. 148 msgid "Chad" msgstr "Csád" #. 260 msgid "French Southern Territories" msgstr "Francia déli területek" #. 768 msgid "Togo" msgstr "Togó" #. 764 msgid "Thailand" msgstr "Thaiföld" #. 762 msgid "Tajikistan" msgstr "Tadzsikisztán" #. 772 msgid "Tokelau" msgstr "Tokelau-szigetek" #. 626 msgid "Timor-Leste" msgstr "Kelet-Timor" #. 795 msgid "Turkmenistan" msgstr "Türkmenisztán" #. 788 msgid "Tunisia" msgstr "Tunézia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Törökország" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad és Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tajvan, Kínai Tartomány" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzániai Egyesült Köztársaság" #. 804 msgid "Ukraine" msgstr "Ukrajna" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Amerikai Csendes-óceáni-szigetek" #. 840 msgid "United States" msgstr "Egyesült Államok" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Üzbegisztán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikán" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent és a Grenadines-szigetek" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin-szigetek (brit)" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin-szigetek (USA)" #. 704 msgid "Viet Nam" msgstr "Vietnám" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis és Futuna" #. 882 msgid "Samoa" msgstr "Szamoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Dél-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "*Ismeretlen, is_in címkék hozzáadása ezekhez a városokhoz" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Térképpont" msgid "Car" msgstr "Autó" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Ország" msgid "Postal" msgstr "Ir. szám" msgid "Town" msgstr "Város" msgid "District" msgstr "Kerület" msgid "Street" msgstr "Utca" msgid "Number" msgstr "Házszám" msgid "Enter Destination" msgstr "Úticél megadása" msgid "Zip Code" msgstr "Irányítószám" msgid "City" msgstr "Város" msgid "District/Township" msgstr "Kerület/Környék" msgid "Map" msgstr "Térkép" msgid "Bookmark" msgstr "Könyvjelző" msgid "Destination" msgstr "Úticél" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Megjelenítés" msgid "_Route" msgstr "Útvonal" msgid "_Former Destinations" msgstr "Korábbi úticélok" msgid "_Bookmarks" msgstr "Könyvjelzők" msgid "_Map" msgstr "Térkép" msgid "_Layout" msgstr "Elrendezés" msgid "_Projection" msgstr "Vetület" msgid "_Vehicle" msgstr "Jármű" msgid "Zoom_Out" msgstr "Távolítás" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Közelítés" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Újratervezés" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Információk" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Navigálás vége" msgid "Test" msgstr "Teszt" msgid "_Quit" msgstr "_Kilépés" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Rögzítés az úthoz" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Útikalauz" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Ráközelítés" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Teljes képernyő" msgid "Data" msgstr "Adat" msgid "N" msgstr "É" msgid "NE" msgstr "ÉK" msgid "E" msgstr "K" msgid "SE" msgstr "DK" msgid "S" msgstr "D" msgid "SW" msgstr "DNy" msgid "W" msgstr "Ny" msgid "NW" msgstr "ÉNy" #. Android resource: @strings/no msgid "No" msgstr "Nincs" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Útvonal hossza: %4.0fkm, becsült menetidő: %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Útvonal hossza 0000km, becsült menetidő: 0+00:00" msgid "Help" msgstr "Súgó" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Megtekintés böngészőben" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Utcák" msgid "House numbers" msgstr "Házszámok" msgid "View Attributes" msgstr "Attribútumok megjelenítése" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI-k" msgid "View on map" msgstr "Megtekintés térképen" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Könyvjelzők" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "%s hozzáadása a könyvjelzőkhöz" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Műhold státusz" msgid " Elevation " msgstr " Magasság " msgid " Azimuth " msgstr " Irány " msgid "Show NMEA Data" msgstr "NMEA adatok" msgid "car" msgstr "autós" msgid "bike" msgstr "kerékpáros" msgid "pedestrian" msgstr "gyalogos" #, c-format msgid "Current profile: %s" msgstr "Jelenlegi profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Profil módosítása erre: %s" msgid "Set as active" msgstr "Aktívra állítás" msgid "Show Satellite status" msgstr "Műhold státusz" msgid "Show NMEA data" msgstr "NMEA adatok" msgid "Add Bookmark" msgstr "Könyvjelző hozzáadása" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Jármű" msgid "Rules" msgstr "Szabályok" msgid "Lock on road" msgstr "Rögzítés az úthoz" msgid "Northing" msgstr "Észak felé" msgid "Map follows Vehicle" msgstr "A térkép követi a járművet" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Térképek" msgid "Layout" msgstr "Elrendezés" msgid "Height Profile" msgstr "Magassági profil" msgid "Route Description" msgstr "Útvonalleírás" msgid "Show Locale" msgstr "Hely megjelenítése" msgid "Former Destinations" msgstr "Korábbi úticélok" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Üzenet" msgid "Back" msgstr "Vissza" msgid "Back to map" msgstr "Vissza a térképhez" msgid "Main Menu" msgstr "Főmenü" msgid "House number" msgstr "Házszám" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "Vigyázz, kamera!" #. warning told msgid "Please decrease your speed" msgstr "Lassíts!" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Jármű helyzete" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Főmenü" msgid "" "Show\n" "Map" msgstr "" "Térkép\n" "megjelenítése" msgid "Settings" msgstr "Beállítások" msgid "Tools" msgstr "Eszközök" msgid "Route" msgstr "Útvonal" msgid "About" msgstr "" msgid "Actions" msgstr "Műveletek" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Kilépés" msgid "" "Stop\n" "Navigation" msgstr "" "Navigáció\n" "leállítása" msgid "Display" msgstr "Megjelenítés" msgid "Fullscreen" msgstr "Teljes képernyő" msgid "Window Mode" msgstr "Ablak mód" msgid "Description" msgstr "Leírás" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "ló" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "%s után hajtson be a körforgalomba." #~ msgid "Cursor" #~ msgstr "Mutató" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d kilométer" #~ msgid " SNR " #~ msgstr " SNR " #~ msgid " PRN " #~ msgstr " PRN " navit-0.5.0~svn5643+dfsg.1/po/id.po.in000066400000000000000000001052371221777731700171670ustar00rootroot00000000000000# Indonesian translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Joel-apobae.com , 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-27 15:01+0000\n" "Last-Translator: M Bambang I \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "penataan '%s' ke '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "ke nol" msgid "first" msgstr "pertama" msgid "second" msgstr "kedua" msgid "third" msgstr "ketiga" msgid "fourth" msgstr "keempat" msgid "fifth" msgstr "kelima" msgid "sixth" msgstr "keenam" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "exit pertama" msgid "second exit" msgstr "exit kedua" msgid "third exit" msgstr "exit ketiga" msgid "fourth exit" msgstr "exit keempat" msgid "fifth exit" msgstr "exit kelima" msgid "sixth exit" msgstr "exit keenam" #, c-format msgid "%d m" msgstr "%d meter" #, c-format msgid "in %d m" msgstr "dalam %d meter" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "dalam %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "dalam %d.%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "dalam %d kilometer" msgid "exit" msgstr "keluar" msgid "into the ramp" msgstr "menuju jalur yang melandai" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s menuju jalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%smenuju ke%s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%smenuju ke %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%smenuju ke %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%smenuju ke %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "kanan" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "Kiri" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "dengan mudah " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "Sangat " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "amat sangat " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "tidak diketahui " msgid "When possible, please turn around" msgstr "bila memungkinkan, balik arah" msgid "Enter the roundabout soon" msgstr "segera memasuki bundaran" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "kemudian tinggalkan bundaran pada %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Tinggalkan bundaran pada %s" #, c-format msgid "Follow the road for the next %s" msgstr "ikuti jalan untuk ke tujuan berikutnya %s" msgid "soon" msgstr "segera" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ambil %1$s jalan ke %2$s" #, c-format msgid "after %i roads" msgstr "setelah %i jalan" msgid "now" msgstr "saat ini" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "kemudian ambil %1$s jalan menuju %2$s" msgid "error" msgstr "kesalahan" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Beloklah %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "kemudian beloklah %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "anda telah sampai pada tujuan %s" msgid "then you have reached your destination." msgstr "kini anda telah sampai pada tujuan" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisi" msgid "Command" msgstr "Perintah" msgid "Length" msgstr "" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "Jarak ke tujuan" msgid "Destination Time" msgstr "Waktu di tujuan" msgid "Roadbook" msgstr "Panduan perjalanan" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Tetapkan sebagai posisi" msgid "Set as destination" msgstr "Tetapkan sebagai tujuan" msgid "Add as bookmark" msgstr "Tambahkan sebagai penunjuk" #, c-format msgid "Point 0x%x 0x%x" msgstr "Titik 0X%x 0X%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinat dilayar :%d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Uni Emirat Arab" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua dan Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Belanda" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Kepulauan Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia dan Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilia" #. 044 msgid "Bahamas" msgstr "Kepulauan Bahama" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Pulau Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kepulauan Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Republik Demokrat Kongo" #. 140 msgid "Central African Republic" msgstr "Republik Afrika Tengah" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Swiss" #. 384 msgid "Cote d'Ivoire" msgstr "Pantai Gading" #. 184 msgid "Cook Islands" msgstr "Kepulauan Cook" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Tanjung Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Pulau Christmas" #. 196 msgid "Cyprus" msgstr "Siprus" #. 203 msgid "Czech Republic" msgstr "Republik Ceko" #. 276 msgid "Germany" msgstr "Jerman" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Republik Dominikan" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Mesir" #. 732 msgid "Western Sahara" msgstr "Sahara Barat" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanyol" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Kepulauan Fakland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "Kepulauan Faroe" #. 250 msgid "France" msgstr "Perancis" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Inggris" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guiana Perancis" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Jibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "Yunani" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Pulau Heard dan Kepulauan McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hongaria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlandia" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Republik Islam Iran" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Jepang" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Kamboja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoro" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea Utara" #. 410 msgid "Korea, Republic of" msgstr "Korea Selatan" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kepulauan Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Santa Lusia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Republik Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Kepulauan Mashall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Kaledonia Baru" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Pulau Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Belanda" #. 578 msgid "Norway" msgstr "Norwegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "Selandia Baru" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "Philipina" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polandia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federasi Rusia" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arab Saudi" #. 090 msgid "Solomon Islands" msgstr "Kepulauan Salomon" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Swedia" #. 702 msgid "Singapore" msgstr "Singapura" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Republik Arab Siria" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turki" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad dan Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "Amerika Serikat" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "Viet Nam" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yaman" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "Afika Selatan" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Letak pada peta" msgid "Car" msgstr "Mibil" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "Negara" msgid "Postal" msgstr "Pos" msgid "Town" msgstr "Kota" msgid "District" msgstr "" msgid "Street" msgstr "Jalan" msgid "Number" msgstr "Nomer" msgid "Enter Destination" msgstr "Masukan Tujuan" msgid "Zip Code" msgstr "kode Pos" msgid "City" msgstr "kota" msgid "District/Township" msgstr "" msgid "Map" msgstr "Peta" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "Tujuan" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Tampilan" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "Peta" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "Proyeksi" msgid "_Vehicle" msgstr "Kendaraan" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Menghitung ulang" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informasi" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Navigasi berhenti" msgid "Test" msgstr "Tes" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Panduan perjalanan" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "AutoZoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Layar penuh" msgid "Data" msgstr "Data" msgid "N" msgstr "Utara" msgid "NE" msgstr "Timur Laut" msgid "E" msgstr "Timur" msgid "SE" msgstr "Tenggara" msgid "S" msgstr "Selatan" msgid "SW" msgstr "Barat Daya" msgid "W" msgstr "Barat" msgid "NW" msgstr "Barat Laut" #. Android resource: @strings/no msgid "No" msgstr "Tidak" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rute %4.0fkm %02d:%02d Perkiraan waktu kedatangan" msgid "Route 0000km 0+00:00 ETA" msgstr "Rute 0000km 0+00:00 Perkiraan waktu kedatangan" msgid "Help" msgstr "Bantuan" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "jalan" msgid "House numbers" msgstr "Nomor Rumah" msgid "View Attributes" msgstr "Lihat atribut" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Lihat pada peta" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Hapus penanda" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Penanda %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Status Satelit" msgid " Elevation " msgstr " Elevasi " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Data NMEA" msgid "car" msgstr "mobil" msgid "bike" msgstr "sepeda" msgid "pedestrian" msgstr "pejalan kaki" #, c-format msgid "Current profile: %s" msgstr "Profil saat ini: %s" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "Diaktifkan" msgid "Show Satellite status" msgstr "Status Satelit" msgid "Show NMEA data" msgstr "Data NMEA" msgid "Add Bookmark" msgstr "Tambah Penanda" msgid "Rename" msgstr "" msgid "About Navit" msgstr "Tentang Navit" #. Authors msgid "By" msgstr "Oleh" #. Contributors msgid "And all the Navit Team" msgstr "Dan seluruh anggota tim Navit" msgid "members and contributors." msgstr "para anggota dan kontributor" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Kendaraan" msgid "Rules" msgstr "Aturan - aturan" msgid "Lock on road" msgstr "Kunci pada jalan" msgid "Northing" msgstr "Keutara" msgid "Map follows Vehicle" msgstr "Peta mengikuti kendaraan" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Peta - peta" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "Profil ketinggian" msgid "Route Description" msgstr "Deskripsi rute" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Pesan" msgid "Back" msgstr "Kembali" msgid "Back to map" msgstr "Kembali ke Peta" msgid "Main Menu" msgstr "Menu Utama" msgid "House number" msgstr "Nomer rumah" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posisi kendaraan" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu Utama" msgid "" "Show\n" "Map" msgstr "" "Tampilan\n" "Map" msgid "Settings" msgstr "Pengaturan" msgid "Tools" msgstr "Peralatan" msgid "Route" msgstr "Rute" msgid "About" msgstr "Tentang" msgid "Actions" msgstr "Tindakan-tindakan" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Berhenti" msgid "" "Stop\n" "Navigation" msgstr "" "Navigasi\n" "Berhenti" msgid "Display" msgstr "Tampilan" msgid "Fullscreen" msgstr "Layar penuh" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Deskripsi" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "kuda" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Dalam %s,memasuki bundaran" navit-0.5.0~svn5643+dfsg.1/po/it.po.in000066400000000000000000001103131221777731700171760ustar00rootroot00000000000000# translation of it.po to Italiano # Italian translations for navit # Copyright (C) 2007, 2008 The Navit Team # This file is distributed under the same license as the navit package. # Andrea GHENSI 2007 # Niccolo Rigacci , 2008. msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 09:27+0000\n" "Last-Translator: Marco Ciampa \n" "Language-Team: Italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Esecuzione dalla cartella di compilazione\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "impostazione di '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "primo" msgid "second" msgstr "secondo" msgid "third" msgstr "terzo" msgid "fourth" msgstr "quarto" msgid "fifth" msgstr "quinto" msgid "sixth" msgstr "sesto" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "Uscita zero" msgid "first exit" msgstr "prima uscita" msgid "second exit" msgstr "seconda uscita" msgid "third exit" msgstr "terza uscita" msgid "fourth exit" msgstr "quarta uscita" msgid "fifth exit" msgstr "quinta uscita" msgid "sixth exit" msgstr "sesta uscita" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "fra %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metri" #, c-format msgid "in %d meters" msgstr "fra %d metri" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d chilometri" #, c-format msgid "in %d.%d kilometers" msgstr "fra %d,%d chilometri" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un chilometro" msgstr[1] "%d chilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "fra un chilometro" msgstr[1] "fra %d chilometri" msgid "exit" msgstr "esci" msgid "into the ramp" msgstr "nella rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sin %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sin %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sin %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sin %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sin %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "destra" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "sinistra" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "leggermente " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "decisamente " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "molto decisamente " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "facendo quasi inversione " msgid "When possible, please turn around" msgstr "Appena possibile, invertire il senso di marcia" msgid "Enter the roundabout soon" msgstr "Tra poco si entrerà in rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "e alla rotonda prendere la %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Alla rotonda prendere la %s" #, c-format msgid "Follow the road for the next %s" msgstr "Seguire la strada per i prossimi %s" msgid "soon" msgstr "tra poco" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Prendere la %1$s strada a %2$s" #, c-format msgid "after %i roads" msgstr "tra %i strade" msgid "now" msgstr "adesso" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "poi prendere la %1$s strada a %2$s" msgid "error" msgstr "errore" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Svoltare %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "poi girare %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Siete arrivati a destinazione %s" msgid "then you have reached your destination." msgstr "poi sarete arrivati a destinazione" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posizione" msgid "Command" msgstr "Indicazione" msgid "Length" msgstr "Distanza" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempo" msgid "Destination Length" msgstr "Distanza all'arrivo" msgid "Destination Time" msgstr "Tempo all'arrivo" msgid "Roadbook" msgstr "Quaderno di viaggio" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Imposta come posizione" msgid "Set as destination" msgstr "Imposta come destinazione" msgid "Add as bookmark" msgstr "Aggiungi come segnalibro" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punto 0x%x, 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordinate schermo: %d, %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emirati Arabi Uniti" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua e Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antille olandesi" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartide" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americane" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Isole Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbaigian" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia - Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgio" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasile" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Isola Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorussia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Isole Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Repubblica Democratica del" #. 140 msgid "Central African Republic" msgstr "Repubblica Centrafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Svizzera" #. 384 msgid "Cote d'Ivoire" msgstr "Costa d'Avorio" #. 184 msgid "Cook Islands" msgstr "Isole Cook" #. 152 msgid "Chile" msgstr "Cile" #. 120 msgid "Cameroon" msgstr "Camerun" #. 156 msgid "China" msgstr "Cina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Capo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Isola di Natale" #. 196 msgid "Cyprus" msgstr "Cipro" #. 203 msgid "Czech Republic" msgstr "Repubblica Ceca" #. 276 msgid "Germany" msgstr "Germania" #. 262 msgid "Djibouti" msgstr "Gibuti" #. 208 msgid "Denmark" msgstr "Danimarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Repubblica Dominicana" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egitto" #. 732 msgid "Western Sahara" msgstr "Sahara Occidentale" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spagna" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Figi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Isole Falkland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Stati Federati di Micronesia" #. 234 msgid "Faroe Islands" msgstr "Isole Fær Øer" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Regno Unito" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guyana Francese" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibilterra" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupa" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Equatoriale" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia del Sud e Isole delle Sandwich meridionali" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Isole Heard e McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croazia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungheria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israele" #. 833 msgid "Isle of Man" msgstr "Isola di Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territorio Britannico dell'Oceano Indiano" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Repubblica Islamica dell'" #. 352 msgid "Iceland" msgstr "Islanda" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Giamaica" #. 400 msgid "Jordan" msgstr "Giordania" #. 392 msgid "Japan" msgstr "Giappone" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghizistan" #. 116 msgid "Cambodia" msgstr "Cambogia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comore" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts e Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, Repubblica Democratica Popolare di" #. 410 msgid "Korea, Republic of" msgstr "Corea, Repubblica di" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Isole Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakistan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, Repubblica popolare democratica del" #. 422 msgid "Lebanon" msgstr "Libano" #. 662 msgid "Saint Lucia" msgstr "Santa Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Lussemburgo" #. 428 msgid "Latvia" msgstr "Lettonia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libia" #. 504 msgid "Morocco" msgstr "Marocco" #. 492 msgid "Monaco" msgstr "Principato di Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (parte francese)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Isole Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Repubblica di Macedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Isole Marianne Settentrionali" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Messico" #. 458 msgid "Malaysia" msgstr "Malesia" #. 508 msgid "Mozambique" msgstr "Mozambico" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nuova Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Isola Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Olanda" #. 578 msgid "Norway" msgstr "Norvegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nuova Zelanda" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Perù" #. 258 msgid "French Polynesia" msgstr "Polinesia francese" #. 598 msgid "Papua New Guinea" msgstr "Papua Nuova Guinea" #. 608 msgid "Philippines" msgstr "Filippine" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre e Miquelon" #. 612 msgid "Pitcairn" msgstr "Isole Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portogallo" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Isola della Riunione" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federazione Russa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudita" #. 090 msgid "Solomon Islands" msgstr "Isole Salomone" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Svezia" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sant'Elena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovacchia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Siria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks e Caicos" #. 148 msgid "Chad" msgstr "Ciad" #. 260 msgid "French Southern Territories" msgstr "Terre Australi e Antartiche Francesi" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailandia" #. 762 msgid "Tajikistan" msgstr "Tagikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Est" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turchia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ucraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Isole minori esterne degli Stati Uniti" #. 840 msgid "United States" msgstr "Stati Uniti" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Città del Vaticano" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent e Grenadine" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Isole Vergini britanniche" #. 850 msgid "Virgin Islands, U.S." msgstr "Isole Vergini americane" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sudafrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Sconosciuto, aggiungi tag is_in a quelle città" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punto sulla mappa" msgid "Car" msgstr "Automobile" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Stato" msgid "Postal" msgstr "Postale" msgid "Town" msgstr "Centro abitato" msgid "District" msgstr "Regione" msgid "Street" msgstr "Via" msgid "Number" msgstr "Numero" msgid "Enter Destination" msgstr "Inserire la destinazione" msgid "Zip Code" msgstr "C.A.P." msgid "City" msgstr "Città" msgid "District/Township" msgstr "Regione/provincia" msgid "Map" msgstr "Mappa" msgid "Bookmark" msgstr "Posto" msgid "Destination" msgstr "Destinazione" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visualizza" msgid "_Route" msgstr "Percorso" msgid "_Former Destinations" msgstr "Destinazioni precedenti" msgid "_Bookmarks" msgstr "Posti" msgid "_Map" msgstr "Mappa" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Proiezione" msgid "_Vehicle" msgstr "Veicolo" msgid "Zoom_Out" msgstr "Zoom -" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom +" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Ricalcola" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informazioni" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Interrompi la navigazione" msgid "Test" msgstr "Prova" msgid "_Quit" msgstr "_Esci" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Prosegui su questa strada" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Quaderno di viaggio" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Zoom automatico" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Schermo intero" msgid "Data" msgstr "Dati" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Aiuto" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Visualizza nel browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Strade" msgid "House numbers" msgstr "Numeri civici" msgid "View Attributes" msgstr "Visualizza attributi" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Punti d'interesse" msgid "View on map" msgstr "Visualizza sulla mappa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Taglia posto" msgid "Copy Bookmark" msgstr "Copia posto" msgid "Rename Bookmark" msgstr "Rinomina posto" msgid "Paste Bookmark" msgstr "Incolla posto" msgid "Delete Bookmark" msgstr "Cancella posto" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Posti" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Aggiungere una cartella di posti" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Incolla posto" #, c-format msgid "Bookmark %s" msgstr "Posto %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Mostra stato satellite" msgid " Elevation " msgstr " Elevazione " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Mostra dati NMEA" msgid "car" msgstr "automobile" msgid "bike" msgstr "bicicletta" msgid "pedestrian" msgstr "pedone" #, c-format msgid "Current profile: %s" msgstr "Profilo corrente: %s" #, c-format msgid "Change profile to: %s" msgstr "Cambia profilo con: %s" msgid "Set as active" msgstr "Imposta come attivo" msgid "Show Satellite status" msgstr "Mostra stato satellite" msgid "Show NMEA data" msgstr "Mostra dati NMEA" msgid "Add Bookmark" msgstr "Aggiungere un posto" msgid "Rename" msgstr "Rinomina" msgid "About Navit" msgstr "Info su Navit" #. Authors msgid "By" msgstr "di" #. Contributors msgid "And all the Navit Team" msgstr "e tutta la squadra Navit" msgid "members and contributors." msgstr "membri e contributori." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Veicolo" msgid "Rules" msgstr "Regole" msgid "Lock on road" msgstr "Blocca sulla strada" msgid "Northing" msgstr "Visione verso nord" msgid "Map follows Vehicle" msgstr "La mappa segue il veicolo" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mappe" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Altimetria" msgid "Route Description" msgstr "Descrizione del percorso" msgid "Show Locale" msgstr "Mostra la localizzazione" msgid "Former Destinations" msgstr "Destinazioni precedenti" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Messaggio" msgid "Back" msgstr "Indietro" msgid "Back to map" msgstr "Torna alla mappa" msgid "Main Menu" msgstr "Menù principale" msgid "House number" msgstr "Numero civico" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posizione del veicolo" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menù principale" msgid "" "Show\n" "Map" msgstr "" "Mostra\n" "Mappa" msgid "Settings" msgstr "Impostazioni" msgid "Tools" msgstr "Strumenti" msgid "Route" msgstr "Percorso" msgid "About" msgstr "Info" msgid "Actions" msgstr "Azioni" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Esci" msgid "" "Stop\n" "Navigation" msgstr "Stop" msgid "Display" msgstr "Visualizza" msgid "Fullscreen" msgstr "Schermo intero" msgid "Window Mode" msgstr "Modalità finestre" msgid "Description" msgstr "Descrizione" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cavallo" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Tra %s entrare nella rotonda" #~ msgid "Cursor" #~ msgstr "Posizione attuale" #~ msgid "Route %4.0fkm %02d:%02d ETA" #~ msgstr "Percorso %4.0f km, %02d:%02d ETA" #~ msgid "Route 0000km 0+00:00 ETA" #~ msgstr "Percorso 0000 km, 00:00 ETA" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d chilometri" navit-0.5.0~svn5643+dfsg.1/po/ja.po.in000066400000000000000000001062161221777731700171630ustar00rootroot00000000000000# Japanese translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # MontBlanc, 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-07-02 22:46+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d メートル" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" msgid "exit" msgstr "" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "右" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "左" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "まもなく" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "今" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "目的地の%sにつきました" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "コマンド" msgid "Length" msgstr "" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "現在地として設定" msgid "Set as destination" msgstr "目的地として設定" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "アンドラ" #. 784 msgid "United Arab Emirates" msgstr "アラブ首長国連邦" #. 004 msgid "Afghanistan" msgstr "アフガニスタン" #. 028 msgid "Antigua and Barbuda" msgstr "アンティグア・バーブーダ" #. 660 msgid "Anguilla" msgstr "アンギラ" #. 008 msgid "Albania" msgstr "アルバニア" #. 051 msgid "Armenia" msgstr "アルメニア" #. 530 msgid "Netherlands Antilles" msgstr "オランダ領アンティル" #. 024 msgid "Angola" msgstr "アンゴラ" #. 010 msgid "Antarctica" msgstr "南極" #. 032 msgid "Argentina" msgstr "アルゼンチン" #. 016 msgid "American Samoa" msgstr "アメリカ領サモア" #. 040 msgid "Austria" msgstr "オーストリア" #. 036 msgid "Australia" msgstr "オーストラリア" #. 533 msgid "Aruba" msgstr "アルバ" #. 248 msgid "Aland Islands" msgstr "オーランド諸島" #. 031 msgid "Azerbaijan" msgstr "アゼルバイジャン" #. 070 msgid "Bosnia and Herzegovina" msgstr "ボスニア・ヘルツェゴビナ" #. 052 msgid "Barbados" msgstr "バルバドス" #. 050 msgid "Bangladesh" msgstr "バングラデシュ" #. 056 msgid "Belgium" msgstr "ベルギー" #. 854 msgid "Burkina Faso" msgstr "ブルキナファソ" #. 100 msgid "Bulgaria" msgstr "ブルガリア" #. 048 msgid "Bahrain" msgstr "バーレーン" #. 108 msgid "Burundi" msgstr "ブルンジ" #. 204 msgid "Benin" msgstr "ベナン" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "バミューダ諸島" #. 096 msgid "Brunei Darussalam" msgstr "ブルネイ・ダルサラーム" #. 068 msgid "Bolivia" msgstr "ボリビア" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "ブラジル" #. 044 msgid "Bahamas" msgstr "バハマ" #. 064 msgid "Bhutan" msgstr "ブータン" #. 074 msgid "Bouvet Island" msgstr "ブーベ島" #. 072 msgid "Botswana" msgstr "ボツワナ" #. 112 msgid "Belarus" msgstr "ベラルーシ" #. 084 msgid "Belize" msgstr "ベリーズ" #. 124 msgid "Canada" msgstr "カナダ" #. 166 msgid "Cocos (Keeling) Islands" msgstr "ココス (キーリング) 諸島" #. 180 msgid "Congo, Democratic Republic of the" msgstr "コンゴ民主共和国" #. 140 msgid "Central African Republic" msgstr "中央アフリカ共和国" #. 178 msgid "Congo" msgstr "コンゴ" #. 756 msgid "Switzerland" msgstr "スイス" #. 384 msgid "Cote d'Ivoire" msgstr "コートジボアール" #. 184 msgid "Cook Islands" msgstr "クック諸島" #. 152 msgid "Chile" msgstr "チリ" #. 120 msgid "Cameroon" msgstr "カメルーン" #. 156 msgid "China" msgstr "中国" #. 170 msgid "Colombia" msgstr "コロンビア" #. 188 msgid "Costa Rica" msgstr "コスタリカ" #. 192 msgid "Cuba" msgstr "キューバ" #. 132 msgid "Cape Verde" msgstr "カーボベルデ" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "クリスマス島" #. 196 msgid "Cyprus" msgstr "キプロス" #. 203 msgid "Czech Republic" msgstr "チェコ共和国" #. 276 msgid "Germany" msgstr "ドイツ" #. 262 msgid "Djibouti" msgstr "ジブチ" #. 208 msgid "Denmark" msgstr "デンマーク" #. 212 msgid "Dominica" msgstr "ドミニカ" #. 214 msgid "Dominican Republic" msgstr "ドミニカ共和国" #. 012 msgid "Algeria" msgstr "アルジェリア" #. 218 msgid "Ecuador" msgstr "エクアドル" #. 233 msgid "Estonia" msgstr "エストニア" #. 818 msgid "Egypt" msgstr "エジプト" #. 732 msgid "Western Sahara" msgstr "西サハラ" #. 232 msgid "Eritrea" msgstr "エリトリア" #. 724 msgid "Spain" msgstr "スペイン" #. 231 msgid "Ethiopia" msgstr "エチオピア" #. 246 msgid "Finland" msgstr "フィンランド" #. 242 msgid "Fiji" msgstr "フィジー" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "フォークランド諸島 (マルビナス)" #. 583 msgid "Micronesia, Federated States of" msgstr "ミクロネシア連邦邦国" #. 234 msgid "Faroe Islands" msgstr "フェロー諸島" #. 250 msgid "France" msgstr "フランス" #. 266 msgid "Gabon" msgstr "ガボン" #. 826 msgid "United Kingdom" msgstr "イギリス" #. 308 msgid "Grenada" msgstr "グレナダ" #. 268 msgid "Georgia" msgstr "グルジア" #. 254 msgid "French Guiana" msgstr "フランス領ギアナ" #. 831 msgid "Guernsey" msgstr "ガーンジー島" #. 288 msgid "Ghana" msgstr "ガーナ" #. 292 msgid "Gibraltar" msgstr "ジブラルタル" #. 304 msgid "Greenland" msgstr "グリーンランド" #. 270 msgid "Gambia" msgstr "ガンビア" #. 324 msgid "Guinea" msgstr "ギニア" #. 312 msgid "Guadeloupe" msgstr "グアドループ島" #. 226 msgid "Equatorial Guinea" msgstr "赤道ギニア" #. 300 msgid "Greece" msgstr "ギリシャ" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "南ジョージア島・南サンドイッチ諸島" #. 320 msgid "Guatemala" msgstr "グアテマラ" #. 316 msgid "Guam" msgstr "グアム" #. 624 msgid "Guinea-Bissau" msgstr "ギニアビサウ" #. 328 msgid "Guyana" msgstr "ガイアナ" #. 344 msgid "Hong Kong" msgstr "香港" #. 334 msgid "Heard Island and McDonald Islands" msgstr "ハード島とマクドナルド諸島" #. 340 msgid "Honduras" msgstr "ホンジュラス" #. 191 msgid "Croatia" msgstr "クロアチア" #. 332 msgid "Haiti" msgstr "ハイチ" #. 348 msgid "Hungary" msgstr "ハンガリー" #. 360 msgid "Indonesia" msgstr "インドネシア" #. 372 msgid "Ireland" msgstr "アイルランド" #. 376 msgid "Israel" msgstr "イスラエル" #. 833 msgid "Isle of Man" msgstr "マン島" #. 356 msgid "India" msgstr "インド" #. 086 msgid "British Indian Ocean Territory" msgstr "イギリス領インド洋地域" #. 368 msgid "Iraq" msgstr "イラク" #. 364 msgid "Iran, Islamic Republic of" msgstr "イラン・イスラム共和国" #. 352 msgid "Iceland" msgstr "アイスランド" #. 380 msgid "Italy" msgstr "イタリア" #. 832 msgid "Jersey" msgstr "ジャージー島" #. 388 msgid "Jamaica" msgstr "ジャマイカ" #. 400 msgid "Jordan" msgstr "ヨルダン" #. 392 msgid "Japan" msgstr "日本" #. 404 msgid "Kenya" msgstr "ケニア" #. 417 msgid "Kyrgyzstan" msgstr "キルギス" #. 116 msgid "Cambodia" msgstr "カンボジア" #. 296 msgid "Kiribati" msgstr "キリバス共和国" #. 174 msgid "Comoros" msgstr "コモロ" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "朝鮮民主主義人民共和国" #. 410 msgid "Korea, Republic of" msgstr "大韓民国 (韓国)" #. 414 msgid "Kuwait" msgstr "クウェート" #. 136 msgid "Cayman Islands" msgstr "ケイマン諸島" #. 398 msgid "Kazakhstan" msgstr "カザフスタン" #. 418 msgid "Lao People's Democratic Republic" msgstr "ラオス人民民主共和国" #. 422 msgid "Lebanon" msgstr "レバノン" #. 662 msgid "Saint Lucia" msgstr "セントルシア" #. 438 msgid "Liechtenstein" msgstr "リヒテンシュタイン" #. 144 msgid "Sri Lanka" msgstr "スリランカ" #. 430 msgid "Liberia" msgstr "リベリア" #. 426 msgid "Lesotho" msgstr "レソト" #. 440 msgid "Lithuania" msgstr "リトアニア" #. 442 msgid "Luxembourg" msgstr "ルクセンブルク" #. 428 msgid "Latvia" msgstr "ラトビア" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "モロッコ" #. 492 msgid "Monaco" msgstr "モナコ" #. 498 msgid "Moldova, Republic of" msgstr "モルドバ共和国" #. 499 msgid "Montenegro" msgstr "モンテネグロ" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "マダガスカル" #. 584 msgid "Marshall Islands" msgstr "マーシャル諸島" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "マリ" #. 104 msgid "Myanmar" msgstr "ミャンマー" #. 496 msgid "Mongolia" msgstr "モンゴル" #. 446 msgid "Macao" msgstr "マカオ" #. 580 msgid "Northern Mariana Islands" msgstr "北マリアナ諸島連邦" #. 474 msgid "Martinique" msgstr "マルティニク" #. 478 msgid "Mauritania" msgstr "モーリタニア" #. 500 msgid "Montserrat" msgstr "モントセラト" #. 470 msgid "Malta" msgstr "マルタ" #. 480 msgid "Mauritius" msgstr "モーリシャス" #. 462 msgid "Maldives" msgstr "モルディブ" #. 454 msgid "Malawi" msgstr "マラウイ" #. 484 msgid "Mexico" msgstr "メキシコ" #. 458 msgid "Malaysia" msgstr "マレーシア" #. 508 msgid "Mozambique" msgstr "モザンビーク" #. 516 msgid "Namibia" msgstr "ナミビア" #. 540 msgid "New Caledonia" msgstr "ニューカレドニア" #. 562 msgid "Niger" msgstr "ニジェール" #. 574 msgid "Norfolk Island" msgstr "ノーフォーク島" #. 566 msgid "Nigeria" msgstr "ナイジェリア" #. 558 msgid "Nicaragua" msgstr "ニカラグア" #. 528 msgid "Netherlands" msgstr "オランダ" #. 578 msgid "Norway" msgstr "ノルウェー" #. 524 msgid "Nepal" msgstr "ネパール" #. 520 msgid "Nauru" msgstr "ナウル語" #. 570 msgid "Niue" msgstr "ニウエ" #. 554 msgid "New Zealand" msgstr "ニュージーランド" #. 512 msgid "Oman" msgstr "オマーン" #. 591 msgid "Panama" msgstr "パナマ" #. 604 msgid "Peru" msgstr "ペルー" #. 258 msgid "French Polynesia" msgstr "フランス領ポリネシア" #. 598 msgid "Papua New Guinea" msgstr "パプアニューギニア" #. 608 msgid "Philippines" msgstr "フィリピン" #. 586 msgid "Pakistan" msgstr "パキスタン" #. 616 msgid "Poland" msgstr "ポーランド" #. 666 msgid "Saint Pierre and Miquelon" msgstr "サンピエールエミクロン" #. 612 msgid "Pitcairn" msgstr "ピトケルン" #. 630 msgid "Puerto Rico" msgstr "プエルトリコ" #. 275 msgid "Palestinian Territory, Occupied" msgstr "パレスチナ占領地区" #. 620 msgid "Portugal" msgstr "ポルトガル" #. 585 msgid "Palau" msgstr "パラオ" #. 600 msgid "Paraguay" msgstr "パラグアイ" #. 634 msgid "Qatar" msgstr "カタール" #. 638 msgid "Reunion" msgstr "レユニオン" #. 642 msgid "Romania" msgstr "ルーマニア" #. 688 msgid "Serbia" msgstr "セルビア" #. 643 msgid "Russian Federation" msgstr "ロシア連邦" #. 646 msgid "Rwanda" msgstr "ルワンダ" #. 682 msgid "Saudi Arabia" msgstr "サウジアラビア" #. 090 msgid "Solomon Islands" msgstr "ソロモン諸島" #. 690 msgid "Seychelles" msgstr "セーシェル" #. 736 msgid "Sudan" msgstr "スーダン" #. 752 msgid "Sweden" msgstr "スウェーデン" #. 702 msgid "Singapore" msgstr "シンガポール" #. 654 msgid "Saint Helena" msgstr "セントヘレナ" #. 705 msgid "Slovenia" msgstr "スロベニア" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "スロバキア" #. 694 msgid "Sierra Leone" msgstr "シエラレオネ" #. 674 msgid "San Marino" msgstr "サンマリノ" #. 686 msgid "Senegal" msgstr "セネガル" #. 706 msgid "Somalia" msgstr "ソマリア" #. 740 msgid "Suriname" msgstr "スリナム" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "サントメ・プリンシペ" #. 222 msgid "El Salvador" msgstr "エルサルバドル" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "シリアアラブ共和国" #. 748 msgid "Swaziland" msgstr "スワジランド" #. 796 msgid "Turks and Caicos Islands" msgstr "タークス諸島・カイコス諸島" #. 148 msgid "Chad" msgstr "チャド" #. 260 msgid "French Southern Territories" msgstr "仏領極南諸島" #. 768 msgid "Togo" msgstr "トーゴ" #. 764 msgid "Thailand" msgstr "タイ" #. 762 msgid "Tajikistan" msgstr "タジキスタン" #. 772 msgid "Tokelau" msgstr "トケラウ" #. 626 msgid "Timor-Leste" msgstr "東ティモール" #. 795 msgid "Turkmenistan" msgstr "トルクメニスタン" #. 788 msgid "Tunisia" msgstr "チュニジア" #. 776 msgid "Tonga" msgstr "トンガ" #. 792 msgid "Turkey" msgstr "トルコ" #. 780 msgid "Trinidad and Tobago" msgstr "トリニダード・トバゴ" #. 798 msgid "Tuvalu" msgstr "ツバル" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "タニザニア連合共和国" #. 804 msgid "Ukraine" msgstr "ウクライナ" #. 800 msgid "Uganda" msgstr "ウガンダ" #. 581 msgid "United States Minor Outlying Islands" msgstr "合衆国領有小離島" #. 840 msgid "United States" msgstr "アメリカ合衆国" #. 858 msgid "Uruguay" msgstr "ウルグアイ" #. 860 msgid "Uzbekistan" msgstr "ウズベキスタン" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "ベネズエラ" #. 092 msgid "Virgin Islands, British" msgstr "イギリス領ヴァージン諸島" #. 850 msgid "Virgin Islands, U.S." msgstr "アメリカ領ヴァージン諸島" #. 704 msgid "Viet Nam" msgstr "ベトナム" #. 548 msgid "Vanuatu" msgstr "バヌアツ" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "サモア" #. 887 msgid "Yemen" msgstr "イエメン" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "南アフリカ" #. 894 msgid "Zambia" msgstr "ザンビア" #. 716 msgid "Zimbabwe" msgstr "ジンバブエ" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "国" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "目的地を入力" msgid "Zip Code" msgstr "郵便番号" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "地図" msgid "Bookmark" msgstr "ブックマーク" msgid "Destination" msgstr "目的地" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "ルート" msgid "_Former Destinations" msgstr "前の目的地" msgid "_Bookmarks" msgstr "ブックマーク" msgid "_Map" msgstr "地図" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "ズームアウト" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ズームイン" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "再計算" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "案内中止" msgid "Test" msgstr "テスト" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "全画面表示" msgid "Data" msgstr "" msgid "N" msgstr "北" msgid "NE" msgstr "北東" msgid "E" msgstr "東" msgid "SE" msgstr "南東" msgid "S" msgstr "南" msgid "SW" msgstr "南西" msgid "W" msgstr "西" msgid "NW" msgstr "北西" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "ブックマーク" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "前の目的地" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "ルート" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "全画面表示" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d キロメートル" navit-0.5.0~svn5643+dfsg.1/po/jv.po.in000066400000000000000000001007101221777731700172010ustar00rootroot00000000000000# Javanese translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # Leonardus Priyo Handono, 2010 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-08-10 04:53+0000\n" "Last-Translator: Leonardus Priyo Handono \n" "Language-Team: Javanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: jv\n" "Plural-Forms: nplurals=2; plural=n != 0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "metu kapisan" msgid "second exit" msgstr "metu kapindho" msgid "third exit" msgstr "metu katelu" msgid "fourth exit" msgstr "metu kapapat" msgid "fifth exit" msgstr "metu kalimo" msgid "sixth exit" msgstr "metu kaenem" #, c-format msgid "%d m" msgstr "" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "ing %d kilometer" msgid "exit" msgstr "metu" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s ing dalan %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "nengen" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "ngiwa" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "kanthi gampang " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ora dikenal " msgid "When possible, please turn around" msgstr "Yen biso, mutero" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "terus metu soko puteran ing cawang kaping %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "metu soko puteran ing cawang kaping %s" #, c-format msgid "Follow the road for the next %s" msgstr "tetep ing dalan iki nganti %s" msgid "soon" msgstr "sedhelo maneh" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Jupuk dalan kaping %1$s ing %2$s" #, c-format msgid "after %i roads" msgstr "sakwise %i dalan" msgid "now" msgstr "saiki" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "Jupuk dalan kaping %1$s neng %2$s" msgid "error" msgstr "salah" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "menggok %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "terus menggok %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "terus panjenengan tekan tujuan" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "dunung" msgid "Command" msgstr "perintah" msgid "Length" msgstr "Amba" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Wektu" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "Wektu tekan tujuan" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "Dadekno tujuan" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "Titik 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinat layar : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua lan Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Londo" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Amerika" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Pulo Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia lan Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Santo Bartolomeus" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahama" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarusia" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "Republik Afrika Tengah" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Swiss" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Cina" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Pulau Natal" #. 196 msgid "Cyprus" msgstr "Siprus" #. 203 msgid "Czech Republic" msgstr "Republik Czech" #. 276 msgid "Germany" msgstr "Jerman" #. 262 msgid "Djibouti" msgstr "Jibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Republik Dominika" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Mesir" #. 732 msgid "Western Sahara" msgstr "Sahara Kulon" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanyol" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "Perancis" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroasia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungaria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlandia" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Republik Islam Iran" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Yordania" #. 392 msgid "Japan" msgstr "Jepang" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Enter the roundabout soon and leave it at the %s" #~ msgstr "Mlebu puteran sedhelo maneh lan metu ing cawang %s" #~ msgid "In %s, enter the roundabout" #~ msgstr "ing %s, mlebu puteran" navit-0.5.0~svn5643+dfsg.1/po/kk.po.in000066400000000000000000000754751221777731700172120ustar00rootroot00000000000000# Kazakh translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-02-24 19:32+0000\n" "Last-Translator: \n" "Language-Team: Kazakh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kk\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" msgid "exit" msgstr "" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" navit-0.5.0~svn5643+dfsg.1/po/lt.po.in000066400000000000000000001104061221777731700172040ustar00rootroot00000000000000# Lithuanian translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # laimonas 2009 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 20:38+0000\n" "Last-Translator: laimonas \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" "100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Paleidžiu pradiniame kataloge\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nustatau iš '%s' į '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulinis" msgid "first" msgstr "pirmas" msgid "second" msgstr "antras" msgid "third" msgstr "trečias" msgid "fourth" msgstr "ketvirtas" msgid "fifth" msgstr "penktas" msgid "sixth" msgstr "šeštas" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulinis išvažiavimas" msgid "first exit" msgstr "pirmas išvažiavimas" msgid "second exit" msgstr "antras išvažiavimas" msgid "third exit" msgstr "trečias išvažiavimas" msgid "fourth exit" msgstr "ketvirtas išvažiavimas" msgid "fifth exit" msgstr "penktas išvažiavimas" msgid "sixth exit" msgstr "šeštas išvažiavimas" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "už %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metrai" #, c-format msgid "in %d meters" msgstr "už %d metrų" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "už %d.%d kilometrų" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometras" msgstr[1] "%d kilometrai" msgstr[2] "%d kilometrai" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "už %d kilometro" msgstr[1] "už %d kilometrų" msgstr[2] "už %d kilometrų" msgid "exit" msgstr "išvažiavimas" msgid "into the ramp" msgstr "į rampą" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s į gatvę %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s į %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s į %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s į %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s į %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "dešinėn" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "kairėn" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "lengvai " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "stipriai " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "labai stipriai " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "nežinomas " msgid "When possible, please turn around" msgstr "kai įmanoma, apsisukite" msgid "Enter the roundabout soon" msgstr "Netrukus įsukite į žiedą" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "tada išsukite iš žiedo %s išvažiavime" #, c-format msgid "Leave the roundabout at the %s" msgstr "išsukite iš žiedo %s išvažiavime" #, c-format msgid "Follow the road for the next %s" msgstr "Laikykitės kelio sekančius %s" msgid "soon" msgstr "netrukus" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Važiuokite %1$s keliu į %2$s" #, c-format msgid "after %i roads" msgstr "už %i kelių" msgid "now" msgstr "dabar" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "tada važiuokite %1$s keliu į %2$s" msgid "error" msgstr "klaida" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Pasukite %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "tada pasukite %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Jūs pasiekėte tikslą %s" msgid "then you have reached your destination." msgstr "tada jūs pasiekėte kelionės tikslą." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozicija" msgid "Command" msgstr "Komanda" msgid "Length" msgstr "Ilgis" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Laikas" msgid "Destination Length" msgstr "Atvykimo ilgis" msgid "Destination Time" msgstr "Atvykimo laikas" msgid "Roadbook" msgstr "Kelionės knyga" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Nustatykite poziciją" msgid "Set as destination" msgstr "Nustatykite tikslą" msgid "Add as bookmark" msgstr "Pridėkite žymę" #, c-format msgid "Point 0x%x 0x%x" msgstr "Taškas 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekrano koordinatės : %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Jungtiniai Arabų Emyratai" #. 004 msgid "Afghanistan" msgstr "Afganistanas" #. 028 msgid "Antigua and Barbuda" msgstr "Antigva ir Barbuda" #. 660 msgid "Anguilla" msgstr "Angilija" #. 008 msgid "Albania" msgstr "Albanija" #. 051 msgid "Armenia" msgstr "Armėnija" #. 530 msgid "Netherlands Antilles" msgstr "Olandijos Antilai" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikos Samoa" #. 040 msgid "Austria" msgstr "Austrija" #. 036 msgid "Australia" msgstr "Australija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandų salos" #. 031 msgid "Azerbaijan" msgstr "Azerbaidžanas" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnija ir Hercegovina" #. 052 msgid "Barbados" msgstr "Barbadosas" #. 050 msgid "Bangladesh" msgstr "Bangladešas" #. 056 msgid "Belgium" msgstr "Belgija" #. 854 msgid "Burkina Faso" msgstr "Burkina Fasas" #. 100 msgid "Bulgaria" msgstr "Bulgarija" #. 048 msgid "Bahrain" msgstr "Bahreinas" #. 108 msgid "Burundi" msgstr "Burundis" #. 204 msgid "Benin" msgstr "Beninas" #. 652 msgid "Saint Barthelemy" msgstr "Švento Baltramiejaus sala" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunėjaus Darusalamas" #. 068 msgid "Bolivia" msgstr "Bolivija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilija" #. 044 msgid "Bahamas" msgstr "Bahamos" #. 064 msgid "Bhutan" msgstr "Butanas" #. 074 msgid "Bouvet Island" msgstr "Buvė sala" #. 072 msgid "Botswana" msgstr "Botsvana" #. 112 msgid "Belarus" msgstr "Gudija" #. 084 msgid "Belize" msgstr "Belizas" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosų (Keelingo) salos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokratinė Respublika" #. 140 msgid "Central African Republic" msgstr "Centrinės Afrikos Respublika" #. 178 msgid "Congo" msgstr "Kongas" #. 756 msgid "Switzerland" msgstr "Šveicarija" #. 384 msgid "Cote d'Ivoire" msgstr "Dramblio Kaulo Krantas" #. 184 msgid "Cook Islands" msgstr "Kuko salos" #. 152 msgid "Chile" msgstr "Čilė" #. 120 msgid "Cameroon" msgstr "Kamerūnas" #. 156 msgid "China" msgstr "Kinija" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Žaliasis Kyšulys" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kalėdų sala" #. 196 msgid "Cyprus" msgstr "Kipras" #. 203 msgid "Czech Republic" msgstr "Čekija" #. 276 msgid "Germany" msgstr "Vokietija" #. 262 msgid "Djibouti" msgstr "Džibutis" #. 208 msgid "Denmark" msgstr "Danija" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikos Respublika" #. 012 msgid "Algeria" msgstr "Alžyras" #. 218 msgid "Ecuador" msgstr "Ekvadoras" #. 233 msgid "Estonia" msgstr "Estija" #. 818 msgid "Egypt" msgstr "Egiptas" #. 732 msgid "Western Sahara" msgstr "Vakarų Sachara" #. 232 msgid "Eritrea" msgstr "Eritrėja" #. 724 msgid "Spain" msgstr "Ispanija" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Suomija" #. 242 msgid "Fiji" msgstr "Fidžis" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklando (Malvinų) salos" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezijos Federacinės Valstijos" #. 234 msgid "Faroe Islands" msgstr "Farerų salos" #. 250 msgid "France" msgstr "Prancūzija" #. 266 msgid "Gabon" msgstr "Gabonas" #. 826 msgid "United Kingdom" msgstr "Jungtinė Karalystė" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "Prancūzijos Gviana" #. 831 msgid "Guernsey" msgstr "Guernsis" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltaras" #. 304 msgid "Greenland" msgstr "Grenlandija" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvinėja" #. 312 msgid "Guadeloupe" msgstr "Gvadelupa" #. 226 msgid "Equatorial Guinea" msgstr "Pusiaujo Gvinėja" #. 300 msgid "Greece" msgstr "Graikija" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Pietų Georgijos ir Pietų Sandwicho salos" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guamas" #. 624 msgid "Guinea-Bissau" msgstr "Bisau-Gvinėja" #. 328 msgid "Guyana" msgstr "Gajana" #. 344 msgid "Hong Kong" msgstr "Honk Kongas" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardo ir McDonaldo salos" #. 340 msgid "Honduras" msgstr "Hondūras" #. 191 msgid "Croatia" msgstr "Kroatija" #. 332 msgid "Haiti" msgstr "Haitis" #. 348 msgid "Hungary" msgstr "Vengrija" #. 360 msgid "Indonesia" msgstr "Indonezija" #. 372 msgid "Ireland" msgstr "Airija" #. 376 msgid "Israel" msgstr "Izraelis" #. 833 msgid "Isle of Man" msgstr "Meno sala" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Indijos vandenyno britų sritis" #. 368 msgid "Iraq" msgstr "Irakas" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iranas" #. 352 msgid "Iceland" msgstr "Islandija" #. 380 msgid "Italy" msgstr "Italija" #. 832 msgid "Jersey" msgstr "Džersis" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanas" #. 392 msgid "Japan" msgstr "Japonija" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizija" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribatis" #. 174 msgid "Comoros" msgstr "Komorai" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sent Kitsas ir Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korėjos Demokratinė Respublika" #. 410 msgid "Korea, Republic of" msgstr "Korėjos Respublika" #. 414 msgid "Kuwait" msgstr "Kuveitas" #. 136 msgid "Cayman Islands" msgstr "Kaimanų salos" #. 398 msgid "Kazakhstan" msgstr "Kazachija" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laosas" #. 422 msgid "Lebanon" msgstr "Libanas" #. 662 msgid "Saint Lucia" msgstr "Šventoji Liucija" #. 438 msgid "Liechtenstein" msgstr "Lichtenšteinas" #. 144 msgid "Sri Lanka" msgstr "Šri Lanka" #. 430 msgid "Liberia" msgstr "Liberija" #. 426 msgid "Lesotho" msgstr "Lesotas" #. 440 msgid "Lithuania" msgstr "Lietuva" #. 442 msgid "Luxembourg" msgstr "Liuksemburgas" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libija" #. 504 msgid "Morocco" msgstr "Marokas" #. 492 msgid "Monaco" msgstr "Monakas" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Juodkalnija" #. 663 msgid "Saint Martin (French part)" msgstr "San Martenas (Prancūzijos dalis)" #. 450 msgid "Madagascar" msgstr "Madagaskaras" #. 584 msgid "Marshall Islands" msgstr "Maršalo salos" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonija" #. 466 msgid "Mali" msgstr "Malis" #. 104 msgid "Myanmar" msgstr "Mianmaras" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Šiaurės Marianų salos" #. 474 msgid "Martinique" msgstr "Martinika" #. 478 msgid "Mauritania" msgstr "Mauritanija" #. 500 msgid "Montserrat" msgstr "Montserratas" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricijus" #. 462 msgid "Maldives" msgstr "Maldyvai" #. 454 msgid "Malawi" msgstr "Malavis" #. 484 msgid "Mexico" msgstr "Meksika" #. 458 msgid "Malaysia" msgstr "Malaizija" #. 508 msgid "Mozambique" msgstr "Mozambikas" #. 516 msgid "Namibia" msgstr "Namibija" #. 540 msgid "New Caledonia" msgstr "Naujoji Kaledonija" #. 562 msgid "Niger" msgstr "Nigeris" #. 574 msgid "Norfolk Island" msgstr "Norfolko sala" #. 566 msgid "Nigeria" msgstr "Nigerija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nyderlandai" #. 578 msgid "Norway" msgstr "Norvegija" #. 524 msgid "Nepal" msgstr "Nepalas" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niujė" #. 554 msgid "New Zealand" msgstr "Naujoji Zelandija" #. 512 msgid "Oman" msgstr "Omanas" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Prancūzijos Polinezija" #. 598 msgid "Papua New Guinea" msgstr "Papua Naujoji Gvinėja" #. 608 msgid "Philippines" msgstr "Filipinai" #. 586 msgid "Pakistan" msgstr "Pakistanas" #. 616 msgid "Poland" msgstr "Lenkija" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sen Pjeras ir Mikelonas" #. 612 msgid "Pitcairn" msgstr "Pitkernas" #. 630 msgid "Puerto Rico" msgstr "Puerto Riko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Okupuota Palestinos teritorija" #. 620 msgid "Portugal" msgstr "Portugalija" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvajus" #. 634 msgid "Qatar" msgstr "Kataras" #. 638 msgid "Reunion" msgstr "Reunionas" #. 642 msgid "Romania" msgstr "Rumunija" #. 688 msgid "Serbia" msgstr "Serbija" #. 643 msgid "Russian Federation" msgstr "Rusijos Federacija" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudo Arabija" #. 090 msgid "Solomon Islands" msgstr "Saliamono salos" #. 690 msgid "Seychelles" msgstr "Seišeliai" #. 736 msgid "Sudan" msgstr "Sudanas" #. 752 msgid "Sweden" msgstr "Švedija" #. 702 msgid "Singapore" msgstr "Singapūras" #. 654 msgid "Saint Helena" msgstr "Šventoji Elena" #. 705 msgid "Slovenia" msgstr "Slovėnija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbardo ir Jan Majen salos" #. 703 msgid "Slovakia" msgstr "Slovakija" #. 694 msgid "Sierra Leone" msgstr "Siera Leonė" #. 674 msgid "San Marino" msgstr "San Marinas" #. 686 msgid "Senegal" msgstr "Senegalas" #. 706 msgid "Somalia" msgstr "Somalis" #. 740 msgid "Suriname" msgstr "Surinamas" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "San Tomė ir Prinsipė" #. 222 msgid "El Salvador" msgstr "Salvadoras" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirijos Arabų Respublika" #. 748 msgid "Swaziland" msgstr "Svazilendas" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkso ir Caicoso salos" #. 148 msgid "Chad" msgstr "Čadas" #. 260 msgid "French Southern Territories" msgstr "Prancūzijos Pietų sritys" #. 768 msgid "Togo" msgstr "Togas" #. 764 msgid "Thailand" msgstr "Tailandas" #. 762 msgid "Tajikistan" msgstr "Tadžikija" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Rytų Timoras" #. 795 msgid "Turkmenistan" msgstr "Turkmėnija" #. 788 msgid "Tunisia" msgstr "Tunisas" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkija" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidadas ir Tobagas" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taivanas, Kinijos provincija" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanija" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "JAV mažosios aplinkinės salos" #. 840 msgid "United States" msgstr "JAV" #. 858 msgid "Uruguay" msgstr "Urugvajus" #. 860 msgid "Uzbekistan" msgstr "Uzbekija" #. 336 msgid "Holy See (Vatican City State)" msgstr "Šventasis Sostas (Vatikano Miesto Valstybė)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sent Vinsentas ir Grenadinai" #. 862 msgid "Venezuela" msgstr "Venesuela" #. 092 msgid "Virgin Islands, British" msgstr "Mergelių salos, Jungtinė Karalystė" #. 850 msgid "Virgin Islands, U.S." msgstr "Mergelių salos, JAV" #. 704 msgid "Viet Nam" msgstr "Vietnamas" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallisas ir Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemenas" #. 175 msgid "Mayotte" msgstr "Majotas" #. 710 msgid "South Africa" msgstr "Pietų Afrika" #. 894 msgid "Zambia" msgstr "Zambija" #. 716 msgid "Zimbabwe" msgstr "Zimbabvė" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nežinomas, pridėti is_in žodžius į šiuos miestus" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Vieta žemėlapyje" msgid "Car" msgstr "Automobilis" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Šalis:" msgid "Postal" msgstr "Pašto" msgid "Town" msgstr "Miestas" msgid "District" msgstr "Rajonas" msgid "Street" msgstr "Gatvė:" msgid "Number" msgstr "Numeris" msgid "Enter Destination" msgstr "Įveskite kelionės tikslą" msgid "Zip Code" msgstr "Pašto kodas" msgid "City" msgstr "Miestas" msgid "District/Township" msgstr "Rajonas/miestas" msgid "Map" msgstr "Žemėlapis" msgid "Bookmark" msgstr "Pažymėti" msgid "Destination" msgstr "Kelionės tikslas" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Rodyti" msgid "_Route" msgstr "Parinkti kelią" msgid "_Former Destinations" msgstr "Ankstesnės vietos" msgid "_Bookmarks" msgstr "Adresynas" msgid "_Map" msgstr "Žemėlapis" msgid "_Layout" msgstr "Išdėstymas" msgid "_Projection" msgstr "Projekcija" msgid "_Vehicle" msgstr "Transporto priemonė" msgid "Zoom_Out" msgstr "Sumažinti" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Padidinti" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Perskaičiuoti" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informacija" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stabdyti navigaciją" msgid "Test" msgstr "Bandymas" msgid "_Quit" msgstr "_Išeiti" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Sekti kelią" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Kelionės knyga" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Automatinis didinimas" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Visas ekranas" msgid "Data" msgstr "Duomenys" msgid "N" msgstr "Š" msgid "NE" msgstr "ŠR" msgid "E" msgstr "R" msgid "SE" msgstr "PR" msgid "S" msgstr "P" msgid "SW" msgstr "PV" msgid "W" msgstr "V" msgid "NW" msgstr "ŠV" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Liko kelio %4.0fkm %02d:%02d atvykimo laikas" msgid "Route 0000km 0+00:00 ETA" msgstr "Liko kelio 0000km 0+00:00 atvykimo laikas" msgid "Help" msgstr "Žinynas" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Peržiūrėti naršyklėje" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gatvės" msgid "House numbers" msgstr "Namų numeriai" msgid "View Attributes" msgstr "Rodyti savybes" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Lankytinos vietos" msgid "View on map" msgstr "Rodyti žemėlapyje" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Adresynas" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Pasižymėti %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Parodyti palydovų būseną" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Rodyti NMEA duomenis" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "Aktyvuoti" msgid "Show Satellite status" msgstr "Parodyti palydovų būseną" msgid "Show NMEA data" msgstr "Parodyti NMEA duomenis" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Transporto priemonė" msgid "Rules" msgstr "Taisyklės" msgid "Lock on road" msgstr "Sekti kelią" msgid "Northing" msgstr "Į šiaurę" msgid "Map follows Vehicle" msgstr "Sekti transporto priemonę" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Žemėlapiai" msgid "Layout" msgstr "Išdėstymas" msgid "Height Profile" msgstr "Aukščio profilis" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Ankstesnės vietos" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Žinutė" msgid "Back" msgstr "Grįžti" msgid "Back to map" msgstr "Grižti į žemėlapį" msgid "Main Menu" msgstr "Pagrindinis meniu" msgid "House number" msgstr "Namo numeris" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Transporto priemonės vieta" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Pagrindinis meniu" msgid "" "Show\n" "Map" msgstr "" "Rodyti\n" "žemėlapį" msgid "Settings" msgstr "Parinktys" msgid "Tools" msgstr "Įrankiai" msgid "Route" msgstr "Parinkti kelią" msgid "About" msgstr "" msgid "Actions" msgstr "Veiksmai" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Išeiti" msgid "" "Stop\n" "Navigation" msgstr "" "Stabdyti\n" "navigaciją" msgid "Display" msgstr "Rodyti" msgid "Fullscreen" msgstr "Visas ekranas" msgid "Window Mode" msgstr "Langų režimas" msgid "Description" msgstr "Aprašas" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Už %s, įsukite į žiedą" #~ msgid "Cursor" #~ msgstr "Kursorius" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometras" navit-0.5.0~svn5643+dfsg.1/po/lv.po.in000066400000000000000000000764471221777731700172260ustar00rootroot00000000000000# Latvian translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Janis # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 21:37+0000\n" "Last-Translator: Janis \n" "Language-Team: Latvian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lv\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nultais" msgid "first" msgstr "pirmais" msgid "second" msgstr "otrais" msgid "third" msgstr "trešais" msgid "fourth" msgstr "ceturtais" msgid "fifth" msgstr "piektais" msgid "sixth" msgstr "sestais" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nultā izeja" msgid "first exit" msgstr "pirmā izeja" msgid "second exit" msgstr "otrā izeja" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "ceturtā izeja" msgid "fifth exit" msgstr "piektā izeja" msgid "sixth exit" msgstr "sestā izeja" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "pēc %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metri" #, c-format msgid "in %d meters" msgstr "pēc %d metriem" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "pēc %d.%d kilometr(a,iem" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometrs" msgstr[1] "%d kilometrs" msgstr[2] "%d kilometrs" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "pēc %d kilometra" msgstr[1] "pēc %d kilometriem" msgstr[2] "pēc %d kilometriem" msgid "exit" msgstr "nobraukt nost" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometrs" navit-0.5.0~svn5643+dfsg.1/po/mk.po.in000066400000000000000000001203001221777731700171660ustar00rootroot00000000000000# Macedonian translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # goran.cvetkovski 2009 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-04-25 02:12+0000\n" "Last-Translator: Robert Mileski \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Работи од основниот директориум\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "смени '%s' во '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулти" msgid "first" msgstr "прв" msgid "second" msgstr "втор" msgid "third" msgstr "трет" msgid "fourth" msgstr "четврт" msgid "fifth" msgstr "петти" msgid "sixth" msgstr "шести" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нема излез" msgid "first exit" msgstr "прв излез" msgid "second exit" msgstr "втор излез" msgid "third exit" msgstr "трет излез" msgid "fourth exit" msgstr "четврт излез" msgid "fifth exit" msgstr "петти излез" msgid "sixth exit" msgstr "шести излез" #, c-format msgid "%d m" msgstr "%d м" #, c-format msgid "in %d m" msgstr "после %d м" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d метри" #, c-format msgid "in %d meters" msgstr "после %d метра" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d километри" #, c-format msgid "in %d.%d kilometers" msgstr "после %d.%d километри" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d километри" msgstr[1] "%d километри" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "после %d километри" msgstr[1] "после %d километри" msgid "exit" msgstr "излез" msgid "into the ramp" msgstr "на рампа" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sна улица %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sна %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sна %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "на десно" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "на лево" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "лесно " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "силно " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "многу силно " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "непознато " msgid "When possible, please turn around" msgstr "Кога можете, свртете" msgid "Enter the roundabout soon" msgstr "Наскоро влегувате во кружен тек" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "Потоа излегувате од кружен тек на %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Излегувате од кружен тек на %s" #, c-format msgid "Follow the road for the next %s" msgstr "Следете го патот следните %s" msgid "soon" msgstr "наскоро" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Продолжи по %1$s патот до %2$s" #, c-format msgid "after %i roads" msgstr "после %i патишта" msgid "now" msgstr "сега" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "тогаш појдете по патот %1$s кон %2$s" msgid "error" msgstr "грешка" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Свртете %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "тогаш свртете %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Стигнавте на целта %s" msgid "then you have reached your destination." msgstr "потоа пристигате на одредиштето." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиция" msgid "Command" msgstr "Програма" msgid "Length" msgstr "Length" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Време" msgid "Destination Length" msgstr "Растојание до целта" msgid "Destination Time" msgstr "Време до целта" msgid "Roadbook" msgstr "Патна книга" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Зададете како позиција" msgid "Set as destination" msgstr "Зададете како цел" msgid "Add as bookmark" msgstr "Додадете како место" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Координати на екранот: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Обединети Арапски Емирати" #. 004 msgid "Afghanistan" msgstr "Авганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигва и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангила" #. 008 msgid "Albania" msgstr "Албанија" #. 051 msgid "Armenia" msgstr "Ерменија" #. 530 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Американска Самоа" #. 040 msgid "Austria" msgstr "Австрија" #. 036 msgid "Australia" msgstr "Австралија" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Аландски острови" #. 031 msgid "Azerbaijan" msgstr "Азербејџан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Белгија" #. 854 msgid "Burkina Faso" msgstr "Буркина Фасо" #. 100 msgid "Bulgaria" msgstr "Бугарија" #. 048 msgid "Bahrain" msgstr "Бахреин" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Свети Бартоломеј" #. 060 msgid "Bermuda" msgstr "Бермуда" #. 096 msgid "Brunei Darussalam" msgstr "Брунеи Дар ес Салам" #. 068 msgid "Bolivia" msgstr "Боливија" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразил" #. 044 msgid "Bahamas" msgstr "Бахами" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Остров Буве" #. 072 msgid "Botswana" msgstr "Боцвана" #. 112 msgid "Belarus" msgstr "Белорусија" #. 084 msgid "Belize" msgstr "Белизе" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосови (Килинг) острови" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Конго, Демократска Република" #. 140 msgid "Central African Republic" msgstr "Централна Африканска Република" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швајцарија" #. 384 msgid "Cote d'Ivoire" msgstr "Брегот на Слоновата коска" #. 184 msgid "Cook Islands" msgstr "Кук острови" #. 152 msgid "Chile" msgstr "Чиле" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Кина" #. 170 msgid "Colombia" msgstr "Колумбија" #. 188 msgid "Costa Rica" msgstr "Костарика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кејп Верде" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Велигденски Острови" #. 196 msgid "Cyprus" msgstr "Кипар" #. 203 msgid "Czech Republic" msgstr "Чешка Република" #. 276 msgid "Germany" msgstr "Германија" #. 262 msgid "Djibouti" msgstr "Џибути" #. 208 msgid "Denmark" msgstr "Данска" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканска Република" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естонија" #. 818 msgid "Egypt" msgstr "Египет" #. 732 msgid "Western Sahara" msgstr "Западна Сахара" #. 232 msgid "Eritrea" msgstr "Еритреја" #. 724 msgid "Spain" msgstr "Шпанија" #. 231 msgid "Ethiopia" msgstr "Етиопија" #. 246 msgid "Finland" msgstr "Финска" #. 242 msgid "Fiji" msgstr "Фиџи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фокландски Острови (Малвини)" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронезија, Федеративни Држави на" #. 234 msgid "Faroe Islands" msgstr "Фарски Острови" #. 250 msgid "France" msgstr "Франција" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Обединето Кралство" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузија" #. 254 msgid "French Guiana" msgstr "Француска Гвинеја" #. 831 msgid "Guernsey" msgstr "Гернзи" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренланд" #. 270 msgid "Gambia" msgstr "Гамбија" #. 324 msgid "Guinea" msgstr "Гвинеја" #. 312 msgid "Guadeloupe" msgstr "Гваделупе" #. 226 msgid "Equatorial Guinea" msgstr "Екваторијална Гвинеја" #. 300 msgid "Greece" msgstr "Грција" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Јужна Џорџија и Јужните Сендвич острови" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинеја Бисао" #. 328 msgid "Guyana" msgstr "Гвајана" #. 344 msgid "Hong Kong" msgstr "Хонг Конг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Херд острови и Мекдоналд острови" #. 340 msgid "Honduras" msgstr "Хондурас" #. 191 msgid "Croatia" msgstr "Хрватска" #. 332 msgid "Haiti" msgstr "Хаити" #. 348 msgid "Hungary" msgstr "Унгарија" #. 360 msgid "Indonesia" msgstr "Индонезија" #. 372 msgid "Ireland" msgstr "Ирска" #. 376 msgid "Israel" msgstr "Израел" #. 833 msgid "Isle of Man" msgstr "Островот Ман" #. 356 msgid "India" msgstr "Индија" #. 086 msgid "British Indian Ocean Territory" msgstr "Британска територија на Индиски океан" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Исламска Република" #. 352 msgid "Iceland" msgstr "Исланд" #. 380 msgid "Italy" msgstr "Италија" #. 832 msgid "Jersey" msgstr "Џерси" #. 388 msgid "Jamaica" msgstr "Јамајка" #. 400 msgid "Jordan" msgstr "Јордан" #. 392 msgid "Japan" msgstr "Јапонија" #. 404 msgid "Kenya" msgstr "Кенија" #. 417 msgid "Kyrgyzstan" msgstr "Киргистан" #. 116 msgid "Cambodia" msgstr "Камбоџа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Коморски острови" #. 659 msgid "Saint Kitts and Nevis" msgstr "Свети Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Кореја, Демократска Народна Република" #. 410 msgid "Korea, Republic of" msgstr "Кореја, Република" #. 414 msgid "Kuwait" msgstr "Кувајт" #. 136 msgid "Cayman Islands" msgstr "Кајмански Острови" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Народна Демократска Република Лао" #. 422 msgid "Lebanon" msgstr "Либан" #. 662 msgid "Saint Lucia" msgstr "Света Лусија" #. 438 msgid "Liechtenstein" msgstr "Лихтенштајн" #. 144 msgid "Sri Lanka" msgstr "Шри Ланка" #. 430 msgid "Liberia" msgstr "Либерија" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литванија" #. 442 msgid "Luxembourg" msgstr "Луксембург" #. 428 msgid "Latvia" msgstr "Латвија" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Либиска Арапска Џамахирија" #. 504 msgid "Morocco" msgstr "Мароко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдавија, Република" #. 499 msgid "Montenegro" msgstr "Црна Гора" #. 663 msgid "Saint Martin (French part)" msgstr "Свети Мартин (Француски дел)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалови Острови" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонија" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мијанмар" #. 496 msgid "Mongolia" msgstr "Монголија" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Северни Маријански острови" #. 474 msgid "Martinique" msgstr "Мартиник" #. 478 msgid "Mauritania" msgstr "Мавританија" #. 500 msgid "Montserrat" msgstr "Монтсерат" #. 470 msgid "Malta" msgstr "Малта" #. 480 msgid "Mauritius" msgstr "Маврициус" #. 462 msgid "Maldives" msgstr "Малдиви" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексико" #. 458 msgid "Malaysia" msgstr "Малезија" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибија" #. 540 msgid "New Caledonia" msgstr "Нова Каледонија" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Норфолк, Остров" #. 566 msgid "Nigeria" msgstr "Нигерија" #. 558 msgid "Nicaragua" msgstr "Никарагва" #. 528 msgid "Netherlands" msgstr "Холандија" #. 578 msgid "Norway" msgstr "Норвешка" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ниуе" #. 554 msgid "New Zealand" msgstr "Нов Зеланд" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Француска Полинезија" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинеја" #. 608 msgid "Philippines" msgstr "Филипини" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Полска" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Свети Пјер и Микелон" #. 612 msgid "Pitcairn" msgstr "Питкерн" #. 630 msgid "Puerto Rico" msgstr "Порто Рико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестинска територија, Окупирана" #. 620 msgid "Portugal" msgstr "Португалија" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвај" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реунион" #. 642 msgid "Romania" msgstr "Романија" #. 688 msgid "Serbia" msgstr "Србија" #. 643 msgid "Russian Federation" msgstr "Руска федерација" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудиска Арабија" #. 090 msgid "Solomon Islands" msgstr "Соломонски Острови" #. 690 msgid "Seychelles" msgstr "Сејшели" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Шведска" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Света Елена" #. 705 msgid "Slovenia" msgstr "Словенија" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Свалбард и Жан Мајен" #. 703 msgid "Slovakia" msgstr "Словачка" #. 694 msgid "Sierra Leone" msgstr "Сиера Леоне" #. 674 msgid "San Marino" msgstr "Сан Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалија" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принципе" #. 222 msgid "El Salvador" msgstr "Ел Салвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сиријска Арапска Република" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Острови Турк и Каикос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Француски Јужни Територии" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Тајланд" #. 762 msgid "Tajikistan" msgstr "Таџикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Тимор-Источен" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турција" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тајван, Кинеска провинција" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзанија, Обединета Република" #. 804 msgid "Ukraine" msgstr "Украина" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Соединетите Држави, Мали додатни острови на" #. 840 msgid "United States" msgstr "Соединетите Американски Држави" #. 858 msgid "Uruguay" msgstr "Уругвај" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Светата Столица (Ватикан, Град - Држава)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Свети Винсент и Гренадините" #. 862 msgid "Venezuela" msgstr "Венецуела" #. 092 msgid "Virgin Islands, British" msgstr "Девствени Острови, Британски" #. 850 msgid "Virgin Islands, U.S." msgstr "Девствени Острови, САД" #. 704 msgid "Viet Nam" msgstr "Виетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Валис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Јемен" #. 175 msgid "Mayotte" msgstr "Мајоти" #. 710 msgid "South Africa" msgstr "Јужна Африка" #. 894 msgid "Zambia" msgstr "Замбија" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Непознато, додадете is_in тагови за овие градови" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карта" msgid "Car" msgstr "Автомобил" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Држава" msgid "Postal" msgstr "Поштенска" msgid "Town" msgstr "Град" msgid "District" msgstr "Област" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Број" msgid "Enter Destination" msgstr "Внесете одредиште" msgid "Zip Code" msgstr "Поштенски број" msgid "City" msgstr "Град" msgid "District/Township" msgstr "Општина" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Омилено место" msgid "Destination" msgstr "Одредиште" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Екран" msgid "_Route" msgstr "Рута" msgid "_Former Destinations" msgstr "Претходни одредишта" msgid "_Bookmarks" msgstr "Омилени места" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Изглед" msgid "_Projection" msgstr "Проекција" msgid "_Vehicle" msgstr "Возило" msgid "Zoom_Out" msgstr "Намали" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Зголеми" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Повторно пресметај" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Инфо" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Запирање на навигација" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Заврши" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Придржувај се до патот" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Патна книга" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Авто-зголемување" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "На цел екран" msgid "Data" msgstr "Податоци" msgid "N" msgstr "С" msgid "NE" msgstr "СИ" msgid "E" msgstr "И" msgid "SE" msgstr "ЈИ" msgid "S" msgstr "Ј" msgid "SW" msgstr "ЈЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "Не" msgid "2D" msgstr "2Д" msgid "3D" msgstr "3Д" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Рута %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Рута 0000km 0+00:00 ETA" msgid "Help" msgstr "Помош" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Види во пребарувач" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улици" msgid "House numbers" msgstr "Куќни броеви" msgid "View Attributes" msgstr "Види атрибути" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Интересни точки" msgid "View on map" msgstr "Види на карта" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Омилени места" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Интересно место %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Покажи статус на сателитите" msgid " Elevation " msgstr " Елевација " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Покажи NMEA податоци" msgid "car" msgstr "автомобил" msgid "bike" msgstr "велосипед" msgid "pedestrian" msgstr "пешак" #, c-format msgid "Current profile: %s" msgstr "Тековен профил: %s" #, c-format msgid "Change profile to: %s" msgstr "Смени профил во: %s" msgid "Set as active" msgstr "Постави како активен" msgid "Show Satellite status" msgstr "Покажи статус на сателитите" msgid "Show NMEA data" msgstr "Покажи NMEA податоци" msgid "Add Bookmark" msgstr "Додај обележувач" msgid "Rename" msgstr "" msgid "About Navit" msgstr "За Navit" #. Authors msgid "By" msgstr "Од" #. Contributors msgid "And all the Navit Team" msgstr "И целиот Navit тим" msgid "members and contributors." msgstr "членови и придонесувачи" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Возило" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Придржувај се на патот" msgid "Northing" msgstr "Северен правец" msgid "Map follows Vehicle" msgstr "Картата го следи возилото" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Изгледи" msgid "Layout" msgstr "Изглед" msgid "Height Profile" msgstr "Висински профил" msgid "Route Description" msgstr "Објаснување за патот" msgid "Show Locale" msgstr "Прикажи јазично подесување" msgid "Former Destinations" msgstr "Претходни одредишта" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Порака" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Врати се на картата" msgid "Main Menu" msgstr "Главно мени" msgid "House number" msgstr "Куќен број" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Позиција на возило" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Главно мени" msgid "" "Show\n" "Map" msgstr "" "Покажи ја\n" "Картата" msgid "Settings" msgstr "Поставувања" msgid "Tools" msgstr "Алатки" msgid "Route" msgstr "Рута" msgid "About" msgstr "За" msgid "Actions" msgstr "Акции" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Напушти" msgid "" "Stop\n" "Navigation" msgstr "" "Сопри ја\n" "Навигацијата" msgid "Display" msgstr "Екран" msgid "Fullscreen" msgstr "На цел екран" msgid "Window Mode" msgstr "Работи во прозорец" msgid "Description" msgstr "Опис" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "коњ" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "После %s влегувате во кружен ток" #~ msgid "Cursor" #~ msgstr "Покажувач" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d километри" navit-0.5.0~svn5643+dfsg.1/po/nb.po.in000066400000000000000000001070171221777731700171700ustar00rootroot00000000000000# Norwegian translations for navit # Copyright (C) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Bendik Brenne , 2008. # Helge Hafting # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-19 07:59+0000\n" "Last-Translator: Kurt Nielsen \n" "Language-Team: Bendik Brenne \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Kjører fra kildemappen\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setter '%s' til '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullte" msgid "first" msgstr "første" msgid "second" msgstr "andre" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjerde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjette" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullte avkjørsel" msgid "first exit" msgstr "første avkjøring" msgid "second exit" msgstr "andre avkjøring" msgid "third exit" msgstr "tredje avkjøring" msgid "fourth exit" msgstr "fjerde avkjøring" msgid "fifth exit" msgstr "femte avkjøring" msgid "sixth exit" msgstr "sjette avkjøring" #, c-format msgid "%d m" msgstr "%d meter" #, c-format msgid "in %d m" msgstr "om %d meter" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "om %d,%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "en kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om en kilometer" msgstr[1] "om %d kilometer" msgid "exit" msgstr "avkjørsel" msgid "into the ramp" msgstr "ut på akselerasjonsfeltet" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sinn på gaten %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sinn på %s%s%sen" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sinn på %s%s%sa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sin på %s%s%set" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinn på %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "høyre" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "venstre" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "slakt " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "skarpt " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "veldig skarpt " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ukjent " msgid "When possible, please turn around" msgstr "Snu når det er mulig" msgid "Enter the roundabout soon" msgstr "Kjør inn i rundkjøringen snart" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "forlat så rundkjøringen ut %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Forlat rundkjøringen ut %s" #, c-format msgid "Follow the road for the next %s" msgstr "Følg veien de neste %s" msgid "soon" msgstr "snart" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ta den %1$s veien mot %2$s" #, c-format msgid "after %i roads" msgstr "etter %i avkjøringer" msgid "now" msgstr "nå" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "ta deretter %1$s til %2$s" msgid "error" msgstr "feil" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Sving %1$s til %2$s om %3$s %4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "sving så %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Du har nådd ditt reisemål %s" msgid "then you have reached your destination." msgstr "så har du nådd ditt reisemål." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisjon" msgid "Command" msgstr "Instruks" msgid "Length" msgstr "Avstand" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tid" msgid "Destination Length" msgstr "Avstand til målet" msgid "Destination Time" msgstr "Tid til målet" msgid "Roadbook" msgstr "Kjørebok" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Sett som posisjon" msgid "Set as destination" msgstr "Sett som reisemål" msgid "Add as bookmark" msgstr "Legg til som bokmerke" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skjermkoordinat: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "De forente arabiske emirater" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "De nederlandske Antillene" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikansk Samoa" #. 040 msgid "Austria" msgstr "Østerrike" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetøya" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Hviterussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyene" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Den demokratiske republikken" #. 140 msgid "Central African Republic" msgstr "Den sentralafrikanske republikk" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Sveits" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbenskysten" #. 184 msgid "Cook Islands" msgstr "Cookøyene" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapp Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmasøya" #. 196 msgid "Cyprus" msgstr "Kypros" #. 203 msgid "Czech Republic" msgstr "Tsjekkia" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Den dominikanske republikk" #. 012 msgid "Algeria" msgstr "Algerie" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Vest-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøyene (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesia" #. 234 msgid "Faroe Islands" msgstr "Færøyene" #. 250 msgid "France" msgstr "Frankrike" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Fransk Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorial-Guinea" #. 300 msgid "Greece" msgstr "Hellas" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sør-Georgia og Sør-Sandwichøyene" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- og McDonald-øyene" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Det britiske territoriet i Indiahavet" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. 116 msgid "Cambodia" msgstr "Kambodsja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorene" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Nord-Korea" #. 410 msgid "Korea, Republic of" msgstr "Sør-Korea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Caymanøyene" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libya" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Fransk del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalløyene" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Burma" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord-Marianene" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldivene" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ny-Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkøya" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Norge" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua Ny-Guinea" #. 608 msgid "Philippines" msgstr "Filippinene" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairnøyene" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. 090 msgid "Solomon Islands" msgstr "Salomonøyene" #. 690 msgid "Seychelles" msgstr "Seychellene" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøyene" #. 148 msgid "Chad" msgstr "Tsjad" #. 260 msgid "French Southern Territories" msgstr "De franske sørterritorier" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadsjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Øst-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Tyrkia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "USAs ytre småøyer" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent og Grenadinene" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Jomfruøyene (Storbritannia)" #. 850 msgid "Virgin Islands, U.S." msgstr "Jomfruøyene (USA)" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- og Futunaøyene" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sør-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Ukjent, legg is_in-tagger til de byene." msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartpunkt" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "Sted" msgid "District" msgstr "Distrikt/Kommune" msgid "Street" msgstr "Gate" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Oppgi reisemålet" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "Sted" msgid "District/Township" msgstr "Distrikt/Kommune" msgid "Map" msgstr "Kart" msgid "Bookmark" msgstr "Bokmerke" msgid "Destination" msgstr "Reisemål" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visning" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "Tidligere reisemål" msgid "_Bookmarks" msgstr "Bokmerker" msgid "_Map" msgstr "Kart" msgid "_Layout" msgstr "Utseende" msgid "_Projection" msgstr "Projeksjon" msgid "_Vehicle" msgstr "Kjøretøy" msgid "Zoom_Out" msgstr "Zoom ut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom inn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Omberegn" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stopp navigasjon" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Avslutt" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lås til vei" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Kjørebok" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Auto-zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Fullskjerm" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NØ" msgid "E" msgstr "Ø" msgid "SE" msgstr "SØ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rute %4.0fkm %02d:%02d estimert tid" msgid "Route 0000km 0+00:00 ETA" msgstr "Rute 0000km 0+00:00 estimert tid" msgid "Help" msgstr "Hjelp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vis i browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gater" msgid "House numbers" msgstr "Husnummer" msgid "View Attributes" msgstr "Vis attributter" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Landemerker" msgid "View on map" msgstr "Vis på kart" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "Kopier bokmerke" msgid "Rename Bookmark" msgstr "Endre navn på bokmerke" msgid "Paste Bookmark" msgstr "Lim inn bokmerke" msgid "Delete Bookmark" msgstr "Slett bokmerke" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bokmerker" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Legg til bokmerke mappe" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lim inn bokmerke" #, c-format msgid "Bookmark %s" msgstr "Bokmerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vis satelittstatus" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Vis NMEA-data" msgid "car" msgstr "bil" msgid "bike" msgstr "sykkel" msgid "pedestrian" msgstr "fotgjenger" #, c-format msgid "Current profile: %s" msgstr "Aktiv profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Bytt profil: %s" msgid "Set as active" msgstr "Sett som aktiv" msgid "Show Satellite status" msgstr "Vis satelittstatus" msgid "Show NMEA data" msgstr "Vis NMEA-data" msgid "Add Bookmark" msgstr "Legg til bokmerke" msgid "Rename" msgstr "Bytt navn" msgid "About Navit" msgstr "Om Navit" #. Authors msgid "By" msgstr "Av" #. Contributors msgid "And all the Navit Team" msgstr "Og alle i Navit teamet" msgid "members and contributors." msgstr "medlemmer og bidragsytere." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Kjøretøy" msgid "Rules" msgstr "Regler" msgid "Lock on road" msgstr "Lås til vei" msgid "Northing" msgstr "Hold nord oppover" msgid "Map follows Vehicle" msgstr "Kart følger kjøretøy" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kart" msgid "Layout" msgstr "Utseende" msgid "Height Profile" msgstr "Høydeprofil" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Tidligere reisemål" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Melding" msgid "Back" msgstr "Tilbake" msgid "Back to map" msgstr "Tilbake til kart" msgid "Main Menu" msgstr "Hovedmeny" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Kjøretøysposisjon" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hovedmeny" msgid "" "Show\n" "Map" msgstr "" "Vis\n" "kart" msgid "Settings" msgstr "Innstillinger" msgid "Tools" msgstr "Verktøy" msgid "Route" msgstr "Rute" msgid "About" msgstr "Om" msgid "Actions" msgstr "Handlinger" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Avslutt" msgid "" "Stop\n" "Navigation" msgstr "" "Stopp\n" "navigasjon" msgid "Display" msgstr "Visning" msgid "Fullscreen" msgstr "Fullskjerm" msgid "Window Mode" msgstr "Vindusmodus" msgid "Description" msgstr "Beskrivelse" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hest" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Om %s, kjør inn i rundkjøringen" #~ msgid "Cursor" #~ msgstr "Markør" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d kilometer" navit-0.5.0~svn5643+dfsg.1/po/nds.po.in000066400000000000000000001070231221777731700173520ustar00rootroot00000000000000# German, Low translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Sagamir, 2009. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 09:29+0000\n" "Last-Translator: KaZeR \n" "Language-Team: German, Low \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Aus dem Quellverzeichins starten\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "%s zu %s setzen\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "diese" msgid "first" msgstr "erste" msgid "second" msgstr "zweite" msgid "third" msgstr "dritte" msgid "fourth" msgstr "vierte" msgid "fifth" msgstr "fünfte" msgid "sixth" msgstr "sechste" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "diese Ausfahrt" msgid "first exit" msgstr "erste Ausfahrt" msgid "second exit" msgstr "zweite Ausfahrt" msgid "third exit" msgstr "dritte Ausfahrt" msgid "fourth exit" msgstr "vierte Ausfahrt" msgid "fifth exit" msgstr "fünfte Ausfahrt" msgid "sixth exit" msgstr "sechste Ausfahrt" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "in %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d Meter" #, c-format msgid "in %d meters" msgstr "in %d Metern" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "in %d %d Kilometern" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ein Kilometer" msgstr[1] "%d Kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in einem Kilometer" msgstr[1] "in %d Kilometern" msgid "exit" msgstr "Ausfahrt" msgid "into the ramp" msgstr "auf die Auffahrt" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s in die Straße %s %s %s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s in den %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s in die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s in das %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s in die %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "Rechts" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "links" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "einfach " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "straf " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "wirklich scharf " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "unbekannt " msgid "When possible, please turn around" msgstr "Wenn möglich, bitte wenden" msgid "Enter the roundabout soon" msgstr "In Kürze in den Kreisverkehr einfahren" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "dann den Kreisverkehr an der %s verlassen" #, c-format msgid "Leave the roundabout at the %s" msgstr "Den Kreisverkehr an der %s verlassen" #, c-format msgid "Follow the road for the next %s" msgstr "Der Straße %s folgen" msgid "soon" msgstr "in Kürze" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Die %1$s Straße zur %2$s nehmen" #, c-format msgid "after %i roads" msgstr "nach %i Straßen" msgid "now" msgstr "jetzt" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "Dann die %1$s Straße zur %2$s nehmen" msgid "error" msgstr "Fehler" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "In %3$s %1$s%2$s %4$s abbiegen" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "dann %1$s%2$s %3$s%4$s abbiegen" #, c-format msgid "You have reached your destination %s" msgstr "Sie haben Ihr Ziel erreicht %s" msgid "then you have reached your destination." msgstr "Dann haben Sie Ihr Ziel erreicht" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Länge" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Zeit" msgid "Destination Length" msgstr "Fahrstrecke" msgid "Destination Time" msgstr "Fahrzeit" msgid "Roadbook" msgstr "Straßenatlas" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Als Position setzen" msgid "Set as destination" msgstr "Als Ziel setzen" msgid "Add as bookmark" msgstr "Als Lesezeichen hinzufügen" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinaten der Anzeige: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Vereinigte Arabische Emirate" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua und Barbados" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" #. 530 msgid "Netherlands Antilles" msgstr "Niederländische Antillen" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentinien" #. 016 msgid "American Samoa" msgstr "Amerikanisch Samoa" #. 040 msgid "Austria" msgstr "Österreich" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Aserbaidschan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien und Herzegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesch" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Sankt Bartholomäus" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivien" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Insel Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Weißrussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokos Inseln" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Demokratische Republik Kongo" #. 140 msgid "Central African Republic" msgstr "Zentralafrikanische Republik" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Schweiz" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbeinküste" #. 184 msgid "Cook Islands" msgstr "Insel Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Kolumbien" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Weihnachtsinsel" #. 196 msgid "Cyprus" msgstr "Zypern" #. 203 msgid "Czech Republic" msgstr "Tschechische Republik" #. 276 msgid "Germany" msgstr "Deutschland" #. 262 msgid "Djibouti" msgstr "Dschibuti" #. 208 msgid "Denmark" msgstr "Dänemark" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikanische Republik" #. 012 msgid "Algeria" msgstr "Algerien" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Ägypten" #. 732 msgid "Western Sahara" msgstr "Westsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Äthiopien" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fidschi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Inseln" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien" #. 234 msgid "Faroe Islands" msgstr "Färöer Inseln" #. 250 msgid "France" msgstr "Frankreich" #. 266 msgid "Gabon" msgstr "Gabun" #. 826 msgid "United Kingdom" msgstr "Vereinigtes Königreich" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Französisch Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Äquatorial Guinea" #. 300 msgid "Greece" msgstr "Griechenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Südgeorgien und die Südlichen Sandwichinseln" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Insel und die McDonaldinseln" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Britisches Territorium im Indischen Ozean" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanien" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisien" #. 116 msgid "Cambodia" msgstr "Kambodscha" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoren" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts und Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Nordkorea" #. 410 msgid "Korea, Republic of" msgstr "Südkorea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kaiman-Inseln" #. 398 msgid "Kazakhstan" msgstr "Kasachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libyen" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Republik Moldau" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "St. Martin" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallinseln" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Mazedonien" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolei" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord Mariannen Inseln" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediven" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Neukaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsel" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Niederlande" #. 578 msgid "Norway" msgstr "Norwegen" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Neuseeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Französisch Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua Neu Guinea" #. 608 msgid "Philippines" msgstr "Phillippinen" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "St.-Pierre und Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairninseln" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palästina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumänien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabien" #. 090 msgid "Solomon Islands" msgstr "Salomonen" #. 690 msgid "Seychelles" msgstr "Seychellen" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Schweden" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slowenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard und Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakei" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrien" #. 748 msgid "Swaziland" msgstr "Swasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- und Caicosinseln" #. 148 msgid "Chad" msgstr "Tschad" #. 260 msgid "French Southern Territories" msgstr "Französische Süd- und Antarktisgebiete" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadschikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Osttimor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türkei" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad und Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Amerikanisch-Ozeanien" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstadt" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent und die Grenadinen" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britische Jungferninseln" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikanische Jungferninseln" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis und Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Südafrika" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Simbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartenpunkt" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Postanschrift" msgid "Town" msgstr "Stadt" msgid "District" msgstr "Bezirk" msgid "Street" msgstr "Straße" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Reiseziel eingeben" msgid "Zip Code" msgstr "Postleitzahl" msgid "City" msgstr "Stadt" msgid "District/Township" msgstr "Ortsteil/Gemeinde" msgid "Map" msgstr "Karte" msgid "Bookmark" msgstr "Lesezeichen" msgid "Destination" msgstr "Reiseziel" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Anzeige" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Vorherige Ziele" msgid "_Bookmarks" msgstr "Lesezeichen" msgid "_Map" msgstr "Karte" msgid "_Layout" msgstr "Erscheinungsbild" msgid "_Projection" msgstr "Darstellung" msgid "_Vehicle" msgstr "Fahrzeug" msgid "Zoom_Out" msgstr "Verkleinern" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Vergrößern" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Neu berechnen" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Information" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Navigation beenden" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Beenden" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Auf Straße zeigen" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Straßenatlas" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "automatischer Zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Vollbild" msgid "Data" msgstr "Daten" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "SO" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nein" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Hilfe" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Im Browser anzeigen" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Straßen" msgid "House numbers" msgstr "Hausnummern" msgid "View Attributes" msgstr "Attribute anzeigen" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Auf der Karte zeigen" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Lesezeichen" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Lesezeichen %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Satellitenstatus anzeigen" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "zeige NMEA Daten" msgid "car" msgstr "Auto" msgid "bike" msgstr "Riejwiel" msgid "pedestrian" msgstr "Voetganger" #, c-format msgid "Current profile: %s" msgstr "Aktuelles Profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Profil wechseln nach: %s" msgid "Set as active" msgstr "Als Aktiv setzen" msgid "Show Satellite status" msgstr "Satellitenstatus anzeigen" msgid "Show NMEA data" msgstr "NMEA Daten anzeigen" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Fahrzeug" msgid "Rules" msgstr "Regeln" msgid "Lock on road" msgstr "Auf Straße zeigen" msgid "Northing" msgstr "Einnorden" msgid "Map follows Vehicle" msgstr "Karte folgt Fahrzeug" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Karten" msgid "Layout" msgstr "Erscheinungsbild" msgid "Height Profile" msgstr "Höhenprofil" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Vorherige Ziele" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Nachricht" msgid "Back" msgstr "Zurück" msgid "Back to map" msgstr "Zurück zur Karte" msgid "Main Menu" msgstr "Hauptmenü" msgid "House number" msgstr "Huisnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Fahrzeugposition" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hauptmenü" msgid "" "Show\n" "Map" msgstr "" "Karte\n" "anzeigen" msgid "Settings" msgstr "Einstellungen" msgid "Tools" msgstr "Werkzeuge" msgid "Route" msgstr "Route" msgid "About" msgstr "" msgid "Actions" msgstr "Aktionen" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Beenden" msgid "" "Stop\n" "Navigation" msgstr "" "Navigation\n" "beenden" msgid "Display" msgstr "Anzeige" msgid "Fullscreen" msgstr "Vollbild" msgid "Window Mode" msgstr "Fenstermodus" msgid "Description" msgstr "Beschreibung" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "In %s, in den Kreisverkehr einfahren" #~ msgid "Cursor" #~ msgstr "Zeiger" #~ msgid "%d.%d kilometer" #~ msgstr "%d %d Kilometer" navit-0.5.0~svn5643+dfsg.1/po/nl.po.in000066400000000000000000001111031221777731700171710ustar00rootroot00000000000000# Dutch translations for navit # Copyright (C) 2007,2008 The Navit Team # This file is distributed under the same license as the navit package. # Albert Faber, 2007. # Ed Kapitein msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-17 08:22+0000\n" "Last-Translator: Christ van Willegen \n" "Language-Team: afaber\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Gestart vanuit de brondirectory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Instelling '%s' naar '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulde" msgid "first" msgstr "eerste" msgid "second" msgstr "tweede" msgid "third" msgstr "derde" msgid "fourth" msgstr "vierde" msgid "fifth" msgstr "vijfde" msgid "sixth" msgstr "zesde" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulde afrit" msgid "first exit" msgstr "eerste afslag" msgid "second exit" msgstr "tweede afslag" msgid "third exit" msgstr "derde afslag" msgid "fourth exit" msgstr "vierde afslag" msgid "fifth exit" msgstr "vijfde afslag" msgid "sixth exit" msgstr "zesde afslag" #, c-format msgid "%d m" msgstr "%d meter" #, c-format msgid "in %d m" msgstr "na %d meter" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "na %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "na %d,%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "één kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "na één kilometer" msgstr[1] "na %d kilometer" msgid "exit" msgstr "afslag" msgid "into the ramp" msgstr "naar de afslag" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sde straat %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sde %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sde %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sde %s%s%s in" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%snaar de %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "rechts" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "links" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "flauw " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "scherp " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "zeer scherp " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "onbekende " msgid "When possible, please turn around" msgstr "Indien mogelijk omkeren" msgid "Enter the roundabout soon" msgstr "U rijdt zodadelijk de rotonde op" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "daarna de rotonde verlaten bij de %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Verlaat de rotonde bij de %s" #, c-format msgid "Follow the road for the next %s" msgstr "Volg de weg voor de volgende %s" msgid "soon" msgstr "binnenkort" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Neem de %1$s straat naar %2$s" #, c-format msgid "after %i roads" msgstr "na %i wegen" msgid "now" msgstr "nu" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "neem daarna de %1$s weg naar %2$s" msgid "error" msgstr "fout" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Ga %3$s %1$s naar %2$s %4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "daarna, ga na %3$s wegen %1$s %2$s naar %4$s" # over 200 meter links aanhouden #, c-format msgid "You have reached your destination %s" msgstr "%s bestemming bereikt" msgid "then you have reached your destination." msgstr "dan heeft u uw bestemming bereikt." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Positie" msgid "Command" msgstr "Opdracht" msgid "Length" msgstr "Duur" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tijd" msgid "Destination Length" msgstr "Afstand" msgid "Destination Time" msgstr "Aankomsttijd" msgid "Roadbook" msgstr "route beschrijving" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Zet als positie" msgid "Set as destination" msgstr "Gebruik als bestemming" msgid "Add as bookmark" msgstr "Opnemen als favoriet" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Schermcoörd: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Verenigde Arabische Emiraten" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua en Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanië" #. 051 msgid "Armenia" msgstr "Armenië" #. 530 msgid "Netherlands Antilles" msgstr "Nederlandse Antillen" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentinië" #. 016 msgid "American Samoa" msgstr "Samoa" #. 040 msgid "Austria" msgstr "Oostenrijk" #. 036 msgid "Australia" msgstr "Australië" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Färöer eilanden" #. 031 msgid "Azerbaijan" msgstr "Azerbeidjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnië en Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "België" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarije" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilië" #. 044 msgid "Bahamas" msgstr "Bahama's" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet eiland" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Wit-Rusland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocoseilanden" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo-Kinshasa" #. 140 msgid "Central African Republic" msgstr "Centraal Afrikaanse Republiek" #. 178 msgid "Congo" msgstr "Congo-Brazzaville" #. 756 msgid "Switzerland" msgstr "Zwitserland" #. 384 msgid "Cote d'Ivoire" msgstr "Ivoorkust" #. 184 msgid "Cook Islands" msgstr "Cookeilanden" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kameroen" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Kaap Verdië" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kersteiland" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Tsjechië" #. 276 msgid "Germany" msgstr "Duitsland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denemarken" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominicaanse Republiek" #. 012 msgid "Algeria" msgstr "Algerije" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypte" #. 732 msgid "Western Sahara" msgstr "Westsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanje" #. 231 msgid "Ethiopia" msgstr "Ethiopië" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Eilanden" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesië" #. 234 msgid "Faroe Islands" msgstr "Färöer" #. 250 msgid "France" msgstr "Frankrijk" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Verenigd Koninkrijk" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgië" #. 254 msgid "French Guiana" msgstr "Frans Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Papoea-Nieuw-Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equitoriaal Guinea" #. 300 msgid "Greece" msgstr "Griekenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Zuid Georgia en de zuidelijke Sandwich eilanden" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinee-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard en McDonald eilanden" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatië" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hongarije" #. 360 msgid "Indonesia" msgstr "Indonesië" #. 372 msgid "Ireland" msgstr "Ierland" #. 376 msgid "Israel" msgstr "Israël" #. 833 msgid "Isle of Man" msgstr "Eiland van Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Brits Territorium in de Indische Oceaan" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "IJsland" #. 380 msgid "Italy" msgstr "Italië" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordanie" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizië" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoren" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts en Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "ZuidKorea" #. 410 msgid "Korea, Republic of" msgstr "Noord-Korea" #. 414 msgid "Kuwait" msgstr "Koeweit" #. 136 msgid "Cayman Islands" msgstr "Caymaneilanden" #. 398 msgid "Kazakhstan" msgstr "Kazachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litouwen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Letland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libië" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavië" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Sint-Maarten (Franse Antillen)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall eilanden" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonië" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolië" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Noordelijke Marianen" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanië" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiven" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Maleisië" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibië" #. 540 msgid "New Caledonia" msgstr "Nieuw Caledonië" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "NIcaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Noorwegen" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nieuw Zeeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Frans Polynesië" #. 598 msgid "Papua New Guinea" msgstr "Papua Nieuw Guinea" #. 608 msgid "Philippines" msgstr "Philippijnen" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre en Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairneilanden" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestijns Gebied, Bezet" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roemenië" #. 688 msgid "Serbia" msgstr "Servië" #. 643 msgid "Russian Federation" msgstr "Rusland" #. 646 msgid "Rwanda" msgstr "Rwanda" # #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabië" #. 090 msgid "Solomon Islands" msgstr "Salomonseilanden" #. 690 msgid "Seychelles" msgstr "Seychellen" #. 736 msgid "Sudan" msgstr "Soedan" #. 752 msgid "Sweden" msgstr "Zweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sint-Helena" #. 705 msgid "Slovenia" msgstr "Slovenië" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard und Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakije" #. 694 msgid "Sierra Leone" msgstr "Siërra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalië" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé en Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrië" #. 748 msgid "Swaziland" msgstr "Swasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- en Caicoseilanden" #. 148 msgid "Chad" msgstr "Tjaad" #. 260 msgid "French Southern Territories" msgstr "Franse Zuidelijke en Antarctische Gebieden" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadzjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau-eilanden" #. 626 msgid "Timor-Leste" msgstr "Oost-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesië" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkije" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad en Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Oekraïne" #. 800 msgid "Uganda" msgstr "Oeganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Kleine Pacifische eilanden van de Verenigde Staten" #. 840 msgid "United States" msgstr "Verenigde Staten" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vaticaanstad" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent en de Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britse Maagdeneilanden" #. 850 msgid "Virgin Islands, U.S." msgstr "Maagdeneilanden, USA" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis en Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Zuid-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Onbekend, voeg een is_in-label toe aan deze steden" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punt op de kaart" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" # msgid "Postal" msgstr "Postcode" msgid "Town" msgstr "Plaats" # msgid "District" msgstr "District" msgid "Street" msgstr "Straat" msgid "Number" msgstr "Nummer" # msgid "Enter Destination" msgstr "Bestemming" msgid "Zip Code" msgstr "Postcode" msgid "City" msgstr "Stad" msgid "District/Township" msgstr "Gebied" msgid "Map" msgstr "Kaart" msgid "Bookmark" msgstr "Favoriet" msgid "Destination" msgstr "Bestemming" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Tonen" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Vorige bestemmingen" msgid "_Bookmarks" msgstr "Favorieten" msgid "_Map" msgstr "Kaart" msgid "_Layout" msgstr "Opmaak" msgid "_Projection" msgstr "Projectie" msgid "_Vehicle" msgstr "Voertuig" msgid "Zoom_Out" msgstr "Verkleinen" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Vergroten" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Herberekenen" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop navigatie" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "Beëindigen" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Huidige locatie altijd op de weg" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "route beschrijving" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Beeldvullend" msgid "Data" msgstr "Gegevens" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "ZO" msgid "S" msgstr "Z" msgid "SW" msgstr "ZW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nee" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d Aankomsttijd" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 Aankomsttijd" msgid "Help" msgstr "Hulp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Bekijk in browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Straten" msgid "House numbers" msgstr "huisnummers" msgid "View Attributes" msgstr "Bekijk eigenschappen" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "bezienswaardigheden" msgid "View on map" msgstr "Bekijk op de kaart" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "Plak Bladwijzer" msgid "Delete Bookmark" msgstr "Verwijder Bladwijzer" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Favorieten" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Plak Bladwijzer" #, c-format msgid "Bookmark %s" msgstr "Favoriet %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Toon satellietstatus" msgid " Elevation " msgstr " Hoogte " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Toon NMEA gegevens" msgid "car" msgstr "auto" msgid "bike" msgstr "fiets" msgid "pedestrian" msgstr "voetganger" #, c-format msgid "Current profile: %s" msgstr "Huidig profiel: %s" #, c-format msgid "Change profile to: %s" msgstr "profiel veranderen naar: % s" msgid "Set as active" msgstr "Activeren" msgid "Show Satellite status" msgstr "Satellietstatus weergeven" msgid "Show NMEA data" msgstr "Toon NMEA-gegevens" msgid "Add Bookmark" msgstr "Bladwijzer Toevoegen" msgid "Rename" msgstr "Hernoem" msgid "About Navit" msgstr "Over Navit" #. Authors msgid "By" msgstr "Door" #. Contributors msgid "And all the Navit Team" msgstr "En het hele Navit Team" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Voertuig" msgid "Rules" msgstr "Voorschrift" msgid "Lock on road" msgstr "Op weg plaatsen" msgid "Northing" msgstr "Noord boven" msgid "Map follows Vehicle" msgstr "Kaart volgt voertuig" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kaarten" msgid "Layout" msgstr "Opmaak" msgid "Height Profile" msgstr "Hoogteprofiel" msgid "Route Description" msgstr "Routebeschrijving" msgid "Show Locale" msgstr "Toon taal" msgid "Former Destinations" msgstr "Vorige bestemmingen" msgid "- No former destinations available -" msgstr "- Geen vorige bestemmingen -" msgid "Message" msgstr "Boodschap" msgid "Back" msgstr "Terug" msgid "Back to map" msgstr "Terug naar de kaart" msgid "Main Menu" msgstr "Hoofdmenu" msgid "House number" msgstr "Huisnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Zoek" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Steden" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "Gedownloade kaarten" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "klaar" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Niet genoeg vrije ruimte" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Resterende tijd" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Kaart downloaden" msgid "Vehicle Position" msgstr "Voertuigpositie" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Ja" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit gestart" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit actief" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Welkom bij Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Dank u voor het installeren van Navit!\n" "\n" "Om te beginnen, selecteer \"Download kaarten\" uit het menu en download een " "kaart van je regio. De kaarten zijn groot, dus is het aangeraden om een " "ongelimiteerde internetverbinding te hebben!\n" "\n" "Kaartendata: (c) OpenStreetMap contributors\n" "\n" "Nog veel plezier met Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Meer info" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Inzoomen" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Zoom uit" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Download kaarten" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Schakel POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Verlaat Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Verwijder deze kaart?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Downloading:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Fout met kaart downloaden" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Kaart downloaden afgebroken" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Zoek een adres" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Uwe bestemming" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Partieel" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Zoeken..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adres niet gevonden" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Zoekresultaten krijgen" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Zoekresultaten laden" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Geen resultaten gevonden" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Geen tekst ingevoerd" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Bestemming ingesteld:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hoofdmenu" msgid "" "Show\n" "Map" msgstr "" "Kaart\n" "Weergeven" msgid "Settings" msgstr "Instellingen" msgid "Tools" msgstr "Gereedschappen" msgid "Route" msgstr "Route" msgid "About" msgstr "" msgid "Actions" msgstr "Acties" msgid "" "Former\n" "Destinations" msgstr "" "Vorige\n" "bestemmingen" msgid "Quit" msgstr "Afsluiten" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "navigatie" msgid "Display" msgstr "Tonen" msgid "Fullscreen" msgstr "Beeldvullend" msgid "Window Mode" msgstr "Venstermodus" msgid "Description" msgstr "Beschrijving" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "paard" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Neem de rotonde over %s" #~ msgid "Cursor" #~ msgstr "Cursor" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d kilometer" navit-0.5.0~svn5643+dfsg.1/po/nn.po.in000066400000000000000000001045731221777731700172100ustar00rootroot00000000000000# Norwegian Nynorsk translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Skippern 2009 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 21:37+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Norwegian Nynorsk \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nn\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullte" msgid "first" msgstr "fyrste" msgid "second" msgstr "andre" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjerde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjette" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullte avkjøyring" msgid "first exit" msgstr "første avkjøyring" msgid "second exit" msgstr "andre avkjøyring" msgid "third exit" msgstr "tredje avkjøyring" msgid "fourth exit" msgstr "fjerde avkjøyring" msgid "fifth exit" msgstr "femte avkjøyring" msgid "sixth exit" msgstr "sjette avkjøyring" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "om %d meter" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "om %d,%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ein kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om ein kilometer" msgstr[1] "om %d kilometer" msgid "exit" msgstr "avkjøyring" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinn på %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "høgre" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "venstre" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "slakt " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "krapt " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "veldig krapt " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ukjend " msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "snart" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ta den %1$s vegen mot %2$s" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "no" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "feil" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisjon" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Avstand" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Dei sameinte arabiske emirata" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Dei nederlandske Antillane" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikansk Samoa" #. 040 msgid "Austria" msgstr "Austerrike" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Aserbadjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetøya" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Kviterussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyane" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Den demokratiske republikken" #. 140 msgid "Central African Republic" msgstr "Den sentralafrikanske republikken" #. 178 msgid "Congo" msgstr "Kongo-Brazzaville" #. 756 msgid "Switzerland" msgstr "Sveits" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbeinskysten" #. 184 msgid "Cook Islands" msgstr "Cookøyane" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapp Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Juløya" #. 196 msgid "Cyprus" msgstr "Kypros" #. 203 msgid "Czech Republic" msgstr "Tsjekkiske republikk" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Den dominikanske republikken" #. 012 msgid "Algeria" msgstr "Algerie" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Vest-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøyane" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesiaføderasjonen" #. 234 msgid "Faroe Islands" msgstr "Færøyane" #. 250 msgid "France" msgstr "Frankrike" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Fransk Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønnland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadelope" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorial-Guinea" #. 300 msgid "Greece" msgstr "Hellas" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sør-Georgia og Sør-Sandwichøyane" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- og McDonaldøyane" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatsia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Britiske territorier i det indiske hav" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Den islamske republikk" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodsja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorane" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Den demokratiske folkerepublikk" #. 410 msgid "Korea, Republic of" msgstr "Sør-Korea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kayman-øyane" #. 398 msgid "Kazakhstan" msgstr "Kasakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libya" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Fransk del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalløyane" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord-Marianane" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldivane" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ny-Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkøya" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Noreg" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Ny-Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua Ny-Guinea" #. 608 msgid "Philippines" msgstr "Fillipinane" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairnøyane" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. 090 msgid "Solomon Islands" msgstr "Salomonøyane" #. 690 msgid "Seychelles" msgstr "Seychellane" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome og Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøyane" #. 148 msgid "Chad" msgstr "Tsjad" #. 260 msgid "French Southern Territories" msgstr "Dei franske sørterritoria" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadsjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Aust-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunis" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Tyrkia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Mindre utenforliggende øyar til USA" #. 840 msgid "United States" msgstr "Dei forenede statar" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent og Grenadinane" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Jomfruøyane (Storbritannia)" #. 850 msgid "Virgin Islands, U.S." msgstr "Jomfruøyane (USA)" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- og Futunaøyane" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sør-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Ukjend, legg is_in-tagger til dei byane." msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "Sted" msgid "District" msgstr "Distrikt/Kommune" msgid "Street" msgstr "Gate" msgid "Number" msgstr "Tal" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "Sted" msgid "District/Township" msgstr "Distrikt/Kommune" msgid "Map" msgstr "Kart" msgid "Bookmark" msgstr "Bokmerke" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visning" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "Bokmerker" msgid "_Map" msgstr "Kart" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "Projeksjon" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "Zoom ut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom inn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Berekne på nytt" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Opplysningar" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stopp navigasjon" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lås til veg" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Auto-zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Heile skjermen" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NØ" msgid "E" msgstr "Ø" msgid "SE" msgstr "SØ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Hjelp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Vegar" msgid "House numbers" msgstr "Husnummer" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bokmerker" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Bokmerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vis satelittstatus" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Vis NMEA-data" msgid "car" msgstr "bil" msgid "bike" msgstr "sykkel" msgid "pedestrian" msgstr "fotgjengar" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "Vis satelittstatus" msgid "Show NMEA data" msgstr "Vis NMEA-data" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "Reglar" msgid "Lock on road" msgstr "Lås til veg" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kart" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "Høgdeprofil" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Melding" msgid "Back" msgstr "Tilbake" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "Hovudmenyen" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hovudmeny" msgid "" "Show\n" "Map" msgstr "" "Vis\n" "kart" msgid "Settings" msgstr "Innstillingar" msgid "Tools" msgstr "Verkty" msgid "Route" msgstr "Rute" msgid "About" msgstr "" msgid "Actions" msgstr "Handlingar" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Avslutt" msgid "" "Stop\n" "Navigation" msgstr "" "Stopp\n" "navigasjon" msgid "Display" msgstr "Visning" msgid "Fullscreen" msgstr "Heile skjermen" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Beskriving" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Cursor" #~ msgstr "Peikar" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d kilometer" navit-0.5.0~svn5643+dfsg.1/po/pl.po.in000066400000000000000000001144731221777731700172100ustar00rootroot00000000000000# Polish translations for navit. # Copyright (C) 2007, 2008 The Navit Team # This file is distributed under the same license as the Navit package. # Michael "Mineque" Madej , 2007. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2013-07-31 14:19+0100\n" "Last-Translator: Robert Wojewódzki \n" "Language-Team: Translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: POLAND\n" "X-Poedit-Language: Polish\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Uruchamiam z katalogu źródłowego\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ustawiam '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zerowy" msgid "first" msgstr "pierwszy" msgid "second" msgstr "drugi" msgid "third" msgstr "trzeci" msgid "fourth" msgstr "czwarty" msgid "fifth" msgstr "piąty" msgid "sixth" msgstr "szósty" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zerowym wyjeździe" msgid "first exit" msgstr "pierwszym wyjeździe" msgid "second exit" msgstr "drugim wyjeździe" msgid "third exit" msgstr "trzecim wyjeździe" msgid "fourth exit" msgstr "czwartym wyjeździe" msgid "fifth exit" msgstr "piątym wyjeździe" msgid "sixth exit" msgstr "szóstym wyjeździe" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "za %d m" #, c-format msgid "%d feet" msgstr "%d stopa" #, c-format msgid "in %d feet" msgstr "za %d stóp" #, c-format msgid "%d meters" msgstr "%d metrów" #, c-format msgid "in %d meters" msgstr "za %d metrów" #, c-format msgid "%d.%d miles" msgstr "%d.%d mil" #, c-format msgid "in %d.%d miles" msgstr "za %d.%d mil" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrów" #, c-format msgid "in %d.%d kilometers" msgstr "za %d.%d kilometrów" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "jedna mila" msgstr[1] "%d mile" msgstr[2] "%d mil" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "za jedną milę" msgstr[1] "za %d mile" msgstr[2] "za %d mil" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "jeden kilometr" msgstr[1] "%d kilometry" msgstr[2] "%d kilometrów" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "za jeden kilometr" msgstr[1] "za %d kilometry" msgstr[2] "za %d kilometrów" msgid "exit" msgstr "zjazd" msgid "into the ramp" msgstr "na wjazd" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s w ulicę %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sw %s%s%s|męski rodzaj" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sw %s%s%s|żeński rodzaj" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sw %s%s%s|neutralny rodzaj" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s do %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "w prawo" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "w lewo" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "lekko " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "silnie " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "bardzo silnie " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "nieznane " msgid "When possible, please turn around" msgstr "Zawróc, gdy będzie to możliwe" msgid "Enter the roundabout soon" msgstr "Wjazd na rondo wkrótce" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Wjazd na rondo %s" #, c-format msgid "then leave the roundabout at the %s" msgstr "następnie zjedź z ronda na %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Zjedź z ronda na %s" #, c-format msgid "Follow the road for the next %s" msgstr "Jedź tą drogą do następnego %s" msgid "soon" msgstr "wkrótce" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Jedź drogą %1$s do %2$s" #, c-format msgid "after %i roads" msgstr "po drodze %i" msgid "now" msgstr "teraz" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "następnie jedź %1$s drogą do %2$s" msgid "error" msgstr "błąd" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Skręć %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "następnie skręć %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Dotarłeś do celu %s" msgid "then you have reached your destination." msgstr "następnie dojechałeś do celu." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Położenie" msgid "Command" msgstr "Polecenie" msgid "Length" msgstr "Odległość" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Czas" msgid "Destination Length" msgstr "Odległość do celu" msgid "Destination Time" msgstr "Czas do celu" msgid "Roadbook" msgstr "Szczegóły trasy" #, c-format msgid "Waypoint %d" msgstr "Punkt trasy %d" msgid "Visit before..." msgstr "Odwiedź najpierw..." msgid "Set as position" msgstr "Ustaw jako pozycję" msgid "Set as destination" msgstr "Ustaw jako cel" msgid "Add as bookmark" msgstr "Dodaj jako zakładkę" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Współrzędne ekranu: %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Zjednoczone Emiraty Arabskie" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antyle Holenderskie" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktyka" #. 032 msgid "Argentina" msgstr "Argentyna" #. 016 msgid "American Samoa" msgstr "Samoa Amerykańskie" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Wyspy Alandzkie" #. 031 msgid "Azerbaijan" msgstr "Azerbejdżan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bośnia i Hercegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesz" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bułgaria" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Republika Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermudy" #. 096 msgid "Brunei Darussalam" msgstr "Państwo Brunei Siedziba Pokoju" #. 068 msgid "Bolivia" msgstr "Boliwia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius i Saba" #. 076 msgid "Brazil" msgstr "Brazylia" #. 044 msgid "Bahamas" msgstr "Bahamy" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Wyspa Bouveta" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Białoruś" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Wyspy Kokosowe (Keelinga)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Demokratyczna Republika Konga" #. 140 msgid "Central African Republic" msgstr "Republika Środkowej Afryki" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Szwajcaria" #. 384 msgid "Cote d'Ivoire" msgstr "Wybrzeże Kości Słoniowej" #. 184 msgid "Cook Islands" msgstr "Wyspy Cook'a" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Chiny" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Kostaryka" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Republika Zielonego Przylądka" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Wyspy Bożego Narodzenia" #. 196 msgid "Cyprus" msgstr "Cypr" #. 203 msgid "Czech Republic" msgstr "Republika Czeska" #. 276 msgid "Germany" msgstr "Niemcy" #. 262 msgid "Djibouti" msgstr "Dżibuti" #. 208 msgid "Denmark" msgstr "Dania" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Republika Dominikańska" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekwador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipt" #. 732 msgid "Western Sahara" msgstr "Zachodnia Sahara" #. 232 msgid "Eritrea" msgstr "Erytrea" #. 724 msgid "Spain" msgstr "Hiszpania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fidżi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandy (Malwiny)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezja" #. 234 msgid "Faroe Islands" msgstr "Wyspy Faroe" #. 250 msgid "France" msgstr "Francja" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Wielka Brytania" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Gujana Francuska" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Gwinea" #. 312 msgid "Guadeloupe" msgstr "Gwadelupa" #. 226 msgid "Equatorial Guinea" msgstr "Gwinea Równikowa" #. 300 msgid "Greece" msgstr "Grecja" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Wyspy Południowa Georgia i Sandwich Południowy" #. 320 msgid "Guatemala" msgstr "Gwatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gwinea-Bissau" #. 328 msgid "Guyana" msgstr "Gujana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Wyspa Heard i Wyspy McDonalda" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Chorwacja" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Węgry" #. 360 msgid "Indonesia" msgstr "Indonezja" #. 372 msgid "Ireland" msgstr "Irlandia" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Wyspa Man" #. 356 msgid "India" msgstr "Indie" #. 086 msgid "British Indian Ocean Territory" msgstr "Brytyjskie Terytorium Oceanu Indyjskiego" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Włochy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japonia" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodża" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komory" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts i Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea Północna" #. 410 msgid "Korea, Republic of" msgstr "Korea Południowa" #. 414 msgid "Kuwait" msgstr "Kuwejt" #. 136 msgid "Cayman Islands" msgstr "Kajmany" #. 398 msgid "Kazakhstan" msgstr "Kazachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, Laotańska Republika Ludowo-Demokratyczna" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litwa" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Łotwa" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Wielka Arabska Libijska Dżamahirijja Ludowo-Socjalistyczna" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Mołdawia" #. 499 msgid "Montenegro" msgstr "Czarnogóra" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (część francuska)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Wyspy Marshalla" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Republika Macedonii" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Związek Myanmar (Birma)" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Makau" #. 580 msgid "Northern Mariana Islands" msgstr "Mariany Północne" #. 474 msgid "Martinique" msgstr "Martynika" #. 478 msgid "Mauritania" msgstr "Mauretania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediwy" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksyk" #. 458 msgid "Malaysia" msgstr "Malezja" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nowa Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Wyspa Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Holandia" #. 578 msgid "Norway" msgstr "Norwegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nowa Zelandia" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinezja Francuska" #. 598 msgid "Papua New Guinea" msgstr "Papua Nowa Gwinea" #. 608 msgid "Philippines" msgstr "Filipiny" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polska" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre i Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Portoryko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Terytorium Palestyńskie, okupowane" #. 620 msgid "Portugal" msgstr "Portugalia" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragwaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumunia" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federacja Rosyjska" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudyjska" #. 090 msgid "Solomon Islands" msgstr "Wyspy Salomona" #. 690 msgid "Seychelles" msgstr "Seszele" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Szwecja" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Święta Helena" #. 705 msgid "Slovenia" msgstr "Słowenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. 703 msgid "Slovakia" msgstr "Słowacja" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Sudan Południowy" #. 678 msgid "Sao Tome and Principe" msgstr "Wyspy Świętego Tomasza i Książęca" #. 222 msgid "El Salvador" msgstr "Salwador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (część holenderska)" #. 760 msgid "Syrian Arab Republic" msgstr "Syryjska Republika Arabska" #. 748 msgid "Swaziland" msgstr "Suazi" #. 796 msgid "Turks and Caicos Islands" msgstr "Wyspy Turks i Caicos" #. 148 msgid "Chad" msgstr "Czad" #. 260 msgid "French Southern Territories" msgstr "Francuskie Terytoria Południowe" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajlandia" #. 762 msgid "Tajikistan" msgstr "Tadżykistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Wschodni" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunezja" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turcja" #. 780 msgid "Trinidad and Tobago" msgstr "Trynidad i Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tajwan, Republika Chińska" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, Zjednoczona Republika" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Dalekie Wyspy Mniejsze Stanów Zjednoczonych" #. 840 msgid "United States" msgstr "Stany Zjednoczone" #. 858 msgid "Uruguay" msgstr "Urugwaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Watykan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i Grenadyny" #. 862 msgid "Venezuela" msgstr "Wenezuela" #. 092 msgid "Virgin Islands, British" msgstr "Brytyjskie Wyspy Dziewicze" #. 850 msgid "Virgin Islands, U.S." msgstr "Wyspy Dziewicze Stanów Zjednoczonych" #. 704 msgid "Viet Nam" msgstr "Wietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Majotta" #. 710 msgid "South Africa" msgstr "Republika Południowej Afryki" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nieznane, dodaj is w tagach dla tych miast" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" "navit użycie:\n" "navit [opcje] [plik config]\n" "\t-c : użyje jako plik config\n" "\t-d : ustawi wyjściowy poziom globalnego debugowania na (0-3). " "Nadpisze ustawienia z pliku config.\n" "\t-h: wydrukuje to info użycia i wyjdzie.\n" "\t-v: Wydrukuje wersję i wyjdzie.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Brak pliku konfiguracji navit.xml, znaleziony navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Błąd przetworzenia pliku config '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Użycie pliku konfiguracji '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Nieudana wewnętrzna inicjalizacja, wychodzenie. Sprawdź poprzednie " "komunikaty błędu.\n" msgid "unknown street" msgstr "nieznana ulica" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nienazwany pojazd" msgid "Failed to write bookmarks file" msgstr "Nieudany zapis pliku zakładek" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punkt na mapie" msgid "Car" msgstr "Samochód" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Państwo" msgid "Postal" msgstr "Kod Pocztowy" msgid "Town" msgstr "Miasto" msgid "District" msgstr "Dzielnica" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Numer" msgid "Enter Destination" msgstr "Podaj cel" msgid "Zip Code" msgstr "Kod Pocztowy" msgid "City" msgstr "Miasto" msgid "District/Township" msgstr "Dzielnica/Okręg miejski" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Zakładka" msgid "Destination" msgstr "Cel" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Wyświetl" msgid "_Route" msgstr "_Trasa" msgid "_Former Destinations" msgstr "_Poprzednie cele" msgid "_Bookmarks" msgstr "_Zakładki" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "_Układ kolorów" msgid "_Projection" msgstr "_Odwzorowanie" msgid "_Vehicle" msgstr "_Pojazd" msgid "Zoom_Out" msgstr "Oddal" msgid "Decrease zoom level" msgstr "Zmniejsz poziom powiększenia" msgid "Zoom_In" msgstr "Zbliż" msgid "Increase zoom level" msgstr "Zwiększ poziom powiększenia" msgid "_Recalculate" msgstr "_Oblicz ponownie" msgid "Redraw map" msgstr "Przerysuj mapę" msgid "_Info" msgstr "_Info" msgid "Set _destination" msgstr "Ustaw _cel" msgid "Opens address search dialog" msgstr "Otwórz okno dialogowe wyszukiwania adresu" msgid "_Stop Navigation" msgstr "_Zatrzymaj nawigację" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Zakończ" msgid "Quit the application" msgstr "Wyjście z aplikacji" msgid "Show position _cursor" msgstr "Pokaż pozycję _kursora" msgid "_Lock on Road" msgstr "_Trzymaj się drogi" msgid "_Keep orientation to the North" msgstr "_Zachowaj orientację na Północ" msgid "Switches map orientation to the north or the vehicle" msgstr "Przełącz orientację mapy na północ lub pojazd" msgid "_Roadbook" msgstr "_Szczegóły trasy" msgid "Show/hide route description" msgstr "Pokaż/ukryj opis drogi" msgid "_Autozoom" msgstr "_Automatyczne przybliżenie" msgid "Enable/disable automatic zoom level changing" msgstr "Włącz/wyłącz automatyczną zmianę poziomu powiększenia" msgid "_Fullscreen" msgstr "_Pełny ekran" msgid "Data" msgstr "Dane" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nie" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trasa %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Trasa 0000km 0+00:00 ETA" msgid "Help" msgstr "Pomoc" #, c-format msgid "Waypoint %s" msgstr "Punkt trasy %s" msgid "Select waypoint to insert the new one before" msgstr "Wybierz punkt trasy aby wstawić przed nowy" msgid "View in Browser" msgstr "Zobacz w przeglądarce" msgid "Item type" msgstr "Typ pozycji" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "Numery domów" msgid "View Attributes" msgstr "Zobacz właściwości" msgid "Set as position (and deactivate vehicle)" msgstr "Ustaw jako pozycję (i deaktywuj pojazd)" msgid "POIs" msgstr "Użyteczne miejsca" msgid "View on map" msgstr "Zobacz na mapie" msgid "Remove search results from the map" msgstr "Usuń wyniki wyszukiwania z mapy" msgid "Show results on the map" msgstr "Pokaż wyniki na mapie" msgid "Cut Bookmark" msgstr "Wytnij zakładkę" msgid "Copy Bookmark" msgstr "Kopiuj zakładkę" msgid "Rename Bookmark" msgstr "Zmień nazwę zakładki" msgid "Paste Bookmark" msgstr "Wklej zakładkę" msgid "Delete Bookmark" msgstr "Usuń zakładkę" msgid "Delete waypoint" msgstr "Usuń punkt trasy" msgid "Bookmarks" msgstr "Zakładki" msgid "Bookmarks as waypoints" msgstr "Zakładki jako punkty trasy" msgid "Save waypoints" msgstr "Zapisz punkty trasy" msgid "Replace with waypoints" msgstr "Zamień punktami trasy" msgid "Delete Folder" msgstr "Usuń Katalog" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Dodaj folder zakładek" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Wklej zakładkę" #, c-format msgid "Bookmark %s" msgstr "Zakładka %s" #, c-format msgid "Download %s" msgstr "Pobieranie %s" msgid "Map Download" msgstr "Pobieranie Mapy" msgid "Active" msgstr "Aktywny" msgid "Download Enabled" msgstr "Włączone pobieranie" msgid "Download completely" msgstr "Pobieranie kompletne" msgid "Show Satellite Status" msgstr "Pokaż status satelitów" msgid " Elevation " msgstr " Wysokość n.p.m. " msgid " Azimuth " msgstr " Azymut " msgid "Show NMEA Data" msgstr "Pokaż dane NMEA" msgid "car" msgstr "auto" msgid "bike" msgstr "motor" msgid "pedestrian" msgstr "pieszy" #, c-format msgid "Current profile: %s" msgstr "Aktualny profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Zmień profil na: %s" msgid "Set as active" msgstr "Ustaw jako aktywny" msgid "Show Satellite status" msgstr "Pokaż status satelitów" msgid "Show NMEA data" msgstr "Pokaż dane NMEA" msgid "Add Bookmark" msgstr "Dodaj zakładkę" msgid "Rename" msgstr "Zmień nazwę" msgid "About Navit" msgstr "O Navit" #. Authors msgid "By" msgstr "Przez" #. Contributors msgid "And all the Navit Team" msgstr "I cały zespół Navit" msgid "members and contributors." msgstr "członkowie oraz współtwórcy." msgid "Waypoints" msgstr "Punkty trasy" msgid "Enter Coordinates" msgstr "Wprowadź współrzędne" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "Długość i szerokość geograficzna" msgid "Enter coordinates, for example:" msgstr "Wprowadź współrzędne, na przykład:" msgid "Vehicle" msgstr "Pojazd" msgid "Rules" msgstr "Reguły" msgid "Lock on road" msgstr "Trzymaj się drogi" msgid "Northing" msgstr "Północ zawsze na górze" msgid "Map follows Vehicle" msgstr "Wyśrodkuj mapę" msgid "Plan with Waypoints" msgstr "Plan z punktami trasy" msgid "Maps" msgstr "Mapy" msgid "Layout" msgstr "Układ kolorów" msgid "Height Profile" msgstr "Profil wysokości" msgid "Route Description" msgstr "Opis trasy" msgid "Show Locale" msgstr "Pokaż ustawienia regionalne" msgid "Former Destinations" msgstr "Poprzednie cele" msgid "- No former destinations available -" msgstr "- Brak dostępnych poprzednich celów -" msgid "Message" msgstr "Wiadomość" msgid "Back" msgstr "Wróć" msgid "Back to map" msgstr "Wróć do mapy" msgid "Main Menu" msgstr "Menu główne" msgid "House number" msgstr "Numer domu" msgid "Next" msgstr "Następny" msgid "Prev" msgstr "Poprzedni" msgid "Return to route!" msgstr "Powróć do drogi!" #. warning told msgid "Look out! Camera!" msgstr "Uważaj! Radar!" #. warning told msgid "Please decrease your speed" msgstr "Proszę zmniejszyć szybkość" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Pozycja pojazdu" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu główne" msgid "" "Show\n" "Map" msgstr "" "Pokaż\n" "mapę" msgid "Settings" msgstr "Ustawienia" msgid "Tools" msgstr "Narzędzia" msgid "Route" msgstr "Trasa" msgid "About" msgstr "O" msgid "Actions" msgstr "Akcje" msgid "" "Former\n" "Destinations" msgstr "" "Poprzednie\n" "Cele" msgid "Quit" msgstr "Zakończ" msgid "" "Stop\n" "Navigation" msgstr "" "Przerwij\n" "nawigację" msgid "Display" msgstr "Pokaż" msgid "Fullscreen" msgstr "Pełny ekran" msgid "Window Mode" msgstr "Tryb Widoku" msgid "Description" msgstr "Opis" msgid "" "Drop last \n" "Waypoint" msgstr "" "Opuść ostatni \n" "Punkt trasy" msgid "" "Drop next \n" "Waypoint" msgstr "" "Opuść następny \n" "Punkt trasy" msgid "Satellite Status" msgstr "Status satelity" msgid "NMEA Data" msgstr "Dane NMEA" msgid "car_shortest" msgstr "samochód_najkrótsza" msgid "car_avoid_tolls" msgstr "samochód_unikanie_opłat" msgid "car_pedantic" msgstr "samochód _pedantyczny" msgid "horse" msgstr "koń" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "Ciężarówka" #~ msgid "In %s, enter the roundabout" #~ msgstr "Wjedź na rondo za %s" #~ msgid "Cursor" #~ msgstr "Kursor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometra" navit-0.5.0~svn5643+dfsg.1/po/pt.po.in000066400000000000000000001076621221777731700172220ustar00rootroot00000000000000# Portuguese translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Joel Patrao \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando do diretório de origem\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ajuste '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "primeiro" msgid "second" msgstr "segundo" msgid "third" msgstr "terceiro" msgid "fourth" msgstr "quarto" msgid "fifth" msgstr "quinta" msgid "sixth" msgstr "sexto" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "saída zero" msgid "first exit" msgstr "primeira saida" msgid "second exit" msgstr "segunda saida" msgid "third exit" msgstr "terceira saida" msgid "fourth exit" msgstr "quarta saida" msgid "fifth exit" msgstr "quinta saida" msgid "sixth exit" msgstr "sexta saida" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "em %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "em %d metros" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "em %d.%d quilómetros" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "um quilḿetro" msgstr[1] "%d quilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "em um quilómetro" msgstr[1] "em %d quilómetros" msgid "exit" msgstr "sair" msgid "into the ramp" msgstr "na subida" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%spara a rua %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sna %s%s%s|formulário masculino" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sna %s%s%s|formulário feminino" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sna %s%s%s|formulário neutral" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "direita" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "esquerda" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "facilmente " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "veementemente " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "com força " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "desconhecido " msgid "When possible, please turn around" msgstr "Quando for possível" msgid "Enter the roundabout soon" msgstr "em breve entre na rotatória" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "depois deixe a rotunda na %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Deixe a rotunda na %s" #, c-format msgid "Follow the road for the next %s" msgstr "Siga a estrada para a próxima %s" msgid "soon" msgstr "logo" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Apanhe a %1$s estrada para %2$s" #, c-format msgid "after %i roads" msgstr "depois de %i estradas" msgid "now" msgstr "agora" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "depois apanhe a %1$s estrada para %2$s" msgid "error" msgstr "erro" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Vire %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "depois vire á %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Você chegou ao seu destino %s" msgid "then you have reached your destination." msgstr "depois chegou ao seu destino" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posição" msgid "Command" msgstr "Executar comandos" msgid "Length" msgstr "Duração" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempo" msgid "Destination Length" msgstr "Duração Destino" msgid "Destination Time" msgstr "Tempo Destino" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Definir como posição" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Adicionar como marcador" #, c-format msgid "Point 0x%x 0x%x" msgstr "Ponto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenada da tela: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emirados Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afeganistão" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua e Barbuda" #. 660 msgid "Anguilla" msgstr "Ilhas Anguillas" #. 008 msgid "Albania" msgstr "Albânia" #. 051 msgid "Armenia" msgstr "Arménia" #. 530 msgid "Netherlands Antilles" msgstr "Antilhas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antárctida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Áustria" #. 036 msgid "Australia" msgstr "Austrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijão" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bósnia-Herzegóvina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgária" #. 048 msgid "Bahrain" msgstr "Barein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benim" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butão" #. 074 msgid "Bouvet Island" msgstr "Ilha Bouvet" #. 072 msgid "Botswana" msgstr "Botsuana" #. 112 msgid "Belarus" msgstr "Bielorússia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Ilhas Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "República Democrática do Congo" #. 140 msgid "Central African Republic" msgstr "República Centro-Africanaa" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suíça" #. 384 msgid "Cote d'Ivoire" msgstr "Costa do Marfim" #. 184 msgid "Cook Islands" msgstr "Ilhas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camarões" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colômbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Ilha Natal" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemanha" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Algéria" #. 218 msgid "Ecuador" msgstr "Equador" #. 233 msgid "Estonia" msgstr "Estónia" #. 818 msgid "Egypt" msgstr "Egipto" #. 732 msgid "Western Sahara" msgstr "Sahara Ocidental" #. 232 msgid "Eritrea" msgstr "Eritreia" #. 724 msgid "Spain" msgstr "Espanha" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Finlândia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Falkland (Maldinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, estados federados de" #. 234 msgid "Faroe Islands" msgstr "Ilhas Faroé" #. 250 msgid "France" msgstr "França" #. 266 msgid "Gabon" msgstr "Gabão" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Geórgia" #. 254 msgid "French Guiana" msgstr "Guiana Francesa" #. 831 msgid "Guernsey" msgstr "Guernesei" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Gronelândia" #. 270 msgid "Gambia" msgstr "Gâmbia" #. 324 msgid "Guinea" msgstr "Guiné" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guiné Equatorial" #. 300 msgid "Greece" msgstr "Grécia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Geórgia do Sul e Ilhas Sandwich do Sul" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guiné-Bissáu" #. 328 msgid "Guyana" msgstr "Guiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Ilha Heard e Ilhas McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croácia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungria" #. 360 msgid "Indonesia" msgstr "Indonésia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Ilha de Man" #. 356 msgid "India" msgstr "Índia" #. 086 msgid "British Indian Ocean Territory" msgstr "Território Britânico do Oceano Índico" #. 368 msgid "Iraq" msgstr "Iraque" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irão, República Islâmica do" #. 352 msgid "Iceland" msgstr "Islândia" #. 380 msgid "Italy" msgstr "Itália" #. 832 msgid "Jersey" msgstr "Jérsia" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordânia" #. 392 msgid "Japan" msgstr "Japão" #. 404 msgid "Kenya" msgstr "Quénia" #. 417 msgid "Kyrgyzstan" msgstr "Quirgistão" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts e Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Coreia, República Popular Democrática de" #. 410 msgid "Korea, Republic of" msgstr "Coreia, República da" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Ilhas Caimão" #. 398 msgid "Kazakhstan" msgstr "Kazaquistão" #. 418 msgid "Lao People's Democratic Republic" msgstr "Républica Democrática Popular do Laos" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lúcia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituânia" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letónia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Jamahirya Árabe Líbia" #. 504 msgid "Morocco" msgstr "Marrocos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, República da" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "São Martin (Território Francês)" #. 450 msgid "Madagascar" msgstr "Madagáscar" #. 584 msgid "Marshall Islands" msgstr "Ilhas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedónia, da Antiga República Jugoslava" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongólia" #. 446 msgid "Macao" msgstr "Macau" #. 580 msgid "Northern Mariana Islands" msgstr "Ilhas Marianas do Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritânia" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurício" #. 462 msgid "Maldives" msgstr "Maldivas" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malásia" #. 508 msgid "Mozambique" msgstr "Moçambique" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nova Caledónia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Ilha Norfolk" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nicarágua" #. 528 msgid "Netherlands" msgstr "Países Baixos" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauruano" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelândia" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinésia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Guiné" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Paquistão" #. 616 msgid "Poland" msgstr "Polónia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre e Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Territórios Palestinos, Ocupados" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Quatar" #. 638 msgid "Reunion" msgstr "Ilha Reunião" #. 642 msgid "Romania" msgstr "Roménia" #. 688 msgid "Serbia" msgstr "Sérvia" #. 643 msgid "Russian Federation" msgstr "Federação Russa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arábia Saudita" #. 090 msgid "Solomon Islands" msgstr "Ilhas Salomão" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudão" #. 752 msgid "Sweden" msgstr "Suécia" #. 702 msgid "Singapore" msgstr "Singapura" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovénia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslováquia" #. 694 msgid "Sierra Leone" msgstr "Serra Leoa" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somália" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Républica Árabe Síria" #. 748 msgid "Swaziland" msgstr "Suazilândia" #. 796 msgid "Turks and Caicos Islands" msgstr "Ilhas Turks e Caicos" #. 148 msgid "Chad" msgstr "Chade" #. 260 msgid "French Southern Territories" msgstr "Territórios Franceses do Sul" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailândia" #. 762 msgid "Tajikistan" msgstr "Tadjaquistão" #. 772 msgid "Tokelau" msgstr "Toquelau" #. 626 msgid "Timor-Leste" msgstr "Timor Leste" #. 795 msgid "Turkmenistan" msgstr "Turcomenistão" #. 788 msgid "Tunisia" msgstr "Tunísia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidade e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Província da China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzânia, República Unida da" #. 804 msgid "Ukraine" msgstr "Ucrânia" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Ilhas Menores Exteriores dos Estados Unidos" #. 840 msgid "United States" msgstr "Estados Unidos da América" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbequistão" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sé (Estado Cidade do Vaticano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Grenadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Ilhas Virgens, Britânicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Ilhas Virgens, Estados Unidos" #. 704 msgid "Viet Nam" msgstr "Vietname" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yémen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Africa do Sul" #. 894 msgid "Zambia" msgstr "Zâmbia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconhecido, adicione tags \"is_in\" para essas cidades" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Ponto do mapa" msgid "Car" msgstr "Carro" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Cidade" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Rua" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introduza destino" msgid "Zip Code" msgstr "Código Postal" msgid "City" msgstr "Cidade" msgid "District/Township" msgstr "Distrito/Concelho" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Exibir" msgid "_Route" msgstr "Rota" msgid "_Former Destinations" msgstr "Anteriores Destinos" msgid "_Bookmarks" msgstr "Marcadores" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Esquema" msgid "_Projection" msgstr "Projecção" msgid "_Vehicle" msgstr "Veículo" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalcular" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Parar Navegação" msgid "Test" msgstr "Teste" msgid "_Quit" msgstr "_Sair" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Bloqueio na estrada" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Zoom Automático" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Ecrã Inteiro" msgid "Data" msgstr "Dados" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Não" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rota %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Rota 0000km 0+00:00 ETA" msgid "Help" msgstr "Ajuda" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ver no Navegador" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ruas" msgid "House numbers" msgstr "Números da Casa" msgid "View Attributes" msgstr "Ver Atributos" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Ver no mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Marcadores" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Mostrar Estado do Satélite" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Mostrar Dados NMEA" msgid "car" msgstr "carro" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "pedestre" #, c-format msgid "Current profile: %s" msgstr "Perfil atual: %s" #, c-format msgid "Change profile to: %s" msgstr "Alterar perfil para: %s" msgid "Set as active" msgstr "Definir como activo" msgid "Show Satellite status" msgstr "Mostrar estado do Satélite" msgid "Show NMEA data" msgstr "Mostrar dados NMEA" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Veículo" msgid "Rules" msgstr "Regras" msgid "Lock on road" msgstr "Prender na estrada" msgid "Northing" msgstr "Norte" msgid "Map follows Vehicle" msgstr "Mapa segue veículo" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Esquema" msgid "Height Profile" msgstr "Perfil de Altitude" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Anteriores Destinos" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mensagem" msgid "Back" msgstr "Voltar" msgid "Back to map" msgstr "Voltar ao mapa" msgid "Main Menu" msgstr "Menu Principal" msgid "House number" msgstr "Número da Casa" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posição do Veículo" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu Principal" msgid "" "Show\n" "Map" msgstr "" "Mostrar\n" "Mapa" msgid "Settings" msgstr "Definições" msgid "Tools" msgstr "Ferramentas" msgid "Route" msgstr "Rota" msgid "About" msgstr "" msgid "Actions" msgstr "Acções" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Sair" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegação" msgid "Display" msgstr "Exibir" msgid "Fullscreen" msgstr "Ecrã Inteiro" msgid "Window Mode" msgstr "Modo de Janela" msgid "Description" msgstr "Descrição" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Em %s, entre na rotatória" #~ msgid "Cursor" #~ msgstr "Cursor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d quilómetros" navit-0.5.0~svn5643+dfsg.1/po/pt_BR.po.in000066400000000000000000001117431221777731700176000ustar00rootroot00000000000000# Brazilian Portuguese translation for navit # Copyright (c) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Paulohm, 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-13 14:14+0000\n" "Last-Translator: Leonardo Hamada \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando do diretório de origem\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ajustando '%s' para '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "primeira" msgid "second" msgstr "segunda" msgid "third" msgstr "terceira" msgid "fourth" msgstr "quarta" msgid "fifth" msgstr "quinta" msgid "sixth" msgstr "sexta" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "saída zero" msgid "first exit" msgstr "primeira saída" msgid "second exit" msgstr "segunda saída" msgid "third exit" msgstr "terceira saída" msgid "fourth exit" msgstr "quarta saída" msgid "fifth exit" msgstr "quinta saída" msgid "sixth exit" msgstr "sexta saída" #, c-format msgid "%d m" msgstr "%d metros" #, c-format msgid "in %d m" msgstr "em %d metros" #, c-format msgid "%d feet" msgstr "%d pés" #, c-format msgid "in %d feet" msgstr "em %d pés" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "em %d metros" #, c-format msgid "%d.%d miles" msgstr "%d vírgula %d milhas" #, c-format msgid "in %d.%d miles" msgstr "em %d vírgula %d milhas" #, c-format msgid "%d.%d kilometers" msgstr "%d vírgula %d quilômetros" #, c-format msgid "in %d.%d kilometers" msgstr "em %d vírgula %d quilômetros" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "uma milha" msgstr[1] "%d milhas" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "em uma milha" msgstr[1] "em %d milhas" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "um quilômetro" msgstr[1] "%d quilômetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "em um quilômetro" msgstr[1] "em %d quilômetros" msgid "exit" msgstr "saída" msgid "into the ramp" msgstr "na rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sno %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sem %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "à direita" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "à esquerda" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "levemente " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "acentuadamente " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "vigorosamente " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "desconhecido " msgid "When possible, please turn around" msgstr "Quando possível, favor retornar" msgid "Enter the roundabout soon" msgstr "Prepare-se para entrar na rotatória em breve" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Entrarás na rotatória %s" #, c-format msgid "then leave the roundabout at the %s" msgstr "então deixe a rotatória na %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Deixe a rotatória na %s" #, c-format msgid "Follow the road for the next %s" msgstr "Continue na via pelos próximos %s" msgid "soon" msgstr "em breve" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Pegue a %1$s via para a %2$s" #, c-format msgid "after %i roads" msgstr "após %i vias" msgid "now" msgstr "agora" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "então pegue a %1$s via para a %2$s" msgid "error" msgstr "erro" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Vire %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "então vire %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Você chegará ao destino %s" msgid "then you have reached your destination." msgstr "então você chegará ao destino." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posição" msgid "Command" msgstr "Comando" msgid "Length" msgstr "Distância" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempo" msgid "Destination Length" msgstr "Distância ao Destino" msgid "Destination Time" msgstr "Tempo até o Destino" msgid "Roadbook" msgstr "Guia de estrada" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Definir como posição" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Adicionar aos marcadores" #, c-format msgid "Point 0x%x 0x%x" msgstr "Ponto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenada na tela : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emirados Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afeganistão" #. 028 msgid "Antigua and Barbuda" msgstr "Antígua e Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albânia" #. 051 msgid "Armenia" msgstr "Armênia" #. 530 msgid "Netherlands Antilles" msgstr "Antilhas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Áustria" #. 036 msgid "Australia" msgstr "Austrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ilhas Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijão" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bósnia e Herzegóvina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Fasso" #. 100 msgid "Bulgaria" msgstr "Bulgária" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "São Bartolomeu" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butão" #. 074 msgid "Bouvet Island" msgstr "Ilha Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorrússia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Ilhas Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "República Democrática do Congo" #. 140 msgid "Central African Republic" msgstr "República Africana Central" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suíça" #. 384 msgid "Cote d'Ivoire" msgstr "Côte d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Ilhas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camarões" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colômbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Ilha Christmas" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Tcheca" #. 276 msgid "Germany" msgstr "Alemanha" #. 262 msgid "Djibouti" msgstr "Djibuti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Algéria" #. 218 msgid "Ecuador" msgstr "Equador" #. 233 msgid "Estonia" msgstr "Estônia" #. 818 msgid "Egypt" msgstr "Egito" #. 732 msgid "Western Sahara" msgstr "Saara Ocidental" #. 232 msgid "Eritrea" msgstr "Eritreia" #. 724 msgid "Spain" msgstr "Espanha" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Finlândia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Falkland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Federação dos Estados da Micronésia" #. 234 msgid "Faroe Islands" msgstr "Ilhas Faroé" #. 250 msgid "France" msgstr "França" #. 266 msgid "Gabon" msgstr "Gabão" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Geórgia" #. 254 msgid "French Guiana" msgstr "Guiana Francesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groelândia" #. 270 msgid "Gambia" msgstr "Gâmbia" #. 324 msgid "Guinea" msgstr "Guiné" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guiné Equatorial" #. 300 msgid "Greece" msgstr "Grécia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Ilhas Geórgia e Sanduíche do Sul" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guiné-Bissau" #. 328 msgid "Guyana" msgstr "Guiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Ilha Heard e Ilhas McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croácia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungria" #. 360 msgid "Indonesia" msgstr "Indonésia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Ilha de Man" #. 356 msgid "India" msgstr "Índia" #. 086 msgid "British Indian Ocean Territory" msgstr "Território Britânico do Oceano Índico" #. 368 msgid "Iraq" msgstr "Iraque" #. 364 msgid "Iran, Islamic Republic of" msgstr "República Islâmica do Irã" #. 352 msgid "Iceland" msgstr "Islândia" #. 380 msgid "Italy" msgstr "Itália" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordânia" #. 392 msgid "Japan" msgstr "Japão" #. 404 msgid "Kenya" msgstr "Quênia" #. 417 msgid "Kyrgyzstan" msgstr "Quirguistão" #. 116 msgid "Cambodia" msgstr "Camboja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores" #. 659 msgid "Saint Kitts and Nevis" msgstr "São Cristóvão e Névis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "República do Povo Democrático da Coréia" #. 410 msgid "Korea, Republic of" msgstr "República da Coréia" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Ilhas Caiman" #. 398 msgid "Kazakhstan" msgstr "Cazaquistão" #. 418 msgid "Lao People's Democratic Republic" msgstr "República Democrática do Povo de Lao" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lúcia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Siri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituânia" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letônia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Líbia" #. 504 msgid "Morocco" msgstr "Marrocos" #. 492 msgid "Monaco" msgstr "Mônaco" #. 498 msgid "Moldova, Republic of" msgstr "República da Moldávia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "São Martin (parte francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Ilhas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedônia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mianmar" #. 496 msgid "Mongolia" msgstr "Mongólia" #. 446 msgid "Macao" msgstr "Macau" #. 580 msgid "Northern Mariana Islands" msgstr "Ilhas Marianas do Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritânia" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurício" #. 462 msgid "Maldives" msgstr "Maldivas" #. 454 msgid "Malawi" msgstr "Malavi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malásia" #. 508 msgid "Mozambique" msgstr "Moçambique" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nova Caledônia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Ilha Norfolk" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nicarágua" #. 528 msgid "Netherlands" msgstr "Holanda" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauruano" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelândia" #. 512 msgid "Oman" msgstr "Omã" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinésia francesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Guiné" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Paquistão" #. 616 msgid "Poland" msgstr "Polônia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "São Pedro e Miquelão" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Território Palestino Ocupado" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Catar" #. 638 msgid "Reunion" msgstr "Reunião" #. 642 msgid "Romania" msgstr "Romênia" #. 688 msgid "Serbia" msgstr "Sérvia" #. 643 msgid "Russian Federation" msgstr "Federação Russa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arábia Saudita" #. 090 msgid "Solomon Islands" msgstr "Ilhas Salomão" #. 690 msgid "Seychelles" msgstr "Seicheles" #. 736 msgid "Sudan" msgstr "Sudão" #. 752 msgid "Sweden" msgstr "Suécia" #. 702 msgid "Singapore" msgstr "Singapura" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovênia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslováquia" #. 694 msgid "Sierra Leone" msgstr "Serra Leoa" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somália" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe Síria" #. 748 msgid "Swaziland" msgstr "Suazilândia" #. 796 msgid "Turks and Caicos Islands" msgstr "Ilhas Turcas e Caicos" #. 148 msgid "Chad" msgstr "Chade" #. 260 msgid "French Southern Territories" msgstr "Territórios Franceses do Sul" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailândia" #. 762 msgid "Tajikistan" msgstr "Tajiquistão" #. 772 msgid "Tokelau" msgstr "Toquelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turcomenistão" #. 788 msgid "Tunisia" msgstr "Tunísia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "República Unida da Tanzânia" #. 804 msgid "Ukraine" msgstr "Ucrânia" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Ilhas Menores Distantes dos Estados Unidos" #. 840 msgid "United States" msgstr "Estados Unidos" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbequistão" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sé (Vaticano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Granadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Ilhas Virgens Britânicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Ilhas Virgens (Estados Unidos)" #. 704 msgid "Viet Nam" msgstr "Vietnã" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Iêmen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "África do Sul" #. 894 msgid "Zambia" msgstr "Zâmbia" #. 716 msgid "Zimbabwe" msgstr "Zimbábue" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconhecido, adicione tags \"is_in\" para essas cidades" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Ponto no Mapa" msgid "Car" msgstr "Carro" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Cidade" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Rua" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Especifique o Destino" msgid "Zip Code" msgstr "Código Postal" msgid "City" msgstr "Cidade" msgid "District/Township" msgstr "Distrito/Comunidade" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "E_xibição" msgid "_Route" msgstr "Ro_ta" msgid "_Former Destinations" msgstr "Destinos _Anteriores" msgid "_Bookmarks" msgstr "Mar_cadores" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "Dis_posição" msgid "_Projection" msgstr "Pro_jeção" msgid "_Vehicle" msgstr "_Veículo" msgid "Zoom_Out" msgstr "A_fastar" msgid "Decrease zoom level" msgstr "Diminuir o nível de aproximação" msgid "Zoom_In" msgstr "Apro_ximar" msgid "Increase zoom level" msgstr "Aumentar o nível de aproximação" msgid "_Recalculate" msgstr "_Recalcular" msgid "Redraw map" msgstr "Redesenhar mapa" msgid "_Info" msgstr "In_formação" msgid "Set _destination" msgstr "Estabelecer _destino" msgid "Opens address search dialog" msgstr "Abre a busca de endereço" msgid "_Stop Navigation" msgstr "Parar Nave_gação" msgid "Test" msgstr "Verificação" msgid "_Quit" msgstr "_Sair" msgid "Quit the application" msgstr "Sair da aplicação" msgid "Show position _cursor" msgstr "Mostrar o curs_or de posição" msgid "_Lock on Road" msgstr "Prender na _Estrada" msgid "_Keep orientation to the North" msgstr "Ma_nter orientado ao Norte" msgid "Switches map orientation to the north or the vehicle" msgstr "Muda a orientação do mapa para o norte ou o veículo" msgid "_Roadbook" msgstr "G_uia de estrada" msgid "Show/hide route description" msgstr "Mostrar/ocultar descrição da rota" msgid "_Autozoom" msgstr "Aproximação Automática" msgid "Enable/disable automatic zoom level changing" msgstr "Ativar/desativar a mudança automática do nível de aproximação" msgid "_Fullscreen" msgstr "Tela _Inteira" msgid "Data" msgstr "Dados" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "L" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Não" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rota %4.0fkm TEC %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Rota 0000km TEC 0+00:00" msgid "Help" msgstr "Ajuda" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ver no Navegador" msgid "Item type" msgstr "Tipo do item" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ruas" msgid "House numbers" msgstr "Números das casas" msgid "View Attributes" msgstr "Ver Atributos" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Pontos de Interesse" msgid "View on map" msgstr "Ver no mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Recortar Marcador" msgid "Copy Bookmark" msgstr "Copiar Marcador" msgid "Rename Bookmark" msgstr "Renomear Marcador" msgid "Paste Bookmark" msgstr "Colar Marcador" msgid "Delete Bookmark" msgstr "Apagar Marcador" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Marcadores" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Adicionar Pasta de Marcadores" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Colar marcador" #, c-format msgid "Bookmark %s" msgstr "Marcar %s" #, c-format msgid "Download %s" msgstr "Baixar %s" msgid "Map Download" msgstr "Baixar Mapa" msgid "Active" msgstr "Ativo" msgid "Download Enabled" msgstr "Habilitado para Baixar" msgid "Download completely" msgstr "Baixar completamente" msgid "Show Satellite Status" msgstr "Mostrar Estado do Satélite" msgid " Elevation " msgstr " Elevação " msgid " Azimuth " msgstr " Azimute " msgid "Show NMEA Data" msgstr "Mostrar Dados NMEA" msgid "car" msgstr "carro" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "pedestre" #, c-format msgid "Current profile: %s" msgstr "Perfil atual: %s" #, c-format msgid "Change profile to: %s" msgstr "Alterar perfil para: %s" msgid "Set as active" msgstr "Definir como ativo" msgid "Show Satellite status" msgstr "Mostrar estado do Satélite" msgid "Show NMEA data" msgstr "Mostrar dados NMEA" msgid "Add Bookmark" msgstr "Adicionar aos Marcadores" msgid "Rename" msgstr "Renomear" msgid "About Navit" msgstr "Sobre Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "E toda a equipe do Navit, " msgid "members and contributors." msgstr "membros e contribuintes." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Veículo" msgid "Rules" msgstr "Regras" msgid "Lock on road" msgstr "Prender na estrada" msgid "Northing" msgstr "Ao Norte" msgid "Map follows Vehicle" msgstr "Mapa segue Veículo" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Disposição" msgid "Height Profile" msgstr "Perfil de Altitude" msgid "Route Description" msgstr "Descrição do Percurso" msgid "Show Locale" msgstr "Mostrar a Localidade" msgid "Former Destinations" msgstr "Destinos Anteriores" msgid "- No former destinations available -" msgstr "- Destinos anteriores indisponíveis -" msgid "Message" msgstr "Mensagem" msgid "Back" msgstr "Voltar" msgid "Back to map" msgstr "Voltar ao mapa" msgid "Main Menu" msgstr "Menu Principal" msgid "House number" msgstr "Número da casa" msgid "Next" msgstr "Próximo" msgid "Prev" msgstr "Anterior" msgid "Return to route!" msgstr "Retorne para a rota!" #. warning told msgid "Look out! Camera!" msgstr "Atenção! Camera!" #. warning told msgid "Please decrease your speed" msgstr "Por favor, diminua a velocidade" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posição do Veículo" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Menu Principal" msgid "" "Show\n" "Map" msgstr "" "Mostrar\n" "Mapa" msgid "Settings" msgstr "Ajustes" msgid "Tools" msgstr "Ferramentas" msgid "Route" msgstr "Rota" msgid "About" msgstr "Sobre" msgid "Actions" msgstr "Ações" msgid "" "Former\n" "Destinations" msgstr "" "Destinos\n" "Anteriores" msgid "Quit" msgstr "Sair" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegação" msgid "Display" msgstr "Exibição" msgid "Fullscreen" msgstr "Tela Inteira" msgid "Window Mode" msgstr "Modo de Janela" msgid "Description" msgstr "Descrição" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cavalo" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "Caminhão" #~ msgid "In %s, enter the roundabout" #~ msgstr "Em %s, entre na rotatória" #~ msgid "Cursor" #~ msgstr "Cursor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d quilômetros" #~ msgid " SNR " #~ msgstr " SNR " #~ msgid " PRN " #~ msgstr " PRN " navit-0.5.0~svn5643+dfsg.1/po/ro.po.in000066400000000000000000001106261221777731700172110ustar00rootroot00000000000000# Romanian translation for navit # Copyright (c) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Nostriel , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-12 09:37+0000\n" "Last-Translator: igorashu \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Rulează din directorul sursă\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "se setează „%s” ca „%s”\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "prima" msgid "second" msgstr "a doua" msgid "third" msgstr "a treia" msgid "fourth" msgstr "a patra" msgid "fifth" msgstr "a cincea" msgid "sixth" msgstr "a șasea" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "ieșirea zero" msgid "first exit" msgstr "prima ieșire" msgid "second exit" msgstr "a doua ieșire" msgid "third exit" msgstr "a treia ieșire" msgid "fourth exit" msgstr "a patra ieșire" msgid "fifth exit" msgstr "a cincea ieșire" msgid "sixth exit" msgstr "a șasea ieșire" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "în %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metri" #, c-format msgid "in %d meters" msgstr "în %d metri" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometri" #, c-format msgid "in %d.%d kilometers" msgstr "în %d.%d kilometri" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilometru" msgstr[1] "%d kilometri" msgstr[2] "%d de kilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "într-un kilometru" msgstr[1] "în %d kilometri" msgstr[2] "în %d de kilometri" msgid "exit" msgstr "ieșire" msgid "into the ramp" msgstr "pe rampă" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s pe strada %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s pe %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s pe %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s pe %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s spre %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "la dreapta" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "la stânga" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "uşor " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "strâns " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "foarte puternic " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "necunoscut " msgid "When possible, please turn around" msgstr "Când este posibil, întoarceţi" msgid "Enter the roundabout soon" msgstr "Intrați în curând în giratoriu" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "apoi ieșiți din giratoriu la %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Ieșiți din giratoriu la %s" #, c-format msgid "Follow the road for the next %s" msgstr "Urmați drumul pentru încă %s" msgid "soon" msgstr "curând" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Virați %2s pe %1s stradă" #, c-format msgid "after %i roads" msgstr "după %i străzi" msgid "now" msgstr "acum" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "apoi faceți %2s pe %1s stradă" msgid "error" msgstr "eroare" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Virați %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "apoi virați %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Ați ajuns la destinație %s" msgid "then you have reached your destination." msgstr "apoi ajungeți la destinație." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Poziție" msgid "Command" msgstr "Comandă" msgid "Length" msgstr "Lungime" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Timp" msgid "Destination Length" msgstr "Lungimea până la destinaţie" msgid "Destination Time" msgstr "Timpul până la destinaţie" msgid "Roadbook" msgstr "Drum blocat" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Configurează ca poziție" msgid "Set as destination" msgstr "Configurează ca destinație" msgid "Add as bookmark" msgstr "Adaugă la semnele de carte" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punctul 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordonate ecran : %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Emiratele Arabe Unite" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua şi Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilele Olandeze" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americană" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia și Herțegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeș" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Sfântul Bartolomeu" #. 060 msgid "Bermuda" msgstr "Bermude" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilia" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Insula Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Insulele Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Republica Democrată" #. 140 msgid "Central African Republic" msgstr "Republica Centrafricană" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Elveția" #. 384 msgid "Cote d'Ivoire" msgstr "Coasta de Azur" #. 184 msgid "Cook Islands" msgstr "Insulele Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Columbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Capul Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Insula Crăciunului" #. 196 msgid "Cyprus" msgstr "Cipru" #. 203 msgid "Czech Republic" msgstr "Republica Cehă" #. 276 msgid "Germany" msgstr "Germania" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danemarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Republica Dominicană" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipt" #. 732 msgid "Western Sahara" msgstr "Sahara de Vest" #. 232 msgid "Eritrea" msgstr "Eritreea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlanda" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Insulele Falkland (Malvine)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Statele Federale ale" #. 234 msgid "Faroe Islands" msgstr "Insulele Feroe" #. 250 msgid "France" msgstr "Franţa" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Regatul Unit al Marii Britanii" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guiana Franceză" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlanda" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guineea" #. 312 msgid "Guadeloupe" msgstr "Guadalupa" #. 226 msgid "Equatorial Guinea" msgstr "Guineea Ecuatorială" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia de Sud şi Insulele Sudice Sandwich" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guineea-Bissau" #. 328 msgid "Guyana" msgstr "Guiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Insulele Heard şi McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croaţia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungaria" #. 360 msgid "Indonesia" msgstr "Indonezia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Insula Omului" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Teritoriul Britanic al Oceanului Indian" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Republica Islamică" #. 352 msgid "Iceland" msgstr "Islanda" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Iordan" #. 392 msgid "Japan" msgstr "Japonia" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghistan" #. 116 msgid "Cambodia" msgstr "Cambogia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts şi Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Republica Democrată Poapulară Coreea" #. 410 msgid "Korea, Republic of" msgstr "Republica Coreea" #. 414 msgid "Kuwait" msgstr "Kuweit" #. 136 msgid "Cayman Islands" msgstr "Insulele Caiman" #. 398 msgid "Kazakhstan" msgstr "Kazahstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Republica Populară Democrată Lao" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Sfânta Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Jamahiriya Arabă Libiană" #. 504 msgid "Morocco" msgstr "Maroc" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Republica Moldovă" #. 499 msgid "Montenegro" msgstr "Muntenegru" #. 663 msgid "Saint Martin (French part)" msgstr "Sfântul Martin (partea franceză)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Insulele Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Fosta Republică Iugoslavă Macedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Insulele Mariane de Nord" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritania" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexic" #. 458 msgid "Malaysia" msgstr "Malaezia" #. 508 msgid "Mozambique" msgstr "Mozambic" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Noua Caledonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Insula Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Olanda" #. 578 msgid "Norway" msgstr "Norvegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Noua Zeelandă" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinezia Franceză" #. 598 msgid "Papua New Guinea" msgstr "Papua Noua Guinee" #. 608 msgid "Philippines" msgstr "Filipine" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sfântul Pierre şi Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Teritoriile Palestiniene, Ocupate" #. 620 msgid "Portugal" msgstr "Portugalia" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "România" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federaţia Rusă" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudită" #. 090 msgid "Solomon Islands" msgstr "Insulele Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suedia" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Insulele Svalbard şi Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovacia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome și Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Republica Araba Siria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Insulele Turks şi Caicos" #. 148 msgid "Chad" msgstr "Ciad" #. 260 msgid "French Southern Territories" msgstr "Teritoriile Franceze de Sud" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailanda" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timorul de Est" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turcia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad şi Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Provincia Chineză Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Republica Unită Tanzania" #. 804 msgid "Ukraine" msgstr "Ucraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Insulele de Coasta ale Statelor Unite" #. 840 msgid "United States" msgstr "Statele Unite" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatican (Oraşul Stat Vatican)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent şi Grenadin" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Insulele Virgine (Britanice)" #. 850 msgid "Virgin Islands, U.S." msgstr "Insulele Virgine (SUA)" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis şi Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Africa de Sud" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Necunoscut, adaugă eticheta is_in tags acestor orașe" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Locație pe hartă" msgid "Car" msgstr "Maşină" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Ţară" msgid "Postal" msgstr "Poştal" msgid "Town" msgstr "Oraş" msgid "District" msgstr "Cartier" msgid "Street" msgstr "Stradă" msgid "Number" msgstr "Număr" msgid "Enter Destination" msgstr "Introduceți destinaţia" msgid "Zip Code" msgstr "Cod poștal" msgid "City" msgstr "Oraș" msgid "District/Township" msgstr "District/Reședință" msgid "Map" msgstr "Hartă" msgid "Bookmark" msgstr "Semn de carte" msgid "Destination" msgstr "Destinaţie" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Ecran" msgid "_Route" msgstr "Traseu" msgid "_Former Destinations" msgstr "Destinații anterioare" msgid "_Bookmarks" msgstr "Semne de carte" msgid "_Map" msgstr "Hartă" msgid "_Layout" msgstr "Dispunere" msgid "_Projection" msgstr "Proiecție" msgid "_Vehicle" msgstr "Vehicul" msgid "Zoom_Out" msgstr "Depărtează" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Apropie" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalculează" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informații" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Oprește navigarea" msgid "Test" msgstr "Testează" msgid "_Quit" msgstr "_Ieșire" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Fixează strada" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Drum blocat" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Pe tot ecranul" msgid "Data" msgstr "Date" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nu" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Glob" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rută %4.0f km sosire estimată %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Rută 0000 km sosire estimată 0+00:00" msgid "Help" msgstr "Ajutor" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Arată în navigator" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Străzi" msgid "House numbers" msgstr "Numere case" msgid "View Attributes" msgstr "Arată atributele" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Puncte de interes" msgid "View on map" msgstr "Arată pe hartă" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Taie semnul de carte" msgid "Copy Bookmark" msgstr "Copiază semnul de carte" msgid "Rename Bookmark" msgstr "Redenumește semnul de carte" msgid "Paste Bookmark" msgstr "Lipește semnul de carte" msgid "Delete Bookmark" msgstr "Șterge semnul de carte" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Semne de carte" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Adaugă director pentru semne de carte" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lipește semn de carte" #, c-format msgid "Bookmark %s" msgstr "%s ca semn de carte" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Arată starea sateliților" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Arată datele NMEA" msgid "car" msgstr "mașină" msgid "bike" msgstr "bicicletă" msgid "pedestrian" msgstr "pieton" #, c-format msgid "Current profile: %s" msgstr "Profil curent: %s" #, c-format msgid "Change profile to: %s" msgstr "Schimbă profilul la: %s" msgid "Set as active" msgstr "Activează" msgid "Show Satellite status" msgstr "Arată starea sateliților" msgid "Show NMEA data" msgstr "Arată datele NMEA" msgid "Add Bookmark" msgstr "Adaugă semn de carte" msgid "Rename" msgstr "Redenumește" msgid "About Navit" msgstr "Despre Navit" #. Authors msgid "By" msgstr "De" #. Contributors msgid "And all the Navit Team" msgstr "Și întreaga echipă Navit" msgid "members and contributors." msgstr "membri și colaboratori." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicul" msgid "Rules" msgstr "Reguli" msgid "Lock on road" msgstr "Fixează strada" msgid "Northing" msgstr "Nimic" msgid "Map follows Vehicle" msgstr "Harta urmează vehiculul" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Hărți" msgid "Layout" msgstr "Dispunere" msgid "Height Profile" msgstr "Profil înălțime" msgid "Route Description" msgstr "Descrerea traseului" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Destinații anterioare" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mesaj" msgid "Back" msgstr "Înapoi" msgid "Back to map" msgstr "Înapoi la hartă" msgid "Main Menu" msgstr "Meniu principal" msgid "House number" msgstr "Număr casă" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Poziția vehiculului" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Meniu principal" msgid "" "Show\n" "Map" msgstr "" "Afișează\n" "hartă" msgid "Settings" msgstr "Configurații" msgid "Tools" msgstr "Unelte" msgid "Route" msgstr "Traseu" msgid "About" msgstr "Despre" msgid "Actions" msgstr "Acțiuni" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Ieși" msgid "" "Stop\n" "Navigation" msgstr "" "Oprește\n" "navigația" msgid "Display" msgstr "Ecran" msgid "Fullscreen" msgstr "Pe tot ecranul" msgid "Window Mode" msgstr "Mod „fereastră”" msgid "Description" msgstr "Descriere" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cal" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "În %s, intrați în sensul giratoriu" #~ msgid "Cursor" #~ msgstr "Cursor" #~ msgid "%d.%d kilometer" #~ msgstr "kilometrul %d.%d" navit-0.5.0~svn5643+dfsg.1/po/ru.po.in000066400000000000000000001351251221777731700172200ustar00rootroot00000000000000# Russian translations for navit. # Copyright (C) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Rustam Usmanov , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-30 18:26+0000\n" "Last-Translator: Denis Chapligin \n" "Language-Team: Rustam T. Usmanov\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-06-30 20:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Запуск в исходном каталоге\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "установка '%s' в '%s'\\n\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулевой" msgid "first" msgstr "первый" msgid "second" msgstr "второй" msgid "third" msgstr "третий" msgid "fourth" msgstr "четвертый" msgid "fifth" msgstr "пятый" msgid "sixth" msgstr "шестой" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нулевой выезд" msgid "first exit" msgstr "первый выезд" msgid "second exit" msgstr "второй выезд" msgid "third exit" msgstr "третий выезд" msgid "fourth exit" msgstr "четвертый выезд" msgid "fifth exit" msgstr "пятый выезд" msgid "sixth exit" msgstr "шестой выезд" #, c-format msgid "%d m" msgstr "%d м" #, c-format msgid "in %d m" msgstr "через %d м" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "через %d футов" #, c-format msgid "%d meters" msgstr "%d метров" #, c-format msgid "in %d meters" msgstr "через %d метров" #, c-format msgid "%d.%d miles" msgstr "%d,%d миль" #, c-format msgid "in %d.%d miles" msgstr "через %d,%d миль" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d километров" #, c-format msgid "in %d.%d kilometers" msgstr "через %d,%d километров" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d километр" msgstr[1] "%d километра" msgstr[2] "%d километров" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "через %d километр" msgstr[1] "%d километра" msgstr[2] "%d километров" msgid "exit" msgstr "съезд" msgid "into the ramp" msgstr "съезд на" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s на улицу %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s на %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s на %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s на %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s на %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "направо" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "налево" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "немного " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "круто " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "очень круто " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "неизвестно " msgid "When possible, please turn around" msgstr "Развернитесь, пожалуйста, если это возможно" msgid "Enter the roundabout soon" msgstr "Скоро круговое движение" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Через %s круговое движение" #, c-format msgid "then leave the roundabout at the %s" msgstr "потом съезжайте с кругового движения на %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Съезжайте с кругового движения на %s" #, c-format msgid "Follow the road for the next %s" msgstr "Двигайтесь по дороге следующие %s" msgid "soon" msgstr "скоро" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Выезжайте на %1$s дорогу в направлении %2$s" #, c-format msgid "after %i roads" msgstr "после %i дорог" msgid "now" msgstr "сейчас" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "после чего выезжайте на %1$s дорогу в направлении %2$s" msgid "error" msgstr "ошибка" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Сверните %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "после чего поверните %1$s%2$s на %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Вы прибыли в пункт назначения %s" msgid "then you have reached your destination." msgstr "после чего вы прибудете в пункт назначения" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиция" msgid "Command" msgstr "Команда" msgid "Length" msgstr "Длина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Время" msgid "Destination Length" msgstr "Дистанция до пункта назначения" msgid "Destination Time" msgstr "Время до пункта назначения" msgid "Roadbook" msgstr "Дорожный справочник" #, c-format msgid "Waypoint %d" msgstr "Точка %d" msgid "Visit before..." msgstr "Заехать перед..." msgid "Set as position" msgstr "Установить как пункт отправления" msgid "Set as destination" msgstr "Установить как пункт назначения" msgid "Add as bookmark" msgstr "Добавить закладку" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Экран %d %d" #. 020 msgid "Andorra" msgstr "Андорра" #. 784 msgid "United Arab Emirates" msgstr "Объединенные Арабские Эмираты" #. 004 msgid "Afghanistan" msgstr "Афганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигуа и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангилья" #. 008 msgid "Albania" msgstr "Албания" #. 051 msgid "Armenia" msgstr "Армения" #. 530 msgid "Netherlands Antilles" msgstr "Антильские (Нидерланские) острова" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Америк. Самоа" #. 040 msgid "Austria" msgstr "Австрия" #. 036 msgid "Australia" msgstr "Австралия" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Фарерские Острова" #. 031 msgid "Azerbaijan" msgstr "Азербайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босния и Герцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Бельгия" #. 854 msgid "Burkina Faso" msgstr "Буркина-Фасо" #. 100 msgid "Bulgaria" msgstr "Болгария" #. 048 msgid "Bahrain" msgstr "Бахрейн" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Сен-Бартелемей" #. 060 msgid "Bermuda" msgstr "Бермудские острова" #. 096 msgid "Brunei Darussalam" msgstr "Бруней Даруссалам" #. 068 msgid "Bolivia" msgstr "Боливия" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Бонэйр, Синт-Эстатиус и Саба" #. 076 msgid "Brazil" msgstr "Бразилия" #. 044 msgid "Bahamas" msgstr "Багамы" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Остров Буве" #. 072 msgid "Botswana" msgstr "Ботсвана" #. 112 msgid "Belarus" msgstr "Белоруссия" #. 084 msgid "Belize" msgstr "Белиз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосовые (Килинг) острова" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Конго, Демократическая Республика" #. 140 msgid "Central African Republic" msgstr "Центральноафриканская Республика" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швейцария" #. 384 msgid "Cote d'Ivoire" msgstr "Кот-д'Ивуар" #. 184 msgid "Cook Islands" msgstr "Кука Острова" #. 152 msgid "Chile" msgstr "Чили" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Китай" #. 170 msgid "Colombia" msgstr "Колумбия" #. 188 msgid "Costa Rica" msgstr "Коста-Рика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кабо-Верде" #. 531 msgid "Curacao" msgstr "Кюрасао" #. 162 msgid "Christmas Island" msgstr "Остров Рождества" #. 196 msgid "Cyprus" msgstr "Кипр" #. 203 msgid "Czech Republic" msgstr "Чешская Республика" #. 276 msgid "Germany" msgstr "Германия" #. 262 msgid "Djibouti" msgstr "Джибути" #. 208 msgid "Denmark" msgstr "Дания" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканская Республика" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Эквадор" #. 233 msgid "Estonia" msgstr "Эстония" #. 818 msgid "Egypt" msgstr "Египет" #. 732 msgid "Western Sahara" msgstr "Западная Сахара" #. 232 msgid "Eritrea" msgstr "Эритрея" #. 724 msgid "Spain" msgstr "Испания" #. 231 msgid "Ethiopia" msgstr "Эфиопия" #. 246 msgid "Finland" msgstr "Финляндия" #. 242 msgid "Fiji" msgstr "Фиджи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендские (Мальвинские) острова" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронэзия, Федеративные Штаты" #. 234 msgid "Faroe Islands" msgstr "Фарерские Острова" #. 250 msgid "France" msgstr "Франция" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Великобритания" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузия" #. 254 msgid "French Guiana" msgstr "Французская Гвиана" #. 831 msgid "Guernsey" msgstr "Гернси" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренландия" #. 270 msgid "Gambia" msgstr "Гамбия" #. 324 msgid "Guinea" msgstr "Гвинея" #. 312 msgid "Guadeloupe" msgstr "Гваделупа" #. 226 msgid "Equatorial Guinea" msgstr "Экваториальная Гвинея" #. 300 msgid "Greece" msgstr "Греция" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Южная Георгия и Южные Сандвичевы Острова" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинея-Бисау" #. 328 msgid "Guyana" msgstr "Гайана" #. 344 msgid "Hong Kong" msgstr "Гонконг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Острова Херд и Макдональд" #. 340 msgid "Honduras" msgstr "Гондурас" #. 191 msgid "Croatia" msgstr "Хорватия" #. 332 msgid "Haiti" msgstr "Гаити" #. 348 msgid "Hungary" msgstr "Венгрия" #. 360 msgid "Indonesia" msgstr "Индонезия" #. 372 msgid "Ireland" msgstr "Ирландия" #. 376 msgid "Israel" msgstr "Израиль" #. 833 msgid "Isle of Man" msgstr "Остров Мэн" #. 356 msgid "India" msgstr "Индия" #. 086 msgid "British Indian Ocean Territory" msgstr "Британская территория в Индийском океане" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Исламская Республика" #. 352 msgid "Iceland" msgstr "Исландия" #. 380 msgid "Italy" msgstr "Италия" #. 832 msgid "Jersey" msgstr "Джерси" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Иордания" #. 392 msgid "Japan" msgstr "Япония" #. 404 msgid "Kenya" msgstr "Кения" #. 417 msgid "Kyrgyzstan" msgstr "Кыргызстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Коморские Острова" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сент-Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Корея, Народная Демократическая Республика" #. 410 msgid "Korea, Republic of" msgstr "Корея, Республика" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Каймановы острова" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаос, Народно-Демократическая Республика" #. 422 msgid "Lebanon" msgstr "Ливан" #. 662 msgid "Saint Lucia" msgstr "Сент-Люсия" #. 438 msgid "Liechtenstein" msgstr "Лихтенштейн" #. 144 msgid "Sri Lanka" msgstr "Шри-Ланка" #. 430 msgid "Liberia" msgstr "Либерия" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвия" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Ливия" #. 504 msgid "Morocco" msgstr "Марокко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдовия, Республика" #. 499 msgid "Montenegro" msgstr "Черногория" #. 663 msgid "Saint Martin (French part)" msgstr "Сен-Мартин (Французкая часть)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалловы Острова" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македония, бывшая республика Югославии" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мьянма" #. 496 msgid "Mongolia" msgstr "Монголия" #. 446 msgid "Macao" msgstr "Мокао" #. 580 msgid "Northern Mariana Islands" msgstr "Северные Марианские Острова" #. 474 msgid "Martinique" msgstr "Мартиника" #. 478 msgid "Mauritania" msgstr "Мавритания" #. 500 msgid "Montserrat" msgstr "Монтсеррат" #. 470 msgid "Malta" msgstr "Мальта" #. 480 msgid "Mauritius" msgstr "Маврикий" #. 462 msgid "Maldives" msgstr "Мальдивы" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексика" #. 458 msgid "Malaysia" msgstr "Малайзия" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибия" #. 540 msgid "New Caledonia" msgstr "Новая Каледония" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Норфолк Остров" #. 566 msgid "Nigeria" msgstr "Нигерия" #. 558 msgid "Nicaragua" msgstr "Никарагуа" #. 528 msgid "Netherlands" msgstr "Нидерланды" #. 578 msgid "Norway" msgstr "Норвегия" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ниуэ" #. 554 msgid "New Zealand" msgstr "Новая Зеландия" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Французская Полинезия" #. 598 msgid "Papua New Guinea" msgstr "Папуа - Новая Гвинея" #. 608 msgid "Philippines" msgstr "Филиппины" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Польша" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Сен-Пьер и Микелон" #. 612 msgid "Pitcairn" msgstr "Питкэрн" #. 630 msgid "Puerto Rico" msgstr "Пуэрто Рико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестина" #. 620 msgid "Portugal" msgstr "Португалия" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реюньон" #. 642 msgid "Romania" msgstr "Румыния" #. 688 msgid "Serbia" msgstr "Сербия" #. 643 msgid "Russian Federation" msgstr "Российская Федерация" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудовская Аравия" #. 090 msgid "Solomon Islands" msgstr "Соломоновы Острова" #. 690 msgid "Seychelles" msgstr "Сейшельские Острова" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швеция" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Сент-Хелен" #. 705 msgid "Slovenia" msgstr "Словения" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Свальбард и Ян Майен" #. 703 msgid "Slovakia" msgstr "Словакия" #. 694 msgid "Sierra Leone" msgstr "Сьерра-Леоне" #. 674 msgid "San Marino" msgstr "Сан-Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомали" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "Южный Судан" #. 678 msgid "Sao Tome and Principe" msgstr "Сан-Томе и Принсипи" #. 222 msgid "El Salvador" msgstr "Сальвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Синт-Мартен (Нидерланды)" #. 760 msgid "Syrian Arab Republic" msgstr "Сирийская Арабская Республика" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Тёркс и Кайкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Французские Южные территории" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Таиланд" #. 762 msgid "Tajikistan" msgstr "Таджикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Восточный Тимор" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турция" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тайвань, Провинция Китая" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзия, Объедененная Республика" #. 804 msgid "Ukraine" msgstr "Украина" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Внешние Малые Острова Соединённых Штатов" #. 840 msgid "United States" msgstr "США" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватикан" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сент-Винсент и Гренадины" #. 862 msgid "Venezuela" msgstr "Венесуэла" #. 092 msgid "Virgin Islands, British" msgstr "Виргинские Острова, Британия" #. 850 msgid "Virgin Islands, U.S." msgstr "Виргинские Острова, США" #. 704 msgid "Viet Nam" msgstr "Вьетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Уоллис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Йемен" #. 175 msgid "Mayotte" msgstr "Майотта" #. 710 msgid "South Africa" msgstr "Южная Африка" #. 894 msgid "Zambia" msgstr "Замбия" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Неизвестный, для выбора городов добавьте теги is_in" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карте" msgid "Car" msgstr "Авто" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Страна" msgid "Postal" msgstr "Индекс" msgid "Town" msgstr "Город" msgid "District" msgstr "Район" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Номер" msgid "Enter Destination" msgstr "Введите пункт назначения" msgid "Zip Code" msgstr "Индекс" msgid "City" msgstr "Город" msgid "District/Township" msgstr "Район" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Закладка" msgid "Destination" msgstr "Пункт назначения" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Дисплей" msgid "_Route" msgstr "Маршрут" msgid "_Former Destinations" msgstr "Старые маршруты" msgid "_Bookmarks" msgstr "Закладки" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Схема" msgid "_Projection" msgstr "Проекция" msgid "_Vehicle" msgstr "Т/с" msgid "Zoom_Out" msgstr "Уменьшить" msgid "Decrease zoom level" msgstr "Уменьшить масштаб" msgid "Zoom_In" msgstr "Увеличить" msgid "Increase zoom level" msgstr "Увеличить масштаб" msgid "_Recalculate" msgstr "Пересчитать" msgid "Redraw map" msgstr "Обновить карту" msgid "_Info" msgstr "Информация" msgid "Set _destination" msgstr "Установить пункт назначения" msgid "Opens address search dialog" msgstr "Диалог поиска по адресу" msgid "_Stop Navigation" msgstr "Остановить навигацию" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Выход" msgid "Quit the application" msgstr "Выйти из программы" msgid "Show position _cursor" msgstr "Показать/скрыть отметку текущей позиции" msgid "_Lock on Road" msgstr "Заблокировать дорогу" msgid "_Keep orientation to the North" msgstr "Ориентировать карту на север" msgid "Switches map orientation to the north or the vehicle" msgstr "Переключить ориентацию карты на север или по ходу движения" msgid "_Roadbook" msgstr "Дорожный справочник" msgid "Show/hide route description" msgstr "Показать описание маршрута" msgid "_Autozoom" msgstr "Автомасштабирование" msgid "Enable/disable automatic zoom level changing" msgstr "Включить/выключить автоматическое масштабирование" msgid "_Fullscreen" msgstr "Во весь экран" msgid "Data" msgstr "Данные" msgid "N" msgstr "С" msgid "NE" msgstr "СВ" msgid "E" msgstr "В" msgid "SE" msgstr "ЮВ" msgid "S" msgstr "Ю" msgid "SW" msgstr "ЮЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "Нет" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Другой" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Маршрут %4.0fкм %02d:%02d РВП" msgid "Route 0000km 0+00:00 ETA" msgstr "Маршрут 0000км 0+00:00 РВП" msgid "Help" msgstr "Справка" #, c-format msgid "Waypoint %s" msgstr "Точка %s" msgid "Select waypoint to insert the new one before" msgstr "Выберите точку, перед которой вставить новую" msgid "View in Browser" msgstr "Просмотреть в браузере" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улицы" msgid "House numbers" msgstr "Номера домов" msgid "View Attributes" msgstr "Просмотреть Атрибуты" msgid "Set as position (and deactivate vehicle)" msgstr "Задать как текущую позицию и деактивировать ТС" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Показать на карте" msgid "Remove search results from the map" msgstr "Удалить результаты поиска с карты" msgid "Show results on the map" msgstr "Показать результаты поиска на карте" msgid "Cut Bookmark" msgstr "Вырезать закладку" msgid "Copy Bookmark" msgstr "Скопировать закладку" msgid "Rename Bookmark" msgstr "Переименовать закладку" msgid "Paste Bookmark" msgstr "Вставить закладку" msgid "Delete Bookmark" msgstr "Удалить закладку" msgid "Delete waypoint" msgstr "Удалить маршрутную точку" msgid "Bookmarks" msgstr "Закладки" msgid "Bookmarks as waypoints" msgstr "Маршрут по закладкам" msgid "Save waypoints" msgstr "Сохранить маршрутные точки" msgid "Replace with waypoints" msgstr "Заменить маршрутными точками" msgid "Delete Folder" msgstr "Удалить папку" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Добавить папку закладок" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Вставить закладку" #, c-format msgid "Bookmark %s" msgstr "Закладка %s" #, c-format msgid "Download %s" msgstr "Загрузка %s" msgid "Map Download" msgstr "Загрузка карты" msgid "Active" msgstr "Активна" msgid "Download Enabled" msgstr "Загрузка разрешена" msgid "Download completely" msgstr "Загрузить полностью" msgid "Show Satellite Status" msgstr "Показать Состояние Спутников" msgid " Elevation " msgstr " Высота " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Показать Данные NMEA" msgid "car" msgstr "машина" msgid "bike" msgstr "велосипед" msgid "pedestrian" msgstr "пешеход" #, c-format msgid "Current profile: %s" msgstr "Текущий профиль: %s" #, c-format msgid "Change profile to: %s" msgstr "Сменить профиль на: %s" msgid "Set as active" msgstr "Сделать активным" msgid "Show Satellite status" msgstr "Показать состояние Спутников" msgid "Show NMEA data" msgstr "Показать данные NMEA" msgid "Add Bookmark" msgstr "Добавить закладку" msgid "Rename" msgstr "Переименовать" msgid "About Navit" msgstr "О Navit" #. Authors msgid "By" msgstr "Авторы:" #. Contributors msgid "And all the Navit Team" msgstr "И все участники команды Navit" msgid "members and contributors." msgstr "и лица внесшие вклад" msgid "Waypoints" msgstr "Маршрутные точки" msgid "Enter Coordinates" msgstr "Введите координаты" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "Долгота Широта" msgid "Enter coordinates, for example:" msgstr "Введите координаты, например:" msgid "Vehicle" msgstr "Т/с" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Придерживаться дороги" msgid "Northing" msgstr "на север" msgid "Map follows Vehicle" msgstr "Карта следует за машиной" msgid "Plan with Waypoints" msgstr "Множество точек назначения" msgid "Maps" msgstr "Карты" msgid "Layout" msgstr "Схема" msgid "Height Profile" msgstr "Профиль высот" msgid "Route Description" msgstr "Описание маршрута" msgid "Show Locale" msgstr "Проверить локализацию" msgid "Former Destinations" msgstr "Старые маршруты" msgid "- No former destinations available -" msgstr "- Нет старых маршрутов -" msgid "Message" msgstr "Сообщение" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Назад к карте" msgid "Main Menu" msgstr "Главное меню" msgid "House number" msgstr "Номер дома" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "Возвращайтесь на маршрут!" #. warning told msgid "Look out! Camera!" msgstr "Внимание! Камера!" #. warning told msgid "Please decrease your speed" msgstr "Снизьте скорость, пожалуйста" msgid "partial match" msgstr "нестрогое соответствие" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Поиск" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Города" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Ехать сюда" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "Загруженные карты" msgid "Whole Planet" msgstr "Вся планета" msgid "Africa" msgstr "Африка" msgid "Canary Islands" msgstr "Канарские острова" msgid "Libya" msgstr "Ливия" msgid "Asia" msgstr "Азия" msgid "Korea" msgstr "Корея" msgid "Taiwan" msgstr "Тайвань" msgid "UAE+Other" msgstr "ОАЭ и прилегающие" msgid "Oceania" msgstr "Океания" msgid "Tasmania" msgstr "Тасмания" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "Европа" msgid "Western Europe" msgstr "Западная Европа" msgid "Azores" msgstr "Азорские о-ва" msgid "BeNeLux" msgstr "Страны Бенелюкса" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "Берлин" msgid "Brandenburg" msgstr "Бранденбург" msgid "Bremen" msgstr "Бремен" msgid "Hamburg" msgstr "Гамбург" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "Англия" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "Кент" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "Норфолк" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "Уэльс" msgid "Crete" msgstr "Крит" msgid "North America" msgstr "Северная Америка" msgid "Alaska" msgstr "Аляска" msgid "Hawaii" msgstr "Гавайи" msgid "USA" msgstr "США" msgid " (except Alaska and Hawaii)" msgstr " (кроме Аляски и Гавайских о-вов)" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "Мичиган" msgid "Ohio" msgstr "Охайо" msgid "Northeast" msgstr "Северо-восток" msgid "Massachusetts" msgstr "Массачусетс" msgid "Vermont" msgstr "Вермонт" msgid "Pacific" msgstr "Тихоокеанское побережье" msgid "South" msgstr "Юг" msgid "Arkansas" msgstr "Арканзас" msgid "District of Columbia" msgstr "Округ Колумбия" msgid "Florida" msgstr "Флорида" msgid "Louisiana" msgstr "Луизиана" msgid "Maryland" msgstr "Мэриленд" msgid "Mississippi" msgstr "Миссисипи" msgid "Oklahoma" msgstr "Оклахома" msgid "Texas" msgstr "Техас" msgid "Virginia" msgstr "Вирджиния" msgid "West Virginia" msgstr "Западная Вирджиния" msgid "West" msgstr "Запад" msgid "Arizona" msgstr "Аризона" msgid "California" msgstr "Калифорния" msgid "Colorado" msgstr "Колорадо" msgid "Idaho" msgstr "Айдахо" msgid "Montana" msgstr "Монтана" msgid "New Mexico" msgstr "Нью-Мексико" msgid "Nevada" msgstr "Невада" msgid "Oregon" msgstr "Орегон" msgid "Utah" msgstr "Юта" msgid "Washington State" msgstr "штат Вашингтон" msgid "South+Middle America" msgstr "Южная и центральная Америка" msgid "Guyane Francaise" msgstr "Французская Гвиана" msgid "downloading" msgstr "загружаем" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "готово" msgid "Error downloading map!" msgstr "Ошибка загрузки карты!" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Не достаточно места" msgid "Error writing map!" msgstr "Ошибка записи карты!" msgid "Map download aborted!" msgstr "Загрузка карты отменена!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Загрузка карты" msgid "Vehicle Position" msgstr "Местоположение автомобиля" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Да" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit запущен" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit работает" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Добро пожаловать в Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Спасибо за установку Navit!\n" "\n" "Для начала, выберите \"Загрузить карты\" из меню для загрузки карт. " "Примечание: файл карты может быть очень большим (>50MB) - рекомендуется " "использовать подключениеWi-Fi.\n" "\n" "Mapdata: (c) участники OpenStreetMap\n" "\n" "Приятного общения с Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Дополнительная информация" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Приблизить" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Отдалить" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Загрузить карты" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Вкл/выкл POI" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Выйти из Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Копировать / Восстановить" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Удалить эту карту?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Скачиваем:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Ошибка при загрузке карты" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Загрузка карты отменена" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Нет данных GPS. Повторите позже." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Карты, включающие текущее местоположение" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Адресный поиск" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Введите назначение" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Разрешить неполное совпадение" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Ищем..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Адрес не найден" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Получение результатов поиска" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Загрузка результатов поиска" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Ничего не найдено" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Текст не введен" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Устанавливаем точку назначения на:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Выберите действие" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Вставьте SD карту" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Сохраняем..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Восстанавливаем..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Ошибка при создании папки для резервной копии" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Ошибка при резервном копировании" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Резервные копии не найдены" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Ошибка при восстановлении" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Восстановление завершено" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Восстановление завершено\n" "Перезапустите Navit, пожалуйста" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Резервные копии не найдены" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Ошибка при восстановлении" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Выберите резервную копию" #. Android resource: @strings/backup msgid "Backup" msgstr "Резервное копирование" #. Android resource: @strings/restore msgid "Restore" msgstr "Восстановление из копии" msgid "Main menu" msgstr "Главное меню" msgid "" "Show\n" "Map" msgstr "" "Показать\n" "Карту" msgid "Settings" msgstr "Настройки" msgid "Tools" msgstr "Инструменты" msgid "Route" msgstr "Маршрут" msgid "About" msgstr "О программе" msgid "Actions" msgstr "Команды" msgid "" "Former\n" "Destinations" msgstr "" "Старые\n" "маршруты" msgid "Quit" msgstr "Выход" msgid "" "Stop\n" "Navigation" msgstr "" "Прекращение\n" "навигации" msgid "Display" msgstr "Дисплей" msgid "Fullscreen" msgstr "Во весь экран" msgid "Window Mode" msgstr "Режим окна" msgid "Description" msgstr "Описание" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "машина (кратчайший путь)" msgid "car_avoid_tolls" msgstr "машина (избегать платных дорог)" msgid "car_pedantic" msgstr "машина (педантичный)" msgid "horse" msgstr "лошадь" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "Грузовик" #~ msgid "Enter the roundabout soon and leave it at the %s" #~ msgstr "Скоро круговое движение, ожидайте съезд на %s" #~ msgid "In %s, enter the roundabout" #~ msgstr "Круговое движение через %s" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d километр" #~ msgid "Cursor" #~ msgstr "Курсор" #~ msgid " SNR " #~ msgstr " Сигнал/Шум " navit-0.5.0~svn5643+dfsg.1/po/sk.po.in000066400000000000000000001106331221777731700172040ustar00rootroot00000000000000# Translation of Navit to Slovak language # Copyright (C) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Eduard DRUSA , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-11 09:50+0000\n" "Last-Translator: kayle.sk \n" "Language-Team: Slovenčina\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Beží zo zdrojového adresára\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nastavuje sa „%s“ na „%s“\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nultý" msgid "first" msgstr "prvý" msgid "second" msgstr "druhý" msgid "third" msgstr "tretí" msgid "fourth" msgstr "štvrtý" msgid "fifth" msgstr "piaty" msgid "sixth" msgstr "šiesty" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nultý výjazd" msgid "first exit" msgstr "prvý výjazd" msgid "second exit" msgstr "druhý výjazd" msgid "third exit" msgstr "tretí výjazd" msgid "fourth exit" msgstr "štvrtý výjazd" msgid "fifth exit" msgstr "piaty výjazd" msgid "sixth exit" msgstr "šiesty výjazd" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "o %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metrov" #, c-format msgid "in %d meters" msgstr "o %d metrov" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrov" #, c-format msgid "in %d.%d kilometers" msgstr "o %d.%d kilometrov" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometrov" msgstr[1] "jeden kilometer" msgstr[2] "%d kilometre" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "o %d kilometrov" msgstr[1] "o jeden kilometer" msgstr[2] "o %d kilometre" msgid "exit" msgstr "výjazd" msgid "into the ramp" msgstr "na privádzač" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s do ulice %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s do %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s do %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s do %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s na %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "vpravo" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "vľavo" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "mierne " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "prudko " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "naozaj silno " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "neznámy " msgid "When possible, please turn around" msgstr "Ak to bude možné, prosím, otočte sa" msgid "Enter the roundabout soon" msgstr "Vstúpte do kruhového objazdu onedlho" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "potom opustite kruhový objazd na %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Opustite kruhový objazd na %s" #, c-format msgid "Follow the road for the next %s" msgstr "Pokračujte naďalej po ceste %s" msgid "soon" msgstr "onedlho" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Choďte %1$s cestou na %2$s" #, c-format msgid "after %i roads" msgstr "po %i cestách" msgid "now" msgstr "teraz" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "potom nasledujte cestu %1$s do %2$s" msgid "error" msgstr "chyba" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Odbočte %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "potom %1$s odbočte %2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Dorazili ste do svojho cieľa %s" msgid "then you have reached your destination." msgstr "potom dosiahnete svoj cieľ cesty" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozícia" msgid "Command" msgstr "Príkaz" msgid "Length" msgstr "Dĺžka" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Čas" msgid "Destination Length" msgstr "Cieľová vzdialenosť" msgid "Destination Time" msgstr "Čas k cieľu" msgid "Roadbook" msgstr "Plán trasy" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Nastaviť ako pozíciu" msgid "Set as destination" msgstr "Nastaviť ako cieľ" msgid "Add as bookmark" msgstr "Pridať ako záložku" #, c-format msgid "Point 0x%x 0x%x" msgstr "Bod 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Súradnice obrazovky: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Spojené arabské emiráty" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua a Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albánsko" #. 051 msgid "Armenia" msgstr "Arménsko" #. 530 msgid "Netherlands Antilles" msgstr "Holandské Antily" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktída" #. 032 msgid "Argentina" msgstr "Argentína" #. 016 msgid "American Samoa" msgstr "Americká Samoa" #. 040 msgid "Austria" msgstr "Rakúsko" #. 036 msgid "Australia" msgstr "Austrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandy" #. 031 msgid "Azerbaijan" msgstr "Azerbajdžan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna a Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladéž" #. 056 msgid "Belgium" msgstr "Belgicko" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulharsko" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Svátý Bartolomej" #. 060 msgid "Bermuda" msgstr "Bermudy" #. 096 msgid "Brunei Darussalam" msgstr "Brunejský Darussalam" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazília" #. 044 msgid "Bahamas" msgstr "Bahamy" #. 064 msgid "Bhutan" msgstr "Bután" #. 074 msgid "Bouvet Island" msgstr "Bouvetov ostrov" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorusko" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosové (Keeling) ostrovy" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Konžská demokratická republika" #. 140 msgid "Central African Republic" msgstr "Stredoafrická republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švajčiarsko" #. 384 msgid "Cote d'Ivoire" msgstr "Pobrežie slonoviny" #. 184 msgid "Cook Islands" msgstr "Cookove ostrovy" #. 152 msgid "Chile" msgstr "Čile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Čína" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Vianočné ostrovy" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Česká republika" #. 276 msgid "Germany" msgstr "Nemecko" #. 262 msgid "Djibouti" msgstr "Džibutsko" #. 208 msgid "Denmark" msgstr "Dánsko" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikánska republika" #. 012 msgid "Algeria" msgstr "Alžírsko" #. 218 msgid "Ecuador" msgstr "Ekvádor" #. 233 msgid "Estonia" msgstr "Estónsko" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Západná Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Španielsko" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Fínsko" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkandské ostrovy (Malvíny)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronézske federatívne štáty" #. 234 msgid "Faroe Islands" msgstr "Faerské ostrovy" #. 250 msgid "France" msgstr "Francúzsko" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Spojené kráľovstvo" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzínsko" #. 254 msgid "French Guiana" msgstr "Francúzska Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltár" #. 304 msgid "Greenland" msgstr "Grónsko" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Rovníková Guinea" #. 300 msgid "Greece" msgstr "Grécko" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Južná Georgia a Južné Sandwitchové ostrovy" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardov a McDonaldove ostrovy" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Chorvátsko" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Maďarsko" #. 360 msgid "Indonesia" msgstr "Indonézia" #. 372 msgid "Ireland" msgstr "Írsko" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Ostrov Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Britské teritórium Indického oceánu" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iránska islamská republika" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Taliansko" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordánsko" #. 392 msgid "Japan" msgstr "Japonsko" #. 404 msgid "Kenya" msgstr "Keňa" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistán" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komory" #. 659 msgid "Saint Kitts and Nevis" msgstr "Svätý Krištof a Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Kórejská ľudovodemokratická republika" #. 410 msgid "Korea, Republic of" msgstr "Kórejská republika" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanské ostrovy" #. 398 msgid "Kazakhstan" msgstr "Kazachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoská ľudovodemokratická republika" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Svätá Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenštajnsko" #. 144 msgid "Sri Lanka" msgstr "Srí Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Luxembursko" #. 428 msgid "Latvia" msgstr "Lotyšsko" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Líbijská Arabská Džahamíra" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavská republika" #. 499 msgid "Montenegro" msgstr "Čierna hora" #. 663 msgid "Saint Martin (French part)" msgstr "Svátý martin (Francúzska časť)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Maršalové ostrovy" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedónsko" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mjanmarsko" #. 496 msgid "Mongolia" msgstr "Mongolsko" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Severné Mariány" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mauretánia" #. 500 msgid "Montserrat" msgstr "Monserat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricius" #. 462 msgid "Maldives" msgstr "Maledivy" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malajzia" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nová Kaledónia" #. 562 msgid "Niger" msgstr "Nigér" #. 574 msgid "Norfolk Island" msgstr "Ostrov Norfolk" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Holandsko" #. 578 msgid "Norway" msgstr "Nórsko" #. 524 msgid "Nepal" msgstr "Nepál" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nový Zéland" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francúzska Polynézia" #. 598 msgid "Papua New Guinea" msgstr "Papua Nová Guinea" #. 608 msgid "Philippines" msgstr "Filipíny" #. 586 msgid "Pakistan" msgstr "Pakistán" #. 616 msgid "Poland" msgstr "Poľsko" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Svätý Piere a Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Portoriko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestínske územie, okupované" #. 620 msgid "Portugal" msgstr "Portugalsko" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Rumunsko" #. 688 msgid "Serbia" msgstr "Srbsko" #. 643 msgid "Russian Federation" msgstr "Ruská federácia" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudská Arábia" #. 090 msgid "Solomon Islands" msgstr "Šalamúnove Ostrovy" #. 690 msgid "Seychelles" msgstr "Seychelské ostrovy" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Švédsko" #. 702 msgid "Singapore" msgstr "Singapúr" #. 654 msgid "Saint Helena" msgstr "Svätá Helena" #. 705 msgid "Slovenia" msgstr "Slovinsko" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Špicbergy a Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovenská republika" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Maríno" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somálsko" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Svatý Tomáš" #. 222 msgid "El Salvador" msgstr "Salvádor" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sýrska arabská republika" #. 748 msgid "Swaziland" msgstr "Svazijsko" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkské a kaikoské ostrovy" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francúzske južné a antarktické územia" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thajsko" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkménsko" #. 788 msgid "Tunisia" msgstr "Tunisko" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turecko" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad a Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, provincia Číny" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzánijská zjednotená republika" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Spojené štáty drobných odľahlých ostrovov" #. 840 msgid "United States" msgstr "Spojené štáty americké" #. 858 msgid "Uruguay" msgstr "Uruguaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Svätá stolica (Vatikánsky mestský štát)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Svätý Vincent a Grenadíny" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Panenské ostrovy, Britské" #. 850 msgid "Virgin Islands, U.S." msgstr "Panenské ostrovy, Americké" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis a Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Juhoafrická republika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Neznáme, pridajte is_in tag v týchto mestách." msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Bod na mape" msgid "Car" msgstr "Vozidlo" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Krajina" msgid "Postal" msgstr "PSČ" msgid "Town" msgstr "Mesto" msgid "District" msgstr "Kraj" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Číslo" msgid "Enter Destination" msgstr "Uveďte cieľ" msgid "Zip Code" msgstr "PSČ" msgid "City" msgstr "Mesto" msgid "District/Township" msgstr "Kraj/Okres" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Záložka" msgid "Destination" msgstr "Cieľ" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Displej" msgid "_Route" msgstr "Trasa" msgid "_Former Destinations" msgstr "Predošlé cieľe" msgid "_Bookmarks" msgstr "Záložky" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Značenie" msgid "_Projection" msgstr "Projekcia" msgid "_Vehicle" msgstr "Vozidlo" msgid "Zoom_Out" msgstr "Oddialiť" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Priblížiť" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Prepočítať" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informácie" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Zastaviť navigáciu" msgid "Test" msgstr "Otestovať" msgid "_Quit" msgstr "_Koniec" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Uzamknúť na cesty" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Plán trasy" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Automatické zväčšenie" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Celá obrazovka" msgid "Data" msgstr "Dáta" msgid "N" msgstr "S" msgid "NE" msgstr "SV" msgid "E" msgstr "V" msgid "SE" msgstr "JV" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Nie" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Cesta %4.0fkm čas %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Cesta 0000km čas 0+00:00" msgid "Help" msgstr "Pomoc" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Zobraziť v prehliadači" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "Čísla domov" msgid "View Attributes" msgstr "Zobraziť atribúty" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Zobraziť na mape" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Vystrihnúť záložku" msgid "Copy Bookmark" msgstr "Kopírovať záložku" msgid "Rename Bookmark" msgstr "Premenovať záložku" msgid "Paste Bookmark" msgstr "Vložiť záložku" msgid "Delete Bookmark" msgstr "Odstrániť záložku" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Záložky" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Pridať priečinok pre záložky" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Vložiť záložku" #, c-format msgid "Bookmark %s" msgstr "Záložka %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Zobraziť stav satelitov" msgid " Elevation " msgstr " Prevýšenie " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Zobraziť NMEA data" msgid "car" msgstr "auto" msgid "bike" msgstr "bicykel" msgid "pedestrian" msgstr "chodec" #, c-format msgid "Current profile: %s" msgstr "Aktuálny profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Zmeniť profil na: %s" msgid "Set as active" msgstr "Nastaviť ako aktívny" msgid "Show Satellite status" msgstr "Zobraziť stav satelitov" msgid "Show NMEA data" msgstr "Zobraziť NMEA data" msgid "Add Bookmark" msgstr "Pridať záložku" msgid "Rename" msgstr "Premenovať" msgid "About Navit" msgstr "O Navite" #. Authors msgid "By" msgstr "Od" #. Contributors msgid "And all the Navit Team" msgstr "A všetci členovia týmu Navitu" msgid "members and contributors." msgstr "členovia a prispievatelia" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vozidlo" msgid "Rules" msgstr "Pravidlá" msgid "Lock on road" msgstr "Prichytiť k ceste" msgid "Northing" msgstr "Sever vždy hore" msgid "Map follows Vehicle" msgstr "Mapa sleduje vozidlo" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapy" msgid "Layout" msgstr "Značenie" msgid "Height Profile" msgstr "Výškovy Profil" msgid "Route Description" msgstr "Popis trasy" msgid "Show Locale" msgstr "Zobraziť jazyk" msgid "Former Destinations" msgstr "Predošlé cieľe" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Správa" msgid "Back" msgstr "Späť" msgid "Back to map" msgstr "Späť na mapu" msgid "Main Menu" msgstr "Hlavné menu" msgid "House number" msgstr "Číslo domu" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Pozícia vozidla" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Hlavné menu" msgid "" "Show\n" "Map" msgstr "" "Zobraziť\n" "mapu" msgid "Settings" msgstr "Nastavenia" msgid "Tools" msgstr "Nástroje" msgid "Route" msgstr "Trasa" msgid "About" msgstr "O programe" msgid "Actions" msgstr "Akcie" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Koniec" msgid "" "Stop\n" "Navigation" msgstr "" "Zastaviť\n" "navigáciu" msgid "Display" msgstr "Displej" msgid "Fullscreen" msgstr "Celá obrazovka" msgid "Window Mode" msgstr "V okne" msgid "Description" msgstr "Popis" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "kôň" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "O %s vstúpte do kruhového objazdu" #~ msgid "Cursor" #~ msgstr "Kurzor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometra" navit-0.5.0~svn5643+dfsg.1/po/sl.po.in000066400000000000000000001063751221777731700172150ustar00rootroot00000000000000# Slovenian translation for navit # Copyright (c) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Štefan Baebler , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-07-02 21:39+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Zagon iz mape z izvorno kodo\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nastavljam '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "ničt" msgid "first" msgstr "prv" msgid "second" msgstr "drug" msgid "third" msgstr "tretj" msgid "fourth" msgstr "četrt" msgid "fifth" msgstr "pet" msgid "sixth" msgstr "šest" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "Čez %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metrov" #, c-format msgid "in %d meters" msgstr "Čez %d metrov" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "Čez %d.%d kilometov" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometrov" msgstr[1] "%d kilometer" msgstr[2] "%d kilometra" msgstr[3] "%d kilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "Čez %d kilometrov" msgstr[1] "Čez %d kilometer" msgstr[2] "Čez %d kilometra" msgstr[3] "Čez %d kilometre" msgid "exit" msgstr "odcep" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sna %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "desno" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "levo" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "rahlo " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "ostro " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "neznano " msgid "When possible, please turn around" msgstr "Obrnite čim bo to mogoče" msgid "Enter the roundabout soon" msgstr "Kmalu zapeljite v krožišče" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Ostanite na tej cesti naslednjih %s" msgid "soon" msgstr "kmalu" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Zavijte na %2$s v %1$so cesto" #, c-format msgid "after %i roads" msgstr "čez %i cest" msgid "now" msgstr "sedaj" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "nato zavijte na %2$s v %1$so cesto" msgid "error" msgstr "napaka" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s zavijte %1$s%2$s %4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "nato zavijte %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "%s ste na cilju" msgid "then you have reached your destination." msgstr "in ste na cilju." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Položaj" msgid "Command" msgstr "Navodilo" msgid "Length" msgstr "Razdalja" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Čas" msgid "Destination Length" msgstr "Razdalja do cilja" msgid "Destination Time" msgstr "Čas do cilja" msgid "Roadbook" msgstr "Načrt poti" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Nastavi kot položaj" msgid "Set as destination" msgstr "Nastavi kot cilj" msgid "Add as bookmark" msgstr "Dodaj zaznamek" #, c-format msgid "Point 0x%x 0x%x" msgstr "Točka 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinate zaslona: %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Združeni arabski emirati" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigva in Barbuda" #. 660 msgid "Anguilla" msgstr "Angvila" #. 008 msgid "Albania" msgstr "Albanija" #. 051 msgid "Armenia" msgstr "Armenija" #. 530 msgid "Netherlands Antilles" msgstr "Nizozemski Antili" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Ameriška Samoa" #. 040 msgid "Austria" msgstr "Avstrija" #. 036 msgid "Australia" msgstr "Avstralija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbajdžan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna in Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeš" #. 056 msgid "Belgium" msgstr "Belgija" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bolgarija" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudi" #. 096 msgid "Brunei Darussalam" msgstr "Brunej" #. 068 msgid "Bolivia" msgstr "Bolivija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilija" #. 044 msgid "Bahamas" msgstr "Bahami" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Bouvetov otok" #. 072 msgid "Botswana" msgstr "Bocvana" #. 112 msgid "Belarus" msgstr "Belorusija" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosovi otoki" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratična Republika" #. 140 msgid "Central African Republic" msgstr "Srednjeafriška Republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švica" #. 384 msgid "Cote d'Ivoire" msgstr "Slonokoščena obala" #. 184 msgid "Cook Islands" msgstr "Cookovi otoki" #. 152 msgid "Chile" msgstr "Čile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kitajska" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Zelenortski otoki" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Božični otok" #. 196 msgid "Cyprus" msgstr "Ciper" #. 203 msgid "Czech Republic" msgstr "Češka" #. 276 msgid "Germany" msgstr "Nemčija" #. 262 msgid "Djibouti" msgstr "Džibuti" #. 208 msgid "Denmark" msgstr "Danska" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikanska republika" #. 012 msgid "Algeria" msgstr "Alžirija" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estonija" #. 818 msgid "Egypt" msgstr "Egipt" #. 732 msgid "Western Sahara" msgstr "Zahodna Sahara" #. 232 msgid "Eritrea" msgstr "Eritreja" #. 724 msgid "Spain" msgstr "Španija" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Finska" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandski otoki" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezija" #. 234 msgid "Faroe Islands" msgstr "Ferski otoki" #. 250 msgid "France" msgstr "Francija" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Združeno kraljestvo" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "Francoska Gvajana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grenlandija" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvineja" #. 312 msgid "Guadeloupe" msgstr "Gvadelup" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorialna Gvineja" #. 300 msgid "Greece" msgstr "Grčija" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Južna Georgia in Južni Sandwichevi otoki" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gvineja-Bissau" #. 328 msgid "Guyana" msgstr "Gvajana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Otoki Heard in McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Hrvaška" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Madžarska" #. 360 msgid "Indonesia" msgstr "Indonezija" #. 372 msgid "Ireland" msgstr "Irska" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Otok Man" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Britansko ozemlje v Indijskem oceanu" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Islandija" #. 380 msgid "Italy" msgstr "Italija" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordanija" #. 392 msgid "Japan" msgstr "Japonska" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizistan" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komori" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts in Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Severna Koreja" #. 410 msgid "Korea, Republic of" msgstr "Južna Koreja" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanski otoki" #. 398 msgid "Kazakhstan" msgstr "Kazahstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoška ljudska demokratična republika" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Šrilanka" #. 430 msgid "Liberia" msgstr "Liberija" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libijska arabska džamahirija" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavija" #. 499 msgid "Montenegro" msgstr "Črna Gora" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Francoski del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallovi otoki" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonija" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mjanmar" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Severni Marianski otoki" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mavretanija" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mavricij" #. 462 msgid "Maldives" msgstr "Maldivi" #. 454 msgid "Malawi" msgstr "Malavi" #. 484 msgid "Mexico" msgstr "Mehika" #. 458 msgid "Malaysia" msgstr "Malezija" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibija" #. 540 msgid "New Caledonia" msgstr "Nova Kaledonija" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolški otok" #. 566 msgid "Nigeria" msgstr "Nigerija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nizozemska" #. 578 msgid "Norway" msgstr "Norveška" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelandija" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francoska Polinezija" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Gvineja" #. 608 msgid "Philippines" msgstr "Filipini" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poljska" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre in Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Portoriko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinsko ozemlje, okupirano" #. 620 msgid "Portugal" msgstr "Portugalska" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romunija" #. 688 msgid "Serbia" msgstr "Srbija" #. 643 msgid "Russian Federation" msgstr "Ruska federacija" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudska Arabija" #. 090 msgid "Solomon Islands" msgstr "Solomonovi otoki" #. 690 msgid "Seychelles" msgstr "Sejšeli" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Švedska" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Sveta Helena" #. 705 msgid "Slovenia" msgstr "Slovenija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard in Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovaška" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalija" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome in Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirska arabska republika" #. 748 msgid "Swaziland" msgstr "Svazi" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks in Caicoški otoki" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francoska južna ozemlja" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajska" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Vzhodni Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunizija" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turčija" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad in Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tajvan, provinca Kitajske" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanija" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "manjši otoki Združenih držav Amerike" #. 840 msgid "United States" msgstr "Združene države Amerike" #. 858 msgid "Uruguay" msgstr "Urugvaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Sveti sedež (Vatikanska mestna država)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent in Grenadini" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britanski Deviški otoki" #. 850 msgid "Virgin Islands, U.S." msgstr "Ameriški Deviški otoki" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis in Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Južnoafriška Republika" #. 894 msgid "Zambia" msgstr "Zambija" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Avto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Država" msgid "Postal" msgstr "Pošta" msgid "Town" msgstr "Mesto" msgid "District" msgstr "Regija" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Številka" msgid "Enter Destination" msgstr "Vpišite cilj" msgid "Zip Code" msgstr "Poštna številka" msgid "City" msgstr "Mesto" msgid "District/Township" msgstr "Regija" msgid "Map" msgstr "Zemljevid" msgid "Bookmark" msgstr "Zaznamek" msgid "Destination" msgstr "Cilj" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Prikaz" msgid "_Route" msgstr "Načrt poti" msgid "_Former Destinations" msgstr "Prejšnji cilji" msgid "_Bookmarks" msgstr "Zaznamki" msgid "_Map" msgstr "Zemljevid" msgid "_Layout" msgstr "Razporeditev" msgid "_Projection" msgstr "Projekcija" msgid "_Vehicle" msgstr "Vozilo" msgid "Zoom_Out" msgstr "Pomanjšava" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Povečava" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Preračunaj" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Podrobnosti" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Ustavi navigacijo" msgid "Test" msgstr "Preizkus" msgid "_Quit" msgstr "_Izhod" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Ostani na cesti" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Načrt poti" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Celozaslonski način" msgid "Data" msgstr "Podatki" msgid "N" msgstr "S" msgid "NE" msgstr "SV" msgid "E" msgstr "V" msgid "SE" msgstr "JV" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Načrt poti %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Načrt poti 0000km 0+00:00 ETA" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Prikaz v brskalniku" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ceste" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "Prikaz lastnosti" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "Prikaz na zemljevidu" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Zaznamki" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Zaznamuj %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vozilo" msgid "Rules" msgstr "Pravila" msgid "Lock on road" msgstr "Prikleni na cesto" msgid "Northing" msgstr "Sever zgoraj" msgid "Map follows Vehicle" msgstr "Zemljevid sledi vozilu" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Zemljevidi" msgid "Layout" msgstr "Razporeditev" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Prejšnji cilji" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "Nazaj na zemljevid" msgid "Main Menu" msgstr "Glavni meni" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Položaj vozila" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Glavni meni" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "Nastavitve" msgid "Tools" msgstr "Orodja" msgid "Route" msgstr "Načrt poti" msgid "About" msgstr "" msgid "Actions" msgstr "Dejanja" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Izhod" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "Prikaz" msgid "Fullscreen" msgstr "Celozaslonski način" msgid "Window Mode" msgstr "Okenski način" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Čez %s zapeljite v krožišče" #~ msgid "Cursor" #~ msgstr "Kurzor" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometrov" navit-0.5.0~svn5643+dfsg.1/po/sr.po.in000066400000000000000000001177071221777731700172240ustar00rootroot00000000000000# Serbian translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # momcilo, 2010. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-06-08 21:56+0000\n" "Last-Translator: momcilo \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Покренут из изворног директоријума\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "постављам вредност '%s' на '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулти" msgid "first" msgstr "прво" msgid "second" msgstr "друго" msgid "third" msgstr "треће" msgid "fourth" msgstr "четврто" msgid "fifth" msgstr "пето" msgid "sixth" msgstr "шестп" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нулти излаз" msgid "first exit" msgstr "први излаз" msgid "second exit" msgstr "други излаз" msgid "third exit" msgstr "трећи излаз" msgid "fourth exit" msgstr "четврти излаз" msgid "fifth exit" msgstr "пети излаз" msgid "sixth exit" msgstr "шести излаз" #, c-format msgid "%d m" msgstr "%d м" #, c-format msgid "in %d m" msgstr "за %d м" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d метара" #, c-format msgid "in %d meters" msgstr "за %d метара" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d километара" #, c-format msgid "in %d.%d kilometers" msgstr "за %d.%d километара" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d километара" msgstr[1] "%d километара" msgstr[2] "%d километара" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "за %d километара" msgstr[1] "за %d километара" msgstr[2] "за %d километара" msgid "exit" msgstr "излаз" msgid "into the ramp" msgstr "на нагибу" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sу улици %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sу %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sу %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sу %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sна %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "десно" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "лево" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "лако " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "јако " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "веома јако " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "непознат " msgid "When possible, please turn around" msgstr "По могућству, променити смер" msgid "Enter the roundabout soon" msgstr "Ускоро прелазак на обилазницу" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "потом напутстите обилазницу на %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Напуштање обилазнице за %s" #, c-format msgid "Follow the road for the next %s" msgstr "Прати пут до следећег %s" msgid "soon" msgstr "ускоро" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Прати %1$s пут до %2$s" #, c-format msgid "after %i roads" msgstr "после %i путева" msgid "now" msgstr "сад" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "потом прати пут %1$s до %2$s" msgid "error" msgstr "грешка" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Скрени %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "потом скрени %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Стигли сте на одредиште %s" msgid "then you have reached your destination." msgstr "потом сте стигли на Ваше одредиште." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Положај" msgid "Command" msgstr "Наредба" msgid "Length" msgstr "Дужина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Време" msgid "Destination Length" msgstr "Одредишна дужина" msgid "Destination Time" msgstr "Одредишно време" msgid "Roadbook" msgstr "План пута" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Постави као позицију" msgid "Set as destination" msgstr "Постави као одредиште" msgid "Add as bookmark" msgstr "Додај као пречицу" #, c-format msgid "Point 0x%x 0x%x" msgstr "Тачка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Екранске координате: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Уједињени Арапски Емирати" #. 004 msgid "Afghanistan" msgstr "Авганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигва и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангвила" #. 008 msgid "Albania" msgstr "Албанија" #. 051 msgid "Armenia" msgstr "Јерменија" #. 530 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктик" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Америчка Самоа" #. 040 msgid "Austria" msgstr "Аустрија" #. 036 msgid "Australia" msgstr "Аустралија" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Оландска острва" #. 031 msgid "Azerbaijan" msgstr "Азербејџан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Белгија" #. 854 msgid "Burkina Faso" msgstr "Буркина Фасо" #. 100 msgid "Bulgaria" msgstr "Бугарска" #. 048 msgid "Bahrain" msgstr "Бахреин" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Свети Бартоломеј" #. 060 msgid "Bermuda" msgstr "Бермуди" #. 096 msgid "Brunei Darussalam" msgstr "Брунеј" #. 068 msgid "Bolivia" msgstr "Боливија" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразил" #. 044 msgid "Bahamas" msgstr "Бахами" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Бувеова острва" #. 072 msgid "Botswana" msgstr "Боцвана" #. 112 msgid "Belarus" msgstr "Белорусија" #. 084 msgid "Belize" msgstr "Белизе" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosova ostrva" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Демократска република Конго" #. 140 msgid "Central African Republic" msgstr "Централноафричка Република" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швајцарска" #. 384 msgid "Cote d'Ivoire" msgstr "Обала Слоноваче" #. 184 msgid "Cook Islands" msgstr "Кукова острва" #. 152 msgid "Chile" msgstr "Чиле" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Кина" #. 170 msgid "Colombia" msgstr "Колумбија" #. 188 msgid "Costa Rica" msgstr "Костарика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Зеленортска острва" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Божићна острва" #. 196 msgid "Cyprus" msgstr "Кипар" #. 203 msgid "Czech Republic" msgstr "Чешка" #. 276 msgid "Germany" msgstr "Немачка" #. 262 msgid "Djibouti" msgstr "Џибути" #. 208 msgid "Denmark" msgstr "Данска" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканска Република" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естонија" #. 818 msgid "Egypt" msgstr "Египат" #. 732 msgid "Western Sahara" msgstr "Западна Сахара" #. 232 msgid "Eritrea" msgstr "Еритреја" #. 724 msgid "Spain" msgstr "Шпанија" #. 231 msgid "Ethiopia" msgstr "Етиопија" #. 246 msgid "Finland" msgstr "Финска" #. 242 msgid "Fiji" msgstr "Фиџи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фокландска острва (Малвини)" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронезија, Федеративне државе" #. 234 msgid "Faroe Islands" msgstr "Фарска острва" #. 250 msgid "France" msgstr "Француска" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Уједињено краљевство" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузија" #. 254 msgid "French Guiana" msgstr "Француска Гвајана" #. 831 msgid "Guernsey" msgstr "Генрзи" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренланд" #. 270 msgid "Gambia" msgstr "Гамбија" #. 324 msgid "Guinea" msgstr "Гвинеја" #. 312 msgid "Guadeloupe" msgstr "Гваделуп" #. 226 msgid "Equatorial Guinea" msgstr "Екваторијална Гвинеја" #. 300 msgid "Greece" msgstr "Грчка" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Јужна Џорџија и Јужна Сендвичка острва" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинеја Бисао" #. 328 msgid "Guyana" msgstr "Гвајана" #. 344 msgid "Hong Kong" msgstr "Хонг Конг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Херд острво и Мекдоналд острва" #. 340 msgid "Honduras" msgstr "Хондурас" #. 191 msgid "Croatia" msgstr "Хрватска" #. 332 msgid "Haiti" msgstr "Хаити" #. 348 msgid "Hungary" msgstr "Мађарска" #. 360 msgid "Indonesia" msgstr "Индонезија" #. 372 msgid "Ireland" msgstr "Ирска" #. 376 msgid "Israel" msgstr "Израел" #. 833 msgid "Isle of Man" msgstr "Острво Ман" #. 356 msgid "India" msgstr "Индија" #. 086 msgid "British Indian Ocean Territory" msgstr "Британска Индијска Океанска Територија" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Исламска Република" #. 352 msgid "Iceland" msgstr "Исланд" #. 380 msgid "Italy" msgstr "Италија" #. 832 msgid "Jersey" msgstr "Џерси" #. 388 msgid "Jamaica" msgstr "Јамајка" #. 400 msgid "Jordan" msgstr "Јордан" #. 392 msgid "Japan" msgstr "Јапан" #. 404 msgid "Kenya" msgstr "Кенија" #. 417 msgid "Kyrgyzstan" msgstr "Киргистан" #. 116 msgid "Cambodia" msgstr "Камбоџа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Комори" #. 659 msgid "Saint Kitts and Nevis" msgstr "Свети Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Кореја, Демократска Народна Република" #. 410 msgid "Korea, Republic of" msgstr "Република Кореја" #. 414 msgid "Kuwait" msgstr "Кувајт" #. 136 msgid "Cayman Islands" msgstr "Кајманска острва" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаос" #. 422 msgid "Lebanon" msgstr "Либан" #. 662 msgid "Saint Lucia" msgstr "Света Луција" #. 438 msgid "Liechtenstein" msgstr "Лихтенштајн" #. 144 msgid "Sri Lanka" msgstr "Шри Ланка" #. 430 msgid "Liberia" msgstr "Либерија" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литванија" #. 442 msgid "Luxembourg" msgstr "Луксембург" #. 428 msgid "Latvia" msgstr "Летонија" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Либија Арапска Џамахирија" #. 504 msgid "Morocco" msgstr "Мароко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдавија, Република" #. 499 msgid "Montenegro" msgstr "Црна Гора" #. 663 msgid "Saint Martin (French part)" msgstr "Свети Мартин (француски део)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалска острва" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонија" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мијанмар" #. 496 msgid "Mongolia" msgstr "Монголија" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Северна Маријанска острва" #. 474 msgid "Martinique" msgstr "Мартиник" #. 478 msgid "Mauritania" msgstr "Мауританија" #. 500 msgid "Montserrat" msgstr "Монсерат" #. 470 msgid "Malta" msgstr "Малта" #. 480 msgid "Mauritius" msgstr "Маурицијус" #. 462 msgid "Maldives" msgstr "Малдиви" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексико" #. 458 msgid "Malaysia" msgstr "Малезија" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибија" #. 540 msgid "New Caledonia" msgstr "Нова Каледонија" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Острво Норфок" #. 566 msgid "Nigeria" msgstr "Нигерија" #. 558 msgid "Nicaragua" msgstr "Никарагва" #. 528 msgid "Netherlands" msgstr "Холандија" #. 578 msgid "Norway" msgstr "Норвешка" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Нијуе" #. 554 msgid "New Zealand" msgstr "Нови Зеланд" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Француска Полинезија" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинеја" #. 608 msgid "Philippines" msgstr "Филипини" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Пољска" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Свети Пјер и Микелон" #. 612 msgid "Pitcairn" msgstr "Острва Питкерн" #. 630 msgid "Puerto Rico" msgstr "Порторико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестинска Територија, Окупирана" #. 620 msgid "Portugal" msgstr "Португал" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвај" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реинион" #. 642 msgid "Romania" msgstr "Румунија" #. 688 msgid "Serbia" msgstr "Србија" #. 643 msgid "Russian Federation" msgstr "Руска федерација" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудијска Арабија" #. 090 msgid "Solomon Islands" msgstr "Соломонска острва" #. 690 msgid "Seychelles" msgstr "Сејшели" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Шведска" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Света Јелена" #. 705 msgid "Slovenia" msgstr "Словенија" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Свалбард и Јан Мајен" #. 703 msgid "Slovakia" msgstr "Словачка" #. 694 msgid "Sierra Leone" msgstr "Сијера Леоне" #. 674 msgid "San Marino" msgstr "Сан Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалија" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принципе" #. 222 msgid "El Salvador" msgstr "Салвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сиријска арапска република" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Туркс и Кајкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Француске jужне tериторије" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Тајланд" #. 762 msgid "Tajikistan" msgstr "Таџикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Источни Тимор" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турска" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тајван, Кинеска Провинција" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзанија, Уједињена република" #. 804 msgid "Ukraine" msgstr "Украјна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Спољна ивична острва САД" #. 840 msgid "United States" msgstr "Sjedinjene Američke Države" #. 858 msgid "Uruguay" msgstr "Уругвај" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватикан" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Свети Винсент и Гренадини" #. 862 msgid "Venezuela" msgstr "Венецуела" #. 092 msgid "Virgin Islands, British" msgstr "Девичанска острва, Британска" #. 850 msgid "Virgin Islands, U.S." msgstr "Девичанска острва, САД" #. 704 msgid "Viet Nam" msgstr "Вијетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Валис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Јемен" #. 175 msgid "Mayotte" msgstr "Мајот" #. 710 msgid "South Africa" msgstr "Јужноафричка република" #. 894 msgid "Zambia" msgstr "Замбија" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Непознато, додај is_in таг у ове градове" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Тачка на мапи" msgid "Car" msgstr "Кола" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Држава" msgid "Postal" msgstr "Поштански" msgid "Town" msgstr "Град" msgid "District" msgstr "Општина" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Број" msgid "Enter Destination" msgstr "Унесите одредиште" msgid "Zip Code" msgstr "Поштански број" msgid "City" msgstr "Град" msgid "District/Township" msgstr "Општрина/Град" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Обележивач" msgid "Destination" msgstr "Одредиште" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Приказ" msgid "_Route" msgstr "рута" msgid "_Former Destinations" msgstr "Претходна одредишта" msgid "_Bookmarks" msgstr "Обележивачи" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Распоред" msgid "_Projection" msgstr "Пројекција" msgid "_Vehicle" msgstr "Возило" msgid "Zoom_Out" msgstr "Умањи" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Увећај" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Прерачунај" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Подаци" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Заустави навигацију" msgid "Test" msgstr "Проба" msgid "_Quit" msgstr "_Изађи" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Прати пут" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "План пута" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Аутоматски увећавање" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Цео екран" msgid "Data" msgstr "Подаци" msgid "N" msgstr "С" msgid "NE" msgstr "СИ" msgid "E" msgstr "И" msgid "SE" msgstr "ЈИ" msgid "S" msgstr "Ј" msgid "SW" msgstr "ЈЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "Не" msgid "2D" msgstr "2D" msgid "3D" msgstr "3Д" msgid "OT" msgstr "ОТ" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Рута %4.0fкм %02d:%02d ПВД" msgid "Route 0000km 0+00:00 ETA" msgstr "Рута 0000км 0+00:00 ПВД" msgid "Help" msgstr "Помоћ" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Погледај у претраживачу" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улице" msgid "House numbers" msgstr "Кућни бројеви" msgid "View Attributes" msgstr "Преглед особина" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Тачке интересовања" msgid "View on map" msgstr "Погледај на мапи" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Исеци обележивач" msgid "Copy Bookmark" msgstr "Умножи обележивач" msgid "Rename Bookmark" msgstr "Преименуј обележивач" msgid "Paste Bookmark" msgstr "Прилепи обележивач" msgid "Delete Bookmark" msgstr "Обриши обележивач" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Обележивачи" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Додај фолдер са обележивачима" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Прилепи обележивач" #, c-format msgid "Bookmark %s" msgstr "Обележи %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Прикажи стање сателита" msgid " Elevation " msgstr " Висина " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Приказ NMEA података" msgid "car" msgstr "кола" msgid "bike" msgstr "бицикл" msgid "pedestrian" msgstr "пешак" #, c-format msgid "Current profile: %s" msgstr "Тренутни профил: %s" #, c-format msgid "Change profile to: %s" msgstr "Примени профил: %s" msgid "Set as active" msgstr "Примени као активан" msgid "Show Satellite status" msgstr "Прикажи стање сателита" msgid "Show NMEA data" msgstr "Прикажи NMEA податке" msgid "Add Bookmark" msgstr "Додавање обележивача" msgid "Rename" msgstr "Преименуј" msgid "About Navit" msgstr "О програму Навит" #. Authors msgid "By" msgstr "Од" #. Contributors msgid "And all the Navit Team" msgstr "И цео Navit тим" msgid "members and contributors." msgstr "чланови и доприносиоци" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Возило" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Прати пут" msgid "Northing" msgstr "Ништа" msgid "Map follows Vehicle" msgstr "Мапа прати возило" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Мапе" msgid "Layout" msgstr "Распоред" msgid "Height Profile" msgstr "Висински профил" msgid "Route Description" msgstr "Опис руте" msgid "Show Locale" msgstr "Прикажи име локализације" msgid "Former Destinations" msgstr "Претходна одредишта" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Порука" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Назад на мапу" msgid "Main Menu" msgstr "Главни мени" msgid "House number" msgstr "Кућни број" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Позиција возила" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Главни мени" msgid "" "Show\n" "Map" msgstr "Прикажи мапу" msgid "Settings" msgstr "Подешавања" msgid "Tools" msgstr "Алати" msgid "Route" msgstr "рута" msgid "About" msgstr "O" msgid "Actions" msgstr "Поступци" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Заврши" msgid "" "Stop\n" "Navigation" msgstr "" "Заустави\n" "навигацију" msgid "Display" msgstr "Приказ" msgid "Fullscreen" msgstr "Цео екран" msgid "Window Mode" msgstr "Режим прозора" msgid "Description" msgstr "Опис" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "коњ" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "За %s, прелазак на обилазницу" #~ msgid "Cursor" #~ msgstr "Курсор" navit-0.5.0~svn5643+dfsg.1/po/sv.po.in000066400000000000000000001066561221777731700172310ustar00rootroot00000000000000# Swedish translation for navit # Copyright (c) 2008 The Navit Team # This file is distributed under the same license as the navit package. # Pipatron , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-18 12:27+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Körs från källkodsbiblioteket\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "sätter '%s' till '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nollte" msgid "first" msgstr "första" msgid "second" msgstr "andra" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjärde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjätte" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "ingen avfart" msgid "first exit" msgstr "första avfarten" msgid "second exit" msgstr "andra avfarten" msgid "third exit" msgstr "tredje avfarten" msgid "fourth exit" msgstr "fjärde avfarten" msgid "fifth exit" msgstr "femte avfarten" msgid "sixth exit" msgstr "sjätte avfarten" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "om %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "om %d,%d kilometer" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "en kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om en kilometer" msgstr[1] "om %d kilometer" msgid "exit" msgstr "avfart" msgid "into the ramp" msgstr "ut på påfarten" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sin på gatan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%sin på %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%sin på %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%sin på %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sut på %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "höger" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "vänster" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "lätt " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "tvärt " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "mycket tvärt " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "okänd " msgid "When possible, please turn around" msgstr "Vänd när det går" msgid "Enter the roundabout soon" msgstr "Kör snart in i rondellen" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "kör sedan ut ur rondellen mot %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Kör ut ur rondellen mot %s" #, c-format msgid "Follow the road for the next %s" msgstr "Följ vägen i %s" msgid "soon" msgstr "snart" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ta %1$s vägen mot %2$s" #, c-format msgid "after %i roads" msgstr "efter %i vägar" msgid "now" msgstr "nu" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "ta sedan %1$s vägen mot %2$s" msgid "error" msgstr "fel" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Sväng %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "sväng sedan %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Du har nått din destination %s" msgid "then you have reached your destination." msgstr "sedan har du nått din destination." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Sträcka" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tid" msgid "Destination Length" msgstr "Sträcka kvar" msgid "Destination Time" msgstr "Restid" msgid "Roadbook" msgstr "Vägbok" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Ange som position" msgid "Set as destination" msgstr "Ange som destination" msgid "Add as bookmark" msgstr "Lägg till som bokmärke" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skärm koordinat : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Förenade Arabemiraten" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua och Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" #. 530 msgid "Netherlands Antilles" msgstr "Nederländska Antillerna" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikanska Samoa" #. 040 msgid "Austria" msgstr "Österrike" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbajdzjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetön" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Vitryssland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosöarna" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratiska republiken" #. 140 msgid "Central African Republic" msgstr "Centralafrikanska republiken" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Schweiz" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbenskusten" #. 184 msgid "Cook Islands" msgstr "Cooköarna" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Julön" #. 196 msgid "Cyprus" msgstr "Cypern" #. 203 msgid "Czech Republic" msgstr "Tjeckien" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikanska republiken" #. 012 msgid "Algeria" msgstr "Algeriet" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypten" #. 732 msgid "Western Sahara" msgstr "Västsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Etiopien" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsöarna" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien, federala staterna" #. 234 msgid "Faroe Islands" msgstr "Färöarna" #. 250 msgid "France" msgstr "Frankrike" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannien" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Franska Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorialguinea" #. 300 msgid "Greece" msgstr "Grekland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sydgeorgien och Sydsandwichöarna" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- och McDonaldsöarna" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungern" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Brittiska territoriet i Indiska Oceanen" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, islamiska republiken" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordanien" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizistan" #. 116 msgid "Cambodia" msgstr "Kambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorerna" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts och Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, demokratiska folkrepubliken" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republiken" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Caymanöarna" #. 398 msgid "Kazakhstan" msgstr "Kazakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Demokratiska folkrepubliken Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libyen" #. 504 msgid "Morocco" msgstr "Marocko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavien, republiken" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Franksa delen)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallöarna" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonien, republiken" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Burma (Myanmar)" #. 496 msgid "Mongolia" msgstr "Mongoliet" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nordmarianerna" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiverna" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Moçambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nya Kaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkön" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Nederländerna" #. 578 msgid "Norway" msgstr "Norge" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nya Zeeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Franska Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua Nya Guinea" #. 608 msgid "Philippines" msgstr "Filippinerna" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre och Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinska självstyret" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumänien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Ryssland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudiarabien" #. 090 msgid "Solomon Islands" msgstr "Salomonöarna" #. 690 msgid "Seychelles" msgstr "Seychellerna" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sankta Helena" #. 705 msgid "Slovenia" msgstr "Slovenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard och Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakien" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé och Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrien" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- och Caicosöarna" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Franska sydterritorierna" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadzjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Östtimor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkiet" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad och Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, provins i Kina" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Förenta staternas avlägset belägna öar" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent och Grenadinerna" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Jungfruöarna, brittiska" #. 850 msgid "Virgin Islands, U.S." msgstr "Jungfruöarna, amerikanska" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis och Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sydafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Okänt, lägg till is_in-taggar till dessa städer" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartpunkt" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "Stad" msgid "District" msgstr "Distrikt" msgid "Street" msgstr "Gata" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Ange destination" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "Stad" msgid "District/Township" msgstr "Distrikt" msgid "Map" msgstr "Karta" msgid "Bookmark" msgstr "Bokmärke" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visa" msgid "_Route" msgstr "Rutt" msgid "_Former Destinations" msgstr "Tidigare destinationer" msgid "_Bookmarks" msgstr "Bokmärken" msgid "_Map" msgstr "Karta" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Projektion" msgid "_Vehicle" msgstr "Fordon" msgid "Zoom_Out" msgstr "Zooma ut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zooma in" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Gör ny beräkning" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Avsluta navigering" msgid "Test" msgstr "Testa" msgid "_Quit" msgstr "_Avsluta" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lås till vägen" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Vägbok" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Helskärm" msgid "Data" msgstr "Data" msgid "N" msgstr "N" msgid "NE" msgstr "NÖ" msgid "E" msgstr "Ö" msgid "SE" msgstr "SÖ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nej" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rutt %4.0fkm %02d:%02d Ankomsttid" msgid "Route 0000km 0+00:00 ETA" msgstr "Rutt 0000km 0+00:00 Ankomsttid" msgid "Help" msgstr "Hjälp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Visa i webbläsare" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gator" msgid "House numbers" msgstr "Husnummer" msgid "View Attributes" msgstr "Visa attribut" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Intressepunkter" msgid "View on map" msgstr "Visa på karta" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bokmärken" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Bokmärk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Visa satellitstatus" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Visa NMEA-data" msgid "car" msgstr "bil" msgid "bike" msgstr "cykel" msgid "pedestrian" msgstr "fotgängare" #, c-format msgid "Current profile: %s" msgstr "Aktuell profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Byt profil till: %s" msgid "Set as active" msgstr "Sätt som aktiv" msgid "Show Satellite status" msgstr "Visa satellitstatus" msgid "Show NMEA data" msgstr "Visa NMEA-data" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Fordon" msgid "Rules" msgstr "Regler" msgid "Lock on road" msgstr "Lås till väg" msgid "Northing" msgstr "Håll norr uppåt" msgid "Map follows Vehicle" msgstr "Kartan följer fordonet" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kartor" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Höjdprofil" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Tidigare destinationer" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Meddelande" msgid "Back" msgstr "Tillbaka" msgid "Back to map" msgstr "Tillbaka till kartan" msgid "Main Menu" msgstr "Huvudmeny" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Fordonsposition" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Huvudmeny" msgid "" "Show\n" "Map" msgstr "" "Visa\n" "Karta" msgid "Settings" msgstr "Inställningar" msgid "Tools" msgstr "Verktyg" msgid "Route" msgstr "Rutt" msgid "About" msgstr "" msgid "Actions" msgstr "Åtgärder" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Avsluta" msgid "" "Stop\n" "Navigation" msgstr "" "Stoppa\n" "Navigering" msgid "Display" msgstr "Visa" msgid "Fullscreen" msgstr "Helskärm" msgid "Window Mode" msgstr "Fönsterläge" msgid "Description" msgstr "Beskrivning" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Om %s, kör in i rondellen" #~ msgid "Cursor" #~ msgstr "Markör" #~ msgid "%d.%d kilometer" #~ msgstr "%d,%d kilometer" navit-0.5.0~svn5643+dfsg.1/po/ta.po.in000066400000000000000000000774441221777731700172070ustar00rootroot00000000000000# Tamil translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # Dinesh Ramalingam, 2010 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-07-07 20:13+0000\n" "Last-Translator: Dinesh Ramalingam \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ta\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s', '%s' ஆக மாற்றபடுகின்றது\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "முதல்" msgid "second" msgstr "இரண்டாவது" msgid "third" msgstr "மூன்றாவது" msgid "fourth" msgstr "நான்காவது" msgid "fifth" msgstr "ஐந்தாவது" msgid "sixth" msgstr "ஆறாவது" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "முதல் வெளியேற்றம்" msgid "second exit" msgstr "இரண்டாவது வெளியேற்றம்" msgid "third exit" msgstr "மூன்றாவது வெளியேற்றம்" msgid "fourth exit" msgstr "நான்காவது வெளியேற்றம்" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "ஐந்தாவது வெளியேற்றம்" #, c-format msgid "%d m" msgstr "%d நி" #, c-format msgid "in %d m" msgstr "%d நி.யில்" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d மீட்டர்கள்" #, c-format msgid "in %d meters" msgstr "%d மீட்டருக்குள்" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d கிலோமீட்டர்கள்." #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d கிலோமீட்டருக்குள்" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ஒரு கிலோமீட்டர்" msgstr[1] "%d கிலோமீட்டர்கள்" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ஒரு கிலோமீட்டருக்குள்" msgstr[1] "%d கிலோமீட்டர்களுக்குள்" msgid "exit" msgstr "" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" navit-0.5.0~svn5643+dfsg.1/po/te.po.in000066400000000000000000001045241221777731700172010ustar00rootroot00000000000000# Telugu translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Veeven 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-07-02 20:53+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Telugu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d మీటర్లు" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ఒక కిలోమీటరు" msgstr[1] "%d కిలోమీటర్లు" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" msgid "exit" msgstr "" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "కుడి" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "ఎడమ" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "తేలికగా " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "soon" msgstr "త్వరలో" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "ఇప్పుడు" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "పొరపాటు" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "మీరు మీ గమ్యస్థానం %s చేరారు" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "ఆదేశం" msgid "Length" msgstr "పొడవు" msgid "km" msgstr "కిమీ" msgid "m" msgstr "" msgid "Time" msgstr "సమయం" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "అండోరా" #. 784 msgid "United Arab Emirates" msgstr "యునైటెడ్ అరబ్ ఎమిరేట్స్" #. 004 msgid "Afghanistan" msgstr "ఆఫ్ఘనిస్తాన్" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "అల్బేనియా" #. 051 msgid "Armenia" msgstr "అర్మేనియా" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "అంగోలా" #. 010 msgid "Antarctica" msgstr "అంటార్కిటికా" #. 032 msgid "Argentina" msgstr "అర్జెంటీనా" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "బంగ్లాదేశ్" #. 056 msgid "Belgium" msgstr "బెల్జియం" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "బల్గేరియా" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "బెర్ముడా" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "బొలీవియా" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "బ్రెజిల్" #. 044 msgid "Bahamas" msgstr "బహమాస్" #. 064 msgid "Bhutan" msgstr "భూటాన్" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "బెలారస్" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "కెనడా" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "మధ్య ఆఫ్రికన్ రిపబ్లిక్" #. 178 msgid "Congo" msgstr "కాంగో" #. 756 msgid "Switzerland" msgstr "స్విట్జర్లాండ్" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "చిలీ" #. 120 msgid "Cameroon" msgstr "కామెరూన్" #. 156 msgid "China" msgstr "చైనా" #. 170 msgid "Colombia" msgstr "కొలంబియా" #. 188 msgid "Costa Rica" msgstr "కోస్టారికా" #. 192 msgid "Cuba" msgstr "క్యూబా" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "సైప్రస్" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "జర్మనీ" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "డెన్మార్క్" #. 212 msgid "Dominica" msgstr "డొమినికా" #. 214 msgid "Dominican Republic" msgstr "డొమినికన్ రిపబ్లిక్" #. 012 msgid "Algeria" msgstr "అల్జీరియా" #. 218 msgid "Ecuador" msgstr "ఈక్విడార్" #. 233 msgid "Estonia" msgstr "ఎస్టోనియా" #. 818 msgid "Egypt" msgstr "ఈజిప్ట్" #. 732 msgid "Western Sahara" msgstr "పశ్చిమ సహారా" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "స్పెయిన్" #. 231 msgid "Ethiopia" msgstr "ఇథియోపియా" #. 246 msgid "Finland" msgstr "ఫిన్లాండ్" #. 242 msgid "Fiji" msgstr "ఫిజీ" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "ఫ్రాన్స్" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "జార్జియా" #. 254 msgid "French Guiana" msgstr "ఫ్రెంచ్ గయానా" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "ఘనా" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "గ్రీన్‌లాండ్" #. 270 msgid "Gambia" msgstr "జాంబియా" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "గ్రీస్" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "గయానా" #. 344 msgid "Hong Kong" msgstr "హాంకాంగ్" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "క్రోయేషియా" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "హంగరీ" #. 360 msgid "Indonesia" msgstr "ఇండోనేషియా" #. 372 msgid "Ireland" msgstr "ఐర్లాండ్" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "భారతదేశం" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "ఇరాక్" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "ఇటలీ" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "జమైకా" #. 400 msgid "Jordan" msgstr "జోర్డాన్" #. 392 msgid "Japan" msgstr "జపాన్" #. 404 msgid "Kenya" msgstr "కెన్యా" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "కాంబోడియా" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "కువైట్" #. 136 msgid "Cayman Islands" msgstr "కేమన్ దీవులు" #. 398 msgid "Kazakhstan" msgstr "కజకిస్తాన్" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "లెబనాన్" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "శ్రీలంక" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "లాత్వియా" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "మొరాకో" #. 492 msgid "Monaco" msgstr "మొనాకో" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "మడగాస్కర్" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "మియన్మార్" #. 496 msgid "Mongolia" msgstr "మంగోలియా" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "మాల్టా" #. 480 msgid "Mauritius" msgstr "మారిషస్" #. 462 msgid "Maldives" msgstr "మాల్దీవులు" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "మెక్సికో" #. 458 msgid "Malaysia" msgstr "మలేషియా" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "నమీబియా" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "నైజీరియా" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "నార్వే" #. 524 msgid "Nepal" msgstr "నేపాల్" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "న్యూజిలాండ్" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "పనామా" #. 604 msgid "Peru" msgstr "పెరూ" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "ఫిలిప్ఫీన్స్" #. 586 msgid "Pakistan" msgstr "పాకిస్తాన్" #. 616 msgid "Poland" msgstr "పోలాండ్" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "పోర్చుగల్" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "పరాగ్వే" #. 634 msgid "Qatar" msgstr "ఖతార్" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "రొమేనియా" #. 688 msgid "Serbia" msgstr "సెర్బియా" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "రువాండా" #. 682 msgid "Saudi Arabia" msgstr "సౌది అరేబియా" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "సూడాన్" #. 752 msgid "Sweden" msgstr "స్వీడన్" #. 702 msgid "Singapore" msgstr "సింగపూర్" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "స్లొవేకియా" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "సోమాలియా" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "స్వాజిలాండ్" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "టోగో" #. 764 msgid "Thailand" msgstr "థాయిలాండ్" #. 762 msgid "Tajikistan" msgstr "తజకిస్తాన్" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "ఉక్రేయిన్" #. 800 msgid "Uganda" msgstr "ఉగాండా" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "యునైటెడ్ స్టేట్స్ ఆఫ్ అమెరికా" #. 858 msgid "Uruguay" msgstr "ఉరూగ్వే" #. 860 msgid "Uzbekistan" msgstr "ఉజ్బెకిస్తాన్" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "వెనిజులా" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "వియత్నాం" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "దక్షిణ ఆఫ్రికా" #. 894 msgid "Zambia" msgstr "జాంబియా" #. 716 msgid "Zimbabwe" msgstr "జింబాబ్వే" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "దేశం" msgid "Postal" msgstr "తపాలా" msgid "Town" msgstr "పట్టణం" msgid "District" msgstr "జిల్లా" msgid "Street" msgstr "వీధి" msgid "Number" msgstr "సంఖ్య" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "నగరం" msgid "District/Township" msgstr "" msgid "Map" msgstr "పటం" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "గమ్యం" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "పేజీకలు" msgid "_Map" msgstr "పటం" msgid "_Layout" msgstr "కూర్పు" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "వాహనం" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "సమాచారం" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "పరీక్ష" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "నిండు తెర" msgid "Data" msgstr "దత్తాంశం" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "పేజీకలు" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "వాహనం" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "కూర్పు" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "నిండు తెర" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" navit-0.5.0~svn5643+dfsg.1/po/th.po.in000066400000000000000000001212371221777731700172040ustar00rootroot00000000000000# Thai translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Mansv68 , 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-07-02 21:52+0000\n" "Last-Translator: mansv68 \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: th\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "กำหนด '%s' ถึง '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "%d เมตร" #, c-format msgid "in %d m" msgstr "อีก %d เมตร" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d เมตร" #, c-format msgid "in %d meters" msgstr "อีก %d เมตร" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "อีก %d.%d กิโลเมตร" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d กิโลเมตร" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "อีก %d กิโลเมตร" msgid "exit" msgstr "ทางออก" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s เข้าสู่ถนน %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s เข้าสู่ %s%s%s| จาก" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s เข้าสู %s%s%s| จาก" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s เข้าสู่ %s%s%s| จาก" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "ขวา" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "ซ้าย" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "อย่างเคร่งคัด " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "ไม่ทราบ " msgid "When possible, please turn around" msgstr "ถ้าเป็นไปได้ ให้กลับรถ" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "ตรงไปตามถนน แล้ว %s" msgid "soon" msgstr "ในไม่ช้า" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "เดี๋ยวนี้" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "ข้อผิดพลาด" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "เลี้ยว %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "คุณได้ถึงที่หมายแล้ว %s" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "คำสั่ง" msgid "Length" msgstr "ความยาว" msgid "km" msgstr "กม." msgid "m" msgstr "เมตร" msgid "Time" msgstr "เวลา" msgid "Destination Length" msgstr "ระยะทาง ถึงที่หมาย" msgid "Destination Time" msgstr "เวลา ถึงที่หมาย" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "กำหนดตำแหน่ง" msgid "Set as destination" msgstr "กำหนดเป็นที่หมาย" msgid "Add as bookmark" msgstr "เพิ่มใน บุกมาร์ก" #, c-format msgid "Point 0x%x 0x%x" msgstr "จุด 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "พิกัดหน้าจอ : %d %d" #. 020 msgid "Andorra" msgstr "แอนโดรา" #. 784 msgid "United Arab Emirates" msgstr "สหรัฐอาหรับอีมิเรตส์" #. 004 msgid "Afghanistan" msgstr "อาฟกานิสถาน" #. 028 msgid "Antigua and Barbuda" msgstr "อันทิกัว และ บาร์บูดา" #. 660 msgid "Anguilla" msgstr "แองกีลา" #. 008 msgid "Albania" msgstr "อัลเบเนีย" #. 051 msgid "Armenia" msgstr "อาร์เมเนีย" #. 530 msgid "Netherlands Antilles" msgstr "เนเธอร์แลนด์ แอนทิลีส" #. 024 msgid "Angola" msgstr "แองโกลา" #. 010 msgid "Antarctica" msgstr "แอนตาร์กติกา" #. 032 msgid "Argentina" msgstr "อาร์เจนตินา" #. 016 msgid "American Samoa" msgstr "อเมริกัน ซามัว" #. 040 msgid "Austria" msgstr "ออสเตรีย" #. 036 msgid "Australia" msgstr "ออสเตรเลีย" #. 533 msgid "Aruba" msgstr "อรูบา" #. 248 msgid "Aland Islands" msgstr "เกาะ เอแลนด์" #. 031 msgid "Azerbaijan" msgstr "อาร์เซอร์ไบจัน" #. 070 msgid "Bosnia and Herzegovina" msgstr "บอสเนียและเฮอร์เซโกวินา" #. 052 msgid "Barbados" msgstr "บาร์บาดอส" #. 050 msgid "Bangladesh" msgstr "บังคลาเทศ" #. 056 msgid "Belgium" msgstr "เบลเยียม" #. 854 msgid "Burkina Faso" msgstr "เบอร์กินาฟาโซ" #. 100 msgid "Bulgaria" msgstr "บัลแกเรีย" #. 048 msgid "Bahrain" msgstr "บาห์เรียน" #. 108 msgid "Burundi" msgstr "บูรันดิ" #. 204 msgid "Benin" msgstr "เบนิน" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "เบอร์มิวดา" #. 096 msgid "Brunei Darussalam" msgstr "บรูไนดูรัสซาลาม" #. 068 msgid "Bolivia" msgstr "โบลิเวีย" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "บราซิล" #. 044 msgid "Bahamas" msgstr "บาฮามา" #. 064 msgid "Bhutan" msgstr "ภูฏาน" #. 074 msgid "Bouvet Island" msgstr "เกาะบูเวต์" #. 072 msgid "Botswana" msgstr "บอทสวานา" #. 112 msgid "Belarus" msgstr "เบลารุส" #. 084 msgid "Belize" msgstr "เบลไลซ์" #. 124 msgid "Canada" msgstr "แคนาดา" #. 166 msgid "Cocos (Keeling) Islands" msgstr "หมู่เกาะโคโคส (คีลิง)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "สาธารณรัฐอัฟริกากลาง" #. 178 msgid "Congo" msgstr "คองโก" #. 756 msgid "Switzerland" msgstr "สวิสเซอร์แลนด์" #. 384 msgid "Cote d'Ivoire" msgstr "โกตดิวัวร์" #. 184 msgid "Cook Islands" msgstr "หมู่เกาะคุ้ก" #. 152 msgid "Chile" msgstr "ชิลี" #. 120 msgid "Cameroon" msgstr "คาเมรูน" #. 156 msgid "China" msgstr "จีน" #. 170 msgid "Colombia" msgstr "โคลัมเบีย" #. 188 msgid "Costa Rica" msgstr "คอสตาริกา" #. 192 msgid "Cuba" msgstr "คิวบา" #. 132 msgid "Cape Verde" msgstr "แหลมเวอร์ดี" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "เกาะคริสต์มาส" #. 196 msgid "Cyprus" msgstr "ไซปรัส" #. 203 msgid "Czech Republic" msgstr "สาธารณรัฐเชค" #. 276 msgid "Germany" msgstr "เยอรมันนี" #. 262 msgid "Djibouti" msgstr "จิบูติ" #. 208 msgid "Denmark" msgstr "เดนมาร์ก" #. 212 msgid "Dominica" msgstr "โดมินากัน" #. 214 msgid "Dominican Republic" msgstr "สาธารณรัฐโดมินิกัน" #. 012 msgid "Algeria" msgstr "อัลจีเรีย" #. 218 msgid "Ecuador" msgstr "เอกวาดอร์" #. 233 msgid "Estonia" msgstr "เอสโทเนีย" #. 818 msgid "Egypt" msgstr "อียิปต์" #. 732 msgid "Western Sahara" msgstr "ซาฮาร่าตะวันตก" #. 232 msgid "Eritrea" msgstr "เอริเทรีย" #. 724 msgid "Spain" msgstr "สเปน" #. 231 msgid "Ethiopia" msgstr "เอธิโอเปีย" #. 246 msgid "Finland" msgstr "ฟินแลนด์" #. 242 msgid "Fiji" msgstr "ฟิจิ" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "หมู่เกาะฟอล์กแลนด์ (มาลบีนาส)" #. 583 msgid "Micronesia, Federated States of" msgstr "ไมโครนีเซีย" #. 234 msgid "Faroe Islands" msgstr "หมู่เกาะแฟโร" #. 250 msgid "France" msgstr "ฝรั่งเศส" #. 266 msgid "Gabon" msgstr "กาบอน" #. 826 msgid "United Kingdom" msgstr "อังกฤษ" #. 308 msgid "Grenada" msgstr "เกรนาดา" #. 268 msgid "Georgia" msgstr "จอร์เจีย" #. 254 msgid "French Guiana" msgstr "เฟรนช์เกียนา" #. 831 msgid "Guernsey" msgstr "เกิร์นซีย์" #. 288 msgid "Ghana" msgstr "กานา" #. 292 msgid "Gibraltar" msgstr "ยิบรอลตา" #. 304 msgid "Greenland" msgstr "กรีนแลนด์" #. 270 msgid "Gambia" msgstr "แกมเบีย" #. 324 msgid "Guinea" msgstr "กินี" #. 312 msgid "Guadeloupe" msgstr "กวาเดอลูป" #. 226 msgid "Equatorial Guinea" msgstr "กินี ตรงเส้นศูนย์สูตร" #. 300 msgid "Greece" msgstr "กรีซ" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช" #. 320 msgid "Guatemala" msgstr "กัวเตมาลา" #. 316 msgid "Guam" msgstr "กวม" #. 624 msgid "Guinea-Bissau" msgstr "กินี - บิสซอ" #. 328 msgid "Guyana" msgstr "กูยาน่า" #. 344 msgid "Hong Kong" msgstr "ฮ่องกง" #. 334 msgid "Heard Island and McDonald Islands" msgstr "เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์" #. 340 msgid "Honduras" msgstr "ฮอนดูรัส" #. 191 msgid "Croatia" msgstr "โครเอเธีย" #. 332 msgid "Haiti" msgstr "ไฮติ" #. 348 msgid "Hungary" msgstr "ฮังการี" #. 360 msgid "Indonesia" msgstr "อินโดนีเซีย" #. 372 msgid "Ireland" msgstr "ไอร์แลนด์" #. 376 msgid "Israel" msgstr "อิสราเอล" #. 833 msgid "Isle of Man" msgstr "เกาะแมน" #. 356 msgid "India" msgstr "อินเดีย" #. 086 msgid "British Indian Ocean Territory" msgstr "บริติชอินเดียนโอเชียนเทร์ริทอรี" #. 368 msgid "Iraq" msgstr "อิรัก" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "ไอซ์แลนด์" #. 380 msgid "Italy" msgstr "อิตาลี" #. 832 msgid "Jersey" msgstr "เจอร์ซีย์" #. 388 msgid "Jamaica" msgstr "จาไมก้า" #. 400 msgid "Jordan" msgstr "จอร์แดน" #. 392 msgid "Japan" msgstr "ญี่ปุ่น" #. 404 msgid "Kenya" msgstr "เคนยา" #. 417 msgid "Kyrgyzstan" msgstr "คีร์กีซสถาน" #. 116 msgid "Cambodia" msgstr "กัมพูชา" #. 296 msgid "Kiribati" msgstr "คิริบาติ" #. 174 msgid "Comoros" msgstr "โคโมรอส" #. 659 msgid "Saint Kitts and Nevis" msgstr "เซนต์คิตส์และเนวิส" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "เกาหลีเหนือ" #. 410 msgid "Korea, Republic of" msgstr "เกาหลีใต้" #. 414 msgid "Kuwait" msgstr "คูเวต" #. 136 msgid "Cayman Islands" msgstr "หมู่เกาะเคย์แมน" #. 398 msgid "Kazakhstan" msgstr "คาซัคสถาน" #. 418 msgid "Lao People's Democratic Republic" msgstr "สาธารณรัฐประชาธิปไตยประชาชนลาว" #. 422 msgid "Lebanon" msgstr "เลบานอน" #. 662 msgid "Saint Lucia" msgstr "เซนต์ลูเซีย" #. 438 msgid "Liechtenstein" msgstr "ลิชเทนสไตน์" #. 144 msgid "Sri Lanka" msgstr "ศรีลังกา" #. 430 msgid "Liberia" msgstr "ไลบีเรีย" #. 426 msgid "Lesotho" msgstr "เลโซโต" #. 440 msgid "Lithuania" msgstr "ลิธัวเนีย" #. 442 msgid "Luxembourg" msgstr "ลักเซมเบอร์ก" #. 428 msgid "Latvia" msgstr "ลัธเวีย" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "ลิเบีย" #. 504 msgid "Morocco" msgstr "โมร็อคโค" #. 492 msgid "Monaco" msgstr "โมนาโค" #. 498 msgid "Moldova, Republic of" msgstr "มอลโดวา, สาธารณรัฐ" #. 499 msgid "Montenegro" msgstr "มอนเตเนโกร" #. 663 msgid "Saint Martin (French part)" msgstr "แซงมาร์แตง (ส่วนของฝรั่งเศส)" #. 450 msgid "Madagascar" msgstr "มาดากัสกา" #. 584 msgid "Marshall Islands" msgstr "หมู่เกาะมาแชล" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "มาลี" #. 104 msgid "Myanmar" msgstr "พม่า" #. 496 msgid "Mongolia" msgstr "มองโกเลีย" #. 446 msgid "Macao" msgstr "มาเก๊า" #. 580 msgid "Northern Mariana Islands" msgstr "หมู่เกาะมาเรียน่เหนือ" #. 474 msgid "Martinique" msgstr "มาทินิค" #. 478 msgid "Mauritania" msgstr "มอริทาเนีย" #. 500 msgid "Montserrat" msgstr "มอนต์เซอร์รัท" #. 470 msgid "Malta" msgstr "มอลตา" #. 480 msgid "Mauritius" msgstr "มอริเชียส" #. 462 msgid "Maldives" msgstr "มัลดิฟ" #. 454 msgid "Malawi" msgstr "มาลาวี" #. 484 msgid "Mexico" msgstr "เม็กซิโก" #. 458 msgid "Malaysia" msgstr "มาเลเซีย" #. 508 msgid "Mozambique" msgstr "โมแซมบิก" #. 516 msgid "Namibia" msgstr "นามิเบีย" #. 540 msgid "New Caledonia" msgstr "นิวคาเลโดเนีย" #. 562 msgid "Niger" msgstr "ไนเจอร์" #. 574 msgid "Norfolk Island" msgstr "เกาะนอร์ฟอล์ค" #. 566 msgid "Nigeria" msgstr "ไนจีเรีย" #. 558 msgid "Nicaragua" msgstr "นิคารากัว" #. 528 msgid "Netherlands" msgstr "เนเธอร์แลนด์" #. 578 msgid "Norway" msgstr "นอร์เวย์" #. 524 msgid "Nepal" msgstr "เนปาล" #. 520 msgid "Nauru" msgstr "นาวรู" #. 570 msgid "Niue" msgstr "นิอุเอ" #. 554 msgid "New Zealand" msgstr "นิวซีแลนด์" #. 512 msgid "Oman" msgstr "โอมาน" #. 591 msgid "Panama" msgstr "ปานามา" #. 604 msgid "Peru" msgstr "เปรู" #. 258 msgid "French Polynesia" msgstr "ฝรั่งเศสโพลีนีเซีย" #. 598 msgid "Papua New Guinea" msgstr "ปาปัวนิวกินี" #. 608 msgid "Philippines" msgstr "ฟิลิปปินส์" #. 586 msgid "Pakistan" msgstr "ปากีสถาน" #. 616 msgid "Poland" msgstr "โปแลนด์" #. 666 msgid "Saint Pierre and Miquelon" msgstr "แซงปีแยร์และมีเกอลง" #. 612 msgid "Pitcairn" msgstr "พิตแคร์น" #. 630 msgid "Puerto Rico" msgstr "เปอร์โตริโก" #. 275 msgid "Palestinian Territory, Occupied" msgstr "ปาเลสไตน์, ดินแดนยึดครอง" #. 620 msgid "Portugal" msgstr "โปรตุเกส" #. 585 msgid "Palau" msgstr "เกาะพาเลา" #. 600 msgid "Paraguay" msgstr "ปารากวัย" #. 634 msgid "Qatar" msgstr "กาตาร์" #. 638 msgid "Reunion" msgstr "รียูเนียน" #. 642 msgid "Romania" msgstr "โรมาเนีย" #. 688 msgid "Serbia" msgstr "เซอร์เบีย" #. 643 msgid "Russian Federation" msgstr "สมาพันธรัฐรัสเซีย" #. 646 msgid "Rwanda" msgstr "รวันด้า" #. 682 msgid "Saudi Arabia" msgstr "ซาอุดิอาระเบีย" #. 090 msgid "Solomon Islands" msgstr "หมู่เกาะโซโลมอน" #. 690 msgid "Seychelles" msgstr "ซีเชลล์" #. 736 msgid "Sudan" msgstr "ซูดาน" #. 752 msgid "Sweden" msgstr "สวีเดน" #. 702 msgid "Singapore" msgstr "สิงคโปร์" #. 654 msgid "Saint Helena" msgstr "เซนต์เฮเลนา" #. 705 msgid "Slovenia" msgstr "สโลเวเนีย" #. 744 msgid "Svalbard and Jan Mayen" msgstr "สฟาลบาร์ และ ยานไมเอน" #. 703 msgid "Slovakia" msgstr "สโลวาเกีย" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "ซานมาริโน" #. 686 msgid "Senegal" msgstr "เซนีกัล" #. 706 msgid "Somalia" msgstr "โซมาเลีย" #. 740 msgid "Suriname" msgstr "ซูรีนามิ" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "ซาวโทม และ พรินซิป" #. 222 msgid "El Salvador" msgstr "เอลซัลวาดอร์" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "สาธารณรัฐอาหรับซีเรีย" #. 748 msgid "Swaziland" msgstr "สวาซิแลนด์" #. 796 msgid "Turks and Caicos Islands" msgstr "เกาะดติร์กและเคคอส" #. 148 msgid "Chad" msgstr "ชาด" #. 260 msgid "French Southern Territories" msgstr "เฟรนช์เซาเทิร์นเทร์ริทอรีส์" #. 768 msgid "Togo" msgstr "โตโก" #. 764 msgid "Thailand" msgstr "ราชอาณาจักรไทย" #. 762 msgid "Tajikistan" msgstr "ธาจีกิสถาน" #. 772 msgid "Tokelau" msgstr "โตเกเลา" #. 626 msgid "Timor-Leste" msgstr "ติมอร์ตะวันออก" #. 795 msgid "Turkmenistan" msgstr "เตอร์กเมนิสถาน" #. 788 msgid "Tunisia" msgstr "ตูนีเซีย" #. 776 msgid "Tonga" msgstr "ตองก้า" #. 792 msgid "Turkey" msgstr "ตุรกี" #. 780 msgid "Trinidad and Tobago" msgstr "ตรีนิแดดและโทบาโก" #. 798 msgid "Tuvalu" msgstr "ตูวาลู" #. 158 msgid "Taiwan, Province of China" msgstr "ไต้หวัน, จังหวัดของจีน" #. 834 msgid "Tanzania, United Republic of" msgstr "แทนซาเนีย, สหสาธารณรัฐ" #. 804 msgid "Ukraine" msgstr "ยูเครน" #. 800 msgid "Uganda" msgstr "ยูกันดา" #. 581 msgid "United States Minor Outlying Islands" msgstr "เกาะเล็กรอบนอกของสหรัฐอเมริกา" #. 840 msgid "United States" msgstr "สหรัฐ" #. 858 msgid "Uruguay" msgstr "อุรุกวัย" #. 860 msgid "Uzbekistan" msgstr "อุซเบกิสถาน" #. 336 msgid "Holy See (Vatican City State)" msgstr "นครรัฐวาติกัน" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "เซนต์วินเซนต์และเกรนาดีนส์" #. 862 msgid "Venezuela" msgstr "เวเนซุเอลา" #. 092 msgid "Virgin Islands, British" msgstr "หมู่เกาะบริติชเวอร์จิน" #. 850 msgid "Virgin Islands, U.S." msgstr "หมู่เกาะเวอร์จินของสหรัฐอเมริกา" #. 704 msgid "Viet Nam" msgstr "เวียตนาม" #. 548 msgid "Vanuatu" msgstr "แวนัวตู" #. 876 msgid "Wallis and Futuna" msgstr "หมู่เกาะวาลลิสและหมู่เกาะฟูตูนา" #. 882 msgid "Samoa" msgstr "ซามัว" #. 887 msgid "Yemen" msgstr "เยเมน" #. 175 msgid "Mayotte" msgstr "เมโยเต้" #. 710 msgid "South Africa" msgstr "แอฟริกาใต้" #. 894 msgid "Zambia" msgstr "แซมเบีย" #. 716 msgid "Zimbabwe" msgstr "ซิมบับเว" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "รถยนต์" msgid "Iso2" msgstr "ISO2" msgid "Iso3" msgstr "ISO3" msgid "Country" msgstr "ประเทศ" msgid "Postal" msgstr "ไปรษณีย์" msgid "Town" msgstr "เมือง" msgid "District" msgstr "เขต" msgid "Street" msgstr "ถนน" msgid "Number" msgstr "หมายเลข" msgid "Enter Destination" msgstr "กำหนด ที่หมาย" msgid "Zip Code" msgstr "รหัสไปรษณีย์" msgid "City" msgstr "เมือง" msgid "District/Township" msgstr "" msgid "Map" msgstr "แผนที่" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "จุดหมาย" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "แสดง" msgid "_Route" msgstr "เส้นทาง" msgid "_Former Destinations" msgstr "ก่อนถึง ที่หมาย" msgid "_Bookmarks" msgstr "บุ๊กมาร์ก" msgid "_Map" msgstr "แผนที่" msgid "_Layout" msgstr "การจัดเรียง" msgid "_Projection" msgstr "การฉายแผนที่" msgid "_Vehicle" msgstr "ยานพาหนะ" msgid "Zoom_Out" msgstr "ขยายออก" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ขยายเข้า" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "คำนวนใหม่" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "ข้อมูล" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "หยุดการนำทาง" msgid "Test" msgstr "ทดสอบ" msgid "_Quit" msgstr "_ออกจากโปรแกรม" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "แสดงผลเต็มจอภาพ" msgid "Data" msgstr "ข้อมูล" msgid "N" msgstr "เหนือ" msgid "NE" msgstr "ตะวันออกเฉียงเหนือ" msgid "E" msgstr "ตะวันออก" msgid "SE" msgstr "ตะวันออกเฉียงใต้" msgid "S" msgstr "ใต้" msgid "SW" msgstr "ตะวันตกเฉียงใต้" msgid "W" msgstr "ตะวันตก" msgid "NW" msgstr "ตะวันออกเฉียงเหนือ" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "เส้นทาง %4.0f กม. %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "เส้นทาง 0000km 0+00:00 ETA" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "บุ๊กมาร์ก" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "ยานพาหนะ" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "ทางทิศเหนือ" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "การจัดเรียง" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "ก่อนถึง ที่หมาย" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "เส้นทาง" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "แสดง" msgid "Fullscreen" msgstr "แสดงผลเต็มจอภาพ" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Cursor" #~ msgstr "เคอร์เซอร์" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d กิโลเมตร" navit-0.5.0~svn5643+dfsg.1/po/tr.po.in000066400000000000000000001076021221777731700172160ustar00rootroot00000000000000# Turkish translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # seqizz (gurkanGur) 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-10 15:05+0000\n" "Last-Translator: seqizz (gurkanGur) \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Kaynak klasörden çalıştırılıyor\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' , '%s' değerine ayarlanıyor\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "sıfırıncı" msgid "first" msgstr "birinci" msgid "second" msgstr "ikinci" msgid "third" msgstr "üçüncü" msgid "fourth" msgstr "dördüncü" msgid "fifth" msgstr "beşinci" msgid "sixth" msgstr "altıncı" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "sıfırıncı çıkış" msgid "first exit" msgstr "ilk çıkış" msgid "second exit" msgstr "ikinci çıkış" msgid "third exit" msgstr "üçüncü çıkış" msgid "fourth exit" msgstr "dördüncü çıkış" msgid "fifth exit" msgstr "beşinci çıkış" msgid "sixth exit" msgstr "altıncı çıkış" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "%d m'de" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d metre" #, c-format msgid "in %d meters" msgstr "%d metrede" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometre" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d kilometrede" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometre" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "%d kilometrede" msgid "exit" msgstr "çıkış" msgid "into the ramp" msgstr "rampada" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%sCaddesi'ne %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%scaddesine %s%s%s|male form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%scaddesine %s%s%s|female form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%scaddesine %s%s%s|neutral form" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s%s yoluna" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "Sağa" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "Sola" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "kolayca " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "sertçe " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "gerçekten sertçe " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "bilinmeyen " msgid "When possible, please turn around" msgstr "Müsait olduğunda lütfen yönünü değiştir" msgid "Enter the roundabout soon" msgstr "Yakındaki kavşağa girin" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "ardından %s'de kavşaktan çıkın" #, c-format msgid "Leave the roundabout at the %s" msgstr "%s'de kavşaktan çıkın" #, c-format msgid "Follow the road for the next %s" msgstr "Gelecek %s için yolu takip et" msgid "soon" msgstr "yakında" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "%1$s yolunda %2$s yönüne dönün" #, c-format msgid "after %i roads" msgstr "%i yol sonra" msgid "now" msgstr "şimdi" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "ardından %1$s yolunda %2$s yönüne dönün" msgid "error" msgstr "hata" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Dönüş %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "sonra %1$s%2$s %3$s%4$s dönün" #, c-format msgid "You have reached your destination %s" msgstr "Hedefinize ulaştınız, %s" msgid "then you have reached your destination." msgstr "ardından hedefinize ulaşacaksınız" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Konum" msgid "Command" msgstr "Komut" msgid "Length" msgstr "Uzaklık" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Zaman" msgid "Destination Length" msgstr "Hedef Uzaklığı" msgid "Destination Time" msgstr "Varış Zamanı" msgid "Roadbook" msgstr "Yol Haritası" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Pozisyon olarak ayarla" msgid "Set as destination" msgstr "Hedef olarak ayarla" msgid "Add as bookmark" msgstr "Yer imi olarak ayarla" #, c-format msgid "Point 0x%x 0x%x" msgstr "Nokta 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekran koordinatları :%d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Birleşik Arap Emirlikleri" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua ve Barbuda" #. 660 msgid "Anguilla" msgstr "Angola" #. 008 msgid "Albania" msgstr "Arnavutluk" #. 051 msgid "Armenia" msgstr "Ermenistan" #. 530 msgid "Netherlands Antilles" msgstr "Hollanda Antilleri" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Arjantin" #. 016 msgid "American Samoa" msgstr "Amerikan Samoa" #. 040 msgid "Austria" msgstr "Avusturya" #. 036 msgid "Australia" msgstr "Avustralya" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Adaları" #. 031 msgid "Azerbaijan" msgstr "Azerbeycan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna Hersek" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeş" #. 056 msgid "Belgium" msgstr "Belçika" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaristan" #. 048 msgid "Bahrain" msgstr "Bahreyn" #. 108 msgid "Burundi" msgstr "Brundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bruney" #. 068 msgid "Bolivia" msgstr "Bolivya" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brezilya" #. 044 msgid "Bahamas" msgstr "Bahamalar" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Adası" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Beyaz Rusya" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Adaları" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokratik Cumhuriyeti" #. 140 msgid "Central African Republic" msgstr "Merkezi Afrika Cumhuriyeti" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "İsviçre" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Cook Adaları" #. 152 msgid "Chile" msgstr "Şili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Çin" #. 170 msgid "Colombia" msgstr "Kolombiya" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Küba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Kıbrıs" #. 203 msgid "Czech Republic" msgstr "Çek Cumhuriyeti" #. 276 msgid "Germany" msgstr "Almanya" #. 262 msgid "Djibouti" msgstr "Cibuti" #. 208 msgid "Denmark" msgstr "Danimarka" #. 212 msgid "Dominica" msgstr "Dominik" #. 214 msgid "Dominican Republic" msgstr "Dominik Cumhuriyeti" #. 012 msgid "Algeria" msgstr "Cezayir" #. 218 msgid "Ecuador" msgstr "Ekvator" #. 233 msgid "Estonia" msgstr "Estonya" #. 818 msgid "Egypt" msgstr "Mısır" #. 732 msgid "Western Sahara" msgstr "Batı Sahra" #. 232 msgid "Eritrea" msgstr "Eritre" #. 724 msgid "Spain" msgstr "İspanya" #. 231 msgid "Ethiopia" msgstr "Etyopya" #. 246 msgid "Finland" msgstr "Finlandiya" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Adaları (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezya, Federe Devletleri" #. 234 msgid "Faroe Islands" msgstr "Faroe Adaları" #. 250 msgid "France" msgstr "Fransa" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Birleşik Krallık" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Gürcistan" #. 254 msgid "French Guiana" msgstr "Fransız Guyanası" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Cebelitarık" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambiya" #. 324 msgid "Guinea" msgstr "Gine" #. 312 msgid "Guadeloupe" msgstr "Guadalup" #. 226 msgid "Equatorial Guinea" msgstr "Ekvator Ginesi" #. 300 msgid "Greece" msgstr "Yunanistan" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Güney Gürcistan ve Güney Sandoviç Adaları" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gine-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Adası ve McDonald Adaları" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Hırvatistan" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Macaristan" #. 360 msgid "Indonesia" msgstr "Endonezya" #. 372 msgid "Ireland" msgstr "İrlanda" #. 376 msgid "Israel" msgstr "İsrail" #. 833 msgid "Isle of Man" msgstr "Man adası" #. 356 msgid "India" msgstr "Hindistan" #. 086 msgid "British Indian Ocean Territory" msgstr "Hint Okyanusu İngiliz Bölgesi" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "İran, İslâm Cumhuriyeti" #. 352 msgid "Iceland" msgstr "İzlanda" #. 380 msgid "Italy" msgstr "İtalya" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Ürdün" #. 392 msgid "Japan" msgstr "Japonya" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kırgızistan" #. 116 msgid "Cambodia" msgstr "Kamboçya" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sen Kitts ve Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Kore, Demokratik Halk Cumhuriyeti" #. 410 msgid "Korea, Republic of" msgstr "Kore Cumhuriyeti" #. 414 msgid "Kuwait" msgstr "Kuveyt" #. 136 msgid "Cayman Islands" msgstr "Seyman Adaları" #. 398 msgid "Kazakhstan" msgstr "Kazakistan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao, Demokratik Halk Cumhuriyeti" #. 422 msgid "Lebanon" msgstr "Lübnan" #. 662 msgid "Saint Lucia" msgstr "Sen Lusia" #. 438 msgid "Liechtenstein" msgstr "Lihtenştayn" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberya" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litvanya" #. 442 msgid "Luxembourg" msgstr "Lüksemburg" #. 428 msgid "Latvia" msgstr "Letonya" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libya" #. 504 msgid "Morocco" msgstr "Fas" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldova Cumhuriyeti" #. 499 msgid "Montenegro" msgstr "Karadağ" #. 663 msgid "Saint Martin (French part)" msgstr "Sen Martin (Fransız kısmı)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall Adaları" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonya" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Moğolistan" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Adaları" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Moritanya" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldivler" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksika" #. 458 msgid "Malaysia" msgstr "Malezya" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibiya" #. 540 msgid "New Caledonia" msgstr "Yeni Kaledonya" #. 562 msgid "Niger" msgstr "Nijer" #. 574 msgid "Norfolk Island" msgstr "Norfolk Adası" #. 566 msgid "Nigeria" msgstr "Nijerya" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Hollanda" #. 578 msgid "Norway" msgstr "Norveç" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Yeni Zelanda" #. 512 msgid "Oman" msgstr "Umman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransız Polinezyası" #. 598 msgid "Papua New Guinea" msgstr "Papua Yeni Gine" #. 608 msgid "Philippines" msgstr "Filipinler" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonya" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre ve Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Riko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Filistin Özerk Bölgesi" #. 620 msgid "Portugal" msgstr "Portekiz" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romanya" #. 688 msgid "Serbia" msgstr "Sırbistan" #. 643 msgid "Russian Federation" msgstr "Rusya Federasyonu" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Suudi Arabistan" #. 090 msgid "Solomon Islands" msgstr "Solomon Adaları" #. 690 msgid "Seychelles" msgstr "Seyşel Adaları" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "İsveç" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenya" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ve Jan Mayen Adaları" #. 703 msgid "Slovakia" msgstr "Slovakya" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somali" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome ve Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Suriye" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks ve Kaykos Adaları" #. 148 msgid "Chad" msgstr "Çad" #. 260 msgid "French Southern Territories" msgstr "Güney Fransa Bölgeleri" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tayland" #. 762 msgid "Tajikistan" msgstr "Tacikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Türkmenistan" #. 788 msgid "Tunisia" msgstr "Tunus" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türkiye" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad ve Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tayvan, Çin Eyaleti" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanya, Birleşik Cumhuriyeti" #. 804 msgid "Ukraine" msgstr "Ukrayna" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Küçük Birleşik Devletler adaları" #. 840 msgid "United States" msgstr "Birleşik Devletler" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Özbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sen Vinsınt ve Granadalar" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Adaları, İngiliz" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Adaları, A.B.D." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis ve Futuna Adaları" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Güney Afrika" #. 894 msgid "Zambia" msgstr "Zambiya" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "* tanınmıyor, bu yerleşime bir etiket ekleyin" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Harita Noktası" msgid "Car" msgstr "Araç" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Isa3" msgid "Country" msgstr "Ülke" msgid "Postal" msgstr "Posta" msgid "Town" msgstr "Şehir" msgid "District" msgstr "Bölge" msgid "Street" msgstr "Cadde" msgid "Number" msgstr "Numara" msgid "Enter Destination" msgstr "Hedefi Giriniz" msgid "Zip Code" msgstr "Zip Kodu" msgid "City" msgstr "Şehir" msgid "District/Township" msgstr "Bölge/Mahal" msgid "Map" msgstr "Harita" msgid "Bookmark" msgstr "Yer imi" msgid "Destination" msgstr "Hedef" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Görüntüle" msgid "_Route" msgstr "Rota" msgid "_Former Destinations" msgstr "önceki istikamet" msgid "_Bookmarks" msgstr "Yer İmleri" msgid "_Map" msgstr "Harita" msgid "_Layout" msgstr "Yerleşim" msgid "_Projection" msgstr "İzdüşüm" msgid "_Vehicle" msgstr "Araç" msgid "Zoom_Out" msgstr "Uzaklaştır" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Yakınlaştır" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Yeniden hesapla" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Bilgi" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Dolaşmayı Durdur" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "Çı_kış" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Kapalı yol" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Yol Haritası" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Oto-yaklaş" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Tam Ekran" msgid "Data" msgstr "Veri" msgid "N" msgstr "K" msgid "NE" msgstr "KD" msgid "E" msgstr "D" msgid "SE" msgstr "GD" msgid "S" msgstr "G" msgid "SW" msgstr "GB" msgid "W" msgstr "B" msgid "NW" msgstr "Kuzey-Batı" #. Android resource: @strings/no msgid "No" msgstr "Hayır" msgid "2D" msgstr "2B" msgid "3D" msgstr "3B" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rota %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Rota 0000km 0+00:00 ETA" msgid "Help" msgstr "Yardım" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Tarayıcıda Bak" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Sokaklar" msgid "House numbers" msgstr "Ev numaraları" msgid "View Attributes" msgstr "Özniteliklere Bak" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "İlgi Noktaları" msgid "View on map" msgstr "Haritada bak" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Yer İmleri" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Yerimi ata %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Uydu durumunu göster" msgid " Elevation " msgstr " Yükseklik " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "NMEA verisi göster" msgid "car" msgstr "araba" msgid "bike" msgstr "bisiklet" msgid "pedestrian" msgstr "yaya" #, c-format msgid "Current profile: %s" msgstr "Geçerli profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Yeni profil: %s" msgid "Set as active" msgstr "Etkin olarak ata" msgid "Show Satellite status" msgstr "Uydu durumunuı göster" msgid "Show NMEA data" msgstr "NMEA verisi göster" msgid "Add Bookmark" msgstr "Yer İmi Ekle" msgid "Rename" msgstr "" msgid "About Navit" msgstr "Navit Hakkında" #. Authors msgid "By" msgstr "Yazar" #. Contributors msgid "And all the Navit Team" msgstr "Ve tüm Navit takımı" msgid "members and contributors." msgstr "üyeler ve katkıda bulunanlar." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Araç" msgid "Rules" msgstr "Kurallar" msgid "Lock on road" msgstr "Yola Kilitlen" msgid "Northing" msgstr "Kuzey mesafesi" msgid "Map follows Vehicle" msgstr "Harita aracı takip etsin" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Haritalar" msgid "Layout" msgstr "Yerleşim" msgid "Height Profile" msgstr "Yükseklik Profili" msgid "Route Description" msgstr "Rota Açıklaması" msgid "Show Locale" msgstr "Yerel Ayarlar" msgid "Former Destinations" msgstr "önceki istikamet" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mesaj" msgid "Back" msgstr "Geri" msgid "Back to map" msgstr "Haritaya dön" msgid "Main Menu" msgstr "Ana Menü" msgid "House number" msgstr "Ev no:" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Araç Konumu" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Ana menü" msgid "" "Show\n" "Map" msgstr "Haritayı Göster" msgid "Settings" msgstr "Ayarlar" msgid "Tools" msgstr "Araçlar" msgid "Route" msgstr "Rota" msgid "About" msgstr "Hakkında" msgid "Actions" msgstr "Eylemler" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Çık" msgid "" "Stop\n" "Navigation" msgstr "" "Navigasyonu\n" "Durdur" msgid "Display" msgstr "Görüntüle" msgid "Fullscreen" msgstr "Tam Ekran" msgid "Window Mode" msgstr "Pencere Modu" msgid "Description" msgstr "Açıklama" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "at" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "%s içerisinde kavşağa girin" #~ msgid "Cursor" #~ msgstr "İmleç" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d kilometre" navit-0.5.0~svn5643+dfsg.1/po/uk.po.in000066400000000000000000001221641221777731700172100ustar00rootroot00000000000000# Ukrainian translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # serg_stetsuk 2009. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-05-28 14:54+0000\n" "Last-Translator: andygol \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Запуск з початкового каталогу\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "настройка '%s' до '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нульовий" msgid "first" msgstr "перший" msgid "second" msgstr "другий" msgid "third" msgstr "третій" msgid "fourth" msgstr "четвертий" msgid "fifth" msgstr "п’ятий" msgid "sixth" msgstr "шостий" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нульовий виїзд" msgid "first exit" msgstr "перший виїзд" msgid "second exit" msgstr "другий виїзд" msgid "third exit" msgstr "третій виїзд" msgid "fourth exit" msgstr "четвертий виїзд" msgid "fifth exit" msgstr "п’ятий виїзд" msgid "sixth exit" msgstr "шостий виїзд" #, c-format msgid "%d m" msgstr "%d м" #, c-format msgid "in %d m" msgstr "за %d м" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d метрів" #, c-format msgid "in %d meters" msgstr "за %d метрів" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d кілометрів" #, c-format msgid "in %d.%d kilometers" msgstr "за %d.%d кілометрів" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" msgstr[2] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d кілометр" msgstr[1] "%d кілометри" msgstr[2] "%d кілометрів" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "за %d кілометр" msgstr[1] "за %d кілометри" msgstr[2] "за %d кілометрів" msgid "exit" msgstr "виїзд" msgid "into the ramp" msgstr "з'їзд на" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s на вулицю %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s на %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s на %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s на %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s в %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "праворуч" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "ліворуч" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "легко " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "круто " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "дуже круто " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "невідомо " msgid "When possible, please turn around" msgstr "Якщо це можливо, то розверніться" msgid "Enter the roundabout soon" msgstr "Скоро виїзд на дорогу з кільцевим рухом" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "тоді виїдьте з кільця через %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Виїдьте з кільця через %s" #, c-format msgid "Follow the road for the next %s" msgstr "Їдьте дорогою наступні %s" msgid "soon" msgstr "скоро" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "З’їдьте на дорогу %1$s до %2$s" #, c-format msgid "after %i roads" msgstr "після %i дороги" msgid "now" msgstr "зараз" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "тоді виїдьте на доргу %1$s до %2$s" msgid "error" msgstr "помилка" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Поверніть на %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "тоді поверніть на %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Ви досягли місця призначення %s" msgid "then you have reached your destination." msgstr "і тоді Ви прибудете в місце призначення." #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиція" msgid "Command" msgstr "Команда" msgid "Length" msgstr "Довжина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Час" msgid "Destination Length" msgstr "Відстань до місця призначення" msgid "Destination Time" msgstr "Час до місця призначення" msgid "Roadbook" msgstr "Атлас доріг" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Встановити як початкове положення" msgid "Set as destination" msgstr "Встановити як місце призначення" msgid "Add as bookmark" msgstr "Додати як закладку" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Координати екрану: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Об’єднані Арабські Емірати" #. 004 msgid "Afghanistan" msgstr "Афганістан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигуа і Барбуда" #. 660 msgid "Anguilla" msgstr "Ангілья" #. 008 msgid "Albania" msgstr "Албанія" #. 051 msgid "Armenia" msgstr "Вірменія" #. 530 msgid "Netherlands Antilles" msgstr "Антильські острови (Нідерланди)" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Американське Самоа" #. 040 msgid "Austria" msgstr "Австрія" #. 036 msgid "Australia" msgstr "Австралія" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Аландські острови" #. 031 msgid "Azerbaijan" msgstr "Азербайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Боснія і Герцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Бельгія" #. 854 msgid "Burkina Faso" msgstr "Буркіна Фасо" #. 100 msgid "Bulgaria" msgstr "Болгарія" #. 048 msgid "Bahrain" msgstr "Бахрейн" #. 108 msgid "Burundi" msgstr "Бурунді" #. 204 msgid "Benin" msgstr "Бенін" #. 652 msgid "Saint Barthelemy" msgstr "Сен Бартельмі" #. 060 msgid "Bermuda" msgstr "Бермудські острови" #. 096 msgid "Brunei Darussalam" msgstr "Бруней-Даруссалам" #. 068 msgid "Bolivia" msgstr "Болівія" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразілія" #. 044 msgid "Bahamas" msgstr "Багамські острови" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Острів Буве" #. 072 msgid "Botswana" msgstr "Ботсвана" #. 112 msgid "Belarus" msgstr "Білорусь" #. 084 msgid "Belize" msgstr "Беліз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосові острови" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Конго, Демократична Республіка" #. 140 msgid "Central African Republic" msgstr "Центрально-Африканська Республіка" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швейцарія" #. 384 msgid "Cote d'Ivoire" msgstr "Кот д’Івуар" #. 184 msgid "Cook Islands" msgstr "Острови Кука" #. 152 msgid "Chile" msgstr "Чілі" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Китай" #. 170 msgid "Colombia" msgstr "Колумбія" #. 188 msgid "Costa Rica" msgstr "Коста Ріка" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кабо-Верде" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Острів Різдва" #. 196 msgid "Cyprus" msgstr "Кіпр" #. 203 msgid "Czech Republic" msgstr "Чеська Республіка" #. 276 msgid "Germany" msgstr "Німеччина" #. 262 msgid "Djibouti" msgstr "Джибуті" #. 208 msgid "Denmark" msgstr "Данія" #. 212 msgid "Dominica" msgstr "Домініка" #. 214 msgid "Dominican Republic" msgstr "Домініканська республіка" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естонія" #. 818 msgid "Egypt" msgstr "Єгипет" #. 732 msgid "Western Sahara" msgstr "Західна Сахара" #. 232 msgid "Eritrea" msgstr "Еритрея" #. 724 msgid "Spain" msgstr "Іспанія" #. 231 msgid "Ethiopia" msgstr "Ефіопія" #. 246 msgid "Finland" msgstr "Фінляндія" #. 242 msgid "Fiji" msgstr "Фіджі" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендські острови (Британія)" #. 583 msgid "Micronesia, Federated States of" msgstr "Мікронезія, федеративні штати" #. 234 msgid "Faroe Islands" msgstr "Фарерські острови" #. 250 msgid "France" msgstr "Франція" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Об’єднане Королівство (Великобританія)" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузія" #. 254 msgid "French Guiana" msgstr "Французька Гвіана" #. 831 msgid "Guernsey" msgstr "Гернсі" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гібралтар" #. 304 msgid "Greenland" msgstr "Гренландія" #. 270 msgid "Gambia" msgstr "Гамбія" #. 324 msgid "Guinea" msgstr "Гвінея" #. 312 msgid "Guadeloupe" msgstr "Гваделупа" #. 226 msgid "Equatorial Guinea" msgstr "Екваторіальна Гвінея" #. 300 msgid "Greece" msgstr "Греція" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Південна Джорджія та Південні Сандвічеві Острови" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвінея-Біссау" #. 328 msgid "Guyana" msgstr "Гайана" #. 344 msgid "Hong Kong" msgstr "Гонконг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Острів Херд і Острови Макдональд" #. 340 msgid "Honduras" msgstr "Гондурас" #. 191 msgid "Croatia" msgstr "Хорватія" #. 332 msgid "Haiti" msgstr "Гаїті" #. 348 msgid "Hungary" msgstr "Угорщина" #. 360 msgid "Indonesia" msgstr "Індонезія" #. 372 msgid "Ireland" msgstr "Ірландія" #. 376 msgid "Israel" msgstr "Ізраїль" #. 833 msgid "Isle of Man" msgstr "Острів Мен" #. 356 msgid "India" msgstr "Індія" #. 086 msgid "British Indian Ocean Territory" msgstr "Британські території у Індійському океані" #. 368 msgid "Iraq" msgstr "Ірак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Іран, Ісламська Республіка" #. 352 msgid "Iceland" msgstr "Ісландія" #. 380 msgid "Italy" msgstr "Італія" #. 832 msgid "Jersey" msgstr "Джерсі" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Йорданія" #. 392 msgid "Japan" msgstr "Японія" #. 404 msgid "Kenya" msgstr "Кенія" #. 417 msgid "Kyrgyzstan" msgstr "Киргизстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кірибаті" #. 174 msgid "Comoros" msgstr "Коморські острови" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сент-Кіттс і Невіс" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Корея, Демократична Республіка" #. 410 msgid "Korea, Republic of" msgstr "Корея, Республіка" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Кайманові острови" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаоська Народно-Демократична Республіка" #. 422 msgid "Lebanon" msgstr "Ліван" #. 662 msgid "Saint Lucia" msgstr "Санта Лючія" #. 438 msgid "Liechtenstein" msgstr "Ліхтенштейн" #. 144 msgid "Sri Lanka" msgstr "Шрі Ланка" #. 430 msgid "Liberia" msgstr "Ліберія" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвія" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Лівійська Арабська Джамахірія" #. 504 msgid "Morocco" msgstr "Марокко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Республіка Молдова" #. 499 msgid "Montenegro" msgstr "Чорногорія" #. 663 msgid "Saint Martin (French part)" msgstr "Сен-Мартен (французька частина)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршаллові Острови" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонія, колишня республіка Югославії" #. 466 msgid "Mali" msgstr "Малі" #. 104 msgid "Myanmar" msgstr "М'янма" #. 496 msgid "Mongolia" msgstr "Монголія" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Північні Маріанські Острови" #. 474 msgid "Martinique" msgstr "Мартиніка" #. 478 msgid "Mauritania" msgstr "Мавританія" #. 500 msgid "Montserrat" msgstr "Монтсеррат" #. 470 msgid "Malta" msgstr "Мальта" #. 480 msgid "Mauritius" msgstr "Маврикій" #. 462 msgid "Maldives" msgstr "Мальдиви" #. 454 msgid "Malawi" msgstr "Малаві" #. 484 msgid "Mexico" msgstr "Мексика" #. 458 msgid "Malaysia" msgstr "Малайзія" #. 508 msgid "Mozambique" msgstr "Мозамбік" #. 516 msgid "Namibia" msgstr "Намібія" #. 540 msgid "New Caledonia" msgstr "Нова Каледонія" #. 562 msgid "Niger" msgstr "Нігер" #. 574 msgid "Norfolk Island" msgstr "Норфолкські острови" #. 566 msgid "Nigeria" msgstr "Нігерія" #. 558 msgid "Nicaragua" msgstr "Нікарагуа" #. 528 msgid "Netherlands" msgstr "Нідерланди" #. 578 msgid "Norway" msgstr "Норвегія" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ніуе" #. 554 msgid "New Zealand" msgstr "Нова Зеландія" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Французька Полінезія" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвінея" #. 608 msgid "Philippines" msgstr "Філіппіни" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Польща" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Сен-П'єр і Мікелон" #. 612 msgid "Pitcairn" msgstr "Піткерн" #. 630 msgid "Puerto Rico" msgstr "Пуерто Ріко" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Окуповані Палестинські Території" #. 620 msgid "Portugal" msgstr "Португалія" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реюньйон" #. 642 msgid "Romania" msgstr "Румунія" #. 688 msgid "Serbia" msgstr "Сербія" #. 643 msgid "Russian Federation" msgstr "Російська Федерація" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудівська Аравія" #. 090 msgid "Solomon Islands" msgstr "Соломонові острови" #. 690 msgid "Seychelles" msgstr "Сейшельські острови" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швеція" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Острів Святої Єлени" #. 705 msgid "Slovenia" msgstr "Словенія" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Острови Свальбард та Ян-Маєн" #. 703 msgid "Slovakia" msgstr "Словаччина" #. 694 msgid "Sierra Leone" msgstr "Сьєрра-Леоне" #. 674 msgid "San Marino" msgstr "Сан Маріно" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалі" #. 740 msgid "Suriname" msgstr "Сурінам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сан-Томе і Принсипі" #. 222 msgid "El Salvador" msgstr "Сальвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сирійська Арабська Республіка" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Острови Теркс і Кайкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Французькі Південні Території" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Таїланд" #. 762 msgid "Tajikistan" msgstr "Таджикістан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Східний Тімор" #. 795 msgid "Turkmenistan" msgstr "Туркменістан" #. 788 msgid "Tunisia" msgstr "Тунізія" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Туреччина" #. 780 msgid "Trinidad and Tobago" msgstr "Тринідад і Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Иайвань, провінція Китаю" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзанія, Об’єднана Республіка" #. 804 msgid "Ukraine" msgstr "Україна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Сполучені Штати Малих Віддалених Островів" #. 840 msgid "United States" msgstr "Сполучені Штати Америки" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекістан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Святий Престіл (Ватикан, Місто-Держава)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сент-Вінсент і Гренадини" #. 862 msgid "Venezuela" msgstr "Венесуела" #. 092 msgid "Virgin Islands, British" msgstr "Віргінські острови (Британія)" #. 850 msgid "Virgin Islands, U.S." msgstr "Віргінські острови (США)" #. 704 msgid "Viet Nam" msgstr "В’єтнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Уолліс і Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Йемен" #. 175 msgid "Mayotte" msgstr "Майотта" #. 710 msgid "South Africa" msgstr "Південна Африка" #. 894 msgid "Zambia" msgstr "Замбія" #. 716 msgid "Zimbabwe" msgstr "Зімбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "Новідомо, додайте is_in теґ до цих міст" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карті" msgid "Car" msgstr "Машина" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Країна" msgid "Postal" msgstr "Поштова адреса" msgid "Town" msgstr "Місто" msgid "District" msgstr "Округ" msgid "Street" msgstr "Вулиця" msgid "Number" msgstr "Номер" msgid "Enter Destination" msgstr "Введіть пункт призначення" msgid "Zip Code" msgstr "Поштовий індекс" msgid "City" msgstr "Місто" msgid "District/Township" msgstr "Округ/Селище" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Закладка" msgid "Destination" msgstr "Пункт призначення" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Показати" msgid "_Route" msgstr "Дорога" msgid "_Former Destinations" msgstr "Минулий пункт призначення" msgid "_Bookmarks" msgstr "Закладки" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Розкладка" msgid "_Projection" msgstr "Проекція" msgid "_Vehicle" msgstr "Транспортний засіб" msgid "Zoom_Out" msgstr "Зменшити" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Збільшити" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Перерахувати" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Інформація" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Зупинити навігацію" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Вийти" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Триматися дороги" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Атлас доріг" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Авторозмір" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "На весь екран" msgid "Data" msgstr "Дата" msgid "N" msgstr "Пн" msgid "NE" msgstr "ПнСх" msgid "E" msgstr "Сх" msgid "SE" msgstr "ПдСх" msgid "S" msgstr "Пд" msgid "SW" msgstr "ПдЗ" msgid "W" msgstr "З" msgid "NW" msgstr "ПнЗ" #. Android resource: @strings/no msgid "No" msgstr "№" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Інший" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Дорога %4.0fкм %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Дорога 0000км 0+00:00 ETA" msgid "Help" msgstr "Допомога" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Показати в переглядачі" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Вулиці" msgid "House numbers" msgstr "Номери будинків" msgid "View Attributes" msgstr "Показати атрибути" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Інформація про об’єкти" msgid "View on map" msgstr "Показати на карті" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Вирізати закладку" msgid "Copy Bookmark" msgstr "Копіювати закладку" msgid "Rename Bookmark" msgstr "Перейменувати закладку" msgid "Paste Bookmark" msgstr "Вставити закладку" msgid "Delete Bookmark" msgstr "Вилучити закладку" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Закладки" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Додати папку закладок" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Вставити закладку" #, c-format msgid "Bookmark %s" msgstr "Закладка %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Показати статус супутника" msgid " Elevation " msgstr " Висота " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Показати дані NMEA" msgid "car" msgstr "автомобіль" msgid "bike" msgstr "велосипед" msgid "pedestrian" msgstr "пішохід" #, c-format msgid "Current profile: %s" msgstr "Поточний профіль: %s" #, c-format msgid "Change profile to: %s" msgstr "Змінити профіль на: %s" msgid "Set as active" msgstr "Встановити активним" msgid "Show Satellite status" msgstr "Показати статус супутника" msgid "Show NMEA data" msgstr "Показати дані NMEA" msgid "Add Bookmark" msgstr "Додати закладку" msgid "Rename" msgstr "Перейменувати" msgid "About Navit" msgstr "Про Navit" #. Authors msgid "By" msgstr "від" #. Contributors msgid "And all the Navit Team" msgstr "Все про Navit Team" msgid "members and contributors." msgstr "члени та учасникі." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Транспортний засіб" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Триматися дороги" msgid "Northing" msgstr "Північніше" msgid "Map follows Vehicle" msgstr "Карта слідує за транспортним засобом" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Карти" msgid "Layout" msgstr "Розкладка" msgid "Height Profile" msgstr "Профіль висот" msgid "Route Description" msgstr "Опис маршруту" msgid "Show Locale" msgstr "Перевірити локалізацію" msgid "Former Destinations" msgstr "Минулий пункт призначення" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Повідомлення" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Повернутися до карти" msgid "Main Menu" msgstr "Головне меню" msgid "House number" msgstr "Номер будинку" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Положення транспорту" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Головне меню" msgid "" "Show\n" "Map" msgstr "" "Показати\n" "Карту" msgid "Settings" msgstr "Настройки" msgid "Tools" msgstr "Інструменти" msgid "Route" msgstr "Дорога" msgid "About" msgstr "Про програму..." msgid "Actions" msgstr "Дія" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Вийти" msgid "" "Stop\n" "Navigation" msgstr "" "Зупинити\n" "Навігацію" msgid "Display" msgstr "Показати" msgid "Fullscreen" msgstr "На весь екран" msgid "Window Mode" msgstr "Режим вікна" msgid "Description" msgstr "Опис" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "кінь" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Через %s виїзд на дорогу з кільцевим рухом" #~ msgid "Cursor" #~ msgstr "Курсор" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d кілометрів" navit-0.5.0~svn5643+dfsg.1/po/ur.po.in000066400000000000000000001167461221777731700172300ustar00rootroot00000000000000# Urdu translation for navit # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the navit package. # asghar, 2010 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2010-11-14 14:11+0000\n" "Last-Translator: asghar \n" "Language-Team: Urdu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-11-21 21:04+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "سورس ڈایرکٹری سے چلا ر ہے ہیں\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ترتیب '%s' سے '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "صفر سے" msgid "first" msgstr "پہلا" msgid "second" msgstr "دوسرا" msgid "third" msgstr "تیسرا" msgid "fourth" msgstr "چوتھا" msgid "fifth" msgstr "پانچواں" msgid "sixth" msgstr "چھٹا" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "صفر سے خارج" msgid "first exit" msgstr "پہلا اخراج" msgid "second exit" msgstr "دوسرا اخراج" msgid "third exit" msgstr "تیسرا اخراج" msgid "fourth exit" msgstr "چوتھا اخراج" msgid "fifth exit" msgstr "پانچواں اخراج" msgid "sixth exit" msgstr "چھٹا اخراج" #, c-format msgid "%d m" msgstr "%d میٹر" #, c-format msgid "in %d m" msgstr "%d میٹر میں" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d میٹر" #, c-format msgid "in %d meters" msgstr "%d میٹر میں" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d کلومیٹر" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d کلومیٹر میں" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ایک کلومیٹر" msgstr[1] "%d کلومیٹر" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ایک کلومیٹر میں" msgstr[1] "%d کلومیٹر میں" msgid "exit" msgstr "اخراج" msgid "into the ramp" msgstr "ڈھلان میں" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s سڑک میں سے %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s میں سے %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s میں سے %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s میں سے %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sپر %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "دایئں" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "بایئں" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "آسانی سے " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "سختی سے " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "انتہایَ سختی سے " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "نا معلوم " msgid "When possible, please turn around" msgstr "جب ممکن ہو گھومیں" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "پھر گول چوراہے کو %s پے چھوڑ دیں" #, c-format msgid "Leave the roundabout at the %s" msgstr "گول چوراہے کو %s پے چھوڑ دیں" #, c-format msgid "Follow the road for the next %s" msgstr "%s تک سڑک کے مطابق جایئں" msgid "soon" msgstr "جلد ہی" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "سڑک تک %1$s سے %2$s" #, c-format msgid "after %i roads" msgstr "%i سڑکوں کے بعد" msgid "now" msgstr "اب" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "پھر %1$s لے کر %2$s تک جائیں" msgid "error" msgstr "غلطی" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%1$s%2$s %3$s%4$s گومیں" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "%1$s%2$s %3$s%4$s پھر گومیں" #, c-format msgid "You have reached your destination %s" msgstr "آپ اپنی منزل %s پے پہنچ کئے ہیں" msgid "then you have reached your destination." msgstr "پھر آپ اپنی منزل پہ پہنچ جایئں گے" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "مقام" msgid "Command" msgstr "کمانڈ" msgid "Length" msgstr "لمبایئ" msgid "km" msgstr "کلومیٹر" msgid "m" msgstr "میٹر" msgid "Time" msgstr "وقت" msgid "Destination Length" msgstr "منزل تک دوری" msgid "Destination Time" msgstr "منزل تک وقت" msgid "Roadbook" msgstr "روڈ بک" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "بطور موجودہ مقام انتخاب" msgid "Set as destination" msgstr "بطور منزل انتخاب" msgid "Add as bookmark" msgstr "بک مارک میں محفوظ کریں" #, c-format msgid "Point 0x%x 0x%x" msgstr "0x%x 0x%x مقام" #, c-format msgid "Screen coord : %d %d" msgstr "سکرین کورڈینیٹ : %d %d" #. 020 msgid "Andorra" msgstr "اندوررا" #. 784 msgid "United Arab Emirates" msgstr "متحدہ عرب امارات" #. 004 msgid "Afghanistan" msgstr "افغانستان" #. 028 msgid "Antigua and Barbuda" msgstr "انٹگووا اور باربوڈا" #. 660 msgid "Anguilla" msgstr "انگویلا" #. 008 msgid "Albania" msgstr "البانیا" #. 051 msgid "Armenia" msgstr "ارمینیا" #. 530 msgid "Netherlands Antilles" msgstr "نیدرلینڈز انٹیلس" #. 024 msgid "Angola" msgstr "انگولا" #. 010 msgid "Antarctica" msgstr "انٹارٹیکا" #. 032 msgid "Argentina" msgstr "ارجنٹینا" #. 016 msgid "American Samoa" msgstr "امیریکن ساموا" #. 040 msgid "Austria" msgstr "آسٹریا" #. 036 msgid "Australia" msgstr "آسٹریلیا" #. 533 msgid "Aruba" msgstr "آروبا" #. 248 msgid "Aland Islands" msgstr "آلینڈ آئسلینڈ" #. 031 msgid "Azerbaijan" msgstr "آذر بائجان" #. 070 msgid "Bosnia and Herzegovina" msgstr "بوسنیا حرذےگوینیا" #. 052 msgid "Barbados" msgstr "باربادوس" #. 050 msgid "Bangladesh" msgstr "بنگلادیش" #. 056 msgid "Belgium" msgstr "بلجیئم" #. 854 msgid "Burkina Faso" msgstr "برکینا فازو" #. 100 msgid "Bulgaria" msgstr "بلغاریہ" #. 048 msgid "Bahrain" msgstr "بحرین" #. 108 msgid "Burundi" msgstr "برنڈی" #. 204 msgid "Benin" msgstr "بینن" #. 652 msgid "Saint Barthelemy" msgstr "سینٹ باتھیلیمی" #. 060 msgid "Bermuda" msgstr "برمودا" #. 096 msgid "Brunei Darussalam" msgstr "برونائی دارالسلام" #. 068 msgid "Bolivia" msgstr "بولیویا" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "برازیل" #. 044 msgid "Bahamas" msgstr "بھاماس" #. 064 msgid "Bhutan" msgstr "بھوٹان" #. 074 msgid "Bouvet Island" msgstr "بووٹ آئیسلیڈ" #. 072 msgid "Botswana" msgstr "بوٹسوانا" #. 112 msgid "Belarus" msgstr "بیلارس" #. 084 msgid "Belize" msgstr "بلیذ" #. 124 msgid "Canada" msgstr "کینیڈا" #. 166 msgid "Cocos (Keeling) Islands" msgstr "کوکوس آئیسلینڈز" #. 180 msgid "Congo, Democratic Republic of the" msgstr "کونگو ڈیموکریٹک" #. 140 msgid "Central African Republic" msgstr "مرکزی جمہوریہ افریقہ" #. 178 msgid "Congo" msgstr "کونگو" #. 756 msgid "Switzerland" msgstr "سوئیزرلینڈ" #. 384 msgid "Cote d'Ivoire" msgstr "کوٹے ڈلوویر" #. 184 msgid "Cook Islands" msgstr "کک آئیسلینڈ" #. 152 msgid "Chile" msgstr "چیلی" #. 120 msgid "Cameroon" msgstr "کامیرون" #. 156 msgid "China" msgstr "چین" #. 170 msgid "Colombia" msgstr "کولمبیا" #. 188 msgid "Costa Rica" msgstr "کوسٹا ریکا" #. 192 msgid "Cuba" msgstr "کیوبا" #. 132 msgid "Cape Verde" msgstr "کاپے ویردے" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "کرسمس آئیسلینڈ" #. 196 msgid "Cyprus" msgstr "سائپرس" #. 203 msgid "Czech Republic" msgstr "چیک ریپبلک" #. 276 msgid "Germany" msgstr "جرمن" #. 262 msgid "Djibouti" msgstr "ڈیجیبوٹی" #. 208 msgid "Denmark" msgstr "ڈنمارک" #. 212 msgid "Dominica" msgstr "ڈومینیکا" #. 214 msgid "Dominican Republic" msgstr "ڈومینیکن ریپبلک" #. 012 msgid "Algeria" msgstr "الجیریا" #. 218 msgid "Ecuador" msgstr "ایکواڈور" #. 233 msgid "Estonia" msgstr "استونیا" #. 818 msgid "Egypt" msgstr "مصر" #. 732 msgid "Western Sahara" msgstr "مغربی سحارا" #. 232 msgid "Eritrea" msgstr "اریٹیریا" #. 724 msgid "Spain" msgstr "سپین" #. 231 msgid "Ethiopia" msgstr "ایتھوپیا" #. 246 msgid "Finland" msgstr "فنلینڈ" #. 242 msgid "Fiji" msgstr "فیجی" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "فیکلینڈ آئیسلینڈ" #. 583 msgid "Micronesia, Federated States of" msgstr "میکرونیسیا فیڈرل سٹیٹ" #. 234 msgid "Faroe Islands" msgstr "فاروے آئیسلینڈز" #. 250 msgid "France" msgstr "فرانس" #. 266 msgid "Gabon" msgstr "گابون" #. 826 msgid "United Kingdom" msgstr "برطانیا" #. 308 msgid "Grenada" msgstr "گریناڈا" #. 268 msgid "Georgia" msgstr "جورجیا" #. 254 msgid "French Guiana" msgstr "فرینچ گویانا" #. 831 msgid "Guernsey" msgstr "گویرنسے" #. 288 msgid "Ghana" msgstr "گھانا" #. 292 msgid "Gibraltar" msgstr "جبرالٹر" #. 304 msgid "Greenland" msgstr "گرینلینڈ" #. 270 msgid "Gambia" msgstr "گامبیا" #. 324 msgid "Guinea" msgstr "گوینیا" #. 312 msgid "Guadeloupe" msgstr "گوادیلوپے" #. 226 msgid "Equatorial Guinea" msgstr "ایکواٹوریال گوینا" #. 300 msgid "Greece" msgstr "یونان" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "جنوبی جورجیا اور جنوبی سنڈوچ آئیسلینڈ" #. 320 msgid "Guatemala" msgstr "گوئٹیمالا" #. 316 msgid "Guam" msgstr "گوام" #. 624 msgid "Guinea-Bissau" msgstr "گواینیا-بیسساو" #. 328 msgid "Guyana" msgstr "گویانا" #. 344 msgid "Hong Kong" msgstr "ہانگ کانگ" #. 334 msgid "Heard Island and McDonald Islands" msgstr "ھیرڈ آئیسلینڈ اور میکڈونلڈ آئیسلینڈس" #. 340 msgid "Honduras" msgstr "حونڈورس" #. 191 msgid "Croatia" msgstr "کروشیا" #. 332 msgid "Haiti" msgstr "حایٹی" #. 348 msgid "Hungary" msgstr "ھنگری" #. 360 msgid "Indonesia" msgstr "انڈونیشیا" #. 372 msgid "Ireland" msgstr "آئرلینڈ" #. 376 msgid "Israel" msgstr "اسرائیل" #. 833 msgid "Isle of Man" msgstr "ایسلے آف مین" #. 356 msgid "India" msgstr "ہندوستان" #. 086 msgid "British Indian Ocean Territory" msgstr "برٹش انڈین اوشین ٹریٹوری" #. 368 msgid "Iraq" msgstr "عراق" #. 364 msgid "Iran, Islamic Republic of" msgstr "ایران ، اسلامی جمہوریہ" #. 352 msgid "Iceland" msgstr "آئیسلینڈ" #. 380 msgid "Italy" msgstr "اٹلی" #. 832 msgid "Jersey" msgstr "جرسی" #. 388 msgid "Jamaica" msgstr "جامائیکا" #. 400 msgid "Jordan" msgstr "اردن" #. 392 msgid "Japan" msgstr "جاپان" #. 404 msgid "Kenya" msgstr "کینیا" #. 417 msgid "Kyrgyzstan" msgstr "کرگزستان" #. 116 msgid "Cambodia" msgstr "کمبوڈیا" #. 296 msgid "Kiribati" msgstr "کیریباٹی" #. 174 msgid "Comoros" msgstr "کوموروس" #. 659 msgid "Saint Kitts and Nevis" msgstr "سینٹ کٹس اور نوس" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "کوریا ، ڈیموکریٹک" #. 410 msgid "Korea, Republic of" msgstr "کوریا، عوامی" #. 414 msgid "Kuwait" msgstr "کویت" #. 136 msgid "Cayman Islands" msgstr "کایمین آئیسلینڈز" #. 398 msgid "Kazakhstan" msgstr "کزاکستان" #. 418 msgid "Lao People's Democratic Republic" msgstr "لاو عوامی جمہوری ڈیموکریٹک" #. 422 msgid "Lebanon" msgstr "لبنان" #. 662 msgid "Saint Lucia" msgstr "سینٹ لوچیا" #. 438 msgid "Liechtenstein" msgstr "لیخٹنسخٹین" #. 144 msgid "Sri Lanka" msgstr "سری لنکا" #. 430 msgid "Liberia" msgstr "لیبیریا" #. 426 msgid "Lesotho" msgstr "لیسودو" #. 440 msgid "Lithuania" msgstr "لیتھوانیا" #. 442 msgid "Luxembourg" msgstr "لیسمبرگ" #. 428 msgid "Latvia" msgstr "لاتویا" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "لیبیان عرب جمعحیریا" #. 504 msgid "Morocco" msgstr "مراکش" #. 492 msgid "Monaco" msgstr "موناکو" #. 498 msgid "Moldova, Republic of" msgstr "مولدوا، عوامی" #. 499 msgid "Montenegro" msgstr "مونٹے نیگرو" #. 663 msgid "Saint Martin (French part)" msgstr "سینٹ مارٹن فرانسیسی حصہ" #. 450 msgid "Madagascar" msgstr "ماڈاگاسکر" #. 584 msgid "Marshall Islands" msgstr "مارشل آئیسلینڈ" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "ماچیدونیا" #. 466 msgid "Mali" msgstr "مالی" #. 104 msgid "Myanmar" msgstr "میانمار" #. 496 msgid "Mongolia" msgstr "مونگولیا" #. 446 msgid "Macao" msgstr "ماکاؤ" #. 580 msgid "Northern Mariana Islands" msgstr "شمالی ماریانا آئیسلینڈز" #. 474 msgid "Martinique" msgstr "مارٹینیقئے" #. 478 msgid "Mauritania" msgstr "ماوریتانیا" #. 500 msgid "Montserrat" msgstr "ماؤنٹسیراٹ" #. 470 msgid "Malta" msgstr "مالٹا" #. 480 msgid "Mauritius" msgstr "ماؤریٹیوس" #. 462 msgid "Maldives" msgstr "مالدیپ" #. 454 msgid "Malawi" msgstr "مالاوی" #. 484 msgid "Mexico" msgstr "میکسیکو" #. 458 msgid "Malaysia" msgstr "مالائیشیا" #. 508 msgid "Mozambique" msgstr "موزمبیک" #. 516 msgid "Namibia" msgstr "نمیبیا" #. 540 msgid "New Caledonia" msgstr "نیو کالیدونیا" #. 562 msgid "Niger" msgstr "نیگر" #. 574 msgid "Norfolk Island" msgstr "نورفوک آئیسلینڈ" #. 566 msgid "Nigeria" msgstr "نائجیریا" #. 558 msgid "Nicaragua" msgstr "نکاراگوا" #. 528 msgid "Netherlands" msgstr "ہالینڈ" #. 578 msgid "Norway" msgstr "ناروے" #. 524 msgid "Nepal" msgstr "نیپال" #. 520 msgid "Nauru" msgstr "ناؤرو" #. 570 msgid "Niue" msgstr "نیوئے" #. 554 msgid "New Zealand" msgstr "نیوزیلینڈ" #. 512 msgid "Oman" msgstr "عمان" #. 591 msgid "Panama" msgstr "پاناما" #. 604 msgid "Peru" msgstr "پیرو" #. 258 msgid "French Polynesia" msgstr "فرنچ پولینسیا" #. 598 msgid "Papua New Guinea" msgstr "پاپوا نیو گویبیا" #. 608 msgid "Philippines" msgstr "فلپائن" #. 586 msgid "Pakistan" msgstr "پاکستان" #. 616 msgid "Poland" msgstr "پولینڈ" #. 666 msgid "Saint Pierre and Miquelon" msgstr "سینٹ پیعرر اور میقوئےلون" #. 612 msgid "Pitcairn" msgstr "پٹکائرن" #. 630 msgid "Puerto Rico" msgstr "پوئرٹو ریکو" #. 275 msgid "Palestinian Territory, Occupied" msgstr "فلسطین" #. 620 msgid "Portugal" msgstr "پرتگال" #. 585 msgid "Palau" msgstr "پالاؤ" #. 600 msgid "Paraguay" msgstr "پیراگوائے" #. 634 msgid "Qatar" msgstr "قطر" #. 638 msgid "Reunion" msgstr "ریونین" #. 642 msgid "Romania" msgstr "رومانیا" #. 688 msgid "Serbia" msgstr "سربیا" #. 643 msgid "Russian Federation" msgstr "روس" #. 646 msgid "Rwanda" msgstr "روانڈا" #. 682 msgid "Saudi Arabia" msgstr "سعودی عرب" #. 090 msgid "Solomon Islands" msgstr "سولومون آئیسلینڈز" #. 690 msgid "Seychelles" msgstr "سعیچیلز" #. 736 msgid "Sudan" msgstr "سوڈان" #. 752 msgid "Sweden" msgstr "سویڈن" #. 702 msgid "Singapore" msgstr "سنگاپور" #. 654 msgid "Saint Helena" msgstr "سیٹ حیلنا" #. 705 msgid "Slovenia" msgstr "سلوینیا" #. 744 msgid "Svalbard and Jan Mayen" msgstr "سویلبرڈ اور جان میان" #. 703 msgid "Slovakia" msgstr "سلواکیہ" #. 694 msgid "Sierra Leone" msgstr "سیعرا لیعون" #. 674 msgid "San Marino" msgstr "سان مارینو" #. 686 msgid "Senegal" msgstr "سینیگال" #. 706 msgid "Somalia" msgstr "صومالیہ" #. 740 msgid "Suriname" msgstr "سرینیم" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "ساو ٹوم اور پرینسپ" #. 222 msgid "El Salvador" msgstr "ال سالواڈور" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "ال سالواڈور" #. 748 msgid "Swaziland" msgstr "سوازیلینڈ" #. 796 msgid "Turks and Caicos Islands" msgstr "ٹرکس اور کایکس آئیسلینڈز" #. 148 msgid "Chad" msgstr "چاڈ" #. 260 msgid "French Southern Territories" msgstr "فرینچ جنوبی علاقہ جات" #. 768 msgid "Togo" msgstr "ٹوگو" #. 764 msgid "Thailand" msgstr "تھائی لینڈ" #. 762 msgid "Tajikistan" msgstr "تاجکستان" #. 772 msgid "Tokelau" msgstr "ٹوکلاؤ" #. 626 msgid "Timor-Leste" msgstr "ٹیمور-لیسٹے" #. 795 msgid "Turkmenistan" msgstr "ترکمانستان" #. 788 msgid "Tunisia" msgstr "تونس" #. 776 msgid "Tonga" msgstr "ٹونگا" #. 792 msgid "Turkey" msgstr "ترکی" #. 780 msgid "Trinidad and Tobago" msgstr "ٹرینیداد اور ٹوباگو" #. 798 msgid "Tuvalu" msgstr "ٹوالا" #. 158 msgid "Taiwan, Province of China" msgstr "تائیوان چائینہ کا صوبہ" #. 834 msgid "Tanzania, United Republic of" msgstr "تنزانیہ، عوامی متحدہ" #. 804 msgid "Ukraine" msgstr "یوکرائن" #. 800 msgid "Uganda" msgstr "یوگنڈا" #. 581 msgid "United States Minor Outlying Islands" msgstr "یونائیٹد سٹیٹ مائنر آوٹلیئنگ آئیسلینڈز" #. 840 msgid "United States" msgstr "امریکہ" #. 858 msgid "Uruguay" msgstr "اوروگوائے" #. 860 msgid "Uzbekistan" msgstr "ازبکستان" #. 336 msgid "Holy See (Vatican City State)" msgstr "مقدس شہر (ویٹیکن سٹی)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "سینٹ ونسنٹ اور گریناڈنز" #. 862 msgid "Venezuela" msgstr "ونزویلا" #. 092 msgid "Virgin Islands, British" msgstr "ورجن آئیسلینڈ، برطانیہ" #. 850 msgid "Virgin Islands, U.S." msgstr "ورجن آئیسلینڈ، امریکہ" #. 704 msgid "Viet Nam" msgstr "ویت نام" #. 548 msgid "Vanuatu" msgstr "وانوعاتو" #. 876 msgid "Wallis and Futuna" msgstr "والیز اور فوٹونا" #. 882 msgid "Samoa" msgstr "ساموا" #. 887 msgid "Yemen" msgstr "یمن" #. 175 msgid "Mayotte" msgstr "مائیوٹے" #. 710 msgid "South Africa" msgstr "جنوبی افریقہ" #. 894 msgid "Zambia" msgstr "زمبیا" #. 716 msgid "Zimbabwe" msgstr "زمبابوے" msgid "* Unknown, add is_in tags to those cities" msgstr "* نامعلوم شہروں کیلیئے" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "نقشہ کا نقطہ" msgid "Car" msgstr "کار" msgid "Iso2" msgstr "اسو 2" msgid "Iso3" msgstr "اسو 3" msgid "Country" msgstr "ملک" msgid "Postal" msgstr "ڈاک" msgid "Town" msgstr "ٹاؤن" msgid "District" msgstr "ضلع" msgid "Street" msgstr "سڑک" msgid "Number" msgstr "نمبر" msgid "Enter Destination" msgstr "منزل داخل کریں" msgid "Zip Code" msgstr "زپ کوڈ" msgid "City" msgstr "شہر" msgid "District/Township" msgstr "ضلع/قصبہ" msgid "Map" msgstr "نقشہ" msgid "Bookmark" msgstr "بک مارک" msgid "Destination" msgstr "منزل" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "ڈسپلئے" msgid "_Route" msgstr "راستہ" msgid "_Former Destinations" msgstr "سابقہ منازل" msgid "_Bookmarks" msgstr "بک مارکس" msgid "_Map" msgstr "نقشہ" msgid "_Layout" msgstr "بناوٹ" msgid "_Projection" msgstr "پروجیکشن" msgid "_Vehicle" msgstr "گاڑی" msgid "Zoom_Out" msgstr "چھوٹا کریں" msgid "Decrease zoom level" msgstr "زوم لیول کم کریں" msgid "Zoom_In" msgstr "بڑا کریں" msgid "Increase zoom level" msgstr "زوم لیول بڑہائیں" msgid "_Recalculate" msgstr "دوبارہ حساب" msgid "Redraw map" msgstr "نقشہ دوبارہ بنائیں" msgid "_Info" msgstr "معلومات" msgid "Set _destination" msgstr "منزل منتخب کریں" msgid "Opens address search dialog" msgstr "پتہ تلاش والا خانہ کھولیں" msgid "_Stop Navigation" msgstr "نیویگیشن بند کریں" msgid "Test" msgstr "ٹیسٹ" msgid "_Quit" msgstr "_بند" msgid "Quit the application" msgstr "پروگرام بند کریں" msgid "Show position _cursor" msgstr "کرسر کا مقام دکھائیں" msgid "_Lock on Road" msgstr "سڑک پر گرفت" msgid "_Keep orientation to the North" msgstr "قطب نما کو شمال کی طرف رکھیں" msgid "Switches map orientation to the north or the vehicle" msgstr "قطب نما کو شمال یا گاڑی کی طرف کریں" msgid "_Roadbook" msgstr "روڈ بک" msgid "Show/hide route description" msgstr "دکھیں/نہ دیکھیں سفر کی تفصیل" msgid "_Autozoom" msgstr "خودکار زوم" msgid "Enable/disable automatic zoom level changing" msgstr "فعال/غیر فعال کریں زوم کی خود کار تبدیلی" msgid "_Fullscreen" msgstr "پوری سکرین" msgid "Data" msgstr "ڈیٹا" msgid "N" msgstr "شمال" msgid "NE" msgstr "شمال مشرق" msgid "E" msgstr "مشرق" msgid "SE" msgstr "جنوب مشرق" msgid "S" msgstr "جنوب" msgid "SW" msgstr "جنوب مغرب" msgid "W" msgstr "مغرب" msgid "NW" msgstr "شمال مغرب" #. Android resource: @strings/no msgid "No" msgstr "نہیں" msgid "2D" msgstr "2ڈی" msgid "3D" msgstr "3ڈی" msgid "OT" msgstr "او ٹی" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fكلومیٹر %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "سفر 0000 کلومیٹر 0+00:00 ETA" msgid "Help" msgstr "مدد" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "براؤزر میں دیکھیں" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "سڑکیں" msgid "House numbers" msgstr "مکان نمبر" msgid "View Attributes" msgstr "خصوصیات دیکھں" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "پسندیدہ جگہیں" msgid "View on map" msgstr "نقشہ پہ دیکھیں" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "بک مارک کو کاٹیں" msgid "Copy Bookmark" msgstr "بک مارک کو کاپی کریں" msgid "Rename Bookmark" msgstr "بک مارک کا نام تبدیل کریں" msgid "Paste Bookmark" msgstr "بک مارک پیسٹ کریں" msgid "Delete Bookmark" msgstr "ڈیلیٹ بک مارک" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "بک مارکس" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "بک مارک فولڈر میں شامل" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "بک مارک پیسٹ کریں" #, c-format msgid "Bookmark %s" msgstr "بک مارک %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "سٹلائٹ کی حالت دیکھیں" msgid " Elevation " msgstr " ارتفاع " msgid " Azimuth " msgstr " سمت " msgid "Show NMEA Data" msgstr "NMEA ڈیٹا دیکھیں" msgid "car" msgstr "کار" msgid "bike" msgstr "سائیکل" msgid "pedestrian" msgstr "پیدل" #, c-format msgid "Current profile: %s" msgstr "موجودہ پروفائل: %s" #, c-format msgid "Change profile to: %s" msgstr "پروفائل کو :%s میں بدلیں" msgid "Set as active" msgstr "فعال کریں" msgid "Show Satellite status" msgstr "سٹلائٹ کی حالت دیکھیں" msgid "Show NMEA data" msgstr "NMEA ڈیٹا دیکھیں" msgid "Add Bookmark" msgstr "بک مارک میں شامل" msgid "Rename" msgstr "تبدیل نام" msgid "About Navit" msgstr "ناوٹ کے مطعلق" #. Authors msgid "By" msgstr "بنانے والے" #. Contributors msgid "And all the Navit Team" msgstr "اور ناوٹ کی ساری ٹیم" msgid "members and contributors." msgstr "ممبر اور حصہ دار" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "گاڑی" msgid "Rules" msgstr "قوانین" msgid "Lock on road" msgstr "سڑک پہ مرکوز" msgid "Northing" msgstr "شمالی سمت" msgid "Map follows Vehicle" msgstr "نقشہ گاڑی کا تعاقب کرے" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "نقشے" msgid "Layout" msgstr "بناوٹ" msgid "Height Profile" msgstr "اونچائی کی پروفائل" msgid "Route Description" msgstr "سفر کی تفصیل" msgid "Show Locale" msgstr "مقامی دیکھیں" msgid "Former Destinations" msgstr "سابقہ منازل" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "پیغام" msgid "Back" msgstr "واپس" msgid "Back to map" msgstr "نقشہ پہ واپس" msgid "Main Menu" msgstr "مین مینو" msgid "House number" msgstr "مکان نمبر" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "گاڑی کی حالت" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "مین مینو" msgid "" "Show\n" "Map" msgstr "" "دیکھیں\n" "نقشہ" msgid "Settings" msgstr "تراتیب" msgid "Tools" msgstr "ہتھیار" msgid "Route" msgstr "راستہ" msgid "About" msgstr "مطعلق" msgid "Actions" msgstr "ایکشن" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "بند" msgid "" "Stop\n" "Navigation" msgstr "" "روکیں\n" "نیویگیشن" msgid "Display" msgstr "ڈسپلئے" msgid "Fullscreen" msgstr "پوری سکرین" msgid "Window Mode" msgstr "ونڈو موڈ" msgid "Description" msgstr "تفصیل" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "گھوڑا" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Enter the roundabout soon and leave it at the %s" #~ msgstr "گول چوراہے میں داخل ہوں اور %s سے باہر نکل جایئں" #~ msgid "In %s, enter the roundabout" #~ msgstr "%s کے بعد گول چوراہے میں داخل ہو جایئں" navit-0.5.0~svn5643+dfsg.1/po/vi.po.in000066400000000000000000001102451221777731700172040ustar00rootroot00000000000000# Vietnamese translation for navit # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the navit package. # Nguyễn Hào Khôi , 2009. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 21:38+0000\n" "Last-Translator: Nguyễn Hào Khôi \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Đang chạy từ thư mục nguồn\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "thiết lập '%s' đến '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "Thứ 0" msgid "first" msgstr "thứ nhắt" msgid "second" msgstr "giây" msgid "third" msgstr "thứ ba" msgid "fourth" msgstr "thứ tư" msgid "fifth" msgstr "thứ năm" msgid "sixth" msgstr "thứ sáu" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "Thoát thứ 0" msgid "first exit" msgstr "Thoát thứ 1" msgid "second exit" msgstr "Thoát thứ 2" msgid "third exit" msgstr "Thoát thứ 3" msgid "fourth exit" msgstr "Thoát thứ 4" msgid "fifth exit" msgstr "Thoát thứ 5" msgid "sixth exit" msgstr "Thoát thứ 6" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "trong %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d mét" #, c-format msgid "in %d meters" msgstr "trong %d mét" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "trong %d.%d km" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d km" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "trong %d km" msgid "exit" msgstr "thoát" msgid "into the ramp" msgstr "vào dốc" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%svào phố %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%svào %s%s%s|male form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%svào %s%s%s|female form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%svào %s%s%s|neutral form" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%svào %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "phải" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "trái" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "dễ dàng " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "mạnh " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "thực sự mạnh " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "không rõ " msgid "When possible, please turn around" msgstr "Khi có thể, hãy quay vòng" msgid "Enter the roundabout soon" msgstr "Sắp tới chỗ vòng" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "sau đó ra khỏi đường vòng tại %s" #, c-format msgid "Leave the roundabout at the %s" msgstr "Ra khỏi đường vòng tại %s" #, c-format msgid "Follow the road for the next %s" msgstr "Đường tiếp theo %s" msgid "soon" msgstr "ngay" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Có %1$s đường đến %2$s" #, c-format msgid "after %i roads" msgstr "sau %i đường" msgid "now" msgstr "bây giờ" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "sau đó bắt %1$s đường đến %2$s" msgid "error" msgstr "lỗi" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Rẽ %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "sau đó rẽ %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "Bạn vừa tới điểm đích: %s" msgid "then you have reached your destination." msgstr "sau đó bạn tới điểm đích" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Vị trí" msgid "Command" msgstr "Lệnh" msgid "Length" msgstr "Chiều dài" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Thời gian" msgid "Destination Length" msgstr "Chiều dài tới" msgid "Destination Time" msgstr "Thời gian tới" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Thiết lập thành vị trí" msgid "Set as destination" msgstr "Thiết lập thành điểm tới" msgid "Add as bookmark" msgstr "Thêm thành Bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Điểm 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Tọa độ : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bỉ" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bru nây" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Đảo Bu-vê" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Cộng Hoà Dân Chủ Công-gô" #. 140 msgid "Central African Republic" msgstr "Cộng Hoà Trung Phi" #. 178 msgid "Congo" msgstr "Công-gô" #. 756 msgid "Switzerland" msgstr "Thụy Sĩ" #. 384 msgid "Cote d'Ivoire" msgstr "Bờ biển ngà" #. 184 msgid "Cook Islands" msgstr "Quần đảo Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "Trung Quốc" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Đảo Christmas" #. 196 msgid "Cyprus" msgstr "Đảo Síp" #. 203 msgid "Czech Republic" msgstr "Cộng hoà Séc" #. 276 msgid "Germany" msgstr "Đức" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Đan Mạch" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Ai Cập" #. 732 msgid "Western Sahara" msgstr "Tây Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Tây Ban Nha" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Phần Lan" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "Pháp" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Vương quốc Anh" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Hy Lạp" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hồng Kông" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Ấn Độ" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Ý" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Nhật bản" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Campuchia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Bắc Triều Tiên" #. 410 msgid "Korea, Republic of" msgstr "Hàn quốc" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Quần đảo Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Cộng hoà Nhân dân Dân chủ Lào" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "Libyan Arab Jamahiriya" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Quần đảo Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mông Cổ" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Hà Lan" #. 578 msgid "Norway" msgstr "Na Uy" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Bồ Đào Nha" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Liên bang Nga" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Quần đảo Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Thụy Điển" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thái Lan" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Thổ nhĩ kỳ" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Đài loan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "Mỹ" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Việt Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Không xác định, gán thẻ \"is_in\" cho những thành phố đó" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Ô tô" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Quốc gia" msgid "Postal" msgstr "Bưu điện" msgid "Town" msgstr "Thị trấn" msgid "District" msgstr "Huyện" msgid "Street" msgstr "Phố" msgid "Number" msgstr "Số" msgid "Enter Destination" msgstr "Nhập nơi đến" msgid "Zip Code" msgstr "Mã bưu điện" msgid "City" msgstr "Thành phố" msgid "District/Township" msgstr "Huyện/Thị trấn nhỏ" msgid "Map" msgstr "Bản đồ" msgid "Bookmark" msgstr "Đánh dấu" msgid "Destination" msgstr "Điểm đến" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Hiển thị" msgid "_Route" msgstr "Tuyến" msgid "_Former Destinations" msgstr "Điểm đến trước" msgid "_Bookmarks" msgstr "Đánh dấu" msgid "_Map" msgstr "Bản đồ" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Phép chiếu" msgid "_Vehicle" msgstr "Phương tiện" msgid "Zoom_Out" msgstr "Thu nhỏ" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Phóng to" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Tính lại" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Thông tin" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Dừng dẫn đường" msgid "Test" msgstr "Kiểm tra" msgid "_Quit" msgstr "_Thoát" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Bám vào đường" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Tự động thu phóng" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Toàn màn hình" msgid "Data" msgstr "Dữ liệu" msgid "N" msgstr "Bắc" msgid "NE" msgstr "Đông Bắc" msgid "E" msgstr "Đông" msgid "SE" msgstr "Đông Nam" msgid "S" msgstr "Nam" msgid "SW" msgstr "Tây Nam" msgid "W" msgstr "Tây" msgid "NW" msgstr "Tây Bắc" #. Android resource: @strings/no msgid "No" msgstr "Không" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Tuyến %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Tuyến 0000km 0+00:00 ETA" msgid "Help" msgstr "Trợ giúp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Xem trong trình duyệt" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Phố" msgid "House numbers" msgstr "Số nhà" msgid "View Attributes" msgstr "Xem thuộc tính" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Điểm hữu ích (POI)" msgid "View on map" msgstr "Xem trên bản đồ" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Đánh dấu" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Đánh dấu %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Xem thông tin vệ tinh" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Xem dữ liệu dạng NMEA" msgid "car" msgstr "ôtô" msgid "bike" msgstr "gắn máy" msgid "pedestrian" msgstr "khách bộ hành" #, c-format msgid "Current profile: %s" msgstr "Hồ sơ hiện hành: %s" #, c-format msgid "Change profile to: %s" msgstr "Đổi thành hồ sơ: %s" msgid "Set as active" msgstr "Kích hoạt" msgid "Show Satellite status" msgstr "Xem thông tin vệ tinh" msgid "Show NMEA data" msgstr "Xem dữ liệu dạng NMEA" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Phương tiện" msgid "Rules" msgstr "Quy tắc" msgid "Lock on road" msgstr "Bám vào đường" msgid "Northing" msgstr "Hướng Bắc" msgid "Map follows Vehicle" msgstr "Dịch bản đồ theo phương tiện khi di chuyển" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Bản đồ" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Thông tin chiều cao" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Điểm đến trước" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Thông điệp" msgid "Back" msgstr "Quay lại" msgid "Back to map" msgstr "Quay lại bản đồ" msgid "Main Menu" msgstr "Trình đơn chính" msgid "House number" msgstr "Số nhà" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Vị trí phương tiện" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "Trình đơn chính" msgid "" "Show\n" "Map" msgstr "Xem bản đồ" msgid "Settings" msgstr "Thiết lập" msgid "Tools" msgstr "Công cụ" msgid "Route" msgstr "Tuyến" msgid "About" msgstr "" msgid "Actions" msgstr "Thao tác" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "Thoát" msgid "" "Stop\n" "Navigation" msgstr "Dừng dẫn đường" msgid "Display" msgstr "Hiển thị" msgid "Fullscreen" msgstr "Toàn màn hình" msgid "Window Mode" msgstr "Chế độ cửa sổ" msgid "Description" msgstr "Mô tả" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "Còn %s, đi vào đường vòng" #~ msgid "Cursor" #~ msgstr "Con trỏ" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d km" navit-0.5.0~svn5643+dfsg.1/po/zh_CN.po.in000066400000000000000000001100171221777731700175640ustar00rootroot00000000000000# Simplified Chinese translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Kyle, 2008 # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-12-20 20:38+0000\n" "Last-Translator: Kyle WANG \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "从根目录执行\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' 设置为 '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "第零个" msgid "first" msgstr "第一个" msgid "second" msgstr "第二个" msgid "third" msgstr "第三个" msgid "fourth" msgstr "第四个" msgid "fifth" msgstr "第五个" msgid "sixth" msgstr "第六个" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "第零个退出" msgid "first exit" msgstr "第一个退出" msgid "second exit" msgstr "第二个退出" msgid "third exit" msgstr "第三个退出" msgid "fourth exit" msgstr "第四个退出" msgid "fifth exit" msgstr "第五个退出" msgid "sixth exit" msgstr "第六个退出" #, c-format msgid "%d m" msgstr "%d米" #, c-format msgid "in %d m" msgstr "距离%d米" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d米" #, c-format msgid "in %d meters" msgstr "距离%d米" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d千米" #, c-format msgid "in %d.%d kilometers" msgstr "距离%d.%d千米" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d千米" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "距离%d千米" msgid "exit" msgstr "退出" msgid "into the ramp" msgstr "进入坡道" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "%s 到达街区 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "%s 到达 %s%s%s | male form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "%s 到达 %s%s%s | female form" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "%s 到达 %s%s%s | neutral form" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s 到达 %s" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "右" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "左" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "缓 " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "急转 " #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "非常大的急转 " #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "未知 " msgid "When possible, please turn around" msgstr "当遇到路口的时候,请转弯" msgid "Enter the roundabout soon" msgstr "不久将进入环形交叉路口" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "然后在%s处驶出环形区" #, c-format msgid "Leave the roundabout at the %s" msgstr "还有%s就将驶离环形区" #, c-format msgid "Follow the road for the next %s" msgstr "沿路继续行驶%s" msgid "soon" msgstr "不久" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "可以经由道路 %1$s 到 %2$s" #, c-format msgid "after %i roads" msgstr "之后有 %i 条道路" msgid "now" msgstr "现在" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "然后可以经由道路 %1$s 到 %2$s" msgid "error" msgstr "错误" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "转向 %1$s%2$s %3$s%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "然后转向 %1$s%2$s %3$s%4$s" #, c-format msgid "You have reached your destination %s" msgstr "您已经抵达您的目的地 %s" msgid "then you have reached your destination." msgstr "然后你就到达您的目的地" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "位置" msgid "Command" msgstr "命令" msgid "Length" msgstr "长度" msgid "km" msgstr "千米" msgid "m" msgstr "米" msgid "Time" msgstr "时间" msgid "Destination Length" msgstr "目的地距离" msgid "Destination Time" msgstr "距目的地时间" msgid "Roadbook" msgstr "路线指南" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "设置为起始位置" msgid "Set as destination" msgstr "设置为目的地" msgid "Add as bookmark" msgstr "添加为书签" #, c-format msgid "Point 0x%x 0x%x" msgstr "位置 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "屏幕坐标:%d %d" #. 020 msgid "Andorra" msgstr "安道尔" #. 784 msgid "United Arab Emirates" msgstr "阿拉伯联合酋长国" #. 004 msgid "Afghanistan" msgstr "阿富汗" #. 028 msgid "Antigua and Barbuda" msgstr "安提瓜和巴布达" #. 660 msgid "Anguilla" msgstr "安圭拉" #. 008 msgid "Albania" msgstr "阿尔巴尼亚" #. 051 msgid "Armenia" msgstr "亚美尼亚" #. 530 msgid "Netherlands Antilles" msgstr "荷兰安地列斯" #. 024 msgid "Angola" msgstr "安哥拉" #. 010 msgid "Antarctica" msgstr "南极洲" #. 032 msgid "Argentina" msgstr "阿根廷" #. 016 msgid "American Samoa" msgstr "美属萨摩亚" #. 040 msgid "Austria" msgstr "奥地利" #. 036 msgid "Australia" msgstr "澳大利亚" #. 533 msgid "Aruba" msgstr "阿鲁巴岛" #. 248 msgid "Aland Islands" msgstr "奥兰群岛" #. 031 msgid "Azerbaijan" msgstr "阿塞拜疆" #. 070 msgid "Bosnia and Herzegovina" msgstr "波黑" #. 052 msgid "Barbados" msgstr "巴巴多斯" #. 050 msgid "Bangladesh" msgstr "孟加拉国" #. 056 msgid "Belgium" msgstr "比利时" #. 854 msgid "Burkina Faso" msgstr "布基纳法索" #. 100 msgid "Bulgaria" msgstr "保加利亚" #. 048 msgid "Bahrain" msgstr "巴林" #. 108 msgid "Burundi" msgstr "布隆迪" #. 204 msgid "Benin" msgstr "贝宁" #. 652 msgid "Saint Barthelemy" msgstr "圣巴泰勒米岛" #. 060 msgid "Bermuda" msgstr "百慕大群岛" #. 096 msgid "Brunei Darussalam" msgstr "文莱达鲁萨兰国" #. 068 msgid "Bolivia" msgstr "玻利维亚" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "巴西" #. 044 msgid "Bahamas" msgstr "巴哈马群岛" #. 064 msgid "Bhutan" msgstr "不丹" #. 074 msgid "Bouvet Island" msgstr "布维岛" #. 072 msgid "Botswana" msgstr "博茨瓦那" #. 112 msgid "Belarus" msgstr "白俄罗斯" #. 084 msgid "Belize" msgstr "伯利兹" #. 124 msgid "Canada" msgstr "加拿大" #. 166 msgid "Cocos (Keeling) Islands" msgstr "科科斯群岛" #. 180 msgid "Congo, Democratic Republic of the" msgstr "刚果" #. 140 msgid "Central African Republic" msgstr "中非共和国" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "瑞士" #. 384 msgid "Cote d'Ivoire" msgstr "科特迪瓦" #. 184 msgid "Cook Islands" msgstr "库克群岛" #. 152 msgid "Chile" msgstr "智利" #. 120 msgid "Cameroon" msgstr "喀麦隆" #. 156 msgid "China" msgstr "中国" #. 170 msgid "Colombia" msgstr "哥伦比亚" #. 188 msgid "Costa Rica" msgstr "哥斯达黎加" #. 192 msgid "Cuba" msgstr "古巴" #. 132 msgid "Cape Verde" msgstr "佛得角" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "圣诞岛" #. 196 msgid "Cyprus" msgstr "塞浦路斯" #. 203 msgid "Czech Republic" msgstr "捷克" #. 276 msgid "Germany" msgstr "德国" #. 262 msgid "Djibouti" msgstr "吉布提" #. 208 msgid "Denmark" msgstr "丹麦" #. 212 msgid "Dominica" msgstr "多米尼克" #. 214 msgid "Dominican Republic" msgstr "多米尼亚共和国" #. 012 msgid "Algeria" msgstr "阿尔及利亚" #. 218 msgid "Ecuador" msgstr "厄瓜多尔" #. 233 msgid "Estonia" msgstr "爱沙尼亚" #. 818 msgid "Egypt" msgstr "埃及" #. 732 msgid "Western Sahara" msgstr "西萨哈拉" #. 232 msgid "Eritrea" msgstr "厄立特里亚" #. 724 msgid "Spain" msgstr "西班牙" #. 231 msgid "Ethiopia" msgstr "埃塞额比亚" #. 246 msgid "Finland" msgstr "芬兰" #. 242 msgid "Fiji" msgstr "斐济" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "弗克兰群岛" #. 583 msgid "Micronesia, Federated States of" msgstr "密克罗尼西亚联邦" #. 234 msgid "Faroe Islands" msgstr "法罗群岛" #. 250 msgid "France" msgstr "法国" #. 266 msgid "Gabon" msgstr "加蓬" #. 826 msgid "United Kingdom" msgstr "英国" #. 308 msgid "Grenada" msgstr "格林纳达岛" #. 268 msgid "Georgia" msgstr "格鲁吉亚" #. 254 msgid "French Guiana" msgstr "法属圭亚那" #. 831 msgid "Guernsey" msgstr "格恩西岛" #. 288 msgid "Ghana" msgstr "加纳" #. 292 msgid "Gibraltar" msgstr "直布罗陀" #. 304 msgid "Greenland" msgstr "格陵兰岛" #. 270 msgid "Gambia" msgstr "冈比亚" #. 324 msgid "Guinea" msgstr "几内亚" #. 312 msgid "Guadeloupe" msgstr "瓜德罗普岛" #. 226 msgid "Equatorial Guinea" msgstr "赤道几内亚" #. 300 msgid "Greece" msgstr "希腊" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "南乔治亚岛和南桑德韦奇岛" #. 320 msgid "Guatemala" msgstr "危地马拉" #. 316 msgid "Guam" msgstr "关岛" #. 624 msgid "Guinea-Bissau" msgstr "几内亚比绍共和国" #. 328 msgid "Guyana" msgstr "盖亚那" #. 344 msgid "Hong Kong" msgstr "香港" #. 334 msgid "Heard Island and McDonald Islands" msgstr "赫德和麦克唐纳群岛" #. 340 msgid "Honduras" msgstr "洪都拉斯" #. 191 msgid "Croatia" msgstr "克罗地亚" #. 332 msgid "Haiti" msgstr "海地" #. 348 msgid "Hungary" msgstr "匈牙利" #. 360 msgid "Indonesia" msgstr "印度尼西亚" #. 372 msgid "Ireland" msgstr "爱尔兰" #. 376 msgid "Israel" msgstr "以色列" #. 833 msgid "Isle of Man" msgstr "马恩岛" #. 356 msgid "India" msgstr "印度" #. 086 msgid "British Indian Ocean Territory" msgstr "英属印度洋领地" #. 368 msgid "Iraq" msgstr "伊拉克" #. 364 msgid "Iran, Islamic Republic of" msgstr "伊朗伊斯兰共和国" #. 352 msgid "Iceland" msgstr "冰岛" #. 380 msgid "Italy" msgstr "意大利" #. 832 msgid "Jersey" msgstr "泽西岛" #. 388 msgid "Jamaica" msgstr "牙买加" #. 400 msgid "Jordan" msgstr "约旦" #. 392 msgid "Japan" msgstr "日本" #. 404 msgid "Kenya" msgstr "肯尼亚" #. 417 msgid "Kyrgyzstan" msgstr "吉尔吉斯斯坦" #. 116 msgid "Cambodia" msgstr "柬埔寨" #. 296 msgid "Kiribati" msgstr "基里巴斯" #. 174 msgid "Comoros" msgstr "科摩罗" #. 659 msgid "Saint Kitts and Nevis" msgstr "圣基茨和尼维斯" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "朝鲜" #. 410 msgid "Korea, Republic of" msgstr "韩国" #. 414 msgid "Kuwait" msgstr "科威特" #. 136 msgid "Cayman Islands" msgstr "开曼群岛" #. 398 msgid "Kazakhstan" msgstr "哈萨克斯坦" #. 418 msgid "Lao People's Democratic Republic" msgstr "老挝人民民主共和国" #. 422 msgid "Lebanon" msgstr "黎巴嫩" #. 662 msgid "Saint Lucia" msgstr "圣卢西亚" #. 438 msgid "Liechtenstein" msgstr "列支敦士登" #. 144 msgid "Sri Lanka" msgstr "斯里兰卡" #. 430 msgid "Liberia" msgstr "利比里亚" #. 426 msgid "Lesotho" msgstr "莱索托" #. 440 msgid "Lithuania" msgstr "立陶宛" #. 442 msgid "Luxembourg" msgstr "卢森堡" #. 428 msgid "Latvia" msgstr "拉脱维亚" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "利比亚" #. 504 msgid "Morocco" msgstr "摩洛哥" #. 492 msgid "Monaco" msgstr "摩纳哥" #. 498 msgid "Moldova, Republic of" msgstr "摩尔多瓦共和国" #. 499 msgid "Montenegro" msgstr "黑山" #. 663 msgid "Saint Martin (French part)" msgstr "圣马丁" #. 450 msgid "Madagascar" msgstr "马达加斯加" #. 584 msgid "Marshall Islands" msgstr "马绍尔群岛" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "马其顿" #. 466 msgid "Mali" msgstr "马里" #. 104 msgid "Myanmar" msgstr "缅甸" #. 496 msgid "Mongolia" msgstr "蒙古" #. 446 msgid "Macao" msgstr "澳门" #. 580 msgid "Northern Mariana Islands" msgstr "北马里亚纳群岛" #. 474 msgid "Martinique" msgstr "马提尼克" #. 478 msgid "Mauritania" msgstr "毛里塔尼亚" #. 500 msgid "Montserrat" msgstr "蒙特萨拉特岛" #. 470 msgid "Malta" msgstr "马尔他" #. 480 msgid "Mauritius" msgstr "毛里求斯" #. 462 msgid "Maldives" msgstr "马尔代夫" #. 454 msgid "Malawi" msgstr "马拉威" #. 484 msgid "Mexico" msgstr "墨西哥" #. 458 msgid "Malaysia" msgstr "马来西亚" #. 508 msgid "Mozambique" msgstr "莫桑比克" #. 516 msgid "Namibia" msgstr "纳米比亚" #. 540 msgid "New Caledonia" msgstr "新喀里多尼亚" #. 562 msgid "Niger" msgstr "尼日尔" #. 574 msgid "Norfolk Island" msgstr "诺福克岛" #. 566 msgid "Nigeria" msgstr "尼日利亚" #. 558 msgid "Nicaragua" msgstr "尼加拉瓜" #. 528 msgid "Netherlands" msgstr "荷兰" #. 578 msgid "Norway" msgstr "挪威" #. 524 msgid "Nepal" msgstr "尼泊尔" #. 520 msgid "Nauru" msgstr "瑙鲁" #. 570 msgid "Niue" msgstr "纽埃岛" #. 554 msgid "New Zealand" msgstr "新西兰" #. 512 msgid "Oman" msgstr "阿曼" #. 591 msgid "Panama" msgstr "巴拿马" #. 604 msgid "Peru" msgstr "秘鲁" #. 258 msgid "French Polynesia" msgstr "法属波利尼西亚" #. 598 msgid "Papua New Guinea" msgstr "巴布亚新几内亚" #. 608 msgid "Philippines" msgstr "菲律宾" #. 586 msgid "Pakistan" msgstr "巴基斯坦" #. 616 msgid "Poland" msgstr "波兰" #. 666 msgid "Saint Pierre and Miquelon" msgstr "圣皮埃尔和密克隆" #. 612 msgid "Pitcairn" msgstr "皮特凯恩" #. 630 msgid "Puerto Rico" msgstr "波多黎各" #. 275 msgid "Palestinian Territory, Occupied" msgstr "巴勒斯坦领土被占领" #. 620 msgid "Portugal" msgstr "葡萄牙" #. 585 msgid "Palau" msgstr "帕劳" #. 600 msgid "Paraguay" msgstr "巴拉圭" #. 634 msgid "Qatar" msgstr "卡塔尔" #. 638 msgid "Reunion" msgstr "法属留尼旺岛" #. 642 msgid "Romania" msgstr "罗马尼亚" #. 688 msgid "Serbia" msgstr "塞尔维亚" #. 643 msgid "Russian Federation" msgstr "俄罗斯联邦" #. 646 msgid "Rwanda" msgstr "卢旺达" #. 682 msgid "Saudi Arabia" msgstr "沙特阿拉伯" #. 090 msgid "Solomon Islands" msgstr "所罗门群岛" #. 690 msgid "Seychelles" msgstr "塞舌尔" #. 736 msgid "Sudan" msgstr "苏丹" #. 752 msgid "Sweden" msgstr "瑞典" #. 702 msgid "Singapore" msgstr "新加坡" #. 654 msgid "Saint Helena" msgstr "圣赫勒拿" #. 705 msgid "Slovenia" msgstr "斯洛文尼亚" #. 744 msgid "Svalbard and Jan Mayen" msgstr "斯瓦尔巴群岛" #. 703 msgid "Slovakia" msgstr "斯洛伐克" #. 694 msgid "Sierra Leone" msgstr "塞拉利昂" #. 674 msgid "San Marino" msgstr "圣马力诺" #. 686 msgid "Senegal" msgstr "塞内加尔" #. 706 msgid "Somalia" msgstr "索马里" #. 740 msgid "Suriname" msgstr "苏里南" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "圣多美及普林西比" #. 222 msgid "El Salvador" msgstr "萨尔瓦多" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "阿拉伯叙利亚共和国" #. 748 msgid "Swaziland" msgstr "斯威士兰" #. 796 msgid "Turks and Caicos Islands" msgstr "特克斯和凯科斯群岛" #. 148 msgid "Chad" msgstr "乍得" #. 260 msgid "French Southern Territories" msgstr "法属南部占领地" #. 768 msgid "Togo" msgstr "多哥" #. 764 msgid "Thailand" msgstr "泰国" #. 762 msgid "Tajikistan" msgstr "塔吉克斯坦" #. 772 msgid "Tokelau" msgstr "托克劳" #. 626 msgid "Timor-Leste" msgstr "东帝汶" #. 795 msgid "Turkmenistan" msgstr "土库曼斯坦" #. 788 msgid "Tunisia" msgstr "突尼斯" #. 776 msgid "Tonga" msgstr "汤加" #. 792 msgid "Turkey" msgstr "土耳其" #. 780 msgid "Trinidad and Tobago" msgstr "特立尼达和多巴哥" #. 798 msgid "Tuvalu" msgstr "图瓦卢" #. 158 msgid "Taiwan, Province of China" msgstr "台湾(中国)" #. 834 msgid "Tanzania, United Republic of" msgstr "坦桑尼亚联合共和国" #. 804 msgid "Ukraine" msgstr "乌克兰" #. 800 msgid "Uganda" msgstr "乌干达" #. 581 msgid "United States Minor Outlying Islands" msgstr "美国本土外小岛屿" #. 840 msgid "United States" msgstr "美国" #. 858 msgid "Uruguay" msgstr "乌拉圭" #. 860 msgid "Uzbekistan" msgstr "乌兹别克斯坦" #. 336 msgid "Holy See (Vatican City State)" msgstr "圣座" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "圣文森特和格林纳丁斯" #. 862 msgid "Venezuela" msgstr "委内瑞拉" #. 092 msgid "Virgin Islands, British" msgstr "英属维京群岛" #. 850 msgid "Virgin Islands, U.S." msgstr "美属维京群岛" #. 704 msgid "Viet Nam" msgstr "越南" #. 548 msgid "Vanuatu" msgstr "瓦努阿图" #. 876 msgid "Wallis and Futuna" msgstr "瓦利斯和富图纳群岛" #. 882 msgid "Samoa" msgstr "萨摩亚群岛" #. 887 msgid "Yemen" msgstr "也门" #. 175 msgid "Mayotte" msgstr "马约特岛" #. 710 msgid "South Africa" msgstr "南非" #. 894 msgid "Zambia" msgstr "赞比亚" #. 716 msgid "Zimbabwe" msgstr "津巴布韦" msgid "* Unknown, add is_in tags to those cities" msgstr "* 未知,添加标签" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "地图位置点" msgid "Car" msgstr "汽车" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "国家" msgid "Postal" msgstr "邮编" msgid "Town" msgstr "区/镇" msgid "District" msgstr "城区" msgid "Street" msgstr "街区" msgid "Number" msgstr "门牌号" msgid "Enter Destination" msgstr "进入目标区域" msgid "Zip Code" msgstr "区号(邮编)" msgid "City" msgstr "城市" msgid "District/Township" msgstr "市区/区镇" msgid "Map" msgstr "地图" msgid "Bookmark" msgstr "书签" msgid "Destination" msgstr "目的地" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "显示" msgid "_Route" msgstr "路线" msgid "_Former Destinations" msgstr "前一目的地" msgid "_Bookmarks" msgstr "书签" msgid "_Map" msgstr "地图" msgid "_Layout" msgstr "布局" msgid "_Projection" msgstr "规划" msgid "_Vehicle" msgstr "车辆" msgid "Zoom_Out" msgstr "缩小" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "放大" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "重新计算" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "信息" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "停止导航" msgid "Test" msgstr "测试" msgid "_Quit" msgstr "退出(_Q)" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "锁定路线" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "路线指南" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "自动缩放" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "全屏" msgid "Data" msgstr "数据" msgid "N" msgstr "北" msgid "NE" msgstr "东北" msgid "E" msgstr "东" msgid "SE" msgstr "东南" msgid "S" msgstr "南" msgid "SW" msgstr "西南" msgid "W" msgstr "西" msgid "NW" msgstr "西北" #. Android resource: @strings/no msgid "No" msgstr "否" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "路线 %4.0f千米 %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "路线 0000千米 0+00:00 ETA" msgid "Help" msgstr "帮助" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "在浏览器中查看" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "街道" msgid "House numbers" msgstr "编号" msgid "View Attributes" msgstr "查看属性" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "您可能感兴趣的位置" msgid "View on map" msgstr "在地图中查看" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "剪切标签" msgid "Copy Bookmark" msgstr "复制标签" msgid "Rename Bookmark" msgstr "重命名标签" msgid "Paste Bookmark" msgstr "粘帖标签" msgid "Delete Bookmark" msgstr "删除标签" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "书签" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "添加书签文件夹" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "粘帖标签" #, c-format msgid "Bookmark %s" msgstr "书签 %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "显示卫星状态" msgid " Elevation " msgstr " 海拔" msgid " Azimuth " msgstr " 地平经度" msgid "Show NMEA Data" msgstr "显示NMEA数据" msgid "car" msgstr "汽车" msgid "bike" msgstr "自行车" msgid "pedestrian" msgstr "步行" #, c-format msgid "Current profile: %s" msgstr "当前设定:%s" #, c-format msgid "Change profile to: %s" msgstr "更改设定到: %s" msgid "Set as active" msgstr "保存生效" msgid "Show Satellite status" msgstr "显示卫星状态" msgid "Show NMEA data" msgstr "显示NMEA数据" msgid "Add Bookmark" msgstr "增加书签" msgid "Rename" msgstr "重命名" msgid "About Navit" msgstr "关于Navit" #. Authors msgid "By" msgstr "作者" #. Contributors msgid "And all the Navit Team" msgstr "和整个的Navit组" msgid "members and contributors." msgstr "成员和贡献者" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "车辆" msgid "Rules" msgstr "规则" msgid "Lock on road" msgstr "锁定路线" msgid "Northing" msgstr "总指向北" msgid "Map follows Vehicle" msgstr "随车显示地图" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "地图" msgid "Layout" msgstr "布局" msgid "Height Profile" msgstr "高度设定" msgid "Route Description" msgstr "到目的地的路线" msgid "Show Locale" msgstr "显示本地" msgid "Former Destinations" msgstr "前一目的地" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "信息" msgid "Back" msgstr "返回" msgid "Back to map" msgstr "返回到地图" msgid "Main Menu" msgstr "主菜单" msgid "House number" msgstr "房屋编号(门牌号)" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "车辆位置" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "主菜单" msgid "" "Show\n" "Map" msgstr "显示地图" msgid "Settings" msgstr "设置" msgid "Tools" msgstr "工具" msgid "Route" msgstr "路线" msgid "About" msgstr "关于" msgid "Actions" msgstr "动作" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "退出" msgid "" "Stop\n" "Navigation" msgstr "停止导航" msgid "Display" msgstr "显示" msgid "Fullscreen" msgstr "全屏" msgid "Window Mode" msgstr "窗口模式" msgid "Description" msgstr "描述" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "骑马" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "In %s, enter the roundabout" #~ msgstr "还有%s进入环形环形交叉路口" #~ msgid "Cursor" #~ msgstr "光标" #~ msgid "%d.%d kilometer" #~ msgstr "%d.%d千米" navit-0.5.0~svn5643+dfsg.1/po/zh_HK.po.in000066400000000000000000001013231221777731700175660ustar00rootroot00000000000000# Chinese (Hong Kong) translation for navit # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the navit package. # Kyle, 2008. # msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-26 00:37+0400\n" "PO-Revision-Date: 2009-07-02 19:47+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Chinese (Hong Kong) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_HK\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Launchpad (build Unknown)\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d m" msgstr "" #, c-format msgid "in %d m" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" msgid "exit" msgstr "退出" msgid "into the ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto the street %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|male form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|female form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included #, c-format msgid "%sinto the %s%s%s|neutral form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" #. TRANSLATORS: right, as in 'Turn right' msgid "right" msgstr "右" #. TRANSLATORS: left, as in 'Turn left' msgid "left" msgstr "左" #. TRANSLATORS: Don't forget the ending space msgid "easily " msgstr "简单 " #. TRANSLATORS: Don't forget the ending space msgid "strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "really strongly " msgstr "" #. TRANSLATORS: Don't forget the ending space msgid "unknown " msgstr "" msgid "When possible, please turn around" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #, c-format msgid "then leave the roundabout at the %s" msgstr "" #, c-format msgid "Leave the roundabout at the %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "直走到下一个%s" msgid "soon" msgstr "" #. TRANSLATORS: First argument is the how manieth street to take, second the direction #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" msgid "now" msgstr "現在" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" msgid "error" msgstr "" #. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%1$s转向%2$s %3$s至%4$s" #. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination #, c-format msgid "then turn %1$s%2$s %3$s%4$s" msgstr "" #, c-format msgid "You have reached your destination %s" msgstr "" msgid "then you have reached your destination." msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "指令" msgid "Length" msgstr "長度" msgid "km" msgstr "公里" msgid "m" msgstr "米" msgid "Time" msgstr "" msgid "Destination Length" msgstr "抵达终点距离" msgid "Destination Time" msgstr "抵达终点时间" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "设置您所在位置" msgid "Set as destination" msgstr "设置目的地地址" msgid "Add as bookmark" msgstr "添加书签" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "安道爾" #. 784 msgid "United Arab Emirates" msgstr "阿聯酋" #. 004 msgid "Afghanistan" msgstr "阿富汗" #. 028 msgid "Antigua and Barbuda" msgstr "安提瓜和巴布達" #. 660 msgid "Anguilla" msgstr "安圭拉" #. 008 msgid "Albania" msgstr "阿爾巴尼亞" #. 051 msgid "Armenia" msgstr "亞美尼亞" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "安哥拉" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "阿根廷" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "奧地利" #. 036 msgid "Australia" msgstr "澳大利亞" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "孟加拉" #. 056 msgid "Belgium" msgstr "比利時" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "保加利亞" #. 048 msgid "Bahrain" msgstr "巴林" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "百慕達" #. 096 msgid "Brunei Darussalam" msgstr "汶萊" #. 068 msgid "Bolivia" msgstr "玻利維亞" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "巴西" #. 044 msgid "Bahamas" msgstr "巴哈馬" #. 064 msgid "Bhutan" msgstr "不丹" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "加拿大" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "中非共和國" #. 178 msgid "Congo" msgstr "剛果" #. 756 msgid "Switzerland" msgstr "瑞士" #. 384 msgid "Cote d'Ivoire" msgstr "象牙海岸" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "智利" #. 120 msgid "Cameroon" msgstr "喀麥隆" #. 156 msgid "China" msgstr "中國" #. 170 msgid "Colombia" msgstr "哥倫比亞" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "古巴" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "聖誕島" #. 196 msgid "Cyprus" msgstr "塞浦路斯" #. 203 msgid "Czech Republic" msgstr "捷克共和國" #. 276 msgid "Germany" msgstr "德國" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "丹麥" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "阿爾及利亞" #. 218 msgid "Ecuador" msgstr "厄瓜多爾" #. 233 msgid "Estonia" msgstr "爱尔沙尼亚" #. 818 msgid "Egypt" msgstr "埃及" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "西班牙" #. 231 msgid "Ethiopia" msgstr "埃塞俄比亞" #. 246 msgid "Finland" msgstr "芬蘭" #. 242 msgid "Fiji" msgstr "斐濟群島" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "法國" #. 266 msgid "Gabon" msgstr "加彭" #. 826 msgid "United Kingdom" msgstr "英國" #. 308 msgid "Grenada" msgstr "格林纳达" #. 268 msgid "Georgia" msgstr "喬治亞州" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "直布羅陀" #. 304 msgid "Greenland" msgstr "格陵蘭" #. 270 msgid "Gambia" msgstr "岡比亞" #. 324 msgid "Guinea" msgstr "几内亚" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "希腊" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "香港" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "克羅地亞" #. 332 msgid "Haiti" msgstr "海地" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "愛爾蘭" #. 376 msgid "Israel" msgstr "以色列" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "印度" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "伊拉克" #. 364 msgid "Iran, Islamic Republic of" msgstr "伊朗" #. 352 msgid "Iceland" msgstr "冰島" #. 380 msgid "Italy" msgstr "意大利" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "牙買加" #. 400 msgid "Jordan" msgstr "約旦" #. 392 msgid "Japan" msgstr "日本" #. 404 msgid "Kenya" msgstr "肯尼亞" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "柬埔寨" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "北朝鲜" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "科威特" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "哈薩克" #. 418 msgid "Lao People's Democratic Republic" msgstr "老撾" #. 422 msgid "Lebanon" msgstr "黎巴嫩" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "列支敦士登" #. 144 msgid "Sri Lanka" msgstr "斯里蘭卡" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "立陶宛" #. 442 msgid "Luxembourg" msgstr "卢森堡" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libyan Arab Jamahiriya" msgstr "" #. 504 msgid "Morocco" msgstr "摩洛哥" #. 492 msgid "Monaco" msgstr "摩納哥" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "馬達加斯加" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "馬里" #. 104 msgid "Myanmar" msgstr "緬甸" #. 496 msgid "Mongolia" msgstr "蒙古" #. 446 msgid "Macao" msgstr "澳門" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "馬耳他" #. 480 msgid "Mauritius" msgstr "毛里求斯" #. 462 msgid "Maldives" msgstr "马尔代夫" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "墨西哥" #. 458 msgid "Malaysia" msgstr "马來西亚" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "纳米比亚" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "尼日尔" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "尼日利亚" #. 558 msgid "Nicaragua" msgstr "尼加拉瓜" #. 528 msgid "Netherlands" msgstr "荷兰" #. 578 msgid "Norway" msgstr "挪威" #. 524 msgid "Nepal" msgstr "尼泊尔" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "新西兰" #. 512 msgid "Oman" msgstr "阿曼" #. 591 msgid "Panama" msgstr "巴拿馬" #. 604 msgid "Peru" msgstr "秘魯" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "菲律賓" #. 586 msgid "Pakistan" msgstr "巴基斯坦" #. 616 msgid "Poland" msgstr "波兰" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "波多黎各" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "葡萄牙" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "巴拉圭" #. 634 msgid "Qatar" msgstr "卡塔尔" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "罗马尼亚" #. 688 msgid "Serbia" msgstr "塞尔维亚" #. 643 msgid "Russian Federation" msgstr "俄罗斯" #. 646 msgid "Rwanda" msgstr "卢旺达" #. 682 msgid "Saudi Arabia" msgstr "沙特阿拉伯" #. 090 msgid "Solomon Islands" msgstr "所罗门群島" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "苏丹" #. 752 msgid "Sweden" msgstr "瑞典" #. 702 msgid "Singapore" msgstr "新加坡" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "斯洛文尼亞" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "斯洛伐克" #. 694 msgid "Sierra Leone" msgstr "塞拉利昂" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "索馬里" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "斯威士兰" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "乍得" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "多哥" #. 764 msgid "Thailand" msgstr "泰國" #. 762 msgid "Tajikistan" msgstr "塔吉克斯坦" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "東帝汶" #. 795 msgid "Turkmenistan" msgstr "土庫曼" #. 788 msgid "Tunisia" msgstr "突尼斯" #. 776 msgid "Tonga" msgstr "汤加" #. 792 msgid "Turkey" msgstr "土耳其" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "台湾" #. 834 msgid "Tanzania, United Republic of" msgstr "坦桑尼亞" #. 804 msgid "Ukraine" msgstr "乌克兰" #. 800 msgid "Uganda" msgstr "乌干达" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "美國" #. 858 msgid "Uruguay" msgstr "乌拉圭" #. 860 msgid "Uzbekistan" msgstr "乌兹别克斯坦" #. 336 msgid "Holy See (Vatican City State)" msgstr "梵蒂岡" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "委內瑞拉" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "越南" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "Samoa (薩摩亞)" #. 887 msgid "Yemen" msgstr "也门" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "南非" #. 894 msgid "Zambia" msgstr "赞比亚" #. 716 msgid "Zimbabwe" msgstr "津巴布韦" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file\n" "\t-d : set the global debug output level to (0-3). Overrides setting " "from config file.\n" "\t-h: print this usage info and exit.\n" "\t-v: Print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "国家" msgid "Postal" msgstr "" msgid "Town" msgstr "城镇" msgid "District" msgstr "行政区" msgid "Street" msgstr "街" msgid "Number" msgstr "号" msgid "Enter Destination" msgstr "输入目的地" msgid "Zip Code" msgstr "邮政编码" msgid "City" msgstr "城市" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "书签" msgid "Destination" msgstr "目的地" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "显示" msgid "_Route" msgstr "路" msgid "_Former Destinations" msgstr "前一个目的地" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "投影" msgid "_Vehicle" msgstr "机动车" msgid "Zoom_Out" msgstr "放大" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "缩小" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "信息" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_Stop Navigation" msgstr "停止浏览" msgid "Test" msgstr "测试" msgid "_Quit" msgstr "退出" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "全屏" msgid "Data" msgstr "" msgid "N" msgstr "北" msgid "NE" msgstr "北偏东(东北)" msgid "E" msgstr "東" msgid "SE" msgstr "南偏东(东南)" msgid "S" msgstr "南" msgid "SW" msgstr "南偏西(西南)" msgid "W" msgstr "西" msgid "NW" msgstr "北偏西" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Longitude Latitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "机动车" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "前一个目的地" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "Downloaded maps" msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Libya" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Error downloading map!" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "路" msgid "About" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Quit" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "显示" msgid "Fullscreen" msgstr "全屏" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" #. chr: #. flags used for a truck: (first flag number is 0) #. 8: SIZE_OR_WEIGHT_LIMIT #. 21: TRANSPORT_TRUCK #. speed setup: #. 'speed' data of the atkaction for a car is #. reduced about 10 km/h. When the speed was at #. 10 km/h, I reduced it to 5 km/h. #. 'route_weight' data has been treated in the same way. #. If you want to discourage the use of small roads, #. just reduce this value. #. size and weight setup: #. This is an example, you have to use the data of your truck. #. bobshaffer's standard truck: #. (1 lb = 453.59237 g, 1 foot = .3048 m) #. (data has to be in [cm] and [kg] according to 'atkaction.h') #. vehicle_width= 9 feet, 274 cm #. vehicle_height= 13.5 feet, 411 cm #. vehicle_length= 70 feet, 2134 cm #. vehicle_weight= 80000 lbs, 36287 kg #. vehicle_axle_weight= 34000 lbs, 15422 kg #. msgid "Truck" msgstr "" #~ msgid "Cursor" #~ msgstr "游标"