@josuelmm/capacitor-background-geolocation 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/JosuelmmCapacitorBackgroundGeolocation.podspec +34 -0
  2. package/LICENSE +17 -0
  3. package/NOTICE.md +32 -0
  4. package/Package.swift +45 -0
  5. package/README.md +402 -0
  6. package/android/build.gradle +79 -0
  7. package/android/proguard-rules.pro +1 -0
  8. package/android/src/main/AndroidManifest.xml +83 -0
  9. package/android/src/main/java/com/evgenii/jsevaluator/HandlerWrapper.java +18 -0
  10. package/android/src/main/java/com/evgenii/jsevaluator/JavaScriptInterface.java +22 -0
  11. package/android/src/main/java/com/evgenii/jsevaluator/JsEvaluator.java +133 -0
  12. package/android/src/main/java/com/evgenii/jsevaluator/JsFunctionCallFormatter.java +37 -0
  13. package/android/src/main/java/com/evgenii/jsevaluator/WebViewWrapper.java +71 -0
  14. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/CallJavaResultInterface.java +8 -0
  15. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/HandlerWrapperInterface.java +5 -0
  16. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsCallback.java +10 -0
  17. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/JsEvaluatorInterface.java +18 -0
  18. package/android/src/main/java/com/evgenii/jsevaluator/interfaces/WebViewWrapperInterface.java +14 -0
  19. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/BackgroundGeolocationPlugin.java +898 -0
  20. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/ConfigMapper.java +303 -0
  21. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/HeadlessTaskRegistry.java +34 -0
  22. package/android/src/main/java/com/josuelmm/capacitor/backgroundgeolocation/JsEvaluatorTaskRunner.java +63 -0
  23. package/android/src/main/java/com/marianhello/bgloc/BackgroundGeolocationFacade.java +699 -0
  24. package/android/src/main/java/com/marianhello/bgloc/BootCompletedReceiver.java +103 -0
  25. package/android/src/main/java/com/marianhello/bgloc/Config.java +1155 -0
  26. package/android/src/main/java/com/marianhello/bgloc/ConnectivityListener.java +5 -0
  27. package/android/src/main/java/com/marianhello/bgloc/HttpPostService.java +362 -0
  28. package/android/src/main/java/com/marianhello/bgloc/LocationManager.java +138 -0
  29. package/android/src/main/java/com/marianhello/bgloc/PluginDelegate.java +45 -0
  30. package/android/src/main/java/com/marianhello/bgloc/PluginException.java +38 -0
  31. package/android/src/main/java/com/marianhello/bgloc/PostLocationTask.java +238 -0
  32. package/android/src/main/java/com/marianhello/bgloc/ResourceResolver.java +55 -0
  33. package/android/src/main/java/com/marianhello/bgloc/data/AbstractLocationTemplate.java +69 -0
  34. package/android/src/main/java/com/marianhello/bgloc/data/ArrayListLocationTemplate.java +88 -0
  35. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundActivity.java +108 -0
  36. package/android/src/main/java/com/marianhello/bgloc/data/BackgroundLocation.java +1088 -0
  37. package/android/src/main/java/com/marianhello/bgloc/data/ConfigJsonMapper.java +211 -0
  38. package/android/src/main/java/com/marianhello/bgloc/data/ConfigurationDAO.java +13 -0
  39. package/android/src/main/java/com/marianhello/bgloc/data/DAOFactory.java +17 -0
  40. package/android/src/main/java/com/marianhello/bgloc/data/HashMapLocationTemplate.java +82 -0
  41. package/android/src/main/java/com/marianhello/bgloc/data/LocationDAO.java +27 -0
  42. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplate.java +12 -0
  43. package/android/src/main/java/com/marianhello/bgloc/data/LocationTemplateFactory.java +71 -0
  44. package/android/src/main/java/com/marianhello/bgloc/data/LocationTransform.java +19 -0
  45. package/android/src/main/java/com/marianhello/bgloc/data/SessionLocationDAO.java +18 -0
  46. package/android/src/main/java/com/marianhello/bgloc/data/provider/ContentProviderLocationDAO.java +406 -0
  47. package/android/src/main/java/com/marianhello/bgloc/data/provider/LocationContentProvider.java +321 -0
  48. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationContract.java +94 -0
  49. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteConfigurationDAO.java +227 -0
  50. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationContract.java +122 -0
  51. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteLocationDAO.java +550 -0
  52. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteOpenHelper.java +189 -0
  53. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionContract.java +74 -0
  54. package/android/src/main/java/com/marianhello/bgloc/data/sqlite/SQLiteSessionLocationDAO.java +169 -0
  55. package/android/src/main/java/com/marianhello/bgloc/driving/DrivingEventsDetector.java +265 -0
  56. package/android/src/main/java/com/marianhello/bgloc/headless/AbstractTaskRunner.java +15 -0
  57. package/android/src/main/java/com/marianhello/bgloc/headless/ActivityTask.java +48 -0
  58. package/android/src/main/java/com/marianhello/bgloc/headless/JsCallback.java +10 -0
  59. package/android/src/main/java/com/marianhello/bgloc/headless/LocationTask.java +60 -0
  60. package/android/src/main/java/com/marianhello/bgloc/headless/StationaryTask.java +25 -0
  61. package/android/src/main/java/com/marianhello/bgloc/headless/Task.java +8 -0
  62. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunner.java +5 -0
  63. package/android/src/main/java/com/marianhello/bgloc/headless/TaskRunnerFactory.java +8 -0
  64. package/android/src/main/java/com/marianhello/bgloc/http/UrlTemplateResolver.java +115 -0
  65. package/android/src/main/java/com/marianhello/bgloc/oem/BatteryOemHelper.java +214 -0
  66. package/android/src/main/java/com/marianhello/bgloc/provider/AbstractLocationProvider.java +218 -0
  67. package/android/src/main/java/com/marianhello/bgloc/provider/ActivityRecognitionLocationProvider.java +385 -0
  68. package/android/src/main/java/com/marianhello/bgloc/provider/DistanceFilterLocationProvider.java +685 -0
  69. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProvider.java +32 -0
  70. package/android/src/main/java/com/marianhello/bgloc/provider/LocationProviderFactory.java +47 -0
  71. package/android/src/main/java/com/marianhello/bgloc/provider/ProviderDelegate.java +12 -0
  72. package/android/src/main/java/com/marianhello/bgloc/provider/RawLocationProvider.java +175 -0
  73. package/android/src/main/java/com/marianhello/bgloc/sensor/SensorFusionDetector.java +199 -0
  74. package/android/src/main/java/com/marianhello/bgloc/service/LocationService.java +16 -0
  75. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceImpl.java +1531 -0
  76. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfo.java +6 -0
  77. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceInfoImpl.java +41 -0
  78. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceIntentBuilder.java +203 -0
  79. package/android/src/main/java/com/marianhello/bgloc/service/LocationServiceProxy.java +156 -0
  80. package/android/src/main/java/com/marianhello/bgloc/sync/AccountHelper.java +39 -0
  81. package/android/src/main/java/com/marianhello/bgloc/sync/Authenticator.java +68 -0
  82. package/android/src/main/java/com/marianhello/bgloc/sync/AuthenticatorService.java +28 -0
  83. package/android/src/main/java/com/marianhello/bgloc/sync/BatchManager.java +311 -0
  84. package/android/src/main/java/com/marianhello/bgloc/sync/NotificationHelper.java +148 -0
  85. package/android/src/main/java/com/marianhello/bgloc/sync/SyncAdapter.java +301 -0
  86. package/android/src/main/java/com/marianhello/bgloc/sync/SyncService.java +68 -0
  87. package/android/src/main/java/com/marianhello/logging/DBLogReader.java +208 -0
  88. package/android/src/main/java/com/marianhello/logging/LogEntry.java +99 -0
  89. package/android/src/main/java/com/marianhello/logging/LoggerManager.java +70 -0
  90. package/android/src/main/java/com/marianhello/logging/UncaughtExceptionLogger.java +36 -0
  91. package/android/src/main/java/com/marianhello/utils/CloneHelper.java +22 -0
  92. package/android/src/main/java/com/marianhello/utils/Convert.java +56 -0
  93. package/android/src/main/java/com/marianhello/utils/TextUtils.java +72 -0
  94. package/android/src/main/java/com/marianhello/utils/ToneGenerator.java +68 -0
  95. package/android/src/main/java/org/apache/commons/io/Charsets.java +153 -0
  96. package/android/src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java +344 -0
  97. package/android/src/main/java/org/chromium/content/browser/ThreadUtils.java +134 -0
  98. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlExpression.java +398 -0
  99. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlSelectStatement.java +671 -0
  100. package/android/src/main/java/ru/andremoniy/sqlbuilder/SqlStatement.java +29 -0
  101. package/android/src/main/java/ru/andremoniy/utils/TextUtils.java +61 -0
  102. package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  103. package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  104. package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  105. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  106. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  107. package/android/src/main/res/values/strings.xml +15 -0
  108. package/android/src/main/res/xml/authenticator.xml +7 -0
  109. package/android/src/main/res/xml/syncadapter.xml +9 -0
  110. package/dist/esm/definitions.d.ts +1052 -0
  111. package/dist/esm/definitions.js +142 -0
  112. package/dist/esm/definitions.js.map +1 -0
  113. package/dist/esm/index.d.ts +8 -0
  114. package/dist/esm/index.js +23 -0
  115. package/dist/esm/index.js.map +1 -0
  116. package/dist/esm/web.d.ts +92 -0
  117. package/dist/esm/web.js +242 -0
  118. package/dist/esm/web.js.map +1 -0
  119. package/dist/plugin.cjs.js +415 -0
  120. package/dist/plugin.cjs.js.map +1 -0
  121. package/dist/plugin.js +418 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin-Bridging-Header.h +18 -0
  124. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.m +52 -0
  125. package/ios/Sources/BackgroundGeolocationPlugin/BackgroundGeolocationPlugin.swift +750 -0
  126. package/ios/Tests/BackgroundGeolocationPluginTests/BackgroundGeolocationPluginTests.swift +12 -0
  127. package/ios/common/BackgroundGeolocation/CocoaLumberjack.h +1945 -0
  128. package/ios/common/BackgroundGeolocation/CocoaLumberjack.m +5255 -0
  129. package/ios/common/BackgroundGeolocation/FMDB.h +2357 -0
  130. package/ios/common/BackgroundGeolocation/FMDB.m +2672 -0
  131. package/ios/common/BackgroundGeolocation/FMDBLogger.h +42 -0
  132. package/ios/common/BackgroundGeolocation/FMDBLogger.m +264 -0
  133. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.h +41 -0
  134. package/ios/common/BackgroundGeolocation/INTULocationManager/INTUHeadingRequest.m +68 -0
  135. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager+Internal.h +33 -0
  136. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.h +178 -0
  137. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationManager.m +1025 -0
  138. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.h +103 -0
  139. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequest.m +238 -0
  140. package/ios/common/BackgroundGeolocation/INTULocationManager/INTULocationRequestDefines.h +163 -0
  141. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.h +39 -0
  142. package/ios/common/BackgroundGeolocation/INTULocationManager/INTURequestIDGenerator.m +37 -0
  143. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.h +51 -0
  144. package/ios/common/BackgroundGeolocation/MAURAbstractLocationProvider.m +53 -0
  145. package/ios/common/BackgroundGeolocation/MAURActivity.h +23 -0
  146. package/ios/common/BackgroundGeolocation/MAURActivity.m +52 -0
  147. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.h +18 -0
  148. package/ios/common/BackgroundGeolocation/MAURActivityLocationProvider.m +340 -0
  149. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.h +88 -0
  150. package/ios/common/BackgroundGeolocation/MAURBackgroundGeolocationFacade.m +1193 -0
  151. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.h +46 -0
  152. package/ios/common/BackgroundGeolocation/MAURBackgroundSync.m +283 -0
  153. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.h +25 -0
  154. package/ios/common/BackgroundGeolocation/MAURBackgroundTaskManager.m +105 -0
  155. package/ios/common/BackgroundGeolocation/MAURConfig.h +99 -0
  156. package/ios/common/BackgroundGeolocation/MAURConfig.m +636 -0
  157. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.h +53 -0
  158. package/ios/common/BackgroundGeolocation/MAURConfigurationContract.m +54 -0
  159. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.h +20 -0
  160. package/ios/common/BackgroundGeolocation/MAURDistanceFilterLocationProvider.m +550 -0
  161. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.h +17 -0
  162. package/ios/common/BackgroundGeolocation/MAURGeolocationOpenHelper.m +124 -0
  163. package/ios/common/BackgroundGeolocation/MAURLocation.h +73 -0
  164. package/ios/common/BackgroundGeolocation/MAURLocation.m +392 -0
  165. package/ios/common/BackgroundGeolocation/MAURLocationContract.h +38 -0
  166. package/ios/common/BackgroundGeolocation/MAURLocationContract.m +39 -0
  167. package/ios/common/BackgroundGeolocation/MAURLocationManager.h +53 -0
  168. package/ios/common/BackgroundGeolocation/MAURLocationManager.m +305 -0
  169. package/ios/common/BackgroundGeolocation/MAURLogReader.h +26 -0
  170. package/ios/common/BackgroundGeolocation/MAURLogReader.m +122 -0
  171. package/ios/common/BackgroundGeolocation/MAURLogging.h +19 -0
  172. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.h +53 -0
  173. package/ios/common/BackgroundGeolocation/MAURPostLocationTask.m +367 -0
  174. package/ios/common/BackgroundGeolocation/MAURProviderDelegate.h +52 -0
  175. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.h +18 -0
  176. package/ios/common/BackgroundGeolocation/MAURRawLocationProvider.m +138 -0
  177. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.h +26 -0
  178. package/ios/common/BackgroundGeolocation/MAURSQLiteConfigurationDAO.m +335 -0
  179. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.h +57 -0
  180. package/ios/common/BackgroundGeolocation/MAURSQLiteHelper.m +93 -0
  181. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.h +52 -0
  182. package/ios/common/BackgroundGeolocation/MAURSQLiteLocationDAO.m +520 -0
  183. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.h +32 -0
  184. package/ios/common/BackgroundGeolocation/MAURSQLiteOpenHelper.m +276 -0
  185. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.h +41 -0
  186. package/ios/common/BackgroundGeolocation/MAURSensorFusionDetector.m +137 -0
  187. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.h +29 -0
  188. package/ios/common/BackgroundGeolocation/MAURSessionLocationContract.m +31 -0
  189. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.h +25 -0
  190. package/ios/common/BackgroundGeolocation/MAURSessionLocationDAO.m +153 -0
  191. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.h +20 -0
  192. package/ios/common/BackgroundGeolocation/MAURUncaughtExceptionLogger.m +62 -0
  193. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.h +31 -0
  194. package/ios/common/BackgroundGeolocation/MAURUrlTemplateResolver.m +107 -0
  195. package/ios/common/BackgroundGeolocation/Reachability.h +102 -0
  196. package/ios/common/BackgroundGeolocation/Reachability.m +475 -0
  197. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/README.md +170 -0
  198. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.h +55 -0
  199. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/ext/NSString+ZIMString.m +47 -0
  200. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlDataManipulationCommand.h +27 -0
  201. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.h +250 -0
  202. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlExpression.m +259 -0
  203. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.h +360 -0
  204. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlSelectStatement.m +427 -0
  205. package/ios/common/BackgroundGeolocation/SQLQueryBuilder/sql/ZIMSqlStatement.h +37 -0
  206. package/ios/common/BackgroundGeolocation/module.modulemap +16 -0
  207. package/package.json +82 -0
@@ -0,0 +1,335 @@
1
+ //
2
+ // MAURSQLiteConfigurationDAO.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 01/12/2017.
6
+ // Copyright © 2017 mauron85. All rights reserved.
7
+ //
8
+
9
+ #import <sqlite3.h>
10
+ #import <CoreLocation/CoreLocation.h>
11
+ #import "MAURSQLiteHelper.h"
12
+ #import "MAURGeolocationOpenHelper.h"
13
+ #import "MAURSQLiteConfigurationDAO.h"
14
+ #import "MAURConfigurationContract.h"
15
+ #import "MAURConfig.h"
16
+
17
+ @implementation MAURSQLiteConfigurationDAO {
18
+ FMDatabaseQueue* queue;
19
+ MAURGeolocationOpenHelper *helper;
20
+ }
21
+
22
+ #pragma mark Singleton Methods
23
+
24
+ + (instancetype) sharedInstance
25
+ {
26
+ static MAURSQLiteConfigurationDAO *instance = nil;
27
+ static dispatch_once_t onceToken;
28
+ dispatch_once(&onceToken, ^{
29
+ instance = [[self alloc] init];
30
+ });
31
+
32
+ return instance;
33
+ }
34
+
35
+ - (id) init {
36
+ if (self = [super init]) {
37
+ helper = [[MAURGeolocationOpenHelper alloc] init];
38
+ queue = [helper getWritableDatabase];
39
+ }
40
+ return self;
41
+ }
42
+
43
+ - (BOOL) persistConfiguration:(MAURConfig*)config
44
+ {
45
+ __block BOOL success = NO;
46
+
47
+ NSError *error = nil;
48
+
49
+ NSString *httpHeadersString = [config getHttpHeadersAsString:&error];
50
+ if (error != nil) {
51
+ NSLog(@"Http headers serialization error: %@", error);
52
+ return false;
53
+ }
54
+
55
+ NSString *templateString = [config getTemplateAsString:&error];
56
+ if (error != nil) {
57
+ NSLog(@"Template serialization error: %@", error);
58
+ return false;
59
+ }
60
+
61
+ NSString *sql = @"INSERT OR REPLACE INTO " @CC_TABLE_NAME @" ("
62
+ @CC_COLUMN_NAME_ID
63
+ @COMMA_SEP @CC_COLUMN_NAME_RADIUS
64
+ @COMMA_SEP @CC_COLUMN_NAME_DISTANCE_FILTER
65
+ @COMMA_SEP @CC_COLUMN_NAME_DESIRED_ACCURACY
66
+ @COMMA_SEP @CC_COLUMN_NAME_DEBUG
67
+ @COMMA_SEP @CC_COLUMN_NAME_ACTIVITY_TYPE
68
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_TITLE
69
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_TEXT
70
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_LARGE
71
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_SMALL
72
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_COLOR
73
+ @COMMA_SEP @CC_COLUMN_NAME_STOP_TERMINATE
74
+ @COMMA_SEP @CC_COLUMN_NAME_START_BOOT
75
+ @COMMA_SEP @CC_COLUMN_NAME_START_FOREGROUND
76
+ @COMMA_SEP @CC_COLUMN_NAME_STOP_ON_STILL
77
+ @COMMA_SEP @CC_COLUMN_NAME_LOCATION_PROVIDER
78
+ @COMMA_SEP @CC_COLUMN_NAME_INTERVAL
79
+ @COMMA_SEP @CC_COLUMN_NAME_FASTEST_INTERVAL
80
+ @COMMA_SEP @CC_COLUMN_NAME_ACTIVITIES_INTERVAL
81
+ @COMMA_SEP @CC_COLUMN_NAME_URL
82
+ @COMMA_SEP @CC_COLUMN_NAME_SYNC_URL
83
+ @COMMA_SEP @CC_COLUMN_NAME_SYNC_THRESHOLD
84
+ @COMMA_SEP @CC_COLUMN_NAME_SYNC_ENABLED
85
+ @COMMA_SEP @CC_COLUMN_NAME_HEADERS
86
+ @COMMA_SEP @CC_COLUMN_NAME_SAVE_BATTERY
87
+ @COMMA_SEP @CC_COLUMN_NAME_MAX_LOCATIONS
88
+ @COMMA_SEP @CC_COLUMN_NAME_PAUSE_LOCATION_UPDATES
89
+ @COMMA_SEP @CC_COLUMN_NAME_TEMPLATE
90
+ @COMMA_SEP @CC_COLUMN_NAME_LAST_UPDATED_AT
91
+ @COMMA_SEP @CC_COLUMN_NAME_CONFIG_JSON
92
+ @") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,DateTime('now'),?)";
93
+
94
+ [queue inDatabase:^(FMDatabase *database) {
95
+ success = [database executeUpdate:sql,
96
+ @(1), // config id
97
+ [config hasStationaryRadius] ? config.stationaryRadius : @CC_COLUMN_NAME_NULLABLE,
98
+ [config hasDistanceFilter] ? config.distanceFilter : @CC_COLUMN_NAME_NULLABLE,
99
+ [config hasDesiredAccuracy] ? config.desiredAccuracy : @CC_COLUMN_NAME_NULLABLE,
100
+ [config hasDebug] ? config._debug : @CC_COLUMN_NAME_NULLABLE,
101
+ [config hasActivityType] ? config.activityType : @CC_COLUMN_NAME_NULLABLE,
102
+ [NSNull null], // unsupported notificationTitle
103
+ [NSNull null], // unsupported notificationText
104
+ [NSNull null], // unsupported notificationIconLarge
105
+ [NSNull null], // unsupported notificationIconSmall
106
+ [NSNull null], // unsupported notificationIconColor
107
+ [config hasStopOnTerminate] ? config._stopOnTerminate : @CC_COLUMN_NAME_NULLABLE,
108
+ [NSNull null], // unsupported startOnBoot,
109
+ [NSNull null], // unsupported startForeground
110
+ [NSNull null], // unsupported stopOnStillActivity
111
+ [config hasLocationProvider] ? config.locationProvider : @CC_COLUMN_NAME_NULLABLE,
112
+ [NSNull null], // unsupported interval
113
+ [NSNull null], // unsupported fastestInterval
114
+ [config hasActivitiesInterval] ? config.activitiesInterval : @CC_COLUMN_NAME_NULLABLE,
115
+ [config hasUrl] ? config.url : @CC_COLUMN_NAME_NULLABLE,
116
+ [config hasSyncUrl] ? config.syncUrl : @CC_COLUMN_NAME_NULLABLE,
117
+ [config hasSyncThreshold] ? config.syncThreshold : @CC_COLUMN_NAME_NULLABLE,
118
+ [config hasSyncEnabled] ? [NSNumber numberWithBool:[config syncEnabled]] : @CC_COLUMN_NAME_NULLABLE,
119
+ (httpHeadersString != nil) ? httpHeadersString : @CC_COLUMN_NAME_NULLABLE,
120
+ [config hasSaveBatteryOnBackground] ? config._saveBatteryOnBackground : @CC_COLUMN_NAME_NULLABLE,
121
+ [config hasMaxLocations] ? config.maxLocations : @CC_COLUMN_NAME_NULLABLE,
122
+ [config hasPauseLocationUpdates] ? config._pauseLocationUpdates : @CC_COLUMN_NAME_NULLABLE,
123
+ (templateString != nil) ? templateString : @CC_COLUMN_NAME_NULLABLE,
124
+ // v4.5: full Config as JSON for paridad con Android
125
+ [self serializeConfigToJson:config]
126
+ ];
127
+
128
+ if (success) {
129
+ NSLog(@"Configuration persisted succesfuly");
130
+ } else {
131
+ NSLog(@"Persisting configuration has failed code: %d: message: %@", [database lastErrorCode], [database lastErrorMessage]);
132
+ }
133
+ }];
134
+
135
+ return success;
136
+ }
137
+
138
+ - (MAURConfig*) retrieveConfiguration
139
+ {
140
+ __block MAURConfig *config = nil;
141
+
142
+ NSString *sql = @"SELECT "
143
+ CC_COLUMN_NAME_ID
144
+ @COMMA_SEP @CC_COLUMN_NAME_RADIUS
145
+ @COMMA_SEP @CC_COLUMN_NAME_DISTANCE_FILTER
146
+ @COMMA_SEP @CC_COLUMN_NAME_DESIRED_ACCURACY
147
+ @COMMA_SEP @CC_COLUMN_NAME_DEBUG
148
+ @COMMA_SEP @CC_COLUMN_NAME_ACTIVITY_TYPE
149
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_TITLE
150
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_TEXT
151
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_LARGE
152
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_ICON_SMALL
153
+ @COMMA_SEP @CC_COLUMN_NAME_NOTIF_COLOR
154
+ @COMMA_SEP @CC_COLUMN_NAME_STOP_TERMINATE
155
+ @COMMA_SEP @CC_COLUMN_NAME_START_BOOT
156
+ @COMMA_SEP @CC_COLUMN_NAME_START_FOREGROUND
157
+ @COMMA_SEP @CC_COLUMN_NAME_STOP_ON_STILL
158
+ @COMMA_SEP @CC_COLUMN_NAME_LOCATION_PROVIDER
159
+ @COMMA_SEP @CC_COLUMN_NAME_INTERVAL
160
+ @COMMA_SEP @CC_COLUMN_NAME_FASTEST_INTERVAL
161
+ @COMMA_SEP @CC_COLUMN_NAME_ACTIVITIES_INTERVAL
162
+ @COMMA_SEP @CC_COLUMN_NAME_URL
163
+ @COMMA_SEP @CC_COLUMN_NAME_SYNC_URL
164
+ @COMMA_SEP @CC_COLUMN_NAME_SYNC_THRESHOLD
165
+ @COMMA_SEP @CC_COLUMN_NAME_SYNC_ENABLED
166
+ @COMMA_SEP @CC_COLUMN_NAME_HEADERS
167
+ @COMMA_SEP @CC_COLUMN_NAME_SAVE_BATTERY
168
+ @COMMA_SEP @CC_COLUMN_NAME_MAX_LOCATIONS
169
+ @COMMA_SEP @CC_COLUMN_NAME_PAUSE_LOCATION_UPDATES
170
+ @COMMA_SEP @CC_COLUMN_NAME_TEMPLATE
171
+ @COMMA_SEP @CC_COLUMN_NAME_CONFIG_JSON
172
+ @" FROM " @CC_TABLE_NAME @" WHERE " @CC_COLUMN_NAME_ID @" = 1";
173
+
174
+ [queue inDatabase:^(FMDatabase *database) {
175
+ FMResultSet *rs = [database executeQuery:sql];
176
+ while([rs next]) {
177
+ config = [[MAURConfig alloc] init];
178
+ if ([self isNonNull:rs columnIndex:1]) {
179
+ config.stationaryRadius = [NSNumber numberWithInt:[rs intForColumnIndex:1]];
180
+ }
181
+ if ([self isNonNull:rs columnIndex:2]) {
182
+ config.distanceFilter = [NSNumber numberWithInt:[rs intForColumnIndex:2]];
183
+ }
184
+ if ([self isNonNull:rs columnIndex:3]) {
185
+ config.desiredAccuracy = [NSNumber numberWithInt:[rs intForColumnIndex:3]];
186
+ }
187
+ if ([self isNonNull:rs columnIndex:4]) {
188
+ config._debug = [NSNumber numberWithBool:[rs intForColumnIndex:4] == 1 ? YES : NO];
189
+ }
190
+ if ([self isNonNull:rs columnIndex:5]) {
191
+ config.activityType = [rs stringForColumnIndex:5];
192
+ }
193
+ if ([self isNonNull:rs columnIndex:11]) {
194
+ config._stopOnTerminate = [NSNumber numberWithBool:[rs intForColumnIndex:11] == 1 ? YES : NO];
195
+ }
196
+ if ([self isNonNull:rs columnIndex:15]) {
197
+ config.locationProvider = [NSNumber numberWithInt:[rs intForColumnIndex:15]];
198
+ }
199
+ if ([self isNonNull:rs columnIndex:18]) {
200
+ config.activitiesInterval = [NSNumber numberWithInt:[rs intForColumnIndex:18]];
201
+ }
202
+ if ([self isNonNull:rs columnIndex:19]) {
203
+ config.url = [rs stringForColumnIndex:19];
204
+ }
205
+ if ([self isNonNull:rs columnIndex:20]) {
206
+ config.syncUrl = [rs stringForColumnIndex:20];
207
+ }
208
+ if ([self isNonNull:rs columnIndex:21]) {
209
+ config.syncThreshold = [NSNumber numberWithInt:[rs intForColumnIndex:21]];
210
+ }
211
+ id syncEnabledVal = [rs objectForColumnIndex:22];
212
+ if (syncEnabledVal != nil && syncEnabledVal != [NSNull null]) {
213
+ config.syncEnabled = [NSNumber numberWithBool:[rs intForColumnIndex:22] == 1 ? YES : NO];
214
+ }
215
+ if ([self isNonNull:rs columnIndex:23]) {
216
+ NSString *httpHeadersString = [rs stringForColumnIndex:23];
217
+ if (httpHeadersString != nil) {
218
+ NSData *jsonHttpHeaders = [httpHeadersString dataUsingEncoding:NSUTF8StringEncoding];
219
+ config.httpHeaders = [NSJSONSerialization JSONObjectWithData:jsonHttpHeaders options:0 error:nil];
220
+ }
221
+ }
222
+ if ([self isNonNull:rs columnIndex:24]) {
223
+ config._saveBatteryOnBackground = [NSNumber numberWithBool:[rs intForColumnIndex:24] == 1 ? YES : NO];
224
+ }
225
+ if ([self isNonNull:rs columnIndex:25]) {
226
+ config.maxLocations = [NSNumber numberWithInt:[rs intForColumnIndex:25]];
227
+ }
228
+ if ([self isNonNull:rs columnIndex:26]) {
229
+ config._pauseLocationUpdates = [NSNumber numberWithBool:[rs intForColumnIndex:26] == 1 ? YES : NO];
230
+ }
231
+ if ([self isNonNull:rs columnIndex:27]) {
232
+ NSString *templateAsString = [rs stringForColumnIndex:27];
233
+ if (templateAsString != nil) {
234
+ NSData *jsonTemplate = [templateAsString dataUsingEncoding:NSUTF8StringEncoding];
235
+ config._template = [NSJSONSerialization JSONObjectWithData:jsonTemplate options:0 error:nil];
236
+ }
237
+ }
238
+ // v4.5: rehydrate post-3.2 keys from config_json blob (paridad Android).
239
+ // Index 28 is the new column. Strict NULL check (no NULLHACK sentinel for JSON column).
240
+ if (![rs columnIndexIsNull:28]) {
241
+ NSString *jsonString = [rs stringForColumnIndex:28];
242
+ if (jsonString != nil && jsonString.length > 0) {
243
+ [self applyConfigJson:jsonString to:config];
244
+ }
245
+ }
246
+ }
247
+
248
+ [rs close];
249
+ }];
250
+
251
+ return config;
252
+ }
253
+
254
+ // v4.5: serialize all post-3.2 keys to JSON for storage. Mirrors Android ConfigJsonMapper.
255
+ - (NSString*) serializeConfigToJson:(MAURConfig*)config
256
+ {
257
+ NSMutableDictionary *j = [NSMutableDictionary dictionary];
258
+ if (config.httpMethod != nil) j[@"httpMethod"] = config.httpMethod;
259
+ if (config.syncHttpMethod != nil) j[@"syncHttpMethod"] = config.syncHttpMethod;
260
+ if (config.httpMode != nil) j[@"httpMode"] = config.httpMode;
261
+ if (config.syncMode != nil) j[@"syncMode"] = config.syncMode;
262
+ if (config.queryParams != nil) j[@"queryParams"] = config.queryParams;
263
+ if (config.heartbeatInterval != nil) j[@"heartbeatInterval"] = config.heartbeatInterval;
264
+ if (config.mockLocationPolicy != nil) j[@"mockLocationPolicy"] = config.mockLocationPolicy;
265
+ if (config.drivingEvents != nil) j[@"drivingEvents"] = config.drivingEvents;
266
+ if (config.includeBattery != nil) j[@"includeBattery"] = config.includeBattery;
267
+ if (config._showsBackgroundLocationIndicator != nil) j[@"showsBackgroundLocationIndicator"] = config._showsBackgroundLocationIndicator;
268
+ NSError *err = nil;
269
+ NSData *data = [NSJSONSerialization dataWithJSONObject:j options:0 error:&err];
270
+ if (err != nil || data == nil) return @"";
271
+ return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
272
+ }
273
+
274
+ - (void) applyConfigJson:(NSString*)jsonString to:(MAURConfig*)config
275
+ {
276
+ NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
277
+ NSError *err = nil;
278
+ NSDictionary *j = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err];
279
+ if (err != nil || ![j isKindOfClass:[NSDictionary class]]) return;
280
+ if (j[@"httpMethod"]) config.httpMethod = j[@"httpMethod"];
281
+ if (j[@"syncHttpMethod"]) config.syncHttpMethod = j[@"syncHttpMethod"];
282
+ if (j[@"httpMode"]) config.httpMode = j[@"httpMode"];
283
+ if (j[@"syncMode"]) config.syncMode = j[@"syncMode"];
284
+ if ([j[@"queryParams"] isKindOfClass:[NSDictionary class]]) config.queryParams = [j[@"queryParams"] mutableCopy];
285
+ if (j[@"heartbeatInterval"]) config.heartbeatInterval = j[@"heartbeatInterval"];
286
+ if (j[@"mockLocationPolicy"]) config.mockLocationPolicy = j[@"mockLocationPolicy"];
287
+ if ([j[@"drivingEvents"] isKindOfClass:[NSDictionary class]]) config.drivingEvents = j[@"drivingEvents"];
288
+ if (j[@"includeBattery"] != nil) config.includeBattery = j[@"includeBattery"];
289
+ if (j[@"showsBackgroundLocationIndicator"] != nil) config._showsBackgroundLocationIndicator = j[@"showsBackgroundLocationIndicator"];
290
+ }
291
+
292
+ - (BOOL) clearDatabase
293
+ {
294
+ __block BOOL success;
295
+
296
+ [queue inDatabase:^(FMDatabase *database) {
297
+ NSString *sql = [NSString stringWithFormat: @"DELETE FROM %@", @CC_TABLE_NAME];
298
+ if (![database executeStatements:sql]) {
299
+ NSLog(@"%@ failed code: %d: message: %@", sql, [database lastErrorCode], [database lastErrorMessage]);
300
+ success = NO;
301
+ } else {
302
+ success = YES;
303
+ }
304
+ }];
305
+
306
+ return success;
307
+ }
308
+
309
+ - (NSString*) getDatabaseName
310
+ {
311
+ return [helper getDatabaseName];
312
+ }
313
+
314
+ - (NSString*) getDatabasePath
315
+ {
316
+ return [helper getDatabasePath];
317
+ }
318
+
319
+ - (BOOL) isNonNull:(FMResultSet*)resultSet columnIndex:(int)index
320
+ {
321
+ if (![[resultSet stringForColumnIndex:index] isEqualToString:@CC_COLUMN_NAME_NULLABLE]) {
322
+ return YES;
323
+ }
324
+
325
+ return NO;
326
+ }
327
+
328
+ - (void) dealloc {
329
+ [helper close];
330
+ [queue close];
331
+ helper = nil;
332
+ queue = nil;
333
+ }
334
+
335
+ @end
@@ -0,0 +1,57 @@
1
+ //
2
+ // MAURSQLiteHelper.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 23/06/16.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #ifndef MAURSQLiteHelper_h
10
+ #define MAURSQLiteHelper_h
11
+
12
+ #import <Foundation/Foundation.h>
13
+
14
+ #define COMMA_SEP ","
15
+ #define SPACE_SEP " "
16
+ #define EQ_BIND "= ?"
17
+
18
+ static NSString * const Domain = @"SQLiteHelper";
19
+
20
+ typedef NS_ENUM(NSInteger, SQLType) {
21
+ kReal = 0, kInteger = 1, kText = 2, kDateTime = 3
22
+ };
23
+
24
+
25
+ @interface SQLColumnType : NSObject
26
+ {
27
+ @protected enum SQLType type;
28
+ }
29
+
30
+
31
+ @property enum SQLType type;
32
+ + (SQLColumnType*) sqlColumnWithType:(SQLType)type;
33
+ - (NSString*) asString;
34
+ @end
35
+
36
+
37
+ @interface SQLPrimaryKeyColumnType : SQLColumnType
38
+ + (SQLColumnType*) sqlColumnWithType:(SQLType)type;
39
+ - (NSString*) asString;
40
+ @end
41
+
42
+
43
+ @interface SQLPrimaryKeyAutoIncColumnType : SQLColumnType
44
+ + (SQLColumnType*) sqlColumnWithType:(SQLType)type;
45
+ - (NSString*) asString;
46
+ @end
47
+
48
+
49
+ typedef NSArray<NSDictionary<NSString*, SQLColumnType*>*> SQLColumns;
50
+
51
+
52
+ @interface MAURSQLiteHelper : NSObject
53
+ + (NSString*) createTableSqlStatement:(NSString*)tableName columns:(SQLColumns*)columns;
54
+ @end
55
+
56
+
57
+ #endif /* MAURSQLiteHelper_h */
@@ -0,0 +1,93 @@
1
+ //
2
+ // MAURSQLiteHelper.m
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 23/06/16.
6
+ // Copyright © 2016 mauron85. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+ #import "MAURSQLiteHelper.h"
11
+
12
+ @implementation SQLColumnType
13
+
14
+ @synthesize type;
15
+
16
+ + (SQLColumnType*) sqlColumnWithType:(SQLType)type
17
+ {
18
+ SQLColumnType *instance = [[SQLColumnType alloc] init];
19
+ instance.type = type;
20
+ return instance;
21
+ }
22
+
23
+ - (NSString*) asString
24
+ {
25
+ switch (type) {
26
+ case kReal:
27
+ return @"REAL";
28
+ case kText:
29
+ return @"TEXT";
30
+ case kInteger:
31
+ return @"INTEGER";
32
+ case kDateTime:
33
+ return @"DATETIME";
34
+ }
35
+ }
36
+ @end
37
+
38
+
39
+ @implementation SQLPrimaryKeyColumnType : SQLColumnType
40
+ + (SQLColumnType*) sqlColumnWithType:(SQLType)type
41
+ {
42
+ SQLPrimaryKeyAutoIncColumnType *instance = [[SQLPrimaryKeyAutoIncColumnType alloc] init];
43
+ instance.type = type;
44
+ return instance;
45
+ }
46
+
47
+ - (NSString*) asString
48
+ {
49
+ return [NSString stringWithFormat:@"%@ PRIMARY KEY", [super asString]];
50
+ }
51
+ @end
52
+
53
+
54
+ @implementation SQLPrimaryKeyAutoIncColumnType : SQLColumnType
55
+ + (SQLColumnType*) sqlColumnWithType:(SQLType)type
56
+ {
57
+ SQLPrimaryKeyAutoIncColumnType *instance = [[SQLPrimaryKeyAutoIncColumnType alloc] init];
58
+ instance.type = type;
59
+ return instance;
60
+ }
61
+
62
+ - (NSString*) asString
63
+ {
64
+ return [NSString stringWithFormat:@"%@ PRIMARY KEY AUTOINCREMENT", [super asString]];
65
+ }
66
+ @end
67
+
68
+
69
+ @implementation MAURSQLiteHelper
70
+
71
+ + (NSString*) createTableSqlStatement:(NSString*)tableName columns:(SQLColumns*)columns
72
+ {
73
+ NSMutableArray *sql = [NSMutableArray arrayWithObject: @"CREATE TABLE IF NOT EXISTS"];
74
+ [sql addObjectsFromArray: @[tableName, @"("]];
75
+ NSEnumerator *enumerator = [columns objectEnumerator];
76
+ id column = [enumerator nextObject];
77
+ while (nil != column) {
78
+ NSString *columnName = [column objectForKey: @"name"];
79
+ SQLColumnType *columnType = [column objectForKey: @"type"];
80
+ id nextColumn = [enumerator nextObject];
81
+ if (nil != nextColumn) {
82
+ [sql addObjectsFromArray: @[columnName, [columnType asString], @COMMA_SEP]];
83
+ } else {
84
+ [sql addObjectsFromArray: @[columnName, [columnType asString]]];
85
+ }
86
+ column = nextColumn;
87
+ }
88
+ [sql addObject: @");"];
89
+
90
+ return [sql componentsJoinedByString: @SPACE_SEP];
91
+ }
92
+
93
+ @end
@@ -0,0 +1,52 @@
1
+ //
2
+ // MAURSQLiteLocationDAO.h
3
+ // BackgroundGeolocation
4
+ //
5
+ // Created by Marian Hello on 10/06/16.
6
+ //
7
+
8
+ #ifndef MAURSQLiteLocationDAO_h
9
+ #define MAURSQLiteLocationDAO_h
10
+
11
+ #import <Foundation/Foundation.h>
12
+ #import "FMDB.h"
13
+ #import "MAURLocation.h"
14
+
15
+ @class Location;
16
+
17
+ @interface MAURSQLiteLocationDAO : NSObject
18
+
19
+ + (instancetype) sharedInstance;
20
+ - (id) init NS_UNAVAILABLE;
21
+ - (NSArray<MAURLocation*>*) getAllLocations;
22
+ - (NSArray<MAURLocation*>*) getLocationsForSync;
23
+ - (NSArray<MAURLocation*>*) getValidLocations;
24
+ - (NSNumber*) getLocationsForSyncCount;
25
+ - (NSNumber*) persistLocation:(MAURLocation*)location;
26
+ - (NSNumber*) persistLocation:(MAURLocation*)location limitRows:(NSInteger)maxRows;
27
+ - (BOOL) deleteLocation:(NSNumber*)locationId error:(NSError * __autoreleasing *)outError;
28
+ - (BOOL) deleteAllLocations:(NSError * __autoreleasing *)outError;
29
+ /** Mark all locations pending sync (PostPending) as deleted. Clears the sync queue without sending. */
30
+ - (BOOL) deletePendingSyncLocations:(NSError * __autoreleasing *)outError;
31
+ /** v4.5.1 — soft-delete only sync-pending rows whose `recorded_at` is <= cutoff (UNIX seconds).
32
+ * Used after a successful background-sync POST so locations persisted DURING the upload (race
33
+ * window) are NOT incorrectly marked deleted. */
34
+ - (BOOL) deleteSyncedLocationsBefore:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError;
35
+ /** v4.5.1 — undo the in-flight SyncPending state when the upload failed. SyncPending → PostPending
36
+ * so the next sync window re-tries them. Without this, a network failure during background-sync
37
+ * would silently drop every pending location. */
38
+ - (BOOL) restoreFailedSyncLocations:(NSError * __autoreleasing *)outError;
39
+ /** v4.5.1 — recover SyncPending rows that got stuck (app/process killed between getLocationsForSync
40
+ * and the upload's success/failure callback). Rows whose `recorded_at` is older than `cutoff`
41
+ * (UNIX seconds) are restored to PostPending so they get retried. Call before each sync window. */
42
+ - (BOOL) restoreStaleSyncLocationsOlderThan:(NSTimeInterval)cutoff error:(NSError * __autoreleasing *)outError;
43
+ - (BOOL) clearDatabase;
44
+ - (NSString*) getDatabaseName;
45
+ - (NSString*) getDatabasePath;
46
+ // private
47
+ - (NSString*) getLocationSelectString;
48
+ - (MAURLocation*) convertToLocation:(FMResultSet*)rs;
49
+
50
+ @end
51
+
52
+ #endif /* MAURSQLiteLocationDAO_h */