]> git.street.me.uk Git - andy/gpx.git/commitdiff
Fix: Use correct order when writing elements
authorAndy Street <andy@street.me.uk>
Tue, 8 Jan 2019 19:26:17 +0000 (19:26 +0000)
committerAndy Street <andy@street.me.uk>
Tue, 8 Jan 2019 19:26:17 +0000 (19:26 +0000)
src/libgpx/gpxwriter.php

index 567a7718e71eded630eb4892bd43c645c28bc59d..24b80b5ab8ec9771a42b6a736c59bed6eb4963f3 100644 (file)
@@ -187,6 +187,7 @@ class GPXWriter
     $xml = new XMLWriter();
     $xml->openURI('php://output');
     $this->write($gpx, $xml);
+    $xml->flush();
   }
 
   /**
@@ -200,9 +201,10 @@ class GPXWriter
   public function save(GPX $gpx, string $filename)
   {
     $xml = new XMLWriter();
-    if (!$xml->openURI('php://output'))
+    if (!$xml->openURI($filename))
       throw RuntimeException(sprintf('Unable to write to "%s"', $filename));
     $this->write($gpx, $xml);
+    $xml->flush();
   }
 
   /**
@@ -263,7 +265,6 @@ class GPXWriter
     }
     $xml->endElement();
     $xml->endDocument();
-    $xml->flush();
   }
 
   /**
@@ -431,27 +432,43 @@ class GPXWriter
   }
 
   /**
-   * Write out the common attributes for all data types.
+   * Generate XML for GPX wpt type.
    *
-   * @param DataType $type The data type to write.
-   * @param XMLWriter $xml Where to write.
+   * @param Point $point The point to write.
+   * @param string $element The XML element name (e.g. <wpt>)
+   * @param XMLWriter $xml Where to write the point.
    * @return void
    */
-  protected function writeDataType(DataType $type, XMLWriter $xml)
+  protected function writePoint(Point $point, string $element, XMLWriter $xml)
   {
-    $var = $type->getName();
+    $xml->startElement($element);
+    $xml->writeAttribute('lat', $point->getLatitude());
+    $xml->writeAttribute('lon', $point->getLongitude());
+    $var = $point->getEle();
+    if ($var !== null)
+      $xml->writeElement('ele', $var);
+    $var = $point->getTime();
+    if ($var !== null)
+      $xml->writeElement('time', $this->createTimestamp($var));
+    $var = $point->getMagvar();
+    if ($var !== null)
+      $xml->writeElement('magvar', $var);
+    $var = $point->getGeoidHeight();
+    if ($var !== null)
+      $xml->writeElement('geoidheight', $var);
+    $var = $point->getName();
     if ($var !== null)
       $xml->writeElement('name', $var);
-    $var = $type->getComment();
+    $var = $point->getComment();
     if ($var !== null)
       $xml->writeElement('cmt', $var);
-    $var = $type->getDescription();
+    $var = $point->getDescription();
     if ($var !== null)
       $xml->writeElement('desc', $var);
-    $var = $type->getSource();
+    $var = $point->getSource();
     if ($var !== null)
       $xml->writeElement('src', $var);
-    $var = $type->getLinks(false);
+    $var = $point->getLinks(false);
     if ($var !== null) {
       foreach($var as $link) {
         $this->writeLink($link, $xml);
@@ -459,51 +476,12 @@ class GPXWriter
           break;
       }
     }
-    if ($this->format == '1.1' || $type instanceof Point) {
-      $var = $type->getType();
-      if ($var !== null)
-        $xml->writeElement('type', $var);
-    }
-    $var = $type->getExtensions(false);
-    if ($var !== null && !$var->isEmpty()) {
-      if ($this->format == '1.1')
-        $xml->startElement('extensions');
-      foreach ($var as $extension) {
-        $xml->writeRaw($extension);
-      }
-      if ($this->format == '1.1')
-        $xml->endElement();
-    }
-  }
-
-  /**
-   * Generate XML for GPX wpt type.
-   *
-   * @param Point $point The point to write.
-   * @param string $element The XML element name (e.g. <wpt>)
-   * @param XMLWriter $xml Where to write the point.
-   * @return void
-   */
-  protected function writePoint(Point $point, string $element, XMLWriter $xml)
-  {
-    $xml->startElement($element);
-    $xml->writeAttribute('lat', $point->getLatitude());
-    $xml->writeAttribute('lon', $point->getLongitude());
-    $val = $point->getEle();
-    if ($val !== null)
-      $xml->writeElement('ele', $val);
-    $val = $point->getTime();
-    if ($val !== null)
-      $xml->writeElement('time', $this->createTimestamp($val));
-    $val = $point->getMagvar();
-    if ($val !== null)
-      $xml->writeElement('magvar', $val);
-    $val = $point->getGeoidHeight();
-    if ($val !== null)
-      $xml->writeElement('geoidheight', $val);
     $var = $point->getSymbol();
     if ($var !== null)
       $xml->writeElement('sym', $var);
+    $var = $point->getType();
+    if ($var !== null)
+      $xml->writeElement('type', $var);
     $var = $point->getFix();
     if ($var !== null)
       $xml->writeElement('fix', $var);
@@ -525,7 +503,16 @@ class GPXWriter
     $var = $point->getDGPSId();
     if ($var !== null)
       $xml->writeElement('dgpsid', $var);
-    $this->writeDataType($point, $xml);
+    $var = $point->getExtensions(false);
+    if ($var !== null && !$var->isEmpty()) {
+      if ($this->format == '1.1')
+        $xml->startElement('extensions');
+      foreach ($var as $extension) {
+        $xml->writeRaw($extension);
+      }
+      if ($this->format == '1.1')
+        $xml->endElement();
+    }
     $xml->endElement();
   }
 
@@ -539,10 +526,44 @@ class GPXWriter
   protected function writeRoute(Route $route, XMLWriter $xml)
   {
     $xml->startElement('rte');
+    $var = $route->getName();
+    if ($var !== null)
+      $xml->writeElement('name', $var);
+    $var = $route->getComment();
+    if ($var !== null)
+      $xml->writeElement('cmt', $var);
+    $var = $route->getDescription();
+    if ($var !== null)
+      $xml->writeElement('desc', $var);
+    $var = $route->getSource();
+    if ($var !== null)
+      $xml->writeElement('src', $var);
+    $var = $route->getLinks(false);
+    if ($var !== null) {
+      foreach($var as $link) {
+        $this->writeLink($link, $xml);
+        if ($this->format == '1.0')
+          break;
+      }
+    }
     $var = $route->getNumber();
     if ($var !== null)
       $xml->writeElement('number', $var);
-    $this->writeDataType($route, $xml);
+    if ($this->format == '1.1') {
+      $var = $route->getType();
+      if ($var !== null)
+        $xml->writeElement('type', $var);
+    }
+    $var = $route->getExtensions(false);
+    if ($var !== null && !$var->isEmpty()) {
+      if ($this->format == '1.1')
+        $xml->startElement('extensions');
+      foreach ($var as $extension) {
+        $xml->writeRaw($extension);
+      }
+      if ($this->format == '1.1')
+        $xml->endElement();
+    }
     $var = $route->getPoints(false);
     if ($var !== null) {
       foreach ($var as $point) {
@@ -562,10 +583,44 @@ class GPXWriter
   protected function writeTrack(Track $track, XMLWriter $xml)
   {
     $xml->startElement('trk');
+    $var = $track->getName();
+    if ($var !== null)
+      $xml->writeElement('name', $var);
+    $var = $track->getComment();
+    if ($var !== null)
+      $xml->writeElement('cmt', $var);
+    $var = $track->getDescription();
+    if ($var !== null)
+      $xml->writeElement('desc', $var);
+    $var = $track->getSource();
+    if ($var !== null)
+      $xml->writeElement('src', $var);
+    $var = $track->getLinks(false);
+    if ($var !== null) {
+      foreach($var as $link) {
+        $this->writeLink($link, $xml);
+        if ($this->format == '1.0')
+          break;
+      }
+    }
     $var = $track->getNumber();
     if ($var !== null)
       $xml->writeElement('number', $var);
-    $this->writeDataType($track, $xml);
+    if ($this->format == '1.1') {
+      $var = $track->getType();
+      if ($var !== null)
+        $xml->writeElement('type', $var);
+    }
+    $var = $track->getExtensions(false);
+    if ($var !== null && !$var->isEmpty()) {
+      if ($this->format == '1.1')
+        $xml->startElement('extensions');
+      foreach ($var as $extension) {
+        $xml->writeRaw($extension);
+      }
+      if ($this->format == '1.1')
+        $xml->endElement();
+    }
     $var = $track->getSegments(false);
     if ($var !== null) {
       foreach ($var as $segment) {
@@ -593,7 +648,7 @@ class GPXWriter
     }
     if ($this->format == '1.1') {
       $var = $segment->getExtensions(false);
-      if ($var !== null) {
+      if ($var !== null && !$var->isEmpty()) {
         $xml->startElement('extensions');
         foreach ($var as $extension) {
           $xml->writeRaw($extension);