Exemple #1
0
        public override bool process(string url, string filename, string source)
        {
            bool ret = true;

            LibSys.StatusBar.Trace("IP: FilePlainWpt:process() filename=" + filename);

            int wpCount = 0;
            int lineno  = 0;

            try
            {
                string     line;
                int        state      = 0;
                int        numpoints  = 0;
                CreateInfo createInfo = new CreateInfo();                       // we will recycle it in place, filling every time.

                StreamReader stream = new StreamReader(filename);

                while ((line = stream.ReadLine()) != null)
                {
                    lineno++;
                    try
                    {
                        switch (state)
                        {
                        case 0:                                   // look for [WAYPOINTS]
                            if (line.StartsWith("[WAYPOINTS]"))
                            {
                                state = 2;
                                //LibSys.StatusBar.Trace("IP: FilePlainWpt:process() state 2 filename=" + filename);
                            }
                            if (line.StartsWith("[ROUTES]"))
                            {
                                state = 3;
                                //LibSys.StatusBar.Trace("IP: FilePlainWpt:process() state 3 filename=" + filename);
                                break;
                            }
                            break;

                        case 2:                                   // look for "NUMPOINTS=" for wpts
                        case 3:                                   // look for "NUMPOINTS=" for routes
                            if (line.StartsWith("NUMPOINTS="))
                            {
                                state *= 2;
                                string sNumpoints = line.Substring("NUMPOINTS=".Length);
                                numpoints = Convert.ToInt32(sNumpoints);
                                if (numpoints <= 0)
                                {
                                    state = 0;
                                }
                                //LibSys.StatusBar.Trace("IP: FilePlainWpt:process() state " + state + " numpoints=" + numpoints + " filename=" + filename);
                            }
                            break;

                        case 4:                                   // read WPT numpoints lines like:
                            // WPT1=1,5052.677,N,00002.217,E,0000164,M,ME164-,Cliffe Hill ,a
                            if (line.StartsWith("WPT"))
                            {
                                char[] sep = new Char[1] {
                                    ','
                                };
                                string[] split = line.Split(sep);

                                double lat = Convert.ToDouble(split[1]) / 100.0d;
                                double lng = Convert.ToDouble(split[3]) / 100.0d;

                                createInfo.init("wpt");
                                createInfo.setLat("" + lat + split[2].ToLower());
                                createInfo.setLng("" + lng + split[4].ToLower());
                                createInfo.setElev(split[5]);
                                createInfo.typeExtra = "waypoint";
                                createInfo.source    = source;
                                createInfo.name      = split[8];

                                m_insertWaypoint(createInfo);
                                wpCount++;
                                numpoints--;
                                if (numpoints == 0)
                                {
                                    state = 0;                                                  // look for command again
                                }
                            }
                            break;

                        case 6:                                   // read ROUTE numpoints lines like:
                            numpoints--;
                            if (numpoints == 0)
                            {
                                state = 0;                                              // look for command again
                            }
                            break;
                        }
                    }
                    catch (Exception ee)
                    {
                        LibSys.StatusBar.Error("FilePlainWpt:process():  file=" + filename + " line=" + lineno + " " + ee.Message);
                    }
                }
            }
            catch (Exception eee)
            {
                LibSys.StatusBar.Error("FilePlainWpt:process(): " + eee.Message);
                ret = false;
            }
            //LibSys.StatusBar.Trace("OK: FilePlainWpt:process() filename=" + filename + " lines=" + lineno + " waypoints=" + wpCount);
            return(ret);
        }
        public bool processXml(string url, XmlDocument xmlDoc, string source)
        {
            bool ret = true;

            LibSys.StatusBar.Trace("IP: FileGeocachingLoc:processXml()");
            try
            {
                XmlNodeList waypointNodes = xmlDoc.SelectNodes("/loc/waypoint");

                /*
                 *      <waypoint>
                 *              <name id="GC37EB"><![CDATA[Gotta Play by Cyn]]></name>
                 *              <coord lat="33.6033" lon="-117.651433333333"/>
                 *              <type>Geocache</type>
                 *              <link text="Cache Details">http://www.geocaching.com/seek/cache_details.aspx?wp=GC37EB</link>
                 *      </waypoint>
                 */

                CreateInfo createInfo = new CreateInfo();                       // we will recycle it in place, filling every time.

                // we want to traverse XmlDocument fast, as tile load operations can be numerous
                // and come in pack. So we avoid using XPath and rely mostly on "foreach child":
                foreach (XmlNode nnode in waypointNodes)
                {
                    try
                    {
                        //LibSys.StatusBar.Trace("FileGeocachingLoc:process() node=" + nnode.Name);
                        createInfo.init("wpt");
                        createInfo.typeExtra = "unknown";                               // type: geocache
                        createInfo.source    = source;

                        foreach (XmlNode node in nnode.ChildNodes)
                        {
                            //LibSys.StatusBar.Trace("    child node=" + node.Name);
                            switch (node.Name)
                            {
                            case "name":
                                createInfo.name    = node.Attributes["id"].InnerText.Trim();
                                createInfo.urlName = node.InnerText.Trim();
                                break;

                            case "coord":
                                createInfo.setLat(node.Attributes["lat"].InnerText);
                                createInfo.setLng(node.Attributes["lon"].InnerText);
                                break;

                            case "ele":                                                 // just in case
                                createInfo.setElev(node.InnerText);
                                break;

                            case "elev":                                        // just in case
                                createInfo.setElev(node.InnerText);
                                break;

                            case "type":
                                createInfo.typeExtra = node.InnerText.Trim();
                                if (createInfo.typeExtra.ToLower().IndexOf("geocache") >= 0)
                                {
                                    createInfo.sym = "Geocache";
                                }
                                break;

                            case "link":
                                createInfo.url = node.InnerText.Trim();
                                //LibSys.StatusBar.Trace("    link='" + createInfo.url + "'");
                                break;
                            }
                        }

                        m_insertWaypoint(createInfo);
                    }
                    catch (Exception ee)
                    {
                        // bad node - not a big deal...
                        LibSys.StatusBar.Error("FileGeocachingLoc:processXml() node=" + nnode.Name + " " + ee.Message);
                    }
                }
            }
            catch (Exception e)
            {
                LibSys.StatusBar.Error("FileGeocachingLoc:processXml() " + e.Message);
                ret = false;
            }
            return(ret);
        }
Exemple #3
0
        // xmlDoc must be Load'ed; can throw exceptions
        protected bool processGpx(string url, XmlDocument xmlDoc, string source)
        {
            bool ret = true;

            XmlNodeList waypointNodes = xmlDoc.DocumentElement.ChildNodes;             //.SelectNodes("/gpx/wpt"); - this don't work

#if DEBUG
            LibSys.StatusBar.Trace("IP: FileGpx:process() first level nodeCount=" + waypointNodes.Count);
#endif


            /*
             *      <gpx
             *      version="1.0"
             *      creator="EasyGPS 1.1.9 - http://www.topografix.com"
             *      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             *      xmlns="http://www.topografix.com/GPX/1/0"
             *      xmlns:topografix="http://www.topografix.com/GPX/Private/TopoGrafix/0/1"
             *      xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.topografix.com/GPX/Private/TopoGrafix/0/1 http://www.topografix.com/GPX/Private/TopoGrafix/0/1/topografix.xsd">
             *      <time>2002-10-04T18:49:55Z</time>
             *      <bounds minlat="25.061783" minlon="-123.003111" maxlat="50.982883" maxlon="121.640267"/>
             *      <wpt lat="33.575106480" lon="-117.735883651">
             *              <ele>159.703613</ele>
             *              <time>2002-10-04T18:47:47Z</time>
             *              <name><![CDATA[001]]></name>
             *              <cmt><![CDATA[29-AUG-02 11:21:24PM]]></cmt>
             *              <desc><![CDATA[001]]></desc>
             *              <sym>Dot</sym>
             *              <type><![CDATA[Dot]]></type>
             *      </wpt>
             *      <rte>
             *              <name><![CDATA[HOME TO CNTRYC]]></name>
             *              <number>1</number>
             *              <topografix:color>ff0000</topografix:color>
             *              <rtept lat="33.574991229" lon="-117.736144077">
             *                      <time>2002-10-11T05:34:36Z</time>
             *                      <name><![CDATA[HOME]]></name>
             *                      <cmt><![CDATA[AURORA]]></cmt>
             *                      <desc><![CDATA[HOME]]></desc>
             *                      <sym>House</sym>
             *                      <type><![CDATA[Residence]]></type>
             *              </rtept>
             *      </rte>
             *      <trk>
             *              <name><![CDATA[ACTIVE LOG]]></name>
             *              <number>1</number>
             *              <topografix:color>ff0000</topografix:color>
             *              <trkseg>
             *                      <trkpt lat="33.570749483" lon="-117.723665938">
             *                              <ele>106.363037</ele>
             *                              <time>2002-10-11T04:32:08Z</time>
             *                              <sym>Waypoint</sym>
             *                      </trkpt>
             *                      <trkpt lat="33.571032289" lon="-117.722491633">
             *                              <ele>99.153076</ele>
             *                              <time>2002-10-11T04:32:18Z</time>
             *                              <sym>Waypoint</sym>
             *                      </trkpt>
             *              </trkseg>
             *      </trk>
             *      </gpx>
             */

            CreateInfo createInfo = new CreateInfo();                   // we will recycle it in place, filling every time.

            // we want to traverse XmlDocument fast, as tile load operations can be numerous
            // and come in pack. So we avoid using XPath and rely mostly on "foreach child":
            foreach (XmlNode nnode in waypointNodes)
            {
                try
                {
                    switch (nnode.Name)
                    {
                    case "author":
                        //LibSys.StatusBar.Trace("FileGpx:process() node=" + nnode.Name);
                        break;

                    case "desc":
                        //LibSys.StatusBar.Trace("FileGpx:process() node=" + nnode.Name);
                        break;

                    case "bounds":
                        //LibSys.StatusBar.Trace("FileGpx:process() node=" + nnode.Name);
                        break;

                    case "wpt":
                        //LibSys.StatusBar.Trace("FileGpx:process() node=" + nnode.Name);
                        createInfo.init("wpt");
                        createInfo.setLat(nnode.Attributes["lat"].InnerText);
                        createInfo.setLng(nnode.Attributes["lon"].InnerText);
                        createInfo.typeExtra = "unknown";                                       // type: ppl, school, park, locale, airport, reservoir, dam,
                        //       civil, cemetery, valley, building
                        createInfo.source = source;
                        foreach (XmlNode node in nnode.ChildNodes)
                        {
                            //LibSys.StatusBar.Trace("    child node=" + node.Name);
                            switch (node.Name)
                            {
                            case "time":
                                createInfo.setDateTime(node.InnerText);
                                break;

                            case "ele":
                                createInfo.setElev(node.InnerText);
                                break;

                            case "name":
                                createInfo.name = node.InnerText.Trim();                                                        // number like 001 for route-related wpts or GCSDFX for geocaches
                                break;

                            case "desc":
                                createInfo.desc = node.InnerText.Trim();
                                break;

                            case "groundspeak:cache":
                                createInfo.node1 = node;                                                                // will be parsed in Waypoint() constructor
                                break;

                            case "urlname":                                                     // may overwrite name in Pocket Queries
                                createInfo.urlName = node.InnerText.Trim();
                                break;

                            case "url":
                                createInfo.url = node.InnerText.Trim();
                                break;

                            case "cmt":
                                createInfo.comment = node.InnerText.Trim();
                                // may contain time, so try to extract it if possible:
                                try
                                {
                                    createInfo.setDateTime(node.InnerText);
                                }
                                catch {}
                                break;

                            case "sym":
                                createInfo.sym = node.InnerText.Trim();
                                break;

                            case "type":                                                // like "user waypoint" or "geocache"
                                createInfo.typeExtra = node.InnerText.Trim();
                                break;
                            }
                        }
                        m_insertWaypoint(createInfo);
                        break;

                    case "rte":
                    {
                        string routeName    = "";
                        string routeColor   = "";
                        bool   routeCreated = false;
                        foreach (XmlNode nnnode in nnode.ChildNodes)
                        {
                            switch (nnnode.Name)
                            {
                            case "name":                                                // route name
                                routeName = nnnode.InnerText.Trim();
                                break;

                            case "number":                                              // route number
                                break;

                            case "topografix:color":                                                    // like 00ffee
                                routeColor = nnnode.InnerText.Trim();
                                break;

                            case "rtept":
                                /*
                                 *      <rtept lat="38.518697986" lon="-122.978969274">
                                 *              <ele>4.211426</ele>
                                 *              <time>2002-10-04T18:48:23Z</time>
                                 *              <name><![CDATA[006]]></name>
                                 *              <cmt><![CDATA[28-SEP-02 1:56:26PM]]></cmt>
                                 *              <desc><![CDATA[006]]></desc>
                                 *              <sym>Dot</sym>
                                 *              <type><![CDATA[Dot]]></type>
                                 *      </rtept>
                                 */
                                //LibSys.StatusBar.Trace("FileGpx:process() node=" + nnode.Name);

                                if (!routeCreated)
                                {
                                    Project.trackId++;

                                    createInfo.init("rte");
                                    createInfo.name   = routeName;
                                    createInfo.id     = Project.trackId;
                                    createInfo.par1   = nnnode.InnerText.Trim();                                                        // number for route
                                    createInfo.source = source;
                                    createInfo.par1   = routeColor;

                                    m_insertWaypoint(createInfo);                                                       // actually inserts a route

                                    routeCreated = true;
                                }
                                createInfo.init("rtept");
                                createInfo.setLat(nnnode.Attributes["lat"].InnerText);
                                createInfo.setLng(nnnode.Attributes["lon"].InnerText);
                                createInfo.id     = Project.trackId;                                                    // relate waypoint to track
                                createInfo.source = source;

                                foreach (XmlNode node in nnnode.ChildNodes)
                                {
                                    //LibSys.StatusBar.Trace("    child node=" + node.Name);
                                    switch (node.Name)
                                    {
                                    case "time":
                                        createInfo.setDateTime(node.InnerText);
                                        break;

                                    case "ele":
                                        createInfo.setElev(node.InnerText);
                                        break;

                                    case "name":
                                        createInfo.name = node.InnerText.Trim();                                                                        // number like 001 for route-related wpts or GCSDFX for geocaches
                                        break;

                                    case "desc":
                                        createInfo.desc = node.InnerText.Trim();
                                        break;

                                    case "urlname":
                                        createInfo.urlName = node.InnerText.Trim();
                                        break;

                                    case "url":
                                        createInfo.url = node.InnerText.Trim();
                                        break;

                                    case "cmt":
                                        createInfo.comment = node.InnerText.Trim();
                                        break;

                                    case "sym":
                                        createInfo.sym = node.InnerText.Trim();
                                        if ("Waypoint".Equals(createInfo.sym))
                                        {
                                            createInfo.sym = null;
                                        }
                                        break;

                                    case "type":                                                                // like "user waypoint" or "geocache"
                                        createInfo.typeExtra = node.InnerText.Trim();
                                        break;
                                    }
                                }

                                m_insertWaypoint(createInfo);
                                break;
                            }
                        }
                    }
                    break;

                    case "trk":
                    {
                        string trackName   = "";
                        string trackNumber = "";
                        string trackColor  = "";
                        foreach (XmlNode nnnode in nnode.ChildNodes)
                        {
                            switch (nnnode.Name)
                            {
                            case "name":                                                // track name
                                trackName = nnnode.InnerText.Trim();
                                break;

                            case "number":                                              // track number
                                trackNumber = nnnode.InnerText.Trim();
                                break;

                            case "topografix:color":                                                    // like 00ffee
                                trackColor = nnnode.InnerText.Trim();
                                break;

                            case "trkseg":
                                Project.trackId++;

                                createInfo.init("trk");
                                createInfo.name   = trackName;
                                createInfo.id     = Project.trackId;
                                createInfo.source = source;
                                createInfo.par1   = trackColor;

                                m_insertWaypoint(createInfo);                                                   // actually inserts a track

                                foreach (XmlNode nnnnode in nnnode.ChildNodes)
                                {
                                    switch (nnnnode.Name)
                                    {
                                    case "trkpt":                                                               // track point
                                        /*
                                         *      <trkpt lat="33.570749483" lon="-117.723665938">
                                         *              <ele>106.363037</ele>
                                         *              <time>2002-10-11T04:32:08Z</time>
                                         *              <sym>Waypoint</sym>
                                         *      </trkpt>
                                         */
                                        //LibSys.StatusBar.Trace("FileGpx:process() node=" + nnode.Name);

                                        createInfo.init("trkpt");
                                        createInfo.setLat(nnnnode.Attributes["lat"].InnerText);
                                        createInfo.setLng(nnnnode.Attributes["lon"].InnerText);
                                        createInfo.id     = Project.trackId;                                                                    // relate waypoint to track
                                        createInfo.source = source;

                                        foreach (XmlNode node in nnnnode.ChildNodes)
                                        {
                                            //LibSys.StatusBar.Trace("    child node=" + node.Name);
                                            switch (node.Name)
                                            {
                                            case "time":
                                                createInfo.setDateTime(node.InnerText);
                                                break;

                                            case "ele":
                                                createInfo.setElev(node.InnerText);
                                                break;

                                            case "name":
                                                createInfo.name = node.InnerText.Trim();
                                                break;

                                            case "desc":
                                                createInfo.desc = node.InnerText.Trim();
                                                break;

                                            case "urlname":
                                                createInfo.urlName = node.InnerText.Trim();
                                                break;

                                            case "url":
                                                createInfo.url = node.InnerText.Trim();
                                                break;

                                            case "cmt":
                                                createInfo.comment = node.InnerText.Trim();
                                                break;

                                            case "sym":
                                                createInfo.sym = node.InnerText.Trim();
                                                if ("Waypoint".Equals(createInfo.sym))
                                                {
                                                    createInfo.sym = null;
                                                }
                                                break;

                                            case "type":                                                                                // like "user waypoint" or "geocache"
                                                createInfo.typeExtra = node.InnerText.Trim();
                                                break;
                                            }
                                        }

                                        m_insertWaypoint(createInfo);
                                        break;
                                    }
                                }
                                break;
                            }
                        }
                    }
                    break;
                    }
                }
                catch (Exception ee)
                {
                    // bad node - not a big deal...
                    LibSys.StatusBar.Error("FileGpx process node=" + nnode.Name + " " + ee);                     //.Message);
                    //LibSys.StatusBar.WriteLine("Culture: " + Thread.CurrentThread.CurrentCulture + " (" + Thread.CurrentThread.CurrentCulture.DisplayName + ")  UseUserOverride=" + Thread.CurrentThread.CurrentCulture.UseUserOverride);
                }
            }
            return(ret);
        }