public void AddOwnTrackables(TrackableGroup grp) { bool canceled = false; using (Utils.ProgressBlock progr = new Utils.ProgressBlock("GetTrackableData", "GetTrackableData", 1, 0, true)) using (var api = new LiveAPI.GeocachingLiveV6()) { List <string> trkCodes = new List <string>(); var req = new LiveAPI.LiveV6.GetTrackablesByOwnerRequest(); req.AccessToken = api.Token; req.TrackableLogsCount = 0; req.StartIndex = 0; req.MaxPerPage = Core.Settings.Default.LiveAPIGetOwnedTrackablesBatchSize; int total = 0; while (true) { var resp = api.Client.GetOwnedTrackables(req); if (resp.Status.StatusCode == 0) { if (resp.Trackables != null) { foreach (var t in resp.Trackables) { trkCodes.Add(t.Code); Core.Settings.Default.AddUpdateTrackable(grp, GetTrackableItemFromLiveAPI(t)); total++; } if (!progr.Update("GetTrackableData", total, 2 * total)) { canceled = true; break; } } if (resp.Trackables.Count() < req.MaxPerPage) { break; } else { req.StartIndex = total; System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetOwnedTrackables); } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, resp.Status.StatusMessage); break; } } if (!canceled) { progr.Update("GetTrackableData", total, total); AddUpdateTrackables(grp, trkCodes); } } }
public async Task SelectWithinRadiusAsync() { try { Core.Data.Location center = null; double radius = 0; string filter = null; object o = executeScript("getCenterPosition", null); if (o != null && o.GetType() != typeof(DBNull)) { string s = o.ToString().Replace("(", "").Replace(")", ""); center = Utils.Conversion.StringToLocation(s); } o = executeScript("getRadius", null); if (o != null && o.GetType() != typeof(DBNull)) { string s = o.ToString(); radius = Utils.Conversion.StringToDouble(s) * 1000.0; } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(new Action(() => { try { //first get a list of geocache codes List <string> gcList = OKAPIService.GetGeocachesWithinRadius(SiteManager.Instance.ActiveSite, center, radius, filter); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingOpencachingGeocaches", "ImportingOpencachingGeocaches", gcList.Count, 0, true)) { int gcupdatecount = 1; int max = gcList.Count; while (gcList.Count > 0) { List <string> lcs = gcList.Take(gcupdatecount).ToList(); gcList.RemoveRange(0, lcs.Count); List <OKAPIService.Geocache> caches = OKAPIService.GetGeocaches(SiteManager.Instance.ActiveSite, lcs); Import.AddGeocaches(Core.ApplicationData.Instance.ActiveDatabase, caches); if (!progress.Update("ImportingOpencachingGeocaches", max, max - gcList.Count)) { break; } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } })); } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public async Task SelectWithinBoundsAsync() { try { double minLat = 0.0; double minLon = 0.0; double maxLat = 0.0; double maxLon = 0.0; object o = executeScript("getBounds", null); if (o != null && o.GetType() != typeof(DBNull)) { string s = o.ToString().Replace("(", "").Replace(")", ""); string[] parts = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); minLat = Utils.Conversion.StringToDouble(parts[0]); minLon = Utils.Conversion.StringToDouble(parts[1]); maxLat = Utils.Conversion.StringToDouble(parts[2]); maxLon = Utils.Conversion.StringToDouble(parts[3]); } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(new Action(() => { try { //first get a list of geocache codes List <string> gcList = OKAPIService.GetGeocachesInBBox(SiteManager.Instance.ActiveSite, minLat, minLon, maxLat, maxLon); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportGeocaches", "ImportGeocaches", gcList.Count, 0, true)) { int gcupdatecount = 1; int max = gcList.Count; while (gcList.Count > 0) { List <string> lcs = gcList.Take(gcupdatecount).ToList(); gcList.RemoveRange(0, lcs.Count); List <OKAPIService.Geocache> caches = OKAPIService.GetGeocaches(SiteManager.Instance.ActiveSite, lcs); Import.AddGeocaches(Core.ApplicationData.Instance.ActiveDatabase, caches); if (!progress.Update("ImportGeocaches", max, max - gcList.Count)) { break; } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } })); } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public void ImportFavorites(Core.Storage.Database db) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("GetFavoritesFromGlobalcaching", "DownloadingData", 1, 0)) { using (System.Net.WebClient wc = new System.Net.WebClient()) { string doc = wc.DownloadString(string.Format("http://www.globalcaching.eu/Service/CacheFavorites.aspx?token={0}", System.Web.HttpUtility.UrlEncode(Core.Settings.Default.LiveAPIToken ?? ""))); if (doc != null) { string[] lines = doc.Replace("\r", "").Split(new char[] { '\n' }); progress.Update("SavingGeocaches", lines.Length, 0); Core.Data.Geocache gc; char[] sep = new char[] { ',' }; string[] parts; DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; foreach (string s in lines) { parts = s.Split(sep); if (parts.Length > 0) { gc = db.GeocacheCollection.GetGeocache(parts[0]); if (gc != null) { gc.Favorites = int.Parse(parts[1]); } } index++; if (DateTime.Now >= nextUpdate) { progress.Update("SavingGeocaches", lines.Length, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public void AddOwnTrackables(TrackableGroup grp) { bool canceled = false; using (Utils.ProgressBlock progr = new Utils.ProgressBlock("GetTrackableData", "GetTrackableData", 1, 0, true)) using (var api = new LiveAPI.GeocachingLiveV6()) { List<string> trkCodes = new List<string>(); var req = new LiveAPI.LiveV6.GetTrackablesByOwnerRequest(); req.AccessToken = api.Token; req.TrackableLogsCount = 0; req.StartIndex = 0; req.MaxPerPage = Core.Settings.Default.LiveAPIGetOwnedTrackablesBatchSize; int total = 0; while (true) { var resp = api.Client.GetOwnedTrackables(req); if (resp.Status.StatusCode == 0) { if (resp.Trackables != null) { foreach (var t in resp.Trackables) { trkCodes.Add(t.Code); Core.Settings.Default.AddUpdateTrackable(grp, GetTrackableItemFromLiveAPI(t)); total++; } if (!progr.Update("GetTrackableData", total, 2 * total)) { canceled = true; break; } } if (resp.Trackables.Count() < req.MaxPerPage) { break; } else { req.StartIndex = total; System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetOwnedTrackables); } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, resp.Status.StatusMessage); break; } } if (!canceled) { progr.Update("GetTrackableData", total, total); AddUpdateTrackables(grp, trkCodes); } } }
public async Task DeleteImagesFromFolder(List <Core.Data.Geocache> gcList, string folder) { await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("DeletingImages", "DeletingImages", gcList.Count, 0, true)) { string imgFolder; string checkFolder = Path.Combine(folder, "GeocachePhotos"); if (Directory.Exists(checkFolder)) { imgFolder = checkFolder; } else { imgFolder = folder; } int index = 0; foreach (var gc in gcList) { string cacheFolder = Path.Combine(imgFolder, gc.Code[gc.Code.Length - 1].ToString()); if (Directory.Exists(cacheFolder)) { cacheFolder = Path.Combine(cacheFolder, gc.Code[gc.Code.Length - 2].ToString()); if (Directory.Exists(cacheFolder)) { cacheFolder = Path.Combine(cacheFolder, gc.Code); if (Directory.Exists(cacheFolder)) { Directory.Delete(cacheFolder, true); } } } index++; if (DateTime.Now >= nextUpdate) { if (!progress.Update("DeletingImages", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
public async Task DeleteImagesFromFolder(List<Core.Data.Geocache> gcList, string folder) { await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("DeletingImages", "DeletingImages", gcList.Count, 0, true)) { string imgFolder; string checkFolder = Path.Combine(folder, "GeocachePhotos"); if (Directory.Exists(checkFolder)) { imgFolder = checkFolder; } else { imgFolder = folder; } int index = 0; foreach (var gc in gcList) { string cacheFolder = Path.Combine(imgFolder, gc.Code[gc.Code.Length - 1].ToString()); if (Directory.Exists(cacheFolder)) { cacheFolder = Path.Combine(cacheFolder, gc.Code[gc.Code.Length - 2].ToString()); if (Directory.Exists(cacheFolder)) { cacheFolder = Path.Combine(cacheFolder, gc.Code); if (Directory.Exists(cacheFolder)) { Directory.Delete(cacheFolder, true); } } } index++; if (DateTime.Now >= nextUpdate) { if (!progress.Update("DeletingImages", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
public static void ImportGeocaches(Core.Storage.Database db, List <string> gcCodes) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingGeocaches", "ImportingGeocaches", gcCodes.Count, 0, true)) { int totalcount = gcCodes.Count; using (var client = new GeocachingLiveV6()) { int index = 0; while (gcCodes.Count > 0) { LiveV6.SearchForGeocachesRequest req = new LiveV6.SearchForGeocachesRequest(); req.IsLite = Core.Settings.Default.LiveAPIMemberTypeId == 1; req.AccessToken = client.Token; req.CacheCode = new LiveV6.CacheCodeFilter(); req.CacheCode.CacheCodes = (from a in gcCodes select a).Take(Core.Settings.Default.LiveAPIImportGeocachesBatchSize).ToArray(); req.MaxPerPage = Core.Settings.Default.LiveAPIImportGeocachesBatchSize; req.GeocacheLogCount = 5; index += req.CacheCode.CacheCodes.Length; gcCodes.RemoveRange(0, req.CacheCode.CacheCodes.Length); var resp = client.Client.SearchForGeocaches(req); if (resp.Status.StatusCode == 0 && resp.Geocaches != null) { List <Core.Data.Geocache> upList = ImportGeocaches(db, resp.Geocaches); if (Core.Settings.Default.LiveAPIDeselectAfterUpdate) { foreach (var g in upList) { g.Selected = false; } } } else { Core.ApplicationData.Instance.Logger.AddLog(new Import(), new Exception(resp.Status.StatusMessage)); break; } if (!progress.Update("ImportingGeocaches", totalcount, index)) { break; } if (gcCodes.Count > 0) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelaySearchForGeocaches); } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), e); } }
public async Task<List<LogInfo>> LogGeocachesAsync(List<LogInfo> logInfos) { List<LogInfo> result = new List<LogInfo>(); Utils.DataUpdater upd = null; if (Core.ApplicationData.Instance.ActiveDatabase != null) { upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase); } using (Utils.ProgressBlock prog = new Utils.ProgressBlock("LogGeocache", "Logging", logInfos.Count, 0, true)) { using (var api = new LiveAPI.GeocachingLiveV6()) { foreach (LogInfo li in logInfos) { int index = 0; List<LiveAPI.LiveV6.Trackable> dropTbs = null; List<string> retrieveTbs = null; //todo: check if trackable dialog is needed //fetch in background bool ok = false; await Task.Run(() => { if (index > 0 && dropTbs == null && retrieveTbs == null) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayCreateFieldNoteAndPublish); } ok = LogGeocache(api, li, dropTbs, retrieveTbs); }); if (ok) { result.Add(li); index++; if (!prog.Update("Logging", logInfos.Count, index)) { break; } } else { break; } } } } if (upd!=null) { upd.Dispose(); upd = null; } return result; }
private void runFlow(ActionFlow flow) { try { foreach (ActionImplementation ai in flow.Actions) { ai.PrepareRun(); } //find start and run ActionStart startAction = (from a in flow.Actions where a is ActionStart select a).FirstOrDefault() as ActionStart; List <Core.Data.Geocache> gcList = startAction.PrepareFlow(); DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; bool canceled = false; using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ActionBuilder", "Executing", gcList.Count, 0, true)) { foreach (Core.Data.Geocache gc in gcList) { startAction.Run(gc); index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("Executing", gcList.Count, index)) { canceled = true; break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } if (!canceled) { //wrap up foreach (ActionImplementation ai in flow.Actions) { ai.FinalizeRun(); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public List <LiveAPI.LiveV6.GeocacheLog> GetLogsOfUser(string userName, List <Core.Data.LogType> logTypes) { List <LiveAPI.LiveV6.GeocacheLog> result = new List <LiveAPI.LiveV6.GeocacheLog>(); using (var api = new LiveAPI.GeocachingLiveV6()) { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingLogs", "ImportingLogs", 100, 0, true)) { var req = new LiveAPI.LiveV6.GetUsersGeocacheLogsRequest(); req.AccessToken = api.Token; req.ExcludeArchived = false; req.MaxPerPage = Core.Settings.Default.LiveAPIGetUsersGeocacheLogsBatchSize; req.StartIndex = 0; req.LogTypes = (from a in logTypes select(long) a.ID).ToArray(); var resp = api.Client.GetUsersGeocacheLogs(req); while (resp.Status.StatusCode == 0) { //logs.AddRange(resp.Logs); //if (resp.Logs.Count() >= req.MaxPerPage) if (resp.Logs.Count() > 0) { result.AddRange(resp.Logs); req.StartIndex = result.Count; if (!progress.Update("ImportingLogs", result.Count + req.MaxPerPage, result.Count)) { _cancelled = true; break; } System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetUsersGeocacheLogs); resp = api.Client.GetUsersGeocacheLogs(req); } else { break; } } if (resp.Status.StatusCode != 0) { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, resp.Status.StatusMessage); _cancelled = true; } } } return(result); }
public void AddUpdateTrackables(TrackableGroup grp, List <string> trkList) { using (Utils.ProgressBlock progr = new Utils.ProgressBlock("GetTrackableData", "GetTrackableData", trkList.Count, 0, true)) using (var api = new LiveAPI.GeocachingLiveV6()) { int index = 0; while (index < trkList.Count && AddUpdateTrackable(api, grp, trkList[index])) { index++; if (!progr.Update("GetTrackableData", trkList.Count, index)) { break; } else if (index < trkList.Count) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetTrackablesByTBCode); } } } }
async private Task DeleteGeocache(bool ignore) { if (cacheList.SelectedItems.Count > 0) { List <Core.Data.Geocache> gcList = new List <Core.Data.Geocache>(); foreach (Core.Data.Geocache gc in cacheList.SelectedItems) { gcList.Add(gc); } Core.ApplicationData.Instance.ActiveGeocache = null; using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(() => { int index = 0; DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("DeletingGeocaches", "DeletingGeocaches", gcList.Count, 0, true)) { foreach (var gc in gcList) { Utils.DataAccess.DeleteGeocache(gc); if (ignore) { Core.Settings.Default.AddIgnoreGeocacheCodes((new string[] { gc.Code }).ToList()); } index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("DeletingGeocaches", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } }); } } }
public async Task <List <Core.Data.Log> > GetLogsOfUser(Core.Storage.Database db, string usrName) { List <Core.Data.Log> result = new List <Core.Data.Log>(); await Task.Run(() => { try { using (Utils.ProgressBlock prog = new Utils.ProgressBlock("SearchingForLogs", "SearchingForLogs", db.LogCollection.Count, 0, true)) { int index = 0; DateTime nextUpdate = DateTime.Now.AddSeconds(1); foreach (var l in db.LogCollection) { string f = l.Finder; if (string.Compare(f, usrName, true) == 0) { result.Add(l); } index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("SearchingForLogs", db.LogCollection.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); return(result); }
public async Task CreateImageFolder(List<Core.Data.Geocache> gcList, string folder, bool download, bool NotDescrOnly, bool clearBeforeCopy) { if (download) { await OfflineImagesManager.Instance.DownloadImagesAsync(gcList, true); } await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("CreatingOfflineImageFolder", "CreatingOfflineImageFolder", gcList.Count, 0, true)) { if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } string imgFolder = Path.Combine(folder, "GeocachePhotos"); if (!Directory.Exists(imgFolder)) { Directory.CreateDirectory(imgFolder); } if (clearBeforeCopy) { string[] fls = Directory.GetFiles(imgFolder); if (fls != null) { foreach (string f in fls) { File.Delete(f); } } fls = Directory.GetDirectories(imgFolder); if (fls != null) { foreach (string f in fls) { Directory.Delete(f, true); } } } int index = 0; foreach (Core.Data.Geocache gc in gcList) { int imgIndex = 1; string cacheFolder = ""; List<string> urls = Utils.DataAccess.GetImagesOfGeocache(gc.Database, gc.Code, NotDescrOnly); Dictionary<string, string> oimgs = OfflineImagesManager.Instance.GetImages(gc); List<Core.Data.GeocacheImage> imgList = Utils.DataAccess.GetGeocacheImages(gc.Database, gc.Code); foreach (var kp in oimgs) { if (urls.Contains(kp.Key)) { if (string.IsNullOrEmpty(cacheFolder)) { cacheFolder = Path.Combine(imgFolder, gc.Code[gc.Code.Length - 1].ToString()); if (!Directory.Exists(cacheFolder)) { Directory.CreateDirectory(cacheFolder); } cacheFolder = Path.Combine(cacheFolder, gc.Code[gc.Code.Length - 2].ToString()); if (!Directory.Exists(cacheFolder)) { Directory.CreateDirectory(cacheFolder); } cacheFolder = Path.Combine(cacheFolder, gc.Code); if (!Directory.Exists(cacheFolder)) { Directory.CreateDirectory(cacheFolder); } } string imgname = imgIndex.ToString(); if (imgList != null) { Core.Data.GeocacheImage img = (from a in imgList where a.Url == kp.Key select a).FirstOrDefault(); if (img != null) { imgname = string.Format("{1}{0}", imgIndex, getValidNameForFile(img.Name)); } } string dst = Path.Combine(cacheFolder, string.Format("{0}{1}", imgname, Path.GetExtension(kp.Value))); if (!File.Exists(dst)) { File.Copy(kp.Value, dst); } } imgIndex++; } index++; if (DateTime.Now >= nextUpdate) { if (!progress.Update("CreatingOfflineImageFolder", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
public async Task ExportFile(List <Core.Data.Geocache> gcList, string filename) { await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ExportToGAPPDataExchangeFile", "SavingGeocaches", gcList.Count, 0)) { using (FileStream fs = File.OpenWrite(filename)) using (BinaryWriter bw = new BinaryWriter(fs)) { bw.Write("GAPP"); bw.Write(BitConverter.IsLittleEndian); int version = 3; bw.Write(version); bw.Write(gcList.Count); int index = 0; foreach (var gc in gcList) { bw.Write(gc.Archived); WriteIntegerArray(bw, gc.AttributeIds); bw.Write(gc.Available); bw.Write(gc.City ?? ""); bw.Write(gc.Code ?? ""); bw.Write(gc.Container.ID); bw.Write(false); bw.Write(gc.Country ?? ""); bw.Write(gc.ContainsCustomLatLon); if (gc.ContainsCustomLatLon) { bw.Write((double)gc.CustomLat); bw.Write((double)gc.CustomLon); } bw.Write(gc.Difficulty); bw.Write(gc.EncodedHints ?? ""); bw.Write(gc.Favorites); bw.Write(gc.Flagged); bw.Write(gc.Found); if (gc.FoundDate == null) { bw.Write(""); } else { bw.Write(((DateTime)gc.FoundDate).ToString("s")); } bw.Write(gc.GeocacheType.ID); bw.Write(Utils.Conversion.GetCacheIDFromCacheCode(gc.Code).ToString()); bw.Write(gc.Lat); bw.Write(gc.Lon); bw.Write(gc.LongDescription ?? ""); bw.Write(gc.LongDescriptionInHtml); bw.Write(gc.MemberOnly); bw.Write(gc.Municipality ?? ""); bw.Write(gc.Name ?? ""); bw.Write(gc.Notes ?? ""); bw.Write(gc.Owner ?? ""); bw.Write(gc.OwnerId ?? ""); bw.Write(gc.PersonalNote ?? ""); bw.Write(gc.PlacedBy ?? ""); bw.Write(((DateTime)gc.PublishedTime).ToString("s")); bw.Write(gc.Selected); bw.Write(gc.ShortDescription ?? ""); bw.Write(gc.ShortDescriptionInHtml); bw.Write(gc.State ?? ""); bw.Write(gc.Terrain); bw.Write(gc.Name ?? ""); bw.Write(gc.Url ?? ""); bw.Write(gc.DataFromDate.ToString("s")); bw.Write(gc.Locked); //logs List <Core.Data.Log> logs = Utils.DataAccess.GetLogs(gc.Database, gc.Code); bw.Write(logs.Count); foreach (var l in logs) { bw.Write(l.DataFromDate.ToString("s")); bw.Write(l.Date.ToString("s")); bw.Write(l.Encoded); bw.Write(l.Finder ?? ""); bw.Write(l.FinderId ?? ""); bw.Write(l.GeocacheCode ?? ""); bw.Write(l.ID ?? ""); bw.Write(l.LogType.ID); bw.Write(l.TBCode ?? ""); bw.Write(l.Text ?? ""); List <Core.Data.LogImage> logImages = Utils.DataAccess.GetLogImages(gc.Database, l.ID); bw.Write(logImages.Count); foreach (var li in logImages) { bw.Write(li.DataFromDate.ToString("s")); bw.Write(li.ID ?? ""); bw.Write(li.LogId ?? ""); bw.Write(li.Name ?? ""); bw.Write(li.Url ?? ""); } } //waypoints List <Core.Data.Waypoint> wps = Utils.DataAccess.GetWaypointsFromGeocache(gc.Database, gc.Code); bw.Write(wps.Count); foreach (var wp in wps) { bw.Write(wp.Code ?? ""); bw.Write(wp.Comment ?? ""); bw.Write(wp.DataFromDate.ToString("s")); bw.Write(wp.Description ?? ""); bw.Write(wp.GeocacheCode ?? ""); bw.Write(wp.ID ?? ""); if (wp.Lat == null || wp.Lon == null) { bw.Write(false); } else { bw.Write(true); bw.Write((double)wp.Lat); bw.Write((double)wp.Lon); } bw.Write(wp.Name ?? ""); bw.Write(wp.Time.ToString("s")); bw.Write(wp.Url ?? ""); bw.Write(wp.UrlName ?? ""); bw.Write(wp.WPType.ID); } //user waypoints List <Core.Data.UserWaypoint> usrwps = Utils.DataAccess.GetUserWaypointsFromGeocache(gc.Database, gc.Code); bw.Write(usrwps.Count); foreach (var wp in usrwps) { bw.Write(wp.ID); bw.Write(wp.Description ?? ""); bw.Write(wp.GeocacheCode ?? ""); bw.Write(wp.Lat); bw.Write(wp.Lon); bw.Write(wp.Date.ToString("s")); } index++; if (DateTime.Now >= nextUpdate) { prog.Update("SavingGeocaches", gcList.Count, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
public void ExportToGarminPOI(Core.Storage.Database db, List <Core.Data.Geocache> gcList) { intMaxNameLen = Core.Settings.Default.GarminPOINameLengthLimit; intMaxDescLen = Core.Settings.Default.GarminPOIDescriptionLengthLimit; boolExportCaches = Core.Settings.Default.GarminPOIExportGeocachePOIs; boolExportWpts = Core.Settings.Default.GarminPOIExportWaypointPOIs; strProgTitle = "ExportingPOI"; strProgSubtitle = "CreatingFile"; nameIsGCCode = (Core.Settings.Default.GarminPOIPOINameTypeName == UIControls.GeocacheFilter.BooleanEnum.False); List <Core.Data.Waypoint> wpList = null; if (Core.Settings.Default.GarminPOIClearExportDirectory) { //Try to assure that the path is not the root of a drive or empty if ((Core.Settings.Default.GarminPOIExportPath != "") && (Core.Settings.Default.GarminPOIExportPath != Path.GetPathRoot(Core.Settings.Default.GarminPOIExportPath))) { Array.ForEach(Directory.GetFiles(Core.Settings.Default.GarminPOIExportPath), delegate(string path) { if ((Path.GetExtension(path).ToUpper() == ".CSV") || (Path.GetExtension(path).ToUpper() == ".BMP")) { File.Delete(path); } }); } } using (Utils.ProgressBlock progress = new Utils.ProgressBlock( strProgTitle, strProgSubtitle, gcList.Count, 0)) { sd = new Dictionary <string, System.IO.StreamWriter>(); { int index = 0; //todo: clear all csv-files in path? //Iterate selected caches foreach (var gc in gcList) { //cache name String name = nameIsGCCode ? gc.Code : ProcessName(gc.Name, intMaxNameLen); //1st part of description: GC-Code + basic cache info String desc = (!nameIsGCCode ? (gc.Code + " ") : "") + TolerantSubstring(gc.GeocacheType.Name, 0, 2) + "D" + gc.Difficulty.ToString("0.#").Replace(",", ".").Replace(".5", "5") + "T" + gc.Terrain.ToString("0.#").Replace(",", ".").Replace(".5", "5") + TolerantSubstring(gc.Container.Name, 0, 2) + " "; //2nd part of description, put hints, notes, personalnote as limits allow desc = desc + ProcessDescription((nameIsGCCode ? (gc.Name + ":") : "") + gc.EncodedHints + " " + gc.Notes + " " + gc.PersonalNote, intMaxDescLen - desc.Length); //"PersonaleNote" is from the docs String lon = FmtCsvLatLon(gc.Lon); String lat = FmtCsvLatLon(gc.Lat); //use custom lat/lon if defined if (gc.CustomLat != null && gc.CustomLon != null) { lon = FmtCsvLatLon((double)gc.CustomLon);//double? -> double lat = FmtCsvLatLon((double)gc.CustomLat); } //write to CSV (file selected by gc type) if (boolExportCaches) { CacheCsv(gc).WriteLine(lon + "," + lat + ",\"" + name + "\",\"" + desc + "\""); } /* * UserWaypoint * int ID (458421) * string GeocacheCode; * string Description; ("Coordinate Override") * double Lat; * double Lon; * DateTime Date; * public static List<Framework.Data.UserWaypoint> GetUserWaypointsFromGeocache(Framework.Data.UserWaypointCollection wpCollection, string geocacheCode) */ //Iterate all waypoints of cache wpList = Utils.DataAccess.GetWaypointsFromGeocache(db, gc.Code); foreach (var wp in wpList) { //only export waypoints with coords if (wp.Lat != null && wp.Lon != null) { //Make Wpt name of Cachename + # + "wpt-ID 2-letter prefix" //others may prefer simply wp.Code String wpname = (nameIsGCCode ? gc.Code : ProcessName(gc.Name, intMaxNameLen - 3)) + "#" + TolerantSubstring(wp.Code, 0, 2); String wpdesc = wp.Code + " "; //depending on source the "real" name of the wpt sometimes is either in "Name" or "Description" String wpd = wp.Name; if (wpd == wp.Code) {//use description if name only holds the wpcode wpd = wp.Description; } //POI description = name + comment wpdesc = wpdesc + ProcessDescription(wpd + ": " + wp.Comment, intMaxDescLen - wpdesc.Length); String wplon = FmtCsvLatLon((double)wp.Lon); String wplat = FmtCsvLatLon((double)wp.Lat); //wpts have no custom lat/lon if (boolExportWpts) { WptCsv(gc, wp).WriteLine(wplon + "," + wplat + ",\"" + wpname + "\",\"" + wpdesc + "\""); } } } index++; if (index % 50 == 0) { progress.Update(strProgSubtitle, gcList.Count, index); } } } foreach (var kv in sd) //close csv streams { kv.Value.Flush(); kv.Value.Close(); } sd = null; /* * POI Loader */ if (Core.Settings.Default.GarminPOIRunPOILoader && (Core.Settings.Default.GarminPOIPOILoaderFilename != "")) { if (Core.Settings.Default.GarminPOIPassDirectoryToPOILoader) { try { RegistryKey rkCU = Registry.CurrentUser; RegistryKey rkSettings = rkCU.OpenSubKey(@"Software\Garmin\POI Loader\Settings", RegistryKeyPermissionCheck.ReadWriteSubTree); rkSettings.SetValue("Directory", Core.Settings.Default.GarminPOIExportPath); rkCU.Close(); } catch { } } Process poiLoader = new Process(); poiLoader.StartInfo.FileName = Core.Settings.Default.GarminPOIPOILoaderFilename; if (Core.Settings.Default.GarminPOIRunPOILoaderSilently) { poiLoader.StartInfo.Arguments = "/Silent"; } else { poiLoader.StartInfo.Arguments = ""; } //poiLoader.StartInfo.Arguments = "/Directory \"" + Properties.Settings.Default.POIExportPath + "\""; // /silent is possible // /Silent|/s /UsbUnitId|/u <UNITID> /Silent|/s /Directory|/d "<DIRECTORY>" // HKEY_CURRENT_USER\Software\Garmin\POI Loader\Settings Key "Directory" REG_SZ poiLoader.StartInfo.UseShellExecute = true; poiLoader.StartInfo.ErrorDialog = true; poiLoader.Start(); } //Properties.Settings.Default.RunPOILoader //Properties.Settings.Default.POILoaderFilename } }
private bool addGeocaches(Utils.ProgressBlock progress, List <Core.Data.Geocache> gcList, List <Core.Data.GeocacheType> typeList, XmlDocument doc, XmlElement rootDoc, string folderName, string tempFolder, List <string> fileList) { bool result = true; // //folder XmlElement folder = doc.CreateElement("Folder"); rootDoc.AppendChild(folder); XmlElement el = doc.CreateElement("name"); XmlText txt = doc.CreateTextNode(Localization.TranslationManager.Instance.Translate(folderName) as string); el.AppendChild(txt); folder.AppendChild(el); foreach (Core.Data.Geocache g in gcList) { //check if style exists Core.Data.GeocacheType gt = g.GeocacheType; string imgIcon = string.Format("{0}.gif", gt.ID); string destImg = Path.Combine(tempFolder, imgIcon); if (!typeList.Contains(gt)) { typeList.Add(gt); string mapIcon = string.Format("{0}.png", gt.ID); string destFile = Path.Combine(tempFolder, mapIcon); string mapIconC = string.Format("c{0}.png", gt.ID); string destFileC = Path.Combine(tempFolder, mapIconC); Utils.ResourceHelper.SaveToFile(string.Format("/Resources/CacheTypes/Map/{0}", mapIcon), destFile, false); Utils.ResourceHelper.SaveToFile(string.Format("/Resources/CacheTypes/Map/{0}", mapIconC), destFileC, false); Utils.ResourceHelper.SaveToFile(string.Format("/Resources/CacheTypes/{0}", imgIcon), destImg, false); if (!fileList.Contains(destFile)) { fileList.Add(destFile); } if (!fileList.Contains(destFileC)) { fileList.Add(destFileC); } if (!fileList.Contains(destImg)) { fileList.Add(destImg); } //adding style /* * <Style id="TNA"> * <IconStyle id="iconTNA"> * <scale>1</scale> * <Icon> * <href>http://hulmgulm.de/gc/myGoogleEarth/mrk_traditional.png</href> * </Icon> * </IconStyle> * <LabelStyle id="labelTNA"> * <scale>1</scale> * </LabelStyle> * </Style> */ XmlElement style = doc.CreateElement("Style"); rootDoc.AppendChild(style); XmlAttribute attr = doc.CreateAttribute("id"); txt = doc.CreateTextNode(string.Format("id{0}", gt.ID)); attr.AppendChild(txt); style.Attributes.Append(attr); XmlElement iconstyle = doc.CreateElement("IconStyle"); style.AppendChild(iconstyle); attr = doc.CreateAttribute("id"); txt = doc.CreateTextNode(string.Format("iconid{0}", gt.ID)); attr.AppendChild(txt); iconstyle.Attributes.Append(attr); el = doc.CreateElement("scale"); txt = doc.CreateTextNode("1"); el.AppendChild(txt); iconstyle.AppendChild(el); XmlElement icon = doc.CreateElement("Icon"); iconstyle.AppendChild(icon); el = doc.CreateElement("href"); txt = doc.CreateTextNode(string.Format("Images/{0}", Path.GetFileName(mapIcon))); el.AppendChild(txt); icon.AppendChild(el); XmlElement labelstyle = doc.CreateElement("LabelStyle"); style.AppendChild(labelstyle); attr = doc.CreateAttribute("id"); txt = doc.CreateTextNode(string.Format("labelid{0}", gt.ID)); attr.AppendChild(txt); labelstyle.Attributes.Append(attr); el = doc.CreateElement("scale"); txt = doc.CreateTextNode("1"); el.AppendChild(txt); labelstyle.AppendChild(el); // //corrected // style = doc.CreateElement("Style"); rootDoc.AppendChild(style); attr = doc.CreateAttribute("id"); txt = doc.CreateTextNode(string.Format("idC{0}", gt.ID)); attr.AppendChild(txt); style.Attributes.Append(attr); iconstyle = doc.CreateElement("IconStyle"); style.AppendChild(iconstyle); attr = doc.CreateAttribute("id"); txt = doc.CreateTextNode(string.Format("iconidC{0}", gt.ID)); attr.AppendChild(txt); iconstyle.Attributes.Append(attr); el = doc.CreateElement("scale"); txt = doc.CreateTextNode("1"); el.AppendChild(txt); iconstyle.AppendChild(el); icon = doc.CreateElement("Icon"); iconstyle.AppendChild(icon); el = doc.CreateElement("href"); txt = doc.CreateTextNode(string.Format("Images/{0}", Path.GetFileName(mapIconC))); el.AppendChild(txt); icon.AppendChild(el); labelstyle = doc.CreateElement("LabelStyle"); style.AppendChild(labelstyle); attr = doc.CreateAttribute("id"); txt = doc.CreateTextNode(string.Format("labelidC{0}", gt.ID)); attr.AppendChild(txt); labelstyle.Attributes.Append(attr); el = doc.CreateElement("scale"); txt = doc.CreateTextNode("1"); el.AppendChild(txt); labelstyle.AppendChild(el); } XmlElement placemark = doc.CreateElement("Placemark"); folder.AppendChild(placemark); el = doc.CreateElement("name"); txt = doc.CreateTextNode(g.Name ?? ""); el.AppendChild(txt); placemark.AppendChild(el); el = doc.CreateElement("styleUrl"); if (g.ContainsCustomLatLon) { txt = doc.CreateTextNode(string.Format("#idC{0}", gt.ID)); } else { txt = doc.CreateTextNode(string.Format("#id{0}", gt.ID)); } el.AppendChild(txt); placemark.AppendChild(el); el = doc.CreateElement("description"); string descr = string.Format("<table width='250'><tr><td align='center'><a href='{0}'>{1}</a><br><font size='4'><b>{2}</b></font><br /><i>{3} {4}</i><br /><br /><img src='Images/{5}' /> <br /><br />{6}: {7}<br />{8}: {9}<br />{10}: {11}<br /><br />({12})<br><br></td></tr></table>", g.Url, g.Code, g.Name ?? "", HttpUtility.HtmlEncode(Localization.TranslationManager.Instance.Translate("By")), g.Owner ?? "", Path.GetFileName(destImg), HttpUtility.HtmlEncode(Localization.TranslationManager.Instance.Translate("Difficulty")), g.Difficulty.ToString("0.#"), HttpUtility.HtmlEncode(Localization.TranslationManager.Instance.Translate("Terrain")), g.Terrain.ToString("0.#"), HttpUtility.HtmlEncode(Localization.TranslationManager.Instance.Translate("Container")), HttpUtility.HtmlEncode(Localization.TranslationManager.Instance.Translate(g.Container.Name)), Utils.Conversion.GetCoordinatesPresentation(g.Lat, g.Lon)); txt = doc.CreateTextNode(descr); el.AppendChild(txt); placemark.AppendChild(el); el = doc.CreateElement("Snippet"); txt = doc.CreateTextNode(string.Format("<a href='{0}'>{1}</a> {2}<br>{3} {4}", g.Url, g.Code, g.Name ?? "", Localization.TranslationManager.Instance.Translate("By"), g.Owner ?? "")); el.AppendChild(txt); placemark.AppendChild(el); XmlElement point = doc.CreateElement("Point"); placemark.AppendChild(point); el = doc.CreateElement("coordinates"); if (g.ContainsCustomLatLon) { txt = doc.CreateTextNode(string.Format("{0},{1}", g.CustomLon.ToString().Replace(',', '.'), g.CustomLat.ToString().Replace(',', '.'))); } else { txt = doc.CreateTextNode(string.Format("{0},{1}", g.Lon.ToString().Replace(',', '.'), g.Lat.ToString().Replace(',', '.'))); } el.AppendChild(txt); point.AppendChild(el); _indexDone++; if (DateTime.Now >= _nextUpdate) { if (!progress.Update("CreatingFile", _gcList.Count, _indexDone)) { result = false; break; } _nextUpdate = DateTime.Now.AddSeconds(1); } } return(result); }
public void ImportGeocacheDistance(Core.Storage.Database db) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportNLGeocacheDistance", "DownloadingData", 1, 0)) { using (System.IO.TemporaryFile tmp = new System.IO.TemporaryFile(true)) using (System.Net.WebClient wc = new System.Net.WebClient()) { wc.DownloadFile("http://www.globalcaching.eu/service/cachedistance.aspx?country=Netherlands&prefix=GC", tmp.Path); using (var fs = System.IO.File.OpenRead(tmp.Path)) using (ZipInputStream s = new ZipInputStream(fs)) { ZipEntry theEntry = s.GetNextEntry(); byte[] data = new byte[1024]; if (theEntry != null) { StringBuilder sb = new StringBuilder(); while (true) { int size = s.Read(data, 0, data.Length); if (size > 0) { if (sb.Length == 0 && data[0] == 0xEF && size > 2) { sb.Append(System.Text.ASCIIEncoding.UTF8.GetString(data, 3, size - 3)); } else { sb.Append(System.Text.ASCIIEncoding.UTF8.GetString(data, 0, size)); } } else { break; } } XmlDocument doc = new XmlDocument(); doc.LoadXml(sb.ToString()); XmlElement root = doc.DocumentElement; XmlNodeList nl = root.SelectNodes("wp"); if (nl != null) { progress.Update("SavingGeocaches", nl.Count, 0); DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; foreach (XmlNode n in nl) { var gc = db.GeocacheCollection.GetGeocache(n.Attributes["code"].InnerText); if (gc != null) { gc.GeocacheDistance = Utils.Conversion.StringToDouble(n.Attributes["dist"].InnerText); } else { Core.Settings.Default.SetGeocacheDistance(n.Attributes["code"].InnerText, Utils.Conversion.StringToDouble(n.Attributes["dist"].InnerText)); } index++; if (DateTime.Now>=nextUpdate) { progress.Update("SavingGeocaches", nl.Count, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } } } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public void ImportGeocacheDistance(Core.Storage.Database db) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportNLGeocacheDistance", "DownloadingData", 1, 0)) { using (System.IO.TemporaryFile tmp = new System.IO.TemporaryFile(true)) using (System.Net.WebClient wc = new System.Net.WebClient()) { wc.DownloadFile(string.Format("http://www.globalcaching.eu/service/cachedistance.aspx?country=Netherlands&prefix=GC&token{0}", System.Web.HttpUtility.UrlEncode(Core.Settings.Default.LiveAPIToken ?? "")), tmp.Path); using (var fs = System.IO.File.OpenRead(tmp.Path)) using (ZipInputStream s = new ZipInputStream(fs)) { ZipEntry theEntry = s.GetNextEntry(); byte[] data = new byte[1024]; if (theEntry != null) { StringBuilder sb = new StringBuilder(); while (true) { int size = s.Read(data, 0, data.Length); if (size > 0) { if (sb.Length == 0 && data[0] == 0xEF && size > 2) { sb.Append(System.Text.ASCIIEncoding.UTF8.GetString(data, 3, size - 3)); } else { sb.Append(System.Text.ASCIIEncoding.UTF8.GetString(data, 0, size)); } } else { break; } } XmlDocument doc = new XmlDocument(); doc.LoadXml(sb.ToString()); XmlElement root = doc.DocumentElement; XmlNodeList nl = root.SelectNodes("wp"); if (nl != null) { progress.Update("SavingGeocaches", nl.Count, 0); DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; foreach (XmlNode n in nl) { var gc = db.GeocacheCollection.GetGeocache(n.Attributes["code"].InnerText); if (gc != null) { gc.GeocacheDistance = Utils.Conversion.StringToDouble(n.Attributes["dist"].InnerText); } else { Core.Settings.Default.SetGeocacheDistance(n.Attributes["code"].InnerText, Utils.Conversion.StringToDouble(n.Attributes["dist"].InnerText)); } index++; if (DateTime.Now >= nextUpdate) { progress.Update("SavingGeocaches", nl.Count, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
async private Task DeleteGeocache() { if (cacheList.SelectedItems.Count > 0) { List<Core.Data.Geocache> gcList = new List<Core.Data.Geocache>(); foreach (Core.Data.Geocache gc in cacheList.SelectedItems) { gcList.Add(gc); } Core.ApplicationData.Instance.ActiveGeocache = null; using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(() => { int index = 0; DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("DeletingGeocaches", "DeletingGeocaches", gcList.Count, 0, true)) { foreach (var gc in gcList) { Utils.DataAccess.DeleteGeocache(gc); index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("DeletingGeocaches", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } }); } } }
public void ImporGCVotes(List<Core.Data.Geocache> gcList) { try { int max = gcList.Count; int pos = 0; int batch; StringBuilder wpList = new StringBuilder(); string usrName = null; var ai = Core.ApplicationData.Instance.AccountInfos.GetAccountInfo("GC"); if (ai != null) { usrName = ai.AccountName; } if (string.IsNullOrEmpty(usrName)) { usrName = "uglyDUMMYusernamesolution"; } using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ImportingGCVotes", "ImportingGCVotes", max, pos, true)) { while (gcList.Count > 0) { wpList.Length = 0; batch = 0; while (batch < 200 && gcList.Count > 0) { if (batch > 0) { wpList.Append(","); } wpList.Append(gcList[0].Code); gcList.RemoveAt(0); pos++; batch++; } string postData = String.Format("version=3.1b&userName={0}&waypoints={1}&password={2}", HttpUtility.UrlEncode(usrName), wpList.ToString(), ""); //"" => password: todo System.Net.WebRequest webRequest = System.Net.WebRequest.Create("http://gcvote.com/getVotes.php") as System.Net.HttpWebRequest; webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; string doc; using (System.IO.StreamWriter requestWriter = new System.IO.StreamWriter(webRequest.GetRequestStream())) { requestWriter.Write(postData); } using (System.IO.StreamReader responseReader = new System.IO.StreamReader(webRequest.GetResponse().GetResponseStream())) { // and read the response doc = responseReader.ReadToEnd(); } /* <votes userName='******' currentVersion='2.0c' securityState='locked' loggedIn='true'> <vote userName='******' cacheId='26984595-b3a1-4aa2-9638-7612a3bf3d5f' voteMedian='4' voteAvg='3.75' voteCnt='4' voteUser='******' waypoint='GC12RBN' vote1='0' vote2='1' vote3='0' vote4='2' vote5='1' rawVotes='(2.0:1)(4.0:2)(5.0:1)'/> <vote userName='******' cacheId='55d02838-01f6-4181-a080-517a3339ad40' voteMedian='4.5' voteAvg='4.0555555555556' voteCnt='9' voteUser='******' waypoint='GC12YQJ' vote1='1' vote2='0' vote3='1' vote4='3' vote5='4' rawVotes='(1.0:1)(3.0:1)(4.0:2)(4.5:1)(5.0:4)'/> <vote userName='******' cacheId='562829a6-a111-4ccb-a511-76370b8005d2' voteMedian='3' voteAvg='2.7777777777778' voteCnt='9' voteUser='******' waypoint='GC135AX' vote1='1' vote2='1' vote3='7' vote4='0' vote5='0' rawVotes='(1.0:1)(2.5:1)(3.0:6)(3.5:1)'/> <errorstring></errorstring> </votes> */ if (doc != null) { StringBuilder sb = new StringBuilder(); sb.AppendLine("<?xml version=\"1.0\"?>"); sb.Append(doc); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(sb.ToString()); XmlElement root = xmlDoc.DocumentElement; XmlNodeList wpt = root.SelectNodes("vote"); if (wpt != null) { foreach (XmlNode n in wpt) { double avg = Utils.Conversion.StringToDouble(n.Attributes["voteAvg"].Value); double median = Utils.Conversion.StringToDouble(n.Attributes["voteMedian"].Value); double? usrVote = Utils.Conversion.StringToDouble(n.Attributes["voteUser"].Value); int cnt = int.Parse(n.Attributes["voteCnt"].Value); string wp = n.Attributes["waypoint"].Value; if (usrVote <= 0.1) { usrVote = null; } Core.Settings.Default.SetGCVote(wp, median, avg, cnt, usrVote); } } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, "UnableToGetTheDataFromGCVoteCom"); break; } if (!prog.Update("ImportingGCVotes", max, pos)) { break; } if (gcList.Count > 0) { //Thread.Sleep(500); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public async Task<List<LogInfo>> LogGeocachesAsync(List<LogInfo> logInfos) { List<LogInfo> result = new List<LogInfo>(); try { Utils.DataUpdater upd = null; if (Core.ApplicationData.Instance.ActiveDatabase != null) { upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase); } using (Utils.ProgressBlock prog = new Utils.ProgressBlock("LogGeocache", "Logging", logInfos.Count, 0, true)) { using (var api = new LiveAPI.GeocachingLiveV6()) { foreach (LogInfo li in logInfos) { int index = 0; List<LiveAPI.LiveV6.Trackable> dropTbs = null; List<string> retrieveTbs = (from a in li.TrackableRetrieve.Split(new char[]{' ',',','\t'}, StringSplitOptions.RemoveEmptyEntries) select a.ToUpper()).ToList(); //check if trackable dialog is needed if (li.TrackableDrop) { //fetch in background List<LiveAPI.LiveV6.Trackable> tbList = null; await Task.Run(() => { tbList = getOwnedTrackables(api); }); if (tbList==null || tbList.Count==0) { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, "NoTrackablesToDrop"); break; } Dialogs.SelectTrackablesWindow dlg = new Dialogs.SelectTrackablesWindow(tbList); if (dlg.ShowDialog() == true) { dropTbs = dlg.SelectedTrackables; if (dropTbs == null || dropTbs.Count == 0) { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, "NoTrackablesToDrop"); break; } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, "NoTrackablesToDrop"); break; } } bool ok = false; await Task.Run(() => { if (index > 0 && dropTbs == null && retrieveTbs == null) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayCreateFieldNoteAndPublish); } ok = LogGeocache(api, li, dropTbs, retrieveTbs); }); if (ok) { result.Add(li); index++; if (!prog.Update("Logging", logInfos.Count, index)) { break; } } else { break; } } } } if (upd != null) { upd.Dispose(); upd = null; } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } return result; }
public async Task CreateImageFolder(List <Core.Data.Geocache> gcList, string folder, bool download, bool NotDescrOnly, bool clearBeforeCopy) { if (download) { await OfflineImagesManager.Instance.DownloadImagesAsync(gcList, true); } await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("CreatingOfflineImageFolder", "CreatingOfflineImageFolder", gcList.Count, 0, true)) { if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } string imgFolder = Path.Combine(folder, "GeocachePhotos"); if (!Directory.Exists(imgFolder)) { Directory.CreateDirectory(imgFolder); } if (clearBeforeCopy) { string[] fls = Directory.GetFiles(imgFolder); if (fls != null) { foreach (string f in fls) { File.Delete(f); } } fls = Directory.GetDirectories(imgFolder); if (fls != null) { foreach (string f in fls) { Directory.Delete(f, true); } } } int index = 0; foreach (Core.Data.Geocache gc in gcList) { int imgIndex = 1; string cacheFolder = ""; List <string> urls = Utils.DataAccess.GetImagesOfGeocache(gc.Database, gc.Code, NotDescrOnly); Dictionary <string, string> oimgs = OfflineImagesManager.Instance.GetImages(gc); List <Core.Data.GeocacheImage> imgList = Utils.DataAccess.GetGeocacheImages(gc.Database, gc.Code); foreach (var kp in oimgs) { if (urls.Contains(kp.Key)) { if (string.IsNullOrEmpty(cacheFolder)) { cacheFolder = Path.Combine(imgFolder, gc.Code[gc.Code.Length - 1].ToString()); if (!Directory.Exists(cacheFolder)) { Directory.CreateDirectory(cacheFolder); } cacheFolder = Path.Combine(cacheFolder, gc.Code[gc.Code.Length - 2].ToString()); if (!Directory.Exists(cacheFolder)) { Directory.CreateDirectory(cacheFolder); } cacheFolder = Path.Combine(cacheFolder, gc.Code); if (!Directory.Exists(cacheFolder)) { Directory.CreateDirectory(cacheFolder); } } string imgname = imgIndex.ToString(); if (imgList != null) { Core.Data.GeocacheImage img = (from a in imgList where a.Url == kp.Key select a).FirstOrDefault(); if (img != null) { imgname = string.Format("{1}{0}", imgIndex, getValidNameForFile(img.Name)); } } string dst = Path.Combine(cacheFolder, string.Format("{0}{1}", imgname, Path.GetExtension(kp.Value))); if (!File.Exists(dst)) { File.Copy(kp.Value, dst); } } imgIndex++; } index++; if (DateTime.Now >= nextUpdate) { if (!progress.Update("CreatingOfflineImageFolder", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
public async Task ExportToExcel(string filename, List<Sheet> sheets, List<Core.Data.Geocache> gcList) { await Task.Run(() => { try { FileInfo fi = new FileInfo(filename); if (fi.Exists) { fi.Delete(); } int totalToDo = sheets.Count * gcList.Count; int totalDone = 0; DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ExportExcel", "CreatingFile", totalToDo, totalDone)) { using (ExcelPackage package = new ExcelPackage(fi)) { foreach (Sheet sheet in sheets) { // add a new worksheet to the empty workbook ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheet.Name); //Add the headers int col = 1; foreach (PropertyItem pi in sheet.SelectedItems) { worksheet.Cells[1, col].Value = pi.Name; col++; } int row = 2; foreach (Core.Data.Geocache gc in gcList) { col = 1; foreach (PropertyItem pi in sheet.SelectedItems) { /* object o = pi.GetValue(gc); if (o != null && o.GetType() == typeof(string)) { o = validateXml((string)o); } worksheet.Cells[row, col].Value = o; * */ /* object o = pi.GetValue(gc); if (o != null) { string s = o.ToString(); worksheet.Cells[row, col].Value = s; } */ worksheet.Cells[row, col].Value = pi.GetValue(gc); col++; } row++; totalDone++; if (DateTime.Now>=nextUpdate) { prog.Update("CreatingFile", totalToDo, totalDone); nextUpdate = DateTime.Now.AddSeconds(1); } } } package.Workbook.Properties.Title = "GAPP SF Geocache Export"; package.Workbook.Properties.Author = "Globalcaching.eu"; package.Workbook.Properties.Comments = "This document has been created by GlobalcachingApplication (GAPP SF)"; package.Workbook.Properties.Company = "Globalcaching.eu"; package.Save(); } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
async public Task SelectGeocaches() { if (Core.ApplicationData.Instance.ActiveDatabase != null) { using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(() => { List<Core.Data.Geocache> gcList; if (selectionContext.GeocacheSelectionContext == SelectionContext.Context.NewSelection) { gcList = Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection; } else if (selectionContext.GeocacheSelectionContext == SelectionContext.Context.WithinSelection) { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where a.Selected select a).ToList(); } else { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where !a.Selected select a).ToList(); } DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("Searching", "Searching", gcList.Count, 0, true)) { string[] foundByUsers = Core.Settings.Default.GeocacheFilterFoundBy == null ? new string[] { } : Core.Settings.Default.GeocacheFilterFoundBy.Split(','); for (int i = 0; i < foundByUsers.Length; i++) { foundByUsers[i] = foundByUsers[i].Trim(); } string[] notFoundByUsers = Core.Settings.Default.GeocacheFilterNotFoundBy == null ? new string[] { } : Core.Settings.Default.GeocacheFilterNotFoundBy.Split(','); for (int i = 0; i < notFoundByUsers.Length; i++) { notFoundByUsers[i] = notFoundByUsers[i].Trim(); } Core.Data.Location loc = null; double dist = 0; if (Core.Settings.Default.GeocacheFilterLocationExpanded) { loc = getLocation(); dist = Core.Settings.Default.GeocacheFilterLocationRadius * 1000; if (Core.Settings.Default.GeocacheFilterLocationKm== BooleanEnum.False) { dist /= 0.621371192237; } } List<int> cacheTypes = new List<int>(); if (Core.Settings.Default.GeocacheFilterGeocacheTypesExpanded) { if (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterGeocacheTypes)) { string[] parts = Core.Settings.Default.GeocacheFilterGeocacheTypes.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); foreach(string s in parts) { cacheTypes.Add(int.Parse(s)); } } } List<int> cacheContainers = new List<int>(); if (Core.Settings.Default.GeocacheFilterGeocacheContainersExpanded) { if (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterGeocacheContainers)) { string[] parts = Core.Settings.Default.GeocacheFilterGeocacheContainers.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in parts) { cacheContainers.Add(int.Parse(s)); } } } List<int> cacheAttributes = new List<int>(); if (Core.Settings.Default.GeocacheFilterGeocacheAttributesExpanded) { if (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterGeocacheAttributes)) { string[] parts = Core.Settings.Default.GeocacheFilterGeocacheAttributes.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in parts) { cacheAttributes.Add(int.Parse(s)); } } } if (loc != null || !Core.Settings.Default.GeocacheFilterLocationExpanded) { //set selected within gcList int index = 0; foreach (var gc in gcList) { gc.Selected = ( (!Core.Settings.Default.GeocacheFilterStatusExpanded || ((Core.Settings.Default.GeocacheFilterGeocacheStatus == GeocacheStatus.Enabled && gc.Available) || (Core.Settings.Default.GeocacheFilterGeocacheStatus == GeocacheStatus.Disabled && !gc.Available && !gc.Archived) || (Core.Settings.Default.GeocacheFilterGeocacheStatus == GeocacheStatus.Archived && gc.Archived))) && (!Core.Settings.Default.GeocacheFilterOwnExpanded || ((Core.Settings.Default.GeocacheFilterOwn == BooleanEnum.True) == gc.IsOwn)) && (!Core.Settings.Default.GeocacheFilterFoundExpanded || ((Core.Settings.Default.GeocacheFilterFound == BooleanEnum.True) == gc.Found)) && (!Core.Settings.Default.GeocacheFilterFoundByExpanded || ((Core.Settings.Default.GeocacheFilterFoundByAll == BooleanEnum.True) && foundByAll(gc, foundByUsers)) || ((Core.Settings.Default.GeocacheFilterFoundByAll == BooleanEnum.False) && foundByAny(gc, foundByUsers))) && (!Core.Settings.Default.GeocacheFilterNotFoundByExpanded || ((Core.Settings.Default.GeocacheFilterNotFoundByAny == BooleanEnum.True) && !foundByAny(gc, foundByUsers)) || ((Core.Settings.Default.GeocacheFilterNotFoundByAny == BooleanEnum.False) && !foundByAll(gc, foundByUsers))) && (!Core.Settings.Default.GeocacheFilterLocationExpanded || (Utils.Calculus.CalculateDistance(gc, loc).EllipsoidalDistance<=dist)) && (!Core.Settings.Default.GeocacheFilterCountryStateExpanded || (string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterCountry) || (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterCountry) && string.Compare(gc.Country,Core.Settings.Default.GeocacheFilterCountry, true)==0)) && (string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterState) || (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterState) && string.Compare(gc.State, Core.Settings.Default.GeocacheFilterState, true) == 0))) && (!Core.Settings.Default.GeocacheFilterMunicipalityCityExpanded || (string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterMunicipality) || (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterMunicipality) && string.Compare(gc.Municipality, Core.Settings.Default.GeocacheFilterMunicipality, true) == 0)) && (string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterCity) || (!string.IsNullOrEmpty(Core.Settings.Default.GeocacheFilterCity) && string.Compare(gc.City, Core.Settings.Default.GeocacheFilterCity, true) == 0))) && (!Core.Settings.Default.GeocacheFilterGeocacheTypesExpanded || (cacheTypes.Contains(gc.GeocacheType.ID))) && (!Core.Settings.Default.GeocacheFilterGeocacheContainersExpanded || (cacheContainers.Contains(gc.Container.ID))) && (!Core.Settings.Default.GeocacheFilterFavExpanded || (gc.Favorites >= Core.Settings.Default.GeocacheFilterMinFav && gc.Favorites <= Core.Settings.Default.GeocacheFilterMaxFav)) && (!Core.Settings.Default.GeocacheFilterTerrainExpanded || ((gc.Terrain >= Core.Settings.Default.GeocacheFilterMinTerrain) && (gc.Terrain <= Core.Settings.Default.GeocacheFilterMaxTerrain))) && (!Core.Settings.Default.GeocacheFilterDifficultyExpanded || ((gc.Difficulty >= Core.Settings.Default.GeocacheFilterMinDifficulty) && (gc.Difficulty <= Core.Settings.Default.GeocacheFilterMaxDifficulty))) && (!Core.Settings.Default.GeocacheFilterHiddenDateExpanded || (gc.PublishedTime.Date >= Core.Settings.Default.GeocacheFilterMinHiddenDate.Date && gc.PublishedTime.Date <= Core.Settings.Default.GeocacheFilterMaxHiddenDate.Date)) && (!Core.Settings.Default.GeocacheFilterGeocacheAttributesExpanded || attrFilterPass(cacheAttributes, gc)) ); index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("Searching", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } }); } } }
public async Task ImportFile(Core.Storage.Database db, string filename) { using (Utils.DataUpdater upd = new DataUpdater(db)) { await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (FileStream fs = File.OpenRead(filename)) using (BinaryReader br = new BinaryReader(fs)) { string tag = br.ReadString(); if (tag == "GAPP") { bool IsLittleEndian = br.ReadBoolean(); int version = br.ReadInt32(); if (IsLittleEndian == BitConverter.IsLittleEndian && version <= 3) { int count = br.ReadInt32(); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ImportGAPPDataExchangeFile", "ImportGeocaches", count, 0)) { for (int index = 0; index < count; index++) { Core.Data.GeocacheData gc = new Core.Data.GeocacheData(); gc.Archived = br.ReadBoolean(); gc.AttributeIds = ReadIntegerArray(br); gc.Available = br.ReadBoolean(); gc.City = br.ReadString(); gc.Code = br.ReadString(); gc.Container = Utils.DataAccess.GetGeocacheContainer(br.ReadInt32()); bool dummyb = br.ReadBoolean(); gc.Country = br.ReadString(); if (br.ReadBoolean()) { gc.CustomLat = br.ReadDouble(); gc.CustomLon = br.ReadDouble(); } gc.Difficulty = br.ReadDouble(); gc.EncodedHints = br.ReadString(); gc.Favorites = br.ReadInt32(); gc.Flagged = br.ReadBoolean(); gc.Found = br.ReadBoolean(); string s = br.ReadString(); gc.GeocacheType = Utils.DataAccess.GetGeocacheType(br.ReadInt32()); string dummystr = br.ReadString(); gc.Lat = br.ReadDouble(); gc.Lon = br.ReadDouble(); gc.LongDescription = br.ReadString(); gc.LongDescriptionInHtml = br.ReadBoolean(); gc.MemberOnly = br.ReadBoolean(); gc.Municipality = br.ReadString(); gc.Name = br.ReadString(); gc.Notes = br.ReadString(); gc.Owner = br.ReadString(); gc.OwnerId = br.ReadString(); gc.PersonalNote = br.ReadString(); gc.PlacedBy = br.ReadString(); gc.PublishedTime = DateTime.Parse(br.ReadString()); dummyb = br.ReadBoolean(); gc.ShortDescription = br.ReadString(); gc.ShortDescriptionInHtml = br.ReadBoolean(); gc.State = br.ReadString(); gc.Terrain = br.ReadDouble(); dummystr = br.ReadString(); gc.Url = br.ReadString(); gc.DataFromDate = DateTime.Parse(br.ReadString()); if (version > 1) { gc.Locked = br.ReadBoolean(); } bool gcAdded = Utils.DataAccess.AddGeocache(db, gc); int logcount = br.ReadInt32(); for (int lc = 0; lc < logcount; lc++) { Core.Data.LogData log = new Core.Data.LogData(); log.DataFromDate = DateTime.Parse(br.ReadString()); log.Date = DateTime.Parse(br.ReadString()); log.Encoded = br.ReadBoolean(); log.Finder = br.ReadString(); log.FinderId = br.ReadString(); log.GeocacheCode = br.ReadString(); log.ID = br.ReadString(); log.LogType = Utils.DataAccess.GetLogType(br.ReadInt32()); log.TBCode = br.ReadString(); log.Text = br.ReadString(); if (gcAdded) { Utils.DataAccess.AddLog(db, log); } int logimgcount = br.ReadInt32(); for (int lic = 0; lic < logimgcount; lic++) { Core.Data.LogImageData li = new Core.Data.LogImageData(); li.DataFromDate = DateTime.Parse(br.ReadString()); li.ID = br.ReadString(); li.LogId = br.ReadString(); li.Name = br.ReadString(); li.Url = br.ReadString(); if (gcAdded) { Utils.DataAccess.AddLogImage(db, li); } } } int wpcount = br.ReadInt32(); for (int wpc = 0; wpc < wpcount; wpc++) { Core.Data.WaypointData wp = new Core.Data.WaypointData(); wp.Code = br.ReadString(); wp.Comment = br.ReadString(); wp.DataFromDate = DateTime.Parse(br.ReadString()); wp.Description = br.ReadString(); wp.GeocacheCode = br.ReadString(); wp.ID = br.ReadString(); if (br.ReadBoolean()) { wp.Lat = br.ReadDouble(); wp.Lon = br.ReadDouble(); } wp.Name = br.ReadString(); wp.Time = DateTime.Parse(br.ReadString()); wp.Url = br.ReadString(); wp.UrlName = br.ReadString(); wp.WPType = Utils.DataAccess.GetWaypointType(br.ReadInt32()); if (gcAdded) { Utils.DataAccess.AddWaypoint(db, wp); } } if (version > 2) { int usrwpcount = br.ReadInt32(); for (int wpc = 0; wpc < usrwpcount; wpc++) { Core.Data.UserWaypointData wp = new Core.Data.UserWaypointData(); wp.ID = br.ReadInt32().ToString(); wp.Description = br.ReadString(); wp.GeocacheCode = br.ReadString(); wp.Lat = br.ReadDouble(); wp.Lon = br.ReadDouble(); wp.Date = DateTime.Parse(br.ReadString()); if (gcAdded) { Utils.DataAccess.AddUserWaypoint(db, wp); } } } index++; if (DateTime.Now >= nextUpdate) { prog.Update("ImportGeocaches", count, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, "Version not supported"); } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, "Wrong file signature"); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); } }
public async Task ExportFile(List<Core.Data.Geocache> gcList, string filename) { await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ExportToGAPPDataExchangeFile", "SavingGeocaches", gcList.Count, 0)) { using (FileStream fs = File.OpenWrite(filename)) using (BinaryWriter bw = new BinaryWriter(fs)) { bw.Write("GAPP"); bw.Write(BitConverter.IsLittleEndian); int version = 3; bw.Write(version); bw.Write(gcList.Count); int index = 0; foreach (var gc in gcList) { bw.Write(gc.Archived); WriteIntegerArray(bw, gc.AttributeIds); bw.Write(gc.Available); bw.Write(gc.City ?? ""); bw.Write(gc.Code ?? ""); bw.Write(gc.Container.ID); bw.Write(false); bw.Write(gc.Country ?? ""); bw.Write(gc.ContainsCustomLatLon); if (gc.ContainsCustomLatLon) { bw.Write((double)gc.CustomLat); bw.Write((double)gc.CustomLon); } bw.Write(gc.Difficulty); bw.Write(gc.EncodedHints ?? ""); bw.Write(gc.Favorites); bw.Write(gc.Flagged); bw.Write(gc.Found); if (gc.FoundDate == null) { bw.Write(""); } else { bw.Write(((DateTime)gc.FoundDate).ToString("s")); } bw.Write(gc.GeocacheType.ID); bw.Write(Utils.Conversion.GetCacheIDFromCacheCode(gc.Code).ToString()); bw.Write(gc.Lat); bw.Write(gc.Lon); bw.Write(gc.LongDescription ?? ""); bw.Write(gc.LongDescriptionInHtml); bw.Write(gc.MemberOnly); bw.Write(gc.Municipality ?? ""); bw.Write(gc.Name ?? ""); bw.Write(gc.Notes ?? ""); bw.Write(gc.Owner ?? ""); bw.Write(gc.OwnerId ?? ""); bw.Write(gc.PersonalNote ?? ""); bw.Write(gc.PlacedBy ?? ""); bw.Write(((DateTime)gc.PublishedTime).ToString("s")); bw.Write(gc.Selected); bw.Write(gc.ShortDescription ?? ""); bw.Write(gc.ShortDescriptionInHtml); bw.Write(gc.State ?? ""); bw.Write(gc.Terrain); bw.Write(gc.Name ?? ""); bw.Write(gc.Url ?? ""); bw.Write(gc.DataFromDate.ToString("s")); bw.Write(gc.Locked); //logs List<Core.Data.Log> logs = Utils.DataAccess.GetLogs(gc.Database, gc.Code); bw.Write(logs.Count); foreach (var l in logs) { bw.Write(l.DataFromDate.ToString("s")); bw.Write(l.Date.ToString("s")); bw.Write(l.Encoded); bw.Write(l.Finder ?? ""); bw.Write(l.FinderId ?? ""); bw.Write(l.GeocacheCode ?? ""); bw.Write(l.ID ?? ""); bw.Write(l.LogType.ID); bw.Write(l.TBCode ?? ""); bw.Write(l.Text ?? ""); List<Core.Data.LogImage> logImages = Utils.DataAccess.GetLogImages(gc.Database, l.ID); bw.Write(logImages.Count); foreach (var li in logImages) { bw.Write(li.DataFromDate.ToString("s")); bw.Write(li.ID ?? ""); bw.Write(li.LogId ?? ""); bw.Write(li.Name ?? ""); bw.Write(li.Url ?? ""); } } //waypoints List<Core.Data.Waypoint> wps = Utils.DataAccess.GetWaypointsFromGeocache(gc.Database, gc.Code); bw.Write(wps.Count); foreach (var wp in wps) { bw.Write(wp.Code ?? ""); bw.Write(wp.Comment ?? ""); bw.Write(wp.DataFromDate.ToString("s")); bw.Write(wp.Description ?? ""); bw.Write(wp.GeocacheCode ?? ""); bw.Write(wp.ID ?? ""); if (wp.Lat == null || wp.Lon == null) { bw.Write(false); } else { bw.Write(true); bw.Write((double)wp.Lat); bw.Write((double)wp.Lon); } bw.Write(wp.Name ?? ""); bw.Write(wp.Time.ToString("s")); bw.Write(wp.Url ?? ""); bw.Write(wp.UrlName ?? ""); bw.Write(wp.WPType.ID); } //user waypoints List<Core.Data.UserWaypoint> usrwps = Utils.DataAccess.GetUserWaypointsFromGeocache(gc.Database, gc.Code); bw.Write(usrwps.Count); foreach (var wp in usrwps) { bw.Write(wp.ID); bw.Write(wp.Description ?? ""); bw.Write(wp.GeocacheCode ?? ""); bw.Write(wp.Lat); bw.Write(wp.Lon); bw.Write(wp.Date.ToString("s")); } index++; if (DateTime.Now>=nextUpdate) { prog.Update("SavingGeocaches", gcList.Count, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
public List<LiveAPI.LiveV6.GeocacheLog> GetLogsOfUser(string userName, List<Core.Data.LogType> logTypes) { List<LiveAPI.LiveV6.GeocacheLog> result = new List<LiveAPI.LiveV6.GeocacheLog>(); using (var api = new LiveAPI.GeocachingLiveV6()) { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingLogs", "ImportingLogs", 100, 0, true)) { var req = new LiveAPI.LiveV6.GetUsersGeocacheLogsRequest(); req.AccessToken = api.Token; req.ExcludeArchived = false; req.MaxPerPage = Core.Settings.Default.LiveAPIGetUsersGeocacheLogsBatchSize; req.StartIndex = 0; req.LogTypes = (from a in logTypes select (long)a.ID).ToArray(); var resp = api.Client.GetUsersGeocacheLogs(req); while (resp.Status.StatusCode == 0) { //logs.AddRange(resp.Logs); //if (resp.Logs.Count() >= req.MaxPerPage) if (resp.Logs.Count() > 0) { result.AddRange(resp.Logs); req.StartIndex = result.Count; if (!progress.Update("ImportingLogs", result.Count + req.MaxPerPage, result.Count)) { _cancelled = true; break; } System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetUsersGeocacheLogs); resp = api.Client.GetUsersGeocacheLogs(req); } else { break; } } if (resp.Status.StatusCode != 0) { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, resp.Status.StatusMessage); _cancelled = true; } } } return result; }
public void ExportToGarminPOI(Core.Storage.Database db, List<Core.Data.Geocache> gcList) { intMaxNameLen = Core.Settings.Default.GarminPOINameLengthLimit; intMaxDescLen = Core.Settings.Default.GarminPOIDescriptionLengthLimit; boolExportCaches = Core.Settings.Default.GarminPOIExportGeocachePOIs; boolExportWpts = Core.Settings.Default.GarminPOIExportWaypointPOIs; strProgTitle = "ExportingPOI"; strProgSubtitle = "CreatingFile"; nameIsGCCode = (Core.Settings.Default.GarminPOIPOINameTypeName == UIControls.GeocacheFilter.BooleanEnum.False); List<Core.Data.Waypoint> wpList = null; if (Core.Settings.Default.GarminPOIClearExportDirectory) { //Try to assure that the path is not the root of a drive or empty if ((Core.Settings.Default.GarminPOIExportPath != "") && (Core.Settings.Default.GarminPOIExportPath != Path.GetPathRoot(Core.Settings.Default.GarminPOIExportPath))) { Array.ForEach(Directory.GetFiles(Core.Settings.Default.GarminPOIExportPath), delegate(string path) { if ((Path.GetExtension(path).ToUpper() == ".CSV") || (Path.GetExtension(path).ToUpper() == ".BMP")) { File.Delete(path); } }); } } using (Utils.ProgressBlock progress = new Utils.ProgressBlock( strProgTitle, strProgSubtitle, gcList.Count, 0)) { sd = new Dictionary<string, System.IO.StreamWriter>(); { int index = 0; //todo: clear all csv-files in path? //Iterate selected caches foreach (var gc in gcList) { //cache name String name = nameIsGCCode ? gc.Code : ProcessName(gc.Name, intMaxNameLen); //1st part of description: GC-Code + basic cache info String desc = (!nameIsGCCode ? (gc.Code + " ") : "") + TolerantSubstring(gc.GeocacheType.Name, 0, 2) + "D" + gc.Difficulty.ToString("0.#").Replace(",", ".").Replace(".5", "5") + "T" + gc.Terrain.ToString("0.#").Replace(",", ".").Replace(".5", "5") + TolerantSubstring(gc.Container.Name, 0, 2) + " "; //2nd part of description, put hints, notes, personalnote as limits allow desc = desc + ProcessDescription((nameIsGCCode ? (gc.Name + ":") : "") + gc.EncodedHints + " " + gc.Notes + " " + gc.PersonalNote, intMaxDescLen - desc.Length); //"PersonaleNote" is from the docs String lon = FmtCsvLatLon(gc.Lon); String lat = FmtCsvLatLon(gc.Lat); //use custom lat/lon if defined if (gc.CustomLat != null && gc.CustomLon != null) { lon = FmtCsvLatLon((double)gc.CustomLon);//double? -> double lat = FmtCsvLatLon((double)gc.CustomLat); } //write to CSV (file selected by gc type) if (boolExportCaches) { CacheCsv(gc).WriteLine(lon + "," + lat + ",\"" + name + "\",\"" + desc + "\""); } /* UserWaypoint int ID (458421) string GeocacheCode; string Description; ("Coordinate Override") double Lat; double Lon; DateTime Date; public static List<Framework.Data.UserWaypoint> GetUserWaypointsFromGeocache(Framework.Data.UserWaypointCollection wpCollection, string geocacheCode) */ //Iterate all waypoints of cache wpList = Utils.DataAccess.GetWaypointsFromGeocache(db, gc.Code); foreach (var wp in wpList) { //only export waypoints with coords if (wp.Lat != null && wp.Lon != null) { //Make Wpt name of Cachename + # + "wpt-ID 2-letter prefix" //others may prefer simply wp.Code String wpname = (nameIsGCCode ? gc.Code : ProcessName(gc.Name, intMaxNameLen - 3)) + "#" + TolerantSubstring(wp.Code, 0, 2); String wpdesc = wp.Code + " "; //depending on source the "real" name of the wpt sometimes is either in "Name" or "Description" String wpd = wp.Name; if (wpd == wp.Code) {//use description if name only holds the wpcode wpd = wp.Description; } //POI description = name + comment wpdesc = wpdesc + ProcessDescription(wpd + ": " + wp.Comment, intMaxDescLen - wpdesc.Length); String wplon = FmtCsvLatLon((double)wp.Lon); String wplat = FmtCsvLatLon((double)wp.Lat); //wpts have no custom lat/lon if (boolExportWpts) { WptCsv(gc, wp).WriteLine(wplon + "," + wplat + ",\"" + wpname + "\",\"" + wpdesc + "\""); } } } index++; if (index % 50 == 0) { progress.Update(strProgSubtitle, gcList.Count, index); } } } foreach (var kv in sd) //close csv streams { kv.Value.Flush(); kv.Value.Close(); } sd = null; /* * POI Loader */ if (Core.Settings.Default.GarminPOIRunPOILoader && (Core.Settings.Default.GarminPOIPOILoaderFilename != "")) { if (Core.Settings.Default.GarminPOIPassDirectoryToPOILoader) { try { RegistryKey rkCU = Registry.CurrentUser; RegistryKey rkSettings = rkCU.OpenSubKey(@"Software\Garmin\POI Loader\Settings", RegistryKeyPermissionCheck.ReadWriteSubTree); rkSettings.SetValue("Directory", Core.Settings.Default.GarminPOIExportPath); rkCU.Close(); } catch { } } Process poiLoader = new Process(); poiLoader.StartInfo.FileName = Core.Settings.Default.GarminPOIPOILoaderFilename; if (Core.Settings.Default.GarminPOIRunPOILoaderSilently) { poiLoader.StartInfo.Arguments = "/Silent"; } else { poiLoader.StartInfo.Arguments = ""; } //poiLoader.StartInfo.Arguments = "/Directory \"" + Properties.Settings.Default.POIExportPath + "\""; // /silent is possible // /Silent|/s /UsbUnitId|/u <UNITID> /Silent|/s /Directory|/d "<DIRECTORY>" // HKEY_CURRENT_USER\Software\Garmin\POI Loader\Settings Key "Directory" REG_SZ poiLoader.StartInfo.UseShellExecute = true; poiLoader.StartInfo.ErrorDialog = true; poiLoader.Start(); } //Properties.Settings.Default.RunPOILoader //Properties.Settings.Default.POILoaderFilename } }
private void runFlow(ActionFlow flow) { try { foreach (ActionImplementation ai in flow.Actions) { ai.PrepareRun(); } //find start and run ActionStart startAction = (from a in flow.Actions where a is ActionStart select a).FirstOrDefault() as ActionStart; List<Core.Data.Geocache> gcList = startAction.PrepareFlow(); DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; bool canceled = false; using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ActionBuilder", "Executing", gcList.Count, 0, true)) { foreach (Core.Data.Geocache gc in gcList) { startAction.Run(gc); index++; if (DateTime.Now>=nextUpdate) { if (!prog.Update("Executing", gcList.Count, index)) { canceled = true; break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } if (!canceled) { //wrap up foreach (ActionImplementation ai in flow.Actions) { ai.FinalizeRun(); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public async Task DownloadMap() { DownloadedFilePath = null; FTPDirectoryItemInfo si = listItems.SelectedItem as FTPDirectoryItemInfo; if (si != null && !si.Folder) { await Task.Run(() => { try { using (TemporaryFile DownloadedFile = new TemporaryFile(false)) { string fn = "ftp://download.mapsforge.org/"; for (int i = 0; i < _folder.Count; i++) { fn = string.Format("{0}{1}/", fn, _folder[i]); } fn = string.Format("{0}{1}", fn, si.Name); DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("DownloadingFile", fn, (int)si.Size, 0)) { FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(fn)); ftpRequest.Credentials = new NetworkCredential("anonymous", "*****@*****.**"); ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; int bytesTotal = 0; using (FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse()) using (Stream responseStream = ftpResponse.GetResponseStream()) using (FileStream writeStream = new FileStream(DownloadedFile.Path, FileMode.Create)) { int Length = 2048 * 1000; Byte[] buffer = new Byte[Length]; int bytesRead = responseStream.Read(buffer, 0, Length); while (bytesRead > 0) { bytesTotal += bytesRead;// don't forget to increment bytesRead ! writeStream.Write(buffer, 0, bytesRead); bytesRead = responseStream.Read(buffer, 0, Length); if (DateTime.Now >= nextUpdate) { prog.Update(fn, (int)si.Size, bytesTotal); nextUpdate = DateTime.Now.AddSeconds(1); } } } if (bytesTotal == (int)si.Size) { //copy to correct location string p = System.IO.Path.Combine(Core.Settings.Default.SettingsFolder, "Maps"); if (!Directory.Exists(p)) { Directory.CreateDirectory(p); } DownloadedFilePath = System.IO.Path.Combine(p, si.Name); File.Copy(DownloadedFile.Path, DownloadedFilePath, true); } } } } catch (Exception e) { DownloadedFilePath = null; Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); } if (!string.IsNullOrEmpty(DownloadedFilePath)) { DialogResult = true; Close(); } }
public static void ImportGeocaches(Core.Storage.Database db, List<string> gcCodes) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingGeocaches", "ImportingGeocaches", gcCodes.Count, 0, true)) { int totalcount = gcCodes.Count; using (var client = new GeocachingLiveV6()) { int index = 0; while (gcCodes.Count > 0) { LiveV6.SearchForGeocachesRequest req = new LiveV6.SearchForGeocachesRequest(); req.IsLite = Core.Settings.Default.LiveAPIMemberTypeId == 1; req.AccessToken = client.Token; req.CacheCode = new LiveV6.CacheCodeFilter(); req.CacheCode.CacheCodes = (from a in gcCodes select a).Take(Core.Settings.Default.LiveAPIImportGeocachesBatchSize).ToArray(); req.MaxPerPage = Core.Settings.Default.LiveAPIImportGeocachesBatchSize; req.GeocacheLogCount = 5; index += req.CacheCode.CacheCodes.Length; gcCodes.RemoveRange(0, req.CacheCode.CacheCodes.Length); var resp = client.Client.SearchForGeocaches(req); if (resp.Status.StatusCode == 0 && resp.Geocaches != null) { List<Core.Data.Geocache> upList = ImportGeocaches(db, resp.Geocaches); if (Core.Settings.Default.LiveAPIDeselectAfterUpdate) { foreach (var g in upList) { g.Selected = false; } } } else { Core.ApplicationData.Instance.Logger.AddLog(new Import(), new Exception(resp.Status.StatusMessage)); break; } if (!progress.Update("ImportingGeocaches", totalcount, index)) { break; } if (gcCodes.Count>0) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelaySearchForGeocaches); } } } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), e); } }
public void AddUpdateTrackables(TrackableGroup grp, List<string> trkList) { using (Utils.ProgressBlock progr = new Utils.ProgressBlock("GetTrackableData", "GetTrackableData", trkList.Count, 0, true)) using (var api = new LiveAPI.GeocachingLiveV6()) { int index = 0; while (index < trkList.Count && AddUpdateTrackable(api, grp, trkList[index])) { index++; if (!progr.Update("GetTrackableData", trkList.Count, index)) { break; } else if (index < trkList.Count) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetTrackablesByTBCode); } } } }
public static void ImportGeocacheLogs(Core.Storage.Database db, List<Core.Data.Geocache> gcList) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("UpdatingGeocaches", "UpdatingGeocache", gcList.Count, 0, true)) { int totalcount = gcList.Count; using (LiveAPI.GeocachingLiveV6 client = new LiveAPI.GeocachingLiveV6()) { int index = 0; while (gcList.Count > 0) { int logCount = 0; int maxPerPage = Core.Settings.Default.LiveAPIGetGeocacheLogsByCacheCodeBatchSize; bool done = false; if (Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax > 0 && Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax < 30) { maxPerPage = Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax; } List<string> ids = new List<string>(); if (index > 0) { Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetGeocacheLogsByCacheCode); } var resp = client.Client.GetGeocacheLogsByCacheCode(client.Token, gcList[0].Code, logCount, maxPerPage); while (resp.Status.StatusCode == 0 && resp.Logs != null && resp.Logs.Count() > 0 && !done) { foreach (var lg in resp.Logs) { if (!lg.IsArchived) { Core.Data.Log gcLog = ImportLog(db, lg); if (Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax == 0 && gcLog != null) { ids.Add(gcLog.ID); } } } logCount += resp.Logs.Count(); if (Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax > 0) { int left = Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax - logCount; if (left < maxPerPage) { maxPerPage = left; } } if (maxPerPage > 0) { Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetGeocacheLogsByCacheCode); resp = client.Client.GetGeocacheLogsByCacheCode(client.Token, gcList[0].Code, logCount, maxPerPage); } else { done = true; } } if (resp.Status.StatusCode != 0) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), Core.Logger.Level.Error, resp.Status.StatusMessage); break; } else { if (Core.Settings.Default.LiveAPIDeselectAfterUpdate) { gcList[0].Selected = false; } if (Core.Settings.Default.LiveAPIUpdateGeocacheLogsMax == 0) { List<Core.Data.Log> allLogs = Utils.DataAccess.GetLogs(db, gcList[0].Code); foreach (Core.Data.Log gim in allLogs) { if (!ids.Contains(gim.ID)) { gim.DeleteRecord(); db.LogCollection.Remove(gim); } } } } index++; if (!progress.Update("UpdatingGeocache", totalcount, index)) { break; } gcList.RemoveAt(0); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), e); } }
private bool Save(FileCollection fc, Core.Storage.Database db, List <Core.Data.Geocache> gclist) { bool result = true; using (Utils.ProgressBlock fixpr = new Utils.ProgressBlock("Saving", "SavingData", 1, 0)) { byte[] memBuffer = new byte[10 * 1024 * 1024]; byte isFree = 0; byte notFree = 1; byte notFreeF = 2; using (MemoryStream ms = new MemoryStream(memBuffer)) using (BinaryWriter bw = new BinaryWriter(ms)) { //********************************************** //fc.DatabaseInfoFilename //********************************************** XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("info"); doc.AppendChild(root); XmlElement el = doc.CreateElement("IsLittleEndian"); XmlText txt = doc.CreateTextNode(BitConverter.IsLittleEndian.ToString()); el.AppendChild(txt); root.AppendChild(el); el = doc.CreateElement("GAPPVersion"); txt = doc.CreateTextNode("1.9.19.0"); el.AppendChild(txt); root.AppendChild(el); el = doc.CreateElement("StorageVersion"); txt = doc.CreateTextNode("1"); el.AppendChild(txt); root.AppendChild(el); el = doc.CreateElement("GeocacheCount"); txt = doc.CreateTextNode(gclist.Count.ToString()); el.AppendChild(txt); root.AppendChild(el); List <Core.Data.Log> logs = new List <Core.Data.Log>(); foreach (var g in gclist) { logs.AddRange(Utils.DataAccess.GetLogs(db, g.Code)); } el = doc.CreateElement("LogCount"); txt = doc.CreateTextNode(logs.Count.ToString()); el.AppendChild(txt); root.AppendChild(el); List <Core.Data.LogImage> logImages = new List <Core.Data.LogImage>(); foreach (var g in logs) { logImages.AddRange(Utils.DataAccess.GetLogImages(db, g.ID)); } el = doc.CreateElement("LogImagesCount"); txt = doc.CreateTextNode(logImages.Count.ToString()); el.AppendChild(txt); root.AppendChild(el); List <Core.Data.Waypoint> waypoints = new List <Core.Data.Waypoint>(); foreach (var g in gclist) { waypoints.AddRange(Utils.DataAccess.GetWaypointsFromGeocache(db, g.Code)); } el = doc.CreateElement("WaypointCount"); txt = doc.CreateTextNode(waypoints.Count.ToString()); el.AppendChild(txt); root.AppendChild(el); List <Core.Data.UserWaypoint> userWaypoints = new List <Core.Data.UserWaypoint>(); foreach (var g in gclist) { userWaypoints.AddRange(Utils.DataAccess.GetUserWaypointsFromGeocache(db, g.Code)); } el = doc.CreateElement("UserWaypointCount"); txt = doc.CreateTextNode(userWaypoints.Count.ToString()); el.AppendChild(txt); root.AppendChild(el); List <Core.Data.GeocacheImage> geocacheImages = new List <Core.Data.GeocacheImage>(); foreach (var g in gclist) { geocacheImages.AddRange(Utils.DataAccess.GetGeocacheImages(db, g.Code)); } el = doc.CreateElement("GeocacheImagesCount"); txt = doc.CreateTextNode(geocacheImages.Count.ToString()); el.AppendChild(txt); root.AppendChild(el); doc.Save(fc.DatabaseInfoFilename); //********************************************** //********************************************** //********************************************** // GEOCACHES //********************************************** //now get all the selected and data changed geocaches if (gclist.Count > 0) { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("SavingGeocaches", gclist.Count, 0)) { //fix block > ID = GC12345 //fulldata > ID = F_GC12345 long recordLength = 0; byte[] extraBuffer = new byte[200]; int index = 0; int procStep = 0; foreach (var gc in gclist) { //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFree); bw.Write(gc.Code); bw.Write(gc.Archived); WriteIntegerArray(bw, gc.AttributeIds); bw.Write(gc.Available); bw.Write(gc.City ?? ""); bw.Write(gc.Container.ID); bw.Write(false); bw.Write(gc.Country ?? ""); bw.Write(gc.ContainsCustomLatLon); if (gc.ContainsCustomLatLon) { bw.Write((double)gc.CustomLat); bw.Write((double)gc.CustomLon); } bw.Write(gc.Difficulty); bw.Write(gc.EncodedHints ?? ""); bw.Write(gc.Favorites); bw.Write(gc.Flagged); bw.Write(gc.Found); bw.Write(gc.GeocacheType.ID); bw.Write(Utils.Conversion.GetCacheIDFromCacheCode(gc.Code).ToString()); bw.Write(gc.Lat); bw.Write(gc.Lon); bw.Write(gc.MemberOnly); bw.Write(gc.Municipality ?? ""); bw.Write(gc.Name ?? ""); bw.Write(gc.Notes ?? ""); bw.Write(gc.Owner ?? ""); bw.Write(gc.OwnerId ?? ""); bw.Write(gc.PersonalNote ?? ""); bw.Write(gc.PlacedBy ?? ""); bw.Write(((DateTime)gc.PublishedTime).ToString("s")); bw.Write(gc.State ?? ""); bw.Write(gc.Terrain); bw.Write(gc.Name ?? ""); bw.Write(gc.Url ?? ""); bw.Write(gc.DataFromDate.ToString("s")); bw.Write(gc.Locked); writeRecord(gc.Code, ms, bw, fc._fsGeocaches, memBuffer, extraBuffer); //other record string id = string.Concat("F_", gc.Code); //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFreeF); bw.Write(id); bw.Write(gc.ShortDescription ?? ""); bw.Write(gc.ShortDescriptionInHtml); bw.Write(gc.LongDescription ?? ""); bw.Write(gc.LongDescriptionInHtml); writeRecord(id, ms, bw, fc._fsGeocaches, memBuffer, extraBuffer); index++; procStep++; if (procStep >= 1000) { progress.Update("SavingGeocaches", gclist.Count, index); procStep = 0; } } } fc._fsGeocaches.Flush(); } //********************************************** // LOGS //********************************************** if (logs.Count > 0) { int index = 0; int procStep = 0; using (Utils.ProgressBlock progress = new Utils.ProgressBlock("SavingLogs", logs.Count, 0)) { long recordLength = 0; byte[] extraBuffer = new byte[50]; foreach (var l in logs) { //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFree); bw.Write(l.ID); bw.Write(l.DataFromDate.ToString("s")); bw.Write(l.Date.ToString("s")); bw.Write(l.Finder ?? ""); bw.Write(l.GeocacheCode ?? ""); bw.Write(l.ID); bw.Write(l.LogType.ID); writeRecord(l.ID, ms, bw, fc._fsLogs, memBuffer, extraBuffer); string id = string.Concat("F_", l.ID); //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFreeF); bw.Write(id); bw.Write(l.TBCode ?? ""); bw.Write(l.FinderId ?? ""); bw.Write(l.Text ?? ""); bw.Write(l.Encoded); writeRecord(id, ms, bw, fc._fsLogs, memBuffer, extraBuffer); index++; procStep++; if (procStep >= 1000) { progress.Update("SavingLogs", logs.Count, index); procStep = 0; } } } fc._fsLogs.Flush(); } //********************************************** // WAYPOINTS //********************************************** using (FileStream fs = File.Open(fc.WaypointsFilename, FileMode.Create, FileAccess.Write)) { if (waypoints.Count > 0) { int index = 0; int procStep = 0; using (Utils.ProgressBlock progress = new Utils.ProgressBlock("Saving", "SavingWaypoints", waypoints.Count, 0)) { long recordLength = 0; byte[] extraBuffer = new byte[10]; foreach (var wp in waypoints) { //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFree); bw.Write(wp.Code); bw.Write(wp.Comment ?? ""); bw.Write(wp.DataFromDate.ToString("s")); bw.Write(wp.Description ?? ""); bw.Write(wp.GeocacheCode ?? ""); bw.Write(wp.ID ?? ""); if (wp.Lat == null || wp.Lon == null) { bw.Write(false); } else { bw.Write(true); bw.Write((double)wp.Lat); bw.Write((double)wp.Lon); } bw.Write(wp.Name ?? ""); bw.Write(wp.Time.ToString("s")); bw.Write(wp.Url ?? ""); bw.Write(wp.UrlName ?? ""); bw.Write(wp.WPType.ID); writeRecord(wp.Code, ms, bw, fs, memBuffer, extraBuffer); index++; procStep++; if (procStep >= 1000) { progress.Update("SavingWaypoints", waypoints.Count, index); procStep = 0; } } } } fs.Flush(); } //********************************************** // LOGIMAGES //********************************************** using (FileStream fs = File.Open(fc.LogImagesFilename, FileMode.Create, FileAccess.Write)) { if (logImages.Count > 0) { int index = 0; int procStep = 0; using (Utils.ProgressBlock progress = new Utils.ProgressBlock("Saving", "SavingLogImages", logImages.Count, 0)) { long recordLength = 0; byte[] extraBuffer = new byte[10]; foreach (var li in logImages) { //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFree); bw.Write(li.ID); bw.Write(li.DataFromDate.ToString("s")); bw.Write(li.LogId ?? ""); bw.Write(li.Name ?? ""); bw.Write(li.Url ?? ""); writeRecord(li.ID, ms, bw, fs, memBuffer, extraBuffer); index++; procStep++; if (procStep >= 1000) { progress.Update("SavingLogImages", logImages.Count, index); procStep = 0; } } } } fs.Flush(); } //********************************************** // GEOCACHEIMAGES //********************************************** using (FileStream fs = File.Open(fc.GeocacheImagesFilename, FileMode.Create, FileAccess.Write)) { if (geocacheImages.Count > 0) { int index = 0; int procStep = 0; using (Utils.ProgressBlock progress = new Utils.ProgressBlock("Saving", "SavingGeocacheImages", geocacheImages.Count, 0)) { long recordLength = 0; byte[] extraBuffer = new byte[100]; foreach (var li in geocacheImages) { //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFree); bw.Write(li.ID); bw.Write(li.DataFromDate.ToString("s")); bw.Write(li.GeocacheCode ?? ""); bw.Write(li.Description ?? ""); bw.Write(li.Name ?? ""); bw.Write(li.Url ?? ""); bw.Write(li.MobileUrl ?? ""); bw.Write(li.ThumbUrl ?? ""); writeRecord(li.ID, ms, bw, fs, memBuffer, extraBuffer); index++; procStep++; if (procStep >= 1000) { progress.Update("SavingGeocacheImages", geocacheImages.Count, index); procStep = 0; } } } } fs.Flush(); } //********************************************** // USER WAYPOINTS //********************************************** using (FileStream fs = File.Open(fc.UserWaypointsFilename, FileMode.Create, FileAccess.Write)) { //delete geocaches that are not in the list anymore. if (userWaypoints.Count > 0) { long recordLength = 0; byte[] extraBuffer = new byte[10]; foreach (var wp in userWaypoints) { //write to block ms.Position = 0; //block header bw.Write(recordLength); //overwrite afterwards bw.Write(notFree); bw.Write(wp.ID.ToString()); bw.Write(wp.Description ?? ""); bw.Write(wp.GeocacheCode ?? ""); bw.Write(wp.Lat); bw.Write(wp.Lon); bw.Write(wp.Date.ToString("s")); writeRecord(wp.ID.ToString(), ms, bw, fs, memBuffer, extraBuffer); } } fs.Flush(); } } } return(result); }
public async Task DownloadSelectedPQ() { List<LiveAPI.LiveV6.PQData> pqs = new List<LiveAPI.LiveV6.PQData>(); foreach (PQData p in listItems.SelectedItems) { pqs.Add(p.LiveAPIData); } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(new Action(() => { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("DownloadingPQ", "DownloadingPQ", pqs.Count, 0, true)) { int index = 0; try { using (var api = new LiveAPI.GeocachingLiveV6()) { Import imp = new Import(); foreach (LiveAPI.LiveV6.PQData pq in pqs) { if (progress.Update(pq.Name, pqs.Count, index)) { LiveAPI.LiveV6.GetPocketQueryZippedFileResponse resp = api.Client.GetPocketQueryZippedFile(api.Token, pq.GUID); if (resp.Status.StatusCode == 0) { using (System.IO.TemporaryFile tf = new System.IO.TemporaryFile(true)) { System.IO.File.WriteAllBytes(tf.Path, Convert.FromBase64String(resp.ZippedFile)); imp.ImportFile(tf.Path); updateProcessedPq(pq.GUID); } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, resp.Status.StatusMessage); break; } index++; } else { break; } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } })); } Close(); }
public void ImportMyLogsWithCaches(Core.Storage.Database db, SiteInfo activeSite) { using (Utils.ProgressBlock blockprogress = new Utils.ProgressBlock("ImportingOpencachingLogs", "ImportingOpencachingLogs", 2, 0, true)) { bool cancelled = false; try { int stepSize = 100; List<OKAPIService.Log> logs = new List<OKAPIService.Log>(); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingOpencachingLogs", "ImportingOpencachingLogs", 100, 0, true)) { List<OKAPIService.Log> pageLogs = OKAPIService.GetLogsOfUserID(activeSite, activeSite.UserID, stepSize, 0); while (pageLogs.Count() > 0) { logs.AddRange(pageLogs); if (!progress.Update("ImportingOpencachingLogs", logs.Count + stepSize, logs.Count)) { cancelled = true; break; } else if (pageLogs.Count() < stepSize) { break; } pageLogs = OKAPIService.GetLogsOfUserID(activeSite, activeSite.UserID, stepSize, logs.Count); } } if (!cancelled) { blockprogress.Update("ImportingOpencachingLogs", 2, 1); //we download the geocaches that are not present. But for the ones we have, we need to add the log and mark it as found List<string> gcList = (from a in logs where db.GeocacheCollection.GetGeocache(a.cache_code) != null select a.cache_code).ToList(); foreach (string s in gcList) { db.GeocacheCollection.GetGeocache(s).Found = true; var ls = (from a in logs where a.cache_code == s select a).ToList(); foreach (var l in ls) { Convert.AddLog(db, l, activeSite.Username, activeSite.UserID); } } gcList = (from a in logs where db.GeocacheCollection.GetGeocache(a.cache_code) == null select a.cache_code).ToList(); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingOpencachingLogs", "ImportingOpencachingGeocaches", gcList.Count, 0, true)) { int gcupdatecount = 1; while (gcList.Count > 0) { List<string> lcs = gcList.Take(gcupdatecount).ToList(); gcList.RemoveRange(0, lcs.Count); List<OKAPIService.Geocache> caches = OKAPIService.GetGeocaches(activeSite, lcs); Import.AddGeocaches(db, caches); foreach (var g in caches) { var ls = (from a in logs where a.cache_code == g.code select a).ToList(); foreach (var l in ls) { Convert.AddLog(db, l, activeSite.Username, activeSite.UserID); } } if (!progress.Update("ImportingOpencachingGeocaches", logs.Count, logs.Count - gcList.Count)) { cancelled = true; break; } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } }
public async Task AssignRegion() { if (Core.ApplicationData.Instance.ActiveDatabase != null) { List <Core.Data.Geocache> gcList = new List <Core.Data.Geocache>(); if (selectionContext.GeocacheSelectionContext == UIControls.SelectionContext.Context.NewSelection) { gcList = Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection; } else if (selectionContext.GeocacheSelectionContext == UIControls.SelectionContext.Context.WithinSelection) { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where a.Selected select a).ToList(); } else { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where !a.Selected select a).ToList(); } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(() => { try { //select the available areas List <Core.Data.AreaInfo> areas; if (string.IsNullOrEmpty(SelectedArea)) { areas = Shapefiles.ShapeFilesManager.Instance.GetAreasByLevel(SelectedAreaLevel); } else { areas = Shapefiles.ShapeFilesManager.Instance.GetAreasByName(SelectedArea, SelectedAreaLevel); } if (areas != null && areas.Count > 0) { if (!string.IsNullOrEmpty(Prefix)) { areas = (from a in areas where a.Name.StartsWith(Prefix, StringComparison.OrdinalIgnoreCase) select a).ToList(); } } if (areas != null && areas.Count > 0) { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("Searching", "Searching", gcList.Count, 0, true)) { int index = 0; foreach (var gc in gcList) { if (InEnvelope) { gc.Selected = Shapefiles.ShapeFilesManager.Instance.GetEnvelopAreasOfLocation(new Core.Data.Location(gc.Lat, gc.Lon), areas).Count > 0; } else { gc.Selected = Shapefiles.ShapeFilesManager.Instance.GetAreasOfLocation(new Core.Data.Location(gc.Lat, gc.Lon), areas).Count > 0; } index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("Searching", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } else { foreach (var gc in gcList) { gc.Selected = false; } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); } } }
protected override void PerformExport(object settings) { var gpxSetting = settings as ExportGPXSettings; if (gpxSetting != null && !string.IsNullOrEmpty(gpxSetting.FileName)) { bool canceled = false; try { using (var db = new NPoco.Database(this.DatabaseConnection.Connection, NPoco.DatabaseType.SQLite)) { double minLat = 0, minLon = 0, maxLat = 0, maxLon = 0; if (DatabaseConnection.CurrentDataReader != null && !DatabaseConnection.CurrentDataReader.IsClosed) { DatabaseConnection.CurrentDataReader.Close(); } var gcList = db.Fetch <GeocacheEntryInfo>(string.Format("select Code, Name, CacheType, Difficulty, Terrain, Found, Container, Latitude, Longitude, kAfterLat, kAfterLon from Caches inner join {0} on Caches.Code={0}.gccode left join Corrected on Caches.Code = Corrected.kCode", ActionInputTableName)); minLat = (from a in gcList select Utils.Conversion.StringToDouble(a.Latitude)).Min(); maxLat = (from a in gcList select Utils.Conversion.StringToDouble(a.Latitude)).Max(); minLon = (from a in gcList select Utils.Conversion.StringToDouble(a.Longitude)).Min(); maxLon = (from a in gcList select Utils.Conversion.StringToDouble(a.Longitude)).Max(); DateTime dt = DateTime.Now.AddSeconds(2); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportingGPX", "CreatingFile", gcList.Count, 0, true)) { using (System.IO.TemporaryFile gpxFile = new System.IO.TemporaryFile(false)) { using (ZipOutputStream s = new ZipOutputStream(System.IO.File.Create(gpxFile.Path))) { s.SetLevel(9); // 0-9, 9 being the highest compression s.UseZip64 = UseZip64.Off; int totalGeocaches = gcList.Count; int totalProcessed = 0; int fileIndex = 1; int geocacheIndex = 0; int gpxSizeLimit = 4500000; //appr. 4.5MB XmlDocument doc = new XmlDocument(); XmlDeclaration pi = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes"); doc.InsertBefore(pi, doc.DocumentElement); XmlElement root = doc.CreateElement("ggz"); doc.AppendChild(root); XmlAttribute attr = doc.CreateAttribute("xmlns"); XmlText txt = doc.CreateTextNode("http://www.opencaching.com/xmlschemas/ggz/1/0"); attr.AppendChild(txt); root.Attributes.Append(attr); XmlElement el = doc.CreateElement("time"); txt = doc.CreateTextNode(string.Format("{0}Z", DateTime.Now.ToUniversalTime().ToString("s"))); el.AppendChild(txt); root.AppendChild(el); Utils.GPXGenerator gpxGenerator = new Utils.GPXGenerator( db , (from a in gcList select a.Code).ToList() , gpxSetting.Version , minLat , maxLat , minLon , maxLon ); while (gcList.Count > 0) { XmlElement elFile = doc.CreateElement("file"); root.AppendChild(elFile); el = doc.CreateElement("name"); txt = doc.CreateTextNode(string.Format("{0}_{1}.gpx", System.IO.Path.GetFileNameWithoutExtension(gpxSetting.FileName), fileIndex)); el.AppendChild(txt); elFile.AppendChild(el); XmlElement elCRC = doc.CreateElement("crc"); elFile.AppendChild(elCRC); el = doc.CreateElement("time"); txt = doc.CreateTextNode(string.Format("{0}Z", DateTime.Now.ToUniversalTime().ToString("s"))); el.AppendChild(txt); elFile.AppendChild(el); //create GPX wpt entries until max size is reached List <GeocacheEntryInfo> gpxBatchList = new List <GeocacheEntryInfo>(); List <GeocacheEntryInfo> geiList = new List <GeocacheEntryInfo>(); geocacheIndex = 0; minLat = (from a in gcList select Utils.Conversion.StringToDouble(a.Latitude)).Min(); maxLat = (from a in gcList select Utils.Conversion.StringToDouble(a.Latitude)).Max(); minLon = (from a in gcList select Utils.Conversion.StringToDouble(a.Longitude)).Min(); maxLon = (from a in gcList select Utils.Conversion.StringToDouble(a.Longitude)).Max(); gpxGenerator.SetGeocacheList((from a in gcList select a.Code).ToList(), minLat, maxLat, minLon, maxLon); StringBuilder sb = new StringBuilder(); gpxGenerator.Start(); while (sb.Length < gpxSizeLimit && geocacheIndex < gpxGenerator.Count) { gpxBatchList.Add(gcList[geocacheIndex]); string gpxText = gpxGenerator.Next(); gcList[geocacheIndex].FileLen = System.Text.UTF8Encoding.UTF8.GetBytes(gpxText).Length + 2; geiList.Add(gcList[geocacheIndex]); sb.AppendLine(gpxText); totalProcessed++; geocacheIndex++; if (DateTime.Now >= dt) { if (!progress.Update("CreatingFile", totalGeocaches, totalProcessed)) { canceled = true; break; } dt = DateTime.Now.AddSeconds(2); } } sb.AppendLine(gpxGenerator.Finish()); //insert gpx header minLat = (from a in gpxBatchList select Utils.Conversion.StringToDouble(a.Latitude)).Min(); maxLat = (from a in gpxBatchList select Utils.Conversion.StringToDouble(a.Latitude)).Max(); minLon = (from a in gpxBatchList select Utils.Conversion.StringToDouble(a.Longitude)).Min(); maxLon = (from a in gpxBatchList select Utils.Conversion.StringToDouble(a.Longitude)).Max(); gpxGenerator.SetGeocacheList((from a in gpxBatchList select a.Code).ToList(), minLat, maxLat, minLon, maxLon); string gpxHeader = gpxGenerator.Start(); sb.Insert(0, gpxHeader); gcList.RemoveRange(0, gpxBatchList.Count); //add gpx to zip byte[] data; using (System.IO.TemporaryFile tmp = new System.IO.TemporaryFile(true)) { using (System.IO.StreamWriter sw = System.IO.File.CreateText(tmp.Path)) { sw.Write(sb.ToString()); } data = File.ReadAllBytes(tmp.Path); } string fn = string.Format("data/{0}_{1}.gpx", System.IO.Path.GetFileNameWithoutExtension(gpxSetting.FileName), fileIndex); ZipEntry entry = new ZipEntry(fn); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); s.Write(data, 0, data.Length); Crc32 crc = new Crc32(); crc.Update(data); //txt = doc.CreateTextNode(crc16.ComputeChecksum(data).ToString("X8")); txt = doc.CreateTextNode(crc.Value.ToString("X8")); elCRC.AppendChild(txt); int curPos = System.Text.UTF8Encoding.UTF8.GetBytes(gpxHeader).Length; for (int i = 0; i < geiList.Count; i++) { GeocacheEntryInfo gei = geiList[i]; XmlElement chgEl = doc.CreateElement("gch"); elFile.AppendChild(chgEl); el = doc.CreateElement("code"); txt = doc.CreateTextNode(gei.Code ?? ""); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("name"); txt = doc.CreateTextNode(gpxGenerator.validateXml(gei.Name ?? "")); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("type"); txt = doc.CreateTextNode((from a in ApplicationData.Instance.GeocacheTypes where a.GSAK == gei.CacheType select a.GPXTag).FirstOrDefault() ?? ""); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("lat"); txt = doc.CreateTextNode(gei.kAfterLat ?? gei.Latitude); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("lon"); txt = doc.CreateTextNode(gei.kAfterLon ?? gei.Longitude); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("file_pos"); txt = doc.CreateTextNode(curPos.ToString()); curPos += gei.FileLen; el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("file_len"); txt = doc.CreateTextNode(gei.FileLen.ToString()); el.AppendChild(txt); chgEl.AppendChild(el); XmlElement ratingsEl = doc.CreateElement("ratings"); chgEl.AppendChild(ratingsEl); el = doc.CreateElement("awesomeness"); txt = doc.CreateTextNode("3.0"); el.AppendChild(txt); ratingsEl.AppendChild(el); el = doc.CreateElement("difficulty"); txt = doc.CreateTextNode(gei.Difficulty.ToString("0.#").Replace(',', '.')); el.AppendChild(txt); ratingsEl.AppendChild(el); el = doc.CreateElement("size"); switch ((from a in ApplicationData.Instance.GeocacheContainers where a.Name == gei.Container select a.ID).FirstOrDefault()) { case 1: txt = doc.CreateTextNode("2.0"); break; case 5: txt = doc.CreateTextNode("2.0"); break; case 6: txt = doc.CreateTextNode("2.0"); break; case 2: txt = doc.CreateTextNode("2.0"); break; case 3: txt = doc.CreateTextNode("4.0"); break; case 4: txt = doc.CreateTextNode("5.0"); break; case 8: txt = doc.CreateTextNode("3.0"); break; default: txt = doc.CreateTextNode("3.0"); break; } el.AppendChild(txt); ratingsEl.AppendChild(el); el = doc.CreateElement("terrain"); txt = doc.CreateTextNode(gei.Terrain.ToString("0.#").Replace(',', '.')); el.AppendChild(txt); ratingsEl.AppendChild(el); if (gei.Found != 0) { el = doc.CreateElement("found"); txt = doc.CreateTextNode("true"); el.AppendChild(txt); chgEl.AppendChild(el); } } fileIndex++; } //add index file // index\com\garmin\geocaches\v0\index.xml /* * <gch> * <code>GC12345</code> * <name>Cache name</name> * <type>Traditional Cache</type> * <lat>33.550217</lat> * <lon>-117.660617</lon> * <file_pos>5875</file_pos> * <file_len>5783</file_len> * <ratings> * <awesomeness>3.0</awesomeness> * <difficulty>1.5</difficulty> * <size>5.0</size> * <terrain>1.5</terrain> * </ratings> * <found>true</found> * </gch> * * 1 = Nano (not supported, unfortunately, by GC.com yet) * 2 = Micro * 3 = Small * 4 = Regular * 5 = Large * */ using (System.IO.TemporaryFile tmp = new System.IO.TemporaryFile(true)) { using (TextWriter sw = new StreamWriter(tmp.Path, false, Encoding.UTF8)) //Set encoding { doc.Save(sw); } byte[] data = File.ReadAllBytes(tmp.Path); ZipEntry entry = new ZipEntry("index/com/garmin/geocaches/v0/index.xml"); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); s.Write(data, 0, data.Length); } s.Finish(); s.Close(); } if (!canceled) { System.IO.File.Copy(gpxFile.Path, gpxSetting.FileName, true); } } } } } catch { } } }
public async Task DownloadSelectedPQ() { List <LiveAPI.LiveV6.PQData> pqs = new List <LiveAPI.LiveV6.PQData>(); foreach (PQData p in listItems.SelectedItems) { pqs.Add(p.LiveAPIData); } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(new Action(() => { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("DownloadingPQ", "DownloadingPQ", pqs.Count, 0, true)) { int index = 0; try { using (var api = new LiveAPI.GeocachingLiveV6()) { Import imp = new Import(); foreach (LiveAPI.LiveV6.PQData pq in pqs) { if (progress.Update(pq.Name, pqs.Count, index)) { LiveAPI.LiveV6.GetPocketQueryZippedFileResponse resp = api.Client.GetPocketQueryZippedFile(api.Token, pq.GUID); if (resp.Status.StatusCode == 0) { using (System.IO.TemporaryFile tf = new System.IO.TemporaryFile(true)) { System.IO.File.WriteAllBytes(tf.Path, Convert.FromBase64String(resp.ZippedFile)); imp.ImportFile(tf.Path, true); updateProcessedPq(pq.GUID); } } else { Core.ApplicationData.Instance.Logger.AddLog(this, Core.Logger.Level.Error, resp.Status.StatusMessage); break; } index++; } else { break; } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } })); } Close(); }
public static void ImportGeocacheStatus(Core.Storage.Database db, List<string> gcCodes) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("UpdatingGeocaches", "UpdatingGeocaches", gcCodes.Count, 0, true)) { int totalcount = gcCodes.Count; using (var client = new GeocachingLiveV6()) { int index = 0; while (gcCodes.Count > 0) { var req = new LiveV6.GetGeocacheStatusRequest(); req.AccessToken = client.Token; req.CacheCodes = (from a in gcCodes select a).Take(Core.Settings.Default.LiveAPIGetGeocacheStatusBatchSize).ToArray(); index += req.CacheCodes.Length; gcCodes.RemoveRange(0, req.CacheCodes.Length); var resp = client.Client.GetGeocacheStatus(req); if (resp.Status.StatusCode == 0 && resp.GeocacheStatuses != null) { foreach (var gs in resp.GeocacheStatuses) { Core.Data.Geocache gc = db.GeocacheCollection.GetGeocache(gs.CacheCode); if (gc != null) { gc.DataFromDate = DateTime.Now; gc.Archived = gs.Archived; gc.Available = gs.Available; if (!gc.Locked) { gc.Name = gs.CacheName; } gc.MemberOnly = gs.Premium; if (Core.Settings.Default.LiveAPIDeselectAfterUpdate) { gc.Selected = false; } } } } else { Core.ApplicationData.Instance.Logger.AddLog(new Import(), new Exception(resp.Status.StatusMessage)); break; } if (!progress.Update("UpdatingGeocaches", totalcount, index)) { break; } if (gcCodes.Count > 0) { System.Threading.Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetGeocacheStatus); } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), e); } }
public static void ExportToFile(List <Core.Data.Geocache> gcList, string filename) { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportingOV2", "CreatingFile", gcList.Count, 0)) { using (System.IO.FileStream fs = System.IO.File.Create(filename)) { DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; foreach (Core.Data.Geocache gc in gcList) { StringBuilder sb = new StringBuilder(); if (Core.Settings.Default.OV2FieldCoord) { if (sb.Length > 0) { sb.Append(","); } sb.Append(Utils.Conversion.GetCoordinatesPresentation(gc.Lat, gc.Lon)); } if (Core.Settings.Default.OV2FieldCode) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Code ?? ""); } if (Core.Settings.Default.OV2FieldCacheType) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.GeocacheType.Name); } if (Core.Settings.Default.OV2FieldName) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Name ?? ""); } if (Core.Settings.Default.OV2FieldContainer) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Container.Name); } if (Core.Settings.Default.OV2FieldHint) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.EncodedHints ?? ""); } if (Core.Settings.Default.OV2FieldFavorites) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Favorites.ToString()); } if (Core.Settings.Default.OV2FieldOwner) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Owner ?? ""); } if (Core.Settings.Default.OV2FieldDifficulty) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Difficulty.ToString("0.#")); } if (Core.Settings.Default.OV2FieldTerrain) { if (sb.Length > 0) { sb.Append(","); } sb.Append(gc.Terrain.ToString("0.#")); } byte[] data; string s = sb.ToString(); data = new byte[s.Length]; for (int i = 0; i < s.Length; i++) { data[i] = BitConverter.GetBytes(s[i])[0]; } //data = System.Text.UnicodeEncoding.UTF8.GetBytes(sb.ToString()); fs.WriteByte(2); Int32 len = 13 + data.Length + 1; byte[] arr; arr = BitConverter.GetBytes(len); fs.Write(arr, 0, 4); Int32 x; Int32 y; if (gc.CustomLat != null && gc.CustomLon != null) { x = (Int32)(gc.CustomLon * 100000.0); y = (Int32)(gc.CustomLat * 100000.0); } else { x = (Int32)(gc.Lon * 100000.0); y = (Int32)(gc.Lat * 100000.0); } fs.Write(BitConverter.GetBytes(x), 0, 4); fs.Write(BitConverter.GetBytes(y), 0, 4); fs.Write(data, 0, data.Length); fs.WriteByte(0); index++; if (DateTime.Now >= nextUpdate) { progress.Update("CreatingFile", gcList.Count, index); nextUpdate = DateTime.Now.AddSeconds(1); } } } } }
public async Task SelectWithinRadiusAsync() { try { Core.Data.Location center = null; double radius = 0; var sc = selectionContext.GeocacheSelectionContext; object o = executeScript("getCenterPosition", null); if (o != null && o.GetType() != typeof(DBNull)) { string s = o.ToString().Replace("(", "").Replace(")", ""); center = Utils.Conversion.StringToLocation(s); } o = executeScript("getRadius", null); if (o != null && o.GetType() != typeof(DBNull)) { string s = o.ToString(); radius = Utils.Conversion.StringToDouble(s) * 1000.0; } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(new Action(() => { try { List <Core.Data.Geocache> gcList; if (sc == GAPPSF.UIControls.SelectionContext.Context.NewSelection) { gcList = Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection; } else if (sc == GAPPSF.UIControls.SelectionContext.Context.WithinSelection) { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where a.Selected select a).ToList(); } else { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where !a.Selected select a).ToList(); } DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("Searching", "Searching", gcList.Count, 0, true)) { int index = 0; foreach (var gc in gcList) { gc.Selected = Utils.Calculus.CalculateDistance(gc, center).EllipsoidalDistance <= radius; index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("Searching", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } })); } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
public static void ImportGeocaches(Core.Storage.Database db, LiveV6.SearchForGeocachesRequest req, int max) { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingGeocaches", "ImportingGeocaches", max, 0, true)) { try { using (GeocachingLiveV6 client = new GeocachingLiveV6()) { req.AccessToken = client.Token; var resp = client.Client.SearchForGeocaches(req); if (resp.Status.StatusCode == 0 && resp.Geocaches != null) { ImportGeocaches(db, resp.Geocaches); if (resp.Geocaches.Count() >= req.MaxPerPage && req.MaxPerPage < max) { if (progress.Update("ImportingGeocaches", max, resp.Geocaches.Count())) { var mreq = new LiveV6.GetMoreGeocachesRequest(); mreq.AccessToken = req.AccessToken; mreq.GeocacheLogCount = req.GeocacheLogCount; mreq.MaxPerPage = (int)Math.Min(req.MaxPerPage, max - resp.Geocaches.Count()); mreq.StartIndex = resp.Geocaches.Count(); mreq.TrackableLogCount = req.TrackableLogCount; mreq.IsLite = req.IsLite; mreq.GeocacheLogCount = req.GeocacheLogCount; while (resp.Status.StatusCode == 0 && resp.Geocaches != null && resp.Geocaches.Count() >= req.MaxPerPage) { resp = client.Client.GetMoreGeocaches(mreq); if (resp.Status.StatusCode == 0 && resp.Geocaches != null) { ImportGeocaches(db, resp.Geocaches); if (!progress.Update("ImportingGeocaches", max, mreq.StartIndex + resp.Geocaches.Count())) { break; } mreq.StartIndex += resp.Geocaches.Count(); mreq.MaxPerPage = (int)Math.Min(req.MaxPerPage, max - mreq.StartIndex); if (mreq.StartIndex >= max - 1) { break; } } else { Core.ApplicationData.Instance.Logger.AddLog(new Import(), Core.Logger.Level.Error, resp.Status.StatusMessage); } } } } } else { Core.ApplicationData.Instance.Logger.AddLog(new Import(), Core.Logger.Level.Error, resp.Status.StatusMessage); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), e); } } }
private static bool Import(Database database, string filename) { try { using (Utils.ProgressBlock allprog = new ProgressBlock("ImportGSAKDatabase", "Importing", 6, 0)) { System.Collections.Hashtable logTypes = new System.Collections.Hashtable(); String connect = String.Format("data source=file:{0}", filename); using (SqliteConnection dbcon = new SqliteConnection(connect)) { //System.Diagnostics.Debugger.Break(); logTypes.Add("Found it", 2); logTypes.Add("Didn't find it", 3); logTypes.Add("Write note", 4); logTypes.Add("Archive", 5); logTypes.Add("Needs Archived", 7); logTypes.Add("Will Attend", 9); logTypes.Add("Attended", 10); logTypes.Add("Webcam Photo Taken", 11); logTypes.Add("Unarchive", 12); logTypes.Add("Temporarily Disable Listing", 22); logTypes.Add("Enable Listing", 23); logTypes.Add("Publish Listing", 24); logTypes.Add("Retract Listing", 25); logTypes.Add("Needs Maintenance", 45); logTypes.Add("Owner Maintenance", 46); logTypes.Add("Update Coordinates", 47); logTypes.Add("Post Reviewer Note", 68); logTypes.Add("Announcement", 74); dbcon.Open(); SqliteCommand lookup = new SqliteCommand("select aId, aInc from attributes where aCode = @Code", dbcon); lookup.CommandType = CommandType.Text; DbParameter par = lookup.CreateParameter(); par.Direction = ParameterDirection.Input; par.ParameterName = "@Code"; lookup.Parameters.Add(par); lookup.Prepare(); SqliteCommand import = new SqliteCommand("select count(1) from caches", dbcon); import.CommandType = CommandType.Text; int index = 0; int gcCount = (int)(long)import.ExecuteScalar(); if (gcCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new ProgressBlock("ImportingGeocaches", 1, 0)) { bool isPremiumAvailable = false; bool isFavPointAvailable = false; bool isGCNoteAvailable = false; try { import.CommandText = "select IsPremium from Caches limit 1"; using (SqliteDataReader checkdr = import.ExecuteReader()) { isPremiumAvailable = true; } } catch { } try { import.CommandText = "select FavPoints from Caches limit 1"; using (SqliteDataReader checkdr = import.ExecuteReader()) { isFavPointAvailable = true; } } catch { } try { import.CommandText = "select gcnote from Caches limit 1"; using (SqliteDataReader checkdr = import.ExecuteReader()) { isGCNoteAvailable = true; } } catch { } import.CommandText = "select caches.Code, Name, LastGPXDate, PlacedDate, Latitude, Longitude, Status, " + "Archived, Country, State, CacheType, PlacedBy, OwnerName, OwnerId, Container, Terrain, Difficulty, ShortHTM" + ", LongHTM, " + string.Format("{0}", isPremiumAvailable ? "IsPremium, " : "") + " HasCorrected, LatOriginal, LonOriginal, UserFlag, Found, " + string.Format("{0}", isFavPointAvailable ? "FavPoints, " : "") + " ShortDescription, LongDescription, Hints, Url, UserNote" + string.Format("{0}", isGCNoteAvailable ? ", gcnote" : "") + " from caches" + " inner join cachememo on cachememo.code = caches.code"; SqliteDataReader dr = import.ExecuteReader(); while (dr.Read()) { GeocacheData gc = new GeocacheData(); int cacheType; try { cacheType = getCacheType(((String)dr["CacheType"])[0]); } catch (ArgumentOutOfRangeException) { continue; } int container = getContainer(((String)dr["Container"])[0]); gc.Code = (string)dr["code"]; gc.Name = (string)dr["name"]; if (string.IsNullOrEmpty((string)dr["LastGPXDate"])) { gc.DataFromDate = DateTime.Now.Date; } else { gc.DataFromDate = DateTime.Parse((string)dr["LastGPXDate"]); } gc.Available = ((String)dr["Status"]).Equals("A"); gc.Archived = (int)dr["archived"] != 0; gc.Country = (string)dr["country"]; gc.State = (string)dr["state"]; gc.GeocacheType = Utils.DataAccess.GetGeocacheType(cacheType); gc.PlacedBy = (string)dr["placedby"]; gc.Owner = (string)dr["OwnerName"]; gc.OwnerId = dr["ownerid"].GetType() == typeof(DBNull) ? "" : dr["ownerid"].ToString(); gc.Container = Utils.DataAccess.GetGeocacheContainer(container); gc.Terrain = (double)dr["terrain"]; gc.Difficulty = (double)dr["difficulty"]; gc.ShortDescription = (string)dr["ShortDescription"]; gc.ShortDescriptionInHtml = (int)dr["ShortHTM"] != 0; gc.LongDescription = (string)dr["LongDescription"]; gc.LongDescriptionInHtml = (int)dr["LongHTM"] != 0; gc.EncodedHints = (string)dr["Hints"]; gc.Url = (string)dr["url"]; if (isPremiumAvailable) { gc.MemberOnly = (int)dr["IsPremium"] != 0; } else { gc.MemberOnly = false; } bool customCoords = (int)dr["HasCorrected"] != 0; if (customCoords) { gc.CustomLat = Utils.Conversion.StringToDouble(dr["Latitude"] as String); gc.CustomLon = Utils.Conversion.StringToDouble(dr["Longitude"] as String); gc.Lat = Utils.Conversion.StringToDouble(dr["LatOriginal"] as string); gc.Lon = Utils.Conversion.StringToDouble(dr["LonOriginal"] as string); } else { gc.Lat = Utils.Conversion.StringToDouble(dr["Latitude"] as string); gc.Lon = Utils.Conversion.StringToDouble(dr["Longitude"] as string); } par.Value = gc.Code; DbDataReader attrs = lookup.ExecuteReader(); List<int> attrList = new List<int>(); while (attrs.Read()) { int attr = (int)(int)attrs["aId"]; if (attrs["aInc"].ToString() == "0") { attr *= -1; } attrList.Add(attr); } attrs.Close(); gc.AttributeIds = attrList; gc.Notes = (string)dr["UserNote"]; gc.PublishedTime = DateTime.Parse((string)dr["PlacedDate"]); if (isGCNoteAvailable) { gc.PersonalNote = (string)dr["gcnote"]; } else { gc.PersonalNote = ""; } gc.Flagged = (int)dr["UserFlag"] != 0; gc.Found = (int)dr["Found"] != 0; if (isFavPointAvailable) { gc.Favorites = (int)(int)dr["FavPoints"]; } else { gc.Favorites = 0; } DataAccess.AddGeocache(database, gc); index++; if (DateTime.Now >= progShow) { prog.Update("ImportingGeocaches", gcCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 1); import.CommandText = "select count(1) from logs"; int logCount = (int)(long)import.ExecuteScalar(); if (logCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingLogs", logCount, 0)) { index = 0; import.CommandText = "select l.lLogId, l.lParent, lDate, lTime, lBy, lownerid, lEncoded, lType, lText " + " from logs l" + " inner join logmemo m on m.lLogId = l.lLogId and m.lParent = l.lParent"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { Core.Data.LogData lg = new Core.Data.LogData(); String type = (String)dr["lType"]; int logType = (int)logTypes[type]; //id text, gccode text, tbcode text, date text, finder text, finderid text, logtext text, encoded integer, datafromdate text, logtype integer lg.ID = dr["lLogiD"].ToString(); lg.GeocacheCode = (string)dr["lParent"]; lg.TBCode = ""; lg.Date = (DateTime)dr["lDate"]; lg.Finder = (string)dr["lBy"]; lg.FinderId = dr["lownerid"].ToString(); lg.Text = (string)dr["lText"]; lg.Encoded = (long)dr["lEncoded"] != 0; lg.DataFromDate = DateTime.Now; lg.LogType = Utils.DataAccess.GetLogType(logType); DataAccess.AddLog(database, lg); index++; if (DateTime.Now >= progShow) { progress.Update("ImportingLogs", logCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 2); import.CommandText = "select count(1) from logimages"; int logimgCount = 0; try { logimgCount = (int)(long)import.ExecuteScalar(); } catch { //table does not exists } if (logimgCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingLogImages", logimgCount, 0)) { index = 0; import.CommandText = "select iCode, iLogId, iImage, iName from logimages"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { Core.Data.LogImageData lg = new Core.Data.LogImageData(); lg.ID = (string)dr["iCode"]; lg.LogId = dr["iLogID"].ToString(); lg.Url = (string)dr["iImage"]; lg.Name = (string)dr["iName"]; DataAccess.AddLogImage(database, lg); index++; if (DateTime.Now >= progShow) { progress.Update("ImportingLogImages", logimgCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 3); //id text, code text, geocachecode text, name text, datafromdate text, comment text, description text, url text, urlname text, wptype integer, lat real, lon real, time text import.CommandText = "select count(1) from waypoints"; int wptCount = (int)(long)import.ExecuteScalar(); if (wptCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingWaypoints", wptCount, 0)) { index = 0; import.CommandText = "select w.cParent, w.cCode, cName, cDate, cType, cLat, cLon," + " cComment, cUrl" + " from waypoints w" + " inner join wayMemo m on w.cParent = m.cParent and w.cCode=m.cCode"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { Core.Data.WaypointData wp = new Core.Data.WaypointData(); int wpType = getWPType(((string)dr["cType"])[0]); wp.ID = (string)dr["cCode"]; wp.Code = (string)dr["cCode"]; wp.Url = (string)dr["cUrl"]; //wp.UrlName = (string)dr["urlname"]; wp.Name = (string)dr["cName"]; wp.DataFromDate = (DateTime)dr["cDate"]; wp.Comment = (string)dr["cComment"]; wp.GeocacheCode = (string)dr["cParent"]; //wp.Description = (string)dr["description"]; wp.WPType = Utils.DataAccess.GetWaypointType(wpType); double lat = Utils.Conversion.StringToDouble(dr["clat"] as string); double lon = Utils.Conversion.StringToDouble(dr["clon"] as string); if (Math.Abs(lat) < 0.00001) { wp.Lat = null; } else { wp.Lat = lat; } if (Math.Abs(lon) < 0.00001) { wp.Lon = null; } else { wp.Lon = lon; } wp.Time = (DateTime)dr["cDate"]; wp.Description = wp.WPType.Name; wp.UrlName = wp.WPType.Name; DataAccess.AddWaypoint(database, wp); index++; if (DateTime.Now >= progShow) { progress.Update("ImportingWaypoints", wptCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 4); try { //import corrected if table exists import.CommandText = "select kCode, kAfterLat, kAfterLon from Corrected"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { string gcCode = dr["kCode"] as string ?? ""; Core.Data.Geocache gc = database.GeocacheCollection.GetGeocache(gcCode); if (gc != null) { object oLat = dr["kAfterLat"]; object oLon = dr["kAfterLon"]; if (oLat != null && oLat.GetType() != typeof(DBNull) && oLon != null && oLon.GetType() != typeof(DBNull)) { string sLat = oLat as string; string sLon = oLon as string; if (sLat.Length > 0 && sLon.Length > 0) { gc.CustomLat = Utils.Conversion.StringToDouble(sLat); gc.CustomLon = Utils.Conversion.StringToDouble(sLon); } } } } } catch { } allprog.Update("Importing", 5, 5); } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Importer(), e); } return true; }
public static void ImportGeocacheImages(Core.Storage.Database db, List<Core.Data.Geocache> gcList) { try { using (Utils.ProgressBlock progress = new Utils.ProgressBlock("UpdatingGeocaches", "UpdatingGeocache", gcList.Count, 0, true)) { int totalcount = gcList.Count; using (LiveAPI.GeocachingLiveV6 client = new LiveAPI.GeocachingLiveV6()) { int index = 0; while (gcList.Count > 0) { if (index > 0) { Thread.Sleep(Core.Settings.Default.LiveAPIDelayGetImagesForGeocache); } var resp = client.Client.GetImagesForGeocache(client.Token, gcList[0].Code); if (resp.Status.StatusCode == 0) { if (resp.Images != null) { List<string> ids = new List<string>(); foreach (var img in resp.Images) { if (img.Url.IndexOf("/cache/log/") < 0) { Core.Data.GeocacheImage gcImg = ImportGeocacheImage(db, img, gcList[0].Code); if (gcImg != null) { ids.Add(gcImg.ID); } } } List<Core.Data.GeocacheImage> allImages = Utils.DataAccess.GetGeocacheImages(db, gcList[0].Code); foreach (Core.Data.GeocacheImage gim in allImages) { if (!ids.Contains(gim.ID)) { gim.DeleteRecord(); db.GeocacheImageCollection.Remove(gim); } } } if (Core.Settings.Default.LiveAPIDeselectAfterUpdate) { gcList[0].Selected = false; } index++; if (!progress.Update("UpdatingGeocache", totalcount, index)) { break; } gcList.RemoveAt(0); } else { Core.ApplicationData.Instance.Logger.AddLog(new Import(), Core.Logger.Level.Error, resp.Status.StatusMessage); break; } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Import(), e); } }
public static void ExportToFile(string filename, List<Core.Data.Geocache> gcList) { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock fixscr = new Utils.ProgressBlock("ExportingiGeoKnife", "CreatingFile", 1, 0, true)) { System.Collections.Hashtable logTypes = new System.Collections.Hashtable(); logTypes.Add(2, "Found it"); logTypes.Add(3, "Didn't find it"); logTypes.Add(4, "Write note"); logTypes.Add(5, "Archive"); logTypes.Add(7, "Needs Archived"); logTypes.Add(9, "Will Attend"); logTypes.Add(10, "Attended"); logTypes.Add(11, "Webcam Photo Taken"); logTypes.Add(12, "Unarchive"); logTypes.Add(22, "Temporarily Disable Listing"); logTypes.Add(23, "Enable Listing"); logTypes.Add(24, "Publish Listing"); logTypes.Add(25, "Retract Listing"); logTypes.Add(45, "Needs Maintenance"); logTypes.Add(46, "Owner Maintenance"); logTypes.Add(47, "Update Coordinates"); logTypes.Add(68, "Post Reviewer Note"); logTypes.Add(74, "Announcement"); if (System.IO.File.Exists(filename)) { System.IO.File.Delete(filename); } Utils.ResourceHelper.SaveToFile("/iGeoKnife/sqlite.db3", filename, true); using (SqliteConnection dbcon = new SqliteConnection(string.Format("data source=file:{0}", filename))) { dbcon.Open(); DbParameter par; using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportingiGeoKnife", "SavingGeocaches", gcList.Count, 0, true)) { using (SqliteCommand cmd = new SqliteCommand("", dbcon)) using (SqliteCommand cmd2 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd3 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd4 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd5 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd6 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd7 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd8 = new SqliteCommand("", dbcon)) { cmd.CommandText = "drop index CachesSmart"; cmd.ExecuteNonQuery(); cmd.CommandText = "insert into Caches (Code, Name, PlacedBy, Archived, CacheId, CacheType, Container, Country, Difficulty, Found, HasCorrected, HasUserNote, Latitude, LongHtm, Longitude, OwnerName, PlacedDate, ShortHtm, State, Terrain, UserFlag, IsOwner, LatOriginal, LonOriginal, Status, GcNote, IsPremium, FavPoints) values (@Code, @Name, @PlacedBy, @Archived, @CacheId, @CacheType, @Container, @Country, @Difficulty, @Found, @HasCorrected, @HasUserNote, @Latitude, @LongHtm, @Longitude, @OwnerName, @PlacedDate, @ShortHtm, @State, @Terrain, @UserFlag, @IsOwner, @LatOriginal, @LonOriginal, @Status, @GcNote, @IsPremium, @FavPoints)"; cmd2.CommandText = "insert into CacheMemo (Code, LongDescription, ShortDescription, Url, Hints, UserNote) values (@Code, @LongDescription, @ShortDescription, @Url, @Hints, @UserNote)"; cmd3.CommandText = "insert into Attributes (aCode, aId, aInc) values (@aCode, @aId, @aInc)"; cmd4.CommandText = "insert into LogMemo (lParent, lLogId, lText) values (@lParent, @lLogId, @lText)"; cmd5.CommandText = "insert into Logs (lParent, lLogId, lType, lBy, lDate, lLat, lLon, lEncoded, lownerid, lHasHtml, lIsowner, lTime) values (@lParent, @lLogId, @lType, @lBy, @lDate, @lLat, @lLon, @lEncoded, @lownerid, @lHasHtml, @lIsowner, @lTime)"; cmd6.CommandText = "insert into WayMemo (cParent, cCode, cComment, cUrl) values (@cParent, @cCode, @cComment, @cUrl)"; cmd7.CommandText = "insert into Waypoints (cParent, cCode, cPrefix, cName, cType, cLat, cLon, cByuser, cDate, cFlag, sB1) values (@cParent, @cCode, @cPrefix, @cName, @cType, @cLat, @cLon, @cByuser, @cDate, @cFlag, @sB1)"; cmd8.CommandText = "insert into Corrected (kCode, kBeforeLat, kBeforeLon, kAfterLat, kAfterLon) values (@kCode, @kBeforeLat, @kBeforeLon, @kAfterLat, @kAfterLon)"; par = cmd8.CreateParameter(); par.ParameterName = "@kCode"; par.DbType = DbType.String; cmd8.Parameters.Add(par); par = cmd8.CreateParameter(); par.ParameterName = "@kBeforeLat"; par.DbType = DbType.String; cmd8.Parameters.Add(par); par = cmd8.CreateParameter(); par.ParameterName = "@kBeforeLon"; par.DbType = DbType.String; cmd8.Parameters.Add(par); par = cmd8.CreateParameter(); par.ParameterName = "@kAfterLat"; par.DbType = DbType.String; cmd8.Parameters.Add(par); par = cmd8.CreateParameter(); par.ParameterName = "@kAfterLon"; par.DbType = DbType.String; cmd8.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cParent"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cCode"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cPrefix"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cName"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cType"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cLat"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cLon"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cByuser"; par.DbType = DbType.Boolean; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cDate"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cFlag"; par.DbType = DbType.Boolean; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@sB1"; par.DbType = DbType.Boolean; cmd7.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cParent"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cCode"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cComment"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cUrl"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lParent"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lLogId"; par.DbType = DbType.Int32; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lType"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lBy"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lDate"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lLat"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lLon"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lEncoded"; par.DbType = DbType.Boolean; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lownerid"; par.DbType = DbType.Int32; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lHasHtml"; par.DbType = DbType.Boolean; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lIsowner"; par.DbType = DbType.Boolean; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lTime"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd4.CreateParameter(); par.ParameterName = "@lParent"; par.DbType = DbType.String; cmd4.Parameters.Add(par); par = cmd4.CreateParameter(); par.ParameterName = "@lLogId"; par.DbType = DbType.Int32; cmd4.Parameters.Add(par); par = cmd4.CreateParameter(); par.ParameterName = "@lText"; par.DbType = DbType.String; cmd4.Parameters.Add(par); par = cmd3.CreateParameter(); par.ParameterName = "@aCode"; par.DbType = DbType.String; cmd3.Parameters.Add(par); par = cmd3.CreateParameter(); par.ParameterName = "@aId"; par.DbType = DbType.Int32; cmd3.Parameters.Add(par); par = cmd3.CreateParameter(); par.ParameterName = "@aInc"; par.DbType = DbType.Int32; cmd3.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@Code"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@LongDescription"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@ShortDescription"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@Url"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@Hints"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@UserNote"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Code"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Name"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@PlacedBy"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Archived"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CacheId"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CacheType"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Container"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Country"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Difficulty"; par.DbType = DbType.Double; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Found"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@HasCorrected"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@HasUserNote"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Latitude"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@LongHtm"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Longitude"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@OwnerName"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@PlacedDate"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@ShortHtm"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@State"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Terrain"; par.DbType = DbType.Double; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@UserFlag"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@IsOwner"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@LatOriginal"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@LonOriginal"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Status"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@GcNote"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@IsPremium"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@FavPoints"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); cmd.Prepare(); cmd2.Prepare(); cmd3.Prepare(); cmd4.Prepare(); cmd5.Prepare(); cmd6.Prepare(); cmd7.Prepare(); cmd8.Prepare(); //using (DbTransaction trans = dbcon.BeginTransaction()) //{ int index = 0; foreach (Core.Data.Geocache gc in gcList) { string notes = ""; if (!string.IsNullOrEmpty(gc.Notes)) { notes = System.Web.HttpUtility.HtmlDecode(gc.Notes); } if (!string.IsNullOrEmpty(gc.PersonalNote)) { notes = string.Concat(notes, gc.PersonalNote); } cmd2.Parameters["@Code"].Value = gc.Code; cmd2.Parameters["@LongDescription"].Value = gc.LongDescription ?? ""; cmd2.Parameters["@ShortDescription"].Value = gc.ShortDescription ?? ""; cmd2.Parameters["@Url"].Value = gc.Url ?? ""; cmd2.Parameters["@Hints"].Value = gc.EncodedHints ?? ""; cmd2.Parameters["@UserNote"].Value = notes; cmd.Parameters["@Code"].Value = gc.Code; cmd.Parameters["@Name"].Value = gc.Name ?? ""; cmd.Parameters["@PlacedBy"].Value = gc.PlacedBy ?? ""; cmd.Parameters["@Archived"].Value = gc.Archived ? 1 : 0; cmd.Parameters["@CacheId"].Value = Utils.Conversion.GetCacheIDFromCacheCode(gc.Code).ToString(); cmd.Parameters["@CacheType"].Value = getCacheType(gc.GeocacheType); cmd.Parameters["@Container"].Value = getContainer(gc.Container); cmd.Parameters["@Country"].Value = gc.Country ?? ""; cmd.Parameters["@Difficulty"].Value = gc.Difficulty; cmd.Parameters["@Found"].Value = gc.Found ? 1 : 0; cmd.Parameters["@HasCorrected"].Value = gc.ContainsCustomLatLon ? 1 : 0; cmd.Parameters["@HasUserNote"].Value = gc.ContainsNote ? 1 : 0; cmd.Parameters["@LatOriginal"].Value = gc.Lat.ToString().Replace(',', '.'); cmd.Parameters["@LonOriginal"].Value = gc.Lon.ToString().Replace(',', '.'); if (gc.ContainsCustomLatLon) { cmd.Parameters["@Latitude"].Value = gc.CustomLat.ToString().Replace(',', '.'); cmd.Parameters["@Longitude"].Value = gc.CustomLon.ToString().Replace(',', '.'); } else { cmd.Parameters["@Latitude"].Value = gc.Lat.ToString().Replace(',', '.'); cmd.Parameters["@Longitude"].Value = gc.Lon.ToString().Replace(',', '.'); } cmd.Parameters["@LongHtm"].Value = gc.LongDescriptionInHtml ? 1 : 0; cmd.Parameters["@OwnerName"].Value = gc.Owner ?? ""; cmd.Parameters["@PlacedDate"].Value = gc.PublishedTime.ToString("yyyy-MM-dd"); cmd.Parameters["@ShortHtm"].Value = gc.ShortDescriptionInHtml ? 1 : 0; cmd.Parameters["@State"].Value = gc.State ?? ""; cmd.Parameters["@Terrain"].Value = gc.Terrain; cmd.Parameters["@UserFlag"].Value = gc.Flagged ? 1 : 0; cmd.Parameters["@IsOwner"].Value = gc.IsOwn ? 1 : 0; cmd.Parameters["@Status"].Value = gc.Available ? "A" : gc.Archived ? "X" : "T"; cmd.Parameters["@GcNote"].Value = notes; cmd.Parameters["@IsPremium"].Value = gc.MemberOnly ? 1 : 0; cmd.Parameters["@FavPoints"].Value = gc.Favorites; cmd.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); if (gc.ContainsCustomLatLon) { cmd8.Parameters["@kCode"].Value = gc.Code; cmd8.Parameters["@kBeforeLat"].Value = gc.Lat.ToString().Replace(',', '.'); cmd8.Parameters["@kBeforeLon"].Value = gc.Lon.ToString().Replace(',', '.'); cmd8.Parameters["@kAfterLat"].Value = gc.CustomLat.ToString().Replace(',', '.'); cmd8.Parameters["@kAfterLon"].Value = gc.CustomLon.ToString().Replace(',', '.'); cmd8.ExecuteNonQuery(); } List<int> attr = gc.AttributeIds; foreach (int att in attr) { cmd3.Parameters["@aCode"].Value = gc.Code; cmd3.Parameters["@aId"].Value = Math.Abs(att); cmd3.Parameters["@aInc"].Value = att < 0 ? 0 : 1; cmd3.ExecuteNonQuery(); } List<Core.Data.Log> logs = Utils.DataAccess.GetLogs(gc.Database, gc.Code).Take(Core.Settings.Default.IGeoKnifeMaxLogs).ToList(); foreach (Core.Data.Log l in logs) { try { int logid = 0; if (!int.TryParse(l.ID, out logid)) { logid = Utils.Conversion.GetCacheIDFromCacheCode(l.ID); } cmd4.Parameters["@lLogId"].Value = logid; cmd4.Parameters["@lText"].Value = l.Text ?? ""; cmd4.Parameters["@lParent"].Value = gc.Code; cmd4.ExecuteNonQuery(); cmd5.Parameters["@lLogId"].Value = logid; cmd5.Parameters["@lParent"].Value = gc.Code; object o = logTypes[l.LogType.ID]; if (o == null) { cmd5.Parameters["@lType"].Value = 4; } else { cmd5.Parameters["@lType"].Value = (string)o; } cmd5.Parameters["@lBy"].Value = l.Finder ?? ""; cmd5.Parameters["@lDate"].Value = l.Date.ToString("yyyy-MM-dd HH:mm:ss"); cmd5.Parameters["@lLat"].Value = DBNull.Value; cmd5.Parameters["@lLon"].Value = DBNull.Value; cmd5.Parameters["@lEncoded"].Value = l.Encoded; try { cmd5.Parameters["@lownerid"].Value = int.Parse(l.FinderId); } catch { } cmd5.Parameters["@lHasHtml"].Value = false; cmd5.Parameters["@lIsowner"].Value = gc.IsOwn; cmd5.Parameters["@lTime"].Value = ""; cmd5.ExecuteNonQuery(); } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Export(), e); } } List<Core.Data.Waypoint> wps = Utils.DataAccess.GetWaypointsFromGeocache(gc.Database, gc.Code); foreach (Core.Data.Waypoint w in wps) { try { cmd6.Parameters["@cParent"].Value = gc.Code; cmd6.Parameters["@cCode"].Value = w.Code; cmd6.Parameters["@cComment"].Value = w.Comment; cmd6.Parameters["@cUrl"].Value = w.Url; cmd7.Parameters["@cParent"].Value = gc.Code; cmd7.Parameters["@cCode"].Value = w.Code; cmd7.Parameters["@cPrefix"].Value = w.Code.Substring(0, 2); cmd7.Parameters["@cName"].Value = w.Name ?? ""; cmd7.Parameters["@cType"].Value = getWPType(w.WPType); cmd7.Parameters["@cLat"].Value = w.Lat == null ? "0.0" : w.Lat.ToString().Replace(',', '.'); cmd7.Parameters["@cLon"].Value = w.Lon == null ? "0.0" : w.Lon.ToString().Replace(',', '.'); cmd7.Parameters["@cByuser"].Value = false; cmd7.Parameters["@cDate"].Value = w.Time.ToString("yyyy-MM-dd"); cmd7.Parameters["@cFlag"].Value = false; cmd7.Parameters["@sB1"].Value = false; cmd7.ExecuteNonQuery(); cmd6.ExecuteNonQuery(); } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Export(), e); } } index++; if (DateTime.Now>=nextUpdate) { if (!progress.Update("SavingGeocaches", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } //trans.Commit(); } } } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Export(), e); } }
protected override void PerformExport(object settings) { var gpxSetting = settings as ExportGPXSettings; if (gpxSetting != null && !string.IsNullOrEmpty(gpxSetting.FileName)) { bool canceled = false; try { using (var db = new NPoco.Database(this.DatabaseConnection.Connection, NPoco.DatabaseType.SQLite)) { double minLat = 0, minLon = 0, maxLat = 0, maxLon = 0; var dr = DatabaseConnection.ExecuteReader(string.Format("select Min(Latitude), Max(Latitude), Min(Longitude), Max(Longitude) from Caches inner join {0} on Caches.Code={0}.gccode", ActionInputTableName)); if (dr.Read()) { minLat = Utils.Conversion.StringToDouble(dr.GetString(0)); maxLat = Utils.Conversion.StringToDouble(dr.GetString(1)); minLon = Utils.Conversion.StringToDouble(dr.GetString(2)); maxLon = Utils.Conversion.StringToDouble(dr.GetString(3)); } dr.Close(); var gcList = db.Fetch<string>(string.Format("select gccode from {0}", ActionInputTableName)); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportingGPX", "CreatingFile", gcList.Count, 0, true)) { using (System.IO.TemporaryFile gpxFile = new System.IO.TemporaryFile(false)) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter(gpxFile.Path, false, Encoding.UTF8)) { Utils.GPXGenerator gpxGenerator = new Utils.GPXGenerator( db , gcList , gpxSetting.Version , minLat , maxLat , minLon , maxLon ); DateTime nextUpdate = DateTime.Now.AddSeconds(1); //generate header sw.Write(gpxGenerator.Start()); //preserve mem and do for each cache the export for (int i = 0; i < gpxGenerator.Count; i++) { //write parent sw.WriteLine(gpxGenerator.Next()); if (gpxSetting.AddChildWaypoints) { //write child waypoints string s = gpxGenerator.WaypointData(); if (!string.IsNullOrEmpty(s)) { sw.WriteLine(s); } } if (DateTime.Now >= nextUpdate) { if (!progress.Update("CreatingFile", gpxGenerator.Count, i + 1)) { canceled = true; break; } nextUpdate = DateTime.Now.AddSeconds(1); } } //finalize sw.Write(gpxGenerator.Finish()); } if (!canceled) { if (gpxSetting.FileName.ToLower().EndsWith(".zip")) { using (FileStream zipToOpen = new FileStream(gpxSetting.FileName, FileMode.Create)) { using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create)) { ZipArchiveEntry gpxEntry = archive.CreateEntry("geocaches.gpx"); using (StreamWriter writer = new StreamWriter(gpxEntry.Open())) { writer.Write(File.ReadAllText(gpxFile.Path)); } } } } else { System.IO.File.Copy(gpxFile.Path, gpxSetting.FileName, true); } } } } } } catch { } } }
public async Task ExportToGDAK(List<Core.Data.Geocache> gcList, string targetFolder, int maxLogCount, bool offlineImages, int maxInImgFolder) { string filename = Path.Combine(targetFolder, "sqlite.db3"); await Task.Run(() => { try { DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock fixscr = new Utils.ProgressBlock("ExportingGDAK", "CreatingFile", 1, 0, true)) { System.Collections.Hashtable logTypes = new System.Collections.Hashtable(); logTypes.Add(2, "Found it"); logTypes.Add(3, "Didn't find it"); logTypes.Add(4, "Write note"); logTypes.Add(5, "Archive"); logTypes.Add(7, "Needs Archived"); logTypes.Add(9, "Will Attend"); logTypes.Add(10, "Attended"); logTypes.Add(11, "Webcam Photo Taken"); logTypes.Add(12, "Unarchive"); logTypes.Add(22, "Temporarily Disable Listing"); logTypes.Add(23, "Enable Listing"); logTypes.Add(24, "Publish Listing"); logTypes.Add(25, "Retract Listing"); logTypes.Add(45, "Needs Maintenance"); logTypes.Add(46, "Owner Maintenance"); logTypes.Add(47, "Update Coordinates"); logTypes.Add(68, "Post Reviewer Note"); logTypes.Add(74, "Announcement"); if (System.IO.File.Exists(filename)) { System.IO.File.Delete(filename); } SqliteConnection dbconFiles = null; string basePath = null; int imgFolderIndex = 0; int imgInFolderCount = 0; if (Core.Settings.Default.GDAKExportOfflineImages) { basePath = System.IO.Path.Combine(targetFolder, "GrabbedImages"); if (!System.IO.Directory.Exists(basePath)) { System.IO.Directory.CreateDirectory(basePath); } if (Core.Settings.Default.GDAKMaxImagesInFolder > 0) { string imgSubFolder = System.IO.Path.Combine(basePath, string.Format("batch{0}", imgFolderIndex)); while (System.IO.Directory.Exists(imgSubFolder)) { imgFolderIndex++; imgSubFolder = System.IO.Path.Combine(basePath, string.Format("batch{0}", imgFolderIndex)); } } dbconFiles = new SqliteConnection(string.Format("data source=file:{0}", System.IO.Path.Combine(basePath, "files.db3"))); dbconFiles.Open(); using (SqliteCommand cmd = new SqliteCommand("", dbconFiles)) { cmd.CommandText = "SELECT name FROM sqlite_master WHERE type='table' AND name='fdone'"; object o = cmd.ExecuteScalar(); if (o == null || o.GetType() == typeof(DBNull)) { cmd.CommandText = "CREATE TABLE fdone (dlink text)"; cmd.ExecuteNonQuery(); cmd.CommandText = "CREATE INDEX ifdone on fdone (dlink)"; cmd.ExecuteNonQuery(); } cmd.CommandText = "SELECT name FROM sqlite_master WHERE type='table' AND name='files'"; o = cmd.ExecuteScalar(); if (o == null || o.GetType() == typeof(DBNull)) { cmd.CommandText = "CREATE TABLE files (Link text collate nocase, Fname text collate nocase, Found integer)"; cmd.ExecuteNonQuery(); cmd.CommandText = "CREATE INDEX ilink on files (Link)"; cmd.ExecuteNonQuery(); cmd.CommandText = "CREATE INDEX ifname on files (Fname)"; cmd.ExecuteNonQuery(); } cmd.CommandText = "SELECT name FROM sqlite_master WHERE type='table' AND name='purge'"; o = cmd.ExecuteScalar(); if (o == null || o.GetType() == typeof(DBNull)) { cmd.CommandText = "CREATE TABLE purge (pfile text)"; cmd.ExecuteNonQuery(); } } } using (SqliteConnection dbcon = new SqliteConnection(string.Format("data source=file:{0}", filename))) { dbcon.Open(); using (SqliteCommand cmd = new SqliteCommand("", dbcon)) { foreach (string s in SQLCREATEDBTABLES) { cmd.CommandText = s; cmd.ExecuteNonQuery(); } foreach (string s in SQLCREATEDBINDEXES) { cmd.CommandText = s; cmd.ExecuteNonQuery(); } foreach (string s in SQLCREATEDBTRIGGERS) { cmd.CommandText = s; cmd.ExecuteNonQuery(); } cmd.CommandText = "PRAGMA user_version = 5003"; cmd.ExecuteNonQuery(); } DbParameter par; using (Utils.ProgressBlock progress = new Utils.ProgressBlock("SavingGeocaches", gcList.Count, 0)) { using (SqliteCommand cmd = new SqliteCommand("", dbcon)) using (SqliteCommand cmd2 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd3 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd4 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd5 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd6 = new SqliteCommand("", dbcon)) using (SqliteCommand cmd7 = new SqliteCommand("", dbcon)) { cmd.CommandText = "insert into Caches (Code, Name, PlacedBy, Archived, CacheId, CacheType, Container, Country, Difficulty, Found, HasCorrected, HasUserNote, Latitude, LongHtm, Longitude, OwnerName, PlacedDate, ShortHtm, State, Terrain, UserFlag, IsOwner, LatOriginal, LonOriginal, Status, GcNote, IsPremium, FavPoints, IsLite) values (@Code, @Name, @PlacedBy, @Archived, @CacheId, @CacheType, @Container, @Country, @Difficulty, @Found, @HasCorrected, @HasUserNote, @Latitude, @LongHtm, @Longitude, @OwnerName, @PlacedDate, @ShortHtm, @State, @Terrain, @UserFlag, @IsOwner, @LatOriginal, @LonOriginal, @Status, @GcNote, @IsPremium, @FavPoints, @IsLite)"; cmd2.CommandText = "insert into CacheMemo (Code, LongDescription, ShortDescription, Url, Hints, UserNote) values (@Code, @LongDescription, @ShortDescription, @Url, @Hints, @UserNote)"; cmd3.CommandText = "insert into Attributes (aCode, aId, aInc) values (@aCode, @aId, @aInc)"; cmd4.CommandText = "insert into LogMemo (lParent, lLogId, lText) values (@lParent, @lLogId, @lText)"; cmd5.CommandText = "insert into Logs (lParent, lLogId, lType, lBy, lDate, lLat, lLon, lEncoded, lownerid, lHasHtml, lIsowner, lTime) values (@lParent, @lLogId, @lType, @lBy, @lDate, @lLat, @lLon, @lEncoded, @lownerid, @lHasHtml, @lIsowner, @lTime)"; cmd6.CommandText = "insert into WayMemo (cParent, cCode, cComment, cUrl) values (@cParent, @cCode, @cComment, @cUrl)"; cmd7.CommandText = "insert into Waypoints (cParent, cCode, cPrefix, cName, cType, cLat, cLon, cByuser, cDate, cFlag, sB1) values (@cParent, @cCode, @cPrefix, @cName, @cType, @cLat, @cLon, @cByuser, @cDate, @cFlag, @sB1)"; par = cmd7.CreateParameter(); par.ParameterName = "@cParent"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cCode"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cPrefix"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cName"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cType"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cLat"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cLon"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cByuser"; par.DbType = DbType.Boolean; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cDate"; par.DbType = DbType.String; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@cFlag"; par.DbType = DbType.Boolean; cmd7.Parameters.Add(par); par = cmd7.CreateParameter(); par.ParameterName = "@sB1"; par.DbType = DbType.Boolean; cmd7.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cParent"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cCode"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cComment"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd6.CreateParameter(); par.ParameterName = "@cUrl"; par.DbType = DbType.String; cmd6.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lParent"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lLogId"; par.DbType = DbType.Int32; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lType"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lBy"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lDate"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lLat"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lLon"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lEncoded"; par.DbType = DbType.Boolean; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lownerid"; par.DbType = DbType.Int32; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lHasHtml"; par.DbType = DbType.Boolean; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lIsowner"; par.DbType = DbType.Boolean; cmd5.Parameters.Add(par); par = cmd5.CreateParameter(); par.ParameterName = "@lTime"; par.DbType = DbType.String; cmd5.Parameters.Add(par); par = cmd4.CreateParameter(); par.ParameterName = "@lParent"; par.DbType = DbType.String; cmd4.Parameters.Add(par); par = cmd4.CreateParameter(); par.ParameterName = "@lLogId"; par.DbType = DbType.Int32; cmd4.Parameters.Add(par); par = cmd4.CreateParameter(); par.ParameterName = "@lText"; par.DbType = DbType.String; cmd4.Parameters.Add(par); par = cmd3.CreateParameter(); par.ParameterName = "@aCode"; par.DbType = DbType.String; cmd3.Parameters.Add(par); par = cmd3.CreateParameter(); par.ParameterName = "@aId"; par.DbType = DbType.Int32; cmd3.Parameters.Add(par); par = cmd3.CreateParameter(); par.ParameterName = "@aInc"; par.DbType = DbType.Int32; cmd3.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@Code"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@LongDescription"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@ShortDescription"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@Url"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@Hints"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd2.CreateParameter(); par.ParameterName = "@UserNote"; par.DbType = DbType.String; cmd2.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Code"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Name"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@PlacedBy"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Archived"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CacheId"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CacheType"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Container"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Country"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Difficulty"; par.DbType = DbType.Double; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Found"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@HasCorrected"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@HasUserNote"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Latitude"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@LongHtm"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Longitude"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@OwnerName"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@PlacedDate"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@ShortHtm"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@State"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Terrain"; par.DbType = DbType.Double; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@UserFlag"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@IsOwner"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@LatOriginal"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@LonOriginal"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Status"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@GcNote"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@IsPremium"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@FavPoints"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@IsLite"; par.DbType = DbType.Int32; cmd.Parameters.Add(par); cmd.Prepare(); cmd2.Prepare(); cmd3.Prepare(); cmd4.Prepare(); cmd5.Prepare(); cmd6.Prepare(); cmd7.Prepare(); //using (DbTransaction trans = dbcon.BeginTransaction()) { int index = 0; foreach (Core.Data.Geocache gc in gcList) { cmd2.Parameters["@Code"].Value = gc.Code; cmd2.Parameters["@LongDescription"].Value = gc.LongDescription ?? ""; cmd2.Parameters["@ShortDescription"].Value = gc.ShortDescription ?? ""; cmd2.Parameters["@Url"].Value = gc.Url ?? ""; cmd2.Parameters["@Hints"].Value = gc.EncodedHints ?? ""; cmd2.Parameters["@UserNote"].Value = string.IsNullOrEmpty(gc.Notes) ? "" : System.Web.HttpUtility.HtmlDecode(gc.Notes); cmd.Parameters["@Code"].Value = gc.Code; cmd.Parameters["@Name"].Value = gc.Name ?? ""; cmd.Parameters["@PlacedBy"].Value = gc.PlacedBy ?? ""; cmd.Parameters["@Archived"].Value = gc.Archived ? 1 : 0; cmd.Parameters["@CacheId"].Value = Utils.Conversion.GetCacheIDFromCacheCode(gc.Code); cmd.Parameters["@CacheType"].Value = getCacheType(gc.GeocacheType); cmd.Parameters["@Container"].Value = getContainer(gc.Container); cmd.Parameters["@Country"].Value = gc.Country ?? ""; cmd.Parameters["@Difficulty"].Value = gc.Difficulty; cmd.Parameters["@Found"].Value = gc.Found ? 1 : 0; cmd.Parameters["@HasCorrected"].Value = gc.ContainsCustomLatLon ? 1 : 0; cmd.Parameters["@HasUserNote"].Value = gc.ContainsNote ? 1 : 0; cmd.Parameters["@LatOriginal"].Value = gc.Lat.ToString().Replace(',', '.'); cmd.Parameters["@LonOriginal"].Value = gc.Lon.ToString().Replace(',', '.'); if (gc.ContainsCustomLatLon) { cmd.Parameters["@Latitude"].Value = gc.CustomLat.ToString().Replace(',', '.'); cmd.Parameters["@Longitude"].Value = gc.CustomLon.ToString().Replace(',', '.'); } else { cmd.Parameters["@Latitude"].Value = gc.Lat.ToString().Replace(',', '.'); cmd.Parameters["@Longitude"].Value = gc.Lon.ToString().Replace(',', '.'); } cmd.Parameters["@LongHtm"].Value = gc.LongDescriptionInHtml ? 1 : 0; cmd.Parameters["@OwnerName"].Value = gc.Owner ?? ""; cmd.Parameters["@PlacedDate"].Value = gc.PublishedTime.ToString("yyyy-MM-dd"); cmd.Parameters["@ShortHtm"].Value = gc.ShortDescriptionInHtml ? 1 : 0; cmd.Parameters["@State"].Value = gc.State ?? ""; cmd.Parameters["@Terrain"].Value = gc.Terrain; cmd.Parameters["@UserFlag"].Value = gc.Flagged ? 1 : 0; cmd.Parameters["@IsOwner"].Value = gc.IsOwn ? 1 : 0; cmd.Parameters["@Status"].Value = gc.Available ? "A" : gc.Archived ? "X" : "T"; cmd.Parameters["@GcNote"].Value = gc.PersonalNote ?? ""; cmd.Parameters["@IsPremium"].Value = gc.MemberOnly ? 1 : 0; cmd.Parameters["@FavPoints"].Value = gc.Favorites; cmd.Parameters["@IsLite"].Value = 0; cmd.ExecuteNonQuery(); //if (index == 256) System.Diagnostics.Debugger.Break(); cmd2.ExecuteNonQuery(); List<int> attr = gc.AttributeIds; foreach (int att in attr) { cmd3.Parameters["@aCode"].Value = gc.Code; cmd3.Parameters["@aId"].Value = Math.Abs(att); cmd3.Parameters["@aInc"].Value = att < 0 ? 0 : 1; cmd3.ExecuteNonQuery(); } List<Core.Data.Log> logs = Utils.DataAccess.GetLogs(gc.Database, gc.Code).Take(Core.Settings.Default.GDAKMaxLogCount).ToList(); foreach (Core.Data.Log l in logs) { try { int logid = 0; if (!int.TryParse(l.ID, out logid)) { logid = Utils.Conversion.GetCacheIDFromCacheCode(l.ID); } cmd4.Parameters["@lLogId"].Value = logid; cmd4.Parameters["@lText"].Value = l.Text ?? ""; cmd4.Parameters["@lParent"].Value = gc.Code; cmd4.ExecuteNonQuery(); cmd5.Parameters["@lLogId"].Value = logid; cmd5.Parameters["@lParent"].Value = gc.Code; object o = logTypes[l.LogType.ID]; if (o == null) { cmd5.Parameters["@lType"].Value = 4; } else { cmd5.Parameters["@lType"].Value = (string)o; } cmd5.Parameters["@lBy"].Value = l.Finder ?? ""; cmd5.Parameters["@lDate"].Value = l.Date.ToString("yyyy-MM-dd HH:mm:ss"); cmd5.Parameters["@lLat"].Value = DBNull.Value; cmd5.Parameters["@lLon"].Value = DBNull.Value; cmd5.Parameters["@lEncoded"].Value = l.Encoded; try { cmd5.Parameters["@lownerid"].Value = int.Parse(l.FinderId); } catch { } cmd5.Parameters["@lHasHtml"].Value = false; cmd5.Parameters["@lIsowner"].Value = (l.Finder == Core.ApplicationData.Instance.AccountInfos.GetAccountInfo(gc.Code.Substring(0,2)).AccountName); cmd5.Parameters["@lTime"].Value = ""; cmd5.ExecuteNonQuery(); } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } List<Core.Data.Waypoint> wps = Utils.DataAccess.GetWaypointsFromGeocache(gc.Database, gc.Code); foreach (Core.Data.Waypoint w in wps) { try { cmd6.Parameters["@cParent"].Value = gc.Code; cmd6.Parameters["@cCode"].Value = w.Code; cmd6.Parameters["@cComment"].Value = w.Comment; cmd6.Parameters["@cUrl"].Value = w.Url; cmd7.Parameters["@cParent"].Value = gc.Code; cmd7.Parameters["@cCode"].Value = w.Code; cmd7.Parameters["@cPrefix"].Value = w.Code.Substring(0, 2); cmd7.Parameters["@cName"].Value = w.Name ?? ""; cmd7.Parameters["@cType"].Value = getWPType(w.WPType); cmd7.Parameters["@cLat"].Value = w.Lat == null ? "0.0" : w.Lat.ToString().Replace(',', '.'); cmd7.Parameters["@cLon"].Value = w.Lon == null ? "0.0" : w.Lon.ToString().Replace(',', '.'); cmd7.Parameters["@cByuser"].Value = false; cmd7.Parameters["@cDate"].Value = w.Time.ToString("yyyy-MM-dd"); cmd7.Parameters["@cFlag"].Value = false; cmd7.Parameters["@sB1"].Value = false; cmd7.ExecuteNonQuery(); cmd6.ExecuteNonQuery(); } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } if (dbconFiles != null && (gc.LongDescriptionInHtml || gc.ShortDescriptionInHtml)) { try { List<string> imgs = Utils.DataAccess.GetImagesOfGeocache(gc.Database, gc.Code); Dictionary<string, string> oimgs = ImageGrabber.OfflineImagesManager.Instance.GetImages(gc); foreach (string im in imgs) { if (oimgs.ContainsKey(im)) { string p = oimgs[im]; using (SqliteCommand filescmd = new SqliteCommand("", dbconFiles)) { filescmd.CommandText = string.Format("SELECT Fname FROM files WHERE Link='{0}'", im.Replace("'", "''")); object o = filescmd.ExecuteScalar(); if (o == null || o.GetType() == typeof(DBNull)) { filescmd.CommandText = string.Format("insert into files (Link, Fname, Found) values ('{0}', '{1}', 1)", im.Replace("'", "''"), System.IO.Path.GetFileName(p).Replace("'", "''")); filescmd.ExecuteNonQuery(); } } if (Core.Settings.Default.GDAKMaxImagesInFolder > 0) { imgInFolderCount++; if (imgInFolderCount > Core.Settings.Default.GDAKMaxImagesInFolder) { imgFolderIndex++; imgInFolderCount = 1; } string imgSubFolder = System.IO.Path.Combine(basePath, string.Format("batch{0}", imgFolderIndex)); if (imgInFolderCount == 1) { if (!System.IO.Directory.Exists(imgSubFolder)) { System.IO.Directory.CreateDirectory(imgSubFolder); } } string dst = System.IO.Path.Combine(imgSubFolder, System.IO.Path.GetFileName(p)); if (!System.IO.File.Exists(dst)) { System.IO.File.Copy(p, dst, true); } } else { string dst = System.IO.Path.Combine(basePath, System.IO.Path.GetFileName(p)); if (!System.IO.File.Exists(dst)) { System.IO.File.Copy(p, dst, true); } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } index++; if (DateTime.Now>=nextUpdate) { if (!progress.Update("SavingGeocaches", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } //trans.Commit(); } } } } if (dbconFiles != null) { dbconFiles.Dispose(); dbconFiles = null; } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); }
private static bool Import(Database database, string filename) { try { using (Utils.ProgressBlock allprog = new ProgressBlock("ImportGSAKDatabase", "Importing", 6, 0)) { System.Collections.Hashtable logTypes = new System.Collections.Hashtable(); String connect = String.Format("data source=file:{0}", filename); using (SqliteConnection dbcon = new SqliteConnection(connect)) { //System.Diagnostics.Debugger.Break(); logTypes.Add("Found it", 2); logTypes.Add("Didn't find it", 3); logTypes.Add("Write note", 4); logTypes.Add("Archive", 5); logTypes.Add("Needs Archived", 7); logTypes.Add("Will Attend", 9); logTypes.Add("Attended", 10); logTypes.Add("Webcam Photo Taken", 11); logTypes.Add("Unarchive", 12); logTypes.Add("Temporarily Disable Listing", 22); logTypes.Add("Temporarily Disable", 22); logTypes.Add("Enable Listing", 23); logTypes.Add("Enable", 23); logTypes.Add("Publish Listing", 24); logTypes.Add("Publish", 24); logTypes.Add("Retract Listing", 25); logTypes.Add("Retract", 25); logTypes.Add("Needs Maintenance", 45); logTypes.Add("Owner Maintenance", 46); logTypes.Add("Update Coordinates", 47); logTypes.Add("Post Reviewer Note", 68); logTypes.Add("Announcement", 74); dbcon.Open(); SqliteCommand lookup = new SqliteCommand("select aId, aInc from attributes where aCode = @Code", dbcon); lookup.CommandType = CommandType.Text; DbParameter par = lookup.CreateParameter(); par.Direction = ParameterDirection.Input; par.ParameterName = "@Code"; lookup.Parameters.Add(par); lookup.Prepare(); SqliteCommand import = new SqliteCommand("select count(1) from caches", dbcon); import.CommandType = CommandType.Text; int index = 0; int gcCount = (int)(long)import.ExecuteScalar(); if (gcCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new ProgressBlock("ImportingGeocaches", 1, 0)) { bool isPremiumAvailable = false; bool isFavPointAvailable = false; bool isGCNoteAvailable = false; try { import.CommandText = "select IsPremium from Caches limit 1"; using (SqliteDataReader checkdr = import.ExecuteReader()) { isPremiumAvailable = true; } } catch { } try { import.CommandText = "select FavPoints from Caches limit 1"; using (SqliteDataReader checkdr = import.ExecuteReader()) { isFavPointAvailable = true; } } catch { } try { import.CommandText = "select gcnote from Caches limit 1"; using (SqliteDataReader checkdr = import.ExecuteReader()) { isGCNoteAvailable = true; } } catch { } import.CommandText = "select caches.Code, Name, LastGPXDate, PlacedDate, Latitude, Longitude, Status, " + "Archived, Country, State, County, CacheType, PlacedBy, OwnerName, OwnerId, Container, Terrain, Difficulty, ShortHTM" + ", LongHTM, " + string.Format("{0}", isPremiumAvailable ? "IsPremium, " : "") + " HasCorrected, LatOriginal, LonOriginal, UserFlag, Found, " + string.Format("{0}", isFavPointAvailable ? "FavPoints, " : "") + " ShortDescription, LongDescription, Hints, Url, UserNote" + string.Format("{0}", isGCNoteAvailable ? ", gcnote" : "") + " from caches" + " inner join cachememo on cachememo.code = caches.code"; SqliteDataReader dr = import.ExecuteReader(); while (dr.Read()) { GeocacheData gc = new GeocacheData(); int cacheType; try { cacheType = getCacheType(((String)dr["CacheType"])[0]); } catch (ArgumentOutOfRangeException) { continue; } int container = getContainer(((String)dr["Container"])[0]); gc.Code = (string)dr["code"]; gc.Name = (string)dr["name"]; if (string.IsNullOrEmpty((string)dr["LastGPXDate"])) { gc.DataFromDate = DateTime.Now.Date; } else { gc.DataFromDate = DateTime.Parse((string)dr["LastGPXDate"]); } gc.Available = ((String)dr["Status"]).Equals("A"); gc.Archived = (int)dr["archived"] != 0; gc.Country = (string)dr["country"]; gc.State = (string)dr["state"]; gc.Municipality = (string)dr["county"]; gc.GeocacheType = Utils.DataAccess.GetGeocacheType(cacheType); gc.PlacedBy = (string)dr["placedby"]; gc.Owner = (string)dr["OwnerName"]; gc.OwnerId = dr["ownerid"].GetType() == typeof(DBNull) ? "" : dr["ownerid"].ToString(); gc.Container = Utils.DataAccess.GetGeocacheContainer(container); gc.Terrain = (double)dr["terrain"]; gc.Difficulty = (double)dr["difficulty"]; gc.ShortDescription = (string)dr["ShortDescription"]; gc.ShortDescriptionInHtml = (int)dr["ShortHTM"] != 0; gc.LongDescription = (string)dr["LongDescription"]; gc.LongDescriptionInHtml = (int)dr["LongHTM"] != 0; gc.EncodedHints = (string)dr["Hints"]; gc.Url = (string)dr["url"]; if (isPremiumAvailable) { gc.MemberOnly = (int)dr["IsPremium"] != 0; } else { gc.MemberOnly = false; } bool customCoords = (int)dr["HasCorrected"] != 0; if (customCoords) { gc.CustomLat = Utils.Conversion.StringToDouble(dr["Latitude"] as String); gc.CustomLon = Utils.Conversion.StringToDouble(dr["Longitude"] as String); gc.Lat = Utils.Conversion.StringToDouble(dr["LatOriginal"] as string); gc.Lon = Utils.Conversion.StringToDouble(dr["LonOriginal"] as string); } else { gc.Lat = Utils.Conversion.StringToDouble(dr["Latitude"] as string); gc.Lon = Utils.Conversion.StringToDouble(dr["Longitude"] as string); } par.Value = gc.Code; DbDataReader attrs = lookup.ExecuteReader(); List <int> attrList = new List <int>(); while (attrs.Read()) { int attr = (int)(int)attrs["aId"]; if (attrs["aInc"].ToString() == "0") { attr *= -1; } attrList.Add(attr); } attrs.Close(); gc.AttributeIds = attrList; gc.Notes = (string)dr["UserNote"]; gc.PublishedTime = DateTime.Parse((string)dr["PlacedDate"]); if (isGCNoteAvailable) { gc.PersonalNote = (string)dr["gcnote"]; } else { gc.PersonalNote = ""; } gc.Flagged = (int)dr["UserFlag"] != 0; gc.Found = (int)dr["Found"] != 0; if (isFavPointAvailable) { gc.Favorites = (int)(int)dr["FavPoints"]; } else { gc.Favorites = 0; } DataAccess.AddGeocache(database, gc); index++; if (DateTime.Now >= progShow) { prog.Update("ImportingGeocaches", gcCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 1); import.CommandText = "select count(1) from logs"; int logCount = (int)(long)import.ExecuteScalar(); if (logCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingLogs", logCount, 0)) { index = 0; import.CommandText = "select l.lLogId, l.lParent, lDate, lTime, lBy, lownerid, lEncoded, lType, lText " + " from logs l" + " inner join logmemo m on m.lLogId = l.lLogId and m.lParent = l.lParent"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { Core.Data.LogData lg = new Core.Data.LogData(); String type = (String)dr["lType"]; int logType = (int)logTypes[type]; //id text, gccode text, tbcode text, date text, finder text, finderid text, logtext text, encoded integer, datafromdate text, logtype integer lg.ID = dr["lLogiD"].ToString(); lg.GeocacheCode = (string)dr["lParent"]; lg.TBCode = ""; lg.Date = (DateTime)dr["lDate"]; lg.Finder = (string)dr["lBy"]; lg.FinderId = dr["lownerid"].ToString(); lg.Text = (string)dr["lText"]; lg.Encoded = (long)dr["lEncoded"] != 0; lg.DataFromDate = DateTime.Now; lg.LogType = Utils.DataAccess.GetLogType(logType); DataAccess.AddLog(database, lg); index++; if (DateTime.Now >= progShow) { progress.Update("ImportingLogs", logCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 2); import.CommandText = "select count(1) from logimages"; int logimgCount = 0; try { logimgCount = (int)(long)import.ExecuteScalar(); } catch { //table does not exists } if (logimgCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingLogImages", logimgCount, 0)) { index = 0; import.CommandText = "select iCode, iLogId, iImage, iName from logimages"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { Core.Data.LogImageData lg = new Core.Data.LogImageData(); lg.ID = (string)dr["iCode"]; lg.LogId = dr["iLogID"].ToString(); lg.Url = (string)dr["iImage"]; lg.Name = (string)dr["iName"]; DataAccess.AddLogImage(database, lg); index++; if (DateTime.Now >= progShow) { progress.Update("ImportingLogImages", logimgCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 3); //id text, code text, geocachecode text, name text, datafromdate text, comment text, description text, url text, urlname text, wptype integer, lat real, lon real, time text import.CommandText = "select count(1) from waypoints"; int wptCount = (int)(long)import.ExecuteScalar(); if (wptCount > 0) { DateTime progShow = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingWaypoints", wptCount, 0)) { index = 0; import.CommandText = "select w.cParent, w.cCode, cName, cDate, cType, cLat, cLon," + " cComment, cUrl" + " from waypoints w" + " inner join wayMemo m on w.cParent = m.cParent and w.cCode=m.cCode"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { Core.Data.WaypointData wp = new Core.Data.WaypointData(); int wpType = getWPType(((string)dr["cType"])[0]); wp.ID = (string)dr["cCode"]; wp.Code = (string)dr["cCode"]; wp.Url = (string)dr["cUrl"]; //wp.UrlName = (string)dr["urlname"]; wp.Name = (string)dr["cName"]; wp.DataFromDate = (DateTime)dr["cDate"]; wp.Comment = (string)dr["cComment"]; wp.GeocacheCode = (string)dr["cParent"]; //wp.Description = (string)dr["description"]; wp.WPType = Utils.DataAccess.GetWaypointType(wpType); double lat = Utils.Conversion.StringToDouble(dr["clat"] as string); double lon = Utils.Conversion.StringToDouble(dr["clon"] as string); if (Math.Abs(lat) < 0.00001) { wp.Lat = null; } else { wp.Lat = lat; } if (Math.Abs(lon) < 0.00001) { wp.Lon = null; } else { wp.Lon = lon; } wp.Time = (DateTime)dr["cDate"]; wp.Description = wp.WPType.Name; wp.UrlName = wp.WPType.Name; DataAccess.AddWaypoint(database, wp); index++; if (DateTime.Now >= progShow) { progress.Update("ImportingWaypoints", wptCount, index); progShow = DateTime.Now.AddSeconds(1); } } dr.Close(); } } allprog.Update("Importing", 5, 4); try { //import corrected if table exists import.CommandText = "select kCode, kAfterLat, kAfterLon from Corrected"; DbDataReader dr = import.ExecuteReader(); while (dr.Read()) { string gcCode = dr["kCode"] as string ?? ""; Core.Data.Geocache gc = database.GeocacheCollection.GetGeocache(gcCode); if (gc != null) { object oLat = dr["kAfterLat"]; object oLon = dr["kAfterLon"]; if (oLat != null && oLat.GetType() != typeof(DBNull) && oLon != null && oLon.GetType() != typeof(DBNull)) { string sLat = oLat as string; string sLon = oLon as string; if (sLat.Length > 0 && sLon.Length > 0) { gc.CustomLat = Utils.Conversion.StringToDouble(sLat); gc.CustomLon = Utils.Conversion.StringToDouble(sLon); } } } } } catch { } allprog.Update("Importing", 5, 5); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(new Importer(), e); } return(true); }
public async Task AssignRegion() { if (Core.ApplicationData.Instance.ActiveDatabase!=null) { List<Core.Data.Geocache> gcList = new List<Core.Data.Geocache>(); using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(() => { try { switch (SelectedAreaLevel) { case Core.Data.AreaType.Country: gcList = (from g in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where (!UnassignedOnly || string.IsNullOrEmpty(g.Country)) && (g.Selected || !SelectedOnly) select g).ToList(); break; case Core.Data.AreaType.State: gcList = (from g in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where (!UnassignedOnly || string.IsNullOrEmpty(g.State)) && (g.Selected || !SelectedOnly) select g).ToList(); break; case Core.Data.AreaType.Municipality: gcList = (from g in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where (!UnassignedOnly || string.IsNullOrEmpty(g.Municipality)) && (g.Selected || !SelectedOnly) select g).ToList(); break; case Core.Data.AreaType.City: gcList = (from g in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where (!UnassignedOnly || string.IsNullOrEmpty(g.City)) && (g.Selected || !SelectedOnly) select g).ToList(); break; } DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("AssignRegionsToGeocaches", "AssignRegionsToGeocaches", gcList.Count, 0, true)) { List<Core.Data.AreaInfo> areasFilter = Shapefiles.ShapeFilesManager.Instance.GetAreasByLevel(SelectedAreaLevel); if (areasFilter != null && areasFilter.Count > 0) { int index = 0; foreach (var gc in gcList) { List<Core.Data.AreaInfo> areas = Shapefiles.ShapeFilesManager.Instance.GetAreasOfLocation(new Core.Data.Location(gc.Lat, gc.Lon), areasFilter); if (areas != null && areas.Count > 0) { Core.Data.AreaInfo ai = areas[0]; if (Prefix.Length > 0) { ai = (from g in areas where g.Name.StartsWith(Prefix) select g).FirstOrDefault(); } if (ai != null) { switch (SelectedAreaLevel) { case Core.Data.AreaType.Country: gc.Country = ai.Name; break; case Core.Data.AreaType.State: gc.State = ai.Name; break; case Core.Data.AreaType.Municipality: gc.Municipality = ai.Name; break; case Core.Data.AreaType.City: gc.City = ai.Name; break; } } } index++; if (DateTime.Now>=nextUpdate) { if (!prog.Update("AssignRegionsToGeocaches", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } } catch(Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }); } } }
private async Task UpdateView() { Core.ApplicationData.Instance.BeginActiviy(); AvailableLogs.Clear(); List <Core.Data.Log> lgs = null; if (Core.ApplicationData.Instance.ActiveGeocache != null && Core.Settings.Default.LogViewerCurrentGeocacheOnly) { lgs = Utils.DataAccess.GetLogs(Core.ApplicationData.Instance.ActiveGeocache.Database, Core.ApplicationData.Instance.ActiveGeocache.Code); if (!string.IsNullOrEmpty(Core.Settings.Default.LogViewerFilterOnFinder)) { await Task.Run(() => { int i = 0; string s = Core.Settings.Default.LogViewerFilterOnFinder; while (i < lgs.Count) { if (string.Compare(lgs[i].Finder, s, true) != 0) { lgs.RemoveAt(i); } else { i++; } } }); } } else if (Core.ApplicationData.Instance.ActiveDatabase != null && !Core.Settings.Default.LogViewerCurrentGeocacheOnly) { if (!string.IsNullOrEmpty(Core.Settings.Default.LogViewerFilterOnFinder)) { lgs = new List <Core.Data.Log>(); await Task.Run(() => { DateTime nextUpdate = DateTime.Now.AddSeconds(1); int index = 0; using (Utils.ProgressBlock prog = new Utils.ProgressBlock("LoadingLogs", "LoadingLogs", Core.ApplicationData.Instance.ActiveDatabase.LogCollection.Count, 0, true)) { string s = Core.Settings.Default.LogViewerFilterOnFinder; foreach (var l in Core.ApplicationData.Instance.ActiveDatabase.LogCollection) { if (string.Compare(l.Finder, s, true) == 0) { lgs.Add(l); } index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("LoadingLogs", Core.ApplicationData.Instance.ActiveDatabase.LogCollection.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } }); } } if (lgs != null) { foreach (var l in lgs) { AvailableLogs.Add(l); } } Core.ApplicationData.Instance.EndActiviy(); }
public async Task ExportToCachebox(List<Core.Data.Geocache> gcList, string targetFolder, int maxLogCount) { await Task.Run(() => { try { int max = gcList.Count; int index = 0; DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportCachebox", "CreatingFile", 3, 0, true)) { string cbFile = System.IO.Path.Combine(targetFolder, "cachebox.db3"); if (System.IO.File.Exists(cbFile)) { System.IO.File.Delete(cbFile); } CreateDatabase(cbFile); if (_dbcon != null) { int fixedCatId = 1; string fixedGpxFilename = "12345678.gpx"; _dbcon.ExecuteNonQuery("PRAGMA user_version = 1022"); _dbcon.ExecuteNonQuery(string.Format("insert into Config (Key, Value) values ('{0}', '{1}')", "DatabaseSchemeVersion", "1022")); _dbcon.ExecuteNonQuery(string.Format("insert into Config (Key, Value) values ('{0}', '{1}')", "DatabaseSchemeVersionWin", "1022")); _dbcon.ExecuteNonQuery(string.Format("insert into Config (Key, Value) values ('{0}', '{1}')", "DatabaseId", DateTime.Now.ToFileTime())); _dbcon.ExecuteNonQuery(string.Format("insert into Config (Key, Value) values ('{0}', '{1}')", "MasterDatabaseId", DateTime.Now.ToFileTime() + 1)); _dbcon.ExecuteNonQuery(string.Format("insert into Category (Id, GpxFilename, Pinned) values ({0}, '{1}', {2})", fixedCatId, fixedGpxFilename, 0)); _dbcon.ExecuteNonQuery(string.Format("insert into GPXFilenames (Id, GpxFilename, Imported, CategoryId) values ({0}, '{1}', '{2}', {3})", 1, fixedGpxFilename, DateTime.Now.ToString("s"), fixedCatId)); //---------------------------- // CACHES //---------------------------- DbCommand cmd = _dbcon.Command; cmd.CommandText = "insert into Caches (Id, GcCode, GcId, Latitude, Longitude, Name, Size, Difficulty, Terrain, Archived, Available, Found, Type, PlacedBy, Owner, DateHidden, Hint, Description, Url, NumTravelbugs, Rating, Vote, VotePending, Notes, Solver, Favorit, AttributesPositive, AttributesNegative, TourName, GPXFilename_Id, HasUserData, ListingChanged, ImagesUpdated, DescriptionImagesUpdated, CorrectedCoordinates, AttributesPositiveHigh, AttributesNegativeHigh, State, Country) values (@Id, @GcCode, @GcId, @Latitude, @Longitude, @Name, @Size, @Difficulty, @Terrain, @Archived, @Available, @Found, @Type, @PlacedBy, @Owner, @DateHidden, @Hint, @Description, @Url, @NumTravelbugs, @Rating, @Vote, @VotePending, @Notes, @Solver, @Favorit, @AttributesPositive, @AttributesNegative, @TourName, @GPXFilename_Id, @HasUserData, @ListingChanged, @ImagesUpdated, @DescriptionImagesUpdated, @CorrectedCoordinates, @AttributesPositiveHigh, @AttributesNegativeHigh, @State, @Country)"; DbParameter par; par = cmd.CreateParameter(); par.ParameterName = "@Id"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@GcCode"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@GcId"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Latitude"; par.DbType = DbType.Single; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Longitude"; par.DbType = DbType.Single; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Name"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Size"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Difficulty"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Terrain"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Archived"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Available"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Found"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Type"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@PlacedBy"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Owner"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@DateHidden"; par.DbType = DbType.DateTime; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Hint"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Description"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Url"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@NumTravelbugs"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Rating"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Vote"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@VotePending"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Notes"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Solver"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Favorit"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@AttributesPositive"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@AttributesNegative"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@TourName"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@GPXFilename_Id"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@HasUserData"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@ListingChanged"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@ImagesUpdated"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@DescriptionImagesUpdated"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CorrectedCoordinates"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@AttributesPositiveHigh"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@AttributesNegativeHigh"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@State"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Country"; par.DbType = DbType.String; cmd.Parameters.Add(par); long startCacheId = DateTime.Now.ToFileTime() + 2; long cacheId = startCacheId; using (Utils.ProgressBlock prog = new Utils.ProgressBlock("ExportingGeocaches", gcList.Count, 0)) { foreach (Core.Data.Geocache gc in gcList) { cmd.Parameters["@Id"].Value = cacheId; cmd.Parameters["@GcCode"].Value = gc.Code; cmd.Parameters["@GcId"].Value = Utils.Conversion.GetCacheIDFromCacheCode(gc.Code); if (gc.ContainsCustomLatLon) { cmd.Parameters["@Latitude"].Value = (float)gc.CustomLat; cmd.Parameters["@Longitude"].Value = (float)gc.CustomLon; } else { cmd.Parameters["@Latitude"].Value = (float)gc.Lat; cmd.Parameters["@Longitude"].Value = (float)gc.Lon; } cmd.Parameters["@Name"].Value = gc.Name ?? ""; switch (gc.Container.ID) { case 2: cmd.Parameters["@Size"].Value = 1; break; case 8: cmd.Parameters["@Size"].Value = 2; break; case 4: cmd.Parameters["@Size"].Value = 3; break; case 5: cmd.Parameters["@Size"].Value = 4; break; default: cmd.Parameters["@Size"].Value = 0; break; } cmd.Parameters["@Difficulty"].Value = (Int16)(gc.Difficulty * 2.0); cmd.Parameters["@Terrain"].Value = (Int16)(gc.Terrain * 2.0); cmd.Parameters["@Archived"].Value = gc.Archived; cmd.Parameters["@Available"].Value = gc.Available; cmd.Parameters["@Found"].Value = gc.Found; switch (gc.GeocacheType.ID) { case 2: cmd.Parameters["@Type"].Value = 0; break; case 3: cmd.Parameters["@Type"].Value = 1; break; case 4: cmd.Parameters["@Type"].Value = 8; break; case 5: cmd.Parameters["@Type"].Value = 9; break; case 6: cmd.Parameters["@Type"].Value = 5; break; case 8: cmd.Parameters["@Type"].Value = 2; break; case 11: cmd.Parameters["@Type"].Value = 3; break; case 13: cmd.Parameters["@Type"].Value = 7; break; case 137: cmd.Parameters["@Type"].Value = 4; break; case 453: cmd.Parameters["@Type"].Value = 6; break; case 1858: cmd.Parameters["@Type"].Value = 10; break; default: cmd.Parameters["@Type"].Value = 13; break; } cmd.Parameters["@PlacedBy"].Value = gc.PlacedBy ?? ""; cmd.Parameters["@Owner"].Value = gc.Owner ?? ""; cmd.Parameters["@DateHidden"].Value = gc.PublishedTime; cmd.Parameters["@Hint"].Value = gc.EncodedHints ?? ""; StringBuilder sb = new StringBuilder(); if (!string.IsNullOrEmpty(gc.ShortDescription)) { if (gc.ShortDescriptionInHtml) { sb.Append(gc.ShortDescription); } else { sb.Append(HttpUtility.HtmlEncode(gc.ShortDescription).Replace("\r", "").Replace("\n", "<br />")); } sb.Append("<br />"); } if (!string.IsNullOrEmpty(gc.LongDescription)) { if (gc.LongDescriptionInHtml) { sb.Append(gc.LongDescription); } else { sb.Append(HttpUtility.HtmlEncode(gc.LongDescription).Replace("\r", "").Replace("\n", "<br />")); } } cmd.Parameters["@Description"].Value = sb.ToString(); cmd.Parameters["@Url"].Value = gc.Url ?? ""; cmd.Parameters["@NumTravelbugs"].Value = 0; cmd.Parameters["@Rating"].Value = 0; cmd.Parameters["@Vote"].Value = 0; cmd.Parameters["@VotePending"].Value = false; sb.Length = 0; if (gc.ContainsNote) { if (!string.IsNullOrEmpty(gc.PersonalNote)) { sb.Append(gc.PersonalNote); sb.Append(" - "); } if (!string.IsNullOrEmpty(gc.Notes)) { sb.Append(Utils.Conversion.StripHtmlTags(gc.Notes)); } } cmd.Parameters["@Notes"].Value = sb.Length; cmd.Parameters["@Solver"].Value = ""; cmd.Parameters["@Favorit"].Value = false; DLong tmpAttributesNegative = new DLong(0, 0); DLong tmpAttributesPositive = new DLong(0, 0); List<int> attrs = gc.AttributeIds; foreach (int ix in attrs) { if (ix > 0) { tmpAttributesPositive.BitOr(Attributes.GetAttributeDlong(Attributes.getAttributeEnumByGcComId(ix).Attribute)); } else { tmpAttributesNegative.BitOr(Attributes.GetAttributeDlong(Attributes.getAttributeEnumByGcComId(-ix).Attribute)); } } long AttributePositiveLow = (long)tmpAttributesPositive.getLow(); long AttributePositiveHigh = (long)tmpAttributesPositive.getHigh(); long AttributesNegativeLow = (long)tmpAttributesNegative.getLow(); long AttributesNegativeHigh = (long)tmpAttributesNegative.getHigh(); cmd.Parameters["@AttributesPositive"].Value = AttributePositiveLow; cmd.Parameters["@AttributesNegative"].Value = AttributesNegativeLow; cmd.Parameters["@AttributesPositiveHigh"].Value = AttributePositiveHigh; cmd.Parameters["@AttributesNegativeHigh"].Value = AttributesNegativeHigh; cmd.Parameters["@TourName"].Value = ""; cmd.Parameters["@AttributesNegative"].Value = 1; cmd.Parameters["@HasUserData"].Value = false; cmd.Parameters["@ListingChanged"].Value = false; cmd.Parameters["@ImagesUpdated"].Value = false; cmd.Parameters["@DescriptionImagesUpdated"].Value = false; cmd.Parameters["@CorrectedCoordinates"].Value = false; cmd.Parameters["@State"].Value = gc.State ?? ""; cmd.Parameters["@Country"].Value = gc.Country ?? ""; cmd.ExecuteNonQuery(); cacheId++; index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("SavingGeocaches", gcList.Count, index)) { _canceled = true; break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } if (!_canceled) { progress.Update("CreatingFile", 3, 1); //---------------------------- // WAYPOINTS //---------------------------- cmd.Parameters.Clear(); cmd.CommandText = "insert into Waypoint (GcCode, CacheId, Latitude, Longitude, Description, Clue, Type, SyncExclude, UserWaypoint, Title) values (@GcCode, @CacheId, @Latitude, @Longitude, @Description, @Clue, @Type, @SyncExclude, @UserWaypoint, @Title)"; par = cmd.CreateParameter(); par.ParameterName = "@GcCode"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CacheId"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Latitude"; par.DbType = DbType.Single; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Longitude"; par.DbType = DbType.Single; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Description"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Clue"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Type"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@SyncExclude"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@UserWaypoint"; par.DbType = DbType.Boolean; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Title"; par.DbType = DbType.String; cmd.Parameters.Add(par); cacheId = startCacheId; index = 0; using (Utils.ProgressBlock prog = new Utils.ProgressBlock("SavingWaypoints", gcList.Count, 0)) { foreach (Core.Data.Geocache gc in gcList) { List<Core.Data.Waypoint> wps = Utils.DataAccess.GetWaypointsFromGeocache(gc.Database, gc.Code); if (wps != null && wps.Count > 0) { foreach (Core.Data.Waypoint wp in wps) { if (wp.Lat != null && wp.Lon != null) { cmd.Parameters["@GcCode"].Value = wp.Code; cmd.Parameters["@CacheId"].Value = cacheId; cmd.Parameters["@Latitude"].Value = (float)(double)wp.Lat; cmd.Parameters["@Longitude"].Value = (float)(double)wp.Lon; cmd.Parameters["@Description"].Value = wp.Comment ?? ""; cmd.Parameters["@Clue"].Value = ""; switch (wp.WPType.ID) { case 217: cmd.Parameters["@Type"].Value = 17; break; case 220: cmd.Parameters["@Type"].Value = 18; break; case 218: cmd.Parameters["@Type"].Value = 15; break; case 452: cmd.Parameters["@Type"].Value = 11; break; case 219: cmd.Parameters["@Type"].Value = 14; break; case 221: cmd.Parameters["@Type"].Value = 16; break; default: cmd.Parameters["@Type"].Value = 13; break; } cmd.Parameters["@SyncExclude"].Value = false; cmd.Parameters["@UserWaypoint"].Value = string.IsNullOrEmpty(wp.Url) || !wp.Url.ToLower().StartsWith("http:"); cmd.Parameters["@Title"].Value = wp.Description ?? ""; cmd.ExecuteNonQuery(); } } } cacheId++; index++; if (DateTime.Now>=nextUpdate) { if (!prog.Update("SavingWaypoints", gcList.Count, index)) { _canceled = true; break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } if (!_canceled) { progress.Update("CreatingFile", 3, index); //---------------------------- // LOGS //---------------------------- if (Core.Settings.Default.CacheboxMaxLogCount > 0) { cmd.Parameters.Clear(); cmd.CommandText = "insert into Logs (Id, CacheId, Timestamp, Finder, Type, Comment) values (@Id, @CacheId, @Timestamp, @Finder, @Type, @Comment)"; par = cmd.CreateParameter(); par.ParameterName = "@Id"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@CacheId"; par.DbType = DbType.Int64; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Timestamp"; par.DbType = DbType.DateTime; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Finder"; par.DbType = DbType.String; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Type"; par.DbType = DbType.Int16; cmd.Parameters.Add(par); par = cmd.CreateParameter(); par.ParameterName = "@Comment"; par.DbType = DbType.String; cmd.Parameters.Add(par); long logId = 1; index = 0; cacheId = startCacheId; using (Utils.ProgressBlock prog = new Utils.ProgressBlock("SavingLogs", gcList.Count, 0)) { foreach (Core.Data.Geocache gc in gcList) { List<Core.Data.Log> logs = Utils.DataAccess.GetLogs(gc.Database, gc.Code).Take(Core.Settings.Default.CacheboxMaxLogCount).ToList(); if (logs != null && logs.Count > 0) { foreach (Core.Data.Log lg in logs) { long id = logId; if (lg.ID.StartsWith("GL")) { id = Utils.Conversion.GetCacheIDFromCacheCode(lg.ID); } else { long.TryParse(lg.ID, out id); } cmd.Parameters["@Id"].Value = id; cmd.Parameters["@CacheId"].Value = cacheId; cmd.Parameters["@Timestamp"].Value = lg.Date; cmd.Parameters["@Finder"].Value = lg.Finder ?? ""; switch (lg.LogType.ID) { case 2: cmd.Parameters["@Type"].Value = 0; break; case 3: cmd.Parameters["@Type"].Value = 1; break; case 4: cmd.Parameters["@Type"].Value = 2; break; case 24: cmd.Parameters["@Type"].Value = 3; break; case 23: cmd.Parameters["@Type"].Value = 4; break; case 45: cmd.Parameters["@Type"].Value = 5; break; case 22: cmd.Parameters["@Type"].Value = 6; break; case 46: case 47: cmd.Parameters["@Type"].Value = 7; break; case 9: cmd.Parameters["@Type"].Value = 8; break; case 10: cmd.Parameters["@Type"].Value = 9; break; case 11: cmd.Parameters["@Type"].Value = 10; break; case 5: case 6: case 12: cmd.Parameters["@Type"].Value = 11; break; case 18: cmd.Parameters["@Type"].Value = 12; break; case 7: cmd.Parameters["@Type"].Value = 13; break; default: cmd.Parameters["@Type"].Value = 2; break; } cmd.Parameters["@Comment"].Value = lg.Text ?? ""; cmd.ExecuteNonQuery(); } } cacheId++; index++; if (DateTime.Now>=nextUpdate) { if (!prog.Update("SavingWaypoints", max, index)) { _canceled = true; break; } nextUpdate = DateTime.Now.AddSeconds(1); } } progress.Update("SavingLogs", max, index); } } } } _dbcon.Dispose(); } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); try { if (_dbcon!=null) { _dbcon.Dispose(); _dbcon = null; } } catch { } } }); }
public async Task SelectWithinBoundsAsync() { try { double minLat = 0.0; double minLon = 0.0; double maxLat = 0.0; double maxLon = 0.0; var sc = selectionContext.GeocacheSelectionContext; object o = executeScript("getBounds", null); if (o != null && o.GetType() != typeof(DBNull)) { string s = o.ToString().Replace("(", "").Replace(")", ""); string[] parts = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); minLat = Utils.Conversion.StringToDouble(parts[0]); minLon = Utils.Conversion.StringToDouble(parts[1]); maxLat = Utils.Conversion.StringToDouble(parts[2]); maxLon = Utils.Conversion.StringToDouble(parts[3]); } using (Utils.DataUpdater upd = new Utils.DataUpdater(Core.ApplicationData.Instance.ActiveDatabase)) { await Task.Run(new Action(() => { try { List <Core.Data.Geocache> gcList; if (sc == GAPPSF.UIControls.SelectionContext.Context.NewSelection) { gcList = Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection; } else if (sc == GAPPSF.UIControls.SelectionContext.Context.WithinSelection) { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where a.Selected select a).ToList(); } else { gcList = (from a in Core.ApplicationData.Instance.ActiveDatabase.GeocacheCollection where !a.Selected select a).ToList(); } DateTime nextUpdate = DateTime.Now.AddSeconds(1); using (Utils.ProgressBlock prog = new Utils.ProgressBlock("Searching", "Searching", gcList.Count, 0, true)) { int index = 0; foreach (var gc in gcList) { gc.Selected = (gc.Lat >= minLat && gc.Lat <= maxLat && gc.Lon >= minLon && gc.Lon <= maxLon); index++; if (DateTime.Now >= nextUpdate) { if (!prog.Update("Searching", gcList.Count, index)) { break; } nextUpdate = DateTime.Now.AddSeconds(1); } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } })); } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } }
private void exportToGPX() { string filename; if (Core.Settings.Default.GPXFileName.ToLower().EndsWith(".gpx")) { filename = Core.Settings.Default.GPXFileName; } else if (Core.Settings.Default.GPXFileName.ToLower().EndsWith(".")) { filename = string.Concat(Core.Settings.Default.GPXFileName, "gpx"); } else { filename = string.Concat(Core.Settings.Default.GPXFileName, ".gpx"); } using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportingGPX", "CreatingFile", _gcList.Count, 0)) { using (System.IO.TemporaryFile gpxFile = new System.IO.TemporaryFile(false)) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter(gpxFile.Path, false, Encoding.UTF8)) { GPX.Export gpxGenerator = new Export(_gcList, Version.Parse(Core.Settings.Default.GPXVersion)); DateTime nextUpdate = DateTime.Now.AddSeconds(1); //generate header sw.Write(gpxGenerator.Start()); //preserve mem and do for each cache the export for (int i = 0; i < gpxGenerator.Count; i++) { sw.WriteLine(gpxGenerator.Next()); if (Core.Settings.Default.GPXAddChildWaypoints) { string s = gpxGenerator.WaypointData(); if (!string.IsNullOrEmpty(s)) { sw.WriteLine(s); } } if (DateTime.Now >= nextUpdate) { progress.Update("CreatingFile", gpxGenerator.Count, i + 1); nextUpdate = DateTime.Now.AddSeconds(1); } } //finalize sw.Write(gpxGenerator.Finish()); } if (Core.Settings.Default.GPXTargetDevice == TargetDevice.Garmin) { progress.Update("CopyingFileToDevice", 1, 0); System.IO.File.Copy(gpxFile.Path, System.IO.Path.Combine(new string[] { SelectedGarminDevice.DriveName, "garmin", "gpx", filename }), true); } else { System.IO.File.Copy(gpxFile.Path, System.IO.Path.Combine(Core.Settings.Default.GPXTargetFolder, filename), true); } } } }
public void ImportMyLogsWithCaches(Core.Storage.Database db, SiteInfo activeSite) { using (Utils.ProgressBlock blockprogress = new Utils.ProgressBlock("ImportingOpencachingLogs", "ImportingOpencachingLogs", 2, 0, true)) { bool cancelled = false; try { int stepSize = 100; List <OKAPIService.Log> logs = new List <OKAPIService.Log>(); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingOpencachingLogs", "ImportingOpencachingLogs", 100, 0, true)) { List <OKAPIService.Log> pageLogs = OKAPIService.GetLogsOfUserID(activeSite, activeSite.UserID, stepSize, 0); while (pageLogs.Count() > 0) { logs.AddRange(pageLogs); if (!progress.Update("ImportingOpencachingLogs", logs.Count + stepSize, logs.Count)) { cancelled = true; break; } else if (pageLogs.Count() < stepSize) { break; } pageLogs = OKAPIService.GetLogsOfUserID(activeSite, activeSite.UserID, stepSize, logs.Count); } } if (!cancelled) { blockprogress.Update("ImportingOpencachingLogs", 2, 1); //we download the geocaches that are not present. But for the ones we have, we need to add the log and mark it as found List <string> gcList = (from a in logs where db.GeocacheCollection.GetGeocache(a.cache_code) != null select a.cache_code).ToList(); foreach (string s in gcList) { db.GeocacheCollection.GetGeocache(s).Found = true; var ls = (from a in logs where a.cache_code == s select a).ToList(); foreach (var l in ls) { Convert.AddLog(db, l, activeSite.Username, activeSite.UserID); } } gcList = (from a in logs where db.GeocacheCollection.GetGeocache(a.cache_code) == null select a.cache_code).ToList(); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ImportingOpencachingLogs", "ImportingOpencachingGeocaches", gcList.Count, 0, true)) { int gcupdatecount = 1; while (gcList.Count > 0) { List <string> lcs = gcList.Take(gcupdatecount).ToList(); gcList.RemoveRange(0, lcs.Count); List <OKAPIService.Geocache> caches = OKAPIService.GetGeocaches(activeSite, lcs); Import.AddGeocaches(db, caches); foreach (var g in caches) { var ls = (from a in logs where a.cache_code == g.code select a).ToList(); foreach (var l in ls) { Convert.AddLog(db, l, activeSite.Username, activeSite.UserID); } } if (!progress.Update("ImportingOpencachingGeocaches", logs.Count, logs.Count - gcList.Count)) { cancelled = true; break; } } } } } catch (Exception e) { Core.ApplicationData.Instance.Logger.AddLog(this, e); } } }
private void exportToGGZ() { string filename; if (Core.Settings.Default.GPXFileName.ToLower().EndsWith(".ggz")) { filename = Core.Settings.Default.GPXFileName; } else if (Core.Settings.Default.GPXFileName.ToLower().EndsWith(".")) { filename = string.Concat(Core.Settings.Default.GPXFileName, "ggz"); } else { filename = string.Concat(Core.Settings.Default.GPXFileName, ".ggz"); } DateTime dt = DateTime.Now.AddSeconds(2); using (Utils.ProgressBlock progress = new Utils.ProgressBlock("ExportingGPX", "CreatingFile", _gcList.Count, 0)) { using (System.IO.TemporaryFile gpxFile = new System.IO.TemporaryFile(false)) { using (ZipOutputStream s = new ZipOutputStream(System.IO.File.Create(gpxFile.Path))) { s.SetLevel(9); // 0-9, 9 being the highest compression s.UseZip64 = UseZip64.Off; int totalGeocaches = _gcList.Count; int totalProcessed = 0; int fileIndex = 1; int geocacheIndex = 0; int gpxSizeLimit = 4500000; //appr. 4.5MB XmlDocument doc = new XmlDocument(); XmlDeclaration pi = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes"); doc.InsertBefore(pi, doc.DocumentElement); XmlElement root = doc.CreateElement("ggz"); doc.AppendChild(root); XmlAttribute attr = doc.CreateAttribute("xmlns"); XmlText txt = doc.CreateTextNode("http://www.opencaching.com/xmlschemas/ggz/1/0"); attr.AppendChild(txt); root.Attributes.Append(attr); XmlElement el = doc.CreateElement("time"); txt = doc.CreateTextNode(string.Format("{0}Z", DateTime.Now.ToUniversalTime().ToString("s"))); el.AppendChild(txt); root.AppendChild(el); //Utils.Crc16 crc16 = new Utils.Crc16(); GPX.Export gpxGenerator = new Export(_gcList, Version.Parse(Core.Settings.Default.GPXVersion)); while (_gcList.Count > 0) { XmlElement elFile = doc.CreateElement("file"); root.AppendChild(elFile); el = doc.CreateElement("name"); txt = doc.CreateTextNode(string.Format("{0}_{1}.gpx", System.IO.Path.GetFileNameWithoutExtension(filename), fileIndex)); el.AppendChild(txt); elFile.AppendChild(el); XmlElement elCRC = doc.CreateElement("crc"); elFile.AppendChild(elCRC); el = doc.CreateElement("time"); txt = doc.CreateTextNode(string.Format("{0}Z", DateTime.Now.ToUniversalTime().ToString("s"))); el.AppendChild(txt); elFile.AppendChild(el); //create GPX wpt entries until max size is reached List <Core.Data.Geocache> gpxBatchList = new List <Core.Data.Geocache>(); List <GeocacheEntryInfo> geiList = new List <GeocacheEntryInfo>(); geocacheIndex = 0; gpxGenerator.SetGeocacheList(_gcList); StringBuilder sb = new StringBuilder(); gpxGenerator.Start(); while (sb.Length < gpxSizeLimit && geocacheIndex < gpxGenerator.Count) { gpxBatchList.Add(_gcList[geocacheIndex]); string gpxText = gpxGenerator.Next(); GeocacheEntryInfo gei = new GeocacheEntryInfo(); gei.GC = _gcList[geocacheIndex]; gei.FileLen = System.Text.UTF8Encoding.UTF8.GetBytes(gpxText).Length + 2; geiList.Add(gei); sb.AppendLine(gpxText); totalProcessed++; geocacheIndex++; if (DateTime.Now >= dt) { progress.Update("CreatingFile", totalGeocaches, totalProcessed); dt = DateTime.Now.AddSeconds(2); } } sb.AppendLine(gpxGenerator.Finish()); //insert gpx header gpxGenerator.SetGeocacheList(gpxBatchList); string gpxHeader = gpxGenerator.Start(); sb.Insert(0, gpxHeader); _gcList.RemoveRange(0, gpxBatchList.Count); //add gpx to zip byte[] data; using (System.IO.TemporaryFile tmp = new System.IO.TemporaryFile(true)) { using (System.IO.StreamWriter sw = System.IO.File.CreateText(tmp.Path)) { sw.Write(sb.ToString()); } data = File.ReadAllBytes(tmp.Path); } string fn = string.Format("data/{0}_{1}.gpx", System.IO.Path.GetFileNameWithoutExtension(filename), fileIndex); ZipEntry entry = new ZipEntry(fn); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); s.Write(data, 0, data.Length); Crc32 crc = new Crc32(); crc.Update(data); //txt = doc.CreateTextNode(crc16.ComputeChecksum(data).ToString("X8")); txt = doc.CreateTextNode(crc.Value.ToString("X8")); elCRC.AppendChild(txt); int curPos = System.Text.UTF8Encoding.UTF8.GetBytes(gpxHeader).Length; for (int i = 0; i < geiList.Count; i++) { GeocacheEntryInfo gei = geiList[i]; XmlElement chgEl = doc.CreateElement("gch"); elFile.AppendChild(chgEl); el = doc.CreateElement("code"); txt = doc.CreateTextNode(gei.GC.Code ?? ""); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("name"); txt = doc.CreateTextNode(gpxGenerator.validateXml(gei.GC.Name ?? "")); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("type"); txt = doc.CreateTextNode(gei.GC.GeocacheType.GPXTag); el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("lat"); if (gei.GC.ContainsCustomLatLon) { txt = doc.CreateTextNode(gei.GC.CustomLat.ToString().Replace(',', '.')); } else { txt = doc.CreateTextNode(gei.GC.Lat.ToString().Replace(',', '.')); } el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("lon"); if (gei.GC.ContainsCustomLatLon) { txt = doc.CreateTextNode(gei.GC.CustomLon.ToString().Replace(',', '.')); } else { txt = doc.CreateTextNode(gei.GC.Lon.ToString().Replace(',', '.')); } el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("file_pos"); txt = doc.CreateTextNode(curPos.ToString()); curPos += gei.FileLen; el.AppendChild(txt); chgEl.AppendChild(el); el = doc.CreateElement("file_len"); txt = doc.CreateTextNode(gei.FileLen.ToString()); el.AppendChild(txt); chgEl.AppendChild(el); XmlElement ratingsEl = doc.CreateElement("ratings"); chgEl.AppendChild(ratingsEl); el = doc.CreateElement("awesomeness"); txt = doc.CreateTextNode("3.0"); el.AppendChild(txt); ratingsEl.AppendChild(el); el = doc.CreateElement("difficulty"); txt = doc.CreateTextNode(gei.GC.Difficulty.ToString("0.#").Replace(',', '.')); el.AppendChild(txt); ratingsEl.AppendChild(el); el = doc.CreateElement("size"); switch (gei.GC.Container.ID) { case 1: txt = doc.CreateTextNode("2.0"); break; case 5: txt = doc.CreateTextNode("2.0"); break; case 6: txt = doc.CreateTextNode("2.0"); break; case 2: txt = doc.CreateTextNode("2.0"); break; case 3: txt = doc.CreateTextNode("4.0"); break; case 4: txt = doc.CreateTextNode("5.0"); break; case 8: txt = doc.CreateTextNode("3.0"); break; default: txt = doc.CreateTextNode("3.0"); break; } el.AppendChild(txt); ratingsEl.AppendChild(el); el = doc.CreateElement("terrain"); txt = doc.CreateTextNode(gei.GC.Terrain.ToString("0.#").Replace(',', '.')); el.AppendChild(txt); ratingsEl.AppendChild(el); if (gei.GC.Found) { el = doc.CreateElement("found"); txt = doc.CreateTextNode("true"); el.AppendChild(txt); chgEl.AppendChild(el); } } fileIndex++; } //add index file // index\com\garmin\geocaches\v0\index.xml /* * <gch> * <code>GC12345</code> * <name>Cache name</name> * <type>Traditional Cache</type> * <lat>33.550217</lat> * <lon>-117.660617</lon> * <file_pos>5875</file_pos> * <file_len>5783</file_len> * <ratings> * <awesomeness>3.0</awesomeness> * <difficulty>1.5</difficulty> * <size>5.0</size> * <terrain>1.5</terrain> * </ratings> * <found>true</found> * </gch> * * 1 = Nano (not supported, unfortunately, by GC.com yet) * 2 = Micro * 3 = Small * 4 = Regular * 5 = Large * */ using (System.IO.TemporaryFile tmp = new System.IO.TemporaryFile(true)) { using (TextWriter sw = new StreamWriter(tmp.Path, false, Encoding.UTF8)) //Set encoding { doc.Save(sw); } byte[] data = File.ReadAllBytes(tmp.Path); ZipEntry entry = new ZipEntry("index/com/garmin/geocaches/v0/index.xml"); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); s.Write(data, 0, data.Length); } s.Finish(); s.Close(); } if (Core.Settings.Default.GPXTargetDevice == TargetDevice.Garmin) { progress.Update("CopyingFileToDevice", 1, 0); string p = System.IO.Path.Combine(new string[] { SelectedGarminDevice.DriveName, "garmin", "ggz" }); if (!System.IO.Directory.Exists(p)) { System.IO.Directory.CreateDirectory(p); } System.IO.File.Copy(gpxFile.Path, System.IO.Path.Combine(p, filename), true); } else { System.IO.File.Copy(gpxFile.Path, System.IO.Path.Combine(Core.Settings.Default.GPXTargetFolder, filename), true); } } } }