--- /dev/null
+[Desktop Entry]
+Encoding=UTF-8
+Version=0.1
+Type=Application
+Name=ZouBa
+Exec=/usr/bin/zouba
+Icon=zouba
+X-HildonDesk-ShowInToolbar=true
+X-Window-Icon=zouba
+X-Window-Icon-Dimmed=zouba
+X-Osso-Type=application/x-executable
--- /dev/null
+The Debian Package zouba
+----------------------------
+
+Comments regarding the Package
+
+ -- Max Waterman <davidmaxwaterman@jeeves> Tue, 23 Mar 2010 20:11:34 +0200
--- /dev/null
+zouba for Debian
+----------------
+
+<possible notes regarding this package - if none, delete this file>
+
+ -- Max Waterman <davidmaxwaterman@jeeves> Tue, 23 Mar 2010 20:11:34 +0200
--- /dev/null
+zouba (0.9) unstable; urgency=low
+
+ * added notification for address resolution failure and no route
+ * fixed issue with multiple route requests for a single button click
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Sun, 25 Apr 2010 06:12:00 +0200
+
+zouba (0.8) unstable; urgency=low
+
+ * Fixed problem when changing the address of a location to something invalid.
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Sat, 24 Apr 2010 03:39:00 +0200
+
+zouba (0.7) unstable; urgency=low
+
+ * Changed gps controller to use labels for fake gps instead of a new Location instance.
+ * Added route detail table and general associated shuffle of api.
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Tue, 20 Apr 2010 06:27:00 +0200
+
+zouba (0.6) unstable; urgency=low
+
+ * Changed layout in preparation for multiple routes
+ * Changed the selection mode for the tables
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Mon, 19 Apr 2010 17:38:00 +0200
+
+zouba (0.5) unstable; urgency=low
+
+ * Changed package description
+ * Changed 'fakegps' button from two actions to a single toggle one
+ * Fixed core dump in gpscontroller caused by deleting the fakelocation
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Mon, 19 Apr 2010 11:18:00 +0200
+
+zouba (0.4) unstable; urgency=low
+
+ * Fix for routes with bus changes (only displays first bus)
+ * Added and cleaned up ut_route
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Fri, 16 Apr 2010 11:28:00 +0200
+
+zouba (0.3) unstable; urgency=low
+
+ * Fix for app manager icon
+ * Changes: cleanup and corrections for autobuilder
+ * Added new settings button to set a fake current location ('work' in the first instance).
+ * Added 'optimize' parameter set to 'leastwalking' to route server to give same results as web server early in the morning.
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Mon, 12 Apr 2010 12:13:13 +0200
+
+zouba (0.2) unstable; urgency=low
+
+ * Better xml error string.
+ * Better message table width resizing, though visually the same.
+ * Added missing message when work button becomes valid.
+ * First upload to extras-devel.
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Wed, 24 Mar 2010 21:29:00 +0200
+
+zouba (0.1) unstable; urgency=low
+
+ * Initial Release.
+
+ -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Tue, 23 Mar 2010 20:11:34 +0200
--- /dev/null
+Source: zouba
+Section: user/navigation
+Priority: extra
+Maintainer: Max Waterman <davidmaxwaterman@fastmail.co.uk>
+Build-Depends: libqt4-dev, libqtm-bearer, libqtm-location, debhelper (>= 5)
+Standards-Version: 3.7.3
+Homepage:
+
+Package: zouba
+Architecture: armel
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Tells you which bus is next (in Helsinki area).
+ Allows you to easily find how to get the bus home. Uses HSL Journey Planner API <http://developer.reittiopas.fi/pages/en/home.php>. Uses GPS for current location. Uses Qt and QtMobility.
+# XB-Maemo-Icon-26 field contains the application icon file encoded in
+# base64. This is the icon that is shown in the Application Manager,
+# next to the package name. To perform this encoding use following mad
+# command: $ mad base64 <48x48 icon file name>
+# For example following XB-Maemo-Icon-26 field content is an output
+# from command: $ mad base64 zouba/src/data/48x48/zouba.png
+XB-Maemo-Icon-26:
+ iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGP
+ C/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUw
+ AADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAL
+ EwAACxMBAJqcGAAAAAl2cEFnAAAAMAAAADAAzu6MVwAADplJREFUaN7VmOmP
+ ZNV5h59z7rlLLbequnqp3qBhlp6FmWEYA4YwRiYMAsvBTuzIwiRxnAXJEYkT
+ ZVH+AH+KIkVE8gd/iJLIimQnEhMHgx3FRkOCMTG2YQbMGAZ6YDw93dVV1VW3
+ a7l16675cG/NtIfBZrFjfKRSt2p9fu9539/7ngO/3MsUv2iCd7hs4B7gvl8m
+ AZMZ9CEhuEnT7JvjeKnwXhcggX3AR6QUH9G03PsMY1ZX6hCj0W2MRjt5rwrQ
+ gT3Ap4TgvlyucFU+f30SBLcI3z/IaFQjjhWQvOcEKOBa4DNCcL9l5WZLpT1o
+ 2p10OjfieRMkiQCSix94rwjIAx8F7hWC20yztFgsHpRSHmUwOIzrvhH8vSJg
+ FrgN+G0huNs0K7lC4TBJ8kFc9zpGoxJJwhXBf5ECRAZ+DPgzKcVB06zqlvU+
+ kuQDDIf78P3im0b8FylABw4CHxVCfFzT1G7TnDEM4wbi+CjD4TJBkH/L4P9f
+ AsrAXuAQcJdS5u1K2TVdn0GpA0TR+/G8Hfh+Pnv7Wwf/eQoQwFXArwOfAA5o
+ ml4yjEmh60tIuZ8ouh7PWyIMc2874j9vASZwP/DXIHZLaUmlpjDNHUh5HWG4
+ D99fJAhy2U+/E3BB2t9ifpZ9QJKmyl+A+ISUpaJS8+j6DjTtAFG0h9FomijS
+ M1d5J2sMvgmcAg4DE+9agAZMAb8K/KWU1hGlllFqP1LuIYp24fuTRJH2DqO9
+ PT7DDPw4un6aMPw1kuRTqHcBPglcD/ymlOKjSi3VlDoKHCKKFhmNKtvA3ym8
+ AELgh8DDKPUcBw7s5Oqr7+HrX/8GQbD/bQuQ28DvkFIeU0o/omnvV/AbBMES
+ UZQjjuU7ABf8eF1EQB14CikfY9euIh/+8AMsL+/hpZdewjAeJwhW3rIACVRJ
+ 7fB2TdMO6rquhEiuiePDKggeJIqqJEnCuLjeXkxioAG4gJU9dxopX2RmZo2j
+ R2/jYx/7OJVKhXq9juu6F3/rpwmQwARwAPgVTdOWDcPoFwqFr/q+nx8M3GNR
+ dHumbTXb7nnAeAtCxuX3EvAN4HtAH7AR4iDV6gTXXbfITTcd4siRvczPz9Nu
+ t9na2mJ1dZXhMAZ2vamAMfg+4EZN05YMw3Dy+fx/6Lr+8nA4bHe73c/CZB52
+ A/8N/ANCDEmSW4D3AcuZGDIxl8MPgMcR4stMT8OuXbsplyv0ej08r8fy8vtZ
+ Wppjbi7Gtkt4nsdg4NJqtXj99bMkyTSw/AYBEqiQUh2UUs4ahuGYpvlVIcTr
+ W1tb/TAMY9Kx4CZYyuC+xN13H+DGG2/m+PGH+dGPnsJ1yyTJh0jH+v2kk3IC
+ BEAb+DdM8wT79y9z7NhdTExMkM/n0TSNM2deRtcVhYJE19Od6vV6fP/73+Mr
+ XznOuXMN4PeB2kUBAiiSzuJ7gKpSqm8YxokkSVa73a6bXDJwSWqds0IU0LQO
+ hjHg7rs/xKc//Xt88pP3c+7cOR599BGef/4HfPe7D+P7vwvcBXSADZQ6y8TE
+ D7njjg9zyy23UiqVyOVyCCEYDocUizZRFJMkGp2Ow5kzj/PMM8/w7LPPMRzu
+ Bf4QOAIIVBbNGrCT1GH6UsoVYHM4HA6TS+SStNMWpZRHNE27xjD2YFkR+XyR
+ 2dk5hBDMzs6ysLDArbfeSq/X48EH/4hHH30MmEPTekxM9FlY8LjmmsMcPfoB
+ lpaWEEIQBAGe59Hr9XBdF983WVl5jdOnv8PZs88zGtnAp4A7svhFQIICdgEz
+ 2f6eAbbiOPbjOB77oMisoaRpml2pVAzTNKdGo0C3rAksK6RSqVKr1UiSBCHS
+ LQ/DENd1MQwTcKhWV5mby7OwUGZpqcbiYsTU1BSmaTIYDHAch3Z7k5WVFV55
+ ZY2VlTxraw6+PwV8NqupSoYUXcx5BZSAFtAF/G0VNwa3NU0rlctla25uzpyZ
+ mdE9z9ObzVZsmhaW1aNWm8AwDDRNw/d9Go0G586dY3V1lUajwfLybhYWqszP
+ V5mbK1Gp6OTzPRynQ7PZ4Pz586ytrXP+/Cpnz16g0VggCJZIzzpXkx7YEt5o
+ BqmAtSuAm4AtpbRt287Nzs6aMzMzZrVaNaempoxWqzkdBJFhWSaGcTW+f4Ev
+ fOEL3HnnnZTL5SwFfFzXZWamxvz8IjMzOygWdSwL4tij2WzSbJ5nY8OhXvc4
+ f35Eq1UgDO8inXPmMwyuCL7dz6avAF6ybduq1WrmzMyMOTExYVYqFatcLlu2
+ bZtxHE++8MLJB0ajXQtJcowgOIfnPUkc/4ipqQn27t3Hnj17ME2TU6dOYhi7
+ 0fU5osjFddu02xs0m22aTZf1dWi3LYJgNvOQGdI+8tOaYdq5RfaJH4v4lcCL
+ xaJZLBaNfD6vlFLixInH72u1jMOj0WHCsIeuJ5TLUCgMkdLBtiVLS1fjeR5h
+ OMVgYNNo1Gm1tmi1fBqNBMfRCcMpYDGLo8GlkeLNGuH49R5wFgVMSSmLtm3n
+ rwReKBRM27bH4ERRxPr6etFxnHy/r6PrW0xNVSkWy2iaThh6hGEf123z2mt1
+ wKPfD2k0OjSbHs0mdLtFwrBKejSezOInSEeJegZ3TVae8WXgDvAt0u59DlUu
+ l2dqtZpRq9UugpdKJatQKFi2bRuFQkEppYjjOO71etqFCxfK9Xp9yvcDq1qd
+ o1S6NgOH0Sgm7XMaw2EFz4vwPEG3a9JoRHS7ecJwInPtyraIbwBPA0+haato
+ 2gjfPwB8hkvdvAP8D/BN4FUfojPAI+rIkSOGbduFUqmUr1QquWKxOI64rpQS
+ SZLEvu9HnU5HXrhwwdra2tKKxeIgjqfcMDSJ4zy+HxMEEb4f0ut16fW6eB5E
+ kY3rVun1IsKwsA1c31acLeDzmOZz7N69i3J5mVptllOnnmNl5R+BPwZOAv8O
+ nPEgegb4F+BrwLo6dOiQVigUlGmapmVZlmEYllJKJkmSjEaj0HXdqNvtRo1G
+ Q/X7fTeXy4WmaVrdblcPwwqGoRGGIb1ei0bDo90e4PsGUlYIQ4so0kkvk0tZ
+ xMl8fAA0EeJr6PopyuUKnufTbJ7llVdWUEpl4J8DzsQwehr4PPCfWR6lNloq
+ leT09HRSKpVCpVQwGAy0fr+vDQaDqN/vh71ez+t0OmGz2VRCCD1JEjka+YWt
+ LUclySJxPKDdfpLNzScZDvcSxzeSNvV8Fmkzc2uRgQ+BFkK00fXzGMZzJInE
+ tm1uuOEGdu7cyfHjxzlz5kyG+IIHPJQ9NoAbsq07BaBM0wzjOA583/eSJElc
+ 140bjYbe7Xb9Xq833Nra8tvtdthqtaRSSvM8T3recG5jY3Pa98F1L+C6LxDH
+ 54DzwDPA7wAfusxRXKCDEG2UctH1EDhLHHfI5XLce++9HDhwgEceeYSNjQ2k
+ lMRx3AT+Fvh70vnhr4A/Af4VeB5IlOM4Q9/3Y9d1YyllvLm5GdXrdeE4ju84
+ zqjT6XidTmfkOI6maZrVbrfNfr/nua4XxXFAkpRJb1CuytyhA/wX8MFsF8bg
+ Dpo2QtcDwCNJPHK5hKmpBWy7xOnTp3n66aexLIsHH3yQJ554gm9/+9uvAk8A
+ DwB/kDWKfwb+Zuyx6rXXXhsWi8W4UChESim/Xq8b9XpdtNttr9PpeN1uNxgO
+ h2EYhroQgm636wPfAb4HT92Rpst1pLPK7ixF92bfvw50UMpDqRjwSZIRliUp
+ l8sUCtMYxgaGYVCtVrnnnnu4+eabKZfLPPnkkwALwJeyvydIh6JnSCeH1Fzn
+ 5+f3V6tVVavVjEKhYKytrRn1ej3e2toag4fbusr2W4ydqc/V7oRPS7gpy/Ue
+ 6cnKy8Aj0pNagGkqbNsgl+ui6ysYxir5vGB6eoYHHniAgwcP0m63OX78OA89
+ 9FDU6/WeAv6XS0c2h8uWABY1TTMqlYpRKpV0x3GMfr8vgyAIs6obC9AywrH/
+ haRXh5+Da4/Bn2YW6aDU8CJ4kgQYhkaxmMOyhih1Dl1fJ5ezyOcVptkNDcPY
+ mp2drdZqNXHixAlOnjwZeJ73xSz/X2X7+HkFAZOks74hpbSSJMklSaJlgFEG
+ rm2rxvFu+JkXHkpzsna9Urej1D5AI0l8DEOjUMiRywVIuYambWCaJrncPIYR
+ Ai8nUg7PjkajF19++eVj3W43juP4JPBl4IvZdv7EJUhP5DKDtIDxvZ+8zP/G
+ 8GkVpv+XhRAzpmleJyW/FcfajUkybxjGMoXC9eRyZTRtEyk30XWJYUyilARe
+ JQhej1y3c35zs33ecZydURTNA/8E/PmVUuUnCZjJQI3soV8W8WQb+DCD14UQ
+ VcuypovFYlVKaQdBMCmlPJzLmTfpunG1ELW8pu1C1xW6nkfKHHG8ThC8Eg8G
+ jY7jOBe63Z4dx/FVwNnMXb4JfPetwo8FXJtB69siHvPGiA+ztNKBCV3XJ3Vd
+ ryRJUqpWq6XFxcVipVIxkyQpdrvd/cOhe1RKfVJKXUZRlPi+F/X7nb7jbLX7
+ /cFWHMfz2e/9HXCc9H7lbS+VpcwYfHxeuzziYfZ+SWruuTiOjUKhoHbv3i1m
+ Z2djIIqiSBNC6LZt133ff8JxnB2e5yX9/pa7sdHId7vd+TiO50jH0LNp7fAl
+ fkKRvhUB4/uOiEv3HtsjPrZPkUXfEELotVpN7Nu3L15YWIiVUkkcxzKOY2s4
+ HFZ7vV7VdV3R7XZ/sLa2JjqdTiWzY0HaRR8DXiQdDd7NrS8qg1VXAB8vuS3d
+ NCGE0DQt1nU9klImhmHIYrFodTqd2c3NzaVer2f2er3W+vr6oNVqTYRhaJG2
+ /W9l0PXLvv9dLZUBk8EH214bR30sYpxicZIkcS6XE6Zpmo7jzLRarR39fr/q
+ OM7m+vp6q9Fo5IIgKAOvkzaik0CTd5Eqb7YE6RVictlzVwQndalSLperzs/P
+ LxYKhR2WZU1qmuZubGx0VldXdd/3K6T+/TzpxNj4eYBvhy1fBj3uAdvBEy4V
+ 8JyUck+hUJizbds3DGOt2Wzqg8FgfM/4EvAs6W3HzyxV3mz9H8WDYRQx8Afu
+ AAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAACV0RVh0
+ Y3JlYXRlLWRhdGUAMjAxMC0wMy0yNFQwNToyODo0MyswMjowMPMmiCkAAAAl
+ dEVYdG1vZGlmeS1kYXRlADIwMTAtMDMtMjRUMDU6Mjg6NDMrMDI6MDCsl/4d
+ AAAAAElFTkSuQmCC
+ ====
--- /dev/null
+This package was debianized by Max Waterman <davidmaxwaterman@jeeves> on
+Tue, 23 Mar 2010 20:11:34 +0200.
+
+It was downloaded from <url://example.com>
+
+Upstream Author(s):
+
+ <put author's name and email here>
+ <likewise for another author>
+
+Copyright:
+
+ <Copyright (C) YYYY Name OfAuthor>
+ <likewise for another author>
+
+License:
+
+ This package is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This package 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU Lesser General
+Public License can be found in `/usr/share/common-licenses/LGPL'.
+
+The Debian packaging is (C) 2010, Max Waterman <davidmaxwaterman@jeeves> and
+is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
--- /dev/null
+#
+# Regular cron jobs for the zouba package
+#
+0 4 * * * root [ -x /usr/bin/zouba_maintenance ] && /usr/bin/zouba_maintenance
--- /dev/null
+usr/bin
+usr/sbin
--- /dev/null
+#! /bin/sh -e
+# /usr/lib/emacsen-common/packages/install/zouba
+
+# Written by Jim Van Zandt <jrv@debian.org>, borrowing heavily
+# from the install scripts for gettext by Santiago Vila
+# <sanvila@ctv.es> and octave by Dirk Eddelbuettel <edd@debian.org>.
+
+FLAVOR=$1
+PACKAGE=zouba
+
+if [ ${FLAVOR} = emacs ]; then exit 0; fi
+
+echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR}
+
+#FLAVORTEST=`echo $FLAVOR | cut -c-6`
+#if [ ${FLAVORTEST} = xemacs ] ; then
+# SITEFLAG="-no-site-file"
+#else
+# SITEFLAG="--no-site-file"
+#fi
+FLAGS="${SITEFLAG} -q -batch -l path.el -f batch-byte-compile"
+
+ELDIR=/usr/share/emacs/site-lisp/${PACKAGE}
+ELCDIR=/usr/share/${FLAVOR}/site-lisp/${PACKAGE}
+
+# Install-info-altdir does not actually exist.
+# Maybe somebody will write it.
+if test -x /usr/sbin/install-info-altdir; then
+ echo install/${PACKAGE}: install Info links for ${FLAVOR}
+ install-info-altdir --quiet --section "" "" --dirname=${FLAVOR} /usr/share/info/${PACKAGE}.info.gz
+fi
+
+install -m 755 -d ${ELCDIR}
+cd ${ELDIR}
+FILES=`echo *.el`
+cp ${FILES} ${ELCDIR}
+cd ${ELCDIR}
+
+cat << EOF > path.el
+(setq load-path (cons "." load-path) byte-compile-warnings nil)
+EOF
+${FLAVOR} ${FLAGS} ${FILES}
+rm -f *.el path.el
+
+exit 0
--- /dev/null
+#!/bin/sh -e
+# /usr/lib/emacsen-common/packages/remove/zouba
+
+FLAVOR=$1
+PACKAGE=zouba
+
+if [ ${FLAVOR} != emacs ]; then
+ if test -x /usr/sbin/install-info-altdir; then
+ echo remove/${PACKAGE}: removing Info links for ${FLAVOR}
+ install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/share/info/zouba.info.gz
+ fi
+
+ echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}
+ rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}
+fi
--- /dev/null
+;; -*-emacs-lisp-*-
+;;
+;; Emacs startup file, e.g. /etc/emacs/site-start.d/50zouba.el
+;; for the Debian zouba package
+;;
+;; Originally contributed by Nils Naumann <naumann@unileoben.ac.at>
+;; Modified by Dirk Eddelbuettel <edd@debian.org>
+;; Adapted for dh-make by Jim Van Zandt <jrv@debian.org>
+
+;; The zouba package follows the Debian/GNU Linux 'emacsen' policy and
+;; byte-compiles its elisp files for each 'emacs flavor' (emacs19,
+;; xemacs19, emacs20, xemacs20...). The compiled code is then
+;; installed in a subdirectory of the respective site-lisp directory.
+;; We have to add this to the load-path:
+(let ((package-dir (concat "/usr/share/"
+ (symbol-name flavor)
+ "/site-lisp/zouba")))
+;; If package-dir does not exist, the zouba package must have
+;; removed but not purged, and we should skip the setup.
+ (when (file-directory-p package-dir)
+ (setq load-path (cons package-dir load-path))
+ (autoload 'zouba-mode "zouba-mode"
+ "Major mode for editing zouba files." t)
+ (add-to-list 'auto-mode-alist '("\\.zouba$" . zouba-mode))))
+
--- /dev/null
+zouba_0.9_armel.deb user/navigation extra
--- /dev/null
+#! /bin/sh
+#
+# skeleton example file to build /etc/init.d/ scripts.
+# This file should be used to construct scripts for /etc/init.d.
+#
+# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
+# Modified for Debian
+# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
+# Further changes by Javier Fernandez-Sanguino <jfs@debian.org>
+#
+# Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl
+#
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/sbin/zouba
+NAME=zouba
+DESC=zouba
+
+test -x $DAEMON || exit 0
+
+LOGDIR=/var/log/zouba
+PIDFILE=/var/run/$NAME.pid
+DODTIME=1 # Time to wait for the server to die, in seconds
+ # If this value is set too low you might not
+ # let some servers to die gracefully and
+ # 'restart' will not work
+
+# Include zouba defaults if available
+if [ -f /etc/default/zouba ] ; then
+ . /etc/default/zouba
+fi
+
+set -e
+
+running_pid()
+{
+ # Check if a given process pid's cmdline matches a given name
+ pid=$1
+ name=$2
+ [ -z "$pid" ] && return 1
+ [ ! -d /proc/$pid ] && return 1
+ cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
+ # Is this the expected child?
+ [ "$cmd" != "$name" ] && return 1
+ return 0
+}
+
+running()
+{
+# Check if the process is running looking at /proc
+# (works for all users)
+
+ # No pidfile, probably no daemon present
+ [ ! -f "$PIDFILE" ] && return 1
+ # Obtain the pid and check it against the binary name
+ pid=`cat $PIDFILE`
+ running_pid $pid $DAEMON || return 1
+ return 0
+}
+
+force_stop() {
+# Forcefully kill the process
+ [ ! -f "$PIDFILE" ] && return
+ if running ; then
+ kill -15 $pid
+ # Is it really dead?
+ [ -n "$DODTIME" ] && sleep "$DODTIME"s
+ if running ; then
+ kill -9 $pid
+ [ -n "$DODTIME" ] && sleep "$DODTIME"s
+ if running ; then
+ echo "Cannot kill $LABEL (pid=$pid)!"
+ exit 1
+ fi
+ fi
+ fi
+ rm -f $PIDFILE
+ return 0
+}
+
+case "$1" in
+ start)
+ echo -n "Starting $DESC: "
+ start-stop-daemon --start --quiet --pidfile $PIDFILE \
+ --exec $DAEMON -- $DAEMON_OPTS
+ if running ; then
+ echo "$NAME."
+ else
+ echo " ERROR."
+ fi
+ ;;
+ stop)
+ echo -n "Stopping $DESC: "
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE \
+ --exec $DAEMON
+ echo "$NAME."
+ ;;
+ force-stop)
+ echo -n "Forcefully stopping $DESC: "
+ force_stop
+ if ! running ; then
+ echo "$NAME."
+ else
+ echo " ERROR."
+ fi
+ ;;
+ #reload)
+ #
+ # If the daemon can reload its config files on the fly
+ # for example by sending it SIGHUP, do it here.
+ #
+ # If the daemon responds to changes in its config file
+ # directly anyway, make this a do-nothing entry.
+ #
+ # echo "Reloading $DESC configuration files."
+ # start-stop-daemon --stop --signal 1 --quiet --pidfile \
+ # /var/run/$NAME.pid --exec $DAEMON
+ #;;
+ force-reload)
+ #
+ # If the "reload" option is implemented, move the "force-reload"
+ # option to the "reload" entry above. If not, "force-reload" is
+ # just the same as "restart" except that it does nothing if the
+ # daemon isn't already running.
+ # check wether $DAEMON is running. If so, restart
+ start-stop-daemon --stop --test --quiet --pidfile \
+ /var/run/$NAME.pid --exec $DAEMON \
+ && $0 restart \
+ || exit 0
+ ;;
+ restart)
+ echo -n "Restarting $DESC: "
+ start-stop-daemon --stop --quiet --pidfile \
+ /var/run/$NAME.pid --exec $DAEMON
+ [ -n "$DODTIME" ] && sleep $DODTIME
+ start-stop-daemon --start --quiet --pidfile \
+ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
+ echo "$NAME."
+ ;;
+ status)
+ echo -n "$LABEL is "
+ if running ; then
+ echo "running"
+ else
+ echo " not running."
+ exit 1
+ fi
+ ;;
+ *)
+ N=/etc/init.d/$NAME
+ # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
--- /dev/null
+#!/bin/sh
+#
+# Example init.d script with LSB support.
+#
+# Please read this init.d carefully and modify the sections to
+# adjust it to the program you want to run.
+#
+# Copyright (c) 2007 Javier Fernandez-Sanguino <jfs@debian.org>
+#
+# This is free software; you may 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,
+# or (at your option) any later version.
+#
+# This 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 with
+# the Debian operating system, in /usr/share/common-licenses/GPL; if
+# not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA 02111-1307 USA
+#
+### BEGIN INIT INFO
+# Provides: zouba
+# Required-Start: $network $local_fs
+# Required-Stop:
+# Should-Start: $named
+# Should-Stop:
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: <Enter a short description of the sortware>
+# Description: <Enter a long description of the software>
+# <...>
+# <...>
+### END INIT INFO
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+
+DAEMON=/usr/sbin/zouba # Introduce the server's location here
+NAME=#PACKAGE # Introduce the short server's name here
+DESC=#PACKAGE # Introduce a short description here
+LOGDIR=/var/log/zouba # Log directory to use
+
+PIDFILE=/var/run/$NAME.pid
+
+test -x $DAEMON || exit 0
+
+. /lib/lsb/init-functions
+
+# Default options, these can be overriden by the information
+# at /etc/default/$NAME
+DAEMON_OPTS="" # Additional options given to the server
+
+DIETIME=10 # Time to wait for the server to die, in seconds
+ # If this value is set too low you might not
+ # let some servers to die gracefully and
+ # 'restart' will not work
+
+#STARTTIME=2 # Time to wait for the server to start, in seconds
+ # If this value is set each time the server is
+ # started (on start or restart) the script will
+ # stall to try to determine if it is running
+ # If it is not set and the server takes time
+ # to setup a pid file the log message might
+ # be a false positive (says it did not start
+ # when it actually did)
+
+LOGFILE=$LOGDIR/$NAME.log # Server logfile
+#DAEMONUSER=zouba # Users to run the daemons as. If this value
+ # is set start-stop-daemon will chuid the server
+
+# Include defaults if available
+if [ -f /etc/default/$NAME ] ; then
+ . /etc/default/$NAME
+fi
+
+# Use this if you want the user to explicitly set 'RUN' in
+# /etc/default/
+#if [ "x$RUN" != "xyes" ] ; then
+# log_failure_msg "$NAME disabled, please adjust the configuration to your needs "
+# log_failure_msg "and then set RUN to 'yes' in /etc/default/$NAME to enable it."
+# exit 1
+#fi
+
+# Check that the user exists (if we set a user)
+# Does the user exist?
+if [ -n "$DAEMONUSER" ] ; then
+ if getent passwd | grep -q "^$DAEMONUSER:"; then
+ # Obtain the uid and gid
+ DAEMONUID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $3}'`
+ DAEMONGID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $4}'`
+ else
+ log_failure_msg "The user $DAEMONUSER, required to run $NAME does not exist."
+ exit 1
+ fi
+fi
+
+
+set -e
+
+running_pid() {
+# Check if a given process pid's cmdline matches a given name
+ pid=$1
+ name=$2
+ [ -z "$pid" ] && return 1
+ [ ! -d /proc/$pid ] && return 1
+ cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
+ # Is this the expected server
+ [ "$cmd" != "$name" ] && return 1
+ return 0
+}
+
+running() {
+# Check if the process is running looking at /proc
+# (works for all users)
+
+ # No pidfile, probably no daemon present
+ [ ! -f "$PIDFILE" ] && return 1
+ pid=`cat $PIDFILE`
+ running_pid $pid $DAEMON || return 1
+ return 0
+}
+
+start_server() {
+# Start the process using the wrapper
+ if [ -z "$DAEMONUSER" ] ; then
+ start_daemon -p $PIDFILE $DAEMON -- $DAEMON_OPTS
+ errcode=$?
+ else
+# if we are using a daemonuser then change the user id
+ start-stop-daemon --start --quiet --pidfile $PIDFILE \
+ --chuid $DAEMONUSER \
+ --exec $DAEMON -- $DAEMON_OPTS
+ errcode=$?
+ fi
+ return $errcode
+}
+
+stop_server() {
+# Stop the process using the wrapper
+ if [ -z "$DAEMONUSER" ] ; then
+ killproc -p $PIDFILE $DAEMON
+ errcode=$?
+ else
+# if we are using a daemonuser then look for process that match
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE \
+ --user $DAEMONUSER \
+ --exec $DAEMON
+ errcode=$?
+ fi
+
+ return $errcode
+}
+
+reload_server() {
+ [ ! -f "$PIDFILE" ] && return 1
+ pid=pidofproc $PIDFILE # This is the daemon's pid
+ # Send a SIGHUP
+ kill -1 $pid
+ return $?
+}
+
+force_stop() {
+# Force the process to die killing it manually
+ [ ! -e "$PIDFILE" ] && return
+ if running ; then
+ kill -15 $pid
+ # Is it really dead?
+ sleep "$DIETIME"s
+ if running ; then
+ kill -9 $pid
+ sleep "$DIETIME"s
+ if running ; then
+ echo "Cannot kill $NAME (pid=$pid)!"
+ exit 1
+ fi
+ fi
+ fi
+ rm -f $PIDFILE
+}
+
+
+case "$1" in
+ start)
+ log_daemon_msg "Starting $DESC " "$NAME"
+ # Check if it's running first
+ if running ; then
+ log_progress_msg "apparently already running"
+ log_end_msg 0
+ exit 0
+ fi
+ if start_server ; then
+ # NOTE: Some servers might die some time after they start,
+ # this code will detect this issue if STARTTIME is set
+ # to a reasonable value
+ [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time
+ if running ; then
+ # It's ok, the server started and is running
+ log_end_msg 0
+ else
+ # It is not running after we did start
+ log_end_msg 1
+ fi
+ else
+ # Either we could not start it
+ log_end_msg 1
+ fi
+ ;;
+ stop)
+ log_daemon_msg "Stopping $DESC" "$NAME"
+ if running ; then
+ # Only stop the server if we see it running
+ errcode=0
+ stop_server || errcode=$?
+ log_end_msg $errcode
+ else
+ # If it's not running don't do anything
+ log_progress_msg "apparently not running"
+ log_end_msg 0
+ exit 0
+ fi
+ ;;
+ force-stop)
+ # First try to stop gracefully the program
+ $0 stop
+ if running; then
+ # If it's still running try to kill it more forcefully
+ log_daemon_msg "Stopping (force) $DESC" "$NAME"
+ errcode=0
+ force_stop || errcode=$?
+ log_end_msg $errcode
+ fi
+ ;;
+ restart|force-reload)
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ errcode=0
+ stop_server || errcode=$?
+ # Wait some sensible amount, some server need this
+ [ -n "$DIETIME" ] && sleep $DIETIME
+ start_server || errcode=$?
+ [ -n "$STARTTIME" ] && sleep $STARTTIME
+ running || errcode=$?
+ log_end_msg $errcode
+ ;;
+ status)
+
+ log_daemon_msg "Checking status of $DESC" "$NAME"
+ if running ; then
+ log_progress_msg "running"
+ log_end_msg 0
+ else
+ log_progress_msg "apparently not running"
+ log_end_msg 1
+ exit 1
+ fi
+ ;;
+ # Use this if the daemon cannot reload
+ reload)
+ log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
+ log_warning_msg "cannot re-read the config file (use restart)."
+ ;;
+ # And this if it cann
+ #reload)
+ #
+ # If the daemon can reload its config files on the fly
+ # for example by sending it SIGHUP, do it here.
+ #
+ # If the daemon responds to changes in its config file
+ # directly anyway, make this a do-nothing entry.
+ #
+ # log_daemon_msg "Reloading $DESC configuration files" "$NAME"
+ # if running ; then
+ # reload_server
+ # if ! running ; then
+ # Process died after we tried to reload
+ # log_progress_msg "died on reload"
+ # log_end_msg 1
+ # exit 1
+ # fi
+ # else
+ # log_progress_msg "server is not running"
+ # log_end_msg 1
+ # exit 1
+ # fi
+ #;;
+
+ *)
+ N=/etc/init.d/$NAME
+ echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
--- /dev/null
+.\" Hey, EMACS: -*- nroff -*-
+.\" First parameter, NAME, should be all caps
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
+.\" other parameters are allowed: see man(7), man(1)
+.TH ZOUBA SECTION "March 23, 2010"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh disable hyphenation
+.\" .hy enable hyphenation
+.\" .ad l left justify
+.\" .ad b justify to both left and right margins
+.\" .nf disable filling
+.\" .fi enable filling
+.\" .br insert line break
+.\" .sp <n> insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+zouba \- program to do something
+.SH SYNOPSIS
+.B zouba
+.RI [ options ] " files" ...
+.br
+.B bar
+.RI [ options ] " files" ...
+.SH DESCRIPTION
+This manual page documents briefly the
+.B zouba
+and
+.B bar
+commands.
+.PP
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
+.\" respectively.
+\fBzouba\fP is a program that...
+.SH OPTIONS
+These programs follow the usual GNU command line syntax, with long
+options starting with two dashes (`-').
+A summary of options is included below.
+For a complete description, see the Info files.
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.TP
+.B \-v, \-\-version
+Show version of program.
+.SH SEE ALSO
+.BR bar (1),
+.BR baz (1).
+.br
+The programs are documented fully by
+.IR "The Rise and Fall of a Fooish Bar" ,
+available via the Info system.
+.SH AUTHOR
+zouba was written by <upstream author>.
+.PP
+This manual page was written by Max Waterman <davidmaxwaterman@jeeves>,
+for the Debian project (but may be used by others).
--- /dev/null
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+
+<!-- Process this file with docbook-to-man to generate an nroff manual
+ page: `docbook-to-man manpage.sgml > manpage.1'. You may view
+ the manual page with: `docbook-to-man manpage.sgml | nroff -man |
+ less'. A typical entry in a Makefile or Makefile.am is:
+
+manpage.1: manpage.sgml
+ docbook-to-man $< > $@
+
+
+ The docbook-to-man binary is found in the docbook-to-man package.
+ Please remember that if you create the nroff version in one of the
+ debian/rules file targets (such as build), you will need to include
+ docbook-to-man in your Build-Depends control field.
+
+ -->
+
+ <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+ <!ENTITY dhfirstname "<firstname>FIRSTNAME</firstname>">
+ <!ENTITY dhsurname "<surname>SURNAME</surname>">
+ <!-- Please adjust the date whenever revising the manpage. -->
+ <!ENTITY dhdate "<date>March 23, 2010</date>">
+ <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+ allowed: see man(7), man(1). -->
+ <!ENTITY dhsection "<manvolnum>SECTION</manvolnum>">
+ <!ENTITY dhemail "<email>davidmaxwaterman@jeeves</email>">
+ <!ENTITY dhusername "Max Waterman">
+ <!ENTITY dhucpackage "<refentrytitle>ZOUBA</refentrytitle>">
+ <!ENTITY dhpackage "zouba">
+
+ <!ENTITY debian "<productname>Debian</productname>">
+ <!ENTITY gnu "<acronym>GNU</acronym>">
+ <!ENTITY gpl "&gnu; <acronym>GPL</acronym>">
+]>
+
+<refentry>
+ <refentryinfo>
+ <address>
+ &dhemail;
+ </address>
+ <author>
+ &dhfirstname;
+ &dhsurname;
+ </author>
+ <copyright>
+ <year>2003</year>
+ <holder>&dhusername;</holder>
+ </copyright>
+ &dhdate;
+ </refentryinfo>
+ <refmeta>
+ &dhucpackage;
+
+ &dhsection;
+ </refmeta>
+ <refnamediv>
+ <refname>&dhpackage;</refname>
+
+ <refpurpose>program to do something</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+
+ <arg><option>-e <replaceable>this</replaceable></option></arg>
+
+ <arg><option>--example <replaceable>that</replaceable></option></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1>
+ <title>DESCRIPTION</title>
+
+ <para>This manual page documents briefly the
+ <command>&dhpackage;</command> and <command>bar</command>
+ commands.</para>
+
+ <para>This manual page was written for the &debian; distribution
+ because the original program does not have a manual page.
+ Instead, it has documentation in the &gnu;
+ <application>Info</application> format; see below.</para>
+
+ <para><command>&dhpackage;</command> is a program that...</para>
+
+ </refsect1>
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <para>These programs follow the usual &gnu; command line syntax,
+ with long options starting with two dashes (`-'). A summary of
+ options is included below. For a complete description, see the
+ <application>Info</application> files.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>-h</option>
+ <option>--help</option>
+ </term>
+ <listitem>
+ <para>Show summary of options.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-v</option>
+ <option>--version</option>
+ </term>
+ <listitem>
+ <para>Show version of program.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1>
+ <title>SEE ALSO</title>
+
+ <para>bar (1), baz (1).</para>
+
+ <para>The programs are documented fully by <citetitle>The Rise and
+ Fall of a Fooish Bar</citetitle> available via the
+ <application>Info</application> system.</para>
+ </refsect1>
+ <refsect1>
+ <title>AUTHOR</title>
+
+ <para>This manual page was written by &dhusername; &dhemail; for
+ the &debian; system (but may be used by others). Permission is
+ granted to copy, distribute and/or modify this document under
+ the terms of the &gnu; General Public License, Version 2 any
+ later version published by the Free Software Foundation.
+ </para>
+ <para>
+ On Debian systems, the complete text of the GNU General Public
+ License can be found in /usr/share/common-licenses/GPL.
+ </para>
+
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
+
+
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+
+<!--
+
+`xsltproc -''-nonet \
+ -''-param man.charmap.use.subset "0" \
+ -''-param make.year.ranges "1" \
+ -''-param make.single.year.ranges "1" \
+ /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
+ manpage.xml'
+
+A manual page <package>.<section> will be generated. You may view the
+manual page with: nroff -man <package>.<section> | less'. A typical entry
+in a Makefile or Makefile.am is:
+
+DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
+XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
+
+manpage.1: manpage.xml
+ $(XP) $(DB2MAN) $<
+
+The xsltproc binary is found in the xsltproc package. The XSL files are in
+docbook-xsl. A description of the parameters you can use can be found in the
+docbook-xsl-doc-* packages. Please remember that if you create the nroff
+version in one of the debian/rules file targets (such as build), you will need
+to include xsltproc and docbook-xsl in your Build-Depends control field.
+Alternatively use the xmlto command/package. That will also automatically
+pull in xsltproc and docbook-xsl.
+
+Notes for using docbook2x: docbook2x-man does not automatically create the
+AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
+<refsect1> ... </refsect1>.
+
+To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
+read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
+found in the docbook-xsl-doc-html package.
+
+Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
+
+General documentation about man-pages and man-page-formatting:
+man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
+
+-->
+
+ <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+ <!ENTITY dhfirstname "FIRSTNAME">
+ <!ENTITY dhsurname "SURNAME">
+ <!-- dhusername could also be set to "&firstname; &surname;". -->
+ <!ENTITY dhusername "Max Waterman">
+ <!ENTITY dhemail "davidmaxwaterman@jeeves">
+ <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+ allowed: see man(7), man(1) and
+ http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
+ <!ENTITY dhsection "SECTION">
+ <!-- TITLE should be something like "User commands" or similar (see
+ http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
+ <!ENTITY dhtitle "zouba User Manual">
+ <!ENTITY dhucpackage "ZOUBA">
+ <!ENTITY dhpackage "zouba">
+]>
+
+<refentry>
+ <refentryinfo>
+ <title>&dhtitle;</title>
+ <productname>&dhpackage;</productname>
+ <authorgroup>
+ <author>
+ <firstname>&dhfirstname;</firstname>
+ <surname>&dhsurname;</surname>
+ <contrib>Wrote this manpage for the Debian system.</contrib>
+ <address>
+ <email>&dhemail;</email>
+ </address>
+ </author>
+ </authorgroup>
+ <copyright>
+ <year>2007</year>
+ <holder>&dhusername;</holder>
+ </copyright>
+ <legalnotice>
+ <para>This manual page was written for the Debian system
+ (but may be used by others).</para>
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License,
+ Version 2 or (at your option) any later version published by
+ the Free Software Foundation.</para>
+ <para>On Debian systems, the complete text of the GNU General Public
+ License can be found in
+ <filename>/usr/share/common-licenses/GPL</filename>.</para>
+ </legalnotice>
+ </refentryinfo>
+ <refmeta>
+ <refentrytitle>&dhucpackage;</refentrytitle>
+ <manvolnum>&dhsection;</manvolnum>
+ </refmeta>
+ <refnamediv>
+ <refname>&dhpackage;</refname>
+ <refpurpose>program to do something</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <!-- These are several examples, how syntaxes could look -->
+ <arg choice="plain"><option>-e <replaceable>this</replaceable></option></arg>
+ <arg choice="opt"><option>--example=<parameter>that</parameter></option></arg>
+ <arg choice="opt">
+ <group choice="req">
+ <arg choice="plain"><option>-e</option></arg>
+ <arg choice="plain"><option>--example</option></arg>
+ </group>
+ <replaceable class="option">this</replaceable>
+ </arg>
+ <arg choice="opt">
+ <group choice="req">
+ <arg choice="plain"><option>-e</option></arg>
+ <arg choice="plain"><option>--example</option></arg>
+ </group>
+ <group choice="req">
+ <arg choice="plain"><replaceable>this</replaceable></arg>
+ <arg choice="plain"><replaceable>that</replaceable></arg>
+ </group>
+ </arg>
+ </cmdsynopsis>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <!-- Normally the help and version options make the programs stop
+ right after outputting the requested information. -->
+ <group choice="opt">
+ <arg choice="plain">
+ <group choice="req">
+ <arg choice="plain"><option>-h</option></arg>
+ <arg choice="plain"><option>--help</option></arg>
+ </group>
+ </arg>
+ <arg choice="plain">
+ <group choice="req">
+ <arg choice="plain"><option>-v</option></arg>
+ <arg choice="plain"><option>--version</option></arg>
+ </group>
+ </arg>
+ </group>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1 id="description">
+ <title>DESCRIPTION</title>
+ <para>This manual page documents briefly the
+ <command>&dhpackage;</command> and <command>bar</command>
+ commands.</para>
+ <para>This manual page was written for the Debian distribution
+ because the original program does not have a manual page.
+ Instead, it has documentation in the GNU <citerefentry>
+ <refentrytitle>info</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry> format; see below.</para>
+ <para><command>&dhpackage;</command> is a program that...</para>
+ </refsect1>
+ <refsect1 id="options">
+ <title>OPTIONS</title>
+ <para>The program follows the usual GNU command line syntax,
+ with long options starting with two dashes (`-'). A summary of
+ options is included below. For a complete description, see the
+ <citerefentry>
+ <refentrytitle>info</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry> files.</para>
+ <variablelist>
+ <!-- Use the variablelist.term.separator and the
+ variablelist.term.break.after parameters to
+ control the term elements. -->
+ <varlistentry>
+ <term><option>-e <replaceable>this</replaceable></option></term>
+ <term><option>--example=<replaceable>that</replaceable></option></term>
+ <listitem>
+ <para>Does this and that.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-h</option></term>
+ <term><option>--help</option></term>
+ <listitem>
+ <para>Show summary of options.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-v</option></term>
+ <term><option>--version</option></term>
+ <listitem>
+ <para>Show version of program.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="files">
+ <title>FILES</title>
+ <variablelist>
+ <varlistentry>
+ <term><filename>/etc/foo.conf</filename></term>
+ <listitem>
+ <para>The system-wide configuration file to control the
+ behaviour of <application>&dhpackage;</application>. See
+ <citerefentry>
+ <refentrytitle>foo.conf</refentrytitle>
+ <manvolnum>5</manvolnum>
+ </citerefentry> for further details.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><filename>${HOME}/.foo.conf</filename></term>
+ <listitem>
+ <para>The per-user configuration file to control the
+ behaviour of <application>&dhpackage;</application>. See
+ <citerefentry>
+ <refentrytitle>foo.conf</refentrytitle>
+ <manvolnum>5</manvolnum>
+ </citerefentry> for further details.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="environment">
+ <title>ENVIONMENT</title>
+ <variablelist>
+ <varlistentry>
+ <term><envar>FOO_CONF</envar></term>
+ <listitem>
+ <para>If used, the defined file is used as configuration
+ file (see also <xref linkend="files"/>).</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="diagnostics">
+ <title>DIAGNOSTICS</title>
+ <para>The following diagnostics may be issued
+ on <filename class="devicefile">stderr</filename>:</para>
+ <variablelist>
+ <varlistentry>
+ <term><errortext>Bad configuration file. Exiting.</errortext></term>
+ <listitem>
+ <para>The configuration file seems to contain a broken configuration
+ line. Use the <option>--verbose</option> option, to get more info.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <para><command>&dhpackage;</command> provides some return codes, that can
+ be used in scripts:</para>
+ <segmentedlist>
+ <segtitle>Code</segtitle>
+ <segtitle>Diagnostic</segtitle>
+ <seglistitem>
+ <seg><errorcode>0</errorcode></seg>
+ <seg>Program exited successfully.</seg>
+ </seglistitem>
+ <seglistitem>
+ <seg><errorcode>1</errorcode></seg>
+ <seg>The configuration file seems to be broken.</seg>
+ </seglistitem>
+ </segmentedlist>
+ </refsect1>
+ <refsect1 id="bugs">
+ <!-- Or use this section to tell about upstream BTS. -->
+ <title>BUGS</title>
+ <para>The program is currently limited to only work
+ with the <package>foobar</package> library.</para>
+ <para>The upstreams <acronym>BTS</acronym> can be found
+ at <ulink url="http://bugzilla.foo.tld"/>.</para>
+ </refsect1>
+ <refsect1 id="see_also">
+ <title>SEE ALSO</title>
+ <!-- In alpabetical order. -->
+ <para><citerefentry>
+ <refentrytitle>bar</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry>, <citerefentry>
+ <refentrytitle>baz</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry>, <citerefentry>
+ <refentrytitle>foo.conf</refentrytitle>
+ <manvolnum>5</manvolnum>
+ </citerefentry></para>
+ <para>The programs are documented fully by <citetitle>The Rise and
+ Fall of a Fooish Bar</citetitle> available via the <citerefentry>
+ <refentrytitle>info</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry> system.</para>
+ </refsect1>
+</refentry>
+
--- /dev/null
+?package(zouba):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\
+ title="zouba" command="/usr/bin/zouba"
--- /dev/null
+#!/bin/sh
+# postinst script for zouba
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <postinst> `configure' <most-recently-configured-version>
+# * <old-postinst> `abort-upgrade' <new version>
+# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+# <new-version>
+# * <postinst> `abort-remove'
+# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+# <failed-install-package> <version> `removing'
+# <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+ configure)
+ ;;
+
+ abort-upgrade|abort-remove|abort-deconfigure)
+ ;;
+
+ *)
+ echo "postinst called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
--- /dev/null
+#!/bin/sh
+# postrm script for zouba
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <postrm> `remove'
+# * <postrm> `purge'
+# * <old-postrm> `upgrade' <new-version>
+# * <new-postrm> `failed-upgrade' <old-version>
+# * <new-postrm> `abort-install'
+# * <new-postrm> `abort-install' <old-version>
+# * <new-postrm> `abort-upgrade' <old-version>
+# * <disappearer's-postrm> `disappear' <overwriter>
+# <overwriter-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+ purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+ ;;
+
+ *)
+ echo "postrm called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
--- /dev/null
+#!/bin/sh
+# preinst script for zouba
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <new-preinst> `install'
+# * <new-preinst> `install' <old-version>
+# * <new-preinst> `upgrade' <old-version>
+# * <old-preinst> `abort-upgrade' <new-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+ install|upgrade)
+ ;;
+
+ abort-upgrade)
+ ;;
+
+ *)
+ echo "preinst called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
--- /dev/null
+#!/bin/sh
+# prerm script for zouba
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+# * <prerm> `remove'
+# * <old-prerm> `upgrade' <new-version>
+# * <new-prerm> `failed-upgrade' <old-version>
+# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+# * <deconfigured's-prerm> `deconfigure' `in-favour'
+# <package-being-installed> <version> `removing'
+# <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+ remove|upgrade|deconfigure)
+ ;;
+
+ failed-upgrade)
+ ;;
+
+ *)
+ echo "prerm called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
--- /dev/null
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+
+
+
+configure: configure-stamp
+configure-stamp:
+ dh_testdir
+ # Add here commands to configure the package.
+
+ qmake
+ touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp
+ dh_testdir
+
+ # Add here commands to compile the package.
+ $(MAKE)
+ #docbook-to-man debian/zouba.sgml > zouba.1
+
+ touch $@
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+
+ # Add here commands to clean up after the build process.
+ -$(MAKE) clean
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/zouba.
+ $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/zouba install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs
+ dh_installdocs
+ dh_installexamples
+# dh_install
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installemacsen
+# dh_installpam
+# dh_installmime
+# dh_python
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+# dh_perl
+# dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
--- /dev/null
+# Example watch control file for uscan
+# Rename this file to "watch" and then you can run the "uscan" command
+# to check for upstream updates and more.
+# See uscan(1) for format
+
+# Compulsory line, this is a version 3 file
+version=3
+
+# Uncomment to examine a Webpage
+# <Webpage URL> <string match>
+#http://www.example.com/downloads.php zouba-(.*)\.tar\.gz
+
+# Uncomment to examine a Webserver directory
+#http://www.example.com/pub/zouba-(.*)\.tar\.gz
+
+# Uncommment to examine a FTP server
+#ftp://ftp.example.com/pub/zouba-(.*)\.tar\.gz debian uupdate
+
+# Uncomment to find new files on sourceforge, for devscripts >= 2.9
+# http://sf.net/zouba/zouba-(.*)\.tar\.gz
+
+# Uncomment to find new files on GooglePages
+# http://example.googlepages.com/foo.html zouba-(.*)\.tar\.gz
--- /dev/null
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installdirs
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installdirs
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_installchangelogs
+dh_installdocs
+dh_installexamples
+dh_installman
+dh_link
+dh_strip
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
--- /dev/null
+# Defaults for zouba initscript
+# sourced by /etc/init.d/zouba
+# installed at /etc/default/zouba by the maintainer scripts
+
+#
+# This is a POSIX shell fragment
+#
+
+# Additional options that are passed to the Daemon.
+DAEMON_OPTS=""
--- /dev/null
+Document: zouba
+Title: Debian zouba Manual
+Author: <insert document author here>
+Abstract: This manual describes what zouba is
+ and how it can be used to
+ manage online manuals on Debian systems.
+Section: unknown
+
+Format: debiandoc-sgml
+Files: /usr/share/doc/zouba/zouba.sgml.gz
+
+Format: postscript
+Files: /usr/share/doc/zouba/zouba.ps.gz
+
+Format: text
+Files: /usr/share/doc/zouba/zouba.text.gz
+
+Format: HTML
+Index: /usr/share/doc/zouba/html/index.html
+Files: /usr/share/doc/zouba/html/*.html
+
+
--- /dev/null
+755 root root . usr /
+755 root root . usr/share /
+755 root root . usr/share/doc /
+755 root root . usr/share/doc/zouba /
+644 root root . usr/share/doc/zouba/changelog.gz debian/zouba/usr/share/doc/zouba/changelog.gz
+644 root root . usr/share/doc/zouba/README.Debian debian/zouba/usr/share/doc/zouba/README.Debian
+644 root root . usr/share/doc/zouba/copyright debian/zouba/usr/share/doc/zouba/copyright
+755 root root . usr/share/applications /
+755 root root . usr/share/applications/hildon /
+644 root root . usr/share/applications/hildon/zouba.desktop debian/zouba/usr/share/applications/hildon/zouba.desktop
+755 root root . usr/share/icons /
+755 root root . usr/share/icons/hicolor /
+755 root root . usr/share/icons/hicolor/64x64 /
+755 root root . usr/share/icons/hicolor/64x64/apps /
+644 root root . usr/share/icons/hicolor/64x64/apps/zouba.png debian/zouba/usr/share/icons/hicolor/64x64/apps/zouba.png
+755 root root . usr/bin /
+755 root root . usr/bin/zouba debian/zouba/usr/bin/zouba
+755 root root . usr/sbin /
+++ /dev/null
-[Desktop Entry]
-Icon=text-html
-Type=Link
-URL[$e]=http://coordtrans.fgi.fi/
-X-Ubuntu-Gettext-Domain=desktop_kdebase
+++ /dev/null
-<html><head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
-<meta name="author" content="Eino Uikkanen">
-<meta name="keywords" content="ETRS-TM35FIN ETRS-GK KKJ YKJ ETRS89 ETRF89 EUREF-FIN">
-<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
-<title>Suomalaiset koordinaatistot</title>
-<link rev="made" href="mailto:eino.uikkanen@iki.fi">
-</head><body bgcolor="#ffffff">
-
-<h1><a href="http://www.kolumbus.fi/eino.uikkanen/index.htm"><font face="Verdana" size="2">Eino
-Uikkasen kotisivu</font></a><font face="Verdana" size="2"> > </font><a href="http://www.kolumbus.fi/eino.uikkanen/geodocs/kkjgps.htm"><font face="Verdana" size="2">Suomalaiset
-koordinaatistot</font></a><font face="Verdana" size="2"> -
-päivitetty <!--webbot bot="Timestamp" startspan s-type="EDITED"\r
-s-format="%d.%m.%Y" -->18.10.2009<!--webbot bot="Timestamp"\r
-i-checksum="12483" endspan --></font></h1>
-
-<hr color="#808080" noshade="noshade">
-
-<h1><a name="Suomessa käytössä olevat koordinaatistot ja GPS"><font face="Verdana" size="2">Suomessa käytössä olevat
-vaakakoordinaatistot</font></a></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">Tämä artikkeli on lyhyt
- kuvaus Suomessa käytetyistä vaakakoordinaatistoista, joista
- lista taulussa 1.</font></p>
-</blockquote>
-
-<blockquote>
- <table border="6">
- <tbody><tr>
- <td colspan="4"><font face="Verdana" size="2"><strong>Taulu
- 1, Suomalaiset koordinaatistot</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Tunnus</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Nimi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Käytetty
- kartantuotannossa</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kommentti</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">VVJ</font></td>
- <td><font face="Verdana" size="2">Helsingin
- järjestelmä</font></td>
- <td><font face="Verdana" size="2">-1970</font></td>
- <td><font face="Verdana" size="2">Edelleen
- käytössä eräissä kaupungeissa</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">ED50</font></td>
- <td><font face="Verdana" size="2">European Datum 1950
- </font></td>
- <td><font face="Verdana" size="2">Ei koskaan</font></td>
- <td><font face="Verdana" size="2">Kansallinen
- tasoitus 1966</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">Kartastokoordinaattijärjestelmä</font></td>
- <td><font face="Verdana" size="2">1970-2005</font></td>
- <td><font face="Verdana" size="2">Perustuu ED50
- koordinaatistoon</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">EUREF-FIN</font></td>
- <td><font face="Verdana" size="2">EUREF-FIN</font></td>
- <td><font face="Verdana" size="2">2003- merikartat,
- 2005- maastokartat</font></td>
- <td><font face="Verdana" size="2">ETRS89 realisaatio
- Suomessa</font></td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2">Artikkelista löytyy
- englanninkielinen versio sivulta: </font><a href="http://www.kolumbus.fi/eino.uikkanen/geodocsgb/ficoords.htm"><font face="Verdana" size="2">Finnish coordinate systems</font></a></p>
- <p><font face="Verdana" size="2">Suomessa käytössä
- olevista korkeusjärjestelmistä löytyy kirjoitus sivulta: </font><a href="http://www.kolumbus.fi/eino.uikkanen/geodocs/korkeudet.htm"><font face="Verdana" size="2">Suomen
- korkeusjärjestelmät</font></a></p>
- <p><font face="Verdana" size="2">Vastaan mieluusti
- artikkeliin liittyviin kysymyksiin ja kommentteihin
- osoitteessa </font><a href="mailto:eino.uikkanen@iki.fi"><font face="Verdana" size="2">eino.uikkanen@iki.fi</font></a><font face="Verdana" size="2">.</font></p>
-</blockquote>
-
-<h1><font face="Verdana" size="2">KKJ:n edeltäjä, Helsingin
-järjestelmä alias VVJ, -1970</font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">Ennen KKJ:n käyttöönottoa
- kartastotöissä käytettiin järjestelmää nimeltä 'Helsingin
- järjestelmä' alias VVJ, Vanha Valtion Järjestelmä.
- Siirtyminen VVJ:stä KKJ:hin aloitettiin 1970, mutta VVJ:n
- mukaisia koordinaatteja on vieläkin käytössä eräissä
- kunnissa. </font></p>
- <p><font face="Verdana" size="2">KKJ ei millään tavalla
- pohjaudu VVJ:hin, vaan ED50-koordinaatistoon ja sen
- kansalliseen laajennukseen, mutta KKJ määriteltiin
- kierrettäväksi tasossa siten, että se mahdollisimman hyvin
- yhtyy vanhaan VVJ-koordinaatistoon. Tällä saavutettiin se
- etu, että vanhoja karttoja voitiin käyttää ylimenokauden
- ajan tarvitsematta ottaa huomioon koordinaattijärjestelmän
- muutosta. Jos siis kartassa on VVJ-koordinaatisto, sitä voi
- käsitellä kuten kartta olisi tehty KKJ-koordinaatiston
- mukaisesti, huomioiden kuitenkin seuraavat erot VVJ- ja KKJ-koordinaattien
- arvoissa ja esitysmuodoissa:</font></p>
- <ul>
- <li><font face="Verdana" size="2">VVJ-koordinaattien ja
- KKJ-koordinaattien ero on keskimäärin 2 m (Suomen
- kartasto, vihko 112, sivu 11, 1984). Eroissa
- kannattaa varautua suuriin alueellisiin vaihteluihin
- ja suurimmillaan 10 m virheisiin.</font></li>
- <li><font face="Verdana" size="2">VVJ y-koordinaatti
- esitetään ilman edeltävää kaistanumeroa, jonka
- sijalla saattaa olla keskimeridiaanin arvo asteina,
- esim. jos KKJ y-koordinaatti on 3511666, niin VVJ y-koordinaatti
- voidaan esittää muodossa 511666 tai 27°511666</font></li>
- <li><font face="Verdana" size="2">VVJ-koordinaatiston
- koordinaateista jätettiin usein pois tuhannet ja
- jopa sadat kilometrit</font></li>
- </ul>
-</blockquote>
-
-<h1><font face="Verdana" size="2"><strong>ED50-järjestelmä,
-European datum 1950, Suomen kansallinen tasoitus 1966</strong></font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">European Datum 1959 (ED50)
- perustuu 1950-luvulla tehtyyn Euroopan laajuiseen
- kolmioverkkojen yhteistasoitukseen. Suomen ED50-järjestelmä
- perustuu v. 1966 tehtyyn ensimmäisen luokan kolmioverkkojen
- tasoitukseen, jonka lähtöpisteet otettiin eurooppalaisesta
- tasoituksesta (Korhonen Jorma, 1967). Tämän kansallisen
- tasoituksen lopputulosta, ED50-koordinaatistoa, ei ole
- Suomessa koskaan käytetty karttatuotannossa ja siksi ei ole
- missään tilanteessa mielekästä laittaa GPS-laitteeseen
- tai karttaohjelmaan ED50:n mukaisia asetuksia, vaikka monissa
- lähteissä näin kehotetaan tekemään. ED50 koordinaatisto
- on kuitenkin varsin merkityksellinen, sillä se on ollut
- pohjana Suomessa vuonna 1970 käyttöönotetulle KKJ-koordinaatistolle.</font></p>
-</blockquote>
-
-<h1><a name="KKJ-koordinaatisto"><font face="Verdana" size="2">KKJ-koordinaatisto</font></a><font face="Verdana" size="2">, kartastokoordinaattijärjestelmä, 1970
-- 2003/2005</font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">KKJ-koordinaatisto on
- johdettu ED50-koordinaatistosta (Suomen kansallinen tasoitus
- 1966) siirtämällä ja kiertämällä ED50-koordinaatistoa
- siten, että se mahdollisimman hyvin yhtyy KKJ:n
- edeltäjään eli VVJ-koordinaatistoon.</font></p>
- <p><font face="Verdana" size="2">KKJ:n yhteydessä
- käytetään referenssiellipsoidina Hayfordin ellipsoidia,
- joka tunnetaan myös nimellä International 1924. Taulussa 2
- on kuvattu Hayfordin ellipsoidin parametrit, isoakselin
- puolikkaan pituus metreinä ja litistyssuhde eli flattening,
- joka lasketaan kaavalla (isoakseli-pikkuakseli)/isoakseli.
- Näitä arvoja ei usein ilmoiteta suoraan, vaan
- vähennettynä WGS84-ellipsoidin vastaavista luvuista,
- jolloin litistyssuhteiden erotus kerrotaan vielä luvulla
- 10000. Siksi taulussa 2 esitetään myös WGS84 ellipsoidin
- parametrit sekä parametrien arvojen erotukset (DA,DF) . </font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="6"><font face="Verdana" size="2"><strong>Taulu
- 2, Hayford eli International 1924 ja WGS84
- ellipsoidit</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Parametri</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Selite</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Yksikkö</strong></font></td>
- <td><font face="Verdana" size="2"><strong>WGS84</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Hayford</strong></font></td>
- <td><font face="Verdana" size="2"><strong>WGS84-Hayford</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">A, DA</font></td>
- <td><font face="Verdana" size="2">Isoakselin puolikas</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">6378137</font></td>
- <td><font face="Verdana" size="2">6378388</font></td>
- <td><font face="Verdana" size="2">-251</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">F, DF</font></td>
- <td><font face="Verdana" size="2">Litistyssuhde</font></td>
- <td> </td>
- <td><font face="Verdana" size="2">1/298.257223563</font></td>
- <td><font face="Verdana" size="2">1/297</font></td>
- <td><font face="Verdana" size="2">-0.14192702256</font></td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2">KKJ-koordinaatit voidaan
- esittää joko maantieteellisinä koordinaatteina (leveys,
- pituus) tai tasokoordinaatteina (pohjois- ja itäkoordinaatti),
- jotka johdetaan maantieteellisistä koordinaateista Gauss-Krüger-projektiokaavalla.
- Koska KKJ on kaksiulotteinen koordinaatisto, siihen ei liity
- mitään määritelmää korkeudesta. Jos KKJ:n yhteydessä
- kuitenkin annetaan korkeus, se on aina ortometrinen korkeus
- kansallisessa korkeussysteemissä (esim. N60). </font></p>
- <p><font face="Verdana" size="2">KKJ-tasokoordinaatisto
- koostuu kuudesta (0-5) kolme astetta leveästä kaistasta.
- Usein esitetään vain kaistat 1-4, jotka peittävät melkein
- koko Suomen, mutta joskus esitetään myös kaistat 0 ja 5.
- Tätä kuudesta kolme astetta leveästä kaistasta koostuvaa
- koordinaatistoa kutsutaan nimellä 'Peruskoordinaatisto'.
- Tämän lisäksi kaistan 3 parametreja käytetään
- valtakunnanlaajuisesti. Tätä valtakunnanlaajuista yhden
- kaistan koordinaatistoa kutsutaan nimellä 'Yhtenäiskoordinaatisto'.
- Maastokartoissa peruskoordinaatisto esitetään mustalla
- ruudukolla ja yhtenäiskoordinaatisto punaisella ruudukolla.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="7"><font face="Verdana" size="2"><strong>Taulu
- 3, KKJ peruskoordinaatisto, musta ruudukko</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Projektio</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoidi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kaista</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Keskusmeridiaani</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Valeitä</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Mittakaavakerroin
- keskusmeridiaanilla</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kaistan
- leveys</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Projection</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoid</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Zone</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Central
- meridian</strong></font></td>
- <td><font face="Verdana" size="2"><strong>False
- Easting</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Scale
- factor at Central Meridian</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Zone width</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">0</font></td>
- <td><font face="Verdana" size="2">18</font></td>
- <td><font face="Verdana" size="2">500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">1</font></td>
- <td><font face="Verdana" size="2">21</font></td>
- <td><font face="Verdana" size="2">1500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">2</font></td>
- <td><font face="Verdana" size="2">24</font></td>
- <td><font face="Verdana" size="2">2500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- <td><font face="Verdana" size="2">27</font></td>
- <td><font face="Verdana" size="2">3500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">4</font></td>
- <td><font face="Verdana" size="2">30</font></td>
- <td><font face="Verdana" size="2">4500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">5</font></td>
- <td><font face="Verdana" size="2">33</font></td>
- <td><font face="Verdana" size="2">5500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- </tr>
- </tbody></table>
- <p> </p>
- <table border="6">
- <tbody><tr>
- <td colspan="7"><font face="Verdana" size="2"><strong>Taulu
- 4, KKJ yhtenäiskoordinaatisto YKJ, punainen ruudukko</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Projektio</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoidi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kaista</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Keskusmeridiaani</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Valeitä</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Mittakaavakerroin
- keskusmeridiaanilla</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kaistan
- leveys</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Projection</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoid</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Zone</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Central
- Meridian</strong></font></td>
- <td><font face="Verdana" size="2"><strong>False
- Easting</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Scale
- factor at Central Meridian</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Zone width</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">YKJ</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">3</font></td>
- <td><font face="Verdana" size="2">27</font></td>
- <td><font face="Verdana" size="2">3500000</font></td>
- <td><font face="Verdana" size="2">1.000</font></td>
- <td><font face="Verdana" size="2">Koko Suomi (13)</font></td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2">Ylläkuvattujen parametrien
- lisäksi laitteissa esiintyy usein myös parametrit
- valepohjoinen eli False Northing sekä Latitude of Origin -
- näiden arvot ovat KKJ-koordinaattien laskennassa nollia.</font></p>
- <p><font face="Verdana" size="2">Pisteen suorakulmaisten KKJ-koordinaattien
- arvojen voidaan ajatella syntyvän seuraavasti:</font></p>
-</blockquote>
-
-<blockquote>
- <ol>
- <li><font face="Verdana" size="2">Siirrytään pisteestä
- suorinta tietä keskimeridiaanille - matka metreinä
- on y-koordinaatin alkuarvo. Arvo asetetaan
- negatiiviseksi keskimeridiaanin länsipuolella ja
- positiiviseksi itäpuolella. Esimerkiksi y=45107.</font></li>
- <li><font face="Verdana" size="2">Siirrytään tästä
- pisteestä edelleen keskimeridiaania myöten
- päiväntasaajalle - matka metreinä on x-koordinaatin
- arvo. Esimerkiksi x=6717563.</font></li>
- <li><font face="Verdana" size="2">Jotta y-koordinaatin
- arvo tulisi positiiviseksi molemmin puolin
- keskimeridiaania, siihen lisätään 500000 metriä.
- Tämä luku on nimeltään valeitä eli false easting.
- Esimerkiksi y=545107.</font></li>
- <li><font face="Verdana" size="2">Jotta kaistan
- tunnistaisi suoraan koordinaattien arvosta,
- lisätään y-koordinaatin eteen kaistan numero.
- Esimerkiksi y=2545107.</font></li>
- <li><font face="Verdana" size="2">Näin saatiin
- koordinaattien arvoksi: x=6717563 ja y=2545107</font></li>
- </ol>
-</blockquote>
-
-<blockquote>
- <p><font face="Verdana" size="2">Kohtia 3 ja 4 ei yleensä
- ajatella erillisinä, vaan kaistan numeron lisäys
- huomioidaan valeidän arvossa. Esimerkiksi yllä valeitä
- olisi 2 500 000 metriä.</font></p>
- <p><font face="Verdana" size="2">Koska maapallo ei ole taso,
- eivät suorakulmaiset xy-koordinaatit voi kuvata täsmälleen
- pisteiden metrisiä etäisyyksiä, vaan
- koordinaattipisteistä tasogeometrian keinoin lasketut
- keskinäiset etäisyydet poikkeavat todellisista metrisistä
- etäisyyksistä sitä enemmän, mitä kauempana ollaan
- keskimeridiaanista. Tätä eroa kutsutaan nimellä 'projektiovirhe'.
- Kyseessä ei kuitenkaan ole "virhe" vaan ero, joka
- on tarkasti laskettavissa ja joka tulee ymmärtää ja
- huomioida tarkoissa sovelluksissa. Normaalikäyttäjälle
- projektiovirheellä ei ole vähäisintäkään merkitystä
- edes yhtenäiskoordinaatistossa, jonka laidoilla se esiintyy
- suurimpana. Huomaa erityisesti, että projektiovirhe
- vaikuttaa vain mittakaavaan, eikä lainkaan koordinaattien
- arvoihin. Koordinaattien arvot eivät siis ole epätarkempia
- kaistan reunoilla.</font></p>
- <p><font face="Verdana" size="2">Taulussa 5 esimerkkinä
- samasta pisteestä eri muodoissa esitettyjä koordinaatteja.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="3"><font face="Verdana" size="2"><strong>Taulu
- 5, esimerkkejä koordinaattien arvoista</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Koordinaattityyppi</strong></font></td>
- <td align="center"><font face="Verdana" size="2"><strong>leveys</strong></font></td>
- <td align="center"><font face="Verdana" size="2"><strong>pituus</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">WGS84
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">60.566077</font></td>
- <td><font face="Verdana" size="2">24.819210</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">60.565894</font></td>
- <td><font face="Verdana" size="2">24.822422</font></td>
- </tr>
- <tr>
- <td align="center"> </td>
- <td align="center"><font face="Verdana" size="2"><strong>x</strong></font></td>
- <td align="center"><font face="Verdana" size="2"><strong>y</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ suorakulmaiset,
- kaista 2</font></td>
- <td><font face="Verdana" size="2">6717563</font></td>
- <td><font face="Verdana" size="2">2545107</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ suorakulmaiset,
- kaista 3/YKJ</font></td>
- <td><font face="Verdana" size="2">6719258</font></td>
- <td><font face="Verdana" size="2">3380581</font></td>
- </tr>
- </tbody></table>
-</blockquote>
-
-<blockquote>
- <p><font face="Verdana" size="2"><strong>Muuntoparametrit </strong></font><a name="Muunnos WGS84-koordinaatistosta KKJ-koordinaatistoon eli datum-muunnos"><font face="Verdana" size="2"><strong>EUREF-FIN(WGS84) ja -KKJ-koordinaatistojen
- </strong></font></a><font face="Verdana" size="2"><strong>väliseen
- yhdenmuotoisuusmuunnokseen </strong></font></p>
-</blockquote>
-
-<blockquote>
- <p><font face="Verdana" size="2">Datumin, tässä tapauksessa
- KKJ-koordinaatiston kuvaamiseen tarvitaan kahdenlaisia lukuja.
- Toiset luvut kertovat, miten EUREF-FIN ja KKJ-koordinaatiston
- pisteet muutetaan toisikseen kolmiulotteisissa X,Y,Z-koordinaatistoissa.
- Toiset luvut kuvaavat ellipsoidin, jonka mukaan
- kolmiulotteiset X,Y,Z-koordinaatit muunnetaan
- maantieteellisiksi koordinaateiksi ja päinvastoin.</font></p>
- <p><font face="Verdana" size="2">Muunnos datumien, esim.
- EUREF-FIN:n ja KKJ:n välillä tapahtuu lähes kaikissa
- harrastajalaitteissa kolmiulotteisella
- yhdenmuotoisuusmuunnoksella. Yhdenmuotoisuusmuunnos tapahtuu
- siten, että toisen koordinaatiston pisteitä siirretään ja
- kierretään siten, että ne mahdollisimman hyvin yhtyvät
- toisen koordinaatiston pisteisiin. Siirtojen ja kiertojen
- lisäksi yhdenmuotoisuusmuunnokseen saattaa liittyä
- mittakaavan muunnos. Näin ollen kaikki
- yhdenmuotoisuusmuunnokset voidaan kuvata seitsemällä
- luvulla: siirrot kolmeen suuntaan (3), kierrot kolmen akselin
- ympäri (3) ja mittakaavamuunnos (1). Useissa
- harrastajalaitteissa yhdenmuotoisuusmuunnoksesta tehdään
- pelkästään siirrot eli yhdenmuotoisuusmuunnos kuvataan
- vain kolmella luvulla, mikä heikentää muunnoksen
- tarkkuutta. </font></p>
- <p><font face="Verdana" size="2">Taulussa 6 on kuvattu
- parhaat muunnosarvot seitsenparametristä ja
- kolmiparametristä KKJ-WGS84-yhdenmuotoisuusmuunnosta varten.
- Yhdenmuotoisuusmuunnosta tarkempia menetelmiä on kuvattu
- julkisen hallinnon tiedotteessa 154: </font><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a></p>
- <p><font face="Verdana" size="2">Seitsenparametrisen
- muunnoksen parametrit (sarake 1) ovat Geodeettisen Laitoksen
- 3D-muunnokselle KKJ-ETRF89 laskemat arvot. Laskenta on
- suoritettu pienimmän neliösumman menetelmällä käyttäen
- 90 pistettä, jotka Geodeettinen Laitos on mitannut ETRF89-koordinaatiston
- realisoinnin yhteydessä. Koko Suomea koskevan
- yhdenmuotoisuusmuunnoksen parametreja siis tuskin juurikaan
- voidaan tästä parantaa.</font></p>
- <p><font face="Verdana" size="2">Taulukon kolmiparametristen
- muunnosten parametrit (sarakkeet 2-4) olen laskenut itse
- käyttäen Geodeettisen Laitoksen mittaamaa pisteistöä,
- joka siis teki mahdolliseksi uusien tarkempien parametrien
- laskennan myös kolmiparametrisille muunnoksille. Suoritin
- laskennan yksinkertaisesti minimoimalla X-, Y- ja Z-akselien
- suuntaisten virheiden aritmeettiset keskiarvot. Pyöristin
- parametrien arvot kokonaisluvuiksi, koska useat GPS-laitteet
- eivät ota vastaan desimaaleja siirtymäarvoissa. Sarakkeessa
- 2 kuvaan parametrit, jotka olen laskenut käytettäväksi
- koko valtakunnan alueella. Sarakkeissa 3 ja 4 kuvaan
- parametrit, jotka olen laskenut erikseen Etelä- ja Pohjois-Suomessa
- käytettäväksi (leveys <65 ja >65 astetta).</font></p>
- <p><font face="Verdana" size="2">Vertailun vuoksi olen
- sarakkeessa 5 (harmaa sarake) esittänyt parametrit, jotka
- ovat käytössä useimmissa GPS-laitteissa, joissa KKJ-muunnos
- on valmiina. Nämä parametrit on laskenut Jukka Varonen /
- Merenkulkulaitos vuonna 1989. Tämän jälkeen niitä on
- sovellettu useimmissa GPS-laitteissa ja monissa
- karttaohjelmissa lähes teollisuusstandardina. Parametrit on
- laskettu käytettäväksi pelkästään merialueilla, mutta
- ne pätevät silti koko Suomen alueella niin hyvin, ettei
- tarkkuuserolla uusiin ja vartavasten koko Suomea varten
- laskettuihin kolmiparametrisiin muunnoksiin ole mitään
- käytännön merkitystä.</font></p>
- <p><font face="Verdana" size="2">Taulukkoon liitetyt
- tarkkuusarvot ovat laskemiani epävirallisia ja
- tarkistamattomia arvoja. Olen laskenut kolmiparametristen
- muunnosten tarkkuusarvot pyöristetyille parametrien arvoille
- eli olen ensin pyöristänyt parametrit ja vasta sitten
- laskenut tarkkuusarvot. Keski- ja maksimivirheestä on
- huomattava, että ne tarkoittavat keskimääräistä ja
- suurinta virhettä laskennassa käytetyssä, vaikkakin
- edustavassa aineistossa - ei yleisesti keskimääräistä ja
- suurinta mahdollista virhettä.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="8"><font face="Verdana" size="2"><strong>Taulu
- 6, Yhdenmuotoisuusmuunnoksen KKJ-WGS84(ETRF89)
- parametreja</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Parametri</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Selite</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Yksikkö</strong></font></td>
- <td><font face="Verdana" size="2"><strong>1</strong></font></td>
- <td><font face="Verdana" size="2"><strong>2</strong></font></td>
- <td><font face="Verdana" size="2"><strong>3</strong></font></td>
- <td><font face="Verdana" size="2"><strong>4</strong></font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2"><strong>5</strong></font></td>
- </tr>
- <tr>
- <td> </td>
- <td><font face="Verdana" size="2">Sovellusalueen
- leveysasteet</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td><font face="Verdana" size="2"><65</font></td>
- <td><font face="Verdana" size="2">>65</font></td>
- <td bgcolor="#c0c0c0"> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">DX</font></td>
- <td><font face="Verdana" size="2">Siirto X-akselin
- suunnassa</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">-96.062</font></td>
- <td><font face="Verdana" size="2">-75</font></td>
- <td><font face="Verdana" size="2">-74</font></td>
- <td><font face="Verdana" size="2">-76</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">-78</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">DY</font></td>
- <td><font face="Verdana" size="2">Siirto Y-akselin
- suunnassa</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">-82.428</font></td>
- <td><font face="Verdana" size="2">-230</font></td>
- <td><font face="Verdana" size="2">-229</font></td>
- <td><font face="Verdana" size="2">-232</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">-231</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">DZ</font></td>
- <td><font face="Verdana" size="2">Siirto Z-akselin
- suunnassa</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">-121.754</font></td>
- <td><font face="Verdana" size="2">-89</font></td>
- <td><font face="Verdana" size="2">-88</font></td>
- <td><font face="Verdana" size="2">-91</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">-97</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">rx</font></td>
- <td><font face="Verdana" size="2">Kierto X-akselin
- ympäri</font></td>
- <td><font face="Verdana" size="2">sekunti</font></td>
- <td><font face="Verdana" size="2">-4.801</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td bgcolor="#c0c0c0"> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">ry</font></td>
- <td><font face="Verdana" size="2">Kierto Y-akselin
- ympäri</font></td>
- <td><font face="Verdana" size="2">sekunti</font></td>
- <td><font face="Verdana" size="2">-0.345</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td bgcolor="#c0c0c0"> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">rz</font></td>
- <td><font face="Verdana" size="2">Kierto Z-akselin
- ympäri</font></td>
- <td><font face="Verdana" size="2">sekunti</font></td>
- <td><font face="Verdana" size="2">+1.376</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td bgcolor="#c0c0c0"> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">m</font></td>
- <td><font face="Verdana" size="2">Mittakaavakerroin =
- (mittakaava-1)*10^6</font></td>
- <td> </td>
- <td><font face="Verdana" size="2">+1.496</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td bgcolor="#c0c0c0"> </td>
- </tr>
- <tr>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td bgcolor="#c0c0c0"> </td>
- </tr>
- <tr>
- <td> </td>
- <td><font face="Verdana" size="2">Virheen keskiarvo</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">0.8</font></td>
- <td><font face="Verdana" size="2">1.6</font></td>
- <td><font face="Verdana" size="2">1.4</font></td>
- <td><font face="Verdana" size="2">0.8</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">1.8</font></td>
- </tr>
- <tr>
- <td> </td>
- <td><font face="Verdana" size="2">Maksimivirhe</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">2</font></td>
- <td><font face="Verdana" size="2">3.3</font></td>
- <td><font face="Verdana" size="2">2.5</font></td>
- <td><font face="Verdana" size="2">1.8</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">3.4</font></td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2">Seitsenparametrisen 3D-yhdenmuotoisuusmuunnoksen
- kaavoista on käytössä useita toisistaan hieman poikkeavia
- versioita, joista toinen ei ole sen oikeampi tai väärempi
- kuin toinen; oleellista on vain se, että parametrit on
- annettu vastaamaan kulloinkin käytössä olevaa kaavaa.
- Siksi esitän taulussa 7 3D-yhdenmuotoisuusmuunnoskaavan,
- jota ajatellen edelläesitetyt muunnosparametrit on
- määritelty. Valtaosa eri lähteissä tarjolla olevista
- muunnosparametreistä esitetään joko tämän kaavan
- mukaisina tai sellaisen kaavan mukaisina, joissa
- kiertokulmien etumerkit ovat vastakkaiset tälle kaavalle.
- Kannattaa siis erityisesti tarkistaa, että kiertokulmien
- etumerkit ja käytetty kaava vastaavat toisiaan.
- Muunnoskaavan kiertokulmien yksikkö on radiaani, mutta
- kiertokulmat on parametreissa esitetty kaarisekunteina, koska
- ne useimmiten ilmoitetaan laitteille ja ohjelmille
- kaarisekunteina.</font></p>
- <table border="6">
- <tbody><tr>
- <td><font face="Verdana" size="2"><strong>Taulu 7, 3D-yhdenmuotoisuusmuunnoskaava,
- jota vastaan muunnosparametrit on määritelty</strong></font></td>
- </tr>
- <tr>
- <td><pre><font size="2"> </font><font size="3">|X2| |DX| | 1 Rz -Ry | |X1|</font></pre>
- <pre><font size="3"> |Y2| = |DY| + (1+m/10^6) * |-Rz 1 Rx | * |Y1|</font></pre>
- <pre><font size="3"> |Z2| |DZ| | Ry -Rx 1 | |Z1|</font></pre>
- </td>
- </tr>
- </tbody></table>
-</blockquote>
-
-<p> </p>
-
-<h1><font face="Verdana" size="2">Kuntien ja kaupunkien omat
-koordinaatistot</font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">Useissa kunnissa on
- käytössä oma koordinaatisto. Oheisessa
- Maanmittauslaitoksen artikkelissa on esitetty varsin kattava
- luettelo kuntien omista koordinaatistoista sekä
- muunnoskaavat kuntien omien koordinaatistojen ja KKJ-koordinaatiston
- välillä. Artikkelista löytyy myös yhteystiedot
- lisätietojen saamista varten.</font></p>
- <ul>
- <li><a href="http://www.maanmittauslaitos.fi/paikkatiedot/default.asp?id=895"><font face="Verdana" size="2">Koordinaattimuunnokset
- kuntien omien koordinaatistojen ja KKJ:n välillä</font></a></li>
- </ul>
- <p><font face="Verdana" size="2">Eräät kunnat ovat
- laittaneet nettiin online-muunnosohjelmia tai tietoja
- muunnoksista:</font></p>
- <ul>
- <li><a href="http://teto.tampere.fi/kami/stato/muunnos/muunnos5.php#"><font face="Verdana" size="2">Muunna koordinaatteja
- Tampereen seudulla</font></a><font face="Verdana" size="2"> - </font><a href="http://www.tampere.fi/kartat/koordinaattijarjestelmat/index.html"><font face="Verdana" size="2">Tampereen kaupunki:
- koordinaattijärjestelmät</font></a></li>
- <li><a href="http://www.vantaa.fi/i_perusdokumentti.asp?path=1;135;137;221;1761;2460;2661;5962"><font face="Verdana" size="2">Vantaa - Karttakoordinaatisto</font></a><font face="Verdana" size="2"> - </font><a href="http://kartta.vantaa.fi/fin/info/html/Metadata/vaneuref.htm"><font face="Verdana" size="2">Vantaan kaupunki:
- koordinaattijärjestelmä</font></a></li>
- <li><a href="http://www.kemi.fi/tekpa/MaaMittaus/Mittauspalvelut/muukaava.htm"><font face="Verdana" size="2">Kemin kaupunki Tekniset
- palvelut Runkomittaukset ja vaaitukset</font></a></li>
- <li><a href="http://www.keminmaa.fi/kunta/tekninen/mittaus/muunnos.htm"><font face="Verdana" size="2">Keminmaa - muunnoskaavat</font></a></li>
- <li><a href="http://www.tuusula.fi/teksti.tmpl?id=376;numero=50858240"><font face="Verdana" size="2">Tuusulan kunta - Kartta- ja
- paikkatieto</font></a></li>
- <li><a href="http://www.lahti.fi/www/bulletin.nsf/9448b3047ee76304c2256c5a001fb524/ce6dc1c6c638c475c22570c100470945?OpenDocument"><font face="Verdana" size="2">Lahti siirtyi
- yhteiseurooppalaiseen koordinaatistoon</font></a></li>
- </ul>
-</blockquote>
-
-<h1><font face="Verdana" size="2">EUREF-FIN, ETRS89-realisaatio
-Suomessa, 2003/2005-</font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">Suomessa on käynnissä
- koordinaatistouudistus, jossa nykyinen
- kartastokoordinaattiärjestelmä KKJ korvataan
- yleiseurooppalaisella ETRS89-koordinaatistojärjestelmällä.</font></p>
- <p><font face="Verdana" size="2">Yleiseurooppalaisen ETRS90-koordinaatistojärjestelmän
- mukaisen ETRF89-koordinaatiston realisaatio Suomessa (EUREF-FIN)
- on määritelty Julkisen hallinnon suosituksessa 153: </font><a href="http://www.jhs-suositukset.fi/suomi/jhs153"><font face="Verdana" size="2">JHS153</font></a><font face="Verdana" size="2">. JHS153 suosittelee kansallisissa
- kartoitustöissä ja paikannusjärjestelmissä
- käytettäväksi ETRS89 koordinaattijärjestelmää KKJ-koordinaattijärjestelmän
- sijasta.</font></p>
- <p><font face="Verdana" size="2">ETRS89-järjestelmään
- liittyvät karttaprojektiot, tasokoordinaatistot ja
- karttalehtijako sekä tarkat muunnoskaavat ja -parametrit
- esitetään julkisen hallinnon suosituksessa 154: </font><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a></p>
- <p><a href="http://www.fgi.fi/"><font face="Verdana" size="2">Geodeettinen
- laitos</font></a><font face="Verdana" size="2"> on luonut
- Suomeen yleiseurooppalaiseen EUREF89-koordinaatistoon sidotun
- EUREF-FIN-koordinaatiston. ETRS89 yhtyy
- senttimetritarkkuudella WGS84-koordinaatistoon, joten
- paikannuksen ja navigoinnin vaatimissa tarkkuuksissa ei
- enää tarvita muunnosta WGS84:n ja suomalaisen
- koordinaatiston välillä. Yhteys EUREF-FIN koordinaatiston
- ja KKJ:n välillä on kuvattu edellä KKJ-koordinaatiston
- kuvauksen yhteydessä.</font></p>
- <p><font face="Verdana" size="2">Koko valtakuntaa koskevissa
- kartoitus- ja muissa paikkatietotöissä suositetaan
- käytettäväksi koko Suomen kattavaa poikittaista
- lieriöprojektiota (Transverse Mercator), jonka
- keskimeridiaani on 27 astetta itäistä pituutta ja joka
- noudattaa UTM standardia lukuunottamatta kaistanleveyttä, n.
- 13 astetta. Projektiota kutsutaan nimellä ETRS-TM35FIN.
- Nimessä ETRS viittaa datumiin, TM35 tarkoittaa Transverse
- Mercatorin kaistaa 35 ja FIN kertoo poikkeamasta UTM-standardista.</font></p>
- <p><font face="Verdana" size="2">Paikallisiin töihin voidaan
- edelleen käyttää Gauss-Krüger-projektioita
- projektiovääristymien pienentämiseksi. Keskimeridiaanina
- käytetään lähintä tasa-astetta. Gauss-Krüger-projektiota
- kutsutaan nimellä ETRS-GKn. Nimessä ETRS viittaa datumiin,
- ja GKn tarkoittaa Gauss-Krügerin kaistaa, jonka
- keskimeridiaani on n astetta.</font></p>
- <p><font face="Verdana" size="2">Taulussa 8 esitetään
- Suomessa käytettävien tasokoordinaatistojen
- projektioparametrit, joiden mukaan suoritetaan muunnokset
- maantieteellisistä koordinaateista tasokoordinaateiksi ja
- päinvastoin. Vertailun vuoksi taulukon lopussa esitetään
- myös vastaavat KKJ-parametrit.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="6"><font face="Verdana" size="2"><strong>Taulu
- 8, Projektioparametrit Suomessa käytetyille
- tasokoordinaatistoille</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Projektio</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoidi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Keskimeridiaani</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Valeitä</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Mittakaava
- keskimeridiaanilla</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kaistanleveys</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Projection</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoid</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Central
- Meridian</strong></font></td>
- <td><font face="Verdana" size="2"><strong>False
- Easting</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Scale
- factor at Central Meridian</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Zone width</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">ETRS-TM35FIN</font></td>
- <td><font face="Verdana" size="2">GRS80</font></td>
- <td><font face="Verdana" size="2">27</font></td>
- <td><font face="Verdana" size="2">500000 </font></td>
- <td><font face="Verdana" size="2">0.9996</font></td>
- <td><font face="Verdana" size="2">13</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">ETRS-TMn</font></td>
- <td><font face="Verdana" size="2">GRS80</font></td>
- <td><font face="Verdana" size="2">21,27,33</font></td>
- <td><font face="Verdana" size="2">500000</font></td>
- <td><font face="Verdana" size="2">0.9996</font></td>
- <td><font face="Verdana" size="2">6</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">ETRS-GK </font></td>
- <td><font face="Verdana" size="2">GRS80</font></td>
- <td><font face="Verdana" size="2">19,20,...,31</font></td>
- <td><font face="Verdana" size="2">n500000, n=19,20,...,31</font></td>
- <td><font face="Verdana" size="2">1.0000</font></td>
- <td><font face="Verdana" size="2">1</font></td>
- </tr>
- <tr>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">KKJ</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">International
- 1924</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">18,21,24,27,30,33</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">n500000,
- n=0,1,...,5</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">1.0000</font></td>
- <td bgcolor="#c0c0c0"><font face="Verdana" size="2">3</font></td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2">Muunnos kolmiulotteisista X,Y,Z-koordinaateista
- maantieteellisiin koordinaatteihin tehdään ETRS89-koordinaatistojen
- yhteydessä käyttäen referenssiellipsoidia GRS80. GRS80 on
- niin lähellä WGS84:n käyttämää WGS84 ellipsoidia, että
- ero voidaan käytännön sovelluksissa unohtaa. Taulussa 8
- kuitenkin GRS80:n parametrit ja vertailu vastaaviin WGS84:n
- parametreihin.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="6"><font face="Verdana" size="2"><strong>Taulu
- 9, GRS80 ja WGS84 ellipsoidit</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Parametri</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Selite</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Yksikkö</strong></font></td>
- <td><font face="Verdana" size="2"><strong>WGS84</strong></font></td>
- <td><font face="Verdana" size="2"><strong>GRS80</strong></font></td>
- <td><font face="Verdana" size="2"><strong>WGS84-GRS80</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">A, DA</font></td>
- <td><font face="Verdana" size="2">Isoakselin puolikas</font></td>
- <td><font face="Verdana" size="2">metri</font></td>
- <td><font face="Verdana" size="2">6378137</font></td>
- <td><font face="Verdana" size="2">6378137</font></td>
- <td><font face="Verdana" size="2">0</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">F, DF</font></td>
- <td><font face="Verdana" size="2">Litistyssuhde</font></td>
- <td> </td>
- <td><font face="Verdana" size="2">1/298.257223563</font></td>
- <td><font face="Verdana" size="2">1/298.257222101</font></td>
- <td><font face="Verdana" size="2">-0.000000164423..</font></td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2"><strong>Uudet kartat</strong></font></p>
- <p><font face="Verdana" size="2">Vuoden 2003 alusta alkaen </font><a href="http://www.fma.fi/"><font face="Verdana" size="2">Merenkulkulaitos</font></a><font face="Verdana" size="2"> on julkaissut uudet merikartat WGS84-koordinaatistossa
- ja käyttäen kansainvälisesti sovitun INT-karttasymboliikan
- mukaisia symboleja ja värejä. Uudessa värityksessä leimaa-antavin
- väri on matalan veden sininen väri ja vanhassa
- värityksessä maa-alueiden vihreä väri. Siksi uusia
- merikarttoja kutsutaan sinisiksi merikartoiksi erotukseksi
- nykyisistä KKJ-koordinaatistoon perustuvista vihreistä
- merikartoista. Siniset merikartat tulevat korvaamaan vihreät
- merikartat 4-5 vuoden sisällä. Kuitenkin niistä alueista,
- joista ei ole vielä sinistä merikarttaa, ylläpidetään
- ajantasaista vihreää merikarttaa. </font></p>
- <p><a href="http://www.maanmittauslaitos.fi/"><font face="Verdana" size="2">Maanmittauslaitos</font></a><font face="Verdana" size="2"> siirtyi kartantuotannossaan uuteen
- koordinaattijärjestelmään ja lehtijakoon vuonna 2005.
- Uudistuksen myötä muuttuu myös maastokarttojen mittakaava;
- uudet maastokartat julkaistaan mittakaavoissa 1:25 000 ja 1:50
- 000. Siirtymävaihe kartantuotannossa vienee vuosia ja sinä
- aikana on käytössä rinnakkain KKJ:n ja EUREF-FIN:n
- mukaisia karttoja. Uusissa maastokartoissa ETRS-TM35FIN
- ruudukko on merkitty mustilla risteillä, kolme UTM-ruudukkoa
- TM34, TM35 ja TM36 on painettu punaisella värillä ja
- maantieteelliset koordinaatit sinisellä värillä. ETRS-GK-ruudukkoa
- ei esitetä maastokartoilla lainkaan.</font></p>
-</blockquote>
-
-<h1><font face="Verdana" size="2">Koordinaatistojen väliset
-muunnokset</font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2"><strong>Parametrien asetus
- GPS-laitteeseen tai navigointi-/paikannusohjelmaan</strong></font></p>
- <p><font face="Verdana" size="2">Kun suomalaisia karttoja
- käytetään GPS-laitteiden tai navigointi/paikannusohjelmien
- kanssa, täytyy ohjelmaan tai laitteeseen asettaa taulun 10
- mukaiset datum- tai tasokoordinaattimuunnosparametrit. Tyhjä
- kohta tarkoittaa, että voidaan soveltaa yleisiä
- oletusarvoja; datum=WGS84 tai vastaava, esim EUREF-FIN,
- ellipsoidi=WGS84 tai GRS80.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="6"><font face="Verdana" size="2"><strong>Taulu
- 10, Suomalaisten karttojen tarvitsemat datum- ja
- tasokoordinaattikonversiot</strong></font></td>
- </tr>
- <tr>
- <td colspan="2"><font face="Verdana" size="2"><strong>Karttatyyppi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Koordinaattityyppi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Datum-muunnos</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Ellipsoidi</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Tasokoordinaattimuunnos</strong></font></td>
- </tr>
- <tr>
- <td rowspan="2" colspan="2"><font face="Verdana" size="2">Vanhat maakartat, KKJ, 1970-2005</font></td>
- <td><font face="Verdana" size="2">Maantieteellinen</font></td>
- <td><font face="Verdana" size="2">KKJ <> EUREF-FIN</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">Tasokoordinaatti</font></td>
- <td><font face="Verdana" size="2">KKJ <> EUREF-FIN</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td><font face="Verdana" size="2">KKJ1-KKJ5 / YKJ</font></td>
- </tr>
- <tr>
- <td colspan="2"><font face="Verdana" size="2">Vanhat
- "vihreät" merikartat, KKJ, -2002</font></td>
- <td><font face="Verdana" size="2">Maantieteellinen</font></td>
- <td><font face="Verdana" size="2">KKJ <> EUREF-FIN</font></td>
- <td><font face="Verdana" size="2">International 1924</font></td>
- <td> </td>
- </tr>
- <tr>
- <td rowspan="2" colspan="2"><font face="Verdana" size="2">Uudet maakartat, EUREF-FIN, 2005-</font></td>
- <td><font face="Verdana" size="2">Maantieteellinen</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">Tasokoordinaatti</font></td>
- <td> </td>
- <td> </td>
- <td><font face="Verdana" size="2">ETRS-TM35FIN / ETRS-GK(n)</font></td>
- </tr>
- <tr>
- <td colspan="2"><font face="Verdana" size="2">Uudet
- "siniset" merikartat, EUREF-FIN, 2003-</font></td>
- <td><font face="Verdana" size="2">Maantieteellinen</font></td>
- <td> </td>
- <td> </td>
- <td> </td>
- </tr>
- </tbody></table>
- <p><font face="Verdana" size="2">Muunnos WGS84(n. EUREF-FIN)-koordinaatistosta
- KKJ-koordinaatistoon on useissa laitteissa ja ohjelmissa
- sisäänrakennettuna ja se pitää yleensä sisällään
- sekä 3D-yhdenmuotoisuusmuunnoksen (datum-muunnos) että
- muunnoksen 3D-X,Y,Z-koordinaattien ja maantieteellisten
- koordinaattien välillä (ellipsoidin mukaan). GPS:ssä
- koordinaatistoja kutsutaan nimellä datum ja muunnos onkin
- yleensä helppo asettaa valitsemalla GPS:n datumiksi KKJ.
- Ongelmana on vain se, että KKJ-koordinaatistoa kutsutaan eri
- laitteissa eri nimillä, mm. KKJ, Finland Hayford, Finnish
- Nautical Chart jne.</font></p>
- <p><font face="Verdana" size="2">Useimmissa GPS-laitteissa on
- valmiina projektioparametrit KKJ-yhtenäiskoordinaatistoa (YKJ)
- varten, eli samalla peruskoordinaatiston kaistaa 3 varten,
- mutta harvoin peruskoordinaatiston muita kaistoja varten.
- Myös KKJ-tasokoordinaateista käytetään eri laitteissa eri
- nimiä, esim. KKJ3, KKJ27, Finnish grid. Jos laitteesta
- löytyy KKJ-projektioparametrit, aiheuttaa niiden valinta
- yleensä samalla myös datumin vaihdon KKJ:hin.</font></p>
- <p><font face="Verdana" size="2">Jos tasokoordinaatteja
- vastaavia projektioparametreja ei ole valmiiksi
- määriteltynä, ne voi yleensä syöttää käyttäjän
- määritteleminä ns. "user grid"-parametreina. Jos
- laitteessa on valittavana useita eri user grid-tyyppejä,
- esimerkiksi Transverse Mercator, Lambert Conic Conformal,
- Mercator jne., tulee valita tyyppi 'Transverse Mercator'.
- Vastaavat parametrit otetaan tauluista 3, 4 tai 8. Tässä
- kannattaa huomata, että keskimeridiaania kutsutaan sekä
- nimellä 'Central Meridian" että 'Longitude of Origin'.
- Valepohjoinen eli 'False northing' on nolla kaikissa
- tapauksissa (sekä vanhoissa että uusissa
- tasokoordinaatistoissa). Eräissä laitteissa esiintyy
- Transverse Mercator projektion yhteydessä myös parametri 'Latitude
- of Origin'; tämän arvon tulee olla nolla.</font></p>
- <h1><font face="Verdana" size="2">Muunnosketju, kaavat ja
- parametrit</font></h1>
- <p><font face="Verdana" size="2">Taulussa 11 on esitetty
- kaikki muunnosvaiheet kaavoineen ja parametreineen KKJ-tasokoordinaateista
- EUREF-FIN tasokoordinaatteihin ja päinvastoin. Esitetty
- ketju on yleinen ja on siksi sovellettavissa myös muihin
- vastaaviin koordinaatistoihin vaihtamalla parametreja tai
- mahdollisesti vaihtamalla muunnoskaava taso- ja
- maantieteellisten koordinaattien välillä vastaamaan ko.
- koordinaatistosysteemiä.</font></p>
- <p><font face="Verdana" size="2">Jos vaadittu muunnostarkkuus
- ei ole suuri, voidaan käyttää huomattavasti
- yksinkertaisempia kaavoja, jotka on rakennettu suoraan
- tiettyjen koordinaattimuotojen välille, esimerkiksi suoraan
- KKJ-maantieteellisten ja EUREF-FIN-maantieteellisten välille.
- Jos tarvitaan suurta tarkkuutta, voidaan soveltaa </font><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">Julkisen hallinnon suosituksen 154</font></a><font face="Verdana" size="2"> liitteessä 5 esitettyä
- kolmioittaista affiinimuunnosta YKJ- ja ETRS-GK-koordinaattien
- välillä. Kattavasti suomalaisten geodeettisten
- koordinaatistojen väliset muunnokset on kuvattu </font><a href="http://www.fgi.fi/julkaisut/pdf/GLtiedote30.pdf"><font face="Verdana" size="2">Geodeettisen laitoksen tiedotteessa
- numero 30</font></a><font face="Verdana" size="2">.</font></p>
- <table border="6">
- <tbody><tr>
- <td colspan="6"><font face="Verdana" size="2"><strong>Taulu
- 11, Muunnosketju KKJ-tasokoordinaatit > ETRS-pohjaiset
- tasokoordinaatit (taulu 8) > KKJ-tasokoordinaatit </strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2"><strong>Mistä</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Mihin</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Muunnos</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Kaava</strong></font></td>
- <td><font face="Verdana" size="2"><strong>Parametrit</strong></font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ
- tasokoordinaatit</font></td>
- <td><font face="Verdana" size="2">KKJ
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">Transverse Mercator
- projektio </font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a><font face="Verdana" size="2">, liite 1</font></td>
- <td><font face="Verdana" size="2">KKJ-tasokoordinaatit,
- taulu 3</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">KKJ 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">Maantieteelliset
- > 3D-X,Y,Z</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs153"><font face="Verdana" size="2">JHS153</font></a><font face="Verdana" size="2">, 5.2</font></td>
- <td><font face="Verdana" size="2">Hayfordin
- ellipsoidi, taulu 2</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">EUREF-FIN 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">Datum-muunnos, 3D-
- yhdenmuotoisuusmuunnos</font></td>
- <td><font face="Verdana" size="2">Taulu 7</font></td>
- <td><font face="Verdana" size="2">Taulu 6, sarake 1</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">EUREF-FIN 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">EUREF-FIN
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">3D-X,Y,Z >
- maantieteelliset</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs153"><font face="Verdana" size="2">JHS153</font></a><font face="Verdana" size="2">, 5.2</font></td>
- <td><font face="Verdana" size="2">GRS80 ellipsoidi,
- taulu 9</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">EUREF-FIN
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">ETRS-pohjaiset
- tasokoordinaatit</font></td>
- <td><font face="Verdana" size="2">Transverse Mercator
- projektio</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a><font face="Verdana" size="2">, liite 1</font></td>
- <td><font face="Verdana" size="2">ETRS-pohjaiset
- tasokoordinaatit, taulu 8</font></td>
- </tr>
- <tr>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">ETRS-pohjaiset
- tasokoordinaatit</font></td>
- <td><font face="Verdana" size="2">EUREF-FIN
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">Transverse Mercator
- projektio</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a><font face="Verdana" size="2">, liite 1</font></td>
- <td><font face="Verdana" size="2">ETRS-pohjaiset
- tasokoordinaatit, taulu 8</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">EUREF-FIN
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">EUREF-FIN 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">Maantieteelliset
- > 3D-X,Y,Z</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs153"><font face="Verdana" size="2">JHS153</font></a><font face="Verdana" size="2">, 5,2</font></td>
- <td><font face="Verdana" size="2">GRS80 ellipsoidi,
- taulu 9</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">EUREF-FIN 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">KKJ 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">Datum-muunnos, 3D-
- yhdenmuotoisuusmuunnos</font></td>
- <td><font face="Verdana" size="2">Taulu 7</font></td>
- <td><font face="Verdana" size="2">Taulu 6, sarake 1</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ 3D-X,Y,Z-koordinaatit</font></td>
- <td><font face="Verdana" size="2">KKJ
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">3D-X,Y,Z >
- maantieteelliset</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs153"><font face="Verdana" size="2">JHS153</font></a><font face="Verdana" size="2">, 5.2</font></td>
- <td><font face="Verdana" size="2">Hayfordin
- ellipsoidi, taulu 2</font></td>
- </tr>
- <tr>
- <td><font face="Verdana" size="2">KKJ
- maantieteelliset</font></td>
- <td><font face="Verdana" size="2">KKJ
- tasokoordinaatit</font></td>
- <td><font face="Verdana" size="2">Transverse Mercator
- projektio</font></td>
- <td><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a><font face="Verdana" size="2">, liite 1</font></td>
- <td><font face="Verdana" size="2">KKJ-tasokoordinaatit,
- taulu 3</font></td>
- </tr>
- </tbody></table>
- <p> </p>
- <h1><font face="Verdana" size="2">Muunnospalveluja</font></h1>
- <p><a href="http://www.fgi.fi/"><font face="Verdana" size="2">Geodeettinen
- laitos</font></a><font face="Verdana" size="2"> on tuottanut
- koordinaattien muunnospalvelun </font><a href="http://coordtrans.fgi.fi/"><font face="Verdana" size="2">http://coordtrans.fgi.fi/</font></a><font face="Verdana" size="2">. Palvelu tukee Suomessa
- valtakunnallisesti käytössä olevia koordinaatistoja ja
- korkeusjärjestelmiä.</font></p>
- <h1><a name="Muunnosten tarkkuudesta"><font face="Verdana" size="2">Muunnosten tarkkuudesta</font></a></h1>
- <p><font face="Verdana" size="2">KKJ-koordinaatiston
- sisäisistä mittakaava- ja orientointivirheistä johtuen
- jää EUREF-FIN - KKJ- yhdenmuotoisuusmuunnoksesta
- parhaillakin siirtoparametreilla suurimmillaan kahden metrin
- jäännösvirheitä. Harrastelijakäyttöön tarkoitetuissa
- GPS-laitteissa käytetään useimmiten kolmiparametrista
- yhdenmuotoisuusmuunnosta, jossa jäännösvirheet nousevat
- suuremmiksi. Useissa navigointisovelluksissa nämä virheet
- eivät kuitenkaan ole merkittäviä, eivätkä useinkaan
- suurimpia koko navigointiketjussa.</font></p>
- <p><font face="Verdana" size="2">Muunnos tasokoordinaattien
- ja maantieteellisten koordinaattien samoin kuin muunnos
- maantieteellisten ja 3D-X,Y,Z-koordinaattien välillä on
- yleensä yksinkertaisimmillakin käytössä olevilla
- kaavoilla niin tarkka, ettei virheillä ole mitään
- merkitystä käytännön sovelluksissa.</font></p>
- <p><font face="Verdana" size="2">Kannattaa huomata, että
- koordinaatistomuunnosten virheet ovat vain osa
- kokonaisvirhettä. Geodeettinen ja kartografinen perustyö,
- GPS-tekniikka sekä käyttäjän navigointityö ovat kaikki
- mittaamista mittaamisen perään ja aina kun mitataan,
- tehdään virheitä. Kokonaisvirhe on eri vaiheissa tehtyjen
- virheiden summa. Alla lueteltuna vaiheita, joissa syntyy
- väistämättä mitta- tai laskentavirheitä, vaikka itse
- toiminta olisi virheetöntä. Tämän lisäksi tulevat
- tietysti käyttäjän tai tekijän omat virheet -
- väärinkäsitykset, merkintävirheet, tulkintavirheet jne.</font></p>
- <dir>
- <li><font face="Verdana" size="2">virheet koordinaatiston
- mittaamisessa ja merkitsemisessä maastoon</font></li>
- <li><font face="Verdana" size="2">kartantuotannossa
- tapahtuvat virheet</font></li>
- <li><font face="Verdana" size="2">virhe, kun käyttäjä
- määrittää kartalla olevan pisteen koordinaatit
- tai koordinaattien perusteella kartan pisteen</font></li>
- <li><font face="Verdana" size="2">koordinaatistojen
- välisten muunnosten virheet (esimerkiksi KKJ-WGS84),
- mahdollisesti useassa kohdassa navigointiketjua</font></li>
- <li><font face="Verdana" size="2">GPS-järjestelmän
- virheet</font></li>
- </dir>
-</blockquote>
-
-<h1><font face="Verdana" size="2">Kiitokset</font></h1>
-
-<blockquote>
- <p><font face="Verdana" size="2">Haluan lämpimästi
- kiittää FT Matti Ollikaista hänen ystävällisistä
- neuvoistaan sekä eräiden tässä dokumentissa esiintyneiden
- virheiden ja epätarkkuuksien korjaamisesta.</font></p>
- <p><font face="Verdana" size="2">Suuri kiitos myös muille
- tätä artikkelia kommentoineille henkilöille.</font></p>
-</blockquote>
-
-<h1><font face="Verdana" size="2">Lähdeluettelo</font></h1>
-
-<blockquote>
- <ul>
- <li><font face="Verdana" size="2">Hirvonen, R.A., 1949:
- Die Gauss-Krügersche Projektion für breite
- Meridianstreifen auf dem Internationalen Ellipsoide.
- Kirjoitus Suomen Geodeettisen laitoksen julkaisussa
- no 36</font></li>
- <li><font face="Verdana" size="2">Ollikainen, M., 1993:
- GPS-koordinaattien muuttaminen
- Kartastokoordinaateiksi, Geodeettinen laitos, tiedote
- 8</font></li>
- <li><font face="Verdana" size="2">Poutanen Markku, 1998, </font><a href="http://www.ursa.fi/ursa/julkaisut/gps/gps.html"><font face="Verdana" size="2">GPS-paikanmääritys</font></a><font face="Verdana" size="2"> - ISBN 951-9269-89-4</font></li>
- <li><font face="Verdana" size="2">Ollikainen, M., H.
- Koivula and Markku Poutanen, 2000. The densification
- of the EUREF network in Finland. The Publication of
- Finnish Geodetic Institute, no. 129. P.O. Box 15, FIN-02431
- Masala</font></li>
- <li><font face="Verdana" size="2">Ollikainen, M., Koivula
- H., Poutanen M., 2001: EUREF-FIN koordinaatisto ja
- EUREF-pistetihennykset Suomessa, Geodeettinen laitos,
- tiedote 24</font></li>
- <li><font face="Verdana" size="2">Suomen kartasto, vihko
- 112 </font></li>
- <li><font face="Verdana" size="2">JHS 153: ETRS89-järjestelmän
- mukaiset koordinaatit Suomessa: </font><a href="http://www.jhs-suositukset.fi/suomi/jhs153"><font face="Verdana" size="2">JHS153</font></a></li>
- <li><font face="Verdana" size="2">JHS 154: ETRS89-järjestelmään
- liittyvät karttaprojektiot, tasokoordinaatistot ja
- karttalehtijako: </font><a href="http://www.jhs-suositukset.fi/suomi/jhs154"><font face="Verdana" size="2">JHS154</font></a></li>
- <li><font face="Verdana" size="2">Marko Ollikainen ja
- Matti Ollikainen, 2004, The Finnish Coordinate
- Reference Systems. Julkaisijat Geodeettinen laitos ja
- Maanmittauslaitos </font><a href="http://www.maanmittauslaitos.fi/popup.asp?id=0&docid=2507"><font face="Verdana" size="2">www.maanmittauslaitos.fi/popup.asp?id=0&docid=2507</font></a></li>
- <li><font face="Verdana" size="2">Häkli P., Puupponen J.,
- Koivula H., Poutanen M.: </font><a href="http://www.fgi.fi/julkaisut/pdf/GLtiedote30.pdf"><font face="Verdana" size="2">Suomen geodeettiset
- koordinaatistot ja niiden väliset muunnokset</font></a><font face="Verdana" size="2">, Geodeettinen laitos,
- tiedote 30</font></li>
- </ul>
-</blockquote>
-
-<p><a href="http://www.kolumbus.fi/eino.uikkanen/index.htm"><font face="Verdana" size="2">Eino
-Uikkasen kotisivu</font></a></p>
-<script src="kkjgps_files/urchin.js" type="text/javascript">
-</script><script type="text/javascript">
-_uacct = "UA-469384-5";
-urchinTracker();
-</script>
-</body></html>
\ No newline at end of file
+++ /dev/null
-//-- Google Analytics Urchin Module
-//-- Copyright 2007 Google, All Rights Reserved.
-
-//-- Urchin On Demand Settings ONLY
-var _uacct=""; // set up the Urchin Account
-var _userv=1; // service mode (0=local,1=remote,2=both)
-
-//-- UTM User Settings
-var _ufsc=1; // set client info flag (1=on|0=off)
-var _udn="auto"; // (auto|none|domain) set the domain name for cookies
-var _uhash="on"; // (on|off) unique domain hash for cookies
-var _utimeout="1800"; // set the inactive session timeout in seconds
-var _ugifpath="/__utm.gif"; // set the web path to the __utm.gif file
-var _utsp="|"; // transaction field separator
-var _uflash=1; // set flash version detect option (1=on|0=off)
-var _utitle=1; // set the document title detect option (1=on|0=off)
-var _ulink=0; // enable linker functionality (1=on|0=off)
-var _uanchor=0; // enable use of anchors for campaign (1=on|0=off)
-var _utcp="/"; // the cookie path for tracking
-var _usample=100; // The sampling % of visitors to track (1-100).
-
-//-- UTM Campaign Tracking Settings
-var _uctm=1; // set campaign tracking module (1=on|0=off)
-var _ucto="15768000"; // set timeout in seconds (6 month default)
-var _uccn="utm_campaign"; // name
-var _ucmd="utm_medium"; // medium (cpc|cpm|link|email|organic)
-var _ucsr="utm_source"; // source
-var _uctr="utm_term"; // term/keyword
-var _ucct="utm_content"; // content
-var _ucid="utm_id"; // id number
-var _ucno="utm_nooverride"; // don't override
-
-//-- Auto/Organic Sources and Keywords
-var _uOsr=new Array();
-var _uOkw=new Array();
-_uOsr[0]="google"; _uOkw[0]="q";
-_uOsr[1]="yahoo"; _uOkw[1]="p";
-_uOsr[2]="msn"; _uOkw[2]="q";
-_uOsr[3]="aol"; _uOkw[3]="query";
-_uOsr[4]="aol"; _uOkw[4]="encquery";
-_uOsr[5]="lycos"; _uOkw[5]="query";
-_uOsr[6]="ask"; _uOkw[6]="q";
-_uOsr[7]="altavista"; _uOkw[7]="q";
-_uOsr[8]="netscape"; _uOkw[8]="query";
-_uOsr[9]="cnn"; _uOkw[9]="query";
-_uOsr[10]="looksmart"; _uOkw[10]="qt";
-_uOsr[11]="about"; _uOkw[11]="terms";
-_uOsr[12]="mamma"; _uOkw[12]="query";
-_uOsr[13]="alltheweb"; _uOkw[13]="q";
-_uOsr[14]="gigablast"; _uOkw[14]="q";
-_uOsr[15]="voila"; _uOkw[15]="rdata";
-_uOsr[16]="virgilio"; _uOkw[16]="qs";
-_uOsr[17]="live"; _uOkw[17]="q";
-_uOsr[18]="baidu"; _uOkw[18]="wd";
-_uOsr[19]="alice"; _uOkw[19]="qs";
-_uOsr[20]="yandex"; _uOkw[20]="text";
-_uOsr[21]="najdi"; _uOkw[21]="q";
-_uOsr[22]="aol"; _uOkw[22]="q";
-_uOsr[23]="club-internet"; _uOkw[23]="query";
-_uOsr[24]="mama"; _uOkw[24]="query";
-_uOsr[25]="seznam"; _uOkw[25]="q";
-_uOsr[26]="search"; _uOkw[26]="q";
-_uOsr[27]="wp"; _uOkw[27]="szukaj";
-_uOsr[28]="onet"; _uOkw[28]="qt";
-_uOsr[29]="netsprint"; _uOkw[29]="q";
-_uOsr[30]="google.interia"; _uOkw[30]="q";
-_uOsr[31]="szukacz"; _uOkw[31]="q";
-_uOsr[32]="yam"; _uOkw[32]="k";
-_uOsr[33]="pchome"; _uOkw[33]="q";
-_uOsr[34]="kvasir"; _uOkw[34]="searchExpr";
-_uOsr[35]="sesam"; _uOkw[35]="q";
-_uOsr[36]="ozu"; _uOkw[36]="q";
-_uOsr[37]="terra"; _uOkw[37]="query";
-_uOsr[38]="nostrum"; _uOkw[38]="query";
-_uOsr[39]="mynet"; _uOkw[39]="q";
-_uOsr[40]="ekolay"; _uOkw[40]="q";
-_uOsr[41]="search.ilse"; _uOkw[41]="search_for";
-_uOsr[42]="bing"; _uOkw[42]="q";
-
-//-- Auto/Organic Keywords to Ignore
-var _uOno=new Array();
-//_uOno[0]="urchin";
-//_uOno[1]="urchin.com";
-//_uOno[2]="www.urchin.com";
-
-//-- Referral domains to Ignore
-var _uRno=new Array();
-//_uRno[0]=".urchin.com";
-
-//-- **** Don't modify below this point ***
-var _uff,_udh,_udt,_ubl=0,_udo="",_uu,_ufns=0,_uns=0,_ur="-",_ufno=0,_ust=0,_ubd=document,_udl=_ubd.location,_udlh="",_uwv="1.3";
-var _ugifpath2="http://www.google-analytics.com/__utm.gif";
-if (_udl.hash) _udlh=_udl.href.substring(_udl.href.indexOf('#'));
-if (_udl.protocol=="https:") _ugifpath2="https://ssl.google-analytics.com/__utm.gif";
-if (!_utcp || _utcp=="") _utcp="/";
-function urchinTracker(page) {
- if (_udl.protocol=="file:") return;
- if (_uff && (!page || page=="")) return;
- var a,b,c,xx,v,z,k,x="",s="",f=0,nv=0;
- var nx=" expires="+_uNx()+";";
- var dc=_ubd.cookie;
- _udh=_uDomain();
- if (!_uVG()) return;
- _uu=Math.round(Math.random()*2147483647);
- _udt=new Date();
- _ust=Math.round(_udt.getTime()/1000);
- a=dc.indexOf("__utma="+_udh+".");
- b=dc.indexOf("__utmb="+_udh);
- c=dc.indexOf("__utmc="+_udh);
- if (_udn && _udn!="") { _udo=" domain="+_udn+";"; }
- if (_utimeout && _utimeout!="") {
- x=new Date(_udt.getTime()+(_utimeout*1000));
- x=" expires="+x.toGMTString()+";";
- }
- if (_ulink) {
- if (_uanchor && _udlh && _udlh!="") s=_udlh+"&";
- s+=_udl.search;
- if(s && s!="" && s.indexOf("__utma=")>=0) {
- if (!(_uIN(a=_uGC(s,"__utma=","&")))) a="-";
- if (!(_uIN(b=_uGC(s,"__utmb=","&")))) b="-";
- if (!(_uIN(c=_uGC(s,"__utmc=","&")))) c="-";
- v=_uGC(s,"__utmv=","&");
- z=_uGC(s,"__utmz=","&");
- k=_uGC(s,"__utmk=","&");
- xx=_uGC(s,"__utmx=","&");
- if ((k*1) != ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) {_ubl=1;a="-";b="-";c="-";xx="-";z="-";v="-";}
- if (a!="-" && b!="-" && c!="-") f=1;
- else if(a!="-") f=2;
- }
- }
- if(f==1) {
- _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
- _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo;
- _ubd.cookie="__utmc="+c+"; path="+_utcp+";"+_udo;
- } else if (f==2) {
- a=_uFixA(s,"&",_ust);
- _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
- _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
- _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo;
- _ufns=1;
- } else if (a>=0 && b>=0 && c>=0) {
- b = _uGC(dc,"__utmb="+_udh,";");
- b = ("-" == b) ? _udh : b;
- _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo;
- } else {
- if (a>=0) a=_uFixA(_ubd.cookie,";",_ust);
- else {
- a=_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1";
- nv=1;
- }
- _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
- _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
- _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo;
- _ufns=1;
- }
- if (_ulink && xx && xx!="" && xx!="-") {
- xx=_uUES(xx);
- if (xx.indexOf(";")==-1) _ubd.cookie="__utmx="+xx+"; path="+_utcp+";"+nx+_udo;
- }
- if (_ulink && v && v!="" && v!="-") {
- v=_uUES(v);
- if (v.indexOf(";")==-1) _ubd.cookie="__utmv="+v+"; path="+_utcp+";"+nx+_udo;
- }
- var wc=window;
- var c=_ubd.cookie;
- if(wc && wc.gaGlobal && wc.gaGlobal.dh==_udh){
- var g=wc.gaGlobal;
- var ua=c.split("__utma="+_udh+".")[1].split(";")[0].split(".");
- if(g.sid)ua[3]=g.sid;
- if(nv>0){
- ua[2]=ua[3];
- if(g.vid){
- var v=g.vid.split(".");
- ua[0]=v[0];
- ua[1]=v[1];
- }
- }
- _ubd.cookie="__utma="+_udh+"."+ua.join(".")+"; path="+_utcp+";"+nx+_udo;
- }
- _uInfo(page);
- _ufns=0;
- _ufno=0;
- if (!page || page=="") _uff=1;
-}
-function _uGH() {
- var hid;
- var wc=window;
- if (wc && wc.gaGlobal && wc.gaGlobal.hid) {
- hid=wc.gaGlobal.hid;
- } else {
- hid=Math.round(Math.random()*0x7fffffff);
- if (!wc.gaGlobal) wc.gaGlobal={};
- wc.gaGlobal.hid=hid;
- }
- return hid;
-}
-function _uInfo(page) {
- var p,s="",dm="",pg=_udl.pathname+_udl.search;
- if (page && page!="") pg=_uES(page,1);
- _ur=_ubd.referrer;
- if (!_ur || _ur=="") { _ur="-"; }
- else {
- dm=_ubd.domain;
- if(_utcp && _utcp!="/") dm+=_utcp;
- p=_ur.indexOf(dm);
- if ((p>=0) && (p<=8)) { _ur="0"; }
- if (_ur.indexOf("[")==0 && _ur.lastIndexOf("]")==(_ur.length-1)) { _ur="-"; }
- }
- s+="&utmn="+_uu;
- if (_ufsc) s+=_uBInfo();
- if (_uctm) s+=_uCInfo();
- if (_utitle && _ubd.title && _ubd.title!="") s+="&utmdt="+_uES(_ubd.title);
- if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname);
- if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample);
- s+="&utmhid="+_uGH();
- s+="&utmr="+_ur;
- s+="&utmp="+pg;
- if ((_userv==0 || _userv==2) && _uSP()) {
- var i=new Image(1,1);
- i.src=_ugifpath+"?"+"utmwv="+_uwv+s;
- i.onload=function() { _uVoid(); }
- }
- if ((_userv==1 || _userv==2) && _uSP()) {
- var i2=new Image(1,1);
- i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS();
- i2.onload=function() { _uVoid(); }
- }
- return;
-}
-function _uVoid() { return; }
-function _uCInfo() {
- if (!_ucto || _ucto=="") { _ucto="15768000"; }
- if (!_uVG()) return;
- var c="",t="-",t2="-",t3="-",o=0,cs=0,cn=0,i=0,z="-",s="";
- if (_uanchor && _udlh && _udlh!="") s=_udlh+"&";
- s+=_udl.search;
- var x=new Date(_udt.getTime()+(_ucto*1000));
- var dc=_ubd.cookie;
- x=" expires="+x.toGMTString()+";";
- if (_ulink && !_ubl) {
- z=_uUES(_uGC(s,"__utmz=","&"));
- if (z!="-" && z.indexOf(";")==-1) { _ubd.cookie="__utmz="+z+"; path="+_utcp+";"+x+_udo; return ""; }
- }
- z=dc.indexOf("__utmz="+_udh+".");
- if (z>-1) { z=_uGC(dc,"__utmz="+_udh+".",";"); }
- else { z="-"; }
- t=_uGC(s,_ucid+"=","&");
- t2=_uGC(s,_ucsr+"=","&");
- t3=_uGC(s,"gclid=","&");
- if ((t!="-" && t!="") || (t2!="-" && t2!="") || (t3!="-" && t3!="")) {
- if (t!="-" && t!="") c+="utmcid="+_uEC(t);
- if (t2!="-" && t2!="") { if (c != "") c+="|"; c+="utmcsr="+_uEC(t2); }
- if (t3!="-" && t3!="") { if (c != "") c+="|"; c+="utmgclid="+_uEC(t3); }
- t=_uGC(s,_uccn+"=","&");
- if (t!="-" && t!="") c+="|utmccn="+_uEC(t);
- else c+="|utmccn=(not+set)";
- t=_uGC(s,_ucmd+"=","&");
- if (t!="-" && t!="") c+="|utmcmd="+_uEC(t);
- else c+="|utmcmd=(not+set)";
- t=_uGC(s,_uctr+"=","&");
- if (t!="-" && t!="") c+="|utmctr="+_uEC(t);
- else { t=_uOrg(1); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); }
- t=_uGC(s,_ucct+"=","&");
- if (t!="-" && t!="") c+="|utmcct="+_uEC(t);
- t=_uGC(s,_ucno+"=","&");
- if (t=="1") o=1;
- if (z!="-" && o==1) return "";
- }
- if (c=="-" || c=="") { c=_uOrg(); if (z!="-" && _ufno==1) return ""; }
- if (c=="-" || c=="") { if (_ufns==1) c=_uRef(); if (z!="-" && _ufno==1) return ""; }
- if (c=="-" || c=="") {
- if (z=="-" && _ufns==1) { c="utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"; }
- if (c=="-" || c=="") return "";
- }
- if (z!="-") {
- i=z.indexOf(".");
- if (i>-1) i=z.indexOf(".",i+1);
- if (i>-1) i=z.indexOf(".",i+1);
- if (i>-1) i=z.indexOf(".",i+1);
- t=z.substring(i+1,z.length);
- if (t.toLowerCase()==c.toLowerCase()) cs=1;
- t=z.substring(0,i);
- if ((i=t.lastIndexOf(".")) > -1) {
- t=t.substring(i+1,t.length);
- cn=(t*1);
- }
- }
- if (cs==0 || _ufns==1) {
- t=_uGC(dc,"__utma="+_udh+".",";");
- if ((i=t.lastIndexOf(".")) > 9) {
- _uns=t.substring(i+1,t.length);
- _uns=(_uns*1);
- }
- cn++;
- if (_uns==0) _uns=1;
- _ubd.cookie="__utmz="+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; path="+_utcp+"; "+x+_udo;
- }
- if (cs==0 || _ufns==1) return "&utmcn=1";
- else return "&utmcr=1";
-}
-function _uRef() {
- if (_ur=="0" || _ur=="" || _ur=="-") return "";
- var i=0,h,k,n;
- if ((i=_ur.indexOf("://"))<0 || _uGCse()) return "";
- h=_ur.substring(i+3,_ur.length);
- if (h.indexOf("/") > -1) {
- k=h.substring(h.indexOf("/"),h.length);
- if (k.indexOf("?") > -1) k=k.substring(0,k.indexOf("?"));
- h=h.substring(0,h.indexOf("/"));
- }
- h=h.toLowerCase();
- n=h;
- if ((i=n.indexOf(":")) > -1) n=n.substring(0,i);
- for (var ii=0;ii<_uRno.length;ii++) {
- if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; }
- }
- if (h.indexOf("www.")==0) h=h.substring(4,h.length);
- return "utmccn=(referral)|utmcsr="+_uEC(h)+"|"+"utmcct="+_uEC(k)+"|utmcmd=referral";
-}
-function _uOrg(t) {
- if (_ur=="0" || _ur=="" || _ur=="-") return "";
- var i=0,h,k;
- if ((i=_ur.indexOf("://"))<0 || _uGCse()) return "";
- h=_ur.substring(i+3,_ur.length);
- if (h.indexOf("/") > -1) {
- h=h.substring(0,h.indexOf("/"));
- }
- for (var ii=0;ii<_uOsr.length;ii++) {
- if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) {
- if ((i=_ur.indexOf("?"+_uOkw[ii]+"=")) > -1 || (i=_ur.indexOf("&"+_uOkw[ii]+"=")) > -1) {
- k=_ur.substring(i+_uOkw[ii].length+2,_ur.length);
- if ((i=k.indexOf("&")) > -1) k=k.substring(0,i);
- for (var yy=0;yy<_uOno.length;yy++) {
- if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; }
- }
- if (t) return _uEC(k);
- else return "utmccn=(organic)|utmcsr="+_uEC(_uOsr[ii])+"|"+"utmctr="+_uEC(k)+"|utmcmd=organic";
- }
- }
- }
- return "";
-}
-function _uGCse() {
- var h,p;
- h=p=_ur.split("://")[1];
- if(h.indexOf("/")>-1) {
- h=h.split("/")[0];
- p=p.substring(p.indexOf("/")+1,p.length);
- }
- if(p.indexOf("?")>-1) {
- p=p.split("?")[0];
- }
- if(h.toLowerCase().indexOf("google")>-1) {
- if(_ur.indexOf("?q=")>-1 || _ur.indexOf("&q=")>-1) {
- if (p.toLowerCase().indexOf("cse")>-1) {
- return true;
- }
- }
- }
-}
-function _uBInfo() {
- var sr="-",sc="-",ul="-",fl="-",cs="-",je=1;
- var n=navigator;
- if (self.screen) {
- sr=screen.width+"x"+screen.height;
- sc=screen.colorDepth+"-bit";
- } else if (self.java) {
- var j=java.awt.Toolkit.getDefaultToolkit();
- var s=j.getScreenSize();
- sr=s.width+"x"+s.height;
- }
- if (n.language) { ul=n.language.toLowerCase(); }
- else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); }
- je=n.javaEnabled()?1:0;
- if (_uflash) fl=_uFlash();
- if (_ubd.characterSet) cs=_uES(_ubd.characterSet);
- else if (_ubd.charset) cs=_uES(_ubd.charset);
- return "&utmcs="+cs+"&utmsr="+sr+"&utmsc="+sc+"&utmul="+ul+"&utmje="+je+"&utmfl="+fl;
-}
-function __utmSetTrans() {
- var e;
- if (_ubd.getElementById) e=_ubd.getElementById("utmtrans");
- else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans;
- if (!e) return;
- var l=e.value.split("UTM:");
- var i,i2,c;
- if (_userv==0 || _userv==2) i=new Array();
- if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); }
-
- for (var ii=0;ii<l.length;ii++) {
- l[ii]=_uTrim(l[ii]);
- if (l[ii].charAt(0)!='T' && l[ii].charAt(0)!='I') continue;
- var r=Math.round(Math.random()*2147483647);
- if (!_utsp || _utsp=="") _utsp="|";
- var f=l[ii].split(_utsp),s="";
- if (f[0].charAt(0)=='T') {
- s="&utmt=tran"+"&utmn="+r;
- f[1]=_uTrim(f[1]); if(f[1]&&f[1]!="") s+="&utmtid="+_uES(f[1]);
- f[2]=_uTrim(f[2]); if(f[2]&&f[2]!="") s+="&utmtst="+_uES(f[2]);
- f[3]=_uTrim(f[3]); if(f[3]&&f[3]!="") s+="&utmtto="+_uES(f[3]);
- f[4]=_uTrim(f[4]); if(f[4]&&f[4]!="") s+="&utmttx="+_uES(f[4]);
- f[5]=_uTrim(f[5]); if(f[5]&&f[5]!="") s+="&utmtsp="+_uES(f[5]);
- f[6]=_uTrim(f[6]); if(f[6]&&f[6]!="") s+="&utmtci="+_uES(f[6]);
- f[7]=_uTrim(f[7]); if(f[7]&&f[7]!="") s+="&utmtrg="+_uES(f[7]);
- f[8]=_uTrim(f[8]); if(f[8]&&f[8]!="") s+="&utmtco="+_uES(f[8]);
- } else {
- s="&utmt=item"+"&utmn="+r;
- f[1]=_uTrim(f[1]); if(f[1]&&f[1]!="") s+="&utmtid="+_uES(f[1]);
- f[2]=_uTrim(f[2]); if(f[2]&&f[2]!="") s+="&utmipc="+_uES(f[2]);
- f[3]=_uTrim(f[3]); if(f[3]&&f[3]!="") s+="&utmipn="+_uES(f[3]);
- f[4]=_uTrim(f[4]); if(f[4]&&f[4]!="") s+="&utmiva="+_uES(f[4]);
- f[5]=_uTrim(f[5]); if(f[5]&&f[5]!="") s+="&utmipr="+_uES(f[5]);
- f[6]=_uTrim(f[6]); if(f[6]&&f[6]!="") s+="&utmiqt="+_uES(f[6]);
- }
- if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname);
- if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample);
-
- if ((_userv==0 || _userv==2) && _uSP()) {
- i[ii]=new Image(1,1);
- i[ii].src=_ugifpath+"?"+"utmwv="+_uwv+s;
- i[ii].onload=function() { _uVoid(); }
- }
- if ((_userv==1 || _userv==2) && _uSP()) {
- i2[ii]=new Image(1,1);
- i2[ii].src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+c;
- i2[ii].onload=function() { _uVoid(); }
- }
- }
- return;
-}
-function _uFlash() {
- var f="-",n=navigator;
- if (n.plugins && n.plugins.length) {
- for (var ii=0;ii<n.plugins.length;ii++) {
- if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) {
- f=n.plugins[ii].description.split('Shockwave Flash ')[1];
- break;
- }
- }
- } else {
- var fl;
- try {
- fl = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
- f = fl.GetVariable("$version");
- } catch(e) {}
- if (f == "-") {
- try {
- fl = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
- f = "WIN 6,0,21,0";
- fl.AllowScriptAccess = "always";
- f = fl.GetVariable("$version");
- } catch(e) {}
- }
- if (f == "-") {
- try {
- fl = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
- f = fl.GetVariable("$version");
- } catch(e) {}
- }
- if (f != "-") {
- f = f.split(" ")[1].split(",");
- f = f[0] + "." + f[1] + " r" + f[2];
- }
- }
- return f;
-}
-function __utmLinkerUrl(l,h) {
- var p,k,a="-",b="-",c="-",x="-",z="-",v="-";
- var dc=_ubd.cookie;
- var iq = l.indexOf("?");
- var ih = l.indexOf("#");
- var url=l;
- if (dc) {
- a=_uES(_uGC(dc,"__utma="+_udh+".",";"));
- b=_uES(_uGC(dc,"__utmb="+_udh,";"));
- c=_uES(_uGC(dc,"__utmc="+_udh,";"));
- x=_uES(_uGC(dc,"__utmx="+_udh,";"));
- z=_uES(_uGC(dc,"__utmz="+_udh+".",";"));
- v=_uES(_uGC(dc,"__utmv="+_udh+".",";"));
- k=(_uHash(a+b+c+x+z+v)*1)+(_udh*1);
- p="__utma="+a+"&__utmb="+b+"&__utmc="+c+"&__utmx="+x+"&__utmz="+z+"&__utmv="+v+"&__utmk="+k;
- }
- if (p) {
- if (h && ih>-1) return;
- if (h) { url=l+"#"+p; }
- else {
- if (iq==-1 && ih==-1) url=l+"?"+p;
- else if (ih==-1) url=l+"&"+p;
- else if (iq==-1) url=l.substring(0,ih-1)+"?"+p+l.substring(ih);
- else url=l.substring(0,ih-1)+"&"+p+l.substring(ih);
- }
- }
- return url;
-}
-function __utmLinker(l,h) {
- if (!_ulink || !l || l=="") return;
- _udl.href=__utmLinkerUrl(l,h);
-}
-function __utmLinkPost(f,h) {
- if (!_ulink || !f || !f.action) return;
- f.action=__utmLinkerUrl(f.action, h);
- return;
-}
-function __utmSetVar(v) {
- if (!v || v=="") return;
- if (!_udo || _udo == "") {
- _udh=_uDomain();
- if (_udn && _udn!="") { _udo=" domain="+_udn+";"; }
- }
- if (!_uVG()) return;
- var r=Math.round(Math.random() * 2147483647);
- _ubd.cookie="__utmv="+_udh+"."+_uES(v)+"; path="+_utcp+"; expires="+_uNx()+";"+_udo;
- var s="&utmt=var&utmn="+r;
- if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample);
- if ((_userv==0 || _userv==2) && _uSP()) {
- var i=new Image(1,1);
- i.src=_ugifpath+"?"+"utmwv="+_uwv+s;
- i.onload=function() { _uVoid(); }
- }
- if ((_userv==1 || _userv==2) && _uSP()) {
- var i2=new Image(1,1);
- i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS();
- i2.onload=function() { _uVoid(); }
- }
-}
-function _uGCS() {
- var t,c="",dc=_ubd.cookie;
- if ((t=_uGC(dc,"__utma="+_udh+".",";"))!="-") c+=_uES("__utma="+t+";+");
- if ((t=_uGC(dc,"__utmx="+_udh,";"))!="-") c+=_uES("__utmx="+t+";+");
- if ((t=_uGC(dc,"__utmz="+_udh+".",";"))!="-") c+=_uES("__utmz="+t+";+");
- if ((t=_uGC(dc,"__utmv="+_udh+".",";"))!="-") c+=_uES("__utmv="+t+";");
- if (c.charAt(c.length-1)=="+") c=c.substring(0,c.length-1);
- return c;
-}
-function _uGC(l,n,s) {
- if (!l || l=="" || !n || n=="" || !s || s=="") return "-";
- var i,i2,i3,c="-";
- i=l.indexOf(n);
- i3=n.indexOf("=")+1;
- if (i > -1) {
- i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; }
- c=l.substring((i+i3),i2);
- }
- return c;
-}
-function _uDomain() {
- if (!_udn || _udn=="" || _udn=="none") { _udn=""; return 1; }
- if (_udn=="auto") {
- var d=_ubd.domain;
- if (d.substring(0,4)=="www.") {
- d=d.substring(4,d.length);
- }
- _udn=d;
- }
- _udn = _udn.toLowerCase();
- if (_uhash=="off") return 1;
- return _uHash(_udn);
-}
-function _uHash(d) {
- if (!d || d=="") return 1;
- var h=0,g=0;
- for (var i=d.length-1;i>=0;i--) {
- var c=parseInt(d.charCodeAt(i));
- h=((h << 6) & 0xfffffff) + c + (c << 14);
- if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21));
- }
- return h;
-}
-function _uFixA(c,s,t) {
- if (!c || c=="" || !s || s=="" || !t || t=="") return "-";
- var a=_uGC(c,"__utma="+_udh+".",s);
- var lt=0,i=0;
- if ((i=a.lastIndexOf(".")) > 9) {
- _uns=a.substring(i+1,a.length);
- _uns=(_uns*1)+1;
- a=a.substring(0,i);
- if ((i=a.lastIndexOf(".")) > 7) {
- lt=a.substring(i+1,a.length);
- a=a.substring(0,i);
- }
- if ((i=a.lastIndexOf(".")) > 5) {
- a=a.substring(0,i);
- }
- a+="."+lt+"."+t+"."+_uns;
- }
- return a;
-}
-function _uTrim(s) {
- if (!s || s=="") return "";
- while ((s.charAt(0)==' ') || (s.charAt(0)=='\n') || (s.charAt(0,1)=='\r')) s=s.substring(1,s.length);
- while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\n') || (s.charAt(s.length-1)=='\r')) s=s.substring(0,s.length-1);
- return s;
-}
-function _uEC(s) {
- var n="";
- if (!s || s=="") return "";
- for (var i=0;i<s.length;i++) {if (s.charAt(i)==" ") n+="+"; else n+=s.charAt(i);}
- return n;
-}
-function __utmVisitorCode(f) {
- var r=0,t=0,i=0,i2=0,m=31;
- var a=_uGC(_ubd.cookie,"__utma="+_udh+".",";");
- if ((i=a.indexOf(".",0))<0) return;
- if ((i2=a.indexOf(".",i+1))>0) r=a.substring(i+1,i2); else return "";
- if ((i=a.indexOf(".",i2+1))>0) t=a.substring(i2+1,i); else return "";
- if (f) {
- return r;
- } else {
- var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');
- return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m];
- }
-}
-function _uIN(n) {
- if (!n) return false;
- for (var i=0;i<n.length;i++) {
- var c=n.charAt(i);
- if ((c<"0" || c>"9") && (c!=".")) return false;
- }
- return true;
-}
-function _uES(s,u) {
- if (typeof(encodeURIComponent) == 'function') {
- if (u) return encodeURI(s);
- else return encodeURIComponent(s);
- } else {
- return escape(s);
- }
-}
-function _uUES(s) {
- if (typeof(decodeURIComponent) == 'function') {
- return decodeURIComponent(s);
- } else {
- return unescape(s);
- }
-}
-function _uVG() {
- if((_udn.indexOf("www.google.") == 0 || _udn.indexOf(".google.") == 0 || _udn.indexOf("google.") == 0) && _utcp=='/' && _udn.indexOf("google.org")==-1) {
- return false;
- }
- return true;
-}
-function _uSP() {
- var s=100;
- if (_usample) s=_usample;
- if(s>=100 || s<=0) return true;
- return ((__utmVisitorCode(1)%10000)<(s*100));
-}
-function urchinPathCopy(p){
- var d=document,nx,tx,sx,i,c,cs,t,h,o;
- cs=new Array("a","b","c","v","x","z");
- h=_uDomain(); if (_udn && _udn!="") o=" domain="+_udn+";";
- nx=_uNx()+";";
- tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000));
- tx=tx.toGMTString()+";";
- sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000));
- sx=sx.toGMTString()+";";
- for (i=0;i<6;i++){
- t=" expires=";
- if (i==1) t+=tx; else if (i==2) t=""; else if (i==5) t+=sx; else t+=nx;
- c=_uGC(d.cookie,"__utm"+cs[i]+"="+h,";");
- if (c!="-") d.cookie="__utm"+cs[i]+"="+c+"; path="+p+";"+t+o;
- }
-}
-function _uCO() {
- if (!_utk || _utk=="" || _utk.length<10) return;
- var d='www.google.com';
- if (_utk.charAt(0)=='!') d='analytics.corp.google.com';
- _ubd.cookie="GASO="+_utk+"; path="+_utcp+";"+_udo;
- var sc=document.createElement('script');
- sc.type='text/javascript';
- sc.id="_gasojs";
- sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random();
- document.getElementsByTagName('head')[0].appendChild(sc);
-}
-function _uGT() {
- var h=location.hash, a;
- if (h && h!="" && h.indexOf("#gaso=")==0) {
- a=_uGC(h,"gaso=","&");
- } else {
- a=_uGC(_ubd.cookie,"GASO=",";");
- }
- return a;
-}
-var _utk=_uGT();
-if (_utk && _utk!="" && _utk.length>10 && _utk.indexOf("=")==-1) {
- if (window.addEventListener) {
- window.addEventListener('load', _uCO, false);
- } else if (window.attachEvent) {
- window.attachEvent('onload', _uCO);
- }
-}
-
-function _uNx() {
- return (new Date((new Date()).getTime()+63072000000)).toGMTString();
-}
+++ /dev/null
-.deps
-.libs
-Makefile
-Makefile.in
-aclocal.m4
-autom4te.cache
-config.guess
-config.h
-config.h.in
-config.log
-config.status
-config.sub
-configure
-depcomp
-install-sh
-libtool
-ltmain.sh
-missing
-stamp-h1
-*.desktop
-*~
+++ /dev/null
-Maemo Team <xxxx@maemo.org>
+++ /dev/null
-Copyright (C) 2009 Nokia Corporation. All rights reserved.
-
-This maemo code example is licensed under a following MIT-style license.
-
-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
+++ /dev/null
-2009-06-24 Maemo Team <xxxx@maemo.org>
-
- * Autotoolized and debianized
+++ /dev/null
-# We invent desktoplib_LTLIBRARIES instead of the normal lib_LTLIBRARIES,
-# so we can specify the non-standard installation directory.
-desktoplib_LTLIBRARIES = lib-timeout-home-widget.la
-desktoplibdir = $(HILDON_DESKTOP_LIB_DIR)
-
-lib_timeout_home_widget_la_SOURCES = lib-timeout-home-widget.c lib-timeout-home-widget.h location-provider.c location-provider.h coordinate-system.c coordinate-system.h
-lib_timeout_home_widget_la_LIBADD = $(EXAMPLE_LIBS)
-
-AM_CFLAGS = -Wall $(EXAMPLE_CFLAGS)
-
-# .desktop file
-desktopdir = $(HILDON_HOME_DESKTOP_DIR)
-desktop_DATA = timeout-home-widget.desktop
-
-DISTCLEANFILES = $(desktop_DATA)
+++ /dev/null
-Example Home widget. Provides TimeOut applet for the Home Area of the desktop.
+++ /dev/null
-#!/bin/sh
-
-set -ex
-if test -f Makefile; then
- make distclean
-fi
-rm -f *.tar.* *.tgz
-rm -Rf autom4te.cache
-rm -f Makefile.in aclocal.m4 configure depcomp install-sh missing ltmain.sh config.guess config.sub config.h.in mkinstalldirs INSTALL
+++ /dev/null
-#!/bin/sh
-
-set -ex
-autoreconf --install --force
+++ /dev/null
-AC_PREREQ(2.61)
-AC_INIT([hildon-timeout-desktop-widget-example], [0.1])
-AC_CONFIG_SRCDIR([lib-timeout-home-widget.c])
-AM_INIT_AUTOMAKE
-AC_CONFIG_HEADER([config.h])
-
-AC_PROG_CC
-AC_HEADER_STDC
-AC_PROG_INSTALL
-AM_PROG_LIBTOOL
-
-PKG_CHECK_MODULES(EXAMPLE, hildon-1 libhildondesktop-1 gtk+-2.0 liblocation)
-AC_SUBST(EXAMPLE_CFLAGS)
-AC_SUBST(EXAMPLE_LIBS)
-
-# Discover where to install the .desktop file:
-HILDON_HOME_DESKTOP_DIR=`pkg-config libhildondesktop-1 --variable=hildonhomedesktopentrydir`
-AC_SUBST(HILDON_HOME_DESKTOP_DIR)
-
-# Discover where to install the status widget's lib file:
-HILDON_DESKTOP_LIB_DIR=`pkg-config libhildondesktop-1 --variable=hildondesktoplibdir`
-AC_SUBST(HILDON_DESKTOP_LIB_DIR)
-
-
-AC_OUTPUT(Makefile)
-AC_OUTPUT(timeout-home-widget.desktop)
+++ /dev/null
-#include "coordinate-system.h"
-
-#include <math.h>
-
-
-// Degrees to radians
-double radians(double deg) {
- return deg * M_PI / 180.0;
-}
-
-// Radians to degrees
-double degrees(double rad) {
- return rad * 180.0 / M_PI;
-}
-
-
-// Constants
-// Longitude0 and Center meridian of KKJ bands
-const double KKJ_ZONE_INFO[6][2] = { {18.0, 500000.0},
- {21.0, 1500000.0},
- {24.0, 2500000.0},
- {27.0, 3500000.0},
- {30.0, 4500000.0},
- {33.0, 5500000.0} };
-
-
-// Function: KKJ_Zone_I
-int KKJ_Zone_I(KKJ easting) {
- int zoneNumber = floor(easting / 1000000.0);
- if (zoneNumber < 0 || zoneNumber > 5) {
- zoneNumber = -1;
- }
-
- return zoneNumber;
-}
-
-
-// Function: KKJ_Zone_Lo
-int KKJ_Zone_Lo(double kkjlo) {
- // determine the zonenumber from KKJ easting
- // takes KKJ zone which has center meridian
- // longitude nearest (in math value) to
- // the given KKJ longitude
- int zoneNumber = 5;
- while (zoneNumber >= 0) {
- if (fabs(kkjlo - KKJ_ZONE_INFO[zoneNumber][0]) <= 1.5) {
- break;
- }
- zoneNumber--;
- }
-
- return zoneNumber;
-}
-
-
-// Function: KKJlalo_to_WGS84lalo
-void KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude) {
- double dLa = radians(0.124867E+01 + -0.269982E+00 * kkjla + 0.191330E+00 * kkjlo + 0.356119E-02 * kkjla * kkjla + -0.122312E-02 * kkjla * kkjlo + -0.335514E-03 * kkjlo * kkjlo) / 3600.0;
- double dLo = radians(-0.286111E+02 + 0.114183E+01 * kkjla + -0.581428E+00 * kkjlo + -0.152421E-01 * kkjla * kkjla + 0.118177E-01 * kkjla * kkjlo + 0.826646E-03 * kkjlo * kkjlo) / 3600.0;
-
- *outLatitude = degrees(radians(kkjla) + dLa);
- *outLongitude = degrees(radians(kkjlo) + dLo);
-}
-
-
-// Function: WGS84lalo_to_KKJlalo
-void WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude) {
- double dLa = radians(-0.124766E+01 + 0.269941E+00 * latitude + -0.191342E+00 * longitude + -0.356086E-02 * latitude * latitude + 0.122353E-02 * latitude * longitude + 0.335456E-03 * longitude * longitude) / 3600.0;
- double dLo = radians(0.286008E+02 + -0.114139E+01 * latitude + 0.581329E+00 * longitude + 0.152376E-01 * latitude * latitude + -0.118166E-01 * latitude * longitude + -0.826201E-03 * longitude * longitude) / 3600.0;
-
- *outLatitude = degrees(radians(latitude) + dLa);
- *outLongitude = degrees(radians(longitude) + dLo);
-}
-
-
-// Function: KKJlalo_to_KKJxy
-void KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY) {
- // Hayford ellipsoid
- double a = 6378388.0;
- double f = 1.0 / 297.0;
- double b = (1.0 - f) * a;
- double bb = b * b;
- double c = (a / b) * a;
- double ee = (a * a - bb) / bb;
- double n = (a - b) / (a + b);
- double nn = n * n;
-
- double Lo = radians(lon) - radians(KKJ_ZONE_INFO[zoneNumber][0]);
- double cosLa = cos(radians(lat));
- double NN = ee * cosLa * cosLa;
- double LaF = atan(tan(radians(lat)) / cos(Lo * sqrt(1.0 + NN)));
- double cosLaF = cos(LaF);
- double t = (tan(Lo) * cosLaF) / sqrt(1.0 + ee * cosLaF * cosLaF);
- double A = a / (1.0 + n);
- double A1 = A * (1.0 + nn / 4.0 + nn * nn / 64.0);
- double A2 = A * 1.5 * n * (1.0 - nn / 8.0);
- double A3 = A * 0.9375 * nn * (1.0 - nn / 4.0);
- double A4 = A * 35.0 / 48.0 * nn * n;
-
- *outY = A1 * LaF - A2 * sin(2.0 * LaF) + A3 * sin(4.0 * LaF) - A4 * sin(6.0 * LaF);
- *outX = c * log(t + sqrt(1.0 + t * t)) + 500000.0 + zoneNumber * 1000000.0;
-}
-
-// Function: KKJxy_to_KKJlalo
-void KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude) {
- // Scan iteratively the target area, until find matching
- // KKJ coordinate value. Area is defined with Hayford Ellipsoid.
- int zoneNumber = KKJ_Zone_I(x);
- double minLo = radians(18.5);
- double maxLo = radians(32.0);
- double minLa = radians(59.0);
- double maxLa = radians(70.5);
-
- int i = 1;
- KKJ tmpX, tmpY;
-
- while (i < 35) {
- double deltaLo = maxLo - minLo;
- double deltaLa = maxLa - minLa;
- *outLongitude = degrees(minLo + 0.5 * deltaLo);
- *outLatitude = degrees(minLa + 0.5 * deltaLa);
- KKJlola_to_KKJxy(*outLongitude, *outLatitude, zoneNumber, &tmpX, &tmpY);
- if (tmpY < y) {
- minLa = minLa + 0.45 * deltaLa;
- } else {
- maxLa = minLa + 0.55 * deltaLa;
- }
-
- if (tmpX < x) {
- minLo = minLo + 0.45 * deltaLo;
- } else {
- maxLo = minLo + 0.55 * deltaLo;
- }
-
- i++;
- }
-}
-
- ////////////////////
- // PUBLIC METHODS //
-////////////////////
-
-void WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY) {
- double kkjlo, kkjla;
-
- WGS84lola_to_KKJlola(longitude, latitude, &kkjlo, &kkjla);
- int zoneNumber = KKJ_Zone_Lo(kkjlo);
- KKJlola_to_KKJxy(kkjlo, kkjla, zoneNumber, outX, outY);
- }
-
-void KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude) {
- double kkjlo, kkjla;
-
- KKJxy_to_KKJlola(x, y, &kkjlo, &kkjla);
- KKJlola_to_WGS84lola(kkjlo, kkjla, outLongitude, outLatitude);
-}
+++ /dev/null
-#ifndef COORDINATE_SYSTEM_H
-#define COORDINATE_SYSTEM_H
-
-// Type for KKJ x/y coordinates
-typedef unsigned int KKJ;
-
-/**
- * Transformes WGS84 longitude/latitude coordinates to KKJ x/y coordinates.
- * @param longitude the input longitude in degrees
- * @param latitude the input latitude in degrees
- * @param outX the result x (easting)
- * @param outY the result y (northing)
- */
-void WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY);
-
-/**
- * Transformes KKJ x/y coordinates to WGS84 longitude/latitude coordinates.
- * @param x the input x (easting)
- * @param y the input y (northing)
- * @param outLongitude the result longitude in degrees
- * @param outLatitude the result latitude in degrees
- */
-void KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
-
-#endif
+++ /dev/null
-hildon-timeout-home-widget-example (0.1-1) unstable; urgency=low
-
- * Autotoolized and debianized
-
- -- Maemo Team <xxxx@maemo.org> Wed, 24 Jun 2009 16:22:18 +0300
-
+++ /dev/null
-Source: hildon-timeout-home-widget-example
-Section: user/desktop
-Priority: optional
-Maintainer: Maemo Team <xxxx@maemo.org>
-Build-Depends: debhelper (>= 5), autotools-dev, libhildondesktop1-dev (>= 2.1.16)
-Standards-Version: 3.7.2
-
-Package: hildon-timeout-home-widget-example
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Description: Example home widget
- An example home widget for Maemo.
+++ /dev/null
-This package was debianized by Maemo Team <xxxx@maemo.org> on
-Wed, 24 Jun 2009 16:22:18 +0300.
-
-Copyright (C) 2009 Nokia Corporation. All rights reserved.
-
-This maemo code example is licensed under a following MIT-style license.
-
-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
+++ /dev/null
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-
-# These are used for cross-compiling and for saving the configure script
-# from having to guess our platform (since we know it already)
-DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
-DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
-
-
-CFLAGS = -Wall -g
-
-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
- CFLAGS += -O0
-else
- CFLAGS += -O2
-endif
-
-config.status: configure
- dh_testdir
- # Add here commands to configure the package.
- ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs"
-
-
-build: build-stamp
-
-build-stamp: config.status
- dh_testdir
-
- # Add here commands to compile the package.
- $(MAKE)
- #docbook-to-man debian/hildon-timeout-home-widget-example.sgml > hildon-timeout-home-widget-example.1
-
- touch $@
-
-clean:
- dh_testdir
- dh_testroot
- rm -f build-stamp
-
- # Add here commands to clean up after the build process.
- -$(MAKE) distclean
-ifneq "$(wildcard /usr/share/misc/config.sub)" ""
- cp -f /usr/share/misc/config.sub config.sub
-endif
-ifneq "$(wildcard /usr/share/misc/config.guess)" ""
- cp -f /usr/share/misc/config.guess config.guess
-endif
-
-
- dh_clean
-
-install: build
- dh_testdir
- dh_testroot
- dh_clean -k
- dh_installdirs
-
- # Add here commands to install the package into debian/hildon-timeout-home-widget-example.
- $(MAKE) DESTDIR=$(CURDIR)/debian/hildon-timeout-home-widget-example install
-
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
- dh_testdir
- dh_testroot
- dh_installchangelogs ChangeLog
- dh_installdocs
- dh_installexamples
-# dh_install
-# dh_installmenu
-# dh_installdebconf
-# dh_installlogrotate
-# dh_installemacsen
-# dh_installpam
-# dh_installmime
-# dh_python
-# dh_installinit
-# dh_installcron
-# dh_installinfo
- dh_installman
- dh_link
- dh_strip
- dh_compress
- dh_fixperms
-# dh_perl
-# dh_makeshlibs
- dh_installdeb
- dh_shlibdeps
- dh_gencontrol
- dh_md5sums
- dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install
+++ /dev/null
-/*
- * This file is part of hildon-timeout-home-widget-example
- *
- * Copyright (C) 2009 Nokia Corporation. All rights reserved.
- *
- * This maemo code example is licensed under a MIT-style license,
- * that can be found in the file called "COPYING" in the root
- * directory.
- *
- */
-
-#include <gtk/gtk.h>
-#include <hildon/hildon.h>
-#include <time.h>
-#include <stdlib.h>
-
-#include "lib-timeout-home-widget.h"
-
-#include "location-provider.h"
-#include "coordinate-system.h"
-
-HD_DEFINE_PLUGIN_MODULE (TimeOutPlugin, time_out_plugin, HD_TYPE_HOME_PLUGIN_ITEM)
-
-GtkTextBuffer *debugBuffer = NULL;
-
-static void printDebug(const char *msg)
-{
- if (debugBuffer != NULL) {
- gtk_text_buffer_insert_at_cursor(debugBuffer, msg, -1);
- gtk_text_buffer_insert_at_cursor(debugBuffer, "\n", -1);
- }
-}
-
-char debugStr[1024];
-#define debug(...) sprintf(debugStr, __VA_ARGS__); printDebug(debugStr)
-
-
-
-void start_location_tracking();
-void stop_location_tracking();
-
-// Railway station
-//KKJ destinationX = 2552414;
-//KKJ destinationY = 6673664;
-// Home
-KKJ destinationX = 2544607;
-KKJ destinationY = 6683661;
-
-#define IDLE 0
-#define SEARCHING_LOCATION 1
-#define LOCATION_RECEIVED 2
-
-static int widget_state = IDLE;
-
-void get_me_home(KKJ x, KKJ y)
-{
- time_t t;
- struct tm *tmp;
-
- char hour[4];
- char minute[4];
- char day[4];
- char month[4];
- char year[6];
-
- // Get the current time
- t = time(NULL);
- tmp = localtime(&t);
- if (tmp == NULL) {
- return;
- }
-
- // Format needed parts from the current time
- strftime(hour, sizeof(hour), "%H", tmp);
- strftime(minute, sizeof(minute), "%M", tmp);
- strftime(day, sizeof(day), "%d", tmp);
- strftime(month, sizeof(month), "%m", tmp);
- strftime(year, sizeof(year), "%Y", tmp);
-
- debug("Hour %s minute %s", hour, minute);
-
- // Format the URL
- char url[1024];
- // http://www.reittiopas.fi/?from=poi*Current+location*2552414*6673664&to=poi*Home*2544607*6683661&hour=12&minute=18&timetype=departure&day=14&month=02&year=2010
- sprintf(url, "http://www.reittiopas.fi/?from=poi*Current+location*%u*%u&to=poi*Home*%u*%u&hour=%s&minute=%s&timetype=departure&day=%s&month=%s&year=%s", x, y, destinationX, destinationY, hour, minute, day, month, year);
-
- // Open the browser
- char command[1024];
- sprintf(command, "browser_dbuscmd.sh load_url \"%s\"", url);
- system(command);
-}
-
-static void location_listener(double latitude, double longitude)
-{
- KKJ x, y;
-
-// debug("got location: %f, %f", latitude, longitude);
-
- if (widget_state == SEARCHING_LOCATION) {
- widget_state = LOCATION_RECEIVED;
-
- WGS84lola_to_KKJxy(longitude, latitude, &x, &y);
-
- get_me_home(x, y);
-
- stop_location_tracking();
- widget_state = IDLE;
- }
-}
-
-int locationTrackingOn = 0;
-void start_location_tracking() {
- if (!locationTrackingOn) {
- // Setup location tracking
- setup_location_provider();
- set_location_listener(location_listener);
- start_location_provider();
-
- locationTrackingOn = 1;
- debug("Location tracking started");
- }
-}
-
-void stop_location_tracking() {
- if (locationTrackingOn) {
- stop_location_provider();
- cleanup_location_provider();
-
- locationTrackingOn = 0;
- debug("Location tracking stopped");
- }
-}
-
-void search_button_clicked(GtkButton *button, gpointer user_data)
-{
- if (widget_state == IDLE) {
- widget_state = SEARCHING_LOCATION;
- start_location_tracking();
- }
-}
-
-static GtkWidget *build_ui(void)
-{
- GtkVBox *contents = GTK_VBOX(gtk_vbox_new(0, FALSE));
- GtkLabel *label = GTK_LABEL(gtk_label_new("Get me home"));
-// HildonPickerButton *action;
-// action = HILDON_PICKER_BUTTON (hildon_picker_button_new (HILDON_SIZE_FINGER_HEIGHT,
-// HILDON_BUTTON_ARRANGEMENT_VERTICAL));
-// HildonTouchSelector *action_selector;
-// action_selector = HILDON_TOUCH_SELECTOR (hildon_touch_selector_new_text ());
-// hildon_button_set_title (HILDON_BUTTON (action), "Action");
-// hildon_touch_selector_append_text (action_selector, "Blank Screen");
-// hildon_touch_selector_append_text (action_selector, "Suspend");
-// hildon_touch_selector_append_text (action_selector, "Turn Off");
-// hildon_picker_button_set_selector (action, action_selector);
-// hildon_picker_button_set_active (action, 0);
-
- GtkWidget* getmehomeButton = hildon_gtk_button_new(HILDON_SIZE_AUTO);
- gtk_button_set_label(GTK_BUTTON(getmehomeButton), "Get Me Home");
-
- g_signal_connect(getmehomeButton, "clicked", G_CALLBACK(search_button_clicked), NULL);
-
-// HildonTimeButton *time;
-// time = HILDON_TIME_BUTTON (hildon_time_button_new (HILDON_SIZE_FINGER_HEIGHT,
-// HILDON_BUTTON_ARRANGEMENT_VERTICAL));
-// hildon_time_button_set_time (time, 22, 00);
-
- GtkHBox *buttons = GTK_HBOX(gtk_hbox_new(0, TRUE));
- gtk_container_add(GTK_CONTAINER(buttons), GTK_WIDGET(getmehomeButton));
-// gtk_container_add (GTK_CONTAINER (buttons), GTK_WIDGET (action));
-// gtk_container_add (GTK_CONTAINER (buttons), GTK_WIDGET (time));
-
- GtkWidget *debugView = hildon_text_view_new(); // gtk_text_view_new();
- gtk_widget_set_size_request(GTK_WIDGET(debugView), 400, 200);
- debugBuffer = hildon_text_view_get_buffer(HILDON_TEXT_VIEW(debugView)); // gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
- GtkWidget* debugScroller = gtk_scrolled_window_new(NULL, NULL);
- gtk_container_add(GTK_CONTAINER(debugScroller), GTK_WIDGET(debugView));
-
- gtk_box_pack_start(GTK_BOX(contents), GTK_WIDGET(label), FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(contents), GTK_WIDGET(buttons), FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(contents), GTK_WIDGET(debugScroller), FALSE, FALSE, 0);
- gtk_widget_show_all(GTK_WIDGET(contents));
-
- return GTK_WIDGET(contents);
-
- /*GtkWidget* getmehomeButton = hildon_gtk_button_new(HILDON_SIZE_AUTO);
- gtk_button_set_label(GTK_BUTTON(getmehomeButton), "Get Me Home");
- g_signal_connect(getmehomeButton, "clicked", G_CALLBACK(search_button_clicked), NULL);
-
- gtk_widget_show_all(GTK_WIDGET(getmehomeButton));
-
- return GTK_WIDGET(getmehomeButton);*/
-}
-
-static void
-time_out_plugin_init (TimeOutPlugin *desktop_plugin)
-{
- GtkWidget *contents = build_ui ();
- gtk_container_add (GTK_CONTAINER (desktop_plugin), contents);
-}
-
-static void
-time_out_plugin_class_init (TimeOutPluginClass *class) {}
-
-static void
-time_out_plugin_class_finalize (TimeOutPluginClass *class) {}
+++ /dev/null
-/*
- * This file is part of hildon-timeout-home-widget-example
- *
- * Copyright (C) 2009 Nokia Corporation. All rights reserved.
- *
- * This maemo code example is licensed under a MIT-style license,
- * that can be found in the file called "COPYING" in the root
- * directory.
- *
- */
-
-#ifndef TIME_OUT_PLUGIN_H
-#define TIME_OUT_PLUGIN_H
-
-#include <glib-object.h>
-
-#include <libhildondesktop/libhildondesktop.h>
-
-G_BEGIN_DECLS
-
-typedef struct _TimeOutPlugin TimeOutPlugin;
-typedef struct _TimeOutPluginClass TimeOutPluginClass;
-
-#define TIME_OUT_TYPE_HOME_PLUGIN (time_out_home_plugin_get_type ())
-
-#define TIME_OUT_HOME_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
- TIME_OUT_TYPE_HOME_PLUGIN, TimeOutHomePlugin))
-
-#define TIME_OUT_HOME_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
- TIME_OUT_TYPE_HOME_PLUGIN, TimeOutHomePluginClass))
-
-#define TIME_OUT_IS_HOME_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
- TIME_OUT_TYPE_HOME_PLUGIN))
-
-#define TIME_OUT_IS_HOME_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
- TIME_OUT_TYPE_HOME_PLUGIN))
-
-#define TIME_OUT_HOME_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
- TIME_OUT_TYPE_HOME_PLUGIN, TimeOutHomePluginClass))
-
-struct _TimeOutPlugin
-{
- HDHomePluginItem hitem;
-};
-
-struct _TimeOutPluginClass
-{
- HDHomePluginItemClass parent_class;
-};
-
-GType time_out_home_plugin_get_type(void);
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-#include "location-provider.h"
-
-#include <location/location-gps-device.h>
-#include <location/location-gpsd-control.h>
-
-void (*listener)(double, double) = NULL;
-
-/*static void on_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer data)
-{
- g_debug("location error: %d... quitting", error);
- g_main_loop_quit((GMainLoop *) data);
-}*/
-
-static void on_changed(LocationGPSDevice *device, gpointer data)
-{
- if (device == NULL || listener == NULL) {
- return;
- }
-
- if (device->fix) {
- if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) {
- listener(device->fix->latitude, device->fix->longitude);
- }
- }
-}
-
-/*static void on_stop(LocationGPSDControl *control, gpointer data)
-{
- g_debug("quitting");
- g_main_loop_quit((GMainLoop *) data);
-}*/
-
-/*static gboolean start_location(gpointer data)
-{
- location_gpsd_control_start((LocationGPSDControl *) data);
- return FALSE;
-}*/
-
-LocationGPSDControl *control = NULL;
-LocationGPSDevice *device = NULL;
-
-void setup_location_provider()
-{
-// GMainLoop *loop;
-
-// g_type_init();
-
-// loop = g_main_loop_new(NULL, FALSE);
-
- if (control != NULL) {
- return;
- }
-
- control = location_gpsd_control_get_default();
- device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL);
-
- g_object_set(G_OBJECT(control),
- "preferred-method", LOCATION_METHOD_USER_SELECTED,
- "preferred-interval", LOCATION_INTERVAL_DEFAULT,
- NULL);
-
-// g_signal_connect(control, "error-verbose", G_CALLBACK(on_error), loop);
- g_signal_connect(device, "changed", G_CALLBACK(on_changed), control);
-// g_signal_connect(control, "gpsd-stopped", G_CALLBACK(on_stop), loop);
-
-// g_idle_add(start_location, control);
-
-// g_main_loop_run(loop);
-}
-
-void cleanup_location_provider()
-{
- if (control != NULL) {
- location_gpsd_control_stop(control);
-
- g_object_unref(device);
- g_object_unref(control);
- device = NULL;
- control = NULL;
- }
-}
-
-void start_location_provider()
-{
- if (control != NULL) {
- location_gpsd_control_start(control);
- }
-}
-
-void stop_location_provider()
-{
- if (control != NULL) {
- location_gpsd_control_stop(control);
- }
-}
-
-void set_location_listener(void (*newListener)(double, double))
-{
- listener = newListener;
-}
+++ /dev/null
-#ifndef LOCATION_PROVIDER_H
-#define LOCATION_PROVIDER_H
-
-void setup_location_provider();
-void cleanup_location_provider();
-
-void start_location_provider();
-void stop_location_provider();
-
-void set_location_listener(void (*newListener)(double, double));
-
-#endif
+++ /dev/null
-[Desktop Entry]
-Name=TimeOut Widget
-Comment=Execute an action at a given time
-Type=default
-X-Path=lib-timeout-home-widget.so
--- /dev/null
+#include "qgeopositioninfo.h"
--- /dev/null
+#include "qgeopositioninfosource.h"
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QGEOCOORDINATE_H
+#define QGEOCOORDINATE_H
+
+#include "qmobilityglobal.h"
+
+#include <QString>
+
+QT_BEGIN_NAMESPACE
+class QDebug;
+class QDataStream;
+QT_END_NAMESPACE
+
+QT_BEGIN_HEADER
+
+QTM_BEGIN_NAMESPACE
+
+class QGeoCoordinatePrivate;
+class Q_LOCATION_EXPORT QGeoCoordinate
+{
+public:
+ enum CoordinateType {
+ InvalidCoordinate,
+ Coordinate2D,
+ Coordinate3D
+ };
+
+ enum CoordinateFormat {
+ Degrees,
+ DegreesWithHemisphere,
+ DegreesMinutes,
+ DegreesMinutesWithHemisphere,
+ DegreesMinutesSeconds,
+ DegreesMinutesSecondsWithHemisphere
+ };
+
+ QGeoCoordinate();
+ QGeoCoordinate(double latitude, double longitude);
+ QGeoCoordinate(double latitude, double longitude, double altitude);
+ QGeoCoordinate(const QGeoCoordinate &other);
+ ~QGeoCoordinate();
+
+ QGeoCoordinate &operator=(const QGeoCoordinate &other);
+
+ bool operator==(const QGeoCoordinate &other) const;
+ inline bool operator!=(const QGeoCoordinate &other) const {
+ return !operator==(other);
+ }
+
+ bool isValid() const;
+ CoordinateType type() const;
+
+ void setLatitude(double latitude);
+ double latitude() const;
+
+ void setLongitude(double longitude);
+ double longitude() const;
+
+ void setAltitude(double altitude);
+ double altitude() const;
+
+ qreal distanceTo(const QGeoCoordinate &other) const;
+ qreal azimuthTo(const QGeoCoordinate &other) const;
+
+ QString toString(CoordinateFormat format = DegreesMinutesSecondsWithHemisphere) const;
+
+private:
+ QGeoCoordinatePrivate *d;
+};
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_LOCATION_EXPORT QDebug operator<<(QDebug, const QGeoCoordinate &);
+#endif
+
+#ifndef QT_NO_DATASTREAM
+Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoCoordinate &coordinate);
+Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate);
+#endif
+
+QTM_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QGEOPOSITIONINFO_H
+#define QGEOPOSITIONINFO_H
+
+#include "qmobilityglobal.h"
+#include "qgeocoordinate.h"
+
+#include <QDateTime>
+
+QT_BEGIN_NAMESPACE
+class QDebug;
+class QDataStream;
+QT_END_NAMESPACE
+
+QT_BEGIN_HEADER
+
+QTM_BEGIN_NAMESPACE
+
+class QGeoPositionInfoPrivate;
+class Q_LOCATION_EXPORT QGeoPositionInfo
+{
+public:
+ enum Attribute {
+ Direction,
+ GroundSpeed,
+ VerticalSpeed,
+ MagneticVariation,
+ HorizontalAccuracy,
+ VerticalAccuracy
+ };
+
+ QGeoPositionInfo();
+ QGeoPositionInfo(const QGeoCoordinate &coordinate, const QDateTime &updateTime);
+ QGeoPositionInfo(const QGeoPositionInfo &other);
+ ~QGeoPositionInfo();
+
+ QGeoPositionInfo &operator=(const QGeoPositionInfo &other);
+
+ bool operator==(const QGeoPositionInfo &other) const;
+ inline bool operator!=(const QGeoPositionInfo &other) const {
+ return !operator==(other);
+ }
+
+ bool isValid() const;
+
+ void setDateTime(const QDateTime &dateTime);
+ QDateTime dateTime() const;
+
+ void setCoordinate(const QGeoCoordinate &coordinate);
+ QGeoCoordinate coordinate() const;
+
+ void setAttribute(Attribute attribute, qreal value);
+ qreal attribute(Attribute attribute) const;
+ void removeAttribute(Attribute attribute);
+ bool hasAttribute(Attribute attribute) const;
+
+private:
+#ifndef QT_NO_DEBUG_STREAM
+ friend Q_LOCATION_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &update);
+#endif
+#ifndef QT_NO_DATASTREAM
+ friend Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &update);
+ friend Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &update);
+#endif
+ QGeoPositionInfoPrivate *d;
+};
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_LOCATION_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &update);
+#endif
+
+#ifndef QT_NO_DATASTREAM
+Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &update);
+Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &update);
+#endif
+
+QTM_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QGEOPOSITIONINFOSOURCE_H
+#define QGEOPOSITIONINFOSOURCE_H
+
+#include "qmobilityglobal.h"
+#include "qgeopositioninfo.h"
+
+#include <QObject>
+
+QT_BEGIN_HEADER
+
+QTM_BEGIN_NAMESPACE
+
+class QGeoPositionInfoSourcePrivate;
+class Q_LOCATION_EXPORT QGeoPositionInfoSource : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval)
+ Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval)
+
+public:
+ enum PositioningMethod {
+ SatellitePositioningMethods = 0x000000ff,
+ NonSatellitePositioningMethods = 0xffffff00,
+ AllPositioningMethods = 0xffffffff
+ };
+ Q_DECLARE_FLAGS(PositioningMethods, PositioningMethod)
+
+ explicit QGeoPositionInfoSource(QObject *parent);
+ virtual ~QGeoPositionInfoSource();
+
+ virtual void setUpdateInterval(int msec);
+ int updateInterval() const;
+
+ virtual void setPreferredPositioningMethods(PositioningMethods methods);
+ PositioningMethods preferredPositioningMethods() const;
+
+ virtual QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0;
+
+ virtual PositioningMethods supportedPositioningMethods() const = 0;
+ virtual int minimumUpdateInterval() const = 0;
+
+ static QGeoPositionInfoSource *createDefaultSource(QObject *parent);
+
+public Q_SLOTS:
+ virtual void startUpdates() = 0;
+ virtual void stopUpdates() = 0;
+
+ virtual void requestUpdate(int timeout = 0) = 0;
+
+Q_SIGNALS:
+ void positionUpdated(const QGeoPositionInfo &update);
+ void updateTimeout();
+
+private:
+ Q_DISABLE_COPY(QGeoPositionInfoSource)
+ QGeoPositionInfoSourcePrivate *d;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoPositionInfoSource::PositioningMethods)
+
+QTM_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QMOBILITYGLOBAL_H
+#define QMOBILITYGLOBAL_H
+
+
+#define QTM_VERSION_STR "1.0.0"
+/*
+ QTM_VERSION is (major << 16) + (minor << 8) + patch.
+*/
+#define QTM_VERSION 0x010000
+/*
+ can be used like #if (QTM_VERSION >= QTM_VERSION_CHECK(1, 0, 0))
+*/
+#define QTM_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
+
+#define QTM_PACKAGEDATE_STR "YYYY-MM-DD"
+
+#define QTM_PACKAGE_TAG ""
+
+#if defined(QTM_BUILD_UNITTESTS)
+# include <qconfig.h>
+# if !defined(QT_BUILD_INTERNAL)
+# define QT_BUILD_INTERNAL
+# endif
+#endif
+#include <QtCore/qglobal.h>
+
+#if defined(SYMBIAN_DATABASEMANAGER_SERVER)
+# define Q_SERVICEFW_EXPORT
+#else
+# if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+# if defined(QT_NODLL)
+# undef QT_MAKEDLL
+# undef QT_DLL
+# elif defined(QT_MAKEDLL)
+# if defined(QT_DLL)
+# undef QT_DLL
+# endif
+# if defined(QT_BUILD_BEARER_LIB)
+# define Q_BEARER_EXPORT Q_DECL_EXPORT
+# else
+# define Q_BEARER_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_CFW_LIB)
+# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_EXPORT
+# else
+# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_CONTACTS_LIB)
+# define Q_CONTACTS_EXPORT Q_DECL_EXPORT
+# else
+# define Q_CONTACTS_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_VERSIT_LIB)
+# define Q_VERSIT_EXPORT Q_DECL_EXPORT
+# else
+# define Q_VERSIT_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_LOCATION_LIB)
+# define Q_LOCATION_EXPORT Q_DECL_EXPORT
+# else
+# define Q_LOCATION_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_MESSAGING_LIB)
+# define Q_MESSAGING_EXPORT Q_DECL_EXPORT
+# else
+# define Q_MESSAGING_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_MEDIA_LIB)
+# define Q_MEDIA_EXPORT Q_DECL_EXPORT
+# else
+# define Q_MEDIA_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_SFW_LIB)
+# define Q_SERVICEFW_EXPORT Q_DECL_EXPORT
+# else
+# define Q_SERVICEFW_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_SYSINFO_LIB)
+# define Q_SYSINFO_EXPORT Q_DECL_EXPORT
+# else
+# define Q_SYSINFO_EXPORT Q_DECL_IMPORT
+# endif
+# if defined(QT_BUILD_SENSORS_LIB)
+# define Q_SENSORS_EXPORT Q_DECL_EXPORT
+# else
+# define Q_SENSORS_EXPORT Q_DECL_IMPORT
+# endif
+# elif defined(QT_DLL) /* use a Qt DLL library */
+# define Q_BEARER_EXPORT Q_DECL_IMPORT
+# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT
+# define Q_CONTACTS_EXPORT Q_DECL_IMPORT
+# define Q_VERSIT_EXPORT Q_DECL_IMPORT
+# define Q_LOCATION_EXPORT Q_DECL_IMPORT
+# define Q_MEDIA_EXPORT Q_DECL_IMPORT
+# define Q_MESSAGING_EXPORT Q_DECL_IMPORT
+# define Q_SERVICEFW_EXPORT Q_DECL_IMPORT
+# define Q_SYSINFO_EXPORT Q_DECL_IMPORT
+# define Q_SENSORS_EXPORT Q_DECL_IMPORT
+# endif
+# else
+# endif
+# if !defined(Q_SERVICEFW_EXPORT)
+# if defined(QT_SHARED)
+# define Q_BEARER_EXPORT Q_DECL_EXPORT
+# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_EXPORT
+# define Q_CONTACTS_EXPORT Q_DECL_EXPORT
+# define Q_VERSIT_EXPORT Q_DECL_EXPORT
+# define Q_LOCATION_EXPORT Q_DECL_EXPORT
+# define Q_MEDIA_EXPORT Q_DECL_EXPORT
+# define Q_MESSAGING_EXPORT Q_DECL_EXPORT
+# define Q_SERVICEFW_EXPORT Q_DECL_EXPORT
+# define Q_SYSINFO_EXPORT Q_DECL_EXPORT
+# define Q_SENSORS_EXPORT Q_DECL_EXPORT
+# else
+# define Q_BEARER_EXPORT
+# define Q_PUBLISHSUBSCRIBE_EXPORT
+# define Q_CONTACTS_EXPORT
+# define Q_VERSIT_EXPORT
+# define Q_LOCATION_EXPORT
+# define Q_MEDIA_EXPORT
+# define Q_MESSAGING_EXPORT
+# define Q_SERVICEFW_EXPORT
+# define Q_SYSINFO_EXPORT
+# define Q_SENSORS_EXPORT
+# endif
+# endif
+#endif
+
+// The namespace is hardcoded as moc has issues resolving
+// macros which would be a prerequisite for a dynmamic namespace
+#define QTM_NAMESPACE QtMobility
+
+#ifdef QTM_NAMESPACE
+# define QTM_PREPEND_NAMESPACE(name) ::QTM_NAMESPACE::name
+# define QTM_BEGIN_NAMESPACE namespace QTM_NAMESPACE {
+# define QTM_END_NAMESPACE }
+# define QTM_USE_NAMESPACE using namespace QTM_NAMESPACE;
+#else
+# define QTM_PREPEND_NAMESPACE(name) ::name
+# define QTM_BEGIN_NAMESPACE
+# define QTM_END_NAMESPACE
+# define QTM_USE_NAMESPACE
+#endif
+
+//in case Qt is in namespace
+QT_USE_NAMESPACE
+
+#endif // QMOBILITYGLOBAL_H
+++ /dev/null
-#!/bin/sh
-
-# A script to fetch GMock from source repository, compile it and run the tests.
-
-PRE_WD=`pwd`
-
-# Go to correct directory
-cd `dirname $0`
-
-# Get gmock from svn
-echo "Fetching GMock source from http://googlemock.googlecode.com"
-svn checkout http://googlemock.googlecode.com/svn/trunk/ gmock
-
-cd gmock
-echo "Running autoreconf..."
-AUTOMAKE=automake-1.9 ACLOCAL=aclocal-1.9 autoreconf -f -v -i
-
-mkdir build
-cd build
-
-echo "Running configure..."
-../configure
-
-echo "Running make..."
-make -j3
-echo "Running make check..."
-make check
-
-echo "All done"
-# Go back to original directory
-cd $PRE_WD
+++ /dev/null
-Makefile
-libptascommon.so*
+++ /dev/null
-#include "coordinatesystemtransformer.h"
-
-#include <math.h>
-
-
-using namespace QTM_NAMESPACE;
-
-/**
- * A class representing geographical coordinates from the Finnish KKJ coordinate system.
- */
-class KKJGeoCoordinate {
- // The latitude of the coordinate
- double mLatitude;
- // The longitude of the coordinate
- double mLongitude;
-
-public:
- /**
- * An empty constructor.
- * Constructs a new KKJ geographical coordinate with default coordinate values.
- * Note that the constructed coordinate doesn't necessarily represent any real location
- * on earth.
- */
- KKJGeoCoordinate();
-
- /**
- * Constructs a new KKJ geographical coordinate.
- * @param latitude the latitude of the coordinate
- * @param longitude the longitude of the coordinate
- */
- KKJGeoCoordinate(double latitude, double longitude);
-
- /**
- * Gets the latitude of this coordinate.
- * @return the latitude of this coordinate
- */
- double latitude() const;
-
- /**
- * Gets the longitude of this coordinate.
- * @return the longitude of this coordinate
- */
- double longitude() const;
-
- /**
- * Sets the latitude of this coordinate.
- * @param latitude the new latitude
- */
- void setLatitude(double latitude);
-
- /**
- * Sets the longitude of this coordinate.
- * @param longitude the new latitude
- */
- void setLongitude(double longitude);
-
-};
-
-
-KKJGeoCoordinate::KKJGeoCoordinate() :
- mLatitude(0.0),
- mLongitude(0.0)
-{
-}
-
-KKJGeoCoordinate::KKJGeoCoordinate(double latitude, double longitude) :
- mLatitude(latitude),
- mLongitude(longitude)
-{
-}
-
-double KKJGeoCoordinate::latitude() const
-{
- return mLatitude;
-}
-
-double KKJGeoCoordinate::longitude() const
-{
- return mLongitude;
-}
-
-void KKJGeoCoordinate::setLatitude(double latitude)
-{
- mLatitude = latitude;
-}
-
-void KKJGeoCoordinate::setLongitude(double longitude)
-{
- mLongitude = longitude;
-}
-
-
-/**
- * A Hayford reference ellipsoid
- */
-class HayfordEllipsoid {
-public:
- // Equatorial radius
- static const double a;
- // Flattening
- static const double f;
- // Polar radius
- static const double b;
- // Polar radius squared
- static const double bb;
- // Polar radius of curvature
- static const double c;
- // First eccentricity squared
- static const double ee;
- // Second flattening
- static const double n;
- // Second flattening squared
- static const double nn;
-};
-
-const double HayfordEllipsoid::a = 6378388.0;
-const double HayfordEllipsoid::f = 1.0 / 297.0;
-const double HayfordEllipsoid::b = (1.0 - f) * a;
-const double HayfordEllipsoid::bb = b * b;
-const double HayfordEllipsoid::c = (a / b) * a;
-const double HayfordEllipsoid::ee = (a * a - bb) / bb; // should probably be (a * a - bb) / (a * a)
-const double HayfordEllipsoid::n = (a - b) / (a + b);
-const double HayfordEllipsoid::nn = n * n;
-
-
-
-// Degrees to radians
-double radians(double deg) {
- return deg * M_PI / 180.0;
-}
-
-// Radians to degrees
-double degrees(double rad) {
- return rad * 180.0 / M_PI;
-}
-
-
-/**
- * A class providing KKJ zone information.
- */
-class KKJZone {
-private:
- // Storage for the central meridians and false eastings of the zones
- static const double KKJ_ZONE_INFO[6][2];
-
- // Minimum zone number
- static const int MIN_ZONE = 0;
- // Maximum zone number
- static const int MAX_ZONE = 5;
-
-public:
- /**
- * Determines a zone number from the KKJ easting value. If the easting is not within any of
- * the zones, -1 is returned.
- * @param kkj the KKJ coordinate
- * @return the zone number or -1 on error
- */
- static int getZoneNumberFromEasting(const KKJGridCoordinate &kkj);
-
- /**
- * Determines a zone number from the KKJ longitude value. If the longitude is not within any of
- * the zones, -1 is returned.
- * @param kkj the KKJ coordinate
- * @return the zone number or -1 on error
- */
- static int getZoneNumberFromLongitude(const KKJGeoCoordinate &kkj);
-
- /**
- * Gets the central meridian in degrees of the given zone. The zone number must be
- * on the interval [0, 5]. If an invalid zone number is given, 0.0 is returned.
- * @param zoneNumber the zone number
- * @return the central meridian of the zone or 0.0 on error
- */
- static double getCentralMeridianOfZone(int zoneNumber);
-
- /**
- * Gets the false easting in metres of the given zone. The zone number must be
- * on the interval [0, 5]. If an invalid zone number is given, 0.0 is returned.
- * @param zoneNumber the zone number
- * @return the false easting of the zone or 0.0 on error
- */
- static double getFalseEastingOfZone(int zoneNumber);
-};
-
- // central meridian
- // false easting
-const double KKJZone::KKJ_ZONE_INFO[6][2] = { {18.0, 500000.0}, // zone 0
- {21.0, 1500000.0},
- {24.0, 2500000.0},
- {27.0, 3500000.0},
- {30.0, 4500000.0},
- {33.0, 5500000.0} };// zone 5
-
-
-int KKJZone::getZoneNumberFromEasting(const KKJGridCoordinate &kkj) {
- int zoneNumber = floor(kkj.easting() / 1000000.0);
- if (zoneNumber < MIN_ZONE || zoneNumber > MAX_ZONE) {
- zoneNumber = -1;
- }
-
- return zoneNumber;
-}
-
-int KKJZone::getZoneNumberFromLongitude(const KKJGeoCoordinate &kkj) {
- // determine the zonenumber from KKJ easting
- // takes KKJ zone which has center meridian
- // longitude nearest (in math value) to
- // the given KKJ longitude
- int zoneNumber = MAX_ZONE;
- while (zoneNumber >= MIN_ZONE) {
- if (fabs(kkj.longitude() - KKJ_ZONE_INFO[zoneNumber][0]) <= 1.5) {
- break;
- }
- zoneNumber--;
- }
-
- return zoneNumber;
-}
-
-double KKJZone::getCentralMeridianOfZone(int zoneNumber)
-{
- if (zoneNumber >= MIN_ZONE && zoneNumber <= MAX_ZONE) {
- return KKJ_ZONE_INFO[zoneNumber][0];
- }
-
- return 0.0;
-}
-
-double KKJZone::getFalseEastingOfZone(int zoneNumber)
-{
- if (zoneNumber >= MIN_ZONE && zoneNumber <= MAX_ZONE) {
- return KKJ_ZONE_INFO[zoneNumber][1];
- }
-
- return 0.0;
-}
-
-
-/**
- * Transforms a KKJ geographical coordinate to a WGS84 geographical coordinate.
- * @param fromCoordinate the input coordinate
- * @return the transformed coordinate
- */
-QGeoCoordinate transformToWGS84GeoCoordinate(const KKJGeoCoordinate &fromCoordinate) {
- double kkjla = fromCoordinate.latitude();
- double kkjlo = fromCoordinate.longitude();
-
- double dLa = (0.124867E+01 + -0.269982E+00 * kkjla + 0.191330E+00 * kkjlo + 0.356119E-02 * kkjla * kkjla + -0.122312E-02 * kkjla * kkjlo + -0.335514E-03 * kkjlo * kkjlo) / 3600.0;
- double dLo = (-0.286111E+02 + 0.114183E+01 * kkjla + -0.581428E+00 * kkjlo + -0.152421E-01 * kkjla * kkjla + 0.118177E-01 * kkjla * kkjlo + 0.826646E-03 * kkjlo * kkjlo) / 3600.0;
-
- return QGeoCoordinate(kkjla + dLa, kkjlo + dLo);
-}
-
-
-/**
- * Transforms a WGS84 geographical coordinate to a KKJ geographical coordinate.
- * @param fromCoordinate the input coordinate
- * @return the transformed coordinate
- */
-KKJGeoCoordinate transformToKKJGeoCoordinate(const QGeoCoordinate &fromCoordinate) {
- double longitude = fromCoordinate.longitude();
- double latitude = fromCoordinate.latitude();
-
- double dLa = (-0.124766E+01 + 0.269941E+00 * latitude + -0.191342E+00 * longitude + -0.356086E-02 * latitude * latitude + 0.122353E-02 * latitude * longitude + 0.335456E-03 * longitude * longitude) / 3600.0;
- double dLo = (0.286008E+02 + -0.114139E+01 * latitude + 0.581329E+00 * longitude + 0.152376E-01 * latitude * latitude + -0.118166E-01 * latitude * longitude + -0.826201E-03 * longitude * longitude) / 3600.0;
-
- return KKJGeoCoordinate(latitude + dLa, longitude + dLo);
-}
-
-
-/**
- * Transforms a KKJ geographical coordinate to a KKJ rectangular grid coordinate.
- * @param fromCoordinate the input coordinate
- * @param zoneNumber the zone number in which the input coordinate resides
- * @return the transformed coordinate
- */
-KKJGridCoordinate transformToKKJGridCoordinate(const KKJGeoCoordinate &fromCoordinate) {
- int zoneNumber = KKJZone::getZoneNumberFromLongitude(fromCoordinate);
- double Lo = radians(fromCoordinate.longitude()) - radians(KKJZone::getCentralMeridianOfZone(zoneNumber));
- double cosLa = cos(radians(fromCoordinate.latitude()));
- double NN = HayfordEllipsoid::ee * cosLa * cosLa;
- double LaF = atan(tan(radians(fromCoordinate.latitude())) / cos(Lo * sqrt(1.0 + NN)));
- double cosLaF = cos(LaF);
- double t = (tan(Lo) * cosLaF) / sqrt(1.0 + HayfordEllipsoid::ee * cosLaF * cosLaF);
- double A = HayfordEllipsoid::a / (1.0 + HayfordEllipsoid::n);
- double A1 = A * (1.0 + HayfordEllipsoid::nn / 4.0 + HayfordEllipsoid::nn * HayfordEllipsoid::nn / 64.0);
- double A2 = A * 1.5 * HayfordEllipsoid::n * (1.0 - HayfordEllipsoid::nn / 8.0);
- double A3 = A * 0.9375 * HayfordEllipsoid::nn * (1.0 - HayfordEllipsoid::nn / 4.0);
- double A4 = A * 35.0 / 48.0 * HayfordEllipsoid::nn * HayfordEllipsoid::n;
-
- unsigned int outY = A1 * LaF - A2 * sin(2.0 * LaF) + A3 * sin(4.0 * LaF) - A4 * sin(6.0 * LaF);
- unsigned int outX = HayfordEllipsoid::c * log(t + sqrt(1.0 + t * t)) + 500000.0 + zoneNumber * 1000000.0;
- return KKJGridCoordinate(outY, outX);
-}
-
-/**
- * Transforms a KKJ rectangular grid coordinate to a KKJ geographical coordinate.
- * @param fromCoordinate the input coordinate
- * @return the transformed coordinate
- */
-KKJGeoCoordinate transformToKKJGeoCoordinate(const KKJGridCoordinate &fromCoordinate) {
- // Scan iteratively the target area, until find matching
- // KKJ coordinate value. Area is defined with Hayford Ellipsoid.
- double minLo = 18.5;
- double maxLo = 32.0;
- double minLa = 59.0;
- double maxLa = 70.5;
-
- int i = 1;
-
- KKJGeoCoordinate ret;
-
- while (i < 35) {
- double deltaLo = maxLo - minLo;
- double deltaLa = maxLa - minLa;
- ret.setLongitude(minLo + 0.5 * deltaLo);
- ret.setLatitude(minLa + 0.5 * deltaLa);
- KKJGridCoordinate kkj = transformToKKJGridCoordinate(ret);
- if (kkj.northing() < fromCoordinate.northing()) {
- minLa = minLa + 0.45 * deltaLa;
- } else {
- maxLa = minLa + 0.55 * deltaLa;
- }
-
- if (kkj.easting() < fromCoordinate.easting()) {
- minLo = minLo + 0.45 * deltaLo;
- } else {
- maxLo = minLo + 0.55 * deltaLo;
- }
-
- i++;
- }
-
- return ret;
-}
-
-
-KKJGridCoordinate CoordinateSystemTransformer::transformToKKJ(const QGeoCoordinate &fromCoordinate)
-{
- KKJGeoCoordinate tmpKKJ = transformToKKJGeoCoordinate(fromCoordinate);
- return transformToKKJGridCoordinate(tmpKKJ);
-}
-
-QGeoCoordinate CoordinateSystemTransformer::transformToWGS84(const KKJGridCoordinate &fromCoordinate)
-{
- KKJGeoCoordinate tmpKKJ = transformToKKJGeoCoordinate(fromCoordinate);
- return transformToWGS84GeoCoordinate(tmpKKJ);
-}
+++ /dev/null
-#ifndef COORDINATESYSTEMTRANSFORMER_H
-#define COORDINATESYSTEMTRANSFORMER_H
-
-#include "kkjgridcoordinate.h"
-#include <QGeoCoordinate>
-
-/**
- * A utility class for transforming coordinates from one coordinate system to another.
- */
-class CoordinateSystemTransformer
-{
-public:
- /**
- * Makes a coordinate transformation from WGS84 coordinate system to KKJ rectangular
- * grid coordinates.
- * @param fromCoordinate the WGS84 coordinate that will be transformed.
- * @return the transformed coordinate in KKJ coordinate system.
- */
- static KKJGridCoordinate transformToKKJ(const QTM_NAMESPACE::QGeoCoordinate &fromCoordinate);
-
- /**
- * Makes a coordinate transformation from KKJ rectangular grid coordinate system
- * to WGS84 coordinate system.
- * @param fromCoordinate the KKJ coordinate that will be transformed.
- * @return the transformed coordinate in WGS84 coordinate system.
- */
- static QTM_NAMESPACE::QGeoCoordinate transformToWGS84(const KKJGridCoordinate &fromCoordinate);
-};
-
-#endif // COORDINATESYSTEMTRANSFORMER_H
--- /dev/null
+#include "gpscontroller.h"
+#include "gpscontroller_p.h"
+
+#include <QObject>
+#include <QGeoPositionInfo>
+#include <QGeoPositionInfoSource>
+#include <QDebug>
+
+GpsController::GpsController() :
+ q( new GpsControllerPrivate() )
+{
+ q->init();
+ q->startGps();
+}
+
+GpsController::GpsController( GpsControllerPrivate *gpsControllerPrivate ) :
+ q( gpsControllerPrivate )
+{
+ q->init();
+ q->startGps();
+}
+
+GpsController::~GpsController()
+{
+ delete q;
+}
+
+void GpsController::getGps()
+{
+ Location *location;
+ Location *previousLocation = q->mostRecentlyReportedLocation();
+
+ if ( q->useFakeLocation() ) {
+ location = q->fakeLocation();
+ } else {
+ location = q->liveLocation();
+ }
+
+ if ( location != previousLocation ) {
+ emit locationChanged( location );
+ }
+}
+
+void GpsController::useLiveGps()
+{
+ q->setUseFakeLocation( false );
+ q->startGps();
+ emit locationChanged( q->liveLocation() );
+}
+
+void GpsController::useFakeGps( const QString &fakeLocationLabel )
+{
+ qDebug() << "using fake gps (" << fakeLocationLabel << ")";
+
+ q->setFakeLocationLabel( fakeLocationLabel );
+ Location *fakeLocation = q->fakeLocation();
+
+ if ( fakeLocation == 0 ) {
+ qDebug() << "invalid fake location label; cannot use fake location";
+ } else {
+ q->stopGps();
+ q->setUseFakeLocation( true );
+ emit locationChanged( fakeLocation );
+ }
+}
--- /dev/null
+#ifndef GPSCONTROLLER_H
+#define GPSCONTROLLER_H
+
+#include "location.h"
+
+#include "gpscontroller_p.h"
+
+#include <QObject>
+#include <QGeoPositionInfo>
+#include <QGeoPositionInfoSource>
+
+QTM_USE_NAMESPACE
+
+class GpsController : public QObject
+{
+ Q_OBJECT
+
+public:
+ GpsController();
+ GpsController( GpsControllerPrivate *gpsControllerPrivate );
+
+ ~GpsController();
+
+public Q_SLOTS:
+ void getGps();
+ void useFakeGps( const QString &fakeLocationLabel );
+ void useLiveGps();
+
+Q_SIGNALS:
+ void locationChanged( Location *newLocation );
+
+private:
+ GpsControllerPrivate *q;
+};
+
+#endif // GPSCONTROLLER_H
--- /dev/null
+#include "gpscontroller_p.h"
+
+#include "location.h"
+#include "locations.h"
+
+#include <QObject>
+#include <QGeoPositionInfo>
+#include <QGeoPositionInfoSource>
+#include <QDebug>
+
+QTM_USE_NAMESPACE
+
+GpsControllerPrivate::GpsControllerPrivate() :
+ m_gps(0),
+ m_liveLocation( new Location( "livegps" ) ),
+ m_fakeLocationLabel(),
+ m_useFakeLocation(false)
+{
+}
+
+GpsControllerPrivate::~GpsControllerPrivate()
+{
+ delete m_gps;
+ m_gps = 0;
+ delete m_liveLocation;
+ m_liveLocation = 0;
+}
+
+void GpsControllerPrivate::init()
+{
+ m_gps = QGeoPositionInfoSource::createDefaultSource(this);
+ connect(
+ m_gps, SIGNAL( positionUpdated( QGeoPositionInfo ) ),
+ this, SLOT( updateLocation( QGeoPositionInfo ) )
+ );
+}
+
+void GpsControllerPrivate::startGps()
+{
+ m_gps->startUpdates();
+}
+
+void GpsControllerPrivate::stopGps()
+{
+ m_gps->stopUpdates();
+}
+
+QGeoPositionInfoSource *GpsControllerPrivate::gps()
+{
+ return m_gps;
+}
+
+void GpsControllerPrivate::setGps( QGeoPositionInfoSource *gps )
+{
+ m_gps = gps;
+}
+
+Location *GpsControllerPrivate::liveLocation()
+{
+ m_mostRecentlyReportedLocation = m_liveLocation;
+ return m_liveLocation;
+}
+
+Location *GpsControllerPrivate::fakeLocation()
+{
+ Locations locations;
+ Location *location = locations.location( fakeLocationLabel() );
+ m_mostRecentlyReportedLocation = location;
+ return location;
+}
+
+QString GpsControllerPrivate::fakeLocationLabel()
+{
+ return m_fakeLocationLabel;
+}
+
+void GpsControllerPrivate::setFakeLocationLabel( const QString &label )
+{
+ m_fakeLocationLabel = label;
+}
+
+bool GpsControllerPrivate::useFakeLocation()
+{
+ return m_useFakeLocation;
+}
+
+void GpsControllerPrivate::setUseFakeLocation( bool useFake )
+{
+ m_useFakeLocation = useFake;
+}
+
+void GpsControllerPrivate::updateLocation( QGeoPositionInfo positionInfo )
+{
+ m_liveLocation->setLocation( positionInfo );
+}
+
+Location *GpsControllerPrivate::mostRecentlyReportedLocation()
+{
+ return m_mostRecentlyReportedLocation;
+}
--- /dev/null
+#ifndef GPSCONTROLLER_P_H
+#define GPSCONTROLLER_P_H
+
+#include <QGeoPositionInfo>
+#include <QGeoPositionInfoSource>
+
+QTM_USE_NAMESPACE
+
+class Location;
+
+class GpsControllerPrivate : public QObject
+{
+ Q_OBJECT
+
+public:
+ GpsControllerPrivate();
+ ~GpsControllerPrivate();
+
+ virtual void init();
+ virtual void startGps();
+ virtual void stopGps();
+
+ virtual void setGps( QGeoPositionInfoSource *gps );
+ virtual void setFakeLocationLabel( const QString &label );
+ virtual void setUseFakeLocation( bool useFake );
+
+ virtual QGeoPositionInfoSource *gps();
+ virtual Location *liveLocation();
+ virtual Location *fakeLocation();
+ virtual Location *mostRecentlyReportedLocation();
+ virtual QString fakeLocationLabel();
+ virtual bool useFakeLocation();
+
+private Q_SLOTS:
+ virtual void updateLocation( QGeoPositionInfo positionInfo );
+
+private:
+ QGeoPositionInfoSource *m_gps;
+ Location *m_liveLocation;
+ QString m_fakeLocationLabel;
+ bool m_useFakeLocation;
+ Location *m_mostRecentlyReportedLocation;
+};
+
+#endif //GPSCONTROLLER_P_H
+++ /dev/null
-#include "kkjgridcoordinate.h"
-#include "kkjgridcoordinate_p.h"
-
-KKJGridCoordinatePrivate::~KKJGridCoordinatePrivate()
-{
-}
-
-void KKJGridCoordinatePrivate::init(unsigned int northing, unsigned int easting)
-{
- this->northing = northing;
- this->easting = easting;
-}
-
-
-KKJGridCoordinate::KKJGridCoordinate(unsigned int northing, unsigned int easting) :
- d_ptr(new KKJGridCoordinatePrivate)
-{
- Q_D(KKJGridCoordinate);
- d->q_ptr = this;
- d->init(northing, easting);
-}
-
-KKJGridCoordinate::KKJGridCoordinate(KKJGridCoordinatePrivate &dd, unsigned int northing, unsigned int easting) :
- d_ptr(&dd)
-{
- Q_D(KKJGridCoordinate);
- d->q_ptr = this;
- d->init(northing, easting);
-}
-
-KKJGridCoordinate::~KKJGridCoordinate()
-{
-}
-
-bool KKJGridCoordinate::operator==(const KKJGridCoordinate &rhs) const
-{
- return northing() == rhs.northing() && easting() == rhs.easting();
-}
-
-KKJGridCoordinate& KKJGridCoordinate::operator=(const KKJGridCoordinate &rhs)
-{
- Q_D(KKJGridCoordinate);
- d->northing = rhs.northing();
- d->easting = rhs.easting();
-
- return *this;
-}
-
-unsigned int KKJGridCoordinate::northing() const
-{
- Q_D(const KKJGridCoordinate);
- return d->northing;
-}
-
-unsigned int KKJGridCoordinate::easting() const
-{
- Q_D(const KKJGridCoordinate);
- return d->easting;
-}
+++ /dev/null
-#ifndef KKJGRIDCOORDINATE_H
-#define KKJGRIDCOORDINATE_H
-
-#include <QtGlobal>
-
-class KKJGridCoordinatePrivate;
-
-/**
- * A class representing the Finnish KKJ coordinate.
- * This is the rectangular grid coordinate version.
- */
-class KKJGridCoordinate
-{
-public:
- /**
- * Constructs a new KKJ coordinate with the given values.
- * @param northing the northing coordinate.
- * @param easting the easting coordinate.
- */
- KKJGridCoordinate(unsigned int northing, unsigned int easting);
-
- /**
- * Destructor.
- */
- virtual ~KKJGridCoordinate();
-
- /**
- * Equals operator.
- * Tests the equality of this coordinate and another coordinate and returns \c true
- * if the coordinates represent the same position.
- * @param rhs the other coordinate to test against.
- * @return \c true if the coordinates are the same, \c false otherwise.
- */
- bool operator==(const KKJGridCoordinate &rhs) const;
-
- /**
- * Assignment operator.
- * @param rhs the object that is copied.
- * @return this object.
- */
- KKJGridCoordinate& operator=(const KKJGridCoordinate &rhs);
-
- /**
- * Returns the northing of the coordinate.
- * @return the northing.
- */
- unsigned int northing() const;
-
- /**
- * Returns the easting of the coordinate.
- * @return the easting.
- */
- unsigned int easting() const;
-
-protected:
- /**
- * Constructs a new KKJ coordinate with the given values.
- * @param dd a private implementation member.
- * @param northing the northing coordinate.
- * @param easting the easting coordinate.
- */
- KKJGridCoordinate(KKJGridCoordinatePrivate &dd, unsigned int northing, unsigned int easting);
-
-
-private:
- /// Pointer to the private member
- KKJGridCoordinatePrivate *const d_ptr;
-
- Q_DECLARE_PRIVATE(KKJGridCoordinate)
-
-};
-
-#endif // KKJGRIDCOORDINATE_H
+++ /dev/null
-#ifndef KKJGRIDCOORDINATE_P_H
-#define KKJGRIDCOORDINATE_P_H
-
-#include <QtGlobal>
-
-class KKJGridCoordinate;
-
-/**
- * A private member class for class KKJGridCoordinate.
- */
-class KKJGridCoordinatePrivate
-{
-public:
- /**
- * Destructor.
- */
- virtual ~KKJGridCoordinatePrivate();
-
-private:
- /**
- * Initializes the private class.
- * @param northing the northing of the coordinate.
- * @param easting the easting of the coordinate.
- */
- void init(unsigned int northing, unsigned int easting);
-
- /// The northing of the coordinate.
- unsigned int northing;
-
- /// The easting of the coordinate.
- unsigned int easting;
-
- /// The concrete class owning this private implementation member.
- KKJGridCoordinate *q_ptr;
-
- Q_DECLARE_PUBLIC(KKJGridCoordinate)
-
-};
-
-#endif // KKJGRIDCOORDINATE_P_H
--- /dev/null
+#include "location.h"
+
+#include "location_p.h"
+
+#include "ytv.h"
+
+#include <QString>
+#include <QObject>
+#include <QNetworkAccessManager>
+#include <QUrl>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QXmlStreamReader>
+#include <QDebug>
+#include <QXmlStreamAttributes>
+#include <QStringRef>
+#include <QGeoPositionInfo>
+
+#include <math.h>
+
+const double Location::KkjZoneInfo[6][2] = {
+ {18.0, 500000.0},
+ {21.0, 1500000.0},
+ {24.0, 2500000.0},
+ {27.0, 3500000.0},
+ {30.0, 4500000.0},
+ {33.0, 5500000.0}
+};
+
+QTM_USE_NAMESPACE
+
+Location::Location( const QString &x, const QString &y, const QString &label ) :
+ q( new LocationPrivate( x, y, label ) ),
+ manager( new QNetworkAccessManager(this) )
+{
+ connect(
+ manager, SIGNAL( finished(QNetworkReply*) ),
+ this, SLOT( replyFinished(QNetworkReply*) )
+ );
+}
+
+Location::Location( const QGeoPositionInfo &positionInfo, const QString &label ) :
+ q( new LocationPrivate( label ) ),
+ manager(0)
+{
+ setLocation( positionInfo );
+}
+
+void Location::setLocation( const QGeoPositionInfo &positionInfo )
+{
+ qreal latitude = positionInfo.coordinate().latitude();
+ qreal longitude = positionInfo.coordinate().longitude();
+
+ KKJ outX(0);
+ KKJ outY(0);
+
+ WGS84lola_to_KKJxy( longitude, latitude, &outX, &outY);
+
+ q->setX( outX );
+ q->setY( outY );
+ q->setValid( true );
+}
+
+Location::Location( const Location &from ) :
+ QObject(0),
+ q( new LocationPrivate( from.label() ) ),
+ manager(0)
+{
+ q->setAddress( from.address() );
+ q->setX( from.x() );
+ q->setY( from.y() );
+ q->setValid( from.isValid() );
+ if ( from.manager != 0 ) {
+ manager = new QNetworkAccessManager(this);
+ connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
+ }
+}
+
+Location::Location( const QString &label ) :
+ q( new LocationPrivate( label ) ),
+ manager( new QNetworkAccessManager(this) )
+{
+ connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
+}
+
+Location::~Location()
+{
+ delete q;
+ q=0;
+ delete manager;
+ manager=0;
+}
+
+Location &Location::operator=( const Location &from )
+{
+ q = new LocationPrivate( from.label() );
+ q->setAddress( from.address() );
+ q->setX( from.x() );
+ q->setY( from.y() );
+ q->setValid( from.isValid() );
+
+ if ( from.manager != 0 ) {
+ manager = new QNetworkAccessManager(this);
+ connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
+ } else {
+ manager = 0;
+ }
+
+ return *this;
+}
+
+void Location::resolveAddress( const QString &address )
+{
+ qDebug() << "resolving address (" << address << ")";
+
+ q->setAddress( address );
+ q->setValid( false );
+
+ QUrl fullUrl( Ytv::Url );
+
+ fullUrl.addEncodedQueryItem( "key", address.toAscii().toPercentEncoding() );
+ fullUrl.addQueryItem( "user", Ytv::Username );
+ fullUrl.addQueryItem( "pass", Ytv::Password );
+
+ manager->get( QNetworkRequest( fullUrl ) );
+ qDebug() << "waiting for reply from Ytv";
+ emit( busy( true ) );
+}
+
+void Location::replyFinished( QNetworkReply * reply )
+{
+ qDebug() << "address resolved";
+ q->parseReply( reply->readAll() );
+
+ if ( isValid() ) {
+ qDebug() << label() << "becomeValid";
+ emit( becomeValid() );
+ } else {
+ qDebug() << label() << "not valid";
+ emit( becomeInValid() );
+ }
+
+ emit( busy( false ) );
+}
+
+QString Location::x() const
+{
+ return q->x();
+}
+
+QString Location::y() const
+{
+ return q->y();
+}
+
+void Location::setLabel( const QString &label ) const
+{
+ q->setLabel( label );
+}
+
+QString Location::label() const
+{
+ return q->label();
+}
+
+void Location::setAddress( const QString &address ) const
+{
+ qDebug() << "setting address to" << address;
+ q->setAddress( address );
+}
+
+QString Location::address() const
+{
+ return q->address();
+}
+
+bool Location::isValid() const
+{
+ return q->isValid();
+}
+
+// Degrees to radians
+double Location::radians(double deg)
+{
+ return deg * M_PI / 180.0;
+}
+
+// Radians to degrees
+double Location::degrees(double rad)
+{
+ return rad * 180.0 / M_PI;
+}
+
+// Function: KKJ_Zone_I
+int Location::KKJ_Zone_I(KKJ easting)
+{
+ int zoneNumber = floor(easting / 1000000.0);
+ if (zoneNumber < 0 || zoneNumber > 5) {
+ zoneNumber = -1;
+ }
+
+ return zoneNumber;
+}
+
+// Function: KKJ_Zone_Lo
+int Location::KKJ_Zone_Lo(double kkjlo)
+{
+ // determine the zonenumber from KKJ easting
+ // takes KKJ zone which has center meridian
+ // longitude nearest (in math value) to
+ // the given KKJ longitude
+ int zoneNumber = 5;
+ while (zoneNumber >= 0) {
+ if (fabs(kkjlo - KkjZoneInfo[zoneNumber][0]) <= 1.5) {
+ break;
+ }
+ zoneNumber--;
+ }
+
+ return zoneNumber;
+}
+
+
+// Function: KKJlalo_to_WGS84lalo
+void Location::KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude)
+{
+ double dLa = radians(0.124867E+01 + -0.269982E+00 * kkjla + 0.191330E+00 * kkjlo + 0.356119E-02 * kkjla * kkjla + -0.122312E-02 * kkjla * kkjlo + -0.335514E-03 * kkjlo * kkjlo) / 3600.0;
+ double dLo = radians(-0.286111E+02 + 0.114183E+01 * kkjla + -0.581428E+00 * kkjlo + -0.152421E-01 * kkjla * kkjla + 0.118177E-01 * kkjla * kkjlo + 0.826646E-03 * kkjlo * kkjlo) / 3600.0;
+
+ *outLatitude = degrees(radians(kkjla) + dLa);
+ *outLongitude = degrees(radians(kkjlo) + dLo);
+}
+
+
+// Function: WGS84lalo_to_KKJlalo
+void Location::WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude)
+{
+ double dLa = radians(-0.124766E+01 + 0.269941E+00 * latitude + -0.191342E+00 * longitude + -0.356086E-02 * latitude * latitude + 0.122353E-02 * latitude * longitude + 0.335456E-03 * longitude * longitude) / 3600.0;
+ double dLo = radians(0.286008E+02 + -0.114139E+01 * latitude + 0.581329E+00 * longitude + 0.152376E-01 * latitude * latitude + -0.118166E-01 * latitude * longitude + -0.826201E-03 * longitude * longitude) / 3600.0;
+
+ *outLatitude = degrees(radians(latitude) + dLa);
+ *outLongitude = degrees(radians(longitude) + dLo);
+}
+
+
+// Function: KKJlalo_to_KKJxy
+void Location::KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY)
+{
+ // Hayford ellipsoid
+ double a = 6378388.0;
+ double f = 1.0 / 297.0;
+ double b = (1.0 - f) * a;
+ double bb = b * b;
+ double c = (a / b) * a;
+ double ee = (a * a - bb) / bb;
+ double n = (a - b) / (a + b);
+ double nn = n * n;
+
+ double Lo = radians(lon) - radians(KkjZoneInfo[zoneNumber][0]);
+ double cosLa = cos(radians(lat));
+ double NN = ee * cosLa * cosLa;
+ double LaF = atan(tan(radians(lat)) / cos(Lo * sqrt(1.0 + NN)));
+ double cosLaF = cos(LaF);
+ double t = (tan(Lo) * cosLaF) / sqrt(1.0 + ee * cosLaF * cosLaF);
+ double A = a / (1.0 + n);
+ double A1 = A * (1.0 + nn / 4.0 + nn * nn / 64.0);
+ double A2 = A * 1.5 * n * (1.0 - nn / 8.0);
+ double A3 = A * 0.9375 * nn * (1.0 - nn / 4.0);
+ double A4 = A * 35.0 / 48.0 * nn * n;
+
+ *outY = A1 * LaF - A2 * sin(2.0 * LaF) + A3 * sin(4.0 * LaF) - A4 * sin(6.0 * LaF);
+ *outX = c * log(t + sqrt(1.0 + t * t)) + 500000.0 + zoneNumber * 1000000.0;
+}
+
+// Function: KKJxy_to_KKJlalo
+void Location::KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
+{
+ // Scan iteratively the target area, until find matching
+ // KKJ coordinate value. Area is defined with Hayford Ellipsoid.
+ int zoneNumber = KKJ_Zone_I(x);
+ double minLo = radians(18.5);
+ double maxLo = radians(32.0);
+ double minLa = radians(59.0);
+ double maxLa = radians(70.5);
+
+ int i = 1;
+ KKJ tmpX, tmpY;
+
+ while (i < 35) {
+ double deltaLo = maxLo - minLo;
+ double deltaLa = maxLa - minLa;
+ *outLongitude = degrees(minLo + 0.5 * deltaLo);
+ *outLatitude = degrees(minLa + 0.5 * deltaLa);
+ KKJlola_to_KKJxy(*outLongitude, *outLatitude, zoneNumber, &tmpX, &tmpY);
+ if (tmpY < y) {
+ minLa = minLa + 0.45 * deltaLa;
+ } else {
+ maxLa = minLa + 0.55 * deltaLa;
+ }
+
+ if (tmpX < x) {
+ minLo = minLo + 0.45 * deltaLo;
+ } else {
+ maxLo = minLo + 0.55 * deltaLo;
+ }
+
+ i++;
+ }
+}
+
+void Location::WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY)
+{
+ double kkjlo, kkjla;
+
+ WGS84lola_to_KKJlola(longitude, latitude, &kkjlo, &kkjla);
+ int zoneNumber = KKJ_Zone_Lo(kkjlo);
+ KKJlola_to_KKJxy(kkjlo, kkjla, zoneNumber, outX, outY);
+}
+
+void Location::KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
+{
+ double kkjlo, kkjla;
+
+ KKJxy_to_KKJlola(x, y, &kkjlo, &kkjla);
+ KKJlola_to_WGS84lola(kkjlo, kkjla, outLongitude, outLatitude);
+
+}
+
--- /dev/null
+#ifndef LOCATION_H
+#define LOCATION_H
+
+#include "location_p.h"
+
+#include <QString>
+#include <QObject>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QGeoPositionInfo>
+#include <math.h>
+
+QTM_USE_NAMESPACE
+
+class Location : public QObject
+{
+Q_OBJECT
+
+public:
+ Location( const QString &x, const QString &y, const QString &label=QString() );
+ Location( const QGeoPositionInfo &positionInfo, const QString &label=QString() );
+ Location( const Location &from );
+ Location &operator=( const Location &from );
+ Location( const QString &label=QString() );
+
+ ~Location();
+
+ QString x() const;
+
+ QString y() const;
+
+ void setLocation( const QGeoPositionInfo &positionInfo );
+
+ void setAddress( const QString &address ) const;
+ QString address() const;
+
+ void setLabel( const QString &label ) const;
+ QString label() const;
+
+ bool isValid() const;
+
+public Q_SLOTS:
+ void resolveAddress( const QString &address );
+
+Q_SIGNALS:
+ void becomeValid();
+ void becomeInValid();
+ void busy( bool busy );
+
+private Q_SLOTS:
+ void replyFinished( QNetworkReply * reply );
+
+private:
+
+ LocationPrivate *q;
+ QNetworkAccessManager *manager;
+
+ typedef uint KKJ;
+
+ /**
+ * Transformes WGS84 longitude/latitude coordinates to KKJ x/y coordinates.
+ * @param longitude the input longitude in degrees
+ * @param latitude the input latitude in degrees
+ * @param outX the result x (easting)
+ * @param outY the result y (northing)
+ */
+ void WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY);
+
+ /**
+ * Transformes KKJ x/y coordinates to WGS84 longitude/latitude coordinates.
+ * @param x the input x (easting)
+ * @param y the input y (northing)
+ * @param outLongitude the result longitude in degrees
+ * @param outLatitude the result latitude in degrees
+ */
+ void KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
+
+ // Degrees to radians
+ double radians(double deg);
+
+ // Radians to degrees
+ double degrees(double rad);
+
+ // Constants
+ // Longitude0 and Center meridian of KKJ bands
+ static const double KkjZoneInfo[][2];
+
+ // Function: KKJ_Zone_I
+ int KKJ_Zone_I(KKJ easting);
+
+ // Function: KKJ_Zone_Lo
+ int KKJ_Zone_Lo(double kkjlo);
+
+ // Function: KKJlalo_to_WGS84lalo
+ void KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude);
+
+ // Function: WGS84lalo_to_KKJlalo
+ void WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude);
+
+ // Function: KKJlalo_to_KKJxy
+ void KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY);
+
+ // Function: KKJxy_to_KKJlalo
+ void KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
+
+};
+
+#endif // LOCATION_H
--- /dev/null
+#include <stdio.h>
+#include "location_p.h"
+
+#include <QXmlStreamReader>
+#include <QByteArray>
+#include <QDebug>
+#include <QMaemo5InformationBox>
+
+LocationPrivate::LocationPrivate( const QString &x, const QString &y, const QString &label ) :
+ m_label(label),
+ m_address(),
+ m_x(x),
+ m_y(y),
+ m_valid(true)
+{
+}
+
+LocationPrivate::LocationPrivate( const QString &label ) :
+ m_label(label),
+ m_address(),
+ m_x(0),
+ m_y(0),
+ m_valid(false)
+{
+}
+
+LocationPrivate::~LocationPrivate()
+{
+ m_label="deleted";
+ m_address="";
+ m_x="";
+ m_y="";
+ m_valid=false;
+}
+
+void LocationPrivate::parseReply( const QByteArray &reply )
+{
+ qDebug() << "parsing";
+ QXmlStreamReader xml( reply );
+ bool responseHasError = false;
+
+ while ( !xml.atEnd() ) {
+ xml.readNext();
+
+ if ( xml.isStartElement() ) {
+ QString xmlName( xml.name().toString() );
+
+ if ( xmlName == "LOC" ) {
+ QXmlStreamAttributes attributes( xml.attributes() );
+ QStringRef xAttribute( attributes.value("x") );
+ QStringRef yAttribute( attributes.value("y") );
+ QString newX( xAttribute.toString() );
+ QString newY( yAttribute.toString() );
+
+ m_x = newX;
+ m_y = newY;
+ }
+
+ if ( xmlName == "ERROR" ) {
+ responseHasError = true;
+ }
+
+ }
+ }
+
+ if ( xml.hasError() || responseHasError ) {
+ QMaemo5InformationBox::information( 0, "address resolution error - please check address" );
+ qDebug() << "xml error";
+ m_valid = false;
+ } else {
+ qDebug() << "(" << m_x << "," << m_y << ")";
+ if ( m_x.isEmpty() || m_y.isEmpty() ) {
+ qDebug() << "is NOT valid";
+ m_valid = false;
+ } else {
+ qDebug() << "is now valid";
+ m_valid = true;
+ }
+ }
+}
+
+void LocationPrivate::setLabel( const QString &label)
+{
+ m_label = label;
+}
+
+QString LocationPrivate::label() const
+{
+ return m_label;
+}
+
+void LocationPrivate::setAddress( const QString &address)
+{
+ m_address = address;
+}
+
+QString LocationPrivate::address() const
+{
+ return m_address;
+}
+
+void LocationPrivate::setX( uint x )
+{
+ m_x = QString( "%1" ).arg( x );
+}
+
+void LocationPrivate::setX( const QString &x )
+{
+ m_x = x;
+}
+
+QString LocationPrivate::x() const
+{
+ return m_x;
+}
+
+void LocationPrivate::setY( uint y )
+{
+ m_y = QString( "%1" ).arg( y );
+}
+
+void LocationPrivate::setY( const QString &y )
+{
+ m_y = y;
+}
+
+QString LocationPrivate::y() const
+{
+ return m_y;
+}
+
+void LocationPrivate::setValid( bool valid )
+{
+ m_valid = valid;
+}
+
+bool LocationPrivate::isValid() const
+{
+ return m_valid;
+}
--- /dev/null
+#ifndef LOCATION_P_H
+#define LOCATION_P_H
+
+#include <QObject>
+#include <QString>
+#include <QByteArray>
+
+class LocationPrivate : public QObject
+{
+ Q_OBJECT
+
+public:
+ LocationPrivate( const QString &x, const QString &y, const QString &label );
+ LocationPrivate( const QString &label );
+ virtual ~LocationPrivate();
+
+ void setX( uint x );
+ void setX( const QString &x );
+ QString x() const;
+
+ void setY( uint y );
+ void setY( const QString &y );
+ QString y() const;
+
+ void setAddress( const QString &address );
+ QString address() const;
+
+ void setLabel( const QString &label );
+ QString label() const;
+
+ void setValid( bool valid );
+ bool isValid() const;
+
+ void parseReply( const QByteArray &reply );
+
+ QString m_label;
+ QString m_address;
+ QString m_x;
+ QString m_y;
+ bool m_valid;
+};
+
+#endif // LOCATION_P_H
+
--- /dev/null
+#include "locations.h"
+
+#include <QDebug>
+#include <QHash>
+#include <QSettings>
+#include <QString>
+#include <QStringList>
+#include <QCoreApplication>
+
+QHash<QString,Location *> Locations::locationHash;
+bool Locations::initialised = false;
+
+Locations::Locations()
+{
+ if ( !initialised ) {
+ QCoreApplication::setOrganizationName("ZouBa");
+ QCoreApplication::setOrganizationDomain("zouba.yi.org");
+ QCoreApplication::setOrganizationName("ZouBa");
+
+ restoreLocations();
+ initialised = true;
+ }
+}
+
+Locations::~Locations()
+{
+}
+
+bool Locations::addLocation( Location *location )
+{
+ bool succeeded=false;
+
+ // if it's valid now, save the setting
+ if ( location->isValid() ) {
+ saveLocation( location );
+ }
+
+ if ( !locationHash.contains( location->label() ) ) {
+ qDebug() << "Adding location" << location->label();
+ locationHash[ location->label() ] = location;
+ succeeded = true;
+ } else {
+ qDebug() << "FAILED to add location" << location->label();
+ }
+
+ return succeeded;
+}
+
+void Locations::restoreLocations()
+{
+ QSettings settings;
+
+ settings.beginGroup( "Locations" );
+ QStringList labels = settings.childGroups();
+
+ for( int i=0; i<labels.size(); ++i ) {
+ QString label = labels[i];
+ settings.beginGroup( label );
+ QString x = settings.value( "x" ).toString();
+ QString y = settings.value( "y" ).toString();
+ QString address = settings.value( "address" ).toString();
+ settings.endGroup();
+
+ qDebug() << "restoring" << label;
+ Location *location = new Location( x, y, label );
+ location->setAddress( address );
+
+ locationHash[ label ] = location;
+ }
+
+ settings.endGroup();
+}
+
+void Locations::saveLocation( Location *location )
+{
+ qDebug() << "Saving location" << location->label();
+ QSettings settings;
+ settings.beginGroup( "Locations" );
+ settings.beginGroup( location->label() );
+ settings.setValue( "address", location->address() );
+ settings.setValue( "x", location->x() );
+ settings.setValue( "y", location->y() );
+ settings.endGroup();
+ settings.endGroup();
+}
+
+void Locations::saveLocation()
+{
+ Location *location = qobject_cast<Location*>(sender());
+
+ saveLocation( location );
+}
+
+Location *Locations::location( const QString &label )
+{
+ qDebug() << "requesting location" << label;
+ Location *retVal = 0;
+
+ if ( locationHash.contains( label ) ) {
+ qDebug() << "found location" << label;
+ retVal = locationHash[ label ];
+ } else {
+ qDebug() << "didn't find location" << label;
+ }
+
+ return retVal;
+}
--- /dev/null
+#ifndef LOCATIONS_H
+#define LOCATIONS_H
+
+#include "location.h"
+
+#include <QHash>
+#include <QString>
+#include <QObject>
+
+class Locations: public QObject
+{
+ Q_OBJECT
+
+public:
+ Locations();
+ ~Locations();
+
+ static Locations *instance();
+ bool addLocation( Location *location );
+
+ Location *location( const QString &label );
+
+public Q_SLOTS:
+ void saveLocation();
+
+private:
+ void restoreLocations();
+ static QHash<QString,Location *> locationHash;
+ static bool initialised;
+
+ void saveLocation( Location *location );
+};
+#endif // LOCATIONS_H
--- /dev/null
+#include "routedata.h"
+#include "route.h"
+#include "ui.h"
+#include "uicontroller.h"
+#include "location.h"
+#include "gpscontroller.h"
+#include "ytv.h"
+
+#include <QDebug>
+#include <QObject>
+#include <QApplication>
+#include <QMainWindow>
+
+int main(int argc, char *argv[] )
+{
+ QApplication app(argc, argv);
+
+ QMainWindow *mainWindow = new QMainWindow;
+ Ui *ui = new Ui;;
+ ui->setupUi(mainWindow);
+
+ UiController *uiController = new UiController( ui );
+ Route *route = new Route();
+ GpsController *gpsController = new GpsController();
+
+ QObject::connect(
+ route, SIGNAL( routeReady( QList<RouteData> ) ),
+ uiController, SLOT( displayRoute( QList<RouteData> ) )
+ );
+
+ QObject::connect(
+ gpsController, SIGNAL( locationChanged( Location* ) ),
+ route, SLOT( setFromLocation( Location* ) )
+ );
+
+ QObject::connect(
+ uiController, SIGNAL( destinationChanged( Location* ) ),
+ route, SLOT( setToLocation( Location* ) )
+ );
+
+ QObject::connect(
+ uiController, SIGNAL( buttonClicked() ),
+ gpsController, SLOT( getGps() )
+ );
+
+ QObject::connect(
+ ui, SIGNAL( fakeGpsPressed( const QString & ) ),
+ gpsController, SLOT( useFakeGps( const QString & ) )
+ );
+
+ QObject::connect(
+ ui, SIGNAL( liveGpsPressed() ),
+ gpsController, SLOT( useLiveGps() )
+ );
+
+ QObject::connect(
+ route, SIGNAL( busy( bool ) ),
+ ui, SLOT( setBusy( bool ) )
+ );
+
+ mainWindow->show();
+
+ return app.exec();
+}
--- /dev/null
+#include "route_p.h"
+#include "route.h"
+
+#include "routedata.h"
+#include "location.h"
+
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QUrl>
+#include <QObject>
+#include <QDebug>
+#include <QStringList>
+#include <QString>
+#include <QXmlStreamReader>
+#include <QWidget>
+
+#include "ytv.h"
+
+Route::Route() :
+ q( new RoutePrivate( this ) ),
+ manager( new QNetworkAccessManager(this) )
+{
+ connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
+}
+
+Route::~Route()
+{
+ delete manager;
+ manager = 0;
+}
+
+void Route::getRoute()
+{
+ qDebug() << "getting route from Ytv";
+
+ QUrl fullUrl( Ytv::Url );
+
+ QStringList a;
+ a << q->fromLocation()->x() << q->fromLocation()->y();
+ QStringList b;
+ b << q->toLocation()->x() << q->toLocation()->y();
+
+ fullUrl.addQueryItem( "a", a.join(",") );
+ fullUrl.addQueryItem( "b", b.join(",") );
+ fullUrl.addQueryItem( "show", QString::number(Ytv::ShowFiveResults) );
+ fullUrl.addQueryItem( "walkspeed", QString::number(Ytv::WalkSpeedFast) );
+ fullUrl.addQueryItem( "optimize", QString::number(Ytv::OptimizeLeastWalking) );
+ fullUrl.addQueryItem( "user", Ytv::Username );
+ fullUrl.addQueryItem( "pass", Ytv::Password );
+
+ manager->get( QNetworkRequest( fullUrl ) );
+ qDebug() << "getting url" << fullUrl.toEncoded();
+ qDebug() << "waiting for reply from Ytv";
+ emit( busy( true ) );
+}
+
+void Route::replyFinished( QNetworkReply * reply )
+{
+ qDebug() << "have reply from Ytv";
+ QList<RouteData> routeData = q->parseReply( reply->readAll() );
+
+ emit( routeReady( routeData ) );
+ emit( busy( false ) );
+}
+
+void Route::setFromLocation( Location *location )
+{
+ qDebug() << "setting new From location (" << location->label() << ")";
+
+ if ( location && location->isValid() ) {
+ qDebug() << "From is valid";
+ q->setFromLocation( location );
+ if ( q->toValid() ) {
+ qDebug() << "To is also valid";
+ getRoute();
+ } else {
+ qDebug() << "To not valid - waiting";
+ }
+ } else {
+ qDebug() << "ERROR:From is not valid";
+ qDebug() << "location=" << location;
+ if ( location ) {
+ qDebug() << "location->isValid()=" << location->isValid();
+ }
+ }
+}
+
+Location *Route::fromLocation() const
+{
+ return q->fromLocation();
+}
+
+void Route::setToLocation( Location *location )
+{
+ qDebug() << "setting new To location (" << location->label() << ")";
+
+ if ( location && location->isValid() ) {
+ qDebug() << "To is valid";
+ q->setToLocation( location );
+ if ( q->fromValid() ) {
+ qDebug() << "From is also valid";
+ getRoute();
+ } else {
+ qDebug() << "From not valid - waiting";
+ }
+ } else {
+ qDebug() << "ERROR:From is not valid";
+ qDebug() << "location=" << location;
+ if ( location ) {
+ qDebug() << "location->isValid()=" << location->isValid();
+ }
+ }
+}
+
+Location *Route::toLocation() const
+{
+ return q->toLocation();
+}
--- /dev/null
+#ifndef ROUTE_H
+#define ROUTE_H
+
+#include "routedata.h"
+#include "location.h"
+
+#include <QObject>
+#include <QNetworkReply>
+#include <QNetworkAccessManager>
+
+class RoutePrivate;
+
+class Route: public QObject
+{
+ Q_OBJECT
+
+public:
+ Route();
+ ~Route();
+
+ /*!
+ * \brief Gets the route data from the server
+ */
+ void getRoute();
+
+ /*!
+ \brief Get the from location
+ \return The from location
+ */
+ Location *fromLocation() const;
+
+ /*!
+ \brief Get the to location
+ \return The to location
+ */
+ Location *toLocation() const;
+
+public Q_SLOTS:
+
+ /*!
+ * \brief Sets the from location
+ * \param fromLocation The from location
+ */
+ void setFromLocation( Location *location=0 );
+
+ /*!
+ * \brief Sets the to location
+ * \param toLocation The to location
+ */
+ void setToLocation( Location *location=0 );
+
+Q_SIGNALS:
+ void routeReady( QList<RouteData> );
+ void busy( bool busy );
+
+private Q_SLOTS:
+ void replyFinished( QNetworkReply* );
+
+private:
+ RoutePrivate *q;
+ QNetworkAccessManager *manager;
+};
+#endif // ROUTE_H
--- /dev/null
+#include "route_p.h"
+#include "location.h"
+
+#include <QXmlStreamReader>
+#include <QDebug>
+#include <QList>
+#include <QFile>
+#include <QStringList>
+#include <QMaemo5InformationBox>
+
+RoutePrivate::RoutePrivate( QObject *parent ) :
+ m_fromValid(false),
+ m_toValid(false),
+ m_fromLocation(0),
+ m_toLocation(0)
+{
+ Q_UNUSED( parent )
+}
+
+RoutePrivate::~RoutePrivate()
+{
+}
+
+QList<RouteData> RoutePrivate::parseReply( const QByteArray &reply )
+{
+ qDebug() << "parsing route";
+
+ QList<RouteData> retVal;
+ RouteData routeData;
+ LegData legData;
+
+ QXmlStreamReader xml( reply );
+
+ QHash<QString, bool> in;
+ QHash<QString, bool> have;
+
+ QStringList haveKeys;
+ QStringList inKeys;
+
+ haveKeys
+ << "LINE"
+ << "TIME"
+ << "TRIP"
+ << "DEPARTURE"
+ << "ARRIVAL"
+ ;
+
+ inKeys
+ << "ROUTE"
+ << "LINE"
+ << "STOP"
+ << "WALK"
+ << "POINT"
+ ;
+
+ foreach( QString key, haveKeys ) {
+ have[ key ] = false;
+ }
+
+ foreach( QString key, inKeys ) {
+ in[ key ] = false;
+ }
+
+ while ( !xml.atEnd() ) {
+ xml.readNext();
+
+ QString xmlName = xml.name().toString();
+
+ if ( xml.isStartElement() ) {
+ if ( inKeys.contains( xmlName ) ) {
+ in[ xmlName ] = true;
+ //qDebug() << "in[" << xmlName << "] = true";
+ }
+
+ if ( xmlName == "ROUTE" ) {
+ foreach( QString key, haveKeys ) {
+ have[ key ] = false;
+ }
+ }
+
+ if ( xmlName == "WALK" ) {
+ legData.m_how = "WALK";
+ have[ "DEPARTURE" ] = false;
+ have[ "ARRIVAL" ] = false;
+ have[ "LENGTH" ] = false;
+ }
+
+ if ( xmlName == "LINE" ) {
+ legData.m_how = "LINE";
+ QString lineCode( xml.attributes().value("code").toString() );
+ legData.m_lineCode = parseJORECode( lineCode );
+ have[ "DEPARTURE" ] = false;
+ have[ "ARRIVAL" ] = false;
+ have[ "LENGTH" ] = false;
+ }
+ }
+
+ if ( xml.isEndElement() ) {
+ if ( inKeys.contains( xmlName ) ) {
+ in[ xmlName ] = false;
+ //qDebug() << "in[" << xmlName << "] = false";
+ }
+
+ if ( xmlName == "ROUTE" ) {
+ retVal.append( routeData );
+ routeData.clear();
+ }
+
+ if ( xmlName == "WALK" || xmlName == "LINE" ) {
+ routeData.m_legData.append( legData );
+ legData.clear();
+ have[ "LENGTH" ] = false;
+ }
+ }
+
+ if ( !have[ "ARRIVAL" ] && ( in[ "WALK" ] || in[ "LINE" ] ) && ( in[ "STOP" ] || in[ "POINT" ] ) && xml.isStartElement() && xmlName == "ARRIVAL" ) {
+ QString arrivalTime( xml.attributes().value("time").toString() );
+ legData.m_arrivalTime = arrivalTime.rightJustified(4).insert(2,":");
+
+ // don't set have[ "ARRIVAL" ] since we want the last one of many STOPs
+ }
+
+ if ( !have[ "DEPARTURE" ] && in[ "LINE" ] && in[ "STOP" ] && xml.isStartElement() && xmlName == "DEPARTURE" ) {
+ QString departureTime( xml.attributes().value("time").toString() );
+ legData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
+
+ have[ "DEPARTURE" ] = true;
+ }
+
+ if ( !have[ "DEPARTURE" ] && in[ "WALK" ] && ( in[ "POINT" ] || in[ "STOP" ] ) && xml.isStartElement() && xmlName == "DEPARTURE" ) {
+ QString departureTime( xml.attributes().value("time").toString() );
+ legData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
+
+ have[ "DEPARTURE" ] = true;
+ }
+
+ if ( !have[ "LENGTH" ] && ( in[ "WALK" ] || in[ "LINE" ] ) && xml.isStartElement() && xmlName == "LENGTH" ) {
+ legData.m_tripTime = xml.attributes().value("time").toString();
+ legData.m_tripDistance = xml.attributes().value("dist").toString();
+
+ have[ "LENGTH" ] = true;
+ }
+
+ if ( !have[ "TRIP" ] && in[ "ROUTE" ] && xml.isStartElement() && xmlName == "LENGTH" ) {
+ routeData.m_tripTime = xml.attributes().value("time").toString();
+ routeData.m_tripDistance = xml.attributes().value("dist").toString();
+
+ have[ "TRIP" ] = true;
+ }
+
+ if ( !have[ "LINE" ] && in[ "ROUTE" ] && xml.isStartElement() && xmlName == "LINE" ) {
+ QString lineCode( xml.attributes().value("code").toString() );
+
+ routeData.m_lineCode = parseJORECode( lineCode );
+ have[ "LINE" ] = true;
+ }
+
+ if ( !have[ "TIME" ] && in[ "ROUTE" ] && in[ "LINE" ] && in[ "STOP" ] && xmlName == "DEPARTURE" ) {
+ QString departureTime( xml.attributes().value("time").toString() );
+
+ routeData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
+ have[ "TIME" ] = true;
+ }
+
+ }
+
+ if ( xml.hasError() ) {
+ qDebug() << "xml error:" << xml.errorString();
+ }
+
+ if ( retVal.isEmpty() ) {
+ qDebug() << "no routes found";
+ QMaemo5InformationBox::information( 0, "no routes found" );
+ }
+
+ return retVal;
+}
+
+void RoutePrivate::setFromLocation( Location *location )
+{
+ m_fromLocation = location;
+ m_fromValid = true;
+}
+
+Location *RoutePrivate::fromLocation() const
+{
+ return m_fromLocation;
+}
+
+void RoutePrivate::setToLocation( Location *toLocation )
+{
+ m_toLocation = toLocation;
+ m_toValid = true;
+}
+
+QString RoutePrivate::parseJORECode( const QString &joreCode ) const
+{
+ QString retVal;
+
+ QString areaTransportTypeCode( joreCode.mid(0,1) );
+ QString lineCode( joreCode.mid(1,3) );
+ QString letterVariant( joreCode.mid(4,1) );
+ QString letterNumberVariant( joreCode.mid(5,1) );
+ QString direction( joreCode.mid(6,1) );
+
+ lineCode.setNum( lineCode.toInt() );
+
+ retVal = lineCode;
+
+ if ( letterVariant != " " ) {
+ retVal += letterVariant;
+ }
+
+ return retVal;
+}
+
+Location *RoutePrivate::toLocation() const
+{
+ return m_toLocation;
+}
+
+bool RoutePrivate::fromValid()
+{
+ return m_fromValid;
+}
+
+bool RoutePrivate::toValid()
+{
+ return m_toValid;
+}
--- /dev/null
+#ifndef ROUTE_P_H
+#define ROUTE_P_H
+
+#include "routedata.h"
+
+#include "location.h"
+
+#include <QObject>
+
+class RoutePrivate: public QObject
+{
+ Q_OBJECT
+
+public:
+ RoutePrivate( QObject *parent=0 );
+ ~RoutePrivate();
+
+ QList<RouteData> parseReply( const QByteArray &reply );
+
+ Q_PROPERTY(Location* fromLocation READ fromLocation WRITE setFromLocation);
+ Q_PROPERTY(Location* toLocation READ toLocation WRITE setToLocation);
+
+ void setFromLocation( Location *fromLocation );
+
+ Location *fromLocation() const;
+
+ void setToLocation( Location *toLocation );
+
+ Location *toLocation() const;
+
+ bool toValid();
+ bool fromValid();
+
+private:
+ bool m_fromValid;
+ bool m_toValid;
+ Location *m_fromLocation;
+ Location *m_toLocation;
+
+ QString parseJORECode( const QString &joreCode ) const;
+};
+#endif // ROUTE_P_H
--- /dev/null
+#ifndef ROUTEDATA_H
+#define ROUTEDATA_H
+
+#include <QString>
+#include <QList>
+
+struct LegData
+{
+ LegData() :
+ m_how(),
+ m_tripTime(),
+ m_tripDistance(),
+ m_departureTime(),
+ m_arrivalTime(),
+ m_lineCode()
+ {
+ };
+
+ LegData( QString how, QString tripTime, QString tripDistance, QString departureTime, QString arrivalTime, QString lineCode=QString() ) :
+ m_how(how),
+ m_tripTime(tripTime),
+ m_tripDistance(tripDistance),
+ m_departureTime(departureTime),
+ m_arrivalTime(arrivalTime),
+ m_lineCode(lineCode)
+ {
+ };
+
+ void clear()
+ {
+ m_how = "";
+ m_tripTime = "";
+ m_tripDistance = "";
+ m_departureTime = "";
+ m_arrivalTime = "";
+ m_lineCode = "";
+ };
+
+ QString m_how;
+ QString m_tripTime;
+ QString m_tripDistance;
+ QString m_departureTime;
+ QString m_arrivalTime;
+ QString m_lineCode;
+
+};
+
+struct RouteData
+{
+ RouteData():
+ m_tripTime(),
+ m_tripDistance(),
+ m_departureTime(),
+ m_lineCode(),
+ m_legData()
+ {
+ };
+
+ RouteData( QString tripTime, QString tripDistance, QString departureTime, QString lineCode ):
+ m_tripTime(tripTime),
+ m_tripDistance(tripDistance),
+ m_departureTime(departureTime),
+ m_lineCode(lineCode),
+ m_legData()
+ {
+ };
+
+ RouteData &operator <<(const LegData &legData)
+ {
+ m_legData.append( legData );
+ return *this;
+ };
+
+ void clear()
+ {
+ m_tripTime = "";
+ m_tripDistance = "";
+ m_departureTime = "";
+ m_lineCode = "";
+ m_legData.clear();
+ };
+
+ QString m_tripTime;
+ QString m_tripDistance;
+ QString m_departureTime;
+ QString m_lineCode;
+ QList<LegData> m_legData;
+
+};
+
+#endif // ROUTEDATA_H
+++ /dev/null
-TEMPLATE = lib
-TARGET = ptascommon
-OBJECTS_DIR = .obj
-MOC_DIR = .moc
-
-INSTALL_HEADERS = \
- coordinatesystemtransformer.h \
- kkjgridcoordinate.h \
-
-PRIVATE_HEADERS = \
- kkjgridcoordinate_p.h
-HEADERS += \
- $$INSTALL_HEADERS \
- $$PRIVATE_HEADERS
-SOURCES += \
- coordinatesystemtransformer.cpp \
- kkjgridcoordinate.cpp
--- /dev/null
+#include "ui.h"
+
+#include "locations.h"
+#include "ytv.h"
+
+#include <QMainWindow>
+#include <QRadioButton>
+#include <QTableWidget>
+#include <QString>
+#include <QRect>
+#include <QButtonGroup>
+#include <QHeaderView>
+#include <QObject>
+#include <QMenuBar>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QGridLayout>
+#include <QSizePolicy>
+#include <QInputDialog>
+#include <QDebug>
+
+Ui::Ui() :
+ m_centralWidget(0),
+ m_destinationButtons(0),
+ m_routeStack(0),
+ m_usingFakeGps( false ),
+ m_fakeLocationLabel( "work" )
+{
+}
+
+Ui::~Ui()
+{
+}
+
+void Ui::setupUi( QMainWindow *mainWindow )
+{
+ m_mainWindow = mainWindow;
+ m_mainWindow->resize(800,480);
+
+ m_menu = mainWindow->menuBar()->addMenu("Settings");
+
+ QAction *setHomeAddressAction = new QAction("Set home address", this);
+ QAction *setWorkAddressAction = new QAction("Set work address", this);
+ m_toggleFakeGpsAction = new QAction("Use fake GPS", this);
+ m_menu->addAction(setHomeAddressAction);
+ m_menu->addAction(setWorkAddressAction);
+ m_menu->addAction(m_toggleFakeGpsAction);
+
+ connect(
+ setHomeAddressAction, SIGNAL(triggered()),
+ this, SLOT(setHomeAddress())
+ );
+ connect(
+ setWorkAddressAction, SIGNAL(triggered()),
+ this, SLOT(setWorkAddress())
+ );
+ connect(
+ m_toggleFakeGpsAction, SIGNAL(triggered()),
+ this, SLOT(toggleFakeGps())
+ );
+
+ m_centralWidget = new QWidget( m_mainWindow );
+ m_mainWindow->setCentralWidget( m_centralWidget);
+
+ QRadioButton *homeButton = new QRadioButton();
+ homeButton->setObjectName( QString::fromUtf8("homeButton") );
+ homeButton->setText( "GPS->HOME" );
+ homeButton->setEnabled(false);
+
+ QRadioButton *workButton = new QRadioButton();
+ workButton->setObjectName( QString::fromUtf8("workButton") );
+ workButton->setText( "GPS->WORK" );
+ workButton->setEnabled(false);
+
+ m_destinationButtons = new QButtonGroup();
+ m_destinationButtons->addButton( homeButton, HomeButtonId );
+ m_destinationButtons->addButton( workButton, WorkButtonId );
+ m_destinationButtons->setExclusive( true );
+
+ m_routeButtons = new QButtonGroup();
+ m_routeButtons->setExclusive( true );
+ m_routeStack = new QVBoxLayout();
+ for ( int i=0; i<Ytv::ShowFiveResults; ++i ) {
+ QRadioButton *button = new QRadioButton();
+ button->setObjectName( "routeButton"+i );
+ button->setEnabled( false );
+
+ m_routeStack->addWidget( button, i );
+ m_routeButtons->addButton( button, i );
+ }
+ m_routeStack->addStretch();
+
+ QStringList headers( QStringList() << "How" << "Time" << "Dist" << "Dep" << "Arr" );
+ m_routeDetailTable = new QTableWidget();
+ m_routeDetailTable->setColumnCount( headers.count() );
+ m_routeDetailTable->setHorizontalHeaderLabels( headers );
+ m_routeDetailTable->resizeColumnsToContents();
+ m_routeDetailTable->setSelectionMode( QAbstractItemView::NoSelection );
+
+ QHBoxLayout *topLayout = new QHBoxLayout();
+ topLayout->addLayout( m_routeStack );
+ topLayout->addWidget( m_routeDetailTable );
+
+ m_buttonLayout = new QGridLayout();
+ m_buttonLayout->addWidget( homeButton, 0, 0 );
+ m_buttonLayout->addWidget( workButton, 0, 1 );
+
+ m_mainLayout = new QVBoxLayout();
+ m_mainLayout->addLayout( topLayout );
+ m_mainLayout->addLayout( m_buttonLayout );
+
+ m_centralWidget->setLayout( m_mainLayout );
+}
+
+void Ui::setHomeAddress()
+{
+ setAddress( "home" );
+}
+
+void Ui::setWorkAddress()
+{
+ setAddress( "work" );
+}
+
+void Ui::toggleFakeGps()
+{
+ m_usingFakeGps = !m_usingFakeGps;
+
+ if ( m_usingFakeGps ) {
+ useFakeGps();
+ } else {
+ useLiveGps();
+ }
+}
+
+void Ui::useFakeGps()
+{
+ emit fakeGpsPressed( m_fakeLocationLabel );
+ m_toggleFakeGpsAction->setText( "Use Live GPS" );
+}
+
+void Ui::useLiveGps()
+{
+ emit liveGpsPressed();
+ m_toggleFakeGpsAction->setText( "Use Fake GPS" );
+}
+
+void Ui::setAddress( const QString &label )
+{
+ Locations locations;
+ Location *location=locations.location( label );
+
+ bool ok;
+ QString address = QInputDialog::getText(
+ m_centralWidget,
+ tr("Enter address for \""+QString(label).toLatin1()+"\""),
+ tr("Address"),
+ QLineEdit::Normal,
+ location->address(),
+ &ok
+ );
+
+ if ( ok ) {
+ qDebug() << "new address" << address;
+ Locations locations;
+ Location *location = locations.location( label );
+ qDebug() << "location" << location;
+ if ( location ) {
+ location->resolveAddress( address );
+ }
+ }
+}
+
+void Ui::setBusy( bool busy )
+{
+ m_mainWindow->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
+}
--- /dev/null
+#ifndef UI_H
+#define UI_H
+
+#include <QObject>
+
+class QMainWindow;
+class QWidget;
+class QTableWidget;
+class QButtonGroup;
+class QHBoxLayout;
+class QVBoxLayout;
+class QGridLayout;
+class QMenu;
+class QAction;
+class Location;
+
+class Ui : public QObject
+{
+ Q_OBJECT
+
+public:
+ Ui();
+ ~Ui();
+ void setupUi( QMainWindow *mainWindow );
+
+ enum {
+ HomeButtonId=0,
+ WorkButtonId=1
+ };
+
+ enum {
+ ScreenWidth=800,
+ ScreenHeight=480
+ };
+
+ QMainWindow *m_mainWindow;
+ QWidget *m_centralWidget;
+ QButtonGroup *m_destinationButtons;
+ QButtonGroup *m_routeButtons;
+ QVBoxLayout *m_routeStack;
+ QTableWidget *m_routeDetailTable;
+ QVBoxLayout *m_mainLayout;
+ QGridLayout *m_buttonLayout;
+ QMenu *m_menu;
+ QAction *m_toggleFakeGpsAction;
+ QAction *m_useLiveGpsAction;
+ bool m_usingFakeGps;
+ QString m_fakeLocationLabel;
+
+Q_SIGNALS:
+ void homeAddressChanged( QString address );
+ void workAddressChanged( QString address );
+ void fakeGpsPressed( const QString &fakeLocationLabel );
+ void liveGpsPressed();
+
+private Q_SLOTS:
+ void setHomeAddress();
+ void setWorkAddress();
+ void toggleFakeGps();
+ void setBusy( bool busy );
+
+private:
+ void useFakeGps();
+ void useLiveGps();
+ void setAddress( const QString &label );
+};
+#endif //UI_H
--- /dev/null
+#include "uicontroller.h"
+#include "route.h"
+#include "ui.h"
+#include "ytv.h"
+#include "location.h"
+#include "locations.h"
+
+#include <QObject>
+#include <QPushButton>
+#include <QDebug>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QVBoxLayout>
+#include <QTableWidgetItem>
+
+UiController::UiController( Ui *ui ) :
+ m_routeData(),
+ m_destination(),
+ m_ui(ui),
+ m_currentDestination(-1),
+ m_currentRoute(-1)
+{
+ Locations locations;
+ Location *homeLocation = locations.location( "home" );
+ Location *workLocation = locations.location( "work" );
+
+ if ( homeLocation==0 ) {
+ homeLocation = new Location( "home" );
+ locations.addLocation( homeLocation );
+ } else if ( homeLocation->isValid() ) {
+ setHomeButtonValid();
+ }
+
+ if ( workLocation==0 ) {
+ workLocation = new Location( "work" );
+ locations.addLocation( workLocation );
+ } else if ( workLocation->isValid() ) {
+ setWorkButtonValid();
+ }
+
+ connect(
+ homeLocation, SIGNAL( becomeValid() ),
+ this, SLOT( setHomeButtonValid() )
+ );
+ connect(
+ homeLocation, SIGNAL( becomeInValid() ),
+ this, SLOT( setHomeButtonInValid() )
+ );
+ connect(
+ homeLocation, SIGNAL( becomeValid() ),
+ &locations, SLOT( saveLocation() )
+ );
+ connect(
+ homeLocation, SIGNAL( busy( bool ) ),
+ ui, SLOT( setBusy( bool ) )
+ );
+
+ connect(
+ workLocation, SIGNAL( becomeValid() ),
+ this, SLOT( setWorkButtonValid() )
+ );
+ connect(
+ workLocation, SIGNAL( becomeInValid() ),
+ this, SLOT( setWorkButtonInValid() )
+ );
+ connect(
+ workLocation, SIGNAL( becomeValid() ),
+ &locations, SLOT( saveLocation() )
+ );
+ connect(
+ workLocation, SIGNAL( busy( bool ) ),
+ ui, SLOT( setBusy( bool ) )
+ );
+
+ m_destination.append( homeLocation );
+ m_destination.append( workLocation );
+
+ connect(
+ m_ui->m_destinationButtons, SIGNAL( buttonClicked( int ) ),
+ this, SLOT( changeDestination( int ) )
+ );
+
+ connect(
+ m_ui->m_routeButtons, SIGNAL( buttonClicked( int ) ),
+ this, SLOT( changeRoute( int ) )
+ );
+}
+
+UiController::~UiController()
+{
+}
+
+void UiController::setHomeButtonInValid()
+{
+ qDebug() << "setting home button invalid";
+ setButtonValid( Ui::HomeButtonId, false );
+}
+
+void UiController::setHomeButtonValid()
+{
+ qDebug() << "setting home button valid";
+ setButtonValid( Ui::HomeButtonId, true );
+}
+
+void UiController::setWorkButtonInValid()
+{
+ qDebug() << "setting work button invalid";
+ setButtonValid( Ui::WorkButtonId, false );
+}
+
+void UiController::setWorkButtonValid()
+{
+ qDebug() << "setting work button valid";
+ setButtonValid( Ui::WorkButtonId, true );
+}
+
+void UiController::setButtonValid( int id, bool isValid )
+{
+ m_ui->m_destinationButtons->button( id )->setEnabled( isValid );
+}
+
+void UiController::changeDestination( int id )
+{
+ bool destinationHasChanged = ( m_currentDestination != id );
+ qDebug() << "Destination has changed=" << destinationHasChanged;
+ if ( destinationHasChanged ) {
+ qDebug() << "Emitting destination changed (" << m_destination[id]->label() << ")";
+ emit destinationChanged( m_destination[id] );
+ m_currentDestination = id;
+ }
+
+ // always want to emit this so that the gps position is updated
+ // and the user gets new information
+ emit buttonClicked();
+}
+
+void UiController::changeRoute( int id )
+{
+ bool routeHasChanged = ( m_currentRoute != id );
+ if ( routeHasChanged ) {
+ displayRouteDetail( id );
+ }
+}
+
+void UiController::displayRouteDetail( int id )
+{
+ QTableWidget *table = m_ui->m_routeDetailTable;
+
+ if ( id < m_routeData.count() ) {
+ QList<LegData> &legDataList = m_routeData[ id ].m_legData;
+ table->setRowCount( legDataList.count() );
+
+ int row=0;
+ foreach( LegData thisLegData, legDataList ) {
+ QString thisHow = thisLegData.m_how;
+
+ bool thisIsLine = ( thisHow == "LINE" );
+ if ( thisIsLine ) {
+ thisHow = thisLegData.m_lineCode;
+ }
+
+ QStringList tableStrings;
+ tableStrings
+ << thisHow
+ << thisLegData.m_tripTime
+ << thisLegData.m_tripDistance
+ << thisLegData.m_departureTime
+ << thisLegData.m_arrivalTime;
+
+ int col=0;
+ foreach( QString thisString, tableStrings ) {
+ QTableWidgetItem *newItem = new QTableWidgetItem();
+ newItem->setText( thisString );
+ table->setItem( row,col, newItem );
+ ++col;
+ }
+
+ ++row;
+ }
+ } else {
+ table->setRowCount( 0 );
+ }
+
+ table->resizeColumnsToContents();
+}
+
+void UiController::displayRoute( const QList<RouteData> &routeData )
+{
+ m_routeData = routeData;
+
+ qDebug() << "displaying route";
+
+ for ( int i=0; i<Ytv::ShowFiveResults; ++i ) {
+ QString label;
+
+ QWidget *widget = m_ui->m_routeStack->itemAt( i )->widget();
+ QRadioButton *button = qobject_cast<QRadioButton *>(widget);
+
+ if ( i<routeData.count() ) {
+ RouteData thisRouteData = routeData.at(i);
+ label = ( QStringList()
+ << thisRouteData.m_departureTime
+ << thisRouteData.m_lineCode ).join( "/" );
+ button->setEnabled( true );
+ } else {
+ button->setEnabled( false );
+ }
+
+ if ( i==0 ) {
+ button->setChecked( true );
+ } else {
+ button->setChecked( false );
+ }
+
+ button->setText( label );
+ }
+
+ displayRouteDetail( 0 );
+}
--- /dev/null
+#ifndef UICONTROLLER_H
+#define UICONTROLLER_H
+
+#include "routedata.h"
+#include "location.h"
+
+#include <QObject>
+
+class Ui;
+
+class UiController : public QObject
+{
+ Q_OBJECT
+
+public:
+ UiController( Ui *ui );
+ ~UiController();
+
+public Q_SLOTS:
+ void displayRoute( const QList<RouteData> &routeData );
+
+Q_SIGNALS:
+ void buttonClicked();
+ void destinationChanged( Location *newDestination );
+
+private Q_SLOTS:
+ void changeDestination( int id );
+ void changeRoute( int id );
+ void setHomeButtonValid();
+ void setWorkButtonValid();
+ void setHomeButtonInValid();
+ void setWorkButtonInValid();
+ void displayRouteDetail( int id );
+
+private:
+ void setButtonValid( int id, bool isValid );
+
+private:
+ QList<RouteData> m_routeData;
+ QList<Location*> m_destination;
+ Ui *m_ui;
+ int m_currentDestination;
+ int m_currentRoute;
+};
+#endif // UICONTROLLER_H
+
--- /dev/null
+#include <QUrl>
+#include <QString>
+
+namespace Ytv {
+ const QString Url( "http://api.reittiopas.fi/public-ytv/fi/api/" );
+ const QString Username( "zouba" );
+ const QString Password( "caf9r3ee" );
+
+ //const QString Home( QByteArray::fromPercentEncoding( "Taivaanvuohentie%207%2CHelsinki" ) );
+ //const QString Work( QByteArray::fromPercentEncoding( "It%E4merenkatu%2011%2CHelsinki" ) );
+
+ enum {
+ WalkSpeedSlow=1,
+ WalkSpeedFast=2,
+ WalkSpeedNormal=3,
+ WalkSpeedRunning=4,
+ WalkSpeedCycling=5,
+ NoWalkSpeeds=5
+ };
+
+ enum {
+ ShowOneResult=1,
+ ShowThreeResults=3,
+ ShowFiveResults=5
+ };
+
+ enum {
+ OptimizeDefault=1,
+ OptimizeFastest=2,
+ OptimizeLeastTransfers=3,
+ OptimizeLeastWalking=4
+ };
+
+};
+
+++ /dev/null
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-# Adapted from http://positio.rista.net/en/pys60gps/src/KKJWGS84.py
-
-import math
-
-
-# Constants
-# Longitude0 and Center meridian of KKJ bands
-KKJ_ZONE_INFO = { 0: (18.0, 500000.0), \
- 1: (21.0, 1500000.0), \
- 2: (24.0, 2500000.0), \
- 3: (27.0, 3500000.0), \
- 4: (30.0, 4500000.0), \
- 5: (33.0, 5500000.0), \
- }
-
-###########################################################################
-# Function: KKJ_Zone_I
-###########################################################################
-def KKJ_Zone_I(KKJI):
- ZoneNumber = math.floor((KKJI/1000000.0))
- if ZoneNumber < 0 or ZoneNumber > 5:
- ZoneNumber = -1
- return ZoneNumber
-
-###########################################################################
-# Function: KKJ_Zone_Lo
-###########################################################################
-def KKJ_Zone_Lo(KKJlo):
- # determine the zonenumber from KKJ easting
- # takes KKJ zone which has center meridian
- # longitude nearest (in math value) to
- # the given KKJ longitude
- ZoneNumber = 5
- while ZoneNumber >= 0:
- if math.fabs(KKJlo - KKJ_ZONE_INFO[ZoneNumber][0]) <= 1.5:
- break
- ZoneNumber = ZoneNumber - 1
- return ZoneNumber
-
-###########################################################################
-# Function: KKJlalo_to_KKJxy
-###########################################################################
-def KKJlalo_to_KKJxy(INP, ZoneNumber):
- Lo = math.radians(INP['Lo']) - math.radians(KKJ_ZONE_INFO[ZoneNumber][0])
- a = 6378388.0 # Hayford ellipsoid
- f = 1/297.0
- b = (1.0 - f) * a
- bb = b * b
- c = (a / b) * a
- ee = (a * a - bb) / bb
- n = (a - b)/(a + b)
- nn = n * n
- cosLa = math.cos(math.radians(INP['La']))
- NN = ee * cosLa * cosLa
- LaF = math.atan(math.tan(math.radians(INP['La'])) / math.cos(Lo * math.sqrt(1 + NN)))
- cosLaF = math.cos(LaF)
- t = (math.tan(Lo) * cosLaF) / math.sqrt(1 + ee * cosLaF * cosLaF)
- A = a / ( 1 + n )
- A1 = A * (1 + nn / 4 + nn * nn / 64)
- A2 = A * 1.5 * n * (1 - nn / 8)
- A3 = A * 0.9375 * nn * (1 - nn / 4)
- A4 = A * 35/48.0 * nn * n
- OUT = {}
- OUT['P'] = A1 * LaF - \
- A2 * math.sin(2 * LaF) + \
- A3 * math.sin(4 * LaF) - \
- A4 * math.sin(6 * LaF)
- OUT['I'] = c * math.log(t + math.sqrt(1+t*t)) + \
- 500000.0 + ZoneNumber * 1000000.0
- return OUT
-
-###########################################################################
-# Function: KKJxy_to_KKJlalo
-###########################################################################
-def KKJxy_to_KKJlalo(KKJ):
- # Scan iteratively the target area, until find matching
- # KKJ coordinate value. Area is defined with Hayford Ellipsoid.
-
- LALO = {}
- ZoneNumber = KKJ_Zone_I(KKJ['I'])
- MinLa = math.radians(59.0)
- MaxLa = math.radians(70.5)
- MinLo = math.radians(18.5)
- MaxLo = math.radians(32.0)
-
- i = 1
- while (i < 35):
- DeltaLa = MaxLa - MinLa
- DeltaLo = MaxLo - MinLo
- LALO['La'] = math.degrees(MinLa + 0.5 * DeltaLa)
- LALO['Lo'] = math.degrees(MinLo + 0.5 * DeltaLo)
- KKJt = KKJlalo_to_KKJxy(LALO, ZoneNumber)
- if (KKJt['P'] < KKJ['P']):
- MinLa = MinLa + 0.45 * DeltaLa
- else:
- MaxLa = MinLa + 0.55 * DeltaLa
- if (KKJt['I'] < KKJ['I']):
- MinLo = MinLo + 0.45 * DeltaLo
- else:
- MaxLo = MinLo + 0.55 * DeltaLo
- i = i + 1
-
- return LALO
-
-###########################################################################
-# Function: KKJlalo_to_WGS84lalo
-###########################################################################
-def KKJlalo_to_WGS84lalo(KKJ):
- La = KKJ['La']
- Lo = KKJ['Lo']
- dLa = math.radians( 0.124867E+01 + \
- -0.269982E+00 * La + \
- 0.191330E+00 * Lo + \
- 0.356119E-02 * La * La + \
- -0.122312E-02 * La * Lo + \
- -0.335514E-03 * Lo * Lo ) / 3600.0
- dLo = math.radians(-0.286111E+02 + \
- 0.114183E+01 * La + \
- -0.581428E+00 * Lo + \
- -0.152421E-01 * La * La + \
- 0.118177E-01 * La * Lo + \
- 0.826646E-03 * Lo * Lo ) / 3600.0
- WGS = {}
- WGS['La'] = math.degrees(math.radians(KKJ['La']) + dLa)
- WGS['Lo'] = math.degrees(math.radians(KKJ['Lo']) + dLo)
- return WGS
-
-###########################################################################
-# Function: WGS84lalo_to_KKJlalo
-###########################################################################
-def WGS84lalo_to_KKJlalo(WGS):
- La = WGS['La']
- Lo = WGS['Lo']
- dLa = math.radians(-0.124766E+01 + 0.269941E+00 * La + -0.191342E+00 * Lo + -0.356086E-02 * La * La + 0.122353E-02 * La * Lo + 0.335456E-03 * Lo * Lo ) / 3600.0
- dLo = math.radians( 0.286008E+02 + \
- -0.114139E+01 * La + \
- 0.581329E+00 * Lo + \
- 0.152376E-01 * La * La + \
- -0.118166E-01 * La * Lo + \
- -0.826201E-03 * Lo * Lo ) / 3600.0
- KKJ = {}
- KKJ['La'] = math.degrees(math.radians(WGS['La']) + dLa)
- KKJ['Lo'] = math.degrees(math.radians(WGS['Lo']) + dLo)
- return KKJ
-
-###########################################################################
-# Function: KKJxy_to_WGS84lalo
-###########################################################################
-# Input: dictionary with ['P'] is KKJ Northing
-# ['I'] in KKJ Eeasting
-# Output: dictionary with ['La'] is latitude in degrees (WGS84)
-# ['Lo'] is longitude in degrees (WGS84)
-###########################################################################
-def KKJxy_to_WGS84lalo(KKJin):
- KKJz = KKJxy_to_KKJlalo(KKJin)
- WGS = KKJlalo_to_WGS84lalo(KKJz)
- return WGS
-
-###########################################################################
-# Function: WGS84lalo_to_KKJxy
-###########################################################################
-# Input: dictionary with ['La'] is latitude in degrees (WGS84)
-# ['Lo'] is longitude in degrees (WGS84)
-# Output: dictionary with ['P'] is KKJ Northing
-# ['I'] in KKJ Eeasting
-###########################################################################
-def WGS84lalo_to_KKJxy(WGSin):
- KKJlalo = WGS84lalo_to_KKJlalo(WGSin)
- ZoneNumber = KKJ_Zone_Lo(KKJlalo['Lo'])
- KKJxy = KKJlalo_to_KKJxy(KKJlalo, ZoneNumber)
- return KKJxy
-
-###########
-# Test code
-###########
-
-class testCoordinate:
- def __init__(self, x, y, lon, lat):
- self.x = x
- self.y = y
- self.lon = lon
- self.lat = lat
-
-testData = []
-# Test data extracted from example on page
-# http://developer.reittiopas.fi/pages/fi/http-get-interface.php
-testData.append(testCoordinate(2556686, 6682815, 25.02051, 60.2528))
-testData.append(testCoordinate(2546340, 6675352, 24.832, 60.18713))
-testData.append(testCoordinate(2557985, 6685213, 25.04465, 60.27414))
-testData.append(testCoordinate(2556532, 6682578, 25.01767, 60.2507))
-testData.append(testCoordinate(2524959, 6686629, 24.44804, 60.2902))
-testData.append(testCoordinate(2559094, 6693721, 25.06718, 60.35033))
-testData.append(testCoordinate(2556861, 6683030, 25.02373, 60.25471))
-testData.append(testCoordinate(2556888, 6682971, 25.0242, 60.25417))
-testData.append(testCoordinate(2560257, 6698983, 25.08981, 60.39737))
-testData.append(testCoordinate(2562518, 6686969, 25.12709, 60.28923))
-testData.append(testCoordinate(2536615, 6673635, 24.65643, 60.1727))
-testData.append(testCoordinate(2559118, 6693833, 25.06764, 60.35133))
-testData.append(testCoordinate(2559182, 6693629, 25.06874, 60.34949))
-testData.append(testCoordinate(2556947, 6682640, 25.02518, 60.25119))
-testData.append(testCoordinate(2556822, 6682723, 25.02294, 60.25196))
-testData.append(testCoordinate(2559089, 6693605, 25.06705, 60.34929))
-testData.append(testCoordinate(2546445, 6675512, 24.83393, 60.18855))
-testData.append(testCoordinate(2556964, 6682609, 25.02547, 60.25091))
-testData.append(testCoordinate(2556740, 6682861, 25.0215, 60.25321))
-testData.append(testCoordinate(2559002, 6694007, 25.06559, 60.35291))
-
-
-def testKKJxytoWGS84lalo(x, y):
- test = { 'P': y, 'I': x }
- result = KKJxy_to_WGS84lalo(test)
- return [result['Lo'], result['La']]
-
-testsPass = True
-
-# Test transforming from KKJxy to WGS84latlon
-for t in testData:
- [lon, lat] = testKKJxytoWGS84lalo(t.x, t.y)
- if math.fabs(t.lon - lon) < 0.001 and math.fabs(t.lat - lat) < 0.001:
- pass
- else:
- print "Got: (",lon,lat,"), expected: (",t.lon,t.lat,")"
- testsPass = False
-
-if testsPass:
- print "All tests in testKKJxytoWGS84lalo passed"
-
-
-def testWGS84lalotoKKJxy(lon, lat):
- test = { 'La': lat, 'Lo': lon }
- result = WGS84lalo_to_KKJxy(test)
- return [result['I'], result['P']]
-
-testsPass = True
-
-# Test transforming from WGS84latlon to KKJxy
-for t in testData:
- [x, y] = testWGS84lalotoKKJxy(t.lon, t.lat)
- if abs(t.x - x) < 2 and abs(t.y - y) < 2:
- pass
- else:
- print "Got: (",x,y,"), expected: (",t.x,t.y,")"
- testsPass = False
-
-if testsPass:
- print "All tests in testWGS84lalotoKKJxy passed"
+++ /dev/null
-GMOCKBUILDDIR = ../gmock/build
-QMAKE_CXXFLAGS += $$system($$GMOCKBUILDDIR/scripts/gmock-config --cppflags --cxxflags)
-QMAKE_LIBS += ../$$GMOCKBUILDDIR/lib/.libs/libgmock.a ../$$GMOCKBUILDDIR/gtest/lib/.libs/libgtest.a
--- /dev/null
+#! /usr/bin/perl
+require 5.008_004; # we need at least Perl version v5.8.4
+$ENV{MALLOC_CHECK_} = 2;
+
+use Term::ANSIColor;
+
+my $startTime = time();
+
+my %opts = (
+ "a" => 0, # all directories, irrespective of if they're in tests.pro
+ "r" => 0, # don't reverse sort
+ "s" => "D", # by default, sort by directory name
+ "j" => 1, # one make job at a time by default
+);
+
+for ( my $argNo=0; $argNo<@ARGV; $argNo++ ) {
+ my $arg = $ARGV[ $argNo ];
+ if ( $arg eq "-h" ) {
+ print "usage: $0 [-a] [-s letter] [-r] [-j number] [-h]\n";
+ print " -a include all ut_*/ directories - default is just the ones in tests.pro\n";
+ print " -s [DTPFS] sort by column (Dirs, Tests, P(ass), F(ail), S(kipped)\n";
+ print " -r reverse sort\n";
+ print " -j <number> use <number> make jobs. Default is 1\n";
+ print " -h this help\n";
+ exit;
+ } elsif ( $arg eq "-r" ) {
+ $opts{ "r" } = 1;
+ } elsif ( $arg eq "-a" ) {
+ $opts{ "a" } = 1;
+ } elsif ( $arg eq "-s" ) {
+ $opts{ "s" } = $ARGV[ ++$argNo ];
+ if ( $opts{ "s" } !~ /[DTPFS]/ ) {
+ print "Unrecognised column identifier\n";
+ print "Must be one of [DTPFS] :\n";
+ print " D = Dirs\n";
+ print " T = Tests\n";
+ print " P = Pass\n";
+ print " F = Fail\n";
+ print " S = Skipped\n";
+ exit(-1);
+ }
+ } elsif ( $arg eq "-j" ) {
+ my $jobs = $ARGV[ ++$argNo ];
+ # Test that the argument is a positive integer number
+ if ( $jobs * 1 eq $jobs && $jobs > 0 ) {
+ $opts{ "j" } = $jobs;
+ }
+ }
+}
+
+# some globals to help sort be faster
+$sortCol = $opts{ "s" };
+$sortIsNumeric = ( $sortCol =~ /[PFS]/ );
+$reverseSort = $opts{ "r" };
+# helper variable for the number of jobs
+$numJobs = $opts{ "j" };
+
+%maxLen = ();
+%segFault = ();
+
+my @rowHeaders = (
+ "D", # Dirs
+ "T", # Tests
+);
+my @rowData = (
+ "P", # Passed
+ "F", # Failed
+ "S", # Skipped
+);
+
+my @keys = ( @rowHeaders, @rowData );
+
+my %title = (
+ "D"=>"Dirs",
+ "T"=>"Tests",
+ "P"=>"P",
+ "F"=>"F",
+ "S"=>"S",
+);
+
+my $headerLabelFormat = "%-*s";
+my $headerDataFormat = "%*s";
+
+my $labelFormat = "%s%-*s%s%*s";
+my $dataFormat = "%*s%s%*s%s";
+
+my %format = (
+ "D" => $labelFormat,
+ "T" => $labelFormat,
+ "P" => $dataFormat,
+ "F" => $dataFormat,
+ "S" => $dataFormat,
+);
+
+my %separator = (
+ "D" => " ",
+ "T" => " : ",
+ "P" => " ",
+ "F" => " ",
+ "S" => " ",
+);
+
+my %data = (
+);
+
+foreach $key ( @keys ) {
+ $maxLen{ $key } = length( $title{ key } );
+}
+
+# set the maximum length of the directories
+if ( $opts{ "a" } ) {
+ push @allDirs, <ut_*>;
+ push @allDirs, <ft_*>;
+ foreach ( @allDirs ) {
+ setMaxLen( "D", length( $_ ) );
+ $tested{ $_ } = 0;
+ }
+}
+
+# Compile first with possibly multiple jobs
+print "Compiling...";
+`make -j$numJobs -k > /dev/null 2>&1`;
+print "done.\nNow checking...\n";
+
+# then check with only one job so that the parsing succeeds
+open( MAKE, "make -k check 2>&1|" ) || die( "Could not run make:$!" );
+
+#$|=1;
+
+my $thisDir = "";
+while (<MAKE>) {
+ chomp;
+
+ if ( /Entering directory \`.*tests\/(\w+)\'/ ) {
+ $thisDir = $1;
+ print STDERR "Tests: $thisDir", ' 'x( $maxLen{ "D" }-length( $thisDir )+length("Tests: ") ), "\r";
+ $tested{ $thisDir } = 1;
+ push @allDirs, $thisDir if ( !grep( /^$thisDir$/, @allDirs ) );
+ setMaxLen( "D", length( $thisDir ) );
+ } elsif ( /Segmentation fault/ ) {
+ $segFault{ $thisDir } = $_;
+ } elsif ( /Start testing of (\w+)/ ) {
+ $thisTest = $1;
+ $data{ "T" }{ $thisDir } = $thisTest;
+ setMaxLen( "T", length( $data{ "T" }{ $thisDir } ) );
+ } elsif ( /^Totals: (\d+) passed, (\d+) failed, (\d+) skipped/ ) {
+ $data{ "P" }{ $thisDir } = "$1";
+ $data{ "F" }{ $thisDir } = "$2";
+ $data{ "S" }{ $thisDir } = "$3";
+ setMaxLen( "P", length( $data{ "P" }{ $thisDir } ) );
+ setMaxLen( "F", length( $data{ "F" }{ $thisDir } ) );
+ setMaxLen( "S", length( $data{ "S" }{ $thisDir } ) );
+ }
+}
+
+close( MAKE );
+
+print STDERR ' 'x( $maxLen{ "D" } + length( "Tests: " ) ), "\r";
+
+foreach $thisDir ( @allDirs ) {
+ if ( !defined( $data{ "P" }{ $thisDir } ) || $data{ "P" }{ $thisDir } eq "" ) {
+ $data{ "P" }{ $thisDir } = "0";
+ setMaxLen( "P", length( $data{ "P" }{ $thisDir } ) );
+ }
+ if ( !defined( $data{ "F" }{ $thisDir } ) ) {
+ $data{ "F" }{ $thisDir } = "0";
+ setMaxLen( "F", length( $data{ "F" }{ $thisDir } ) );
+ }
+ if ( !defined( $data{ "S" }{ $thisDir } ) ) {
+ $data{ "S" }{ $thisDir } = "0";
+ setMaxLen( "S", length( $data{ "S" }{ $thisDir } ) );
+ }
+
+ $data{ "D" }{ $thisDir } = $thisDir;
+}
+
+my ( $testsPassed, $testsNeedWork ) = ( 0, 0 );
+my $noTests = scalar( @allDirs );
+my $noDigits = ($noTests>0)?int( log( $noTests )/log( 10 ) )+1:1;
+
+my $header = sprintf( "%*s ", $noDigits, "" );
+
+foreach ( @rowHeaders ) {
+ $header .= sprintf( $headerLabelFormat.$separator{ $_ }, $maxLen{ $_ }, $title{ $_ } );
+}
+
+foreach ( @rowData ) {
+ $header .= sprintf( $headerDataFormat.$separator{ $_ }, $maxLen{ $_ }, $title{ $_ } );
+}
+
+my $headerLen = length( $header );
+
+my $headerColor = color( 'reset' );
+
+print "P = Pass, F = Fail, S = Skip\n";
+print $headerColor, "$header\n";
+print '-'x$headerLen, "\n";
+
+my $testNo = 1;
+
+foreach $thisDir ( sort byCol @allDirs ) {
+ my %colors = ();
+
+ foreach $key ( @keys ) {
+ $colors{ $key } = color( 'reset' );
+ }
+
+ if (
+ ( defined( $data{ "P" }{ $thisDir } ) && $data{ "P" }{ $thisDir } ne "0" ) &&
+ ( defined( $data{ "F" }{ $thisDir } ) && $data{ "F" }{ $thisDir } eq "0" ) &&
+ ( defined( $data{ "S" }{ $thisDir } ) && $data{ "S" }{ $thisDir } eq "0" ) &&
+ ( defined( $data{ "T" }{ $thisDir } ) && $data{ "T" }{ $thisDir } ne "" )
+ ) {
+ $testsPassed++;
+ } else {
+ $testsNeedWork++;
+ }
+
+ if ( defined( $data{ "P" }{ $thisDir } ) && $data{ "P" }{ $thisDir } eq "0" ) {
+ $colors{ "D" } .= color( 'reverse green' );
+ $colors{ "T" } .= color( 'reverse green' );
+ $colors{ "P" } .= color( 'reverse green' );
+ } else {
+ $colors{ "D" } .= color( 'green' );
+ $colors{ "T" } .= color( 'green' );
+ $colors{ "P" } .= color( 'green' );
+ }
+
+ if ( defined( $data{ "F" }{ $thisDir} ) && $data{ "F" }{ $thisDir } eq "0" ) {
+ $colors{ "F" } .= color( 'red' );
+ } else {
+ $colors{ "F" } .= color( 'reverse red' );
+ }
+
+ if ( defined( $data{ "S" }{ $thisDir } ) && $data{ "S" }{ $thisDir } eq "0" ) {
+ $colors{ "S" } .= color( 'blue' );
+ } else {
+ $colors{ "S" } .= color( 'reverse blue' );
+ }
+
+ if ( !defined( $data{ "T" }{ $thisDir } ) || $data{ "T" }{ $thisDir } eq "" || $segFault{ $thisDir } ) {
+ $colors{ "T" } .= color( 'reverse red' );
+ }
+
+ printf( "%*s ", $noDigits, $testNo );
+
+ foreach ( @rowHeaders ) {
+ my $thisData = $data{ $_ }{ $thisDir };
+ my $dataLength = length( $thisData );
+ my $spaceLength = $maxLen{ $_ }-$dataLength;
+
+ printf(
+ $format{ $_ }.$separator{ $_ },
+ $colors{ $_ }, $dataLength, $thisData,
+ color( 'reset' ), $spaceLength, "" );
+ }
+
+ foreach ( @rowData ) {
+ my $thisData = $data{ $_ }{ $thisDir };
+ my $dataLength = length( $thisData );
+ my $spaceLength = $maxLen{ $_ }-$dataLength;
+
+ printf(
+ $format{ $_ }.$separator{ $_ },
+ $spaceLength, "",
+ $colors{ $_ }, $dataLength, $thisData,
+ color( 'reset' ) );
+ }
+
+ printf( $headerColor."\n" );
+
+ $testNo++;
+}
+
+print '-'x$headerLen, "\n";
+print( "Tests with zero fails/skips : $testsPassed\n" );
+print( "Tests needing further work : $testsNeedWork\n" );
+
+printf( "Elapsed time : %d seconds\n", time() - $startTime );
+
+sub setMaxLen
+{
+ my ( $test, $length ) = @_;
+
+ $maxLen{ $test } = $length if ( defined( $maxLen{ $test} ) && $length > $maxLen{ $test } );
+}
+
+sub byCol
+{
+ my $retVal = 0;
+
+ my $localA = $a;
+ my $localB = $b;
+
+ if ( $reverseSort ) {
+ my $tmp = $localA;
+ $localA = $localB;
+ $localB = $tmp;
+ }
+
+ if ( $sortIsNumeric ) {
+ # numeric comparison
+ $retVal = $data{ $sortCol }{ $localA } <=> $data{ $sortCol }{ $localB };
+ } else {
+ # string comparison
+ $retVal = $data{ $sortCol }{ $localA } cmp $data{ $sortCol }{ $localB };
+ }
+
+ return $retVal;
+}
--- /dev/null
+ZOUBASRC = ../../src
+
-TEMPLATE = subdirs
+TEMPLATE=subdirs
SUBDIRS = \
- ut_coordinatesystemtransformer \
- ut_kkjgridcoordinate
+ ut_location/ \
+ ut_route/ \
+ ut_gpscontroller/ \
check.target = check
check.CONFIG = recursive
+++ /dev/null
-QT -= gui
-CONFIG += console
-CONFIG -= app_bundle
-TEMPLATE = app
-OBJECTS_DIR = .obj
-MOC_DIR = .moc
-SRCDIR = ../../src
-MOCKSDIR = ../mocks
-INCLUDEPATH += ../util \
- $$SRCDIR \
- $$MOCKSDIR
+++ /dev/null
-ut_coord_trans
+++ /dev/null
-CC=gcc
-RM=rm -f
-INCDIR=../../getmehome/
-CFLAGS=-I$(INCDIR)
-LDFLAGS=-lm
-DEPS=$(INCDIR)coordinate-system.h
-
-UNIT_TEST_SOURCES=ut_coord_trans.c
-SOURCES=$(UNIT_TEST_SOURCES) \
- $(INCDIR)coordinate-system.c
-TARGET=ut_coord_trans
-
-OBJS=$(SOURCES:%.c=%.o)
-
-all: $(TARGET)
-
-%.o: %.c $(DEPS)
- $(CC) -c -o $@ $(CFLAGS) $<
-
-$(TARGET): $(OBJS)
- $(CC) -o $(TARGET) $(LDFLAGS) $(OBJS)
-
-.PHONY: clean
-
-clean:
- $(RM) *.o *~ core $(TARGET)
-
-check: $(TARGET)
- @./$(TARGET)
+++ /dev/null
-#include "coordinate-system.h"
-
-#include <math.h>
-#include <stdio.h>
-
-struct TestCoordinate {
- KKJ x, y;
- double lon, lat;
-};
-
-// Test data extracted from example on page
-// http://developer.reittiopas.fi/pages/fi/http-get-interface.php
-struct TestCoordinate testData[] = {
- { 2556686, 6682815, 25.02051, 60.2528 },
- { 2546340, 6675352, 24.832, 60.18713 },
- { 2557985, 6685213, 25.04465, 60.27414 },
- { 2556532, 6682578, 25.01767, 60.2507 },
- { 2524959, 6686629, 24.44804, 60.2902 },
- { 2559094, 6693721, 25.06718, 60.35033 },
- { 2556861, 6683030, 25.02373, 60.25471 },
- { 2556888, 6682971, 25.0242, 60.25417 },
- { 2560257, 6698983, 25.08981, 60.39737 },
- { 2562518, 6686969, 25.12709, 60.28923 },
- { 2536615, 6673635, 24.65643, 60.1727 },
- { 2559118, 6693833, 25.06764, 60.35133 },
- { 2559182, 6693629, 25.06874, 60.34949 },
- { 2556947, 6682640, 25.02518, 60.25119 },
- { 2556822, 6682723, 25.02294, 60.25196 },
- { 2559089, 6693605, 25.06705, 60.34929 },
- { 2546445, 6675512, 24.83393, 60.18855 },
- { 2556964, 6682609, 25.02547, 60.25091 },
- { 2556740, 6682861, 25.0215, 60.25321 },
- { 2559002, 6694007, 25.06559, 60.35291 }};
-
-
-int testKKJxytoWGS84lola() {
- double lon, lat;
- int result = 0;
- int i;
-
- for (i = 0; i < sizeof(testData) / sizeof(struct TestCoordinate); ++i) {
- KKJxy_to_WGS84lola(testData[i].x, testData[i].y, &lon, &lat);
-
- if (fabs(testData[i].lon - lon) < 0.001 && fabs(testData[i].lat - lat) < 0.001) {
- ;
- } else {
- printf("Got: (%f, %f), expected: (%f, %f)\n", lon, lat, testData[i].lon, testData[i].lat);
- result = -1;
- }
- }
-
- return result;
-}
-
-
-int testWGS84lolatoKKJxy() {
- KKJ x, y;
- int result = 0;
- int i;
-
- for (i = 0; i < sizeof(testData) / sizeof(struct TestCoordinate); ++i) {
- WGS84lola_to_KKJxy(testData[i].lon, testData[i].lat, &x, &y);
-
- if (abs(testData[i].x - x) < 2 && abs(testData[i].y - y) < 2) {
- ;
- } else {
- printf("Got: (%u, %u), expected: (%u, %u)\n", x, y, testData[i].x, testData[i].y);
- result = -1;
- }
- }
-
- return result;
-}
-
-
-
-int main(int argc, char* argv[]) {
- int testResult = 0;
-
- // Test transforming from KKJxy to WGS84lonlat
- testResult = testKKJxytoWGS84lola();
-
- if (testResult == 0) {
- printf("All tests in testKKJxytoWGS84lola passed\n");
- }
-
- // Test transforming from WGS84lonlat to KKJxy
- testResult = testWGS84lolatoKKJxy();
-
- if (testResult == 0) {
- printf("All tests in testWGS84lolatoKKJxy passed\n");
- }
-
-
- return 0;
-}
+++ /dev/null
-Makefile
-ut_coordinatesystemtransformer
+++ /dev/null
-#include "coordinatesystemtransformer.h"
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include "stlhelpers.h"
-
-#include <QPair>
-
-class CoordinateSystemTransformerTest : public ::testing::Test
-{
-public:
- QList<QPair<QTM_NAMESPACE::QGeoCoordinate, KKJGridCoordinate> > testData;
-
- CoordinateSystemTransformerTest() {
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.2528, 25.02051), KKJGridCoordinate(6682815, 2556686));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.18713, 24.832), KKJGridCoordinate(6675352, 2546340));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.27414, 25.04465), KKJGridCoordinate(6685213, 2557985));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.2507, 25.01767), KKJGridCoordinate(6682578, 2556532));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.2902, 24.44804), KKJGridCoordinate(6686629, 2524959));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.35033, 25.06718), KKJGridCoordinate(6693721, 2559094));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.25471, 25.02373), KKJGridCoordinate(6683030, 2556861));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.25417, 25.0242), KKJGridCoordinate(6682971, 2556888));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.39737, 25.08981), KKJGridCoordinate(6698983, 2560257));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.28923, 25.12709), KKJGridCoordinate(6686969, 2562518));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.1727, 24.65643), KKJGridCoordinate(6673635, 2536615));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.35133, 25.06764), KKJGridCoordinate(6693833, 2559118));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.34949, 25.06874), KKJGridCoordinate(6693629, 2559182));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.25119, 25.02518), KKJGridCoordinate(6682640, 2556947));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.25196, 25.02294), KKJGridCoordinate(6682723, 2556822));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.34929, 25.06705), KKJGridCoordinate(6693605, 2559089));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.18855, 24.83393), KKJGridCoordinate(6675512, 2546445));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.25091, 25.02547), KKJGridCoordinate(6682609, 2556964));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.25321, 25.0215), KKJGridCoordinate(6682861, 2556740));
- testData << qMakePair(QTM_NAMESPACE::QGeoCoordinate(60.35291, 25.06559), KKJGridCoordinate(6694007, 2559002));
- }
-};
-
-TEST_F(CoordinateSystemTransformerTest, WGS84CoordinatesToKKJCoordinates)
-{
- QListIterator<QPair<QTM_NAMESPACE::QGeoCoordinate, KKJGridCoordinate> > it(testData);
- while (it.hasNext()) {
- const QPair<QTM_NAMESPACE::QGeoCoordinate, KKJGridCoordinate> &datum = it.next();
- KKJGridCoordinate result = CoordinateSystemTransformer::transformToKKJ(datum.first);
- KKJGridCoordinate expected = datum.second;
- // Allow one unit difference from the expected
- int northDiff = abs((long)expected.northing() - (long)result.northing());
- int eastDiff = abs((long)expected.easting() - (long)result.easting());
- EXPECT_LE(northDiff, 1);
- EXPECT_LE(eastDiff, 1);
- }
-}
-
-TEST_F(CoordinateSystemTransformerTest, KKJCoordinatesToWGS84Coordinates)
-{
- QListIterator<QPair<QTM_NAMESPACE::QGeoCoordinate, KKJGridCoordinate> > it(testData);
- while (it.hasNext()) {
- const QPair<QTM_NAMESPACE::QGeoCoordinate, KKJGridCoordinate> &datum = it.next();
- QTM_NAMESPACE::QGeoCoordinate result = CoordinateSystemTransformer::transformToWGS84(datum.second);
- QTM_NAMESPACE::QGeoCoordinate expected = datum.first;
- // Allow small difference from the expected
- double latitudeDiff = fabs(expected.latitude() - result.latitude());
- double longitudeDiff = fabs(expected.longitude() - result.longitude());
- EXPECT_LE(latitudeDiff, 0.00001);
- EXPECT_LE(longitudeDiff, 0.00001);
- }
-}
-
-int main(int argc, char *argv[])
-{
- ::testing::InitGoogleMock(&argc, argv);
- return RUN_ALL_TESTS();
-}
+++ /dev/null
-include(../ut_common.pri)
-
-TARGET = ut_coordinatesystemtransformer
-CONFIG += \
- mobility
-MOBILITY = location
-SOURCES += \
- ut_coordinatesystemtransformer.cpp \
- $$SRCDIR/coordinatesystemtransformer.cpp \
- $$SRCDIR/kkjgridcoordinate.cpp
-HEADERS += \
- $$SRCDIR/coordinatesystemtransformer.h \
- $$SRCDIR/kkjgridcoordinate.h
-
-include(../gmock.pri)
-include(../check.pri)
+++ /dev/null
-Makefile
-ut_gmocktemplate
+++ /dev/null
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-TEST(TestSuiteName, TestMethodName)
-{
-}
-
-int main(int argc, char *argv[])
-{
- ::testing::InitGoogleMock(&argc, argv);
- return RUN_ALL_TESTS();
-}
+++ /dev/null
-include(../ut_common.pri)
-
-TARGET = ut_gmocktemplate
-SOURCES += ut_gmocktemplate.cpp \
- $$SRCDIR/gmocktemplate.cpp
-HEADERS += \
- $$SRCDIR/gmocktemplate.h
-
-include(../gmock.pri)
-include(../check.pri)
+++ /dev/null
-Makefile
-ut_gmocktest
+++ /dev/null
-#ifndef MOCK_TURTLE_H
-#define MOCK_TURTLE_H
-
-#include "turtle.h"
-#include <gmock/gmock.h>
-
-class MockTurtle : public Turtle {
-public:
- MOCK_METHOD0(PenUp, void());
- MOCK_METHOD0(PenDown, void());
- MOCK_METHOD1(Forward, void(int distance));
- MOCK_METHOD1(Turn, void(int degrees));
- MOCK_METHOD2(GoTo, void(int x, int y));
- MOCK_CONST_METHOD0(GetX, int());
- MOCK_CONST_METHOD0(GetY, int());
-};
-
-#endif // MOCK_TURTLE_H
+++ /dev/null
-#include "painter.h"
-#include "turtle.h"
-
-Painter::Painter(Turtle *turtle) :
- turtle(turtle)
-{
-}
-
-Painter::~Painter() {
-}
-
-bool Painter::DrawCircle(int x, int y, int radius) {
- turtle->PenDown();
- emit DrawCircleCalled(x, y, radius);
- return true;
-}
+++ /dev/null
-#ifndef PAINTER_H
-#define PAINTER_H
-
-#include <QObject>
-
-class Turtle;
-
-class Painter : public QObject
-{
- Q_OBJECT
-
- Turtle *turtle;
-
-public:
- Painter(Turtle *turtle);
- virtual ~Painter();
-
- bool DrawCircle(int x, int y, int radius);
-
-signals:
- void DrawCircleCalled(int x, int y, int radius);
-};
-
-#endif // PAINTER_H
+++ /dev/null
-#ifndef TURTLE_H
-#define TURTLE_H
-
-class Turtle {
-public:
- virtual ~Turtle() {}
- virtual void PenUp() = 0;
- virtual void PenDown() = 0;
- virtual void Forward(int distance) = 0;
- virtual void Turn(int degrees) = 0;
- virtual void GoTo(int x, int y) = 0;
- virtual int GetX() const = 0;
- virtual int GetY() const = 0;
-};
-
-#endif // TURTLE_H
+++ /dev/null
-#include "mock_turtle.h"
-#include "painter.h"
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include <QSignalSpy>
-#include "stlhelpers4qt.h"
-
-using ::testing::AtLeast;
-
-TEST(PainterTest, TestTurtlePenDownCalledAtLeastOnceWhenDrawCircleCalled)
-{
- MockTurtle turtle;
- EXPECT_CALL(turtle, PenDown()).Times(AtLeast(1));
-
- Painter painter(&turtle);
-
- EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
-}
-
-TEST(PainterTest, TestSignalEmittedWhenDrawCircleCalled)
-{
- MockTurtle turtle;
-
- Painter painter(&turtle);
-
- QSignalSpy spy(&painter, SIGNAL(DrawCircleCalled(int,int,int)));
-
- painter.DrawCircle(0, 0, 10);
- ASSERT_EQ(1, spy.count());
- QList<QVariant> expected = QList<QVariant>() << 0 << 0 << 10;
- ASSERT_EQ(expected, spy.at(0));
-}
-
-int main(int argc, char *argv[])
-{
- ::testing::InitGoogleMock(&argc, argv);
- return RUN_ALL_TESTS();
-}
+++ /dev/null
-include(../ut_common.pri)
-
-TARGET = ut_gmocktest
-QT += testlib
-QT -= gui
-CONFIG += console
-CONFIG -= app_bundle
-TEMPLATE = app
-OBJECTS_DIR = .obj
-MOC_DIR = .moc
-SOURCES += ut_gmocktest.cpp \
- painter.cpp
-HEADERS += \
- turtle.h \
- mock_turtle.h \
- painter.h
-
-include(../gmock.pri)
-include(../check.pri)
--- /dev/null
+#include <QObject>
+#include <QtDebug>
+#include "ut_gpscontroller.h"
+
+#include "gpscontroller.h"
+#include "gpscontroller_p.h"
+
+class MyGpsControllerPrivate: public GpsControllerPrivate
+{
+public:
+ MyGpsControllerPrivate();
+ ~MyGpsControllerPrivate();
+
+ void init();
+ void startGps();
+ void stopGps();
+
+ void setGps( QGeoPositionInfoSource *gps );
+ void setFakeLocationLabel( const QString &label );
+ void setUseFakeLocation( bool useFake );
+ void updateLocation();
+
+ QGeoPositionInfoSource *gps();
+ Location *liveLocation();
+ Location *fakeLocation();
+ bool useFakeLocation();
+
+ bool m_gpsOn;
+ Location *m_liveLocation;
+ Location *m_fakeLocation;
+ QString m_fakeLocationLabel;
+ bool m_useFakeLocation;
+};
+
+MyGpsControllerPrivate::MyGpsControllerPrivate() :
+ m_gpsOn(false),
+ m_liveLocation( new Location( "livegps" ) ),
+ m_fakeLocation( new Location( "fakegps" ) ),
+ m_fakeLocationLabel(),
+ m_useFakeLocation(false)
+{
+}
+
+MyGpsControllerPrivate::~MyGpsControllerPrivate()
+{
+ delete m_liveLocation;
+ m_liveLocation = 0;
+ delete m_fakeLocation;
+ m_fakeLocation = 0;
+}
+
+void MyGpsControllerPrivate::init()
+{
+}
+
+void MyGpsControllerPrivate::startGps()
+{
+ m_gpsOn=true;
+}
+
+void MyGpsControllerPrivate::stopGps()
+{
+ m_gpsOn=false;
+}
+
+QGeoPositionInfoSource *MyGpsControllerPrivate::gps()
+{
+ return 0;
+}
+
+void MyGpsControllerPrivate::setGps( QGeoPositionInfoSource *gps )
+{
+ Q_UNUSED( gps );
+}
+
+Location *MyGpsControllerPrivate::liveLocation()
+{
+ return m_liveLocation;
+}
+
+Location *MyGpsControllerPrivate::fakeLocation()
+{
+ return m_fakeLocation;
+}
+
+void MyGpsControllerPrivate::setFakeLocationLabel( const QString &label )
+{
+ m_fakeLocationLabel = label;
+ m_fakeLocation->setLabel( label );
+}
+
+bool MyGpsControllerPrivate::useFakeLocation()
+{
+ return m_useFakeLocation;
+}
+
+void MyGpsControllerPrivate::setUseFakeLocation( bool useFake )
+{
+ m_useFakeLocation = useFake;
+}
+
+void MyGpsControllerPrivate::updateLocation()
+{
+}
+
+void Ut_GpsController::init()
+{
+ qRegisterMetaType<Location *>( "Location*" );
+
+ m_subject_p = new MyGpsControllerPrivate();
+ m_subject = new GpsController( m_subject_p ); // private ownership transferred
+}
+
+void Ut_GpsController::cleanup()
+{
+ delete m_subject;
+ m_subject = 0;
+}
+
+void Ut_GpsController::initTestCase()
+{
+}
+
+void Ut_GpsController::cleanupTestCase()
+{
+}
+
+void Ut_GpsController::testGetGpsWithNoGpsUpdates()
+{
+ QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
+
+ // this should start the gps,
+ // one signal to invalidate the previous display
+ // (which could be showing fake results, for example
+ m_subject->getGps();
+
+ QCOMPARE(m_subject_p->m_gpsOn, true);
+ QCOMPARE(spy.count(), 1);
+}
+
+void Ut_GpsController::testGetGpsWithGpsUpdates()
+{
+ QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
+
+ // make test call
+ m_subject->getGps();
+
+ // check effect
+ QCOMPARE(m_subject_p->m_gpsOn, true);
+ QCOMPARE(spy.count(), 1);
+ QList<QVariant> arguments = spy.takeFirst();
+ QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
+}
+
+void Ut_GpsController::testFakeGps()
+{
+ QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
+
+ Location *gpsLocation = m_subject_p->m_liveLocation; // position from GPS
+
+ // make test call
+ m_subject->useFakeGps( "fakegps" );
+ m_subject->getGps();
+
+ // check effect
+ QList<QVariant> arguments;
+
+ // gps should be off
+ QCOMPARE(m_subject_p->m_gpsOn, false);
+
+ // should get two signals, one from useFakeGps() and one from getGps()
+ QVERIFY2(spy.count()==2, "Should receive two signals" );
+
+ // both args should be the fake gps position supplied to useFakeGps()
+ arguments = spy.takeFirst();
+ QCOMPARE( arguments.at(0).value<Location*>(), m_subject_p->m_fakeLocation );
+ QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "fakegps" ) );
+ arguments = spy.takeFirst();
+ QCOMPARE( arguments.at(0).value<Location*>(), m_subject_p->m_fakeLocation );
+ QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "fakegps" ) );
+
+ // switch back to GPS
+ m_subject->useLiveGps();
+ m_subject->getGps();
+
+ // gps should be on
+ QCOMPARE(m_subject_p->m_gpsOn, true);
+
+ QVERIFY2(spy.count()==2, "should get two locationChanged signals" );
+ arguments = spy.takeFirst();
+ QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
+ QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
+ arguments = spy.takeFirst();
+ QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
+ QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
+
+ // get GPS location
+ m_subject->getGps();
+
+ // check effect
+ QCOMPARE(spy.count(), 1);
+ arguments = spy.takeFirst();
+ QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
+ QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
+}
+
+void Ut_GpsController::testLiveToFakeToLive()
+{
+ m_subject_p->updateLocation(); // pretend GPS has given an update
+
+ m_subject->useFakeGps( "fakegps" );
+ m_subject->getGps();
+
+ // switch back to live GPS
+ m_subject->useLiveGps();
+ m_subject->getGps();
+
+ m_subject->useFakeGps( "fakegps" );
+ m_subject->getGps();
+}
+
+QTEST_APPLESS_MAIN(Ut_GpsController)
--- /dev/null
+#ifndef UT_GPSCONTROLLER_H
+#define UT_GPSCONTROLLER_H
+
+#include <QtTest/QtTest>
+#include <QObject>
+
+class GpsController;
+class MyGpsControllerPrivate;
+class Location;
+
+Q_DECLARE_METATYPE(GpsController*);
+Q_DECLARE_METATYPE(MyGpsControllerPrivate*);
+Q_DECLARE_METATYPE(Location*);
+
+class Ut_GpsController : public QObject
+{
+Q_OBJECT
+
+public:
+
+private slots:
+ void init();
+ void cleanup();
+ void initTestCase();
+ void cleanupTestCase();
+ void testGetGpsWithNoGpsUpdates();
+ void testGetGpsWithGpsUpdates();
+ void testFakeGps();
+ void testLiveToFakeToLive();
+
+private:
+ GpsController *m_subject;
+ MyGpsControllerPrivate *m_subject_p;
+};
+#endif // UT_GPSCONTROLLER_H
--- /dev/null
+include( ../tests.pri )
+CONFIG += \
+ qt \
+ debug \
+ mobility \
+
+MOBILITY = \
+ location \
+ bearer \
+
+QT += \
+ testlib \
+ network \
+ maemo5 \
+
+INCLUDEPATH += \
+ $$ZOUBASRC \
+
+DEPENDPATH += $INCLUDEPATH
+
+TEMPLATE = app
+
+LIBS += \
+ /usr/lib/libQtLocation.so \
+
+SOURCES = \
+ ut_gpscontroller.cpp \
+ $$ZOUBASRC/gpscontroller.cpp \
+ $$ZOUBASRC/gpscontroller_p.cpp \
+ $$ZOUBASRC/locations.cpp \
+ $$ZOUBASRC/location.cpp \
+ $$ZOUBASRC/location_p.cpp \
+
+HEADERS += \
+ ut_gpscontroller.h \
+ $$ZOUBASRC/gpscontroller.h \
+ $$ZOUBASRC/gpscontroller_p.h \
+ $$ZOUBASRC/locations.h \
+ $$ZOUBASRC/location.h \
+ $$ZOUBASRC/location_p.h \
+
+QMAKE_EXTRA_TARGETS += check
+check.depends = $$TARGET
+check.commands = ./$$TARGET
+++ /dev/null
-ut_kkjgridcoordinate
+++ /dev/null
-#include "kkjgridcoordinate.h"
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include "stlhelpers.h"
-
-class KKJGridCoordinateTest : public ::testing::Test
-{
-public:
- const unsigned int northing;
- const unsigned int easting;
-
- KKJGridCoordinateTest() :
- northing(6682815),
- easting(2556686)
- {
- }
-};
-
-TEST_F(KKJGridCoordinateTest, ConstructorValuesReceivedViaGetters)
-{
- KKJGridCoordinate kkj(northing , easting);
- ASSERT_EQ(northing, kkj.northing());
- ASSERT_EQ(easting, kkj.easting());
-}
-
-TEST_F(KKJGridCoordinateTest, EqualsOperatorReturnsTrueForEqualCoordinates)
-{
- KKJGridCoordinate kkj1(northing, easting);
- KKJGridCoordinate kkj2(northing, easting);
- ASSERT_TRUE(kkj1 == kkj2);
-}
-
-TEST_F(KKJGridCoordinateTest, EqualsOperatorReturnsFalseForCoordinatesWithDifferentNorthing)
-{
- KKJGridCoordinate kkj1(northing - 1, easting);
- KKJGridCoordinate kkj2(northing, easting);
- ASSERT_FALSE(kkj1 == kkj2);
-}
-
-TEST_F(KKJGridCoordinateTest, EqualsOperatorReturnsFalseForCoordinatesWithDifferentEasting)
-{
- KKJGridCoordinate kkj1(northing, easting - 1);
- KKJGridCoordinate kkj2(northing, easting);
- ASSERT_FALSE(kkj1 == kkj2);
-}
-
-TEST_F(KKJGridCoordinateTest, AssignmentOperator)
-{
- const KKJGridCoordinate kkj1(northing, easting);
- KKJGridCoordinate kkj2(0, 0);
- kkj2 = kkj1;
- ASSERT_EQ(northing, kkj2.northing());
- ASSERT_EQ(easting, kkj2.easting());
-}
-
-int main(int argc, char *argv[])
-{
- ::testing::InitGoogleMock(&argc, argv);
- return RUN_ALL_TESTS();
-}
+++ /dev/null
-include(../ut_common.pri)
-
-TARGET = ut_kkjgridcoordinate
-CONFIG += \
- mobility
-MOBILITY = location
-SOURCES += ut_kkjgridcoordinate.cpp \
- $$SRCDIR/kkjgridcoordinate.cpp
-HEADERS += \
- $$SRCDIR/kkjgridcoordinate.h
-
-include(../gmock.pri)
-include(../check.pri)
--- /dev/null
+#include <QObject>
+#include <QtDebug>
+#include <QByteArray>
+#include <QGeoPositionInfo>
+#include "location.h"
+#include "location_p.h"
+#include "ut_location.h"
+
+QTM_USE_NAMESPACE
+
+QByteArray sampleInput(
+"\
+<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><MTRXML version=\"1.0\">\
+<GEOCODE key=\"taivaanvuohentie 7,helsinki\">\
+<LOC name1=\"Taivaanvuohentie\" number=\"7\" city=\"Helsinki\" code=\"\" address=\"\" type=\"900\" category=\"street\" x=\"2549182\" y=\"6672569\" lon=\"24.88256\" lat=\"60.16183\" />\
+</GEOCODE>\
+</MTRXML>\
+"
+
+);
+
+void Ut_Location::init()
+{
+}
+
+void Ut_Location::cleanup()
+{
+}
+
+void Ut_Location::initTestCase()
+{
+}
+
+void Ut_Location::cleanupTestCase()
+{
+}
+
+void Ut_Location::testParseReply()
+{
+ QString label("home");
+ LocationPrivate m_subject(label);
+
+ m_subject.parseReply( sampleInput );
+
+ QCOMPARE( m_subject.label(), label );
+ QCOMPARE( m_subject.x(), QString( "2549182" ) );
+ QCOMPARE( m_subject.y(), QString( "6672569" ) );
+}
+
+void Ut_Location::testSet()
+{
+ QString label( "home" );
+ LocationPrivate m_subject(label);
+
+ label = "work";
+ QString address( "Taivaanvuohentie 7 B 27, Helsinki" );
+ QString x( "2549182" );
+ QString y( "6672569" );
+ m_subject.setAddress( address );
+ m_subject.setLabel( label );
+ m_subject.setX( x );
+ m_subject.setY( y );
+ QCOMPARE( m_subject.address(), address );
+ QCOMPARE( m_subject.label(), label );
+ QCOMPARE( m_subject.x(), x );
+ QCOMPARE( m_subject.y(), y );
+}
+
+void Ut_Location::testConstructorQGeoPositionInfo()
+{
+ QGeoPositionInfo thisPositionInfo( QGeoCoordinate( 60.16183, 24.88256 ), QDateTime( QDate( 1965, 11, 11 ) ) );
+ Location subject( thisPositionInfo );
+
+ QString x( "2549182" );
+ QString y( "6672569" );
+ QCOMPARE( subject.x(), x );
+ QCOMPARE( subject.y(), y );
+}
+
+QTEST_APPLESS_MAIN(Ut_Location)
--- /dev/null
+#ifndef UT_LOCATION_H
+#define UT_LOCATION_H
+
+#include <QtTest/QtTest>
+#include <QObject>
+
+#include <location_p.h>
+
+Q_DECLARE_METATYPE(LocationPrivate*);
+
+class Ut_Location : public QObject
+{
+Q_OBJECT
+
+public:
+
+private slots:
+ void init();
+ void cleanup();
+ void initTestCase();
+ void cleanupTestCase();
+ void testParseReply();
+ void testSet();
+ void testConstructorQGeoPositionInfo();
+
+private:
+ LocationPrivate *m_subject;
+};
+#endif // UT_LOCATION_H
--- /dev/null
+include( ../tests.pri )
+CONFIG += \
+ qt \
+ debug \
+ mobility \
+
+MOBILITY = \
+ location \
+ bearer \
+
+QT += \
+ testlib \
+ network \
+ maemo5 \
+
+INCLUDEPATH += \
+ $$ZOUBASRC \
+
+DEPENDPATH += $$INCLUDEPATH
+
+LIBS += \
+ /usr/lib/libQtLocation.so \
+
+TEMPLATE = app
+
+SOURCES = \
+ ut_location.cpp \
+ $$ZOUBASRC/location.cpp \
+ $$ZOUBASRC/location_p.cpp \
+
+HEADERS += \
+ ut_location.h \
+ $$ZOUBASRC/location.h \
+ $$ZOUBASRC/location_p.h \
+
+QMAKE_EXTRA_TARGETS += check
+check.depends = $$TARGET
+check.commands = ./$$TARGET
--- /dev/null
+#include <QObject>
+#include <QtDebug>
+#include <QByteArray>
+#include "ut_route.h"
+
+#include "ut_sampleinput.h"
+
+void Ut_Route::init()
+{
+ m_subject = new RoutePrivate();
+}
+
+void Ut_Route::cleanup()
+{
+ delete m_subject;
+ m_subject = 0;
+}
+
+void Ut_Route::initTestCase()
+{
+}
+
+void Ut_Route::cleanupTestCase()
+{
+}
+
+void Ut_Route::testParseReply()
+{
+ QFETCH(QByteArray, xmlInput);
+ QFETCH(QList<RouteData>, expectedResults);
+
+ QList<RouteData> routeData = m_subject->parseReply( xmlInput );
+
+ QCOMPARE( routeData.count(), expectedResults.count() );
+
+ for( int routeIndex=0; routeIndex<routeData.count(); ++routeIndex ) {
+ const RouteData &thisRouteData = routeData.at( routeIndex );
+ const RouteData &thisExpectedRoute = expectedResults.at( routeIndex );
+
+ QCOMPARE( thisRouteData.m_tripTime, thisExpectedRoute.m_tripTime );
+ QCOMPARE( thisRouteData.m_tripDistance, thisExpectedRoute.m_tripDistance );
+ QCOMPARE( thisRouteData.m_departureTime, thisExpectedRoute.m_departureTime );
+ QCOMPARE( thisRouteData.m_lineCode, thisExpectedRoute.m_lineCode );
+ QCOMPARE( thisRouteData.m_legData.count(), thisExpectedRoute.m_legData.count() );
+
+ for( int legIndex=0; legIndex<thisRouteData.m_legData.count(); ++legIndex ) {
+ const LegData &thisLegData = thisRouteData.m_legData.at( legIndex );
+ const LegData &thisExpectedLeg = thisExpectedRoute.m_legData.at( legIndex );
+
+ QCOMPARE( thisLegData.m_how, thisExpectedLeg.m_how );
+ QCOMPARE( thisLegData.m_tripTime, thisExpectedLeg.m_tripTime );
+ QCOMPARE( thisLegData.m_tripDistance, thisExpectedLeg.m_tripDistance );
+ QCOMPARE( thisLegData.m_departureTime, thisExpectedLeg.m_departureTime );
+ QCOMPARE( thisLegData.m_arrivalTime, thisExpectedLeg.m_arrivalTime );
+ QCOMPARE( thisLegData.m_lineCode, thisExpectedLeg.m_lineCode );
+ }
+ }
+}
+
+void Ut_Route::testParseReply_data()
+{
+ QTest::addColumn<QByteArray>("xmlInput");
+ QTest::addColumn< QList<RouteData> >("expectedResults");
+
+ QTest::newRow("single route")
+ << sampleInput[0]
+ << ( QList<RouteData>()
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "14.411", "2510.063", "18:20", "65A" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "4.475", "357.069", "18:15", "18:20" )
+ << LegData( "LINE", "5.000", "1760.931", "18:20", "18:25", "65A" )
+ << LegData( "WALK", "4.936", "392.062", "18:25", "18:29" )
+ )
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "13.411", "2501.497", "18:26", "102T" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "4.475", "357.069", "18:21", "18:26" )
+ << LegData( "LINE", "4.000", "1751.582", "18:26", "18:30", "102T" )
+ << LegData( "WALK", "4.936", "392.846", "18:30", "18:34" )
+ )
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "13.411", "2501.497", "18:34", "110T" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "4.475", "357.069", "18:29", "18:34" )
+ << LegData( "LINE", "4.000", "1751.582", "18:34", "18:38", "110T" )
+ << LegData( "WALK", "4.936", "392.846", "18:38", "18:42" )
+ )
+ );
+
+ QTest::newRow("route with bus change")
+ << sampleInput[1]
+ << ( QList<RouteData>()
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "28.633", "8902.040", "08:18", "111" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "3.479", "254.753", "08:14", "08:18" )
+ << LegData( "LINE", "8.000", "5225.092", "08:18", "08:26", "111" )
+ << LegData( "LINE", "5.000", "2926.431", "08:32", "08:37", "121T" )
+ << LegData( "WALK", "6.154", "495.764", "08:37", "08:43" )
+ )
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "25.633", "8902.040", "08:33", "111" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "3.479", "254.753", "08:29", "08:33" )
+ << LegData( "LINE", "8.000", "5225.092", "08:33", "08:41", "111" )
+ << LegData( "LINE", "5.000", "2926.431", "08:44", "08:49", "102T" )
+ << LegData( "WALK", "6.154", "495.764", "08:49", "08:55" )
+ )
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "33.510", "11193.458", "08:34", "111T" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "2.356", "172.693", "08:31", "08:34" )
+ << LegData( "LINE", "6.000", "3392.054", "08:34", "08:40", "111T" )
+ << LegData( "LINE", "5.000", "4206.516", "08:43", "08:48", "112" )
+ << LegData( "LINE", "5.000", "2926.431", "08:54", "08:59", "102T" )
+ << LegData( "WALK", "6.154", "495.764", "08:59", "09:05" )
+ )
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "29.633", "8902.040", "08:50", "111" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "3.479", "254.753", "08:46", "08:50" )
+ << LegData( "LINE", "8.000", "5225.092", "08:50", "08:58", "111" )
+ << LegData( "LINE", "5.000", "2926.431", "09:05", "09:10", "102T" )
+ << LegData( "WALK", "6.154", "495.764", "09:10", "09:16" )
+ )
+ // Summary : TTime TDist First Vehicle
+ << ( RouteData( "29.633", "8902.040", "09:07", "111" )
+ // How TTime TDist Depart Arrive Line
+ << LegData( "WALK", "3.479", "254.753", "09:03", "09:07" )
+ << LegData( "LINE", "8.000", "5225.092", "09:07", "09:15", "111" )
+ << LegData( "LINE", "5.000", "2926.431", "09:22", "09:27", "160T" )
+ << LegData( "WALK", "6.154", "495.764", "09:27", "09:33" )
+ )
+ );
+}
+
+void Ut_Route::testSetFromLocation()
+{
+ Location work( "2551042", "6672829" );
+ QCOMPARE( m_subject->fromValid(), false );
+ m_subject->setFromLocation( &work );
+ QCOMPARE( m_subject->fromLocation()->x(), work.x() );
+ QCOMPARE( m_subject->fromLocation()->y(), work.y() );
+ QCOMPARE( m_subject->fromValid(), true );
+}
+
+void Ut_Route::testSetToLocation()
+{
+ Location work( "2551042", "6672829" );
+ QCOMPARE( m_subject->toValid(), false );
+ m_subject->setToLocation( &work );
+ QCOMPARE( m_subject->toLocation()->x(), work.x() );
+ QCOMPARE( m_subject->toLocation()->y(), work.y() );
+ QCOMPARE( m_subject->toValid(), true );
+}
+
+QTEST_APPLESS_MAIN(Ut_Route)
--- /dev/null
+#ifndef UT_ROUTE_H
+#define UT_ROUTE_H
+
+#include <QtTest/QtTest>
+#include <QObject>
+
+#include <route_p.h>
+
+Q_DECLARE_METATYPE(RoutePrivate*);
+Q_DECLARE_METATYPE(QList<RouteData>);
+
+class Ut_Route : public QObject
+{
+ Q_OBJECT
+
+public:
+
+private slots:
+ void init();
+ void cleanup();
+ void initTestCase();
+ void cleanupTestCase();
+ void testParseReply();
+ void testParseReply_data();
+ void testSetFromLocation();
+ void testSetToLocation();
+
+private:
+ RoutePrivate *m_subject;
+};
+#endif // UT_ROUTE_H
--- /dev/null
+include( ../tests.pri )
+CONFIG += \
+ qt \
+ debug \
+ mobility \
+
+MOBILITY = \
+ location \
+ bearer \
+
+QT += \
+ testlib \
+ network \
+ maemo5 \
+
+INCLUDEPATH += \
+ $$ZOUBASRC \
+
+DEPENDPATH += $INCLUDEPATH
+
+TEMPLATE = app
+
+LIBS += \
+ /usr/lib/libQtLocation.so \
+
+SOURCES = \
+ ut_route.cpp \
+ $$ZOUBASRC/route_p.cpp \
+ $$ZOUBASRC/location.cpp \
+ $$ZOUBASRC/location_p.cpp \
+
+HEADERS += \
+ ut_route.h \
+ $$ZOUBASRC/route_p.h \
+ $$ZOUBASRC/location.h \
+ $$ZOUBASRC/location_p.h \
+
+QMAKE_EXTRA_TARGETS += check
+check.depends = $$TARGET
+check.commands = ./$$TARGET
--- /dev/null
+
+QByteArray sampleInput[2] = {
+"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\
+<MTRXML version=\"1.0\">\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"14.411\" dist=\"2510.063\"/>\
+ <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1815\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1815\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"4.475\" dist=\"357.069\"/>\
+ <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1815\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1815\"/>\
+ </POINT>\
+ <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1816\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1816\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
+ <ARRIVAL date=\"20100207\" time=\"1817\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1817\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1817\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1817\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1819\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1819\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
+ <ARRIVAL date=\"20100207\" time=\"1820\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1820\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:1201129\" x=\"2550765.0\" y=\"6672886.0\" id=\"745\">\
+ <ARRIVAL date=\"20100207\" time=\"1820\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1820\"/>\
+ <NAME lang=\"1\" val=\"Länsiväylä\"/>\
+ <NAME lang=\"2\" val=\"Västerleden\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"200\" code=\"1065A 2\" type=\"1\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"1760.931\"/>\
+ <STOP code=\"6:1201129\" x=\"2550765.0\" y=\"6672886.0\" id=\"745\" ord=\"30\">\
+ <ARRIVAL date=\"20100207\" time=\"1820\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1820\"/>\
+ <NAME lang=\"1\" val=\"Länsiväylä\"/>\
+ <NAME lang=\"2\" val=\"Västerleden\"/>\
+ </STOP>\
+ <STOP code=\"6:1201131\" x=\"2550385.0\" y=\"6672760.0\" id=\"747\">\
+ <ARRIVAL date=\"20100207\" time=\"1821\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1821\"/>\
+ <NAME lang=\"1\" val=\"Salmisaari\"/>\
+ <NAME lang=\"2\" val=\"Sundholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310101\" x=\"2549608.0\" y=\"6672522.0\" id=\"1356\">\
+ <ARRIVAL date=\"20100207\" time=\"1824\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1824\"/>\
+ <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
+ <NAME lang=\"2\" val=\"Drumsö bro\"/>\
+ </STOP>\
+ <STOP code=\"6:1310103\" x=\"2549247.0\" y=\"6672446.0\" id=\"1358\" ord=\"33\">\
+ <ARRIVAL date=\"20100207\" time=\"1825\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1825\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"4.936\" dist=\"392.062\"/>\
+ <STOP code=\"6:1310103\" x=\"2549247.0\" y=\"6672446.0\" id=\"1358\">\
+ <ARRIVAL date=\"20100207\" time=\"1825\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1825\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1825\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1825\"/>\
+ <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1827\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1827\"/>\
+ <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1828\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1828\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1828\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1828\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1829\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1829\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1829\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1829\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1829\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1829\"/>\
+ </POINT>\
+ </ROUTE>\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"13.411\" dist=\"2501.497\"/>\
+ <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1821\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1821\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"4.475\" dist=\"357.069\"/>\
+ <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1821\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1821\"/>\
+ </POINT>\
+ <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1822\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1822\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
+ <ARRIVAL date=\"20100207\" time=\"1823\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1823\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1823\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1823\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1825\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1825\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
+ <ARRIVAL date=\"20100207\" time=\"1826\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1826\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\">\
+ <ARRIVAL date=\"20100207\" time=\"1826\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1826\"/>\
+ <NAME lang=\"1\" val=\"Länsiväylä\"/>\
+ <NAME lang=\"2\" val=\"Västerleden\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"579\" code=\"2102T 1\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"4.000\" dist=\"1751.582\"/>\
+ <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\" ord=\"3\">\
+ <ARRIVAL date=\"20100207\" time=\"1826\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1826\"/>\
+ <NAME lang=\"1\" val=\"Länsiväylä\"/>\
+ <NAME lang=\"2\" val=\"Västerleden\"/>\
+ </STOP>\
+ <STOP code=\"6:1201231\" x=\"2550387.0\" y=\"6672761.0\" id=\"759\">\
+ <ARRIVAL date=\"20100207\" time=\"1827\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1827\"/>\
+ <NAME lang=\"1\" val=\"Salmisaari\"/>\
+ <NAME lang=\"2\" val=\"Sundholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310201\" x=\"2549630.0\" y=\"6672524.0\" id=\"1402\">\
+ <ARRIVAL date=\"20100207\" time=\"1829\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1829\"/>\
+ <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
+ <NAME lang=\"2\" val=\"Drumsö bro\"/>\
+ </STOP>\
+ <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\" ord=\"6\">\
+ <ARRIVAL date=\"20100207\" time=\"1830\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1830\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"4.936\" dist=\"392.846\"/>\
+ <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\">\
+ <ARRIVAL date=\"20100207\" time=\"1830\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1830\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1830\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1830\"/>\
+ <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1832\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1832\"/>\
+ <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1833\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1833\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1833\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1833\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1834\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1834\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1834\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1834\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1834\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1834\"/>\
+ </POINT>\
+ </ROUTE>\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"13.411\" dist=\"2501.497\"/>\
+ <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1829\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1829\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"4.475\" dist=\"357.069\"/>\
+ <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1829\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1829\"/>\
+ </POINT>\
+ <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1830\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1830\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
+ <ARRIVAL date=\"20100207\" time=\"1831\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1831\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1831\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1831\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
+ <ARRIVAL date=\"20100207\" time=\"1833\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1833\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
+ <ARRIVAL date=\"20100207\" time=\"1834\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1834\"/>\
+ <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\">\
+ <ARRIVAL date=\"20100207\" time=\"1834\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1834\"/>\
+ <NAME lang=\"1\" val=\"Länsiväylä\"/>\
+ <NAME lang=\"2\" val=\"Västerleden\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"603\" code=\"2110T 1\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"4.000\" dist=\"1751.582\"/>\
+ <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\" ord=\"3\">\
+ <ARRIVAL date=\"20100207\" time=\"1834\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1834\"/>\
+ <NAME lang=\"1\" val=\"Länsiväylä\"/>\
+ <NAME lang=\"2\" val=\"Västerleden\"/>\
+ </STOP>\
+ <STOP code=\"6:1201231\" x=\"2550387.0\" y=\"6672761.0\" id=\"759\">\
+ <ARRIVAL date=\"20100207\" time=\"1835\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1835\"/>\
+ <NAME lang=\"1\" val=\"Salmisaari\"/>\
+ <NAME lang=\"2\" val=\"Sundholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310201\" x=\"2549630.0\" y=\"6672524.0\" id=\"1402\">\
+ <ARRIVAL date=\"20100207\" time=\"1837\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1837\"/>\
+ <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
+ <NAME lang=\"2\" val=\"Drumsö bro\"/>\
+ </STOP>\
+ <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\" ord=\"6\">\
+ <ARRIVAL date=\"20100207\" time=\"1838\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1838\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"4.936\" dist=\"392.846\"/>\
+ <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\">\
+ <ARRIVAL date=\"20100207\" time=\"1838\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1838\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1838\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1838\"/>\
+ <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1840\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1840\"/>\
+ <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1841\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1841\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1841\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1841\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
+ <ARRIVAL date=\"20100207\" time=\"1842\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1842\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1842\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1842\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100207\" time=\"1842\"/>\
+ <DEPARTURE date=\"20100207\" time=\"1842\"/>\
+ </POINT>\
+ </ROUTE>\
+</MTRXML>\
+",
+
+"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\
+<MTRXML version=\"1.0\">\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"28.633\" dist=\"8902.040\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0814\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0814\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"3.479\" dist=\"254.753\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0814\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0814\"/>\
+ </POINT>\
+ <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0815\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0815\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0816\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0816\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0816\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0816\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0816\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0816\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0817\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0817\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0818\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0818\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
+ <ARRIVAL date=\"20100416\" time=\"0818\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0818\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
+ <ARRIVAL date=\"20100416\" time=\"0818\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0818\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
+ <ARRIVAL date=\"20100416\" time=\"0819\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0819\"/>\
+ <NAME lang=\"1\" val=\"Mellstenintie\"/>\
+ <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
+ <ARRIVAL date=\"20100416\" time=\"0819\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0819\"/>\
+ <NAME lang=\"1\" val=\"Toppelund\"/>\
+ <NAME lang=\"2\" val=\"Toppelund\"/>\
+ </STOP>\
+ <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
+ <ARRIVAL date=\"20100416\" time=\"0820\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0820\"/>\
+ <NAME lang=\"1\" val=\"Linnake\"/>\
+ <NAME lang=\"2\" val=\"Fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
+ <ARRIVAL date=\"20100416\" time=\"0821\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0821\"/>\
+ <NAME lang=\"1\" val=\"Alalinnake\"/>\
+ <NAME lang=\"2\" val=\"Nedre fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
+ <ARRIVAL date=\"20100416\" time=\"0822\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0822\"/>\
+ <NAME lang=\"1\" val=\"Westendinpolku\"/>\
+ <NAME lang=\"2\" val=\"Westendstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
+ <ARRIVAL date=\"20100416\" time=\"0823\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0823\"/>\
+ <NAME lang=\"1\" val=\"Golfpolku\"/>\
+ <NAME lang=\"2\" val=\"Golfstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
+ <ARRIVAL date=\"20100416\" time=\"0824\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0824\"/>\
+ <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
+ <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
+ <ARRIVAL date=\"20100416\" time=\"0824\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0824\"/>\
+ <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
+ <NAME lang=\"2\" val=\"Konungshamnen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
+ <ARRIVAL date=\"20100416\" time=\"0825\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0825\"/>\
+ <NAME lang=\"1\" val=\"Karhusaari\"/>\
+ <NAME lang=\"2\" val=\"Björnholm\"/>\
+ </STOP>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
+ <ARRIVAL date=\"20100416\" time=\"0826\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0832\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ </LINE>\
+ <LINE id=\"642\" code=\"2121T 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"13\">\
+ <ARRIVAL date=\"20100416\" time=\"0826\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0832\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
+ <ARRIVAL date=\"20100416\" time=\"0833\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0833\"/>\
+ <NAME lang=\"1\" val=\"Katajaharju\"/>\
+ <NAME lang=\"2\" val=\"Enåsen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
+ <ARRIVAL date=\"20100416\" time=\"0834\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0834\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
+ <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
+ <ARRIVAL date=\"20100416\" time=\"0835\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0835\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
+ <NAME lang=\"2\" val=\"Braxviksparken\"/>\
+ </STOP>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"17\">\
+ <ARRIVAL date=\"20100416\" time=\"0837\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0837\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"6.154\" dist=\"495.764\"/>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
+ <ARRIVAL date=\"20100416\" time=\"0837\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0837\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0838\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0838\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0840\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0840\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0843\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0843\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0843\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0843\"/>\
+ </POINT>\
+ </ROUTE>\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"25.633\" dist=\"8902.040\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0829\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0829\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"3.479\" dist=\"254.753\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0829\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0829\"/>\
+ </POINT>\
+ <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0830\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0830\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0831\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0831\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0831\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0831\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0831\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0831\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0832\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0832\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0833\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0833\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
+ <ARRIVAL date=\"20100416\" time=\"0833\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0833\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
+ <ARRIVAL date=\"20100416\" time=\"0833\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0833\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
+ <ARRIVAL date=\"20100416\" time=\"0834\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0834\"/>\
+ <NAME lang=\"1\" val=\"Mellstenintie\"/>\
+ <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
+ <ARRIVAL date=\"20100416\" time=\"0834\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0834\"/>\
+ <NAME lang=\"1\" val=\"Toppelund\"/>\
+ <NAME lang=\"2\" val=\"Toppelund\"/>\
+ </STOP>\
+ <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
+ <ARRIVAL date=\"20100416\" time=\"0835\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0835\"/>\
+ <NAME lang=\"1\" val=\"Linnake\"/>\
+ <NAME lang=\"2\" val=\"Fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
+ <ARRIVAL date=\"20100416\" time=\"0836\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0836\"/>\
+ <NAME lang=\"1\" val=\"Alalinnake\"/>\
+ <NAME lang=\"2\" val=\"Nedre fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
+ <ARRIVAL date=\"20100416\" time=\"0837\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0837\"/>\
+ <NAME lang=\"1\" val=\"Westendinpolku\"/>\
+ <NAME lang=\"2\" val=\"Westendstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
+ <ARRIVAL date=\"20100416\" time=\"0838\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0838\"/>\
+ <NAME lang=\"1\" val=\"Golfpolku\"/>\
+ <NAME lang=\"2\" val=\"Golfstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
+ <ARRIVAL date=\"20100416\" time=\"0839\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0839\"/>\
+ <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
+ <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
+ <ARRIVAL date=\"20100416\" time=\"0839\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0839\"/>\
+ <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
+ <NAME lang=\"2\" val=\"Konungshamnen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
+ <ARRIVAL date=\"20100416\" time=\"0840\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0840\"/>\
+ <NAME lang=\"1\" val=\"Karhusaari\"/>\
+ <NAME lang=\"2\" val=\"Björnholm\"/>\
+ </STOP>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
+ <ARRIVAL date=\"20100416\" time=\"0841\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0844\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ </LINE>\
+ <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
+ <ARRIVAL date=\"20100416\" time=\"0841\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0844\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
+ <ARRIVAL date=\"20100416\" time=\"0845\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0845\"/>\
+ <NAME lang=\"1\" val=\"Katajaharju\"/>\
+ <NAME lang=\"2\" val=\"Enåsen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
+ <ARRIVAL date=\"20100416\" time=\"0846\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0846\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
+ <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
+ <ARRIVAL date=\"20100416\" time=\"0847\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0847\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
+ <NAME lang=\"2\" val=\"Braxviksparken\"/>\
+ </STOP>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
+ <ARRIVAL date=\"20100416\" time=\"0849\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0849\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"6.154\" dist=\"495.764\"/>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
+ <ARRIVAL date=\"20100416\" time=\"0849\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0849\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0850\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0850\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0852\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0852\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0855\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0855\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0855\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0855\"/>\
+ </POINT>\
+ </ROUTE>\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"33.510\" dist=\"11193.458\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0831\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0831\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"2.356\" dist=\"172.693\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0831\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0831\"/>\
+ </POINT>\
+ <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0832\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0832\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0833\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0833\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543528.9\" y=\"6672567.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0833\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0833\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:2232219\" x=\"2543533.0\" y=\"6672532.0\" id=\"3374\">\
+ <ARRIVAL date=\"20100416\" time=\"0834\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0834\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"621\" code=\"2111T 1\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"6.000\" dist=\"3392.054\"/>\
+ <STOP code=\"6:2232219\" x=\"2543533.0\" y=\"6672532.0\" id=\"3374\" ord=\"20\">\
+ <ARRIVAL date=\"20100416\" time=\"0834\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0834\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232236\" x=\"2543282.0\" y=\"6672594.0\" id=\"3390\">\
+ <ARRIVAL date=\"20100416\" time=\"0835\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0835\"/>\
+ <NAME lang=\"1\" val=\"Haukilahden keskus\"/>\
+ <NAME lang=\"2\" val=\"Gäddvik centrum\"/>\
+ </STOP>\
+ <STOP code=\"6:2232221\" x=\"2543195.0\" y=\"6672532.0\" id=\"3376\">\
+ <ARRIVAL date=\"20100416\" time=\"0835\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0835\"/>\
+ <NAME lang=\"1\" val=\"Pattisten pelto\"/>\
+ <NAME lang=\"2\" val=\"Battisåker\"/>\
+ </STOP>\
+ <STOP code=\"6:2232227\" x=\"2543123.0\" y=\"6672283.0\" id=\"3381\">\
+ <ARRIVAL date=\"20100416\" time=\"0836\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0836\"/>\
+ <NAME lang=\"1\" val=\"Haukitie\"/>\
+ <NAME lang=\"2\" val=\"Gäddvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232229\" x=\"2542938.0\" y=\"6672081.0\" id=\"3383\">\
+ <ARRIVAL date=\"20100416\" time=\"0836\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0836\"/>\
+ <NAME lang=\"1\" val=\"Haukiverkko\"/>\
+ <NAME lang=\"2\" val=\"Gäddnätet\"/>\
+ </STOP>\
+ <STOP code=\"6:2232209\" x=\"2542708.0\" y=\"6672127.0\" id=\"3364\">\
+ <ARRIVAL date=\"20100416\" time=\"0837\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0837\"/>\
+ <NAME lang=\"1\" val=\"Hauenkita\"/>\
+ <NAME lang=\"2\" val=\"Gäddgapet\"/>\
+ </STOP>\
+ <STOP code=\"6:2232211\" x=\"2542513.0\" y=\"6672237.0\" id=\"3366\">\
+ <ARRIVAL date=\"20100416\" time=\"0837\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0837\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenranta 25\"/>\
+ <NAME lang=\"2\" val=\"Gäddviksstranden 25\"/>\
+ </STOP>\
+ <STOP code=\"6:2232212\" x=\"2542467.0\" y=\"6672399.0\" id=\"3367\">\
+ <ARRIVAL date=\"20100416\" time=\"0838\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0838\"/>\
+ <NAME lang=\"1\" val=\"Telamäentie\"/>\
+ <NAME lang=\"2\" val=\"Kavelbackavägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232213\" x=\"2542470.0\" y=\"6672451.0\" id=\"3368\">\
+ <ARRIVAL date=\"20100416\" time=\"0838\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0838\"/>\
+ <NAME lang=\"1\" val=\"Telamäentie\"/>\
+ <NAME lang=\"2\" val=\"Kavelbackavägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232239\" x=\"2542955.0\" y=\"6672526.0\" id=\"3393\">\
+ <ARRIVAL date=\"20100416\" time=\"0839\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0839\"/>\
+ <NAME lang=\"1\" val=\"Hauenkallio\"/>\
+ <NAME lang=\"2\" val=\"Gäddberget\"/>\
+ </STOP>\
+ <STOP code=\"6:2232223\" x=\"2543096.0\" y=\"6672983.0\" id=\"3378\" ord=\"30\">\
+ <ARRIVAL date=\"20100416\" time=\"0840\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0843\"/>\
+ <NAME lang=\"1\" val=\"Kuhatie\"/>\
+ <NAME lang=\"2\" val=\"Gösvägen\"/>\
+ </STOP>\
+ </LINE>\
+ <LINE id=\"624\" code=\"2112 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"4206.516\"/>\
+ <STOP code=\"6:2232223\" x=\"2543096.0\" y=\"6672983.0\" id=\"3378\" ord=\"12\">\
+ <ARRIVAL date=\"20100416\" time=\"0840\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0843\"/>\
+ <NAME lang=\"1\" val=\"Kuhatie\"/>\
+ <NAME lang=\"2\" val=\"Gösvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231202\" x=\"2544838.0\" y=\"6673305.0\" id=\"3333\">\
+ <ARRIVAL date=\"20100416\" time=\"0846\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0846\"/>\
+ <NAME lang=\"1\" val=\"Westendinasema\"/>\
+ <NAME lang=\"2\" val=\"Westendstationen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
+ <ARRIVAL date=\"20100416\" time=\"0847\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0847\"/>\
+ <NAME lang=\"1\" val=\"Karhusaari\"/>\
+ <NAME lang=\"2\" val=\"Björnholm\"/>\
+ </STOP>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"15\">\
+ <ARRIVAL date=\"20100416\" time=\"0848\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0854\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ </LINE>\
+ <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
+ <ARRIVAL date=\"20100416\" time=\"0848\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0854\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
+ <ARRIVAL date=\"20100416\" time=\"0855\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0855\"/>\
+ <NAME lang=\"1\" val=\"Katajaharju\"/>\
+ <NAME lang=\"2\" val=\"Enåsen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
+ <ARRIVAL date=\"20100416\" time=\"0856\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0856\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
+ <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
+ <ARRIVAL date=\"20100416\" time=\"0857\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0857\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
+ <NAME lang=\"2\" val=\"Braxviksparken\"/>\
+ </STOP>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
+ <ARRIVAL date=\"20100416\" time=\"0859\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0859\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"6.154\" dist=\"495.764\"/>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
+ <ARRIVAL date=\"20100416\" time=\"0859\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0859\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0900\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0900\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0902\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0902\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0905\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0905\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ </POINT>\
+ </ROUTE>\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"29.633\" dist=\"8902.040\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0846\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0846\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"3.479\" dist=\"254.753\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0846\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0846\"/>\
+ </POINT>\
+ <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0847\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0847\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0848\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0848\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0848\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0848\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0848\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0848\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0849\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0849\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0850\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0850\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
+ <ARRIVAL date=\"20100416\" time=\"0850\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0850\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
+ <ARRIVAL date=\"20100416\" time=\"0850\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0850\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
+ <ARRIVAL date=\"20100416\" time=\"0851\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0851\"/>\
+ <NAME lang=\"1\" val=\"Mellstenintie\"/>\
+ <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
+ <ARRIVAL date=\"20100416\" time=\"0851\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0851\"/>\
+ <NAME lang=\"1\" val=\"Toppelund\"/>\
+ <NAME lang=\"2\" val=\"Toppelund\"/>\
+ </STOP>\
+ <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
+ <ARRIVAL date=\"20100416\" time=\"0852\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0852\"/>\
+ <NAME lang=\"1\" val=\"Linnake\"/>\
+ <NAME lang=\"2\" val=\"Fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
+ <ARRIVAL date=\"20100416\" time=\"0853\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0853\"/>\
+ <NAME lang=\"1\" val=\"Alalinnake\"/>\
+ <NAME lang=\"2\" val=\"Nedre fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
+ <ARRIVAL date=\"20100416\" time=\"0854\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0854\"/>\
+ <NAME lang=\"1\" val=\"Westendinpolku\"/>\
+ <NAME lang=\"2\" val=\"Westendstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
+ <ARRIVAL date=\"20100416\" time=\"0855\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0855\"/>\
+ <NAME lang=\"1\" val=\"Golfpolku\"/>\
+ <NAME lang=\"2\" val=\"Golfstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
+ <ARRIVAL date=\"20100416\" time=\"0856\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0856\"/>\
+ <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
+ <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
+ <ARRIVAL date=\"20100416\" time=\"0856\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0856\"/>\
+ <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
+ <NAME lang=\"2\" val=\"Konungshamnen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
+ <ARRIVAL date=\"20100416\" time=\"0857\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0857\"/>\
+ <NAME lang=\"1\" val=\"Karhusaari\"/>\
+ <NAME lang=\"2\" val=\"Björnholm\"/>\
+ </STOP>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
+ <ARRIVAL date=\"20100416\" time=\"0858\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ </LINE>\
+ <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
+ <ARRIVAL date=\"20100416\" time=\"0858\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
+ <ARRIVAL date=\"20100416\" time=\"0906\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0906\"/>\
+ <NAME lang=\"1\" val=\"Katajaharju\"/>\
+ <NAME lang=\"2\" val=\"Enåsen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
+ <ARRIVAL date=\"20100416\" time=\"0907\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0907\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
+ <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
+ <ARRIVAL date=\"20100416\" time=\"0908\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0908\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
+ <NAME lang=\"2\" val=\"Braxviksparken\"/>\
+ </STOP>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
+ <ARRIVAL date=\"20100416\" time=\"0910\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0910\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"6.154\" dist=\"495.764\"/>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
+ <ARRIVAL date=\"20100416\" time=\"0910\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0910\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0911\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0911\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0913\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0913\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0916\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0916\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0916\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0916\"/>\
+ </POINT>\
+ </ROUTE>\
+ <ROUTE from=\"start\" to=\"dest\">\
+ <LENGTH time=\"29.633\" dist=\"8902.040\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0903\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0903\"/>\
+ </POINT>\
+ <WALK>\
+ <LENGTH time=\"3.479\" dist=\"254.753\"/>\
+ <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0903\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0903\"/>\
+ </POINT>\
+ <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0904\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0904\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0905\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0905\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0905\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0905\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0906\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0906\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0907\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0907\"/>\
+ <NAME lang=\"1\" val=\"Toppelundintie\"/>\
+ </MAPLOC>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
+ <ARRIVAL date=\"20100416\" time=\"0907\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0907\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ </WALK>\
+ <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
+ <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
+ <ARRIVAL date=\"20100416\" time=\"0907\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0907\"/>\
+ <NAME lang=\"1\" val=\"Säynävätie\"/>\
+ <NAME lang=\"2\" val=\"Idvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
+ <ARRIVAL date=\"20100416\" time=\"0908\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0908\"/>\
+ <NAME lang=\"1\" val=\"Mellstenintie\"/>\
+ <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
+ <ARRIVAL date=\"20100416\" time=\"0909\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0909\"/>\
+ <NAME lang=\"1\" val=\"Toppelund\"/>\
+ <NAME lang=\"2\" val=\"Toppelund\"/>\
+ </STOP>\
+ <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
+ <ARRIVAL date=\"20100416\" time=\"0909\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0909\"/>\
+ <NAME lang=\"1\" val=\"Linnake\"/>\
+ <NAME lang=\"2\" val=\"Fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
+ <ARRIVAL date=\"20100416\" time=\"0910\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0910\"/>\
+ <NAME lang=\"1\" val=\"Alalinnake\"/>\
+ <NAME lang=\"2\" val=\"Nedre fortet\"/>\
+ </STOP>\
+ <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
+ <ARRIVAL date=\"20100416\" time=\"0911\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0911\"/>\
+ <NAME lang=\"1\" val=\"Westendinpolku\"/>\
+ <NAME lang=\"2\" val=\"Westendstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
+ <ARRIVAL date=\"20100416\" time=\"0912\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0912\"/>\
+ <NAME lang=\"1\" val=\"Golfpolku\"/>\
+ <NAME lang=\"2\" val=\"Golfstigen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
+ <ARRIVAL date=\"20100416\" time=\"0913\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0913\"/>\
+ <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
+ <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
+ <ARRIVAL date=\"20100416\" time=\"0913\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0913\"/>\
+ <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
+ <NAME lang=\"2\" val=\"Konungshamnen\"/>\
+ </STOP>\
+ <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
+ <ARRIVAL date=\"20100416\" time=\"0914\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0914\"/>\
+ <NAME lang=\"1\" val=\"Karhusaari\"/>\
+ <NAME lang=\"2\" val=\"Björnholm\"/>\
+ </STOP>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
+ <ARRIVAL date=\"20100416\" time=\"0915\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0922\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ </LINE>\
+ <LINE id=\"696\" code=\"2160T 2\" type=\"5\" mobility=\"3\">\
+ <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
+ <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"20\">\
+ <ARRIVAL date=\"20100416\" time=\"0915\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0922\"/>\
+ <NAME lang=\"1\" val=\"Hanasaari\"/>\
+ <NAME lang=\"2\" val=\"Hanaholmen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
+ <ARRIVAL date=\"20100416\" time=\"0923\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0923\"/>\
+ <NAME lang=\"1\" val=\"Katajaharju\"/>\
+ <NAME lang=\"2\" val=\"Enåsen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
+ <ARRIVAL date=\"20100416\" time=\"0925\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0925\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
+ <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
+ </STOP>\
+ <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
+ <ARRIVAL date=\"20100416\" time=\"0926\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0926\"/>\
+ <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
+ <NAME lang=\"2\" val=\"Braxviksparken\"/>\
+ </STOP>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"24\">\
+ <ARRIVAL date=\"20100416\" time=\"0927\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0927\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ </LINE>\
+ <WALK>\
+ <LENGTH time=\"6.154\" dist=\"495.764\"/>\
+ <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
+ <ARRIVAL date=\"20100416\" time=\"0927\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0927\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
+ </STOP>\
+ <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0928\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0928\"/>\
+ <NAME lang=\"1\" val=\"Koillisväylä\"/>\
+ </MAPLOC>\
+ <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
+ <ARRIVAL date=\"20100416\" time=\"0930\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0930\"/>\
+ </MAPLOC>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0933\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0933\"/>\
+ </POINT>\
+ </WALK>\
+ <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
+ <ARRIVAL date=\"20100416\" time=\"0933\"/>\
+ <DEPARTURE date=\"20100416\" time=\"0933\"/>\
+ </POINT>\
+ </ROUTE>\
+</MTRXML>\
+"
+};
+
+++ /dev/null
-Makefile
-ut_template
+++ /dev/null
-#include "ut_template.h"
-#include <QtTest/QtTest>
-
-void Ut_template::initTestCase()
-{
-
-}
-
-void Ut_template::cleanupTestCase()
-{
-
-}
-
-void Ut_template::init()
-{
-
-}
-
-void Ut_template::cleanup()
-{
-
-}
-
-QTEST_MAIN(Ut_template)
+++ /dev/null
-#ifndef UT_TEMPLATE_H
-#define UT_TEMPLATE_H
-
-#include <QObject>
-
-class Ut_template : public QObject
-{
- Q_OBJECT
-
-private slots:
- // Will be called before the first testfunction is executed.
- void initTestCase();
- // Will be called after the last testfunction was executed.
- void cleanupTestCase();
- // Will be called before each testfunction is executed.
- void init();
- // Will be called after every testfunction.
- void cleanup();
-
-};
-
-#endif // UT_TEMPLATE_H
+++ /dev/null
-include(../ut_common.pri)
-
-TARGET = ut_template
-QT += testlib
-SOURCES += ut_template.cpp \
- $$SRCDIR/template.cpp
-HEADERS += ut_template.h \
- $$SRCDIR/template.h
-
-include(../check.pri)
+++ /dev/null
-#ifndef STLHELPERS_H
-#define STLHELPERS_H
-
-#include <ostream>
-#include "kkjgridcoordinate.h"
-#include <QGeoCoordinate>
-
-std::ostream& operator<<(std::ostream& stream, const KKJGridCoordinate &val)
-{
- stream << val.northing() << ", " << val.easting();
- return stream;
-}
-
-std::ostream& operator<<(std::ostream& stream, const QTM_NAMESPACE::QGeoCoordinate &val)
-{
- stream << val.latitude() << ", " << val.longitude();
- return stream;
-}
-
-#endif // STLHELPERS_H
+++ /dev/null
-#ifndef STLHELPERS4QT_H
-#define STLHELPERS4QT_H
-
-#include <ostream>
-#include <QList>
-#include <QVariant>
-
-/**
- * Outputs the contents of a QList<QVariant> container to a std::ostream object.
- * @param stream the stream to output to
- * @param val the container that is put to the stream
- * @return the same stream that was passed as the parameter @a stream
- */
-std::ostream& operator<<(std::ostream& stream, const QList<QVariant> &val)
-{
- bool first = true;
-
- foreach (const QVariant &v, val) {
- if (!first) {
- stream << ", ";
- }
- stream << v.toString().toStdString();
- first = false;
- }
- return stream;
-}
-
-#endif // STLHELPERS4QT_H
--- /dev/null
+TARGET = zouba
+SOURCES += \
+ main.cpp \
+ route.cpp \
+ route_p.cpp \
+ uicontroller.cpp \
+ location.cpp \
+ location_p.cpp \
+ locations.cpp \
+ gpscontroller.cpp \
+ gpscontroller_p.cpp \
+ ui.cpp \
+
+HEADERS += \
+ route.h \
+ route_p.h \
+ uicontroller.h \
+ location.h \
+ location_p.h \
+ locations.h \
+ ytv.h \
+ gpscontroller.h \
+ gpscontroller_p.h \
+ ui.h \
+
+FORMS +=
+LEXSOURCES += #LEXS#
+YACCSOURCES += #YACCS#
+
+INCLUDEPATH += include
+DEPENDSPATH += INCLUDEPATH
+#QMAKE_LIBDIR_QT = qt4-maemo5/lib
+#QMAKE_INCDIR_QT = qt4-maemo5/include
+LIBS += -Llib -lQtBearer -lQtLocation
+DEFINES += Q_WS_MAEMO_5
+
+# All generated files goes same directory
+OBJECTS_DIR = build
+MOC_DIR = build
+UI_DIR = build
+
+DESTDIR = build
+TEMPLATE = app
+DEPENDPATH +=
+VPATH += src uis
+CONFIG -=
+CONFIG += debug qt mobility
+MOBILITY += location bearer
+QT=core gui network maemo5
+
+INSTALLS += target
+target.path = /usr/bin/
+
+INSTALLS += desktop
+desktop.path = /usr/share/applications/hildon
+desktop.files = data/zouba.desktop
+
+INSTALLS += service
+service.path = /usr/share/dbus-1/services
+service.files = data/zouba.service
+
+INSTALLS += icon64
+icon64.path = /usr/share/icons/hicolor/64x64/apps
+icon64.files = data/64x64/zouba.png
+
+#
+# Targets for debian source and binary package creation
+#
+debian-src.commands = dpkg-buildpackage -S -r -us -uc -d
+debian-bin.commands = dpkg-buildpackage -b -r -uc -d
+debian-all.depends = debian-src debian-bin
+
+#
+# Clean all but Makefile
+#
+compiler_clean.commands = -$(DEL_FILE) $(TARGET)
+
+QMAKE_EXTRA_TARGETS += debian-all debian-src debian-bin compiler_clean
+++ /dev/null
-[Desktop Entry]
-Encoding=UTF-8
-Version=0.1
-Type=Application
-Name=ZouBa
-Exec=/usr/bin/zouba
-Icon=zouba
-X-HildonDesk-ShowInToolbar=true
-X-Window-Icon=zouba
-X-Window-Icon-Dimmed=zouba
-X-Osso-Type=application/x-executable
+++ /dev/null
-The Debian Package zouba
-----------------------------
-
-Comments regarding the Package
-
- -- Max Waterman <davidmaxwaterman@jeeves> Tue, 23 Mar 2010 20:11:34 +0200
+++ /dev/null
-zouba for Debian
-----------------
-
-<possible notes regarding this package - if none, delete this file>
-
- -- Max Waterman <davidmaxwaterman@jeeves> Tue, 23 Mar 2010 20:11:34 +0200
+++ /dev/null
-zouba (0.9) unstable; urgency=low
-
- * added notification for address resolution failure and no route
- * fixed issue with multiple route requests for a single button click
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Sun, 25 Apr 2010 06:12:00 +0200
-
-zouba (0.8) unstable; urgency=low
-
- * Fixed problem when changing the address of a location to something invalid.
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Sat, 24 Apr 2010 03:39:00 +0200
-
-zouba (0.7) unstable; urgency=low
-
- * Changed gps controller to use labels for fake gps instead of a new Location instance.
- * Added route detail table and general associated shuffle of api.
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Tue, 20 Apr 2010 06:27:00 +0200
-
-zouba (0.6) unstable; urgency=low
-
- * Changed layout in preparation for multiple routes
- * Changed the selection mode for the tables
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Mon, 19 Apr 2010 17:38:00 +0200
-
-zouba (0.5) unstable; urgency=low
-
- * Changed package description
- * Changed 'fakegps' button from two actions to a single toggle one
- * Fixed core dump in gpscontroller caused by deleting the fakelocation
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Mon, 19 Apr 2010 11:18:00 +0200
-
-zouba (0.4) unstable; urgency=low
-
- * Fix for routes with bus changes (only displays first bus)
- * Added and cleaned up ut_route
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Fri, 16 Apr 2010 11:28:00 +0200
-
-zouba (0.3) unstable; urgency=low
-
- * Fix for app manager icon
- * Changes: cleanup and corrections for autobuilder
- * Added new settings button to set a fake current location ('work' in the first instance).
- * Added 'optimize' parameter set to 'leastwalking' to route server to give same results as web server early in the morning.
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Mon, 12 Apr 2010 12:13:13 +0200
-
-zouba (0.2) unstable; urgency=low
-
- * Better xml error string.
- * Better message table width resizing, though visually the same.
- * Added missing message when work button becomes valid.
- * First upload to extras-devel.
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Wed, 24 Mar 2010 21:29:00 +0200
-
-zouba (0.1) unstable; urgency=low
-
- * Initial Release.
-
- -- Max Waterman <davidmaxwaterman@fastmail.co.uk> Tue, 23 Mar 2010 20:11:34 +0200
+++ /dev/null
-Source: zouba
-Section: user/navigation
-Priority: extra
-Maintainer: Max Waterman <davidmaxwaterman@fastmail.co.uk>
-Build-Depends: libqt4-dev, libqtm-bearer, libqtm-location, debhelper (>= 5)
-Standards-Version: 3.7.3
-Homepage:
-
-Package: zouba
-Architecture: armel
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Description: Tells you which bus is next (in Helsinki area).
- Allows you to easily find how to get the bus home. Uses HSL Journey Planner API <http://developer.reittiopas.fi/pages/en/home.php>. Uses GPS for current location. Uses Qt and QtMobility.
-# XB-Maemo-Icon-26 field contains the application icon file encoded in
-# base64. This is the icon that is shown in the Application Manager,
-# next to the package name. To perform this encoding use following mad
-# command: $ mad base64 <48x48 icon file name>
-# For example following XB-Maemo-Icon-26 field content is an output
-# from command: $ mad base64 zouba/src/data/48x48/zouba.png
-XB-Maemo-Icon-26:
- iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGP
- C/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUw
- AADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAL
- EwAACxMBAJqcGAAAAAl2cEFnAAAAMAAAADAAzu6MVwAADplJREFUaN7VmOmP
- ZNV5h59z7rlLLbequnqp3qBhlp6FmWEYA4YwRiYMAsvBTuzIwiRxnAXJEYkT
- ZVH+AH+KIkVE8gd/iJLIimQnEhMHgx3FRkOCMTG2YQbMGAZ6YDw93dVV1VW3
- a7l16675cG/NtIfBZrFjfKRSt2p9fu9539/7ngO/3MsUv2iCd7hs4B7gvl8m
- AZMZ9CEhuEnT7JvjeKnwXhcggX3AR6QUH9G03PsMY1ZX6hCj0W2MRjt5rwrQ
- gT3Ap4TgvlyucFU+f30SBLcI3z/IaFQjjhWQvOcEKOBa4DNCcL9l5WZLpT1o
- 2p10OjfieRMkiQCSix94rwjIAx8F7hWC20yztFgsHpRSHmUwOIzrvhH8vSJg
- FrgN+G0huNs0K7lC4TBJ8kFc9zpGoxJJwhXBf5ECRAZ+DPgzKcVB06zqlvU+
- kuQDDIf78P3im0b8FylABw4CHxVCfFzT1G7TnDEM4wbi+CjD4TJBkH/L4P9f
- AsrAXuAQcJdS5u1K2TVdn0GpA0TR+/G8Hfh+Pnv7Wwf/eQoQwFXArwOfAA5o
- ml4yjEmh60tIuZ8ouh7PWyIMc2874j9vASZwP/DXIHZLaUmlpjDNHUh5HWG4
- D99fJAhy2U+/E3BB2t9ifpZ9QJKmyl+A+ISUpaJS8+j6DjTtAFG0h9FomijS
- M1d5J2sMvgmcAg4DE+9agAZMAb8K/KWU1hGlllFqP1LuIYp24fuTRJH2DqO9
- PT7DDPw4un6aMPw1kuRTqHcBPglcD/ymlOKjSi3VlDoKHCKKFhmNKtvA3ym8
- AELgh8DDKPUcBw7s5Oqr7+HrX/8GQbD/bQuQ28DvkFIeU0o/omnvV/AbBMES
- UZQjjuU7ABf8eF1EQB14CikfY9euIh/+8AMsL+/hpZdewjAeJwhW3rIACVRJ
- 7fB2TdMO6rquhEiuiePDKggeJIqqJEnCuLjeXkxioAG4gJU9dxopX2RmZo2j
- R2/jYx/7OJVKhXq9juu6F3/rpwmQwARwAPgVTdOWDcPoFwqFr/q+nx8M3GNR
- dHumbTXb7nnAeAtCxuX3EvAN4HtAH7AR4iDV6gTXXbfITTcd4siRvczPz9Nu
- t9na2mJ1dZXhMAZ2vamAMfg+4EZN05YMw3Dy+fx/6Lr+8nA4bHe73c/CZB52
- A/8N/ANCDEmSW4D3AcuZGDIxl8MPgMcR4stMT8OuXbsplyv0ej08r8fy8vtZ
- Wppjbi7Gtkt4nsdg4NJqtXj99bMkyTSw/AYBEqiQUh2UUs4ahuGYpvlVIcTr
- W1tb/TAMY9Kx4CZYyuC+xN13H+DGG2/m+PGH+dGPnsJ1yyTJh0jH+v2kk3IC
- BEAb+DdM8wT79y9z7NhdTExMkM/n0TSNM2deRtcVhYJE19Od6vV6fP/73+Mr
- XznOuXMN4PeB2kUBAiiSzuJ7gKpSqm8YxokkSVa73a6bXDJwSWqds0IU0LQO
- hjHg7rs/xKc//Xt88pP3c+7cOR599BGef/4HfPe7D+P7vwvcBXSADZQ6y8TE
- D7njjg9zyy23UiqVyOVyCCEYDocUizZRFJMkGp2Ow5kzj/PMM8/w7LPPMRzu
- Bf4QOAIIVBbNGrCT1GH6UsoVYHM4HA6TS+SStNMWpZRHNE27xjD2YFkR+XyR
- 2dk5hBDMzs6ysLDArbfeSq/X48EH/4hHH30MmEPTekxM9FlY8LjmmsMcPfoB
- lpaWEEIQBAGe59Hr9XBdF983WVl5jdOnv8PZs88zGtnAp4A7svhFQIICdgEz
- 2f6eAbbiOPbjOB77oMisoaRpml2pVAzTNKdGo0C3rAksK6RSqVKr1UiSBCHS
- LQ/DENd1MQwTcKhWV5mby7OwUGZpqcbiYsTU1BSmaTIYDHAch3Z7k5WVFV55
- ZY2VlTxraw6+PwV8NqupSoYUXcx5BZSAFtAF/G0VNwa3NU0rlctla25uzpyZ
- mdE9z9ObzVZsmhaW1aNWm8AwDDRNw/d9Go0G586dY3V1lUajwfLybhYWqszP
- V5mbK1Gp6OTzPRynQ7PZ4Pz586ytrXP+/Cpnz16g0VggCJZIzzpXkx7YEt5o
- BqmAtSuAm4AtpbRt287Nzs6aMzMzZrVaNaempoxWqzkdBJFhWSaGcTW+f4Ev
- fOEL3HnnnZTL5SwFfFzXZWamxvz8IjMzOygWdSwL4tij2WzSbJ5nY8OhXvc4
- f35Eq1UgDO8inXPmMwyuCL7dz6avAF6ybduq1WrmzMyMOTExYVYqFatcLlu2
- bZtxHE++8MLJB0ajXQtJcowgOIfnPUkc/4ipqQn27t3Hnj17ME2TU6dOYhi7
- 0fU5osjFddu02xs0m22aTZf1dWi3LYJgNvOQGdI+8tOaYdq5RfaJH4v4lcCL
- xaJZLBaNfD6vlFLixInH72u1jMOj0WHCsIeuJ5TLUCgMkdLBtiVLS1fjeR5h
- OMVgYNNo1Gm1tmi1fBqNBMfRCcMpYDGLo8GlkeLNGuH49R5wFgVMSSmLtm3n
- rwReKBRM27bH4ERRxPr6etFxnHy/r6PrW0xNVSkWy2iaThh6hGEf123z2mt1
- wKPfD2k0OjSbHs0mdLtFwrBKejSezOInSEeJegZ3TVae8WXgDvAt0u59DlUu
- l2dqtZpRq9UugpdKJatQKFi2bRuFQkEppYjjOO71etqFCxfK9Xp9yvcDq1qd
- o1S6NgOH0Sgm7XMaw2EFz4vwPEG3a9JoRHS7ecJwInPtyraIbwBPA0+haato
- 2gjfPwB8hkvdvAP8D/BN4FUfojPAI+rIkSOGbduFUqmUr1QquWKxOI64rpQS
- SZLEvu9HnU5HXrhwwdra2tKKxeIgjqfcMDSJ4zy+HxMEEb4f0ut16fW6eB5E
- kY3rVun1IsKwsA1c31acLeDzmOZz7N69i3J5mVptllOnnmNl5R+BPwZOAv8O
- nPEgegb4F+BrwLo6dOiQVigUlGmapmVZlmEYllJKJkmSjEaj0HXdqNvtRo1G
- Q/X7fTeXy4WmaVrdblcPwwqGoRGGIb1ei0bDo90e4PsGUlYIQ4so0kkvk0tZ
- xMl8fAA0EeJr6PopyuUKnufTbJ7llVdWUEpl4J8DzsQwehr4PPCfWR6lNloq
- leT09HRSKpVCpVQwGAy0fr+vDQaDqN/vh71ez+t0OmGz2VRCCD1JEjka+YWt
- LUclySJxPKDdfpLNzScZDvcSxzeSNvV8Fmkzc2uRgQ+BFkK00fXzGMZzJInE
- tm1uuOEGdu7cyfHjxzlz5kyG+IIHPJQ9NoAbsq07BaBM0wzjOA583/eSJElc
- 140bjYbe7Xb9Xq833Nra8tvtdthqtaRSSvM8T3recG5jY3Pa98F1L+C6LxDH
- 54DzwDPA7wAfusxRXKCDEG2UctH1EDhLHHfI5XLce++9HDhwgEceeYSNjQ2k
- lMRx3AT+Fvh70vnhr4A/Af4VeB5IlOM4Q9/3Y9d1YyllvLm5GdXrdeE4ju84
- zqjT6XidTmfkOI6maZrVbrfNfr/nua4XxXFAkpRJb1CuytyhA/wX8MFsF8bg
- Dpo2QtcDwCNJPHK5hKmpBWy7xOnTp3n66aexLIsHH3yQJ554gm9/+9uvAk8A
- DwB/kDWKfwb+Zuyx6rXXXhsWi8W4UChESim/Xq8b9XpdtNttr9PpeN1uNxgO
- h2EYhroQgm636wPfAb4HT92Rpst1pLPK7ixF92bfvw50UMpDqRjwSZIRliUp
- l8sUCtMYxgaGYVCtVrnnnnu4+eabKZfLPPnkkwALwJeyvydIh6JnSCeH1Fzn
- 5+f3V6tVVavVjEKhYKytrRn1ej3e2toag4fbusr2W4ydqc/V7oRPS7gpy/Ue
- 6cnKy8Aj0pNagGkqbNsgl+ui6ysYxir5vGB6eoYHHniAgwcP0m63OX78OA89
- 9FDU6/WeAv6XS0c2h8uWABY1TTMqlYpRKpV0x3GMfr8vgyAIs6obC9AywrH/
- haRXh5+Da4/Bn2YW6aDU8CJ4kgQYhkaxmMOyhih1Dl1fJ5ezyOcVptkNDcPY
- mp2drdZqNXHixAlOnjwZeJ73xSz/X2X7+HkFAZOks74hpbSSJMklSaJlgFEG
- rm2rxvFu+JkXHkpzsna9Urej1D5AI0l8DEOjUMiRywVIuYambWCaJrncPIYR
- Ai8nUg7PjkajF19++eVj3W43juP4JPBl4IvZdv7EJUhP5DKDtIDxvZ+8zP/G
- 8GkVpv+XhRAzpmleJyW/FcfajUkybxjGMoXC9eRyZTRtEyk30XWJYUyilARe
- JQhej1y3c35zs33ecZydURTNA/8E/PmVUuUnCZjJQI3soV8W8WQb+DCD14UQ
- VcuypovFYlVKaQdBMCmlPJzLmTfpunG1ELW8pu1C1xW6nkfKHHG8ThC8Eg8G
- jY7jOBe63Z4dx/FVwNnMXb4JfPetwo8FXJtB69siHvPGiA+ztNKBCV3XJ3Vd
- ryRJUqpWq6XFxcVipVIxkyQpdrvd/cOhe1RKfVJKXUZRlPi+F/X7nb7jbLX7
- /cFWHMfz2e/9HXCc9H7lbS+VpcwYfHxeuzziYfZ+SWruuTiOjUKhoHbv3i1m
- Z2djIIqiSBNC6LZt133ff8JxnB2e5yX9/pa7sdHId7vd+TiO50jH0LNp7fAl
- fkKRvhUB4/uOiEv3HtsjPrZPkUXfEELotVpN7Nu3L15YWIiVUkkcxzKOY2s4
- HFZ7vV7VdV3R7XZ/sLa2JjqdTiWzY0HaRR8DXiQdDd7NrS8qg1VXAB8vuS3d
- NCGE0DQt1nU9klImhmHIYrFodTqd2c3NzaVer2f2er3W+vr6oNVqTYRhaJG2
- /W9l0PXLvv9dLZUBk8EH214bR30sYpxicZIkcS6XE6Zpmo7jzLRarR39fr/q
- OM7m+vp6q9Fo5IIgKAOvkzaik0CTd5Eqb7YE6RVictlzVwQndalSLperzs/P
- LxYKhR2WZU1qmuZubGx0VldXdd/3K6T+/TzpxNj4eYBvhy1fBj3uAdvBEy4V
- 8JyUck+hUJizbds3DGOt2Wzqg8FgfM/4EvAs6W3HzyxV3mz9H8WDYRQx8Afu
- AAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAACV0RVh0
- Y3JlYXRlLWRhdGUAMjAxMC0wMy0yNFQwNToyODo0MyswMjowMPMmiCkAAAAl
- dEVYdG1vZGlmeS1kYXRlADIwMTAtMDMtMjRUMDU6Mjg6NDMrMDI6MDCsl/4d
- AAAAAElFTkSuQmCC
- ====
+++ /dev/null
-This package was debianized by Max Waterman <davidmaxwaterman@jeeves> on
-Tue, 23 Mar 2010 20:11:34 +0200.
-
-It was downloaded from <url://example.com>
-
-Upstream Author(s):
-
- <put author's name and email here>
- <likewise for another author>
-
-Copyright:
-
- <Copyright (C) YYYY Name OfAuthor>
- <likewise for another author>
-
-License:
-
- This package is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This package 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this package; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-On Debian systems, the complete text of the GNU Lesser General
-Public License can be found in `/usr/share/common-licenses/LGPL'.
-
-The Debian packaging is (C) 2010, Max Waterman <davidmaxwaterman@jeeves> and
-is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
-
-# Please also look if there are files or directories which have a
-# different copyright/license attached and list them here.
+++ /dev/null
-#
-# Regular cron jobs for the zouba package
-#
-0 4 * * * root [ -x /usr/bin/zouba_maintenance ] && /usr/bin/zouba_maintenance
+++ /dev/null
-usr/bin
-usr/sbin
+++ /dev/null
-#! /bin/sh -e
-# /usr/lib/emacsen-common/packages/install/zouba
-
-# Written by Jim Van Zandt <jrv@debian.org>, borrowing heavily
-# from the install scripts for gettext by Santiago Vila
-# <sanvila@ctv.es> and octave by Dirk Eddelbuettel <edd@debian.org>.
-
-FLAVOR=$1
-PACKAGE=zouba
-
-if [ ${FLAVOR} = emacs ]; then exit 0; fi
-
-echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR}
-
-#FLAVORTEST=`echo $FLAVOR | cut -c-6`
-#if [ ${FLAVORTEST} = xemacs ] ; then
-# SITEFLAG="-no-site-file"
-#else
-# SITEFLAG="--no-site-file"
-#fi
-FLAGS="${SITEFLAG} -q -batch -l path.el -f batch-byte-compile"
-
-ELDIR=/usr/share/emacs/site-lisp/${PACKAGE}
-ELCDIR=/usr/share/${FLAVOR}/site-lisp/${PACKAGE}
-
-# Install-info-altdir does not actually exist.
-# Maybe somebody will write it.
-if test -x /usr/sbin/install-info-altdir; then
- echo install/${PACKAGE}: install Info links for ${FLAVOR}
- install-info-altdir --quiet --section "" "" --dirname=${FLAVOR} /usr/share/info/${PACKAGE}.info.gz
-fi
-
-install -m 755 -d ${ELCDIR}
-cd ${ELDIR}
-FILES=`echo *.el`
-cp ${FILES} ${ELCDIR}
-cd ${ELCDIR}
-
-cat << EOF > path.el
-(setq load-path (cons "." load-path) byte-compile-warnings nil)
-EOF
-${FLAVOR} ${FLAGS} ${FILES}
-rm -f *.el path.el
-
-exit 0
+++ /dev/null
-#!/bin/sh -e
-# /usr/lib/emacsen-common/packages/remove/zouba
-
-FLAVOR=$1
-PACKAGE=zouba
-
-if [ ${FLAVOR} != emacs ]; then
- if test -x /usr/sbin/install-info-altdir; then
- echo remove/${PACKAGE}: removing Info links for ${FLAVOR}
- install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/share/info/zouba.info.gz
- fi
-
- echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}
- rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}
-fi
+++ /dev/null
-;; -*-emacs-lisp-*-
-;;
-;; Emacs startup file, e.g. /etc/emacs/site-start.d/50zouba.el
-;; for the Debian zouba package
-;;
-;; Originally contributed by Nils Naumann <naumann@unileoben.ac.at>
-;; Modified by Dirk Eddelbuettel <edd@debian.org>
-;; Adapted for dh-make by Jim Van Zandt <jrv@debian.org>
-
-;; The zouba package follows the Debian/GNU Linux 'emacsen' policy and
-;; byte-compiles its elisp files for each 'emacs flavor' (emacs19,
-;; xemacs19, emacs20, xemacs20...). The compiled code is then
-;; installed in a subdirectory of the respective site-lisp directory.
-;; We have to add this to the load-path:
-(let ((package-dir (concat "/usr/share/"
- (symbol-name flavor)
- "/site-lisp/zouba")))
-;; If package-dir does not exist, the zouba package must have
-;; removed but not purged, and we should skip the setup.
- (when (file-directory-p package-dir)
- (setq load-path (cons package-dir load-path))
- (autoload 'zouba-mode "zouba-mode"
- "Major mode for editing zouba files." t)
- (add-to-list 'auto-mode-alist '("\\.zouba$" . zouba-mode))))
-
+++ /dev/null
-zouba_0.9_armel.deb user/navigation extra
+++ /dev/null
-#! /bin/sh
-#
-# skeleton example file to build /etc/init.d/ scripts.
-# This file should be used to construct scripts for /etc/init.d.
-#
-# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
-# Modified for Debian
-# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
-# Further changes by Javier Fernandez-Sanguino <jfs@debian.org>
-#
-# Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl
-#
-
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-DAEMON=/usr/sbin/zouba
-NAME=zouba
-DESC=zouba
-
-test -x $DAEMON || exit 0
-
-LOGDIR=/var/log/zouba
-PIDFILE=/var/run/$NAME.pid
-DODTIME=1 # Time to wait for the server to die, in seconds
- # If this value is set too low you might not
- # let some servers to die gracefully and
- # 'restart' will not work
-
-# Include zouba defaults if available
-if [ -f /etc/default/zouba ] ; then
- . /etc/default/zouba
-fi
-
-set -e
-
-running_pid()
-{
- # Check if a given process pid's cmdline matches a given name
- pid=$1
- name=$2
- [ -z "$pid" ] && return 1
- [ ! -d /proc/$pid ] && return 1
- cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
- # Is this the expected child?
- [ "$cmd" != "$name" ] && return 1
- return 0
-}
-
-running()
-{
-# Check if the process is running looking at /proc
-# (works for all users)
-
- # No pidfile, probably no daemon present
- [ ! -f "$PIDFILE" ] && return 1
- # Obtain the pid and check it against the binary name
- pid=`cat $PIDFILE`
- running_pid $pid $DAEMON || return 1
- return 0
-}
-
-force_stop() {
-# Forcefully kill the process
- [ ! -f "$PIDFILE" ] && return
- if running ; then
- kill -15 $pid
- # Is it really dead?
- [ -n "$DODTIME" ] && sleep "$DODTIME"s
- if running ; then
- kill -9 $pid
- [ -n "$DODTIME" ] && sleep "$DODTIME"s
- if running ; then
- echo "Cannot kill $LABEL (pid=$pid)!"
- exit 1
- fi
- fi
- fi
- rm -f $PIDFILE
- return 0
-}
-
-case "$1" in
- start)
- echo -n "Starting $DESC: "
- start-stop-daemon --start --quiet --pidfile $PIDFILE \
- --exec $DAEMON -- $DAEMON_OPTS
- if running ; then
- echo "$NAME."
- else
- echo " ERROR."
- fi
- ;;
- stop)
- echo -n "Stopping $DESC: "
- start-stop-daemon --stop --quiet --pidfile $PIDFILE \
- --exec $DAEMON
- echo "$NAME."
- ;;
- force-stop)
- echo -n "Forcefully stopping $DESC: "
- force_stop
- if ! running ; then
- echo "$NAME."
- else
- echo " ERROR."
- fi
- ;;
- #reload)
- #
- # If the daemon can reload its config files on the fly
- # for example by sending it SIGHUP, do it here.
- #
- # If the daemon responds to changes in its config file
- # directly anyway, make this a do-nothing entry.
- #
- # echo "Reloading $DESC configuration files."
- # start-stop-daemon --stop --signal 1 --quiet --pidfile \
- # /var/run/$NAME.pid --exec $DAEMON
- #;;
- force-reload)
- #
- # If the "reload" option is implemented, move the "force-reload"
- # option to the "reload" entry above. If not, "force-reload" is
- # just the same as "restart" except that it does nothing if the
- # daemon isn't already running.
- # check wether $DAEMON is running. If so, restart
- start-stop-daemon --stop --test --quiet --pidfile \
- /var/run/$NAME.pid --exec $DAEMON \
- && $0 restart \
- || exit 0
- ;;
- restart)
- echo -n "Restarting $DESC: "
- start-stop-daemon --stop --quiet --pidfile \
- /var/run/$NAME.pid --exec $DAEMON
- [ -n "$DODTIME" ] && sleep $DODTIME
- start-stop-daemon --start --quiet --pidfile \
- /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
- echo "$NAME."
- ;;
- status)
- echo -n "$LABEL is "
- if running ; then
- echo "running"
- else
- echo " not running."
- exit 1
- fi
- ;;
- *)
- N=/etc/init.d/$NAME
- # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
- echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2
- exit 1
- ;;
-esac
-
-exit 0
+++ /dev/null
-#!/bin/sh
-#
-# Example init.d script with LSB support.
-#
-# Please read this init.d carefully and modify the sections to
-# adjust it to the program you want to run.
-#
-# Copyright (c) 2007 Javier Fernandez-Sanguino <jfs@debian.org>
-#
-# This is free software; you may 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,
-# or (at your option) any later version.
-#
-# This 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 with
-# the Debian operating system, in /usr/share/common-licenses/GPL; if
-# not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA 02111-1307 USA
-#
-### BEGIN INIT INFO
-# Provides: zouba
-# Required-Start: $network $local_fs
-# Required-Stop:
-# Should-Start: $named
-# Should-Stop:
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: <Enter a short description of the sortware>
-# Description: <Enter a long description of the software>
-# <...>
-# <...>
-### END INIT INFO
-
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-
-DAEMON=/usr/sbin/zouba # Introduce the server's location here
-NAME=#PACKAGE # Introduce the short server's name here
-DESC=#PACKAGE # Introduce a short description here
-LOGDIR=/var/log/zouba # Log directory to use
-
-PIDFILE=/var/run/$NAME.pid
-
-test -x $DAEMON || exit 0
-
-. /lib/lsb/init-functions
-
-# Default options, these can be overriden by the information
-# at /etc/default/$NAME
-DAEMON_OPTS="" # Additional options given to the server
-
-DIETIME=10 # Time to wait for the server to die, in seconds
- # If this value is set too low you might not
- # let some servers to die gracefully and
- # 'restart' will not work
-
-#STARTTIME=2 # Time to wait for the server to start, in seconds
- # If this value is set each time the server is
- # started (on start or restart) the script will
- # stall to try to determine if it is running
- # If it is not set and the server takes time
- # to setup a pid file the log message might
- # be a false positive (says it did not start
- # when it actually did)
-
-LOGFILE=$LOGDIR/$NAME.log # Server logfile
-#DAEMONUSER=zouba # Users to run the daemons as. If this value
- # is set start-stop-daemon will chuid the server
-
-# Include defaults if available
-if [ -f /etc/default/$NAME ] ; then
- . /etc/default/$NAME
-fi
-
-# Use this if you want the user to explicitly set 'RUN' in
-# /etc/default/
-#if [ "x$RUN" != "xyes" ] ; then
-# log_failure_msg "$NAME disabled, please adjust the configuration to your needs "
-# log_failure_msg "and then set RUN to 'yes' in /etc/default/$NAME to enable it."
-# exit 1
-#fi
-
-# Check that the user exists (if we set a user)
-# Does the user exist?
-if [ -n "$DAEMONUSER" ] ; then
- if getent passwd | grep -q "^$DAEMONUSER:"; then
- # Obtain the uid and gid
- DAEMONUID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $3}'`
- DAEMONGID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $4}'`
- else
- log_failure_msg "The user $DAEMONUSER, required to run $NAME does not exist."
- exit 1
- fi
-fi
-
-
-set -e
-
-running_pid() {
-# Check if a given process pid's cmdline matches a given name
- pid=$1
- name=$2
- [ -z "$pid" ] && return 1
- [ ! -d /proc/$pid ] && return 1
- cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
- # Is this the expected server
- [ "$cmd" != "$name" ] && return 1
- return 0
-}
-
-running() {
-# Check if the process is running looking at /proc
-# (works for all users)
-
- # No pidfile, probably no daemon present
- [ ! -f "$PIDFILE" ] && return 1
- pid=`cat $PIDFILE`
- running_pid $pid $DAEMON || return 1
- return 0
-}
-
-start_server() {
-# Start the process using the wrapper
- if [ -z "$DAEMONUSER" ] ; then
- start_daemon -p $PIDFILE $DAEMON -- $DAEMON_OPTS
- errcode=$?
- else
-# if we are using a daemonuser then change the user id
- start-stop-daemon --start --quiet --pidfile $PIDFILE \
- --chuid $DAEMONUSER \
- --exec $DAEMON -- $DAEMON_OPTS
- errcode=$?
- fi
- return $errcode
-}
-
-stop_server() {
-# Stop the process using the wrapper
- if [ -z "$DAEMONUSER" ] ; then
- killproc -p $PIDFILE $DAEMON
- errcode=$?
- else
-# if we are using a daemonuser then look for process that match
- start-stop-daemon --stop --quiet --pidfile $PIDFILE \
- --user $DAEMONUSER \
- --exec $DAEMON
- errcode=$?
- fi
-
- return $errcode
-}
-
-reload_server() {
- [ ! -f "$PIDFILE" ] && return 1
- pid=pidofproc $PIDFILE # This is the daemon's pid
- # Send a SIGHUP
- kill -1 $pid
- return $?
-}
-
-force_stop() {
-# Force the process to die killing it manually
- [ ! -e "$PIDFILE" ] && return
- if running ; then
- kill -15 $pid
- # Is it really dead?
- sleep "$DIETIME"s
- if running ; then
- kill -9 $pid
- sleep "$DIETIME"s
- if running ; then
- echo "Cannot kill $NAME (pid=$pid)!"
- exit 1
- fi
- fi
- fi
- rm -f $PIDFILE
-}
-
-
-case "$1" in
- start)
- log_daemon_msg "Starting $DESC " "$NAME"
- # Check if it's running first
- if running ; then
- log_progress_msg "apparently already running"
- log_end_msg 0
- exit 0
- fi
- if start_server ; then
- # NOTE: Some servers might die some time after they start,
- # this code will detect this issue if STARTTIME is set
- # to a reasonable value
- [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time
- if running ; then
- # It's ok, the server started and is running
- log_end_msg 0
- else
- # It is not running after we did start
- log_end_msg 1
- fi
- else
- # Either we could not start it
- log_end_msg 1
- fi
- ;;
- stop)
- log_daemon_msg "Stopping $DESC" "$NAME"
- if running ; then
- # Only stop the server if we see it running
- errcode=0
- stop_server || errcode=$?
- log_end_msg $errcode
- else
- # If it's not running don't do anything
- log_progress_msg "apparently not running"
- log_end_msg 0
- exit 0
- fi
- ;;
- force-stop)
- # First try to stop gracefully the program
- $0 stop
- if running; then
- # If it's still running try to kill it more forcefully
- log_daemon_msg "Stopping (force) $DESC" "$NAME"
- errcode=0
- force_stop || errcode=$?
- log_end_msg $errcode
- fi
- ;;
- restart|force-reload)
- log_daemon_msg "Restarting $DESC" "$NAME"
- errcode=0
- stop_server || errcode=$?
- # Wait some sensible amount, some server need this
- [ -n "$DIETIME" ] && sleep $DIETIME
- start_server || errcode=$?
- [ -n "$STARTTIME" ] && sleep $STARTTIME
- running || errcode=$?
- log_end_msg $errcode
- ;;
- status)
-
- log_daemon_msg "Checking status of $DESC" "$NAME"
- if running ; then
- log_progress_msg "running"
- log_end_msg 0
- else
- log_progress_msg "apparently not running"
- log_end_msg 1
- exit 1
- fi
- ;;
- # Use this if the daemon cannot reload
- reload)
- log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
- log_warning_msg "cannot re-read the config file (use restart)."
- ;;
- # And this if it cann
- #reload)
- #
- # If the daemon can reload its config files on the fly
- # for example by sending it SIGHUP, do it here.
- #
- # If the daemon responds to changes in its config file
- # directly anyway, make this a do-nothing entry.
- #
- # log_daemon_msg "Reloading $DESC configuration files" "$NAME"
- # if running ; then
- # reload_server
- # if ! running ; then
- # Process died after we tried to reload
- # log_progress_msg "died on reload"
- # log_end_msg 1
- # exit 1
- # fi
- # else
- # log_progress_msg "server is not running"
- # log_end_msg 1
- # exit 1
- # fi
- #;;
-
- *)
- N=/etc/init.d/$NAME
- echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
- exit 1
- ;;
-esac
-
-exit 0
+++ /dev/null
-.\" Hey, EMACS: -*- nroff -*-
-.\" First parameter, NAME, should be all caps
-.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
-.\" other parameters are allowed: see man(7), man(1)
-.TH ZOUBA SECTION "March 23, 2010"
-.\" Please adjust this date whenever revising the manpage.
-.\"
-.\" Some roff macros, for reference:
-.\" .nh disable hyphenation
-.\" .hy enable hyphenation
-.\" .ad l left justify
-.\" .ad b justify to both left and right margins
-.\" .nf disable filling
-.\" .fi enable filling
-.\" .br insert line break
-.\" .sp <n> insert n+1 empty lines
-.\" for manpage-specific macros, see man(7)
-.SH NAME
-zouba \- program to do something
-.SH SYNOPSIS
-.B zouba
-.RI [ options ] " files" ...
-.br
-.B bar
-.RI [ options ] " files" ...
-.SH DESCRIPTION
-This manual page documents briefly the
-.B zouba
-and
-.B bar
-commands.
-.PP
-.\" TeX users may be more comfortable with the \fB<whatever>\fP and
-.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
-.\" respectively.
-\fBzouba\fP is a program that...
-.SH OPTIONS
-These programs follow the usual GNU command line syntax, with long
-options starting with two dashes (`-').
-A summary of options is included below.
-For a complete description, see the Info files.
-.TP
-.B \-h, \-\-help
-Show summary of options.
-.TP
-.B \-v, \-\-version
-Show version of program.
-.SH SEE ALSO
-.BR bar (1),
-.BR baz (1).
-.br
-The programs are documented fully by
-.IR "The Rise and Fall of a Fooish Bar" ,
-available via the Info system.
-.SH AUTHOR
-zouba was written by <upstream author>.
-.PP
-This manual page was written by Max Waterman <davidmaxwaterman@jeeves>,
-for the Debian project (but may be used by others).
+++ /dev/null
-<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
-
-<!-- Process this file with docbook-to-man to generate an nroff manual
- page: `docbook-to-man manpage.sgml > manpage.1'. You may view
- the manual page with: `docbook-to-man manpage.sgml | nroff -man |
- less'. A typical entry in a Makefile or Makefile.am is:
-
-manpage.1: manpage.sgml
- docbook-to-man $< > $@
-
-
- The docbook-to-man binary is found in the docbook-to-man package.
- Please remember that if you create the nroff version in one of the
- debian/rules file targets (such as build), you will need to include
- docbook-to-man in your Build-Depends control field.
-
- -->
-
- <!-- Fill in your name for FIRSTNAME and SURNAME. -->
- <!ENTITY dhfirstname "<firstname>FIRSTNAME</firstname>">
- <!ENTITY dhsurname "<surname>SURNAME</surname>">
- <!-- Please adjust the date whenever revising the manpage. -->
- <!ENTITY dhdate "<date>March 23, 2010</date>">
- <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
- allowed: see man(7), man(1). -->
- <!ENTITY dhsection "<manvolnum>SECTION</manvolnum>">
- <!ENTITY dhemail "<email>davidmaxwaterman@jeeves</email>">
- <!ENTITY dhusername "Max Waterman">
- <!ENTITY dhucpackage "<refentrytitle>ZOUBA</refentrytitle>">
- <!ENTITY dhpackage "zouba">
-
- <!ENTITY debian "<productname>Debian</productname>">
- <!ENTITY gnu "<acronym>GNU</acronym>">
- <!ENTITY gpl "&gnu; <acronym>GPL</acronym>">
-]>
-
-<refentry>
- <refentryinfo>
- <address>
- &dhemail;
- </address>
- <author>
- &dhfirstname;
- &dhsurname;
- </author>
- <copyright>
- <year>2003</year>
- <holder>&dhusername;</holder>
- </copyright>
- &dhdate;
- </refentryinfo>
- <refmeta>
- &dhucpackage;
-
- &dhsection;
- </refmeta>
- <refnamediv>
- <refname>&dhpackage;</refname>
-
- <refpurpose>program to do something</refpurpose>
- </refnamediv>
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>&dhpackage;</command>
-
- <arg><option>-e <replaceable>this</replaceable></option></arg>
-
- <arg><option>--example <replaceable>that</replaceable></option></arg>
- </cmdsynopsis>
- </refsynopsisdiv>
- <refsect1>
- <title>DESCRIPTION</title>
-
- <para>This manual page documents briefly the
- <command>&dhpackage;</command> and <command>bar</command>
- commands.</para>
-
- <para>This manual page was written for the &debian; distribution
- because the original program does not have a manual page.
- Instead, it has documentation in the &gnu;
- <application>Info</application> format; see below.</para>
-
- <para><command>&dhpackage;</command> is a program that...</para>
-
- </refsect1>
- <refsect1>
- <title>OPTIONS</title>
-
- <para>These programs follow the usual &gnu; command line syntax,
- with long options starting with two dashes (`-'). A summary of
- options is included below. For a complete description, see the
- <application>Info</application> files.</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-h</option>
- <option>--help</option>
- </term>
- <listitem>
- <para>Show summary of options.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-v</option>
- <option>--version</option>
- </term>
- <listitem>
- <para>Show version of program.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1>
- <title>SEE ALSO</title>
-
- <para>bar (1), baz (1).</para>
-
- <para>The programs are documented fully by <citetitle>The Rise and
- Fall of a Fooish Bar</citetitle> available via the
- <application>Info</application> system.</para>
- </refsect1>
- <refsect1>
- <title>AUTHOR</title>
-
- <para>This manual page was written by &dhusername; &dhemail; for
- the &debian; system (but may be used by others). Permission is
- granted to copy, distribute and/or modify this document under
- the terms of the &gnu; General Public License, Version 2 any
- later version published by the Free Software Foundation.
- </para>
- <para>
- On Debian systems, the complete text of the GNU General Public
- License can be found in /usr/share/common-licenses/GPL.
- </para>
-
- </refsect1>
-</refentry>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-omittag:t
-sgml-shorttag:t
-sgml-minimize-attributes:nil
-sgml-always-quote-attributes:t
-sgml-indent-step:2
-sgml-indent-data:t
-sgml-parent-document:nil
-sgml-default-dtd-file:nil
-sgml-exposed-tags:nil
-sgml-local-catalogs:nil
-sgml-local-ecat-files:nil
-End:
--->
-
-
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
-"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-
-<!--
-
-`xsltproc -''-nonet \
- -''-param man.charmap.use.subset "0" \
- -''-param make.year.ranges "1" \
- -''-param make.single.year.ranges "1" \
- /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
- manpage.xml'
-
-A manual page <package>.<section> will be generated. You may view the
-manual page with: nroff -man <package>.<section> | less'. A typical entry
-in a Makefile or Makefile.am is:
-
-DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
-XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
-
-manpage.1: manpage.xml
- $(XP) $(DB2MAN) $<
-
-The xsltproc binary is found in the xsltproc package. The XSL files are in
-docbook-xsl. A description of the parameters you can use can be found in the
-docbook-xsl-doc-* packages. Please remember that if you create the nroff
-version in one of the debian/rules file targets (such as build), you will need
-to include xsltproc and docbook-xsl in your Build-Depends control field.
-Alternatively use the xmlto command/package. That will also automatically
-pull in xsltproc and docbook-xsl.
-
-Notes for using docbook2x: docbook2x-man does not automatically create the
-AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
-<refsect1> ... </refsect1>.
-
-To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
-read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
-found in the docbook-xsl-doc-html package.
-
-Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
-
-General documentation about man-pages and man-page-formatting:
-man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
-
--->
-
- <!-- Fill in your name for FIRSTNAME and SURNAME. -->
- <!ENTITY dhfirstname "FIRSTNAME">
- <!ENTITY dhsurname "SURNAME">
- <!-- dhusername could also be set to "&firstname; &surname;". -->
- <!ENTITY dhusername "Max Waterman">
- <!ENTITY dhemail "davidmaxwaterman@jeeves">
- <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
- allowed: see man(7), man(1) and
- http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
- <!ENTITY dhsection "SECTION">
- <!-- TITLE should be something like "User commands" or similar (see
- http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
- <!ENTITY dhtitle "zouba User Manual">
- <!ENTITY dhucpackage "ZOUBA">
- <!ENTITY dhpackage "zouba">
-]>
-
-<refentry>
- <refentryinfo>
- <title>&dhtitle;</title>
- <productname>&dhpackage;</productname>
- <authorgroup>
- <author>
- <firstname>&dhfirstname;</firstname>
- <surname>&dhsurname;</surname>
- <contrib>Wrote this manpage for the Debian system.</contrib>
- <address>
- <email>&dhemail;</email>
- </address>
- </author>
- </authorgroup>
- <copyright>
- <year>2007</year>
- <holder>&dhusername;</holder>
- </copyright>
- <legalnotice>
- <para>This manual page was written for the Debian system
- (but may be used by others).</para>
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU General Public License,
- Version 2 or (at your option) any later version published by
- the Free Software Foundation.</para>
- <para>On Debian systems, the complete text of the GNU General Public
- License can be found in
- <filename>/usr/share/common-licenses/GPL</filename>.</para>
- </legalnotice>
- </refentryinfo>
- <refmeta>
- <refentrytitle>&dhucpackage;</refentrytitle>
- <manvolnum>&dhsection;</manvolnum>
- </refmeta>
- <refnamediv>
- <refname>&dhpackage;</refname>
- <refpurpose>program to do something</refpurpose>
- </refnamediv>
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>&dhpackage;</command>
- <!-- These are several examples, how syntaxes could look -->
- <arg choice="plain"><option>-e <replaceable>this</replaceable></option></arg>
- <arg choice="opt"><option>--example=<parameter>that</parameter></option></arg>
- <arg choice="opt">
- <group choice="req">
- <arg choice="plain"><option>-e</option></arg>
- <arg choice="plain"><option>--example</option></arg>
- </group>
- <replaceable class="option">this</replaceable>
- </arg>
- <arg choice="opt">
- <group choice="req">
- <arg choice="plain"><option>-e</option></arg>
- <arg choice="plain"><option>--example</option></arg>
- </group>
- <group choice="req">
- <arg choice="plain"><replaceable>this</replaceable></arg>
- <arg choice="plain"><replaceable>that</replaceable></arg>
- </group>
- </arg>
- </cmdsynopsis>
- <cmdsynopsis>
- <command>&dhpackage;</command>
- <!-- Normally the help and version options make the programs stop
- right after outputting the requested information. -->
- <group choice="opt">
- <arg choice="plain">
- <group choice="req">
- <arg choice="plain"><option>-h</option></arg>
- <arg choice="plain"><option>--help</option></arg>
- </group>
- </arg>
- <arg choice="plain">
- <group choice="req">
- <arg choice="plain"><option>-v</option></arg>
- <arg choice="plain"><option>--version</option></arg>
- </group>
- </arg>
- </group>
- </cmdsynopsis>
- </refsynopsisdiv>
- <refsect1 id="description">
- <title>DESCRIPTION</title>
- <para>This manual page documents briefly the
- <command>&dhpackage;</command> and <command>bar</command>
- commands.</para>
- <para>This manual page was written for the Debian distribution
- because the original program does not have a manual page.
- Instead, it has documentation in the GNU <citerefentry>
- <refentrytitle>info</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry> format; see below.</para>
- <para><command>&dhpackage;</command> is a program that...</para>
- </refsect1>
- <refsect1 id="options">
- <title>OPTIONS</title>
- <para>The program follows the usual GNU command line syntax,
- with long options starting with two dashes (`-'). A summary of
- options is included below. For a complete description, see the
- <citerefentry>
- <refentrytitle>info</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry> files.</para>
- <variablelist>
- <!-- Use the variablelist.term.separator and the
- variablelist.term.break.after parameters to
- control the term elements. -->
- <varlistentry>
- <term><option>-e <replaceable>this</replaceable></option></term>
- <term><option>--example=<replaceable>that</replaceable></option></term>
- <listitem>
- <para>Does this and that.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-h</option></term>
- <term><option>--help</option></term>
- <listitem>
- <para>Show summary of options.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-v</option></term>
- <term><option>--version</option></term>
- <listitem>
- <para>Show version of program.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1 id="files">
- <title>FILES</title>
- <variablelist>
- <varlistentry>
- <term><filename>/etc/foo.conf</filename></term>
- <listitem>
- <para>The system-wide configuration file to control the
- behaviour of <application>&dhpackage;</application>. See
- <citerefentry>
- <refentrytitle>foo.conf</refentrytitle>
- <manvolnum>5</manvolnum>
- </citerefentry> for further details.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><filename>${HOME}/.foo.conf</filename></term>
- <listitem>
- <para>The per-user configuration file to control the
- behaviour of <application>&dhpackage;</application>. See
- <citerefentry>
- <refentrytitle>foo.conf</refentrytitle>
- <manvolnum>5</manvolnum>
- </citerefentry> for further details.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1 id="environment">
- <title>ENVIONMENT</title>
- <variablelist>
- <varlistentry>
- <term><envar>FOO_CONF</envar></term>
- <listitem>
- <para>If used, the defined file is used as configuration
- file (see also <xref linkend="files"/>).</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1 id="diagnostics">
- <title>DIAGNOSTICS</title>
- <para>The following diagnostics may be issued
- on <filename class="devicefile">stderr</filename>:</para>
- <variablelist>
- <varlistentry>
- <term><errortext>Bad configuration file. Exiting.</errortext></term>
- <listitem>
- <para>The configuration file seems to contain a broken configuration
- line. Use the <option>--verbose</option> option, to get more info.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para><command>&dhpackage;</command> provides some return codes, that can
- be used in scripts:</para>
- <segmentedlist>
- <segtitle>Code</segtitle>
- <segtitle>Diagnostic</segtitle>
- <seglistitem>
- <seg><errorcode>0</errorcode></seg>
- <seg>Program exited successfully.</seg>
- </seglistitem>
- <seglistitem>
- <seg><errorcode>1</errorcode></seg>
- <seg>The configuration file seems to be broken.</seg>
- </seglistitem>
- </segmentedlist>
- </refsect1>
- <refsect1 id="bugs">
- <!-- Or use this section to tell about upstream BTS. -->
- <title>BUGS</title>
- <para>The program is currently limited to only work
- with the <package>foobar</package> library.</para>
- <para>The upstreams <acronym>BTS</acronym> can be found
- at <ulink url="http://bugzilla.foo.tld"/>.</para>
- </refsect1>
- <refsect1 id="see_also">
- <title>SEE ALSO</title>
- <!-- In alpabetical order. -->
- <para><citerefentry>
- <refentrytitle>bar</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry>, <citerefentry>
- <refentrytitle>baz</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry>, <citerefentry>
- <refentrytitle>foo.conf</refentrytitle>
- <manvolnum>5</manvolnum>
- </citerefentry></para>
- <para>The programs are documented fully by <citetitle>The Rise and
- Fall of a Fooish Bar</citetitle> available via the <citerefentry>
- <refentrytitle>info</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry> system.</para>
- </refsect1>
-</refentry>
-
+++ /dev/null
-?package(zouba):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\
- title="zouba" command="/usr/bin/zouba"
+++ /dev/null
-#!/bin/sh
-# postinst script for zouba
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-# * <postinst> `configure' <most-recently-configured-version>
-# * <old-postinst> `abort-upgrade' <new version>
-# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
-# <new-version>
-# * <postinst> `abort-remove'
-# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
-# <failed-install-package> <version> `removing'
-# <conflicting-package> <version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
- configure)
- ;;
-
- abort-upgrade|abort-remove|abort-deconfigure)
- ;;
-
- *)
- echo "postinst called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
-
-
+++ /dev/null
-#!/bin/sh
-# postrm script for zouba
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-# * <postrm> `remove'
-# * <postrm> `purge'
-# * <old-postrm> `upgrade' <new-version>
-# * <new-postrm> `failed-upgrade' <old-version>
-# * <new-postrm> `abort-install'
-# * <new-postrm> `abort-install' <old-version>
-# * <new-postrm> `abort-upgrade' <old-version>
-# * <disappearer's-postrm> `disappear' <overwriter>
-# <overwriter-version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
- purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
- ;;
-
- *)
- echo "postrm called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
-
-
+++ /dev/null
-#!/bin/sh
-# preinst script for zouba
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-# * <new-preinst> `install'
-# * <new-preinst> `install' <old-version>
-# * <new-preinst> `upgrade' <old-version>
-# * <old-preinst> `abort-upgrade' <new-version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
- install|upgrade)
- ;;
-
- abort-upgrade)
- ;;
-
- *)
- echo "preinst called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
-
-
+++ /dev/null
-#!/bin/sh
-# prerm script for zouba
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-# * <prerm> `remove'
-# * <old-prerm> `upgrade' <new-version>
-# * <new-prerm> `failed-upgrade' <old-version>
-# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
-# * <deconfigured's-prerm> `deconfigure' `in-favour'
-# <package-being-installed> <version> `removing'
-# <conflicting-package> <version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
- remove|upgrade|deconfigure)
- ;;
-
- failed-upgrade)
- ;;
-
- *)
- echo "prerm called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
-
-
+++ /dev/null
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-
-
-
-
-configure: configure-stamp
-configure-stamp:
- dh_testdir
- # Add here commands to configure the package.
-
- qmake
- touch configure-stamp
-
-
-build: build-stamp
-
-build-stamp: configure-stamp
- dh_testdir
-
- # Add here commands to compile the package.
- $(MAKE)
- #docbook-to-man debian/zouba.sgml > zouba.1
-
- touch $@
-
-clean:
- dh_testdir
- dh_testroot
- rm -f build-stamp configure-stamp
-
- # Add here commands to clean up after the build process.
- -$(MAKE) clean
-
- dh_clean
-
-install: build
- dh_testdir
- dh_testroot
- dh_clean -k
- dh_installdirs
-
- # Add here commands to install the package into debian/zouba.
- $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/zouba install
-
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
- dh_testdir
- dh_testroot
- dh_installchangelogs
- dh_installdocs
- dh_installexamples
-# dh_install
-# dh_installmenu
-# dh_installdebconf
-# dh_installlogrotate
-# dh_installemacsen
-# dh_installpam
-# dh_installmime
-# dh_python
-# dh_installinit
-# dh_installcron
-# dh_installinfo
- dh_installman
- dh_link
- dh_strip
- dh_compress
- dh_fixperms
-# dh_perl
-# dh_makeshlibs
- dh_installdeb
- dh_shlibdeps
- dh_gencontrol
- dh_md5sums
- dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install configure
+++ /dev/null
-# Example watch control file for uscan
-# Rename this file to "watch" and then you can run the "uscan" command
-# to check for upstream updates and more.
-# See uscan(1) for format
-
-# Compulsory line, this is a version 3 file
-version=3
-
-# Uncomment to examine a Webpage
-# <Webpage URL> <string match>
-#http://www.example.com/downloads.php zouba-(.*)\.tar\.gz
-
-# Uncomment to examine a Webserver directory
-#http://www.example.com/pub/zouba-(.*)\.tar\.gz
-
-# Uncommment to examine a FTP server
-#ftp://ftp.example.com/pub/zouba-(.*)\.tar\.gz debian uupdate
-
-# Uncomment to find new files on sourceforge, for devscripts >= 2.9
-# http://sf.net/zouba/zouba-(.*)\.tar\.gz
-
-# Uncomment to find new files on GooglePages
-# http://example.googlepages.com/foo.html zouba-(.*)\.tar\.gz
+++ /dev/null
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installdirs
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installdirs
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
-dh_installdirs
-dh_installchangelogs
-dh_installdocs
-dh_installexamples
-dh_installman
-dh_link
-dh_strip
-dh_compress
-dh_fixperms
-dh_installdeb
-dh_gencontrol
-dh_md5sums
-dh_builddeb
+++ /dev/null
-# Defaults for zouba initscript
-# sourced by /etc/init.d/zouba
-# installed at /etc/default/zouba by the maintainer scripts
-
-#
-# This is a POSIX shell fragment
-#
-
-# Additional options that are passed to the Daemon.
-DAEMON_OPTS=""
+++ /dev/null
-Document: zouba
-Title: Debian zouba Manual
-Author: <insert document author here>
-Abstract: This manual describes what zouba is
- and how it can be used to
- manage online manuals on Debian systems.
-Section: unknown
-
-Format: debiandoc-sgml
-Files: /usr/share/doc/zouba/zouba.sgml.gz
-
-Format: postscript
-Files: /usr/share/doc/zouba/zouba.ps.gz
-
-Format: text
-Files: /usr/share/doc/zouba/zouba.text.gz
-
-Format: HTML
-Index: /usr/share/doc/zouba/html/index.html
-Files: /usr/share/doc/zouba/html/*.html
-
-
+++ /dev/null
-755 root root . usr /
-755 root root . usr/share /
-755 root root . usr/share/doc /
-755 root root . usr/share/doc/zouba /
-644 root root . usr/share/doc/zouba/changelog.gz debian/zouba/usr/share/doc/zouba/changelog.gz
-644 root root . usr/share/doc/zouba/README.Debian debian/zouba/usr/share/doc/zouba/README.Debian
-644 root root . usr/share/doc/zouba/copyright debian/zouba/usr/share/doc/zouba/copyright
-755 root root . usr/share/applications /
-755 root root . usr/share/applications/hildon /
-644 root root . usr/share/applications/hildon/zouba.desktop debian/zouba/usr/share/applications/hildon/zouba.desktop
-755 root root . usr/share/icons /
-755 root root . usr/share/icons/hicolor /
-755 root root . usr/share/icons/hicolor/64x64 /
-755 root root . usr/share/icons/hicolor/64x64/apps /
-644 root root . usr/share/icons/hicolor/64x64/apps/zouba.png debian/zouba/usr/share/icons/hicolor/64x64/apps/zouba.png
-755 root root . usr/bin /
-755 root root . usr/bin/zouba debian/zouba/usr/bin/zouba
-755 root root . usr/sbin /
+++ /dev/null
-#include "qgeopositioninfo.h"
+++ /dev/null
-#include "qgeopositioninfosource.h"
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QGEOCOORDINATE_H
-#define QGEOCOORDINATE_H
-
-#include "qmobilityglobal.h"
-
-#include <QString>
-
-QT_BEGIN_NAMESPACE
-class QDebug;
-class QDataStream;
-QT_END_NAMESPACE
-
-QT_BEGIN_HEADER
-
-QTM_BEGIN_NAMESPACE
-
-class QGeoCoordinatePrivate;
-class Q_LOCATION_EXPORT QGeoCoordinate
-{
-public:
- enum CoordinateType {
- InvalidCoordinate,
- Coordinate2D,
- Coordinate3D
- };
-
- enum CoordinateFormat {
- Degrees,
- DegreesWithHemisphere,
- DegreesMinutes,
- DegreesMinutesWithHemisphere,
- DegreesMinutesSeconds,
- DegreesMinutesSecondsWithHemisphere
- };
-
- QGeoCoordinate();
- QGeoCoordinate(double latitude, double longitude);
- QGeoCoordinate(double latitude, double longitude, double altitude);
- QGeoCoordinate(const QGeoCoordinate &other);
- ~QGeoCoordinate();
-
- QGeoCoordinate &operator=(const QGeoCoordinate &other);
-
- bool operator==(const QGeoCoordinate &other) const;
- inline bool operator!=(const QGeoCoordinate &other) const {
- return !operator==(other);
- }
-
- bool isValid() const;
- CoordinateType type() const;
-
- void setLatitude(double latitude);
- double latitude() const;
-
- void setLongitude(double longitude);
- double longitude() const;
-
- void setAltitude(double altitude);
- double altitude() const;
-
- qreal distanceTo(const QGeoCoordinate &other) const;
- qreal azimuthTo(const QGeoCoordinate &other) const;
-
- QString toString(CoordinateFormat format = DegreesMinutesSecondsWithHemisphere) const;
-
-private:
- QGeoCoordinatePrivate *d;
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_LOCATION_EXPORT QDebug operator<<(QDebug, const QGeoCoordinate &);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoCoordinate &coordinate);
-Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate);
-#endif
-
-QTM_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QGEOPOSITIONINFO_H
-#define QGEOPOSITIONINFO_H
-
-#include "qmobilityglobal.h"
-#include "qgeocoordinate.h"
-
-#include <QDateTime>
-
-QT_BEGIN_NAMESPACE
-class QDebug;
-class QDataStream;
-QT_END_NAMESPACE
-
-QT_BEGIN_HEADER
-
-QTM_BEGIN_NAMESPACE
-
-class QGeoPositionInfoPrivate;
-class Q_LOCATION_EXPORT QGeoPositionInfo
-{
-public:
- enum Attribute {
- Direction,
- GroundSpeed,
- VerticalSpeed,
- MagneticVariation,
- HorizontalAccuracy,
- VerticalAccuracy
- };
-
- QGeoPositionInfo();
- QGeoPositionInfo(const QGeoCoordinate &coordinate, const QDateTime &updateTime);
- QGeoPositionInfo(const QGeoPositionInfo &other);
- ~QGeoPositionInfo();
-
- QGeoPositionInfo &operator=(const QGeoPositionInfo &other);
-
- bool operator==(const QGeoPositionInfo &other) const;
- inline bool operator!=(const QGeoPositionInfo &other) const {
- return !operator==(other);
- }
-
- bool isValid() const;
-
- void setDateTime(const QDateTime &dateTime);
- QDateTime dateTime() const;
-
- void setCoordinate(const QGeoCoordinate &coordinate);
- QGeoCoordinate coordinate() const;
-
- void setAttribute(Attribute attribute, qreal value);
- qreal attribute(Attribute attribute) const;
- void removeAttribute(Attribute attribute);
- bool hasAttribute(Attribute attribute) const;
-
-private:
-#ifndef QT_NO_DEBUG_STREAM
- friend Q_LOCATION_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &update);
-#endif
-#ifndef QT_NO_DATASTREAM
- friend Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &update);
- friend Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &update);
-#endif
- QGeoPositionInfoPrivate *d;
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_LOCATION_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &update);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &update);
-Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &update);
-#endif
-
-QTM_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QGEOPOSITIONINFOSOURCE_H
-#define QGEOPOSITIONINFOSOURCE_H
-
-#include "qmobilityglobal.h"
-#include "qgeopositioninfo.h"
-
-#include <QObject>
-
-QT_BEGIN_HEADER
-
-QTM_BEGIN_NAMESPACE
-
-class QGeoPositionInfoSourcePrivate;
-class Q_LOCATION_EXPORT QGeoPositionInfoSource : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval)
- Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval)
-
-public:
- enum PositioningMethod {
- SatellitePositioningMethods = 0x000000ff,
- NonSatellitePositioningMethods = 0xffffff00,
- AllPositioningMethods = 0xffffffff
- };
- Q_DECLARE_FLAGS(PositioningMethods, PositioningMethod)
-
- explicit QGeoPositionInfoSource(QObject *parent);
- virtual ~QGeoPositionInfoSource();
-
- virtual void setUpdateInterval(int msec);
- int updateInterval() const;
-
- virtual void setPreferredPositioningMethods(PositioningMethods methods);
- PositioningMethods preferredPositioningMethods() const;
-
- virtual QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0;
-
- virtual PositioningMethods supportedPositioningMethods() const = 0;
- virtual int minimumUpdateInterval() const = 0;
-
- static QGeoPositionInfoSource *createDefaultSource(QObject *parent);
-
-public Q_SLOTS:
- virtual void startUpdates() = 0;
- virtual void stopUpdates() = 0;
-
- virtual void requestUpdate(int timeout = 0) = 0;
-
-Q_SIGNALS:
- void positionUpdated(const QGeoPositionInfo &update);
- void updateTimeout();
-
-private:
- Q_DISABLE_COPY(QGeoPositionInfoSource)
- QGeoPositionInfoSourcePrivate *d;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoPositionInfoSource::PositioningMethods)
-
-QTM_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QMOBILITYGLOBAL_H
-#define QMOBILITYGLOBAL_H
-
-
-#define QTM_VERSION_STR "1.0.0"
-/*
- QTM_VERSION is (major << 16) + (minor << 8) + patch.
-*/
-#define QTM_VERSION 0x010000
-/*
- can be used like #if (QTM_VERSION >= QTM_VERSION_CHECK(1, 0, 0))
-*/
-#define QTM_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
-
-#define QTM_PACKAGEDATE_STR "YYYY-MM-DD"
-
-#define QTM_PACKAGE_TAG ""
-
-#if defined(QTM_BUILD_UNITTESTS)
-# include <qconfig.h>
-# if !defined(QT_BUILD_INTERNAL)
-# define QT_BUILD_INTERNAL
-# endif
-#endif
-#include <QtCore/qglobal.h>
-
-#if defined(SYMBIAN_DATABASEMANAGER_SERVER)
-# define Q_SERVICEFW_EXPORT
-#else
-# if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
-# if defined(QT_NODLL)
-# undef QT_MAKEDLL
-# undef QT_DLL
-# elif defined(QT_MAKEDLL)
-# if defined(QT_DLL)
-# undef QT_DLL
-# endif
-# if defined(QT_BUILD_BEARER_LIB)
-# define Q_BEARER_EXPORT Q_DECL_EXPORT
-# else
-# define Q_BEARER_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_CFW_LIB)
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_EXPORT
-# else
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_CONTACTS_LIB)
-# define Q_CONTACTS_EXPORT Q_DECL_EXPORT
-# else
-# define Q_CONTACTS_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_VERSIT_LIB)
-# define Q_VERSIT_EXPORT Q_DECL_EXPORT
-# else
-# define Q_VERSIT_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_LOCATION_LIB)
-# define Q_LOCATION_EXPORT Q_DECL_EXPORT
-# else
-# define Q_LOCATION_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_MESSAGING_LIB)
-# define Q_MESSAGING_EXPORT Q_DECL_EXPORT
-# else
-# define Q_MESSAGING_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_MEDIA_LIB)
-# define Q_MEDIA_EXPORT Q_DECL_EXPORT
-# else
-# define Q_MEDIA_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_SFW_LIB)
-# define Q_SERVICEFW_EXPORT Q_DECL_EXPORT
-# else
-# define Q_SERVICEFW_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_SYSINFO_LIB)
-# define Q_SYSINFO_EXPORT Q_DECL_EXPORT
-# else
-# define Q_SYSINFO_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_SENSORS_LIB)
-# define Q_SENSORS_EXPORT Q_DECL_EXPORT
-# else
-# define Q_SENSORS_EXPORT Q_DECL_IMPORT
-# endif
-# elif defined(QT_DLL) /* use a Qt DLL library */
-# define Q_BEARER_EXPORT Q_DECL_IMPORT
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT
-# define Q_CONTACTS_EXPORT Q_DECL_IMPORT
-# define Q_VERSIT_EXPORT Q_DECL_IMPORT
-# define Q_LOCATION_EXPORT Q_DECL_IMPORT
-# define Q_MEDIA_EXPORT Q_DECL_IMPORT
-# define Q_MESSAGING_EXPORT Q_DECL_IMPORT
-# define Q_SERVICEFW_EXPORT Q_DECL_IMPORT
-# define Q_SYSINFO_EXPORT Q_DECL_IMPORT
-# define Q_SENSORS_EXPORT Q_DECL_IMPORT
-# endif
-# else
-# endif
-# if !defined(Q_SERVICEFW_EXPORT)
-# if defined(QT_SHARED)
-# define Q_BEARER_EXPORT Q_DECL_EXPORT
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_EXPORT
-# define Q_CONTACTS_EXPORT Q_DECL_EXPORT
-# define Q_VERSIT_EXPORT Q_DECL_EXPORT
-# define Q_LOCATION_EXPORT Q_DECL_EXPORT
-# define Q_MEDIA_EXPORT Q_DECL_EXPORT
-# define Q_MESSAGING_EXPORT Q_DECL_EXPORT
-# define Q_SERVICEFW_EXPORT Q_DECL_EXPORT
-# define Q_SYSINFO_EXPORT Q_DECL_EXPORT
-# define Q_SENSORS_EXPORT Q_DECL_EXPORT
-# else
-# define Q_BEARER_EXPORT
-# define Q_PUBLISHSUBSCRIBE_EXPORT
-# define Q_CONTACTS_EXPORT
-# define Q_VERSIT_EXPORT
-# define Q_LOCATION_EXPORT
-# define Q_MEDIA_EXPORT
-# define Q_MESSAGING_EXPORT
-# define Q_SERVICEFW_EXPORT
-# define Q_SYSINFO_EXPORT
-# define Q_SENSORS_EXPORT
-# endif
-# endif
-#endif
-
-// The namespace is hardcoded as moc has issues resolving
-// macros which would be a prerequisite for a dynmamic namespace
-#define QTM_NAMESPACE QtMobility
-
-#ifdef QTM_NAMESPACE
-# define QTM_PREPEND_NAMESPACE(name) ::QTM_NAMESPACE::name
-# define QTM_BEGIN_NAMESPACE namespace QTM_NAMESPACE {
-# define QTM_END_NAMESPACE }
-# define QTM_USE_NAMESPACE using namespace QTM_NAMESPACE;
-#else
-# define QTM_PREPEND_NAMESPACE(name) ::name
-# define QTM_BEGIN_NAMESPACE
-# define QTM_END_NAMESPACE
-# define QTM_USE_NAMESPACE
-#endif
-
-//in case Qt is in namespace
-QT_USE_NAMESPACE
-
-#endif // QMOBILITYGLOBAL_H
+++ /dev/null
-#include "gpscontroller.h"
-#include "gpscontroller_p.h"
-
-#include <QObject>
-#include <QGeoPositionInfo>
-#include <QGeoPositionInfoSource>
-#include <QDebug>
-
-GpsController::GpsController() :
- q( new GpsControllerPrivate() )
-{
- q->init();
- q->startGps();
-}
-
-GpsController::GpsController( GpsControllerPrivate *gpsControllerPrivate ) :
- q( gpsControllerPrivate )
-{
- q->init();
- q->startGps();
-}
-
-GpsController::~GpsController()
-{
- delete q;
-}
-
-void GpsController::getGps()
-{
- Location *location;
- Location *previousLocation = q->mostRecentlyReportedLocation();
-
- if ( q->useFakeLocation() ) {
- location = q->fakeLocation();
- } else {
- location = q->liveLocation();
- }
-
- if ( location != previousLocation ) {
- emit locationChanged( location );
- }
-}
-
-void GpsController::useLiveGps()
-{
- q->setUseFakeLocation( false );
- q->startGps();
- emit locationChanged( q->liveLocation() );
-}
-
-void GpsController::useFakeGps( const QString &fakeLocationLabel )
-{
- qDebug() << "using fake gps (" << fakeLocationLabel << ")";
-
- q->setFakeLocationLabel( fakeLocationLabel );
- Location *fakeLocation = q->fakeLocation();
-
- if ( fakeLocation == 0 ) {
- qDebug() << "invalid fake location label; cannot use fake location";
- } else {
- q->stopGps();
- q->setUseFakeLocation( true );
- emit locationChanged( fakeLocation );
- }
-}
+++ /dev/null
-#ifndef GPSCONTROLLER_H
-#define GPSCONTROLLER_H
-
-#include "location.h"
-
-#include "gpscontroller_p.h"
-
-#include <QObject>
-#include <QGeoPositionInfo>
-#include <QGeoPositionInfoSource>
-
-QTM_USE_NAMESPACE
-
-class GpsController : public QObject
-{
- Q_OBJECT
-
-public:
- GpsController();
- GpsController( GpsControllerPrivate *gpsControllerPrivate );
-
- ~GpsController();
-
-public Q_SLOTS:
- void getGps();
- void useFakeGps( const QString &fakeLocationLabel );
- void useLiveGps();
-
-Q_SIGNALS:
- void locationChanged( Location *newLocation );
-
-private:
- GpsControllerPrivate *q;
-};
-
-#endif // GPSCONTROLLER_H
+++ /dev/null
-#include "gpscontroller_p.h"
-
-#include "location.h"
-#include "locations.h"
-
-#include <QObject>
-#include <QGeoPositionInfo>
-#include <QGeoPositionInfoSource>
-#include <QDebug>
-
-QTM_USE_NAMESPACE
-
-GpsControllerPrivate::GpsControllerPrivate() :
- m_gps(0),
- m_liveLocation( new Location( "livegps" ) ),
- m_fakeLocationLabel(),
- m_useFakeLocation(false)
-{
-}
-
-GpsControllerPrivate::~GpsControllerPrivate()
-{
- delete m_gps;
- m_gps = 0;
- delete m_liveLocation;
- m_liveLocation = 0;
-}
-
-void GpsControllerPrivate::init()
-{
- m_gps = QGeoPositionInfoSource::createDefaultSource(this);
- connect(
- m_gps, SIGNAL( positionUpdated( QGeoPositionInfo ) ),
- this, SLOT( updateLocation( QGeoPositionInfo ) )
- );
-}
-
-void GpsControllerPrivate::startGps()
-{
- m_gps->startUpdates();
-}
-
-void GpsControllerPrivate::stopGps()
-{
- m_gps->stopUpdates();
-}
-
-QGeoPositionInfoSource *GpsControllerPrivate::gps()
-{
- return m_gps;
-}
-
-void GpsControllerPrivate::setGps( QGeoPositionInfoSource *gps )
-{
- m_gps = gps;
-}
-
-Location *GpsControllerPrivate::liveLocation()
-{
- m_mostRecentlyReportedLocation = m_liveLocation;
- return m_liveLocation;
-}
-
-Location *GpsControllerPrivate::fakeLocation()
-{
- Locations locations;
- Location *location = locations.location( fakeLocationLabel() );
- m_mostRecentlyReportedLocation = location;
- return location;
-}
-
-QString GpsControllerPrivate::fakeLocationLabel()
-{
- return m_fakeLocationLabel;
-}
-
-void GpsControllerPrivate::setFakeLocationLabel( const QString &label )
-{
- m_fakeLocationLabel = label;
-}
-
-bool GpsControllerPrivate::useFakeLocation()
-{
- return m_useFakeLocation;
-}
-
-void GpsControllerPrivate::setUseFakeLocation( bool useFake )
-{
- m_useFakeLocation = useFake;
-}
-
-void GpsControllerPrivate::updateLocation( QGeoPositionInfo positionInfo )
-{
- m_liveLocation->setLocation( positionInfo );
-}
-
-Location *GpsControllerPrivate::mostRecentlyReportedLocation()
-{
- return m_mostRecentlyReportedLocation;
-}
+++ /dev/null
-#ifndef GPSCONTROLLER_P_H
-#define GPSCONTROLLER_P_H
-
-#include <QGeoPositionInfo>
-#include <QGeoPositionInfoSource>
-
-QTM_USE_NAMESPACE
-
-class Location;
-
-class GpsControllerPrivate : public QObject
-{
- Q_OBJECT
-
-public:
- GpsControllerPrivate();
- ~GpsControllerPrivate();
-
- virtual void init();
- virtual void startGps();
- virtual void stopGps();
-
- virtual void setGps( QGeoPositionInfoSource *gps );
- virtual void setFakeLocationLabel( const QString &label );
- virtual void setUseFakeLocation( bool useFake );
-
- virtual QGeoPositionInfoSource *gps();
- virtual Location *liveLocation();
- virtual Location *fakeLocation();
- virtual Location *mostRecentlyReportedLocation();
- virtual QString fakeLocationLabel();
- virtual bool useFakeLocation();
-
-private Q_SLOTS:
- virtual void updateLocation( QGeoPositionInfo positionInfo );
-
-private:
- QGeoPositionInfoSource *m_gps;
- Location *m_liveLocation;
- QString m_fakeLocationLabel;
- bool m_useFakeLocation;
- Location *m_mostRecentlyReportedLocation;
-};
-
-#endif //GPSCONTROLLER_P_H
+++ /dev/null
-#include "location.h"
-
-#include "location_p.h"
-
-#include "ytv.h"
-
-#include <QString>
-#include <QObject>
-#include <QNetworkAccessManager>
-#include <QUrl>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QXmlStreamReader>
-#include <QDebug>
-#include <QXmlStreamAttributes>
-#include <QStringRef>
-#include <QGeoPositionInfo>
-
-#include <math.h>
-
-const double Location::KkjZoneInfo[6][2] = {
- {18.0, 500000.0},
- {21.0, 1500000.0},
- {24.0, 2500000.0},
- {27.0, 3500000.0},
- {30.0, 4500000.0},
- {33.0, 5500000.0}
-};
-
-QTM_USE_NAMESPACE
-
-Location::Location( const QString &x, const QString &y, const QString &label ) :
- q( new LocationPrivate( x, y, label ) ),
- manager( new QNetworkAccessManager(this) )
-{
- connect(
- manager, SIGNAL( finished(QNetworkReply*) ),
- this, SLOT( replyFinished(QNetworkReply*) )
- );
-}
-
-Location::Location( const QGeoPositionInfo &positionInfo, const QString &label ) :
- q( new LocationPrivate( label ) ),
- manager(0)
-{
- setLocation( positionInfo );
-}
-
-void Location::setLocation( const QGeoPositionInfo &positionInfo )
-{
- qreal latitude = positionInfo.coordinate().latitude();
- qreal longitude = positionInfo.coordinate().longitude();
-
- KKJ outX(0);
- KKJ outY(0);
-
- WGS84lola_to_KKJxy( longitude, latitude, &outX, &outY);
-
- q->setX( outX );
- q->setY( outY );
- q->setValid( true );
-}
-
-Location::Location( const Location &from ) :
- QObject(0),
- q( new LocationPrivate( from.label() ) ),
- manager(0)
-{
- q->setAddress( from.address() );
- q->setX( from.x() );
- q->setY( from.y() );
- q->setValid( from.isValid() );
- if ( from.manager != 0 ) {
- manager = new QNetworkAccessManager(this);
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
- }
-}
-
-Location::Location( const QString &label ) :
- q( new LocationPrivate( label ) ),
- manager( new QNetworkAccessManager(this) )
-{
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
-}
-
-Location::~Location()
-{
- delete q;
- q=0;
- delete manager;
- manager=0;
-}
-
-Location &Location::operator=( const Location &from )
-{
- q = new LocationPrivate( from.label() );
- q->setAddress( from.address() );
- q->setX( from.x() );
- q->setY( from.y() );
- q->setValid( from.isValid() );
-
- if ( from.manager != 0 ) {
- manager = new QNetworkAccessManager(this);
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
- } else {
- manager = 0;
- }
-
- return *this;
-}
-
-void Location::resolveAddress( const QString &address )
-{
- qDebug() << "resolving address (" << address << ")";
-
- q->setAddress( address );
- q->setValid( false );
-
- QUrl fullUrl( Ytv::Url );
-
- fullUrl.addEncodedQueryItem( "key", address.toAscii().toPercentEncoding() );
- fullUrl.addQueryItem( "user", Ytv::Username );
- fullUrl.addQueryItem( "pass", Ytv::Password );
-
- manager->get( QNetworkRequest( fullUrl ) );
- qDebug() << "waiting for reply from Ytv";
- emit( busy( true ) );
-}
-
-void Location::replyFinished( QNetworkReply * reply )
-{
- qDebug() << "address resolved";
- q->parseReply( reply->readAll() );
-
- if ( isValid() ) {
- qDebug() << label() << "becomeValid";
- emit( becomeValid() );
- } else {
- qDebug() << label() << "not valid";
- emit( becomeInValid() );
- }
-
- emit( busy( false ) );
-}
-
-QString Location::x() const
-{
- return q->x();
-}
-
-QString Location::y() const
-{
- return q->y();
-}
-
-void Location::setLabel( const QString &label ) const
-{
- q->setLabel( label );
-}
-
-QString Location::label() const
-{
- return q->label();
-}
-
-void Location::setAddress( const QString &address ) const
-{
- qDebug() << "setting address to" << address;
- q->setAddress( address );
-}
-
-QString Location::address() const
-{
- return q->address();
-}
-
-bool Location::isValid() const
-{
- return q->isValid();
-}
-
-// Degrees to radians
-double Location::radians(double deg)
-{
- return deg * M_PI / 180.0;
-}
-
-// Radians to degrees
-double Location::degrees(double rad)
-{
- return rad * 180.0 / M_PI;
-}
-
-// Function: KKJ_Zone_I
-int Location::KKJ_Zone_I(KKJ easting)
-{
- int zoneNumber = floor(easting / 1000000.0);
- if (zoneNumber < 0 || zoneNumber > 5) {
- zoneNumber = -1;
- }
-
- return zoneNumber;
-}
-
-// Function: KKJ_Zone_Lo
-int Location::KKJ_Zone_Lo(double kkjlo)
-{
- // determine the zonenumber from KKJ easting
- // takes KKJ zone which has center meridian
- // longitude nearest (in math value) to
- // the given KKJ longitude
- int zoneNumber = 5;
- while (zoneNumber >= 0) {
- if (fabs(kkjlo - KkjZoneInfo[zoneNumber][0]) <= 1.5) {
- break;
- }
- zoneNumber--;
- }
-
- return zoneNumber;
-}
-
-
-// Function: KKJlalo_to_WGS84lalo
-void Location::KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude)
-{
- double dLa = radians(0.124867E+01 + -0.269982E+00 * kkjla + 0.191330E+00 * kkjlo + 0.356119E-02 * kkjla * kkjla + -0.122312E-02 * kkjla * kkjlo + -0.335514E-03 * kkjlo * kkjlo) / 3600.0;
- double dLo = radians(-0.286111E+02 + 0.114183E+01 * kkjla + -0.581428E+00 * kkjlo + -0.152421E-01 * kkjla * kkjla + 0.118177E-01 * kkjla * kkjlo + 0.826646E-03 * kkjlo * kkjlo) / 3600.0;
-
- *outLatitude = degrees(radians(kkjla) + dLa);
- *outLongitude = degrees(radians(kkjlo) + dLo);
-}
-
-
-// Function: WGS84lalo_to_KKJlalo
-void Location::WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude)
-{
- double dLa = radians(-0.124766E+01 + 0.269941E+00 * latitude + -0.191342E+00 * longitude + -0.356086E-02 * latitude * latitude + 0.122353E-02 * latitude * longitude + 0.335456E-03 * longitude * longitude) / 3600.0;
- double dLo = radians(0.286008E+02 + -0.114139E+01 * latitude + 0.581329E+00 * longitude + 0.152376E-01 * latitude * latitude + -0.118166E-01 * latitude * longitude + -0.826201E-03 * longitude * longitude) / 3600.0;
-
- *outLatitude = degrees(radians(latitude) + dLa);
- *outLongitude = degrees(radians(longitude) + dLo);
-}
-
-
-// Function: KKJlalo_to_KKJxy
-void Location::KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY)
-{
- // Hayford ellipsoid
- double a = 6378388.0;
- double f = 1.0 / 297.0;
- double b = (1.0 - f) * a;
- double bb = b * b;
- double c = (a / b) * a;
- double ee = (a * a - bb) / bb;
- double n = (a - b) / (a + b);
- double nn = n * n;
-
- double Lo = radians(lon) - radians(KkjZoneInfo[zoneNumber][0]);
- double cosLa = cos(radians(lat));
- double NN = ee * cosLa * cosLa;
- double LaF = atan(tan(radians(lat)) / cos(Lo * sqrt(1.0 + NN)));
- double cosLaF = cos(LaF);
- double t = (tan(Lo) * cosLaF) / sqrt(1.0 + ee * cosLaF * cosLaF);
- double A = a / (1.0 + n);
- double A1 = A * (1.0 + nn / 4.0 + nn * nn / 64.0);
- double A2 = A * 1.5 * n * (1.0 - nn / 8.0);
- double A3 = A * 0.9375 * nn * (1.0 - nn / 4.0);
- double A4 = A * 35.0 / 48.0 * nn * n;
-
- *outY = A1 * LaF - A2 * sin(2.0 * LaF) + A3 * sin(4.0 * LaF) - A4 * sin(6.0 * LaF);
- *outX = c * log(t + sqrt(1.0 + t * t)) + 500000.0 + zoneNumber * 1000000.0;
-}
-
-// Function: KKJxy_to_KKJlalo
-void Location::KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
-{
- // Scan iteratively the target area, until find matching
- // KKJ coordinate value. Area is defined with Hayford Ellipsoid.
- int zoneNumber = KKJ_Zone_I(x);
- double minLo = radians(18.5);
- double maxLo = radians(32.0);
- double minLa = radians(59.0);
- double maxLa = radians(70.5);
-
- int i = 1;
- KKJ tmpX, tmpY;
-
- while (i < 35) {
- double deltaLo = maxLo - minLo;
- double deltaLa = maxLa - minLa;
- *outLongitude = degrees(minLo + 0.5 * deltaLo);
- *outLatitude = degrees(minLa + 0.5 * deltaLa);
- KKJlola_to_KKJxy(*outLongitude, *outLatitude, zoneNumber, &tmpX, &tmpY);
- if (tmpY < y) {
- minLa = minLa + 0.45 * deltaLa;
- } else {
- maxLa = minLa + 0.55 * deltaLa;
- }
-
- if (tmpX < x) {
- minLo = minLo + 0.45 * deltaLo;
- } else {
- maxLo = minLo + 0.55 * deltaLo;
- }
-
- i++;
- }
-}
-
-void Location::WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY)
-{
- double kkjlo, kkjla;
-
- WGS84lola_to_KKJlola(longitude, latitude, &kkjlo, &kkjla);
- int zoneNumber = KKJ_Zone_Lo(kkjlo);
- KKJlola_to_KKJxy(kkjlo, kkjla, zoneNumber, outX, outY);
-}
-
-void Location::KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
-{
- double kkjlo, kkjla;
-
- KKJxy_to_KKJlola(x, y, &kkjlo, &kkjla);
- KKJlola_to_WGS84lola(kkjlo, kkjla, outLongitude, outLatitude);
-
-}
-
+++ /dev/null
-#ifndef LOCATION_H
-#define LOCATION_H
-
-#include "location_p.h"
-
-#include <QString>
-#include <QObject>
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QGeoPositionInfo>
-#include <math.h>
-
-QTM_USE_NAMESPACE
-
-class Location : public QObject
-{
-Q_OBJECT
-
-public:
- Location( const QString &x, const QString &y, const QString &label=QString() );
- Location( const QGeoPositionInfo &positionInfo, const QString &label=QString() );
- Location( const Location &from );
- Location &operator=( const Location &from );
- Location( const QString &label=QString() );
-
- ~Location();
-
- QString x() const;
-
- QString y() const;
-
- void setLocation( const QGeoPositionInfo &positionInfo );
-
- void setAddress( const QString &address ) const;
- QString address() const;
-
- void setLabel( const QString &label ) const;
- QString label() const;
-
- bool isValid() const;
-
-public Q_SLOTS:
- void resolveAddress( const QString &address );
-
-Q_SIGNALS:
- void becomeValid();
- void becomeInValid();
- void busy( bool busy );
-
-private Q_SLOTS:
- void replyFinished( QNetworkReply * reply );
-
-private:
-
- LocationPrivate *q;
- QNetworkAccessManager *manager;
-
- typedef uint KKJ;
-
- /**
- * Transformes WGS84 longitude/latitude coordinates to KKJ x/y coordinates.
- * @param longitude the input longitude in degrees
- * @param latitude the input latitude in degrees
- * @param outX the result x (easting)
- * @param outY the result y (northing)
- */
- void WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY);
-
- /**
- * Transformes KKJ x/y coordinates to WGS84 longitude/latitude coordinates.
- * @param x the input x (easting)
- * @param y the input y (northing)
- * @param outLongitude the result longitude in degrees
- * @param outLatitude the result latitude in degrees
- */
- void KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
-
- // Degrees to radians
- double radians(double deg);
-
- // Radians to degrees
- double degrees(double rad);
-
- // Constants
- // Longitude0 and Center meridian of KKJ bands
- static const double KkjZoneInfo[][2];
-
- // Function: KKJ_Zone_I
- int KKJ_Zone_I(KKJ easting);
-
- // Function: KKJ_Zone_Lo
- int KKJ_Zone_Lo(double kkjlo);
-
- // Function: KKJlalo_to_WGS84lalo
- void KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude);
-
- // Function: WGS84lalo_to_KKJlalo
- void WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude);
-
- // Function: KKJlalo_to_KKJxy
- void KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY);
-
- // Function: KKJxy_to_KKJlalo
- void KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
-
-};
-
-#endif // LOCATION_H
+++ /dev/null
-#include <stdio.h>
-#include "location_p.h"
-
-#include <QXmlStreamReader>
-#include <QByteArray>
-#include <QDebug>
-#include <QMaemo5InformationBox>
-
-LocationPrivate::LocationPrivate( const QString &x, const QString &y, const QString &label ) :
- m_label(label),
- m_address(),
- m_x(x),
- m_y(y),
- m_valid(true)
-{
-}
-
-LocationPrivate::LocationPrivate( const QString &label ) :
- m_label(label),
- m_address(),
- m_x(0),
- m_y(0),
- m_valid(false)
-{
-}
-
-LocationPrivate::~LocationPrivate()
-{
- m_label="deleted";
- m_address="";
- m_x="";
- m_y="";
- m_valid=false;
-}
-
-void LocationPrivate::parseReply( const QByteArray &reply )
-{
- qDebug() << "parsing";
- QXmlStreamReader xml( reply );
- bool responseHasError = false;
-
- while ( !xml.atEnd() ) {
- xml.readNext();
-
- if ( xml.isStartElement() ) {
- QString xmlName( xml.name().toString() );
-
- if ( xmlName == "LOC" ) {
- QXmlStreamAttributes attributes( xml.attributes() );
- QStringRef xAttribute( attributes.value("x") );
- QStringRef yAttribute( attributes.value("y") );
- QString newX( xAttribute.toString() );
- QString newY( yAttribute.toString() );
-
- m_x = newX;
- m_y = newY;
- }
-
- if ( xmlName == "ERROR" ) {
- responseHasError = true;
- }
-
- }
- }
-
- if ( xml.hasError() || responseHasError ) {
- QMaemo5InformationBox::information( 0, "address resolution error - please check address" );
- qDebug() << "xml error";
- m_valid = false;
- } else {
- qDebug() << "(" << m_x << "," << m_y << ")";
- if ( m_x.isEmpty() || m_y.isEmpty() ) {
- qDebug() << "is NOT valid";
- m_valid = false;
- } else {
- qDebug() << "is now valid";
- m_valid = true;
- }
- }
-}
-
-void LocationPrivate::setLabel( const QString &label)
-{
- m_label = label;
-}
-
-QString LocationPrivate::label() const
-{
- return m_label;
-}
-
-void LocationPrivate::setAddress( const QString &address)
-{
- m_address = address;
-}
-
-QString LocationPrivate::address() const
-{
- return m_address;
-}
-
-void LocationPrivate::setX( uint x )
-{
- m_x = QString( "%1" ).arg( x );
-}
-
-void LocationPrivate::setX( const QString &x )
-{
- m_x = x;
-}
-
-QString LocationPrivate::x() const
-{
- return m_x;
-}
-
-void LocationPrivate::setY( uint y )
-{
- m_y = QString( "%1" ).arg( y );
-}
-
-void LocationPrivate::setY( const QString &y )
-{
- m_y = y;
-}
-
-QString LocationPrivate::y() const
-{
- return m_y;
-}
-
-void LocationPrivate::setValid( bool valid )
-{
- m_valid = valid;
-}
-
-bool LocationPrivate::isValid() const
-{
- return m_valid;
-}
+++ /dev/null
-#ifndef LOCATION_P_H
-#define LOCATION_P_H
-
-#include <QObject>
-#include <QString>
-#include <QByteArray>
-
-class LocationPrivate : public QObject
-{
- Q_OBJECT
-
-public:
- LocationPrivate( const QString &x, const QString &y, const QString &label );
- LocationPrivate( const QString &label );
- virtual ~LocationPrivate();
-
- void setX( uint x );
- void setX( const QString &x );
- QString x() const;
-
- void setY( uint y );
- void setY( const QString &y );
- QString y() const;
-
- void setAddress( const QString &address );
- QString address() const;
-
- void setLabel( const QString &label );
- QString label() const;
-
- void setValid( bool valid );
- bool isValid() const;
-
- void parseReply( const QByteArray &reply );
-
- QString m_label;
- QString m_address;
- QString m_x;
- QString m_y;
- bool m_valid;
-};
-
-#endif // LOCATION_P_H
-
+++ /dev/null
-#include "locations.h"
-
-#include <QDebug>
-#include <QHash>
-#include <QSettings>
-#include <QString>
-#include <QStringList>
-#include <QCoreApplication>
-
-QHash<QString,Location *> Locations::locationHash;
-bool Locations::initialised = false;
-
-Locations::Locations()
-{
- if ( !initialised ) {
- QCoreApplication::setOrganizationName("ZouBa");
- QCoreApplication::setOrganizationDomain("zouba.yi.org");
- QCoreApplication::setOrganizationName("ZouBa");
-
- restoreLocations();
- initialised = true;
- }
-}
-
-Locations::~Locations()
-{
-}
-
-bool Locations::addLocation( Location *location )
-{
- bool succeeded=false;
-
- // if it's valid now, save the setting
- if ( location->isValid() ) {
- saveLocation( location );
- }
-
- if ( !locationHash.contains( location->label() ) ) {
- qDebug() << "Adding location" << location->label();
- locationHash[ location->label() ] = location;
- succeeded = true;
- } else {
- qDebug() << "FAILED to add location" << location->label();
- }
-
- return succeeded;
-}
-
-void Locations::restoreLocations()
-{
- QSettings settings;
-
- settings.beginGroup( "Locations" );
- QStringList labels = settings.childGroups();
-
- for( int i=0; i<labels.size(); ++i ) {
- QString label = labels[i];
- settings.beginGroup( label );
- QString x = settings.value( "x" ).toString();
- QString y = settings.value( "y" ).toString();
- QString address = settings.value( "address" ).toString();
- settings.endGroup();
-
- qDebug() << "restoring" << label;
- Location *location = new Location( x, y, label );
- location->setAddress( address );
-
- locationHash[ label ] = location;
- }
-
- settings.endGroup();
-}
-
-void Locations::saveLocation( Location *location )
-{
- qDebug() << "Saving location" << location->label();
- QSettings settings;
- settings.beginGroup( "Locations" );
- settings.beginGroup( location->label() );
- settings.setValue( "address", location->address() );
- settings.setValue( "x", location->x() );
- settings.setValue( "y", location->y() );
- settings.endGroup();
- settings.endGroup();
-}
-
-void Locations::saveLocation()
-{
- Location *location = qobject_cast<Location*>(sender());
-
- saveLocation( location );
-}
-
-Location *Locations::location( const QString &label )
-{
- qDebug() << "requesting location" << label;
- Location *retVal = 0;
-
- if ( locationHash.contains( label ) ) {
- qDebug() << "found location" << label;
- retVal = locationHash[ label ];
- } else {
- qDebug() << "didn't find location" << label;
- }
-
- return retVal;
-}
+++ /dev/null
-#ifndef LOCATIONS_H
-#define LOCATIONS_H
-
-#include "location.h"
-
-#include <QHash>
-#include <QString>
-#include <QObject>
-
-class Locations: public QObject
-{
- Q_OBJECT
-
-public:
- Locations();
- ~Locations();
-
- static Locations *instance();
- bool addLocation( Location *location );
-
- Location *location( const QString &label );
-
-public Q_SLOTS:
- void saveLocation();
-
-private:
- void restoreLocations();
- static QHash<QString,Location *> locationHash;
- static bool initialised;
-
- void saveLocation( Location *location );
-};
-#endif // LOCATIONS_H
+++ /dev/null
-#include "routedata.h"
-#include "route.h"
-#include "ui.h"
-#include "uicontroller.h"
-#include "location.h"
-#include "gpscontroller.h"
-#include "ytv.h"
-
-#include <QDebug>
-#include <QObject>
-#include <QApplication>
-#include <QMainWindow>
-
-int main(int argc, char *argv[] )
-{
- QApplication app(argc, argv);
-
- QMainWindow *mainWindow = new QMainWindow;
- Ui *ui = new Ui;;
- ui->setupUi(mainWindow);
-
- UiController *uiController = new UiController( ui );
- Route *route = new Route();
- GpsController *gpsController = new GpsController();
-
- QObject::connect(
- route, SIGNAL( routeReady( QList<RouteData> ) ),
- uiController, SLOT( displayRoute( QList<RouteData> ) )
- );
-
- QObject::connect(
- gpsController, SIGNAL( locationChanged( Location* ) ),
- route, SLOT( setFromLocation( Location* ) )
- );
-
- QObject::connect(
- uiController, SIGNAL( destinationChanged( Location* ) ),
- route, SLOT( setToLocation( Location* ) )
- );
-
- QObject::connect(
- uiController, SIGNAL( buttonClicked() ),
- gpsController, SLOT( getGps() )
- );
-
- QObject::connect(
- ui, SIGNAL( fakeGpsPressed( const QString & ) ),
- gpsController, SLOT( useFakeGps( const QString & ) )
- );
-
- QObject::connect(
- ui, SIGNAL( liveGpsPressed() ),
- gpsController, SLOT( useLiveGps() )
- );
-
- QObject::connect(
- route, SIGNAL( busy( bool ) ),
- ui, SLOT( setBusy( bool ) )
- );
-
- mainWindow->show();
-
- return app.exec();
-}
+++ /dev/null
-#include "route_p.h"
-#include "route.h"
-
-#include "routedata.h"
-#include "location.h"
-
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QUrl>
-#include <QObject>
-#include <QDebug>
-#include <QStringList>
-#include <QString>
-#include <QXmlStreamReader>
-#include <QWidget>
-
-#include "ytv.h"
-
-Route::Route() :
- q( new RoutePrivate( this ) ),
- manager( new QNetworkAccessManager(this) )
-{
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
-}
-
-Route::~Route()
-{
- delete manager;
- manager = 0;
-}
-
-void Route::getRoute()
-{
- qDebug() << "getting route from Ytv";
-
- QUrl fullUrl( Ytv::Url );
-
- QStringList a;
- a << q->fromLocation()->x() << q->fromLocation()->y();
- QStringList b;
- b << q->toLocation()->x() << q->toLocation()->y();
-
- fullUrl.addQueryItem( "a", a.join(",") );
- fullUrl.addQueryItem( "b", b.join(",") );
- fullUrl.addQueryItem( "show", QString::number(Ytv::ShowFiveResults) );
- fullUrl.addQueryItem( "walkspeed", QString::number(Ytv::WalkSpeedFast) );
- fullUrl.addQueryItem( "optimize", QString::number(Ytv::OptimizeLeastWalking) );
- fullUrl.addQueryItem( "user", Ytv::Username );
- fullUrl.addQueryItem( "pass", Ytv::Password );
-
- manager->get( QNetworkRequest( fullUrl ) );
- qDebug() << "getting url" << fullUrl.toEncoded();
- qDebug() << "waiting for reply from Ytv";
- emit( busy( true ) );
-}
-
-void Route::replyFinished( QNetworkReply * reply )
-{
- qDebug() << "have reply from Ytv";
- QList<RouteData> routeData = q->parseReply( reply->readAll() );
-
- emit( routeReady( routeData ) );
- emit( busy( false ) );
-}
-
-void Route::setFromLocation( Location *location )
-{
- qDebug() << "setting new From location (" << location->label() << ")";
-
- if ( location && location->isValid() ) {
- qDebug() << "From is valid";
- q->setFromLocation( location );
- if ( q->toValid() ) {
- qDebug() << "To is also valid";
- getRoute();
- } else {
- qDebug() << "To not valid - waiting";
- }
- } else {
- qDebug() << "ERROR:From is not valid";
- qDebug() << "location=" << location;
- if ( location ) {
- qDebug() << "location->isValid()=" << location->isValid();
- }
- }
-}
-
-Location *Route::fromLocation() const
-{
- return q->fromLocation();
-}
-
-void Route::setToLocation( Location *location )
-{
- qDebug() << "setting new To location (" << location->label() << ")";
-
- if ( location && location->isValid() ) {
- qDebug() << "To is valid";
- q->setToLocation( location );
- if ( q->fromValid() ) {
- qDebug() << "From is also valid";
- getRoute();
- } else {
- qDebug() << "From not valid - waiting";
- }
- } else {
- qDebug() << "ERROR:From is not valid";
- qDebug() << "location=" << location;
- if ( location ) {
- qDebug() << "location->isValid()=" << location->isValid();
- }
- }
-}
-
-Location *Route::toLocation() const
-{
- return q->toLocation();
-}
+++ /dev/null
-#ifndef ROUTE_H
-#define ROUTE_H
-
-#include "routedata.h"
-#include "location.h"
-
-#include <QObject>
-#include <QNetworkReply>
-#include <QNetworkAccessManager>
-
-class RoutePrivate;
-
-class Route: public QObject
-{
- Q_OBJECT
-
-public:
- Route();
- ~Route();
-
- /*!
- * \brief Gets the route data from the server
- */
- void getRoute();
-
- /*!
- \brief Get the from location
- \return The from location
- */
- Location *fromLocation() const;
-
- /*!
- \brief Get the to location
- \return The to location
- */
- Location *toLocation() const;
-
-public Q_SLOTS:
-
- /*!
- * \brief Sets the from location
- * \param fromLocation The from location
- */
- void setFromLocation( Location *location=0 );
-
- /*!
- * \brief Sets the to location
- * \param toLocation The to location
- */
- void setToLocation( Location *location=0 );
-
-Q_SIGNALS:
- void routeReady( QList<RouteData> );
- void busy( bool busy );
-
-private Q_SLOTS:
- void replyFinished( QNetworkReply* );
-
-private:
- RoutePrivate *q;
- QNetworkAccessManager *manager;
-};
-#endif // ROUTE_H
+++ /dev/null
-#include "route_p.h"
-#include "location.h"
-
-#include <QXmlStreamReader>
-#include <QDebug>
-#include <QList>
-#include <QFile>
-#include <QStringList>
-#include <QMaemo5InformationBox>
-
-RoutePrivate::RoutePrivate( QObject *parent ) :
- m_fromValid(false),
- m_toValid(false),
- m_fromLocation(0),
- m_toLocation(0)
-{
- Q_UNUSED( parent )
-}
-
-RoutePrivate::~RoutePrivate()
-{
-}
-
-QList<RouteData> RoutePrivate::parseReply( const QByteArray &reply )
-{
- qDebug() << "parsing route";
-
- QList<RouteData> retVal;
- RouteData routeData;
- LegData legData;
-
- QXmlStreamReader xml( reply );
-
- QHash<QString, bool> in;
- QHash<QString, bool> have;
-
- QStringList haveKeys;
- QStringList inKeys;
-
- haveKeys
- << "LINE"
- << "TIME"
- << "TRIP"
- << "DEPARTURE"
- << "ARRIVAL"
- ;
-
- inKeys
- << "ROUTE"
- << "LINE"
- << "STOP"
- << "WALK"
- << "POINT"
- ;
-
- foreach( QString key, haveKeys ) {
- have[ key ] = false;
- }
-
- foreach( QString key, inKeys ) {
- in[ key ] = false;
- }
-
- while ( !xml.atEnd() ) {
- xml.readNext();
-
- QString xmlName = xml.name().toString();
-
- if ( xml.isStartElement() ) {
- if ( inKeys.contains( xmlName ) ) {
- in[ xmlName ] = true;
- //qDebug() << "in[" << xmlName << "] = true";
- }
-
- if ( xmlName == "ROUTE" ) {
- foreach( QString key, haveKeys ) {
- have[ key ] = false;
- }
- }
-
- if ( xmlName == "WALK" ) {
- legData.m_how = "WALK";
- have[ "DEPARTURE" ] = false;
- have[ "ARRIVAL" ] = false;
- have[ "LENGTH" ] = false;
- }
-
- if ( xmlName == "LINE" ) {
- legData.m_how = "LINE";
- QString lineCode( xml.attributes().value("code").toString() );
- legData.m_lineCode = parseJORECode( lineCode );
- have[ "DEPARTURE" ] = false;
- have[ "ARRIVAL" ] = false;
- have[ "LENGTH" ] = false;
- }
- }
-
- if ( xml.isEndElement() ) {
- if ( inKeys.contains( xmlName ) ) {
- in[ xmlName ] = false;
- //qDebug() << "in[" << xmlName << "] = false";
- }
-
- if ( xmlName == "ROUTE" ) {
- retVal.append( routeData );
- routeData.clear();
- }
-
- if ( xmlName == "WALK" || xmlName == "LINE" ) {
- routeData.m_legData.append( legData );
- legData.clear();
- have[ "LENGTH" ] = false;
- }
- }
-
- if ( !have[ "ARRIVAL" ] && ( in[ "WALK" ] || in[ "LINE" ] ) && ( in[ "STOP" ] || in[ "POINT" ] ) && xml.isStartElement() && xmlName == "ARRIVAL" ) {
- QString arrivalTime( xml.attributes().value("time").toString() );
- legData.m_arrivalTime = arrivalTime.rightJustified(4).insert(2,":");
-
- // don't set have[ "ARRIVAL" ] since we want the last one of many STOPs
- }
-
- if ( !have[ "DEPARTURE" ] && in[ "LINE" ] && in[ "STOP" ] && xml.isStartElement() && xmlName == "DEPARTURE" ) {
- QString departureTime( xml.attributes().value("time").toString() );
- legData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
-
- have[ "DEPARTURE" ] = true;
- }
-
- if ( !have[ "DEPARTURE" ] && in[ "WALK" ] && ( in[ "POINT" ] || in[ "STOP" ] ) && xml.isStartElement() && xmlName == "DEPARTURE" ) {
- QString departureTime( xml.attributes().value("time").toString() );
- legData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
-
- have[ "DEPARTURE" ] = true;
- }
-
- if ( !have[ "LENGTH" ] && ( in[ "WALK" ] || in[ "LINE" ] ) && xml.isStartElement() && xmlName == "LENGTH" ) {
- legData.m_tripTime = xml.attributes().value("time").toString();
- legData.m_tripDistance = xml.attributes().value("dist").toString();
-
- have[ "LENGTH" ] = true;
- }
-
- if ( !have[ "TRIP" ] && in[ "ROUTE" ] && xml.isStartElement() && xmlName == "LENGTH" ) {
- routeData.m_tripTime = xml.attributes().value("time").toString();
- routeData.m_tripDistance = xml.attributes().value("dist").toString();
-
- have[ "TRIP" ] = true;
- }
-
- if ( !have[ "LINE" ] && in[ "ROUTE" ] && xml.isStartElement() && xmlName == "LINE" ) {
- QString lineCode( xml.attributes().value("code").toString() );
-
- routeData.m_lineCode = parseJORECode( lineCode );
- have[ "LINE" ] = true;
- }
-
- if ( !have[ "TIME" ] && in[ "ROUTE" ] && in[ "LINE" ] && in[ "STOP" ] && xmlName == "DEPARTURE" ) {
- QString departureTime( xml.attributes().value("time").toString() );
-
- routeData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
- have[ "TIME" ] = true;
- }
-
- }
-
- if ( xml.hasError() ) {
- qDebug() << "xml error:" << xml.errorString();
- }
-
- if ( retVal.isEmpty() ) {
- qDebug() << "no routes found";
- QMaemo5InformationBox::information( 0, "no routes found" );
- }
-
- return retVal;
-}
-
-void RoutePrivate::setFromLocation( Location *location )
-{
- m_fromLocation = location;
- m_fromValid = true;
-}
-
-Location *RoutePrivate::fromLocation() const
-{
- return m_fromLocation;
-}
-
-void RoutePrivate::setToLocation( Location *toLocation )
-{
- m_toLocation = toLocation;
- m_toValid = true;
-}
-
-QString RoutePrivate::parseJORECode( const QString &joreCode ) const
-{
- QString retVal;
-
- QString areaTransportTypeCode( joreCode.mid(0,1) );
- QString lineCode( joreCode.mid(1,3) );
- QString letterVariant( joreCode.mid(4,1) );
- QString letterNumberVariant( joreCode.mid(5,1) );
- QString direction( joreCode.mid(6,1) );
-
- lineCode.setNum( lineCode.toInt() );
-
- retVal = lineCode;
-
- if ( letterVariant != " " ) {
- retVal += letterVariant;
- }
-
- return retVal;
-}
-
-Location *RoutePrivate::toLocation() const
-{
- return m_toLocation;
-}
-
-bool RoutePrivate::fromValid()
-{
- return m_fromValid;
-}
-
-bool RoutePrivate::toValid()
-{
- return m_toValid;
-}
+++ /dev/null
-#ifndef ROUTE_P_H
-#define ROUTE_P_H
-
-#include "routedata.h"
-
-#include "location.h"
-
-#include <QObject>
-
-class RoutePrivate: public QObject
-{
- Q_OBJECT
-
-public:
- RoutePrivate( QObject *parent=0 );
- ~RoutePrivate();
-
- QList<RouteData> parseReply( const QByteArray &reply );
-
- Q_PROPERTY(Location* fromLocation READ fromLocation WRITE setFromLocation);
- Q_PROPERTY(Location* toLocation READ toLocation WRITE setToLocation);
-
- void setFromLocation( Location *fromLocation );
-
- Location *fromLocation() const;
-
- void setToLocation( Location *toLocation );
-
- Location *toLocation() const;
-
- bool toValid();
- bool fromValid();
-
-private:
- bool m_fromValid;
- bool m_toValid;
- Location *m_fromLocation;
- Location *m_toLocation;
-
- QString parseJORECode( const QString &joreCode ) const;
-};
-#endif // ROUTE_P_H
+++ /dev/null
-#ifndef ROUTEDATA_H
-#define ROUTEDATA_H
-
-#include <QString>
-#include <QList>
-
-struct LegData
-{
- LegData() :
- m_how(),
- m_tripTime(),
- m_tripDistance(),
- m_departureTime(),
- m_arrivalTime(),
- m_lineCode()
- {
- };
-
- LegData( QString how, QString tripTime, QString tripDistance, QString departureTime, QString arrivalTime, QString lineCode=QString() ) :
- m_how(how),
- m_tripTime(tripTime),
- m_tripDistance(tripDistance),
- m_departureTime(departureTime),
- m_arrivalTime(arrivalTime),
- m_lineCode(lineCode)
- {
- };
-
- void clear()
- {
- m_how = "";
- m_tripTime = "";
- m_tripDistance = "";
- m_departureTime = "";
- m_arrivalTime = "";
- m_lineCode = "";
- };
-
- QString m_how;
- QString m_tripTime;
- QString m_tripDistance;
- QString m_departureTime;
- QString m_arrivalTime;
- QString m_lineCode;
-
-};
-
-struct RouteData
-{
- RouteData():
- m_tripTime(),
- m_tripDistance(),
- m_departureTime(),
- m_lineCode(),
- m_legData()
- {
- };
-
- RouteData( QString tripTime, QString tripDistance, QString departureTime, QString lineCode ):
- m_tripTime(tripTime),
- m_tripDistance(tripDistance),
- m_departureTime(departureTime),
- m_lineCode(lineCode),
- m_legData()
- {
- };
-
- RouteData &operator <<(const LegData &legData)
- {
- m_legData.append( legData );
- return *this;
- };
-
- void clear()
- {
- m_tripTime = "";
- m_tripDistance = "";
- m_departureTime = "";
- m_lineCode = "";
- m_legData.clear();
- };
-
- QString m_tripTime;
- QString m_tripDistance;
- QString m_departureTime;
- QString m_lineCode;
- QList<LegData> m_legData;
-
-};
-
-#endif // ROUTEDATA_H
+++ /dev/null
-#include "ui.h"
-
-#include "locations.h"
-#include "ytv.h"
-
-#include <QMainWindow>
-#include <QRadioButton>
-#include <QTableWidget>
-#include <QString>
-#include <QRect>
-#include <QButtonGroup>
-#include <QHeaderView>
-#include <QObject>
-#include <QMenuBar>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QGridLayout>
-#include <QSizePolicy>
-#include <QInputDialog>
-#include <QDebug>
-
-Ui::Ui() :
- m_centralWidget(0),
- m_destinationButtons(0),
- m_routeStack(0),
- m_usingFakeGps( false ),
- m_fakeLocationLabel( "work" )
-{
-}
-
-Ui::~Ui()
-{
-}
-
-void Ui::setupUi( QMainWindow *mainWindow )
-{
- m_mainWindow = mainWindow;
- m_mainWindow->resize(800,480);
-
- m_menu = mainWindow->menuBar()->addMenu("Settings");
-
- QAction *setHomeAddressAction = new QAction("Set home address", this);
- QAction *setWorkAddressAction = new QAction("Set work address", this);
- m_toggleFakeGpsAction = new QAction("Use fake GPS", this);
- m_menu->addAction(setHomeAddressAction);
- m_menu->addAction(setWorkAddressAction);
- m_menu->addAction(m_toggleFakeGpsAction);
-
- connect(
- setHomeAddressAction, SIGNAL(triggered()),
- this, SLOT(setHomeAddress())
- );
- connect(
- setWorkAddressAction, SIGNAL(triggered()),
- this, SLOT(setWorkAddress())
- );
- connect(
- m_toggleFakeGpsAction, SIGNAL(triggered()),
- this, SLOT(toggleFakeGps())
- );
-
- m_centralWidget = new QWidget( m_mainWindow );
- m_mainWindow->setCentralWidget( m_centralWidget);
-
- QRadioButton *homeButton = new QRadioButton();
- homeButton->setObjectName( QString::fromUtf8("homeButton") );
- homeButton->setText( "GPS->HOME" );
- homeButton->setEnabled(false);
-
- QRadioButton *workButton = new QRadioButton();
- workButton->setObjectName( QString::fromUtf8("workButton") );
- workButton->setText( "GPS->WORK" );
- workButton->setEnabled(false);
-
- m_destinationButtons = new QButtonGroup();
- m_destinationButtons->addButton( homeButton, HomeButtonId );
- m_destinationButtons->addButton( workButton, WorkButtonId );
- m_destinationButtons->setExclusive( true );
-
- m_routeButtons = new QButtonGroup();
- m_routeButtons->setExclusive( true );
- m_routeStack = new QVBoxLayout();
- for ( int i=0; i<Ytv::ShowFiveResults; ++i ) {
- QRadioButton *button = new QRadioButton();
- button->setObjectName( "routeButton"+i );
- button->setEnabled( false );
-
- m_routeStack->addWidget( button, i );
- m_routeButtons->addButton( button, i );
- }
- m_routeStack->addStretch();
-
- QStringList headers( QStringList() << "How" << "Time" << "Dist" << "Dep" << "Arr" );
- m_routeDetailTable = new QTableWidget();
- m_routeDetailTable->setColumnCount( headers.count() );
- m_routeDetailTable->setHorizontalHeaderLabels( headers );
- m_routeDetailTable->resizeColumnsToContents();
- m_routeDetailTable->setSelectionMode( QAbstractItemView::NoSelection );
-
- QHBoxLayout *topLayout = new QHBoxLayout();
- topLayout->addLayout( m_routeStack );
- topLayout->addWidget( m_routeDetailTable );
-
- m_buttonLayout = new QGridLayout();
- m_buttonLayout->addWidget( homeButton, 0, 0 );
- m_buttonLayout->addWidget( workButton, 0, 1 );
-
- m_mainLayout = new QVBoxLayout();
- m_mainLayout->addLayout( topLayout );
- m_mainLayout->addLayout( m_buttonLayout );
-
- m_centralWidget->setLayout( m_mainLayout );
-}
-
-void Ui::setHomeAddress()
-{
- setAddress( "home" );
-}
-
-void Ui::setWorkAddress()
-{
- setAddress( "work" );
-}
-
-void Ui::toggleFakeGps()
-{
- m_usingFakeGps = !m_usingFakeGps;
-
- if ( m_usingFakeGps ) {
- useFakeGps();
- } else {
- useLiveGps();
- }
-}
-
-void Ui::useFakeGps()
-{
- emit fakeGpsPressed( m_fakeLocationLabel );
- m_toggleFakeGpsAction->setText( "Use Live GPS" );
-}
-
-void Ui::useLiveGps()
-{
- emit liveGpsPressed();
- m_toggleFakeGpsAction->setText( "Use Fake GPS" );
-}
-
-void Ui::setAddress( const QString &label )
-{
- Locations locations;
- Location *location=locations.location( label );
-
- bool ok;
- QString address = QInputDialog::getText(
- m_centralWidget,
- tr("Enter address for \""+QString(label).toLatin1()+"\""),
- tr("Address"),
- QLineEdit::Normal,
- location->address(),
- &ok
- );
-
- if ( ok ) {
- qDebug() << "new address" << address;
- Locations locations;
- Location *location = locations.location( label );
- qDebug() << "location" << location;
- if ( location ) {
- location->resolveAddress( address );
- }
- }
-}
-
-void Ui::setBusy( bool busy )
-{
- m_mainWindow->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
-}
+++ /dev/null
-#ifndef UI_H
-#define UI_H
-
-#include <QObject>
-
-class QMainWindow;
-class QWidget;
-class QTableWidget;
-class QButtonGroup;
-class QHBoxLayout;
-class QVBoxLayout;
-class QGridLayout;
-class QMenu;
-class QAction;
-class Location;
-
-class Ui : public QObject
-{
- Q_OBJECT
-
-public:
- Ui();
- ~Ui();
- void setupUi( QMainWindow *mainWindow );
-
- enum {
- HomeButtonId=0,
- WorkButtonId=1
- };
-
- enum {
- ScreenWidth=800,
- ScreenHeight=480
- };
-
- QMainWindow *m_mainWindow;
- QWidget *m_centralWidget;
- QButtonGroup *m_destinationButtons;
- QButtonGroup *m_routeButtons;
- QVBoxLayout *m_routeStack;
- QTableWidget *m_routeDetailTable;
- QVBoxLayout *m_mainLayout;
- QGridLayout *m_buttonLayout;
- QMenu *m_menu;
- QAction *m_toggleFakeGpsAction;
- QAction *m_useLiveGpsAction;
- bool m_usingFakeGps;
- QString m_fakeLocationLabel;
-
-Q_SIGNALS:
- void homeAddressChanged( QString address );
- void workAddressChanged( QString address );
- void fakeGpsPressed( const QString &fakeLocationLabel );
- void liveGpsPressed();
-
-private Q_SLOTS:
- void setHomeAddress();
- void setWorkAddress();
- void toggleFakeGps();
- void setBusy( bool busy );
-
-private:
- void useFakeGps();
- void useLiveGps();
- void setAddress( const QString &label );
-};
-#endif //UI_H
+++ /dev/null
-#include "uicontroller.h"
-#include "route.h"
-#include "ui.h"
-#include "ytv.h"
-#include "location.h"
-#include "locations.h"
-
-#include <QObject>
-#include <QPushButton>
-#include <QDebug>
-#include <QButtonGroup>
-#include <QRadioButton>
-#include <QVBoxLayout>
-#include <QTableWidgetItem>
-
-UiController::UiController( Ui *ui ) :
- m_routeData(),
- m_destination(),
- m_ui(ui),
- m_currentDestination(-1),
- m_currentRoute(-1)
-{
- Locations locations;
- Location *homeLocation = locations.location( "home" );
- Location *workLocation = locations.location( "work" );
-
- if ( homeLocation==0 ) {
- homeLocation = new Location( "home" );
- locations.addLocation( homeLocation );
- } else if ( homeLocation->isValid() ) {
- setHomeButtonValid();
- }
-
- if ( workLocation==0 ) {
- workLocation = new Location( "work" );
- locations.addLocation( workLocation );
- } else if ( workLocation->isValid() ) {
- setWorkButtonValid();
- }
-
- connect(
- homeLocation, SIGNAL( becomeValid() ),
- this, SLOT( setHomeButtonValid() )
- );
- connect(
- homeLocation, SIGNAL( becomeInValid() ),
- this, SLOT( setHomeButtonInValid() )
- );
- connect(
- homeLocation, SIGNAL( becomeValid() ),
- &locations, SLOT( saveLocation() )
- );
- connect(
- homeLocation, SIGNAL( busy( bool ) ),
- ui, SLOT( setBusy( bool ) )
- );
-
- connect(
- workLocation, SIGNAL( becomeValid() ),
- this, SLOT( setWorkButtonValid() )
- );
- connect(
- workLocation, SIGNAL( becomeInValid() ),
- this, SLOT( setWorkButtonInValid() )
- );
- connect(
- workLocation, SIGNAL( becomeValid() ),
- &locations, SLOT( saveLocation() )
- );
- connect(
- workLocation, SIGNAL( busy( bool ) ),
- ui, SLOT( setBusy( bool ) )
- );
-
- m_destination.append( homeLocation );
- m_destination.append( workLocation );
-
- connect(
- m_ui->m_destinationButtons, SIGNAL( buttonClicked( int ) ),
- this, SLOT( changeDestination( int ) )
- );
-
- connect(
- m_ui->m_routeButtons, SIGNAL( buttonClicked( int ) ),
- this, SLOT( changeRoute( int ) )
- );
-}
-
-UiController::~UiController()
-{
-}
-
-void UiController::setHomeButtonInValid()
-{
- qDebug() << "setting home button invalid";
- setButtonValid( Ui::HomeButtonId, false );
-}
-
-void UiController::setHomeButtonValid()
-{
- qDebug() << "setting home button valid";
- setButtonValid( Ui::HomeButtonId, true );
-}
-
-void UiController::setWorkButtonInValid()
-{
- qDebug() << "setting work button invalid";
- setButtonValid( Ui::WorkButtonId, false );
-}
-
-void UiController::setWorkButtonValid()
-{
- qDebug() << "setting work button valid";
- setButtonValid( Ui::WorkButtonId, true );
-}
-
-void UiController::setButtonValid( int id, bool isValid )
-{
- m_ui->m_destinationButtons->button( id )->setEnabled( isValid );
-}
-
-void UiController::changeDestination( int id )
-{
- bool destinationHasChanged = ( m_currentDestination != id );
- qDebug() << "Destination has changed=" << destinationHasChanged;
- if ( destinationHasChanged ) {
- qDebug() << "Emitting destination changed (" << m_destination[id]->label() << ")";
- emit destinationChanged( m_destination[id] );
- m_currentDestination = id;
- }
-
- // always want to emit this so that the gps position is updated
- // and the user gets new information
- emit buttonClicked();
-}
-
-void UiController::changeRoute( int id )
-{
- bool routeHasChanged = ( m_currentRoute != id );
- if ( routeHasChanged ) {
- displayRouteDetail( id );
- }
-}
-
-void UiController::displayRouteDetail( int id )
-{
- QTableWidget *table = m_ui->m_routeDetailTable;
-
- if ( id < m_routeData.count() ) {
- QList<LegData> &legDataList = m_routeData[ id ].m_legData;
- table->setRowCount( legDataList.count() );
-
- int row=0;
- foreach( LegData thisLegData, legDataList ) {
- QString thisHow = thisLegData.m_how;
-
- bool thisIsLine = ( thisHow == "LINE" );
- if ( thisIsLine ) {
- thisHow = thisLegData.m_lineCode;
- }
-
- QStringList tableStrings;
- tableStrings
- << thisHow
- << thisLegData.m_tripTime
- << thisLegData.m_tripDistance
- << thisLegData.m_departureTime
- << thisLegData.m_arrivalTime;
-
- int col=0;
- foreach( QString thisString, tableStrings ) {
- QTableWidgetItem *newItem = new QTableWidgetItem();
- newItem->setText( thisString );
- table->setItem( row,col, newItem );
- ++col;
- }
-
- ++row;
- }
- } else {
- table->setRowCount( 0 );
- }
-
- table->resizeColumnsToContents();
-}
-
-void UiController::displayRoute( const QList<RouteData> &routeData )
-{
- m_routeData = routeData;
-
- qDebug() << "displaying route";
-
- for ( int i=0; i<Ytv::ShowFiveResults; ++i ) {
- QString label;
-
- QWidget *widget = m_ui->m_routeStack->itemAt( i )->widget();
- QRadioButton *button = qobject_cast<QRadioButton *>(widget);
-
- if ( i<routeData.count() ) {
- RouteData thisRouteData = routeData.at(i);
- label = ( QStringList()
- << thisRouteData.m_departureTime
- << thisRouteData.m_lineCode ).join( "/" );
- button->setEnabled( true );
- } else {
- button->setEnabled( false );
- }
-
- if ( i==0 ) {
- button->setChecked( true );
- } else {
- button->setChecked( false );
- }
-
- button->setText( label );
- }
-
- displayRouteDetail( 0 );
-}
+++ /dev/null
-#ifndef UICONTROLLER_H
-#define UICONTROLLER_H
-
-#include "routedata.h"
-#include "location.h"
-
-#include <QObject>
-
-class Ui;
-
-class UiController : public QObject
-{
- Q_OBJECT
-
-public:
- UiController( Ui *ui );
- ~UiController();
-
-public Q_SLOTS:
- void displayRoute( const QList<RouteData> &routeData );
-
-Q_SIGNALS:
- void buttonClicked();
- void destinationChanged( Location *newDestination );
-
-private Q_SLOTS:
- void changeDestination( int id );
- void changeRoute( int id );
- void setHomeButtonValid();
- void setWorkButtonValid();
- void setHomeButtonInValid();
- void setWorkButtonInValid();
- void displayRouteDetail( int id );
-
-private:
- void setButtonValid( int id, bool isValid );
-
-private:
- QList<RouteData> m_routeData;
- QList<Location*> m_destination;
- Ui *m_ui;
- int m_currentDestination;
- int m_currentRoute;
-};
-#endif // UICONTROLLER_H
-
+++ /dev/null
-#include <QUrl>
-#include <QString>
-
-namespace Ytv {
- const QString Url( "http://api.reittiopas.fi/public-ytv/fi/api/" );
- const QString Username( "zouba" );
- const QString Password( "caf9r3ee" );
-
- //const QString Home( QByteArray::fromPercentEncoding( "Taivaanvuohentie%207%2CHelsinki" ) );
- //const QString Work( QByteArray::fromPercentEncoding( "It%E4merenkatu%2011%2CHelsinki" ) );
-
- enum {
- WalkSpeedSlow=1,
- WalkSpeedFast=2,
- WalkSpeedNormal=3,
- WalkSpeedRunning=4,
- WalkSpeedCycling=5,
- NoWalkSpeeds=5
- };
-
- enum {
- ShowOneResult=1,
- ShowThreeResults=3,
- ShowFiveResults=5
- };
-
- enum {
- OptimizeDefault=1,
- OptimizeFastest=2,
- OptimizeLeastTransfers=3,
- OptimizeLeastWalking=4
- };
-
-};
-
+++ /dev/null
-#! /usr/bin/perl
-require 5.008_004; # we need at least Perl version v5.8.4
-$ENV{MALLOC_CHECK_} = 2;
-
-use Term::ANSIColor;
-
-my $startTime = time();
-
-my %opts = (
- "a" => 0, # all directories, irrespective of if they're in tests.pro
- "r" => 0, # don't reverse sort
- "s" => "D", # by default, sort by directory name
- "j" => 1, # one make job at a time by default
-);
-
-for ( my $argNo=0; $argNo<@ARGV; $argNo++ ) {
- my $arg = $ARGV[ $argNo ];
- if ( $arg eq "-h" ) {
- print "usage: $0 [-a] [-s letter] [-r] [-j number] [-h]\n";
- print " -a include all ut_*/ directories - default is just the ones in tests.pro\n";
- print " -s [DTPFS] sort by column (Dirs, Tests, P(ass), F(ail), S(kipped)\n";
- print " -r reverse sort\n";
- print " -j <number> use <number> make jobs. Default is 1\n";
- print " -h this help\n";
- exit;
- } elsif ( $arg eq "-r" ) {
- $opts{ "r" } = 1;
- } elsif ( $arg eq "-a" ) {
- $opts{ "a" } = 1;
- } elsif ( $arg eq "-s" ) {
- $opts{ "s" } = $ARGV[ ++$argNo ];
- if ( $opts{ "s" } !~ /[DTPFS]/ ) {
- print "Unrecognised column identifier\n";
- print "Must be one of [DTPFS] :\n";
- print " D = Dirs\n";
- print " T = Tests\n";
- print " P = Pass\n";
- print " F = Fail\n";
- print " S = Skipped\n";
- exit(-1);
- }
- } elsif ( $arg eq "-j" ) {
- my $jobs = $ARGV[ ++$argNo ];
- # Test that the argument is a positive integer number
- if ( $jobs * 1 eq $jobs && $jobs > 0 ) {
- $opts{ "j" } = $jobs;
- }
- }
-}
-
-# some globals to help sort be faster
-$sortCol = $opts{ "s" };
-$sortIsNumeric = ( $sortCol =~ /[PFS]/ );
-$reverseSort = $opts{ "r" };
-# helper variable for the number of jobs
-$numJobs = $opts{ "j" };
-
-%maxLen = ();
-%segFault = ();
-
-my @rowHeaders = (
- "D", # Dirs
- "T", # Tests
-);
-my @rowData = (
- "P", # Passed
- "F", # Failed
- "S", # Skipped
-);
-
-my @keys = ( @rowHeaders, @rowData );
-
-my %title = (
- "D"=>"Dirs",
- "T"=>"Tests",
- "P"=>"P",
- "F"=>"F",
- "S"=>"S",
-);
-
-my $headerLabelFormat = "%-*s";
-my $headerDataFormat = "%*s";
-
-my $labelFormat = "%s%-*s%s%*s";
-my $dataFormat = "%*s%s%*s%s";
-
-my %format = (
- "D" => $labelFormat,
- "T" => $labelFormat,
- "P" => $dataFormat,
- "F" => $dataFormat,
- "S" => $dataFormat,
-);
-
-my %separator = (
- "D" => " ",
- "T" => " : ",
- "P" => " ",
- "F" => " ",
- "S" => " ",
-);
-
-my %data = (
-);
-
-foreach $key ( @keys ) {
- $maxLen{ $key } = length( $title{ key } );
-}
-
-# set the maximum length of the directories
-if ( $opts{ "a" } ) {
- push @allDirs, <ut_*>;
- push @allDirs, <ft_*>;
- foreach ( @allDirs ) {
- setMaxLen( "D", length( $_ ) );
- $tested{ $_ } = 0;
- }
-}
-
-# Compile first with possibly multiple jobs
-print "Compiling...";
-`make -j$numJobs -k > /dev/null 2>&1`;
-print "done.\nNow checking...\n";
-
-# then check with only one job so that the parsing succeeds
-open( MAKE, "make -k check 2>&1|" ) || die( "Could not run make:$!" );
-
-#$|=1;
-
-my $thisDir = "";
-while (<MAKE>) {
- chomp;
-
- if ( /Entering directory \`.*tests\/(\w+)\'/ ) {
- $thisDir = $1;
- print STDERR "Tests: $thisDir", ' 'x( $maxLen{ "D" }-length( $thisDir )+length("Tests: ") ), "\r";
- $tested{ $thisDir } = 1;
- push @allDirs, $thisDir if ( !grep( /^$thisDir$/, @allDirs ) );
- setMaxLen( "D", length( $thisDir ) );
- } elsif ( /Segmentation fault/ ) {
- $segFault{ $thisDir } = $_;
- } elsif ( /Start testing of (\w+)/ ) {
- $thisTest = $1;
- $data{ "T" }{ $thisDir } = $thisTest;
- setMaxLen( "T", length( $data{ "T" }{ $thisDir } ) );
- } elsif ( /^Totals: (\d+) passed, (\d+) failed, (\d+) skipped/ ) {
- $data{ "P" }{ $thisDir } = "$1";
- $data{ "F" }{ $thisDir } = "$2";
- $data{ "S" }{ $thisDir } = "$3";
- setMaxLen( "P", length( $data{ "P" }{ $thisDir } ) );
- setMaxLen( "F", length( $data{ "F" }{ $thisDir } ) );
- setMaxLen( "S", length( $data{ "S" }{ $thisDir } ) );
- }
-}
-
-close( MAKE );
-
-print STDERR ' 'x( $maxLen{ "D" } + length( "Tests: " ) ), "\r";
-
-foreach $thisDir ( @allDirs ) {
- if ( !defined( $data{ "P" }{ $thisDir } ) || $data{ "P" }{ $thisDir } eq "" ) {
- $data{ "P" }{ $thisDir } = "0";
- setMaxLen( "P", length( $data{ "P" }{ $thisDir } ) );
- }
- if ( !defined( $data{ "F" }{ $thisDir } ) ) {
- $data{ "F" }{ $thisDir } = "0";
- setMaxLen( "F", length( $data{ "F" }{ $thisDir } ) );
- }
- if ( !defined( $data{ "S" }{ $thisDir } ) ) {
- $data{ "S" }{ $thisDir } = "0";
- setMaxLen( "S", length( $data{ "S" }{ $thisDir } ) );
- }
-
- $data{ "D" }{ $thisDir } = $thisDir;
-}
-
-my ( $testsPassed, $testsNeedWork ) = ( 0, 0 );
-my $noTests = scalar( @allDirs );
-my $noDigits = ($noTests>0)?int( log( $noTests )/log( 10 ) )+1:1;
-
-my $header = sprintf( "%*s ", $noDigits, "" );
-
-foreach ( @rowHeaders ) {
- $header .= sprintf( $headerLabelFormat.$separator{ $_ }, $maxLen{ $_ }, $title{ $_ } );
-}
-
-foreach ( @rowData ) {
- $header .= sprintf( $headerDataFormat.$separator{ $_ }, $maxLen{ $_ }, $title{ $_ } );
-}
-
-my $headerLen = length( $header );
-
-my $headerColor = color( 'reset' );
-
-print "P = Pass, F = Fail, S = Skip\n";
-print $headerColor, "$header\n";
-print '-'x$headerLen, "\n";
-
-my $testNo = 1;
-
-foreach $thisDir ( sort byCol @allDirs ) {
- my %colors = ();
-
- foreach $key ( @keys ) {
- $colors{ $key } = color( 'reset' );
- }
-
- if (
- ( defined( $data{ "P" }{ $thisDir } ) && $data{ "P" }{ $thisDir } ne "0" ) &&
- ( defined( $data{ "F" }{ $thisDir } ) && $data{ "F" }{ $thisDir } eq "0" ) &&
- ( defined( $data{ "S" }{ $thisDir } ) && $data{ "S" }{ $thisDir } eq "0" ) &&
- ( defined( $data{ "T" }{ $thisDir } ) && $data{ "T" }{ $thisDir } ne "" )
- ) {
- $testsPassed++;
- } else {
- $testsNeedWork++;
- }
-
- if ( defined( $data{ "P" }{ $thisDir } ) && $data{ "P" }{ $thisDir } eq "0" ) {
- $colors{ "D" } .= color( 'reverse green' );
- $colors{ "T" } .= color( 'reverse green' );
- $colors{ "P" } .= color( 'reverse green' );
- } else {
- $colors{ "D" } .= color( 'green' );
- $colors{ "T" } .= color( 'green' );
- $colors{ "P" } .= color( 'green' );
- }
-
- if ( defined( $data{ "F" }{ $thisDir} ) && $data{ "F" }{ $thisDir } eq "0" ) {
- $colors{ "F" } .= color( 'red' );
- } else {
- $colors{ "F" } .= color( 'reverse red' );
- }
-
- if ( defined( $data{ "S" }{ $thisDir } ) && $data{ "S" }{ $thisDir } eq "0" ) {
- $colors{ "S" } .= color( 'blue' );
- } else {
- $colors{ "S" } .= color( 'reverse blue' );
- }
-
- if ( !defined( $data{ "T" }{ $thisDir } ) || $data{ "T" }{ $thisDir } eq "" || $segFault{ $thisDir } ) {
- $colors{ "T" } .= color( 'reverse red' );
- }
-
- printf( "%*s ", $noDigits, $testNo );
-
- foreach ( @rowHeaders ) {
- my $thisData = $data{ $_ }{ $thisDir };
- my $dataLength = length( $thisData );
- my $spaceLength = $maxLen{ $_ }-$dataLength;
-
- printf(
- $format{ $_ }.$separator{ $_ },
- $colors{ $_ }, $dataLength, $thisData,
- color( 'reset' ), $spaceLength, "" );
- }
-
- foreach ( @rowData ) {
- my $thisData = $data{ $_ }{ $thisDir };
- my $dataLength = length( $thisData );
- my $spaceLength = $maxLen{ $_ }-$dataLength;
-
- printf(
- $format{ $_ }.$separator{ $_ },
- $spaceLength, "",
- $colors{ $_ }, $dataLength, $thisData,
- color( 'reset' ) );
- }
-
- printf( $headerColor."\n" );
-
- $testNo++;
-}
-
-print '-'x$headerLen, "\n";
-print( "Tests with zero fails/skips : $testsPassed\n" );
-print( "Tests needing further work : $testsNeedWork\n" );
-
-printf( "Elapsed time : %d seconds\n", time() - $startTime );
-
-sub setMaxLen
-{
- my ( $test, $length ) = @_;
-
- $maxLen{ $test } = $length if ( defined( $maxLen{ $test} ) && $length > $maxLen{ $test } );
-}
-
-sub byCol
-{
- my $retVal = 0;
-
- my $localA = $a;
- my $localB = $b;
-
- if ( $reverseSort ) {
- my $tmp = $localA;
- $localA = $localB;
- $localB = $tmp;
- }
-
- if ( $sortIsNumeric ) {
- # numeric comparison
- $retVal = $data{ $sortCol }{ $localA } <=> $data{ $sortCol }{ $localB };
- } else {
- # string comparison
- $retVal = $data{ $sortCol }{ $localA } cmp $data{ $sortCol }{ $localB };
- }
-
- return $retVal;
-}
+++ /dev/null
-ZOUBASRC = ../../src
-
+++ /dev/null
-TEMPLATE=subdirs
-SUBDIRS = \
- ut_location/ \
- ut_route/ \
- ut_gpscontroller/ \
-
-check.target = check
-check.CONFIG = recursive
-QMAKE_EXTRA_TARGETS += check
+++ /dev/null
-#include <QObject>
-#include <QtDebug>
-#include "ut_gpscontroller.h"
-
-#include "gpscontroller.h"
-#include "gpscontroller_p.h"
-
-class MyGpsControllerPrivate: public GpsControllerPrivate
-{
-public:
- MyGpsControllerPrivate();
- ~MyGpsControllerPrivate();
-
- void init();
- void startGps();
- void stopGps();
-
- void setGps( QGeoPositionInfoSource *gps );
- void setFakeLocationLabel( const QString &label );
- void setUseFakeLocation( bool useFake );
- void updateLocation();
-
- QGeoPositionInfoSource *gps();
- Location *liveLocation();
- Location *fakeLocation();
- bool useFakeLocation();
-
- bool m_gpsOn;
- Location *m_liveLocation;
- Location *m_fakeLocation;
- QString m_fakeLocationLabel;
- bool m_useFakeLocation;
-};
-
-MyGpsControllerPrivate::MyGpsControllerPrivate() :
- m_gpsOn(false),
- m_liveLocation( new Location( "livegps" ) ),
- m_fakeLocation( new Location( "fakegps" ) ),
- m_fakeLocationLabel(),
- m_useFakeLocation(false)
-{
-}
-
-MyGpsControllerPrivate::~MyGpsControllerPrivate()
-{
- delete m_liveLocation;
- m_liveLocation = 0;
- delete m_fakeLocation;
- m_fakeLocation = 0;
-}
-
-void MyGpsControllerPrivate::init()
-{
-}
-
-void MyGpsControllerPrivate::startGps()
-{
- m_gpsOn=true;
-}
-
-void MyGpsControllerPrivate::stopGps()
-{
- m_gpsOn=false;
-}
-
-QGeoPositionInfoSource *MyGpsControllerPrivate::gps()
-{
- return 0;
-}
-
-void MyGpsControllerPrivate::setGps( QGeoPositionInfoSource *gps )
-{
- Q_UNUSED( gps );
-}
-
-Location *MyGpsControllerPrivate::liveLocation()
-{
- return m_liveLocation;
-}
-
-Location *MyGpsControllerPrivate::fakeLocation()
-{
- return m_fakeLocation;
-}
-
-void MyGpsControllerPrivate::setFakeLocationLabel( const QString &label )
-{
- m_fakeLocationLabel = label;
- m_fakeLocation->setLabel( label );
-}
-
-bool MyGpsControllerPrivate::useFakeLocation()
-{
- return m_useFakeLocation;
-}
-
-void MyGpsControllerPrivate::setUseFakeLocation( bool useFake )
-{
- m_useFakeLocation = useFake;
-}
-
-void MyGpsControllerPrivate::updateLocation()
-{
-}
-
-void Ut_GpsController::init()
-{
- qRegisterMetaType<Location *>( "Location*" );
-
- m_subject_p = new MyGpsControllerPrivate();
- m_subject = new GpsController( m_subject_p ); // private ownership transferred
-}
-
-void Ut_GpsController::cleanup()
-{
- delete m_subject;
- m_subject = 0;
-}
-
-void Ut_GpsController::initTestCase()
-{
-}
-
-void Ut_GpsController::cleanupTestCase()
-{
-}
-
-void Ut_GpsController::testGetGpsWithNoGpsUpdates()
-{
- QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
-
- // this should start the gps,
- // one signal to invalidate the previous display
- // (which could be showing fake results, for example
- m_subject->getGps();
-
- QCOMPARE(m_subject_p->m_gpsOn, true);
- QCOMPARE(spy.count(), 1);
-}
-
-void Ut_GpsController::testGetGpsWithGpsUpdates()
-{
- QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
-
- // make test call
- m_subject->getGps();
-
- // check effect
- QCOMPARE(m_subject_p->m_gpsOn, true);
- QCOMPARE(spy.count(), 1);
- QList<QVariant> arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
-}
-
-void Ut_GpsController::testFakeGps()
-{
- QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
-
- Location *gpsLocation = m_subject_p->m_liveLocation; // position from GPS
-
- // make test call
- m_subject->useFakeGps( "fakegps" );
- m_subject->getGps();
-
- // check effect
- QList<QVariant> arguments;
-
- // gps should be off
- QCOMPARE(m_subject_p->m_gpsOn, false);
-
- // should get two signals, one from useFakeGps() and one from getGps()
- QVERIFY2(spy.count()==2, "Should receive two signals" );
-
- // both args should be the fake gps position supplied to useFakeGps()
- arguments = spy.takeFirst();
- QCOMPARE( arguments.at(0).value<Location*>(), m_subject_p->m_fakeLocation );
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "fakegps" ) );
- arguments = spy.takeFirst();
- QCOMPARE( arguments.at(0).value<Location*>(), m_subject_p->m_fakeLocation );
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "fakegps" ) );
-
- // switch back to GPS
- m_subject->useLiveGps();
- m_subject->getGps();
-
- // gps should be on
- QCOMPARE(m_subject_p->m_gpsOn, true);
-
- QVERIFY2(spy.count()==2, "should get two locationChanged signals" );
- arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
- arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
-
- // get GPS location
- m_subject->getGps();
-
- // check effect
- QCOMPARE(spy.count(), 1);
- arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
-}
-
-void Ut_GpsController::testLiveToFakeToLive()
-{
- m_subject_p->updateLocation(); // pretend GPS has given an update
-
- m_subject->useFakeGps( "fakegps" );
- m_subject->getGps();
-
- // switch back to live GPS
- m_subject->useLiveGps();
- m_subject->getGps();
-
- m_subject->useFakeGps( "fakegps" );
- m_subject->getGps();
-}
-
-QTEST_APPLESS_MAIN(Ut_GpsController)
+++ /dev/null
-#ifndef UT_GPSCONTROLLER_H
-#define UT_GPSCONTROLLER_H
-
-#include <QtTest/QtTest>
-#include <QObject>
-
-class GpsController;
-class MyGpsControllerPrivate;
-class Location;
-
-Q_DECLARE_METATYPE(GpsController*);
-Q_DECLARE_METATYPE(MyGpsControllerPrivate*);
-Q_DECLARE_METATYPE(Location*);
-
-class Ut_GpsController : public QObject
-{
-Q_OBJECT
-
-public:
-
-private slots:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
- void testGetGpsWithNoGpsUpdates();
- void testGetGpsWithGpsUpdates();
- void testFakeGps();
- void testLiveToFakeToLive();
-
-private:
- GpsController *m_subject;
- MyGpsControllerPrivate *m_subject_p;
-};
-#endif // UT_GPSCONTROLLER_H
+++ /dev/null
-include( ../tests.pri )
-CONFIG += \
- qt \
- debug \
- mobility \
-
-MOBILITY = \
- location \
- bearer \
-
-QT += \
- testlib \
- network \
- maemo5 \
-
-INCLUDEPATH += \
- $$ZOUBASRC \
-
-DEPENDPATH += $INCLUDEPATH
-
-TEMPLATE = app
-
-LIBS += \
- /usr/lib/libQtLocation.so \
-
-SOURCES = \
- ut_gpscontroller.cpp \
- $$ZOUBASRC/gpscontroller.cpp \
- $$ZOUBASRC/gpscontroller_p.cpp \
- $$ZOUBASRC/locations.cpp \
- $$ZOUBASRC/location.cpp \
- $$ZOUBASRC/location_p.cpp \
-
-HEADERS += \
- ut_gpscontroller.h \
- $$ZOUBASRC/gpscontroller.h \
- $$ZOUBASRC/gpscontroller_p.h \
- $$ZOUBASRC/locations.h \
- $$ZOUBASRC/location.h \
- $$ZOUBASRC/location_p.h \
-
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-#include <QObject>
-#include <QtDebug>
-#include <QByteArray>
-#include <QGeoPositionInfo>
-#include "location.h"
-#include "location_p.h"
-#include "ut_location.h"
-
-QTM_USE_NAMESPACE
-
-QByteArray sampleInput(
-"\
-<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><MTRXML version=\"1.0\">\
-<GEOCODE key=\"taivaanvuohentie 7,helsinki\">\
-<LOC name1=\"Taivaanvuohentie\" number=\"7\" city=\"Helsinki\" code=\"\" address=\"\" type=\"900\" category=\"street\" x=\"2549182\" y=\"6672569\" lon=\"24.88256\" lat=\"60.16183\" />\
-</GEOCODE>\
-</MTRXML>\
-"
-
-);
-
-void Ut_Location::init()
-{
-}
-
-void Ut_Location::cleanup()
-{
-}
-
-void Ut_Location::initTestCase()
-{
-}
-
-void Ut_Location::cleanupTestCase()
-{
-}
-
-void Ut_Location::testParseReply()
-{
- QString label("home");
- LocationPrivate m_subject(label);
-
- m_subject.parseReply( sampleInput );
-
- QCOMPARE( m_subject.label(), label );
- QCOMPARE( m_subject.x(), QString( "2549182" ) );
- QCOMPARE( m_subject.y(), QString( "6672569" ) );
-}
-
-void Ut_Location::testSet()
-{
- QString label( "home" );
- LocationPrivate m_subject(label);
-
- label = "work";
- QString address( "Taivaanvuohentie 7 B 27, Helsinki" );
- QString x( "2549182" );
- QString y( "6672569" );
- m_subject.setAddress( address );
- m_subject.setLabel( label );
- m_subject.setX( x );
- m_subject.setY( y );
- QCOMPARE( m_subject.address(), address );
- QCOMPARE( m_subject.label(), label );
- QCOMPARE( m_subject.x(), x );
- QCOMPARE( m_subject.y(), y );
-}
-
-void Ut_Location::testConstructorQGeoPositionInfo()
-{
- QGeoPositionInfo thisPositionInfo( QGeoCoordinate( 60.16183, 24.88256 ), QDateTime( QDate( 1965, 11, 11 ) ) );
- Location subject( thisPositionInfo );
-
- QString x( "2549182" );
- QString y( "6672569" );
- QCOMPARE( subject.x(), x );
- QCOMPARE( subject.y(), y );
-}
-
-QTEST_APPLESS_MAIN(Ut_Location)
+++ /dev/null
-#ifndef UT_LOCATION_H
-#define UT_LOCATION_H
-
-#include <QtTest/QtTest>
-#include <QObject>
-
-#include <location_p.h>
-
-Q_DECLARE_METATYPE(LocationPrivate*);
-
-class Ut_Location : public QObject
-{
-Q_OBJECT
-
-public:
-
-private slots:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
- void testParseReply();
- void testSet();
- void testConstructorQGeoPositionInfo();
-
-private:
- LocationPrivate *m_subject;
-};
-#endif // UT_LOCATION_H
+++ /dev/null
-include( ../tests.pri )
-CONFIG += \
- qt \
- debug \
- mobility \
-
-MOBILITY = \
- location \
- bearer \
-
-QT += \
- testlib \
- network \
- maemo5 \
-
-INCLUDEPATH += \
- $$ZOUBASRC \
-
-DEPENDPATH += $$INCLUDEPATH
-
-LIBS += \
- /usr/lib/libQtLocation.so \
-
-TEMPLATE = app
-
-SOURCES = \
- ut_location.cpp \
- $$ZOUBASRC/location.cpp \
- $$ZOUBASRC/location_p.cpp \
-
-HEADERS += \
- ut_location.h \
- $$ZOUBASRC/location.h \
- $$ZOUBASRC/location_p.h \
-
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-#include <QObject>
-#include <QtDebug>
-#include <QByteArray>
-#include "ut_route.h"
-
-#include "ut_sampleinput.h"
-
-void Ut_Route::init()
-{
- m_subject = new RoutePrivate();
-}
-
-void Ut_Route::cleanup()
-{
- delete m_subject;
- m_subject = 0;
-}
-
-void Ut_Route::initTestCase()
-{
-}
-
-void Ut_Route::cleanupTestCase()
-{
-}
-
-void Ut_Route::testParseReply()
-{
- QFETCH(QByteArray, xmlInput);
- QFETCH(QList<RouteData>, expectedResults);
-
- QList<RouteData> routeData = m_subject->parseReply( xmlInput );
-
- QCOMPARE( routeData.count(), expectedResults.count() );
-
- for( int routeIndex=0; routeIndex<routeData.count(); ++routeIndex ) {
- const RouteData &thisRouteData = routeData.at( routeIndex );
- const RouteData &thisExpectedRoute = expectedResults.at( routeIndex );
-
- QCOMPARE( thisRouteData.m_tripTime, thisExpectedRoute.m_tripTime );
- QCOMPARE( thisRouteData.m_tripDistance, thisExpectedRoute.m_tripDistance );
- QCOMPARE( thisRouteData.m_departureTime, thisExpectedRoute.m_departureTime );
- QCOMPARE( thisRouteData.m_lineCode, thisExpectedRoute.m_lineCode );
- QCOMPARE( thisRouteData.m_legData.count(), thisExpectedRoute.m_legData.count() );
-
- for( int legIndex=0; legIndex<thisRouteData.m_legData.count(); ++legIndex ) {
- const LegData &thisLegData = thisRouteData.m_legData.at( legIndex );
- const LegData &thisExpectedLeg = thisExpectedRoute.m_legData.at( legIndex );
-
- QCOMPARE( thisLegData.m_how, thisExpectedLeg.m_how );
- QCOMPARE( thisLegData.m_tripTime, thisExpectedLeg.m_tripTime );
- QCOMPARE( thisLegData.m_tripDistance, thisExpectedLeg.m_tripDistance );
- QCOMPARE( thisLegData.m_departureTime, thisExpectedLeg.m_departureTime );
- QCOMPARE( thisLegData.m_arrivalTime, thisExpectedLeg.m_arrivalTime );
- QCOMPARE( thisLegData.m_lineCode, thisExpectedLeg.m_lineCode );
- }
- }
-}
-
-void Ut_Route::testParseReply_data()
-{
- QTest::addColumn<QByteArray>("xmlInput");
- QTest::addColumn< QList<RouteData> >("expectedResults");
-
- QTest::newRow("single route")
- << sampleInput[0]
- << ( QList<RouteData>()
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "14.411", "2510.063", "18:20", "65A" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "4.475", "357.069", "18:15", "18:20" )
- << LegData( "LINE", "5.000", "1760.931", "18:20", "18:25", "65A" )
- << LegData( "WALK", "4.936", "392.062", "18:25", "18:29" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "13.411", "2501.497", "18:26", "102T" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "4.475", "357.069", "18:21", "18:26" )
- << LegData( "LINE", "4.000", "1751.582", "18:26", "18:30", "102T" )
- << LegData( "WALK", "4.936", "392.846", "18:30", "18:34" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "13.411", "2501.497", "18:34", "110T" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "4.475", "357.069", "18:29", "18:34" )
- << LegData( "LINE", "4.000", "1751.582", "18:34", "18:38", "110T" )
- << LegData( "WALK", "4.936", "392.846", "18:38", "18:42" )
- )
- );
-
- QTest::newRow("route with bus change")
- << sampleInput[1]
- << ( QList<RouteData>()
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "28.633", "8902.040", "08:18", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "08:14", "08:18" )
- << LegData( "LINE", "8.000", "5225.092", "08:18", "08:26", "111" )
- << LegData( "LINE", "5.000", "2926.431", "08:32", "08:37", "121T" )
- << LegData( "WALK", "6.154", "495.764", "08:37", "08:43" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "25.633", "8902.040", "08:33", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "08:29", "08:33" )
- << LegData( "LINE", "8.000", "5225.092", "08:33", "08:41", "111" )
- << LegData( "LINE", "5.000", "2926.431", "08:44", "08:49", "102T" )
- << LegData( "WALK", "6.154", "495.764", "08:49", "08:55" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "33.510", "11193.458", "08:34", "111T" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "2.356", "172.693", "08:31", "08:34" )
- << LegData( "LINE", "6.000", "3392.054", "08:34", "08:40", "111T" )
- << LegData( "LINE", "5.000", "4206.516", "08:43", "08:48", "112" )
- << LegData( "LINE", "5.000", "2926.431", "08:54", "08:59", "102T" )
- << LegData( "WALK", "6.154", "495.764", "08:59", "09:05" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "29.633", "8902.040", "08:50", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "08:46", "08:50" )
- << LegData( "LINE", "8.000", "5225.092", "08:50", "08:58", "111" )
- << LegData( "LINE", "5.000", "2926.431", "09:05", "09:10", "102T" )
- << LegData( "WALK", "6.154", "495.764", "09:10", "09:16" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "29.633", "8902.040", "09:07", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "09:03", "09:07" )
- << LegData( "LINE", "8.000", "5225.092", "09:07", "09:15", "111" )
- << LegData( "LINE", "5.000", "2926.431", "09:22", "09:27", "160T" )
- << LegData( "WALK", "6.154", "495.764", "09:27", "09:33" )
- )
- );
-}
-
-void Ut_Route::testSetFromLocation()
-{
- Location work( "2551042", "6672829" );
- QCOMPARE( m_subject->fromValid(), false );
- m_subject->setFromLocation( &work );
- QCOMPARE( m_subject->fromLocation()->x(), work.x() );
- QCOMPARE( m_subject->fromLocation()->y(), work.y() );
- QCOMPARE( m_subject->fromValid(), true );
-}
-
-void Ut_Route::testSetToLocation()
-{
- Location work( "2551042", "6672829" );
- QCOMPARE( m_subject->toValid(), false );
- m_subject->setToLocation( &work );
- QCOMPARE( m_subject->toLocation()->x(), work.x() );
- QCOMPARE( m_subject->toLocation()->y(), work.y() );
- QCOMPARE( m_subject->toValid(), true );
-}
-
-QTEST_APPLESS_MAIN(Ut_Route)
+++ /dev/null
-#ifndef UT_ROUTE_H
-#define UT_ROUTE_H
-
-#include <QtTest/QtTest>
-#include <QObject>
-
-#include <route_p.h>
-
-Q_DECLARE_METATYPE(RoutePrivate*);
-Q_DECLARE_METATYPE(QList<RouteData>);
-
-class Ut_Route : public QObject
-{
- Q_OBJECT
-
-public:
-
-private slots:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
- void testParseReply();
- void testParseReply_data();
- void testSetFromLocation();
- void testSetToLocation();
-
-private:
- RoutePrivate *m_subject;
-};
-#endif // UT_ROUTE_H
+++ /dev/null
-include( ../tests.pri )
-CONFIG += \
- qt \
- debug \
- mobility \
-
-MOBILITY = \
- location \
- bearer \
-
-QT += \
- testlib \
- network \
- maemo5 \
-
-INCLUDEPATH += \
- $$ZOUBASRC \
-
-DEPENDPATH += $INCLUDEPATH
-
-TEMPLATE = app
-
-LIBS += \
- /usr/lib/libQtLocation.so \
-
-SOURCES = \
- ut_route.cpp \
- $$ZOUBASRC/route_p.cpp \
- $$ZOUBASRC/location.cpp \
- $$ZOUBASRC/location_p.cpp \
-
-HEADERS += \
- ut_route.h \
- $$ZOUBASRC/route_p.h \
- $$ZOUBASRC/location.h \
- $$ZOUBASRC/location_p.h \
-
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-
-QByteArray sampleInput[2] = {
-"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\
-<MTRXML version=\"1.0\">\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"14.411\" dist=\"2510.063\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1815\"/>\
- <DEPARTURE date=\"20100207\" time=\"1815\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"4.475\" dist=\"357.069\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1815\"/>\
- <DEPARTURE date=\"20100207\" time=\"1815\"/>\
- </POINT>\
- <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1816\"/>\
- <DEPARTURE date=\"20100207\" time=\"1816\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
- <ARRIVAL date=\"20100207\" time=\"1817\"/>\
- <DEPARTURE date=\"20100207\" time=\"1817\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1817\"/>\
- <DEPARTURE date=\"20100207\" time=\"1817\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1819\"/>\
- <DEPARTURE date=\"20100207\" time=\"1819\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
- <ARRIVAL date=\"20100207\" time=\"1820\"/>\
- <DEPARTURE date=\"20100207\" time=\"1820\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <STOP code=\"6:1201129\" x=\"2550765.0\" y=\"6672886.0\" id=\"745\">\
- <ARRIVAL date=\"20100207\" time=\"1820\"/>\
- <DEPARTURE date=\"20100207\" time=\"1820\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"200\" code=\"1065A 2\" type=\"1\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"1760.931\"/>\
- <STOP code=\"6:1201129\" x=\"2550765.0\" y=\"6672886.0\" id=\"745\" ord=\"30\">\
- <ARRIVAL date=\"20100207\" time=\"1820\"/>\
- <DEPARTURE date=\"20100207\" time=\"1820\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- <STOP code=\"6:1201131\" x=\"2550385.0\" y=\"6672760.0\" id=\"747\">\
- <ARRIVAL date=\"20100207\" time=\"1821\"/>\
- <DEPARTURE date=\"20100207\" time=\"1821\"/>\
- <NAME lang=\"1\" val=\"Salmisaari\"/>\
- <NAME lang=\"2\" val=\"Sundholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310101\" x=\"2549608.0\" y=\"6672522.0\" id=\"1356\">\
- <ARRIVAL date=\"20100207\" time=\"1824\"/>\
- <DEPARTURE date=\"20100207\" time=\"1824\"/>\
- <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
- <NAME lang=\"2\" val=\"Drumsö bro\"/>\
- </STOP>\
- <STOP code=\"6:1310103\" x=\"2549247.0\" y=\"6672446.0\" id=\"1358\" ord=\"33\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"4.936\" dist=\"392.062\"/>\
- <STOP code=\"6:1310103\" x=\"2549247.0\" y=\"6672446.0\" id=\"1358\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1827\"/>\
- <DEPARTURE date=\"20100207\" time=\"1827\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1828\"/>\
- <DEPARTURE date=\"20100207\" time=\"1828\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1828\"/>\
- <DEPARTURE date=\"20100207\" time=\"1828\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"13.411\" dist=\"2501.497\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1821\"/>\
- <DEPARTURE date=\"20100207\" time=\"1821\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"4.475\" dist=\"357.069\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1821\"/>\
- <DEPARTURE date=\"20100207\" time=\"1821\"/>\
- </POINT>\
- <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1822\"/>\
- <DEPARTURE date=\"20100207\" time=\"1822\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
- <ARRIVAL date=\"20100207\" time=\"1823\"/>\
- <DEPARTURE date=\"20100207\" time=\"1823\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1823\"/>\
- <DEPARTURE date=\"20100207\" time=\"1823\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
- <ARRIVAL date=\"20100207\" time=\"1826\"/>\
- <DEPARTURE date=\"20100207\" time=\"1826\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\">\
- <ARRIVAL date=\"20100207\" time=\"1826\"/>\
- <DEPARTURE date=\"20100207\" time=\"1826\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"579\" code=\"2102T 1\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"4.000\" dist=\"1751.582\"/>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\" ord=\"3\">\
- <ARRIVAL date=\"20100207\" time=\"1826\"/>\
- <DEPARTURE date=\"20100207\" time=\"1826\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- <STOP code=\"6:1201231\" x=\"2550387.0\" y=\"6672761.0\" id=\"759\">\
- <ARRIVAL date=\"20100207\" time=\"1827\"/>\
- <DEPARTURE date=\"20100207\" time=\"1827\"/>\
- <NAME lang=\"1\" val=\"Salmisaari\"/>\
- <NAME lang=\"2\" val=\"Sundholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310201\" x=\"2549630.0\" y=\"6672524.0\" id=\"1402\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
- <NAME lang=\"2\" val=\"Drumsö bro\"/>\
- </STOP>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\" ord=\"6\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"4.936\" dist=\"392.846\"/>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1832\"/>\
- <DEPARTURE date=\"20100207\" time=\"1832\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1833\"/>\
- <DEPARTURE date=\"20100207\" time=\"1833\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1833\"/>\
- <DEPARTURE date=\"20100207\" time=\"1833\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"13.411\" dist=\"2501.497\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"4.475\" dist=\"357.069\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
- <ARRIVAL date=\"20100207\" time=\"1831\"/>\
- <DEPARTURE date=\"20100207\" time=\"1831\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1831\"/>\
- <DEPARTURE date=\"20100207\" time=\"1831\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1833\"/>\
- <DEPARTURE date=\"20100207\" time=\"1833\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"603\" code=\"2110T 1\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"4.000\" dist=\"1751.582\"/>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\" ord=\"3\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- <STOP code=\"6:1201231\" x=\"2550387.0\" y=\"6672761.0\" id=\"759\">\
- <ARRIVAL date=\"20100207\" time=\"1835\"/>\
- <DEPARTURE date=\"20100207\" time=\"1835\"/>\
- <NAME lang=\"1\" val=\"Salmisaari\"/>\
- <NAME lang=\"2\" val=\"Sundholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310201\" x=\"2549630.0\" y=\"6672524.0\" id=\"1402\">\
- <ARRIVAL date=\"20100207\" time=\"1837\"/>\
- <DEPARTURE date=\"20100207\" time=\"1837\"/>\
- <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
- <NAME lang=\"2\" val=\"Drumsö bro\"/>\
- </STOP>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\" ord=\"6\">\
- <ARRIVAL date=\"20100207\" time=\"1838\"/>\
- <DEPARTURE date=\"20100207\" time=\"1838\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"4.936\" dist=\"392.846\"/>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\">\
- <ARRIVAL date=\"20100207\" time=\"1838\"/>\
- <DEPARTURE date=\"20100207\" time=\"1838\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1838\"/>\
- <DEPARTURE date=\"20100207\" time=\"1838\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1840\"/>\
- <DEPARTURE date=\"20100207\" time=\"1840\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1841\"/>\
- <DEPARTURE date=\"20100207\" time=\"1841\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1841\"/>\
- <DEPARTURE date=\"20100207\" time=\"1841\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1842\"/>\
- <DEPARTURE date=\"20100207\" time=\"1842\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1842\"/>\
- <DEPARTURE date=\"20100207\" time=\"1842\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1842\"/>\
- <DEPARTURE date=\"20100207\" time=\"1842\"/>\
- </POINT>\
- </ROUTE>\
-</MTRXML>\
-",
-
-"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\
-<MTRXML version=\"1.0\">\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"28.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0814\"/>\
- <DEPARTURE date=\"20100416\" time=\"0814\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0814\"/>\
- <DEPARTURE date=\"20100416\" time=\"0814\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0815\"/>\
- <DEPARTURE date=\"20100416\" time=\"0815\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0816\"/>\
- <DEPARTURE date=\"20100416\" time=\"0816\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0816\"/>\
- <DEPARTURE date=\"20100416\" time=\"0816\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0816\"/>\
- <DEPARTURE date=\"20100416\" time=\"0816\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0817\"/>\
- <DEPARTURE date=\"20100416\" time=\"0817\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0818\"/>\
- <DEPARTURE date=\"20100416\" time=\"0818\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0818\"/>\
- <DEPARTURE date=\"20100416\" time=\"0818\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0818\"/>\
- <DEPARTURE date=\"20100416\" time=\"0818\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0819\"/>\
- <DEPARTURE date=\"20100416\" time=\"0819\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0819\"/>\
- <DEPARTURE date=\"20100416\" time=\"0819\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0820\"/>\
- <DEPARTURE date=\"20100416\" time=\"0820\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0821\"/>\
- <DEPARTURE date=\"20100416\" time=\"0821\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0822\"/>\
- <DEPARTURE date=\"20100416\" time=\"0822\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0823\"/>\
- <DEPARTURE date=\"20100416\" time=\"0823\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0824\"/>\
- <DEPARTURE date=\"20100416\" time=\"0824\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0824\"/>\
- <DEPARTURE date=\"20100416\" time=\"0824\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0825\"/>\
- <DEPARTURE date=\"20100416\" time=\"0825\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0826\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"642\" code=\"2121T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"13\">\
- <ARRIVAL date=\"20100416\" time=\"0826\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"17\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0840\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0843\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0843\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"25.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0829\"/>\
- <DEPARTURE date=\"20100416\" time=\"0829\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0829\"/>\
- <DEPARTURE date=\"20100416\" time=\"0829\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0830\"/>\
- <DEPARTURE date=\"20100416\" time=\"0830\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0832\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0836\"/>\
- <DEPARTURE date=\"20100416\" time=\"0836\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0839\"/>\
- <DEPARTURE date=\"20100416\" time=\"0839\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0839\"/>\
- <DEPARTURE date=\"20100416\" time=\"0839\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0840\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0841\"/>\
- <DEPARTURE date=\"20100416\" time=\"0844\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
- <ARRIVAL date=\"20100416\" time=\"0841\"/>\
- <DEPARTURE date=\"20100416\" time=\"0844\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0845\"/>\
- <DEPARTURE date=\"20100416\" time=\"0845\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0847\"/>\
- <DEPARTURE date=\"20100416\" time=\"0847\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
- <ARRIVAL date=\"20100416\" time=\"0849\"/>\
- <DEPARTURE date=\"20100416\" time=\"0849\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0849\"/>\
- <DEPARTURE date=\"20100416\" time=\"0849\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0852\"/>\
- <DEPARTURE date=\"20100416\" time=\"0852\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"33.510\" dist=\"11193.458\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"2.356\" dist=\"172.693\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0832\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543528.9\" y=\"6672567.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232219\" x=\"2543533.0\" y=\"6672532.0\" id=\"3374\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"621\" code=\"2111T 1\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"6.000\" dist=\"3392.054\"/>\
- <STOP code=\"6:2232219\" x=\"2543533.0\" y=\"6672532.0\" id=\"3374\" ord=\"20\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232236\" x=\"2543282.0\" y=\"6672594.0\" id=\"3390\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Haukilahden keskus\"/>\
- <NAME lang=\"2\" val=\"Gäddvik centrum\"/>\
- </STOP>\
- <STOP code=\"6:2232221\" x=\"2543195.0\" y=\"6672532.0\" id=\"3376\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Pattisten pelto\"/>\
- <NAME lang=\"2\" val=\"Battisåker\"/>\
- </STOP>\
- <STOP code=\"6:2232227\" x=\"2543123.0\" y=\"6672283.0\" id=\"3381\">\
- <ARRIVAL date=\"20100416\" time=\"0836\"/>\
- <DEPARTURE date=\"20100416\" time=\"0836\"/>\
- <NAME lang=\"1\" val=\"Haukitie\"/>\
- <NAME lang=\"2\" val=\"Gäddvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232229\" x=\"2542938.0\" y=\"6672081.0\" id=\"3383\">\
- <ARRIVAL date=\"20100416\" time=\"0836\"/>\
- <DEPARTURE date=\"20100416\" time=\"0836\"/>\
- <NAME lang=\"1\" val=\"Haukiverkko\"/>\
- <NAME lang=\"2\" val=\"Gäddnätet\"/>\
- </STOP>\
- <STOP code=\"6:2232209\" x=\"2542708.0\" y=\"6672127.0\" id=\"3364\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Hauenkita\"/>\
- <NAME lang=\"2\" val=\"Gäddgapet\"/>\
- </STOP>\
- <STOP code=\"6:2232211\" x=\"2542513.0\" y=\"6672237.0\" id=\"3366\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenranta 25\"/>\
- <NAME lang=\"2\" val=\"Gäddviksstranden 25\"/>\
- </STOP>\
- <STOP code=\"6:2232212\" x=\"2542467.0\" y=\"6672399.0\" id=\"3367\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Telamäentie\"/>\
- <NAME lang=\"2\" val=\"Kavelbackavägen\"/>\
- </STOP>\
- <STOP code=\"6:2232213\" x=\"2542470.0\" y=\"6672451.0\" id=\"3368\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Telamäentie\"/>\
- <NAME lang=\"2\" val=\"Kavelbackavägen\"/>\
- </STOP>\
- <STOP code=\"6:2232239\" x=\"2542955.0\" y=\"6672526.0\" id=\"3393\">\
- <ARRIVAL date=\"20100416\" time=\"0839\"/>\
- <DEPARTURE date=\"20100416\" time=\"0839\"/>\
- <NAME lang=\"1\" val=\"Hauenkallio\"/>\
- <NAME lang=\"2\" val=\"Gäddberget\"/>\
- </STOP>\
- <STOP code=\"6:2232223\" x=\"2543096.0\" y=\"6672983.0\" id=\"3378\" ord=\"30\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- <NAME lang=\"1\" val=\"Kuhatie\"/>\
- <NAME lang=\"2\" val=\"Gösvägen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"624\" code=\"2112 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"4206.516\"/>\
- <STOP code=\"6:2232223\" x=\"2543096.0\" y=\"6672983.0\" id=\"3378\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- <NAME lang=\"1\" val=\"Kuhatie\"/>\
- <NAME lang=\"2\" val=\"Gösvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231202\" x=\"2544838.0\" y=\"6673305.0\" id=\"3333\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- <NAME lang=\"1\" val=\"Westendinasema\"/>\
- <NAME lang=\"2\" val=\"Westendstationen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0847\"/>\
- <DEPARTURE date=\"20100416\" time=\"0847\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"15\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0854\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0854\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0856\"/>\
- <DEPARTURE date=\"20100416\" time=\"0856\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0857\"/>\
- <DEPARTURE date=\"20100416\" time=\"0857\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
- <ARRIVAL date=\"20100416\" time=\"0859\"/>\
- <DEPARTURE date=\"20100416\" time=\"0859\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0859\"/>\
- <DEPARTURE date=\"20100416\" time=\"0859\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0900\"/>\
- <DEPARTURE date=\"20100416\" time=\"0900\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0902\"/>\
- <DEPARTURE date=\"20100416\" time=\"0902\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"29.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0847\"/>\
- <DEPARTURE date=\"20100416\" time=\"0847\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0848\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0848\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0848\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0849\"/>\
- <DEPARTURE date=\"20100416\" time=\"0849\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0851\"/>\
- <DEPARTURE date=\"20100416\" time=\"0851\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0851\"/>\
- <DEPARTURE date=\"20100416\" time=\"0851\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0852\"/>\
- <DEPARTURE date=\"20100416\" time=\"0852\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0853\"/>\
- <DEPARTURE date=\"20100416\" time=\"0853\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0854\"/>\
- <DEPARTURE date=\"20100416\" time=\"0854\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0856\"/>\
- <DEPARTURE date=\"20100416\" time=\"0856\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0856\"/>\
- <DEPARTURE date=\"20100416\" time=\"0856\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0857\"/>\
- <DEPARTURE date=\"20100416\" time=\"0857\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0858\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
- <ARRIVAL date=\"20100416\" time=\"0858\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0906\"/>\
- <DEPARTURE date=\"20100416\" time=\"0906\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0908\"/>\
- <DEPARTURE date=\"20100416\" time=\"0908\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
- <ARRIVAL date=\"20100416\" time=\"0910\"/>\
- <DEPARTURE date=\"20100416\" time=\"0910\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0910\"/>\
- <DEPARTURE date=\"20100416\" time=\"0910\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0911\"/>\
- <DEPARTURE date=\"20100416\" time=\"0911\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0913\"/>\
- <DEPARTURE date=\"20100416\" time=\"0913\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0916\"/>\
- <DEPARTURE date=\"20100416\" time=\"0916\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0916\"/>\
- <DEPARTURE date=\"20100416\" time=\"0916\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"29.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0903\"/>\
- <DEPARTURE date=\"20100416\" time=\"0903\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0903\"/>\
- <DEPARTURE date=\"20100416\" time=\"0903\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0904\"/>\
- <DEPARTURE date=\"20100416\" time=\"0904\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0906\"/>\
- <DEPARTURE date=\"20100416\" time=\"0906\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0908\"/>\
- <DEPARTURE date=\"20100416\" time=\"0908\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0909\"/>\
- <DEPARTURE date=\"20100416\" time=\"0909\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0909\"/>\
- <DEPARTURE date=\"20100416\" time=\"0909\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0910\"/>\
- <DEPARTURE date=\"20100416\" time=\"0910\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0911\"/>\
- <DEPARTURE date=\"20100416\" time=\"0911\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0912\"/>\
- <DEPARTURE date=\"20100416\" time=\"0912\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0913\"/>\
- <DEPARTURE date=\"20100416\" time=\"0913\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0913\"/>\
- <DEPARTURE date=\"20100416\" time=\"0913\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0914\"/>\
- <DEPARTURE date=\"20100416\" time=\"0914\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0915\"/>\
- <DEPARTURE date=\"20100416\" time=\"0922\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"696\" code=\"2160T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"20\">\
- <ARRIVAL date=\"20100416\" time=\"0915\"/>\
- <DEPARTURE date=\"20100416\" time=\"0922\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0923\"/>\
- <DEPARTURE date=\"20100416\" time=\"0923\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0925\"/>\
- <DEPARTURE date=\"20100416\" time=\"0925\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0926\"/>\
- <DEPARTURE date=\"20100416\" time=\"0926\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"24\">\
- <ARRIVAL date=\"20100416\" time=\"0927\"/>\
- <DEPARTURE date=\"20100416\" time=\"0927\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0927\"/>\
- <DEPARTURE date=\"20100416\" time=\"0927\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0928\"/>\
- <DEPARTURE date=\"20100416\" time=\"0928\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0930\"/>\
- <DEPARTURE date=\"20100416\" time=\"0930\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0933\"/>\
- <DEPARTURE date=\"20100416\" time=\"0933\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0933\"/>\
- <DEPARTURE date=\"20100416\" time=\"0933\"/>\
- </POINT>\
- </ROUTE>\
-</MTRXML>\
-"
-};
-
+++ /dev/null
-TARGET = zouba
-SOURCES += \
- main.cpp \
- route.cpp \
- route_p.cpp \
- uicontroller.cpp \
- location.cpp \
- location_p.cpp \
- locations.cpp \
- gpscontroller.cpp \
- gpscontroller_p.cpp \
- ui.cpp \
-
-HEADERS += \
- route.h \
- route_p.h \
- uicontroller.h \
- location.h \
- location_p.h \
- locations.h \
- ytv.h \
- gpscontroller.h \
- gpscontroller_p.h \
- ui.h \
-
-FORMS +=
-LEXSOURCES += #LEXS#
-YACCSOURCES += #YACCS#
-
-INCLUDEPATH += include
-DEPENDSPATH += INCLUDEPATH
-#QMAKE_LIBDIR_QT = qt4-maemo5/lib
-#QMAKE_INCDIR_QT = qt4-maemo5/include
-LIBS += -Llib -lQtBearer -lQtLocation
-DEFINES += Q_WS_MAEMO_5
-
-# All generated files goes same directory
-OBJECTS_DIR = build
-MOC_DIR = build
-UI_DIR = build
-
-DESTDIR = build
-TEMPLATE = app
-DEPENDPATH +=
-VPATH += src uis
-CONFIG -=
-CONFIG += debug qt mobility
-MOBILITY += location bearer
-QT=core gui network maemo5
-
-INSTALLS += target
-target.path = /usr/bin/
-
-INSTALLS += desktop
-desktop.path = /usr/share/applications/hildon
-desktop.files = data/zouba.desktop
-
-INSTALLS += service
-service.path = /usr/share/dbus-1/services
-service.files = data/zouba.service
-
-INSTALLS += icon64
-icon64.path = /usr/share/icons/hicolor/64x64/apps
-icon64.files = data/64x64/zouba.png
-
-#
-# Targets for debian source and binary package creation
-#
-debian-src.commands = dpkg-buildpackage -S -r -us -uc -d
-debian-bin.commands = dpkg-buildpackage -b -r -uc -d
-debian-all.depends = debian-src debian-bin
-
-#
-# Clean all but Makefile
-#
-compiler_clean.commands = -$(DEL_FILE) $(TARGET)
-
-QMAKE_EXTRA_TARGETS += debian-all debian-src debian-bin compiler_clean