comparison php/save.php @ 2634:7d2267e094ca

Major rework to save.php
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Thu, 19 Jan 2017 13:01:25 +0000
parents 464c6c6692d6
children 325e1ca3e03b
comparison
equal deleted inserted replaced
2633:7270da0c8647 2634:7d2267e094ca
1 <?php 1 <?php
2 header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 2
3 header("Cache-Control: post-check=0, pre-check=0", false); 3 function findNodeByAttribute($nodeList, $attributeName, $attributeValue) {
4 header("Pragma: no-cache"); 4 if (empty($attributeName) || empty($attributeValue) || empty($nodelist)) {
5 error_reporting(0); 5 die("Error: Empty findNodeByAttribute");
6 $saveFilenamePrefix = isset($_GET['saveFilenamePrefix']) ? $_GET['saveFilenamePrefix'].'-' : ''; 6 }
7 header('Access-Control-Allow-Origin: *'); 7
8 header("Content-type: text/xml"); 8 foreach($nodeList as $item) {
9 $postText = file_get_contents('php://input'); 9 if ($item->hasAttribute($attributeName)) {
10 $file_key = $_GET['key']; 10 if ($item->getAttribute($attributeValue) == $attributeValue) {
11 $filename = '../saves/'.$saveFilenamePrefix.'save-'.$file_key.".xml"; 11 return $item;
12 $doc = new DOMDocument; 12 }
13 $doc->preserveWhiteSpace = false; 13 }
14 $doc->formatOutput = true; 14 }
15 $doc->loadXML($postText); 15 return 0;
16 $postText = $doc->saveXML(); 16 }
17 $fileHandle = fopen($filename, 'w'); 17
18 if ($fileHandle == FALSE) 18 // Set the response headers
19 { 19 header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
20 // Filehandle failed 20 header("Pragma: no-cache");
21 $xml = '<response state="error"><message>Could not open file</message></response>'; 21 header('Access-Control-Allow-Origin: *');
22 echo $xml; 22 header("Content-type: text/xml");
23 return; 23 error_reporting(0);
24 } 24
25 $wbytes = fwrite($fileHandle, $postText); 25 // Load up the parameters
26 if ($wbytes === FALSE) 26 $saveFilenamePrefix = '';
27 { 27 if (isset($_GET['saveFilenamePrefix'])) {
28 // FileWrite failed 28 $saveFilenamePrefix = $_GET['saveFilenamePrefix'].'-';
29 $xml = '<response state="error"><message>Could not write file "'.$filename.'"</message></response>'; 29 }
30 echo $xml; 30 $postText = file_get_contents('php://input');
31 return; 31 $file_key = $_GET['key'];
32 } 32 $filename = '../saves/'.$saveFilenamePrefix.'save-'.$file_key.".xml";
33 fclose($fileHandle); 33
34 34 if (!file_exists($filename)) {
35 // Return XML confirmation data 35 die('<response state="error"><message>Could not find save</message></response>');
36 $xml = '<response state="OK"><message>OK</message><file bytes="'.$wbytes.'">"'.$filename.'"</file></response>'; 36 }
37 echo $xml; 37
38 // Open the save
39 $saved_doc = new DOMDocument;
40 $saved_doc->preserveWhiteSpace = false;
41 $saved_doc->formatOutput = true;
42 $saved_doc->loadXML(file_get_contents($filename, FILE_TEXT));
43 $saved_root = $saved_doc->documentElement;
44
45 // Construct the XML document into a new tree
46 $doc = new DOMDocument;
47 $doc->loadXML($postText);
48 $docRoot = $doc->documentElement;
49
50 // Add the relavent nodes:
51 // <datetime>
52 $n1 = $docRoot->getElementsByTagName("datetime");
53 $n2 = $saved_root->getElementsByTagName("datetime");
54 if ($n1->length > 0 && $n2.length == 0) {
55 $n1 = $doc->importNode($n1->item(0), true);
56 $docRoot->appendChild($n1);
57 }
58
59 //<navigator>
60 $n1 = $docRoot->getElementsByTagName("navigator");
61 $n2 = $saved_root->getElementsByTagName("navigator");
62 if ($n1->length > 0 && $n2.length == 0) {
63 $n1 = $doc->importNode($n1->item(0), true);
64 $docRoot->appendChild($n1);
65 }
66
67 //<survey location="pre">
68 $n1 = $docRoot->getElementsByTagName("survey");
69 $n2 = $saved_root->getElementsByTagName("survey");
70 if ($n1->length > 0) {
71 // Check if in save
72 if ($n2->length == 0) {
73 $n2 = 0;
74 }
75 $sn1 = findNodeByAttribute($n1, "location", "pre");
76 $sn2 = findNodeByAttribute($n2, "location", "pre");
77 if ($sn1 != 0) {
78 if ($sn2 != 0 && $sn2.getAttribute("state") != "complete") {
79 $saved_root->removeChild($sn2);
80 $sn2 = 0;
81 }
82 if ($sn2 == 0) {
83 $sn1 = $doc->importNode($sn1->item(0), true);
84 $docRoot->appendChild($sn1);
85 }
86 }
87
88 $sn1 = findNodeByAttribute($n1, "location", "post");
89 $sn2 = findNodeByAttribute($n2, "location", "post");
90 if ($sn1 != 0) {
91 if ($sn2 != 0 && $sn2.getAttribute("state") != "complete") {
92 $saved_root->removeChild($sn2);
93 $sn2 = 0;
94 }
95 if ($sn2 == 0) {
96 $sn1 = $doc->importNode($sn1->item(0), true);
97 $docRoot->appendChild($sn1);
98 }
99 }
100 }
101
102 //<page ref="">
103 $n1 = $docRoot->getElementsByTagName("page");
104 $n2 = $saved_root->getElementsByTagName("page");
105 if ($n1->length > 0) {
106 if ($n2->length == 0) {
107 $n2 = 0;
108 }
109 foreach($n1 as $page) {
110 $ref = $page->getAttribute("ref");
111 $pn2 = findNodeByAttribute($n2, "ref", $ref);
112 if ($pn2 != 0 && $pn2.getAttribute("state") != "complete") {
113 $saved_root->removeChild($pn2);
114 $pn2 = 0;
115 }
116 if ($pn2 == 0) {
117 $pn1 = $doc->importNode($page->item(0), true);
118 $docRoot->appendChild($pn1);
119 }
120 }
121 }
122
123 // Iterate through new doc
124 $wbytes = $doc_struct->save($filename);
125
126 // Return XML confirmation data
127 $xml = '<response state="OK"><message>OK</message><file bytes="'.$wbytes.'">"'.$filename.'"</file></response>';
128 echo $xml;
38 ?> 129 ?>