#ifdef MOZ_WIDGET_GONK
#include "GonkGPSGeolocationProvider.h"
#endif
nsresult nsGeolocationService::Init()
{
#ifdef MOZ_WIDGET_GONK
provider = GonkGPSGeolocationProvider::GetSingleton();
if (provider)
mProviders.AppendObject(provider);
#endif
}
#include <hardware/gps.h> // for GpsInterface
#include "nsIGeolocationProvider.h"
class GonkGPSGeolocationProvider : public nsIGeolocationProvider
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIGEOLOCATIONPROVIDER
static already_AddRefed<GonkGPSGeolocationProvider> GetSingleton();
already_AddRefed<nsIGeolocationUpdate> GetLocationCallback();
private:
/* Client should use GetSingleton() to get the provider instance. */
GonkGPSGeolocationProvider();
GonkGPSGeolocationProvider(const GonkGPSGeolocationProvider &);
GonkGPSGeolocationProvider & operator = (const GonkGPSGeolocationProvider &);
~GonkGPSGeolocationProvider();
const GpsInterface* GetGPSInterface();
static GonkGPSGeolocationProvider* sSingleton;
bool mStarted;
const GpsInterface* mGpsInterface;
nsCOMPtr<nsIGeolocationUpdate> mLocationCallback;
};
static void LocationCallback(GpsLocation* location)
{
provider = GonkGPSGeolocationProvider::GetSingleton();
callback = provider->GetLocationCallback(); // mLocationCallback
nsRefPtr<nsGeoPosition> somewhere = new nsGeoPosition(location->latitude,
location->longitude,
location->altitude,
location->accuracy,
location->accuracy,
location->bearing,
location->speed,
location->timestamp);
callback->Update(somewhere);
}
static GpsCallbacks gCallbacks = {
sizeof(GpsCallbacks),
LocationCallback,
NULL, /* StatusCallback */
NULL, /* SvStatusCallback */
NULL, /* NmeaCallback */
NULL, /* SetCapabilitiesCallback */
NULL, /* AcquireWakelockCallback */
NULL, /* ReleaseWakelockCallback */
CreateThreadCallback, /* Callback for creating a thread that can call into the JS code*/
};
GonGPSGeolocationProvider::GonGPSGeolocationProvider()
: mStarted(false)
{
mGpsInterface = GetGPSInterface();
}
GonGPSGeolocationProvider::~GonGPSGeolocationProvider()
{
Shutdown(); // mGpsInterface->stop(); Then GeolocationUpdate->cleanup();
sSingleton = NULL;
}
GonkGPSGeolocationProvider::Startup()
{
mGpsInterface->init(&gCallbacks);
// Then start(), set_position_mode();
mStarted = true;
}
GonkGPSGeolocationProvider::Watch(nsIGeolocationUpdate* aCallback)
{
mLocationCallback = aCallback;
}
mAGPSRILCallbacks = {
AGPSRILSetIDCallback,
// Dispatch a runnable that call “provider->RequestSetID(mFlags)"
AGPSRILRefLocCallback,
// Dispatch a runnable that call “provider->SetReferenceLocation()"
CreateThreadCallback,
};
mAGPSCallbacks = {
AGPSStatusCallback,
CreateThreadCallback,
};
AGPSStatusCallback
switch (status->status)
RequestDataConnection / ReleaseDataConnection
[ RequestDataConnection ]
const nsAdoptingString& apnName = Preferences::GetString("geo.gps.apn.name");
const nsAdoptingString& apnUser = Preferences::GetString("geo.gps.apn.user");
const nsAdoptingString& apnPass = Preferences::GetString("geo.gps.apn.password");
if (apnName && apnUser && apnPass) {
mRIL->SetupDataCall(1 /* DATACALL_RADIOTECHNOLOGY_GSM */,
apnName, apnUser, apnPass,
3 /* DATACALL_AUTH_PAP_OR_CHAP */,
NS_LITERAL_STRING("IP") /* pdptype */);
}
[ ReleaseDataConnection ]
mRIL->DeactivateDataCall(mCid, NS_LITERAL_STRING("Close SUPL session"));
@Bug 832925 - API changed
mRIL->DeactivateDataCallByType(NS_LITERAL_STRING(“supl"));
void GonkGPSGeolocationProvider::Init()
{
mGpsInterface = GetGPSInterface();
mGpsInterface->init(&mCallbacks);
mAGpsInterface->init(&mAGPSCallbacks);
mAGpsRilInterface->init(&mAGPSRILCallbacks);
NS_DispatchToMainThread(NS_NewRunnableMethod(this, &GonkGPSGeolocationProvider::StartGPS));
}
void GonkGPSGeolocationProvider::StartGPS()
{
if (mSupportsMSA || mSupportsMSB) {
SetupAGPS();
}
// Setup positionMode : GPS_POSITION_MODE_STANDALONE
// GPS_POSITION_MODE_ MS_ASSISTED / MS_BASED
// update = kDefaultPeriod, if mSupportScheduling =0
mGpsInterface->set_position_mode(positionMode,
GPS_POSITION_RECURRENCE_PERIODIC,
update, 0, 0);
// #if DEBUG_GPS, mGpsInterface->delete_aiding_data(GPS_DELETE_ALL);
mGpsInterface->start();
}
void GonkGPSGeolocationProvider::SetupAGPS()
{
suplServer = Preferences::GetCString("geo.gps.supl_server");
suplPort = Preferences::GetInt("geo.gps.supl_port", -1);
mAGpsInterface->set_server(AGPS_TYPE_SUPL, suplServer.get(), suplPort);
// Setup network state listener
nsIInterfaceRequestor* ireq =
dom::gonk::SystemWorkerManager::GetInterfaceRequestor();
mRIL = do_GetInterface(ireq);
mRIL->RegisterDataCallCallback(this);
}
// nsIRILDataCallback interface
GonkGPSGeolocationProvider::DataCallStateChanged (nsIRILDataCallInfo* aDataCall)
{
switch (callState)
NETWORK_STATE_CONNECTED:
mAGpsInterface->data_conn_open
NETWORK_STATE_DISCONNECTED:
mAGpsInterface->data_conn_closed
}
GonkGPSGeolocationProvider::ReceiveDataCallList (nsIRILDataCallInfo** aDataCalls, PRUint32 aLength)
Bug 1032063 - Call update_network_state and update_network_availability when network state changes for A-GPS
NS_IMETHODIMP
GonkGPSGeolocationProvider::Observe(nsISupports* aSubject,
const char* aTopic,
const char16_t* aData)
{
#ifdef MOZ_B2G_RIL
if (!strcmp(aTopic, kNetworkConnStateChangedTopic)){
// we can observe network state change here
}
#endif
}
nsGeolocationService::Init()
{
#ifdef MOZ_WIDGET_GONK
mProvider = do_CreateInstance(GONK_GPS_GEOLOCATION_PROVIDER_CONTRACTID);
#endif
...
if (Preferences::GetBool("geo.provider.use_mls", false)) {
mProvider = do_CreateInstance("@mozilla.org/geolocation/mls-provider;1");
}
}
GonkGPSGeolocationProvider::LocationCallback(GpsLocation* location)
{
NS_IMETHOD RUN() {
+ provider->mLastGPSDerivedLocationTime = PR_Now();
}
}
void GonkGPSGeolocationProvider::InjectLocation(double latitude, double longitude, float accuracy)
{
mGpsInterface->inject_location(latitude, longitude, accuracy);
// Injects current location from another location provider (typically cell ID).
//latitude and longitude are measured in degrees expected accuracy is measured in meters
}
NS_IMPL_ISUPPORTS1(GonkGPSGeolocationProvider::NetworkLocationUpdate,
nsIGeolocationUpdate)
NS_IMETHODIMP
GonkGPSGeolocationProvider::NetworkLocationUpdate::Update(nsIDOMGeoPosition *position)
{
// get coords
nsCOMPtr<nsIDOMGeoPositionCoords> coords;
position->GetCoords(getter_AddRefs(coords))
// if we haven't seen anything the GPS device for 1s,
// use this location.
provider->mLocationCallback->Update(position);
// get lat, lon, acc
coords->GetLatitude(&lat);
coords->GetLongitude(&lon);
coords->GetAccuracy(&acc);
provider -> InjectLocation(lat, lon, acc)
}
nsCOMPtr<nsIGeolocationProvider> mNetworkLocationProvider;
GonkGPSGeolocationProvider::Startup()
{
mNetworkLocationProvider = do_CreateInstance("@mozilla.org/geolocation/mls-provider;1");
if (mNetworkLocationProvider) {
nsresult rv = mNetworkLocationProvider->Startup();
if (NS_SUCCEEDED(rv)) {
nsRefPtr<NetworkLocationUpdate> update = new NetworkLocationUpdate();
mNetworkLocationProvider->Watch(update);
}
}
mLastGPSDerivedLocationTime = 0;
}
GonkGPSGeolocationProvider::Shutdown()
{
mNetworkLocationProvider->Shutdown();
mNetworkLocationProvider = nullptr
}
let newLocation = new WifiGeoPositionObject(xhr.response.location.lat,
xhr.response.location.lng,
xhr.response.accuracy);
this.notifyListener("update", [newLocation]);
Date-1.json
Date-2.json
Date-3.json
Date-4.json
All files are less than "12.5 KB"
Date-1.json
Date-2.json
Date-3.json
Date-4.json
Date-1.json
Remove
Rename
Rename
Rename
When Data-4.json is more than 12.5 KB
alphan@alphan-BM6875-BM6675-BP6375:~/tools/flash_tool/B2G-flash-tool/pvt$ adb shell logcat
I/GeckoConsole(17391): *** WIFI GEO: server returned status: 200 --> {"location":{"lat":25.0326761,"lng":121.5662895},"accuracy":100}
I/Gecko (17391): *** WIFI GEO: server returned status: 200 --> {"location":{"lat":25.0326761,"lng":121.5662895},"accuracy":100}
I/GeckoConsole(17391): geo: Using MLS, GPS age:1431067501.553000s, MLS Delta:0.000000m
I/GeckoConsole(17391): geo: injecting location (25.032676, 121.566289) accuracy: 100.000000
interface nsIMobileConnection : nsISupports
{
/**
* Request all of the current cell information known to the radio, including
* neighboring cells.
*
* @param callback
* Called when request is finished. See nsICellInfoListCallback
* for details.
*/
void getCellInfoList(in nsICellInfoListCallback callback);
}
MobileConnection::GetSupportedNetworkTypes(nsTArray<MobileNetworkType>& aTypes) const
aTypes.AppendElement(static_cast<MobileNetworkType>(type));
#include "nsIXMLHttpRequest.h"
nsCOMPtr<nsIXMLHttpRequest> mXhr;
if (mXhr != nullptr) {
mXhr->SlowAbort();
mXhr = nullptr;
}
nsresult rv;
mXhr = do_CreateInstance(NS_XMLHTTPREQUEST_CONTRACTID, &rv);
NS_NAMED_LITERAL_CSTRING(getString, "GET");
const nsAString& empty = EmptyString();
nsCOMPtr<nsIScriptSecurityManager> secman =
do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIPrincipal> systemPrincipal;
rv = secman->GetSystemPrincipal(getter_AddRefs(systemPrincipal));
NS_ENSURE_SUCCESS(rv, rv);
rv = mXhr->Init(systemPrincipal, nullptr, nullptr, nullptr);
NS_ENSURE_SUCCESS(rv, rv);
NS_NAMED_LITERAL_CSTRING(url, "你想連的網址");
rv = mXhr->Open(getString, url, false, empty, empty);
NS_ENSURE_SUCCESS(rv, rv);
mXhr->SetRequestHeader(NS_LITERAL_CSTRING("你設定的header"), NS_LITERAL_CSTRING("application/json"));
mXhr->SetMozBackgroundRequest(true);
rv = mXhr->Send(nullptr);
/*
* Since xmlHttpRequest is an ansync call, we can add the following listeners
*/
// 抓好資料時的 handler (你應該不用 listen 這個)
nsCOMPtr<mozilla::dom::EventTarget> target(do_QueryInterface(mXhr));
rv = target->AddEventListener(NS_LITERAL_STRING("load"), this, false);
NS_ENSURE_SUCCESS(rv, rv);
// onerror
rv = target->AddEventListener(NS_LITERAL_STRING("error"), this, false);
NS_ENSURE_SUCCESS(rv, rv);
let url = Services.urlFormatter.formatURLPref("geo.wifi.uri");
Date-1.json.gz
Date-2.json.gz
Date-3.json.gz
Date-4.json.gz
All files are less than "12.5 KB"
Date-1.json.gz
Date-1.json.gz
Remove
Rename
Rename
Rename
When Data-4.json is more than 12.5 KB
Date-4.json.gz
Date-3.json.gz
Date-2.json.gz
#define OLDEST_FILE_NUMBER 1
#define MAXFILENUM 4
#define MAXFILESIZE_KB 12.5 * 1024
feeding-1.json.gz
Date-1.json.gz
Move to Upload List
Rename
Rename
Rename
When Data-4.json is more than 12.5 KB
feeding-4.json.gz
feeding-3.json.gz
feeding-2.json.gz
upload01.json.gz
Move to Upload List
upload02.json.gz
upload03.json.gz
upload04.json.gz
#define OLDEST_FILE_NUMBER 1
#define MAXUPLOADFILENUM 15
#define MAXFILESIZE_KB 12.5 * 1024