コード例 #1
0
ファイル: Import.cs プロジェクト: pheijmans-zz/GAPP
        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);
                    }
                }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
 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);
     }
 }
コード例 #5
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            }
        }
コード例 #6
0
ファイル: Export.cs プロジェクト: pheijmans-zz/GAPP
        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);
                }
            });
        }
コード例 #7
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            });
        }
コード例 #8
0
 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);
     }
 }
コード例 #9
0
ファイル: Logger.cs プロジェクト: RH-Code/GAPP
        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;
        }
コード例 #10
0
ファイル: Manager.cs プロジェクト: pheijmans-zz/GAPP
        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);
            }
        }
コード例 #11
0
ファイル: ImportLiveAPI.cs プロジェクト: pheijmans-zz/GAPP
        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);
        }
コード例 #12
0
ファイル: Import.cs プロジェクト: pheijmans-zz/GAPP
 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);
                 }
             }
         }
 }
コード例 #13
0
        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);
                                }
                            }
                        }
                    });
                }
            }
        }
コード例 #14
0
ファイル: Import.cs プロジェクト: pheijmans-zz/GAPP
        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);
        }
コード例 #15
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            });
        }
コード例 #16
0
        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);
                }
            });
        }
コード例 #17
0
ファイル: Export.cs プロジェクト: pheijmans-zz/GAPP
        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
            }
        }
コード例 #18
0
ファイル: Export.cs プロジェクト: pheijmans-zz/GAPP
        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);
        }
コード例 #19
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
        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);
            }
        }
コード例 #20
0
        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);
            }
        }
コード例 #21
0
ファイル: CacheList.xaml.cs プロジェクト: RH-Code/GAPP
        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);
                                    }
                                }
                            }
                        });
                }
            }
        }
コード例 #22
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
        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);
            }
        }
コード例 #23
0
ファイル: Logger.cs プロジェクト: gahadzikwa/GAPP
        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;
        }
コード例 #24
0
ファイル: Export.cs プロジェクト: pheijmans-zz/GAPP
        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);
                }
            });
        }
コード例 #25
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            });
        }
コード例 #26
0
ファイル: Control.xaml.cs プロジェクト: gahadzikwa/GAPP
        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);
                                    }
                                }
                            }
                        }
                    });
                }
            }
        }
コード例 #27
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
        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);
                    }
                });
            }
        }
コード例 #28
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            });
        }
コード例 #29
0
ファイル: ImportLiveAPI.cs プロジェクト: gahadzikwa/GAPP
 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;
 }
コード例 #30
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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

            }

        }
コード例 #31
0
ファイル: Manager.cs プロジェクト: gahadzikwa/GAPP
        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);
            }
        }
コード例 #32
0
        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();
            }
        }
コード例 #33
0
ファイル: Import.cs プロジェクト: RH-Code/GAPP
 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);
     }
 }
コード例 #34
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
 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);
             }
         }
     }
 }
コード例 #35
0
ファイル: Import.cs プロジェクト: RH-Code/GAPP
        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);
            }
        }
コード例 #36
0
ファイル: Exporter.cs プロジェクト: pheijmans-zz/GAPP
        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);
        }
コード例 #37
0
ファイル: ImportPQWindow.xaml.cs プロジェクト: RH-Code/GAPP
        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();
        }
コード例 #38
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            }
        }
コード例 #39
0
        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);
                    }
                });
            }
        }
コード例 #40
0
        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);
                        }
                    });
                }
            }
        }
コード例 #41
0
ファイル: Import.cs プロジェクト: gahadzikwa/GAPP
        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);
            }
        }
コード例 #42
0
ファイル: ActionExportGGZ.cs プロジェクト: JensFF/GSAKWrapper
        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
                {
                }
            }
        }
コード例 #43
0
        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();
        }
コード例 #44
0
ファイル: Import.cs プロジェクト: RH-Code/GAPP
 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);
     }
 }
コード例 #45
0
ファイル: Export.cs プロジェクト: mwesten/GAPP
        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);
                        }
                    }
                }
            }
        }
コード例 #46
0
        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);
            }
        }
コード例 #47
0
ファイル: Import.cs プロジェクト: RH-Code/GAPP
        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);
                }
            }
        }
コード例 #48
0
ファイル: Importer.cs プロジェクト: gahadzikwa/GAPP
        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;
        }
コード例 #49
0
ファイル: Import.cs プロジェクト: RH-Code/GAPP
        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);
            }
        }
コード例 #50
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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);
            }
        }
コード例 #51
0
        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
                {
                }
            }
        }
コード例 #52
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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);
                }
            });
        }
コード例 #53
0
        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);
        }
コード例 #54
0
        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);
                        }
                    });
                }
            }
        }
コード例 #55
0
ファイル: Control.xaml.cs プロジェクト: pheijmans-zz/GAPP
        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();
        }
コード例 #56
0
ファイル: Export.cs プロジェクト: gahadzikwa/GAPP
        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
                    {

                    }
                }
            });
        }
コード例 #57
0
        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);
            }
        }
コード例 #58
0
        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);
                    }
                }
            }
        }
コード例 #59
0
        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);
                }
            }
        }
コード例 #60
0
        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);
                    }
                }
            }
        }