1. 개요

WAC의 Geolocation Module은 W3C의 Geolocation API를 참고하여 작성되었다.
하지만 W3C에서 Geolocation API를 navigator.geolocation interface를 통해 제공하는 것과는 달리 
WAC에서는 deviceapis interface를 통하여 제공한다.
2. API
W3C의 Geolocation 표준에서 정의하는 기능들을 제공해야 한다.
API를 사용하기 위해서는 config.xml에 Feature를 선언해야 하는데 선언되어져야 할 Feature는 
http://www.w3.org/TR/geolocation-API/이다.
3. Security
config.xml에 Declaration이 존재하지 않을 경우에는 API를 사용할 수 없다. Declaration이 존재하는
경우라고 하더라도 Framework에서 Deny가 발생하여 API 사용시에 PERMISSION_DENIED error가 
발생할 수 있다.
4. WebIDL
    interface Geolocation {
        void getCurrentPosition(PositionCallback successCallback, [optional]PositionErrorCallback
errorCallback, [optional] PositionOptions options);
        – 현재 위치를 얻어오기 위한 함수. 함수가 호출이 되면 제어권을 반환한 뒤, 비동기적으로 Location 정보를
          획득한다. Location 정보를 얻는데 성공하였으면 successCallback을 호출할 때 인자로 이를 넘겨준다.
          만약 error가 발생하였다면 errorCallback을 호출하여 이를 알려준다.
        long watchPosition(PositionCallback successCallback, [optional]PositionErrorCallback errorCallback,
[optional] PositionOptions options);
        – 함수가 호출이 되면 watch operation에 대한 identifier를 반환한 뒤, GPS값을 얻기 위한 작업을 수행한다.
          만약 현재 GPS값을 얻는 작업을 성공했다면 얻은 GPS값을 인자로 successCallback을 호출한다. 만약
          GPS값을 얻는 중 문제가 발생하였다면 errorCallback을 호출한다. 
       * User Permission없이는 getCurrentPosition함수와 watchPosition함수의 successCallback이
        호출되어서는 안된다.
        void clearWatch(long watchId); 
        – watchId로 등록된 WatchOperation을 종료시키는 함수. 
          만약 watchId로 등록된 watchOperation이 없을 경우 아무런 작업도 수행하지 않은채 종료한다.
    }
    interface PositionCallback {
        void handleEvent(Position position);
        – 성공적으로 위치정보를 얻었을 때 호출되는 Callback 함수로써 인자로 Position info를 취한다.
    }
    interface PositionErrorCallback {
        void handleEvent(PositionError error);
        – 위치정보를 얻는 과정에서 문제가 발생하였을 때 호출되는 Callback 함수로써 인자로 Error info를 취한다.
    }
    interface PositionOptions {
        boolean enableHighAccuracy;
        long timeout;
        long maximumAge;
    }
    enableHighAccuracy : true일 경우 가장 정확한 값을 얻어서 반환한다. default = false.

    timeout : 위치 정보 값을 얻는 제한시간을 millisecond 단위로 설정하는 값. 만약 timeout값이 1000이라면 1초간
    위치정보를 수신한 뒤 값을 얻을 수 없으면 TIMEOUT error를 발생시킨다. timeout이 0일 경우는 cashed된 값을
    확인한 뒤, 만약 cashed된 값이 없을 경우 실패. default = Infinity.

    maximumAge : 위치정보 값이 얼마나 신선한지를 millisecond 단위로 표현한 값. 예를 들어 이 값이 60000일 경우
    60초가 지난 GPS값은 유효하지 않은 것으로 분류한다. 만약 maximumAge가 0일 경우 항상 새로운 위치정보 값을 
   수신해야 한다. default = 0.
    interface Position {
        readonly Coordinates coords;
        readonly DOMTimeStamp timestamp;
    }
    – successCallback의 인자로 GeoLocation 정보가 담겨져 인자로 전달되는 구조체, 위치 정보를 담기 위한 coords와
       위치정보값을 언제 획득했는지 시간정보가 담겨져 있는 timestamp를 내부변수로 갖는다.
    interface Coordinates {
        readonly double latitude;
        readonly double longitude;
        readonly double altitude;
        readonly double accuracy;
        readonly double altitudeAccuracy;
        readonly double heading;
        readonly double speed;
    }
    interface PositionError {
        const unsigned short PERMISSION_DENIED = 1;
        const unsigned short POSITION_UNAVAILABLE = 2;
        const unsigned short TIMEOUT = 3;
        readonly unsigned short code;
        readonly DOMString message;
    }