Changes for page Download a project (export)
Last modified by Robert Jan Daams on 2025/03/05 18:02
Change comment:
There is no comment for this version
Summary
-
Page properties (3 modified, 0 added, 0 removed)
-
Attachments (0 modified, 2 added, 0 removed)
Details
- Page properties
-
- Title
-
... ... @@ -1,0 +1,1 @@ 1 +Setting up a Webservice connection for project exports - Parent
-
... ... @@ -1,0 +1,1 @@ 1 +Implementatie dcoumentatie.WebHome - Content
-
... ... @@ -1,0 +1,325 @@ 1 +(% class="jumbotron" %) 2 +((( 3 +(% class="container" %) 4 +((( 5 +To connect with the TerraIndex database to retreive projects from or upload new projects, you can connect to a webservice. This webservice provides Exports and enables these export with changes to be uploaded again. 6 + 7 +There are two steps to consider, it’s possible to request an exact projectcode export or you could request all changed projects from a timestamp. This last option is an additional Webservice call that is very easy to use. It will tell you what Project to download because they have changes since a timestamp. This Timestamp could be your last donwload moment. 8 +))) 9 +))) 10 + 11 +(% class="row" %) 12 +((( 13 +(% class="col-xs-12 col-sm-8" %) 14 +((( 15 +== 1. Retreive all changed project from TerraIndex == 16 + 17 +To retreive all changed project from the TerraIndex database since a specific timestamp, there is a webservice call you can do. This will return all project rows that have changes since the timestamp you send within the request. 18 +This way you only download projects that have changes, and it will not request project that are not needed, so it won’t keep our servers busy with exports that are not necessary. 19 + 20 +To start connecting this webservice, you should use this URL: 21 +[[https:~~/~~/web.terraindex.com/DataWS/ITWDataRestService_V1_0/GetProjectsJSON>>url:https://web.terraindex.com/DataWS/ITWDataRestService_V1_0/GetProjectsJSON]] 22 + 23 +Fill the **Body **of a **POST **HTTP call with: 24 + 25 +{{code language="JSON" layout="LINENUMBERS"}} 26 +{ 27 + "Authorisation": { 28 + "Username": "username", 29 + "Password": "password", 30 + "Licensenumber": 123, 31 + "ApplicationCode": 12, 32 + "Language": "en" 33 + }, 34 + "LanguageCode": "en", 35 + "WebserviceVersion": 1, 36 + "SearchFilter": "", 37 + "ArchiveID": 0, 38 + "PageSize": 30, 39 + "LastRowNR": 0, 40 + "OrderPreviewBy": 2, 41 + "FromDateContentLastChanged": "2019-04-01T00:00:00" 42 +} 43 +{{/code}} 44 + 45 + 46 +Set the correct values for: 47 + 48 +* (% class="mark" %)username(%%); as the username in TerraIndex 49 +* (% class="mark" %)password(%%); as the username in TerraIndex 50 +* (% class="mark" %)LicenseNumber(%%); as your companies license number 51 +* (% class="mark" %)ApplicationCode(%%); as provided by TerraIndex to you, if not provided, request one at: service@terraindex.com 52 +* (% class="mark" %)PageSize (%%)is in the example set to 30, it will return max 30 projects if possible. This can be upgraded to more records, but it will take longer. 53 +* (% class="mark" %)FromDateContentLastChanged(%%); set the correct timestamp of your last call, it will return all projects that have been changed since that timestamp. 54 +* (% class="mark" %)SearchFilter(%%); set a part of the projectcode in this field and it will search for projectcodes with this specific text part in it. It will add wildcars in front and at the end of the searchfilter automatically. So not needed to provide. The searchfilter will be applied on three columns: Project Code, Project Name and Project location City name. 55 +* (% class="mark" %)LastRowNR(%%); fill default with zero/'0'. If your project isn’t in the first page of 30, you could use this field for lazy loading. Call the webservice with in the request the LastRowNR = 30, and you will receive project rows 31 t/m 60 (when the pagesize is 30). 56 + 57 +Fill the header with: 58 + 59 +{{code language="none"}} 60 +application/json 61 +{{/code}} 62 + 63 + 64 +You will receive a reponse like this: 65 + 66 +{{code language="JSON" layout="LINENUMBERS"}} 67 +[ 68 + { 69 + "PrID": 242, 70 + "PrCode": "2018-010-DEMO", 71 + "PrName": "TU Delft, the Netherlands", 72 + "PrTypeCode": null, 73 + "PrLocName": null, 74 + "PrLocCity": null, 75 + "PrLeaderCode": "Consult", 76 + "PrConsultancyFirm": "TerraIndex", 77 + "PrFieldworkFirm": "TerraIndex", 78 + "PrPrincipalName": null, 79 + "PrDateLastChanged": "2018-08-31T11:12:50.45", 80 + "RowNumber": 1, 81 + "Uitwissel": 0, 82 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 83 + }, 84 + { 85 + "PrID": 241, 86 + "PrCode": "2018-009-DEMO", 87 + "PrName": "TU Delft, the Netherlands", 88 + "PrTypeCode": null, 89 + "PrLocName": null, 90 + "PrLocCity": null, 91 + "PrLeaderCode": "Consult", 92 + "PrConsultancyFirm": "TerraIndex", 93 + "PrFieldworkFirm": "TerraIndex", 94 + "PrPrincipalName": null, 95 + "PrDateLastChanged": "2018-08-31T11:12:48.603", 96 + "RowNumber": 2, 97 + "Uitwissel": 0, 98 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 99 + }, 100 + { 101 + "PrID": 240, 102 + "PrCode": "2018-008-DEMO", 103 + "PrName": "TU Delft, the Netherlands", 104 + "PrTypeCode": null, 105 + "PrLocName": null, 106 + "PrLocCity": null, 107 + "PrLeaderCode": "Consult", 108 + "PrConsultancyFirm": "TerraIndex", 109 + "PrFieldworkFirm": "TerraIndex", 110 + "PrPrincipalName": null, 111 + "PrDateLastChanged": "2018-08-31T11:12:46.46", 112 + "RowNumber": 3, 113 + "Uitwissel": 0, 114 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 115 + }, 116 + { 117 + "PrID": 239, 118 + "PrCode": "2018-007-DEMO", 119 + "PrName": "TU Delft, the Netherlands", 120 + "PrTypeCode": null, 121 + "PrLocName": null, 122 + "PrLocCity": null, 123 + "PrLeaderCode": "Consult", 124 + "PrConsultancyFirm": "TerraIndex", 125 + "PrFieldworkFirm": "TerraIndex", 126 + "PrPrincipalName": null, 127 + "PrDateLastChanged": "2018-08-31T11:12:44.853", 128 + "RowNumber": 4, 129 + "Uitwissel": 0, 130 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 131 + }, 132 + { 133 + "PrID": 238, 134 + "PrCode": "2018-006-DEMO", 135 + "PrName": "TU Delft, the Netherlands", 136 + "PrTypeCode": null, 137 + "PrLocName": null, 138 + "PrLocCity": null, 139 + "PrLeaderCode": "Consult", 140 + "PrConsultancyFirm": "TerraIndex", 141 + "PrFieldworkFirm": "TerraIndex", 142 + "PrPrincipalName": null, 143 + "PrDateLastChanged": "2018-08-31T11:12:43.033", 144 + "RowNumber": 5, 145 + "Uitwissel": 0, 146 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 147 + }, 148 + { 149 + "PrID": 237, 150 + "PrCode": "2018-005-DEMO", 151 + "PrName": "TU Delft, the Netherlands", 152 + "PrTypeCode": null, 153 + "PrLocName": null, 154 + "PrLocCity": null, 155 + "PrLeaderCode": "Consult", 156 + "PrConsultancyFirm": "TerraIndex", 157 + "PrFieldworkFirm": "TerraIndex", 158 + "PrPrincipalName": null, 159 + "PrDateLastChanged": "2018-08-31T11:12:41.273", 160 + "RowNumber": 6, 161 + "Uitwissel": 0, 162 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 163 + }, 164 + { 165 + "PrID": 236, 166 + "PrCode": "2018-004-DEMO", 167 + "PrName": "TU Delft, the Netherlands", 168 + "PrTypeCode": null, 169 + "PrLocName": null, 170 + "PrLocCity": null, 171 + "PrLeaderCode": "Consult", 172 + "PrConsultancyFirm": "TerraIndex", 173 + "PrFieldworkFirm": "TerraIndex", 174 + "PrPrincipalName": null, 175 + "PrDateLastChanged": "2018-08-31T11:12:39.57", 176 + "RowNumber": 7, 177 + "Uitwissel": 0, 178 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 179 + }, 180 + { 181 + "PrID": 235, 182 + "PrCode": "2018-003-DEMO", 183 + "PrName": "TU Delft, the Netherlands", 184 + "PrTypeCode": null, 185 + "PrLocName": null, 186 + "PrLocCity": null, 187 + "PrLeaderCode": "Consult", 188 + "PrConsultancyFirm": "TerraIndex", 189 + "PrFieldworkFirm": "TerraIndex", 190 + "PrPrincipalName": null, 191 + "PrDateLastChanged": "2018-08-31T11:12:37.77", 192 + "RowNumber": 8, 193 + "Uitwissel": 0, 194 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 195 + }, 196 + { 197 + "PrID": 234, 198 + "PrCode": "2018-002-DEMO", 199 + "PrName": "TU Delft, the Netherlands", 200 + "PrTypeCode": null, 201 + "PrLocName": null, 202 + "PrLocCity": null, 203 + "PrLeaderCode": "Consult", 204 + "PrConsultancyFirm": "TerraIndex", 205 + "PrFieldworkFirm": "TerraIndex", 206 + "PrPrincipalName": null, 207 + "PrDateLastChanged": "2018-08-31T11:12:36.02", 208 + "RowNumber": 9, 209 + "Uitwissel": 0, 210 + "geometryWKT_WGS84": "POINT (6.1000890695634133 52.58846240818189)" 211 + }, 212 + { 213 + "PrID": 233, 214 + "PrCode": "2018-001-DEMO", 215 + "PrName": "TU Delft, the Netherlands", 216 + "PrTypeCode": null, 217 + "PrLocName": null, 218 + "PrLocCity": null, 219 + "PrLeaderCode": "Consult", 220 + "PrConsultancyFirm": "TerraIndex", 221 + "PrFieldworkFirm": "TerraIndex", 222 + "PrPrincipalName": null, 223 + "PrDateLastChanged": "2018-08-31T11:12:30.037", 224 + "RowNumber": 10, 225 + "Uitwissel": 0, 226 + "geometryWKT_WGS84": "POINT (4.3694882989839243 52.00722295311251)" 227 + } 228 +] 229 +{{/code}} 230 + 231 +The **PrID **can be used as **ProjectID **in the next call to get the actual project xml file export. 232 + 233 + 234 +== 2. Retreive the project export from TerraIndex == 235 + 236 +To request the export from TerraIndex we have a SOAP webservice. This webservice is called the ExportService, and it will provide a full project in TerraIndex Format. 237 +The format of the projectfile is documentated here: [[Documentation TerraIndex Export format - dsFieldProject.xsd>>Implementatie dcoumentatie.Documentation TerraIndex Export format - dsFieldProject\.xsd.WebHome]] 238 + 239 +To start connecting this webservice, you should use this URL of the Import Export Webservice: 240 +[[https:~~/~~/web.terraindex.com/DataWS/ITWImportExportServiceASMX_V1_0.asmx>>url:https://web.terraindex.com/DataWS/ITWImportExportServiceASMX_V1_0.asmx]] 241 + 242 +With this URL many IDE’s can create a proxy for you, just by providing the URL. Once this proxy is created, you will have a few classes looking like the call in the image below. 243 + 244 +[[image:image-20200108-123431.png]] 245 + 246 +The image is created with WebserviceStudio to visualise the SOAP call to send to the webservice. 247 +This is the explanation of each number inside the image~: 248 +1; The endpoint URL 249 +2; Create the proxy based on the WSDL 250 +3; Select the export call to see what it looks like 251 +4; Fill the username + password of the TerraIndex user* to call the webservice with. 252 +Also fill the license and the applicationCode. //(These two fields can be requested at the TerraIndex Servicedesk.)// 253 +5; Fill the **ExportType **'**Export_FIELD_XML_v1_0_0**’. This export corresponds with dsFieldProject.xsd and is the best XML to connect TI with. 254 +Create at least create 2 parameters as in the image. Beacause 2 parameters are needed. 255 +6; Fill the parameter with the FileName. 256 +7; Fill the parameter with **projectID**. Instead of ‘ProjectID' it’s also possible to fill the parameter ‘ProjectCode'. 257 +8; Send the request and wait for the reponse. In response field ‘ResultCode’ should be 'SUCCES’ when it all went OK. If not it will tell what went wrong. 258 +9; The response field 'Filecontent’is filled if it went OK, and it contains XML you can serialize. 259 +\\*Username and password are known by each TI user and the application manager of your company can create new usernames. 260 + 261 +**EXAMPLE CODE** 262 + 263 +ExportType: 264 +ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.ExportType.Export_Field_XML_v1_0_0; 265 + 266 +{{code language="C#" layout="LINENUMBERS"}} 267 +[TestMethod] public void Export_FieldXml_Local() { 268 + ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.TWImportExportServiceASMX_V1_0SoapClient client = new ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.TWImportExportServiceASMX_V1_0SoapClient(); 269 + ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.ExportRequest req = new ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.ExportRequest() { 270 + AuthorisationRequest = new ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.AuthorisationRequest() { 271 + Username = "xxxxx", Password = "xxxxx", Licensenumber = "x" 272 + }, LanguageCode = "eng", WebserviceVersion = "1.0", 273 + }; 274 + req.TypeOfExport = ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.ExportType.Export_Field_XML_v1_0_0; 275 + req.UseZipStream = true; 276 + List < ExportParameter > paramsList = new List < ExportParameter > (); 277 + paramsList.Add(new ExportParameter() { 278 + ParameterType = ExportParameterType.FileName, StringValue = "Export" 279 + }); 280 + paramsList.Add(new ExportParameter() { 281 + ParameterType = ExportParameterType.ProjectID, FloatValue = 917 282 + }); 283 + req.Parameters = paramsList; 284 + try { 285 + var result = client.Export(req); 286 + if (result != null) { 287 + if (result.ResultCode == ITWorks.TerraIndex.ImportExportTest.ImportExportServiceTest.ExportResultCode.Export_Succes) { 288 + System.IO.File.WriteAllText(@ "C:\Temp\ExportTestField.xml", result.Files[0].FileContent); 289 + System.IO.File.WriteAllText(@ "C:\Temp\ExportTestField.html", result.ExportLog); 290 + } else { 291 + throw new Exception(result.ResultCode.ToString() + " - " + result.ResultMessage); 292 + } 293 + } 294 + } catch (Exception e) { 295 + throw e; 296 + } 297 +} 298 +{{/code}} 299 + 300 +Example call 301 + 302 +<soapenv:Envelope xmlns:soapenv="http:~/~/schemas.xmlsoap.org/soap/envelope/" xmlns:itw="https:~/~/wsterraindex.terraindex.com/ITWorks.TerraIndex/"> <soapenv:Header/> <soapenv:Body> <itw:Export> <itw:request> <itw:AuthorisationRequest> <itw:Username>USERNAME</itw:Username> <itw:Password>PASSWORD</itw:Password> <itw:Licensenumber>LICENSE</itw:Licensenumber> <itw:ApplicationCode>APPCODE</itw:ApplicationCode> </itw:AuthorisationRequest> <itw:WebserviceVersion>1.0</itw:WebserviceVersion> <itw:LanguageCode>nld</itw:LanguageCode> <itw:UseCompression>true</itw:UseCompression> <itw:TypeOfExport>Export_FIELD_XML_v1_0_0</itw:TypeOfExport> <itw:Parameters> <itw:ExportParameter> <itw:ParameterType>FileName</itw:ParameterType> <itw:StringValue>Export</itw:StringValue> </itw:ExportParameter> <itw:ExportParameter> <itw:ParameterType>projectID</itw:ParameterType> <itw:FloatValue>917</itw:FloatValue> </itw:ExportParameter> ~-~-~-~-- <itw:ExportParameter> <itw:ParameterType>ProjectCode</itw:ParameterType> <itw:StringValue>202020</itw:StringValue> </itw:ExportParameter> ~-~-~-~- </itw:Parameters> <itw:LogFormat>XML</itw:LogFormat> <itw:UseZipStream>true</itw:UseZipStream> </itw:request> </itw:Export> </soapenv:Body></soapenv:Envelope> 303 + 304 +Example response: 305 + 306 +<soap:Envelope xmlns:soap="http:~/~/schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http:~/~/www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:~/~/www.w3.org/2001/XMLSchema"> <soap:Body> <ExportResponse xmlns="https:~/~/wsterraindex.terraindex.com/ITWorks.TerraIndex/"> <ExportResult> <ResultCode>Export_Succes</ResultCode> <TypeOfExport>Export_TI_v1_0_0</TypeOfExport> <Files> <File> <FileName>917.xml</FileName> <TypeOfFile>Field_XML_Compressed</TypeOfFile> <FileContent>H4sIAAAAAAAEAFWRuZaqQABEP4hAGnAGggm6odlREFkkA2WRRRCBxv76YeYF70yFVXUqqBvgl4KQBzcZ8Aho2iqxdhxDSPDmNGjz9Z/weMa8/aimTAUeF42KgxRRzd3YaGfdXtvECEBvWafSNwf+dOsjVXpZUzs+lw/p3gBhuXQ5S8T3MdIBlxUQEam+LOVgVo4D8w4c2E8pEgp3haewcpQx1KQ41Z8DKWv16seaDLp3GABLuIKXK5Ucq31EfSXm0172YvG87hcbayYGdB1t0CbcuueLpU5UawgHSitFr564Aet5LeegD0/tocZDTvuIuc9Ja0tDFt/m7kZnomdVJc+2SkqBGXmTdPiiPzJa2OznLkX67p2PCNM7iHU11QbIilVkMDBVd0J8gK4Ams6ycJQagnww/SaxuiZ/EdS6DZ0cf17BIhUq87CSkQvxat/2dEG1xu94BoaeT7C8XR38/C1DZbpygwfW+gk8Z+Mgm3DDhAj8r6099Rj+5YNs5F3+5R5EUPmd6+EvYvj1Dd8o9lLwAQAA</FileContent> </File> <File> <FileName>ProjectInfo.xml</FileName> <TypeOfFile>Field_XML_Compressed</TypeOfFile> <FileContent>H4sIAAAAAAAEAI1Qy5JDQAD8IAdj1/M4hJggDBnEbTxDsV7BxtdvNqm9bx+6urq7+tBEnw+qiuETCLrcTlst9Pajtb0soj7JeynztNIubHK9XZJOXoojN8dXpaxltOlOwAZzK033Edx7HWT1ZFVYNljpsT7iCVDbxb5tlmw3GhV7vgty5jqiGzWSYEvL7RCIQifzchIoMJnHz+fO17C4JAwA0hNRb247SR1ba8OunCV4ralK1rjwBhUAJ2pihopeuxqXIUecePETLhx8zT6IZX5GzafC0XHTrauISeyIM2+2g1PzEymRZrTtglKlsFYHXDKmoYTp+jw1zNDyAFZOTN9XHkuNGmU33905uipWMTsjm2ccm6+bxqk2xAjCf/z3BwS1j+qVqTjrlDGJziCIhC59CHwafeNgI8d3U4cQQ+VXSdXb+QGLuAuvrAEAAA==</FileContent> </File> </Files> </ExportResult> </ExportResponse> </soap:Body></soap:Envelope> 307 + 308 + 309 +== Zip Stream class == 310 + 311 +If needed, this is the Zip Stream class you can use to extract the zipstream as used above: 312 + 313 +~/~// <summary> ~/~// Helper class for compress en decompress of file data ~/~// </summary> public static class ZipStreamHelper { #region Compress and encode ~/~// <summary> ~/~// Comprimeer een string en geeft deze terug in Base64 string. ~/~// </summary> ~/~// <param name="content">filecontent</param> ~/~// <returns>gecomprimeerde string</returns> public static string CompressToBase64String(string content) { ~/~/string to byte[] byte[] contentArray = stringToByteArray(content); ~/~/ Compress byte[] compressed = Compress(contentArray); return base64_encode(compressed); } ~/~// <summary> ~/~// Zet een string om naar een ByteArray ~/~// </summary> ~/~// <param name="content">filecontent</param> ~/~// <returns>ByteArray</returns> public static byte[] stringToByteArray(string content) { System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); return encoding.GetBytes(content); } ~/~// <summary> ~/~// comprimeer een ByteArray ~/~// </summary> ~/~// <param name="data">filedata als ByteArray</param> ~/~// <returns>gecomprimeerde ByteArray</returns> public static byte[] Compress(byte[] data) { using (var compressedStream = new MemoryStream()) using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress)) { zipStream.Write(data, 0, data.Length); zipStream.Close(); return compressedStream.ToArray(); } } ~/~// <summary> ~/~// Zet een ByteArray om naar een Base64 string ~/~// </summary> ~/~// <param name="data">gecomprimeerde ByteArray</param> ~/~// <returns>Base 64 string</returns> public static string base64_encode(byte[] data) { if (data == null) return string.Empty; return Convert.ToBase64String(data); } ~/~// <summary> ~/~// Zet een string om naar een Base64 string ~/~// </summary> ~/~// <param name="data">string</param> ~/~// <returns>Base 64 string</returns> public static string string_base64_encode(string data) { if (string.IsNullOrEmpty(data)) return string.Empty; ~/~/string to byte[] byte[] contentArray = stringToByteArray(data); return base64_encode(contentArray); } #endregion #region Decompress and decode ~/~/ Decode and decompress ~/~// <summary> ~/~// Decomprimeer een Base64 string naar een string ~/~// </summary> ~/~// <param name="contentBase64">GZIP Base64 string</param> ~/~// <returns>string</returns> public static string DecompressBase64StringToString(string contentBase64) { ~/~/ Decompress byte[] decoded = base64_decode(contentBase64); byte[] decompressed = Decompress(decoded); return byteArrayTostring(decompressed); } ~/~// <summary> ~/~// Zet een ByteArray om in een normale string ~/~// </summary> ~/~// <param name="data">ByteArray</param> ~/~// <returns>string</returns> public static string byteArrayTostring(byte[] data) { System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); return enc.GetString(data); } ~/~// <summary> ~/~// Zet een Base64 string om naar een ByteArray ~/~// </summary> ~/~// <param name="encodedData">Base64 string</param> ~/~// <returns>gecomprimeerde ByteArray</returns> public static byte[] base64_decode(string encodedData) { byte[] encodedDataAsBytes = Convert.FromBase64String(encodedData); return encodedDataAsBytes; } ~/~// <summary> ~/~// Zet een gecomprimeerde ByteArray om in een ByteArray ~/~// </summary> ~/~// <param name="data">gecomprimeerde ByteArray</param> ~/~// <returns>ByteArray (gedecomprimeerd)</returns> public static byte[] Decompress(byte[] data) { using (var compressedStream = new MemoryStream(data)) using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) using (var resultStream = new MemoryStream()) { var buffer = new byte[4096]; int read; while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) { resultStream.Write(buffer, 0, read); } return resultStream.ToArray(); } } #endregion } 314 +))) 315 + 316 + 317 +(% class="col-xs-12 col-sm-4" %) 318 +((( 319 +{{box title="**Contents**"}} 320 +{{toc/}} 321 +{{/box}} 322 + 323 + 324 +))) 325 +)))
- image1.jpg
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.RoelofZwaan - Size
-
... ... @@ -1,0 +1,1 @@ 1 +43.8 KB - Content
- image2.jpg
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.RoelofZwaan - Size
-
... ... @@ -1,0 +1,1 @@ 1 +40.0 KB - Content