FETPAPI 0.6.0.0
This project provides C++ classes which facilitate the developement of ETP1.2 clients and servers.
Loading...
Searching...
No Matches
FesapiHdfProxy.h
1/*-----------------------------------------------------------------------
2Licensed to the Apache Software Foundation (ASF) under one
3or more contributor license agreements. See the NOTICE file
4distributed with this work for additional information
5regarding copyright ownership. The ASF licenses this file
6to you under the Apache License, Version 2.0 (the
7"License"; you may not use this file except in compliance
8with the License. You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12Unless required by applicable law or agreed to in writing,
13software distributed under the License is distributed on an
14"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15KIND, either express or implied. See the License for the
16specific language governing permissions and limitations
17under the License.
18-----------------------------------------------------------------------*/
19#pragma once
20
21#include <set>
22#include <type_traits>
23
24#include <fesapi/common/HdfProxyFactory.h>
25
26#include "../AbstractSession.h"
27#include "../protocolHandlers/GetFullDataArrayHandlers.h"
28
29namespace ETP_NS
30{
31 class FETPAPI_DLL_IMPORT_OR_EXPORT FesapiHdfProxy : public EML2_NS::AbstractHdfProxy
32 {
33 public:
34
38 FesapiHdfProxy(AbstractSession* session, COMMON_NS::DataObjectRepository * repo, const std::string & guid, const std::string & title, const std::string & packageDirAbsolutePath, const std::string & externalFilePath, COMMON_NS::DataObjectRepository::openingMode hdfPermissionAccess) :
39 EML2_NS::AbstractHdfProxy(packageDirAbsolutePath, externalFilePath, hdfPermissionAccess), session_(session), compressionLevel(0) {
40 xmlNs_ = repo->getDefaultEmlVersion() == COMMON_NS::DataObjectRepository::EnergisticsStandard::EML2_3 ? "eml23" : "eml20";
41 initGsoapProxy(repo, guid, title, 20);
42 }
43
47 FesapiHdfProxy(AbstractSession* session, gsoap_resqml2_0_1::_eml20__EpcExternalPartReference* fromGsoap) :
48 EML2_NS::AbstractHdfProxy(fromGsoap), session_(session), compressionLevel(0), xmlNs_("eml20") {}
49
53 FesapiHdfProxy(AbstractSession* session, const COMMON_NS::DataObjectReference& dor) :
54 EML2_NS::AbstractHdfProxy(dor), session_(session), compressionLevel(0) {
55 std::string ct = dor.getContentType();
56 if (ct.find("2.0") != std::string::npos) {
57 xmlNs_ = "eml20";
58 }
59 else if (ct.find("2.3") != std::string::npos) {
60 xmlNs_ = "eml23";
61 }
62 else {
63 throw std::invalid_argument("The HDF Proxy DataObjectReference does not look to be eml20 or eml23 neither : " + ct);
64 }
65 }
66
67
71 ~FesapiHdfProxy() = default;
72
73 AbstractSession* getSession() { return session_; }
74
75 void setSession(AbstractSession* session) { session_ = session; }
76
80 void open() final {}
81
85 bool isOpened() const final { return session_ != nullptr && !session_->isWebSocketSessionClosed(); }
86
90 void close() final {}
91
92 /*
93 * Get the used (native) datatype in a dataset
94 */
95 COMMON_NS::AbstractObject::numericalDatatypeEnum getNumericalDatatype(const std::string & groupName) final;
96
101 int getHdfDatatypeClassInDataset(const std::string & datasetName) final;
102
115 void writeItemizedListOfList(const std::string & groupName,
116 const std::string & name,
117 COMMON_NS::AbstractObject::numericalDatatypeEnum cumulativeLengthDatatype,
118 const void * cumulativeLength,
119 uint64_t cumulativeLengthSize,
120 COMMON_NS::AbstractObject::numericalDatatypeEnum elementsDatatype,
121 const void * elements,
122 uint64_t elementsSize) final;
123
128 std::vector<uint32_t> getElementCountPerDimension(const std::string & datasetName) final;
129
134 void setCompressionLevel(unsigned int newCompressionLevel) final { if (newCompressionLevel > 9) compressionLevel = 9; else compressionLevel = newCompressionLevel; }
135
146 void writeArrayNd(const std::string & groupName,
147 const std::string & name,
148 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
149 const void * values,
150 const uint64_t * numValuesInEachDimension,
151 unsigned int numDimensions) final;
152
163 const std::string& groupName,
164 const std::string& name,
165 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
166 const uint64_t* numValuesInEachDimension,
167 unsigned int numDimensions) final;
168
180 const std::string& groupName,
181 const std::string& name,
182 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
183 const void* values,
184 const uint64_t* numValuesInEachDimension,
185 const uint64_t* offsetValuesInEachDimension,
186 unsigned int numDimensions) final;
187
199 std::set<int64_t> async_writeArrayNdSlab(
200 const std::string& groupName,
201 const std::string& name,
202 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
203 const void* values,
204 const uint64_t* numValuesInEachDimension,
205 const uint64_t* offsetValuesInEachDimension,
206 unsigned int numDimensions);
207
211 void writeGroupAttributes(const std::string&,
212 const std::vector<std::string>&,
213 const std::vector<std::string>&) final {
214 throw std::logic_error("Group attributes are not supported in ETP1.2");
215 }
216
220 void writeGroupAttribute(const std::string&,
221 const std::string&,
222 const std::vector<std::string>&) final {
223 throw std::logic_error("Group attributes are not supported in ETP1.2");
224 }
225
229 void writeGroupAttributes(const std::string&,
230 const std::vector<std::string>&,
231 const std::vector<double>&) {
232 throw std::logic_error("Group attributes are not supported in ETP1.2");
233 }
234
238 void writeGroupAttributes(const std::string&,
239 const std::vector<std::string>&,
240 const std::vector<int>&) final {
241 throw std::logic_error("Group attributes are not supported in ETP1.2");
242 }
243
247 void writeDatasetAttributes(const std::string&,
248 const std::vector<std::string>&,
249 const std::vector<std::string>&) final {
250 throw std::logic_error("Dataset attributes are not supported in ETP1.2");
251 }
252
256 void writeDatasetAttribute(const std::string&,
257 const std::string&,
258 const std::vector<std::string>&) final {
259 throw std::logic_error("Dataset attributes are not supported in ETP1.2");
260 }
261
265 void writeDatasetAttributes(const std::string&,
266 const std::vector<std::string>&,
267 const std::vector<double>&) final {
268 throw std::logic_error("Dataset attributes are not supported in ETP1.2");
269 }
270
274 void writeDatasetAttributes(const std::string&,
275 const std::vector<std::string>&,
276 const std::vector<int>&) final {
277 throw std::logic_error("Dataset attributes are not supported in ETP1.2");
278 }
279
280 std::string readStringAttribute(const std::string&,
281 const std::string&) const final {
282 throw std::logic_error("Attributes are not supported in ETP1.2");
283 }
284
285 std::vector<std::string> readStringArrayAttribute(const std::string&,
286 const std::string&) const final {
287 throw std::logic_error("Attributes are not supported in ETP1.2");
288 }
289
290 double readDoubleAttribute(const std::string&,
291 const std::string&) const final {
292 throw std::logic_error("Attributes are not supported in ETP1.2");
293 }
294
295 int64_t readInt64Attribute(const std::string&,
296 const std::string&) const final {
297 throw std::logic_error("Attributes are not supported in ETP1.2");
298 }
299
305 void readArrayNdOfDoubleValues(const std::string & datasetName, double* values) final { readArrayNdOfValues(datasetName, values); }
306
316 const std::string & datasetName,
317 double* values,
318 uint64_t const * numValuesInEachDimension,
319 uint64_t const * offsetInEachDimension,
320 unsigned int numDimensions) final;
321
333 const std::string & datasetName, double* values,
334 uint64_t const * blockCountPerDimension,
335 uint64_t const * offsetInEachDimension,
336 uint64_t const * strideInEachDimension,
337 uint64_t const * blockSizeInEachDimension,
338 unsigned int numDimensions) final;
339
340 void selectArrayNdOfValues(
341 const std::string & datasetName,
342 uint64_t const * blockCountPerDimension,
343 uint64_t const * offsetInEachDimension,
344 uint64_t const * strideInEachDimension,
345 uint64_t const * blockSizeInEachDimension,
346 unsigned int numDimensions,
347 bool newSelection,
348 hdf5_hid_t & dataset,
349 hdf5_hid_t & filespace) final;
350
359 hdf5_hid_t dataset,
360 hdf5_hid_t filespace,
361 void* values,
362 uint64_t slabSize) final;
363
369 void readArrayNdOfFloatValues(const std::string & datasetName, float* values) final { readArrayNdOfValues(datasetName, values); }
370
380 const std::string & datasetName,
381 float* values,
382 uint64_t const * numValuesInEachDimension,
383 uint64_t const * offsetInEachDimension,
384 unsigned int numDimensions) final;
385
391 void readArrayNdOfInt64Values(const std::string & datasetName, int64_t* values) final { readArrayNdOfValues(datasetName, values); }
392
402 const std::string & datasetName,
403 int64_t* values,
404 uint64_t const * numValuesInEachDimension,
405 uint64_t const * offsetInEachDimension,
406 unsigned int numDimensions) final;
407
413 void readArrayNdOfUInt64Values(const std::string & datasetName, uint64_t* values) final { readArrayNdOfValues(datasetName, values); }
414
420 void readArrayNdOfIntValues(const std::string & datasetName, int* values) final { readArrayNdOfValues(datasetName, values); }
421
431 const std::string & datasetName,
432 int* values,
433 uint64_t const * numValuesInEachDimension,
434 uint64_t const * offsetInEachDimension,
435 unsigned int numDimensions
436 ) final;
437
443 void readArrayNdOfUIntValues(const std::string & datasetName, unsigned int* values) final { readArrayNdOfValues(datasetName, values); }
444
451 void readArrayNdOfShortValues(const std::string & datasetName, short* values) final { readArrayNdOfValues(datasetName, values); }
452
458 void readArrayNdOfUShortValues(const std::string & datasetName, unsigned short* values) final { readArrayNdOfValues(datasetName, values); }
459
465 void readArrayNdOfInt8Values(const std::string & datasetName, int8_t* values) final { readArrayNdOfValues(datasetName, values); }
466
471 void readArrayNdOfUInt8Values(const std::string & datasetName, uint8_t* values) final { readArrayNdOfValues(datasetName, values); }
472
476 bool exist(const std::string & absolutePathInHdfFile) const final;
477
482 bool isCompressed(const std::string &) final { return false; }
483
489 std::vector<uint32_t> getElementCountPerChunkDimension(const std::string&) final { return {}; }
490
494 std::string getXmlNamespace() const { return xmlNs_; }
495
496 private:
497 AbstractSession* session_;
498 unsigned int compressionLevel;
499 std::string xmlNs_;
500 size_t maxArraySize_{ 12000000 }; // Bytes
501
502 Energistics::Etp::v12::Datatypes::DataArrayTypes::DataArrayIdentifier buildDataArrayIdentifier(const std::string & datasetName) const;
503 std::shared_ptr<Energistics::Etp::v12::Protocol::DataArray::GetDataArrays> buildGetDataArraysMessage(const std::string & datasetName) const;
504 std::shared_ptr<Energistics::Etp::v12::Protocol::DataArray::GetDataArrayMetadata> buildGetDataArrayMetadataMessage(const std::string & datasetName) const;
505
506 Energistics::Etp::v12::Datatypes::DataArrayTypes::DataArrayMetadata getDataArrayMetadata(const std::string & datasetName) const;
507
508 template<typename T> void readArrayNdOfValues(const std::string & datasetName, T* values)
509 {
510 // First get metadata about the data array
511 const Energistics::Etp::v12::Datatypes::DataArrayTypes::DataArrayMetadata daMetadata = getDataArrayMetadata(datasetName);
512 const size_t valueCount = std::accumulate(daMetadata.dimensions.begin(), daMetadata.dimensions.end(), 1, std::multiplies<int64_t>());
513
514 size_t valueSize = 1;
515 switch (daMetadata.transportArrayType) {
516 case Energistics::Etp::v12::Datatypes::AnyArrayType::bytes:
517 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfBoolean: break;
518 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfInt: valueSize = 6; break; // 25% more because of zig zag encoding worst case scenario
519 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfFloat: valueSize = 4; break;
520 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfLong: valueSize = 10; break; // 25% more because of zig zag encoding worst case scenario
521 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfDouble: valueSize = 8; break;
522 default: throw std::logic_error("Array of strings are not implemented yet");
523 }
524 const size_t wholeSize = valueCount * valueSize;
525
526 // maxAllowedDataArraySize is the maximum serialized size of the array (including avro extra longs for array blocks)
527 const size_t maxAllowedDataArraySize = session_->getMaxWebSocketMessagePayloadSize()
528 - sizeof(Energistics::Etp::v12::Datatypes::MessageHeader)
529 - (daMetadata.dimensions.size() * 2 + 1) * 8; // *2 because the array can contain a maximum of element count block, +1 for the length of the last block : https://avro.apache.org/docs/1.10.2/spec.html#binary_encode_complex
530
531 // Now get values of the data array
532 auto specializedHandler = std::make_shared<GetFullDataArrayHandlers<T>>(session_, values);
533 if (wholeSize + (valueCount + 1) * 8 <= maxAllowedDataArraySize) { // There can be valueCount array block and there is the length of the last array block
534 // Get all values at once
535 session_->sendWithSpecificHandlerAndBlock(
536 buildGetDataArraysMessage(datasetName),
537 specializedHandler,
538 0, 0x02);
539 }
540 else {
541 // Get all values using several data subarrays allowing more granular streaming
542 std::vector<int64_t> counts(daMetadata.dimensions.size(), 1);
543
544 // Compute the dimensions of the subArrays to get
545 size_t subArrayValueCount = 1;
546 for (int64_t dimIndex = daMetadata.dimensions.size() - 1; dimIndex >= 0; --dimIndex) {
547 int64_t maxCountOnDim = daMetadata.preferredSubarrayDimensions.empty()
548 ? daMetadata.dimensions[dimIndex]
549 : daMetadata.preferredSubarrayDimensions[dimIndex];
550 subArrayValueCount *= maxCountOnDim;
551 int64_t allowedCountOnDim = maxCountOnDim;
552 while (subArrayValueCount * valueSize + (subArrayValueCount + 1) * 8 > maxAllowedDataArraySize) {
553 subArrayValueCount /= allowedCountOnDim;
554 allowedCountOnDim /= 2;
555 subArrayValueCount *= allowedCountOnDim;
556 }
557 counts[dimIndex] = allowedCountOnDim;
558 if (allowedCountOnDim != maxCountOnDim) {
559 break;
560 }
561 }
562
563 // Build the message
564 auto msg = std::make_shared<Energistics::Etp::v12::Protocol::DataArray::GetDataSubarrays>();
565 size_t subArrayIndex = 0;
566 std::vector<int64_t> starts(daMetadata.dimensions.size(), 0);
567 std::vector<int64_t> currentCounts = counts;
568 bool hasParsedAllArray = false;
569 while (!hasParsedAllArray) {
570 std::string subArrayIndexStr = std::to_string(subArrayIndex);
571 msg->dataSubarrays[subArrayIndexStr].uid = buildDataArrayIdentifier(datasetName);
572 msg->dataSubarrays[subArrayIndexStr].counts = currentCounts;
573 msg->dataSubarrays[subArrayIndexStr].starts = starts;
574
575 // next sub array to get
576 ++subArrayIndex;
577 hasParsedAllArray = true;
578 for (int64_t dimIndex = daMetadata.dimensions.size() - 1; dimIndex >= 0; --dimIndex) {
579 if (starts[dimIndex] + currentCounts[dimIndex] < daMetadata.dimensions[dimIndex]) {
580 starts[dimIndex] += currentCounts[dimIndex];
581 if (starts[dimIndex] + currentCounts[dimIndex] > daMetadata.dimensions[dimIndex]) {
582 currentCounts[dimIndex] = daMetadata.dimensions[dimIndex] - starts[dimIndex];
583 }
584
585 for (size_t dimIndex2 = dimIndex + 1; dimIndex2 < daMetadata.dimensions.size(); ++dimIndex2) {
586 starts[dimIndex2] = 0;
587 currentCounts[dimIndex2] = counts[dimIndex2];
588 }
589 hasParsedAllArray = false;
590 break;
591 }
592 }
593
594 specializedHandler->setDataSubarrays(subArrayIndexStr, msg->dataSubarrays[subArrayIndexStr]);
595 }
596
597 // Send message
598 session_->sendWithSpecificHandlerAndBlock(
599 msg,
600 specializedHandler,
601 0, 0x02);
602 }
603 }
604 };
605
606 class FETPAPI_DLL_IMPORT_OR_EXPORT FesapiHdfProxyFactory : public COMMON_NS::HdfProxyFactory
607 {
608 public:
609 FesapiHdfProxyFactory(AbstractSession* session) : session_(session) {}
610
614 EML2_NS::AbstractHdfProxy* make(const COMMON_NS::DataObjectReference& dor) {
615 FesapiHdfProxy* result = new FesapiHdfProxy(session_, dor);
616 return result;
617 }
618
622 EML2_NS::AbstractHdfProxy* make(gsoap_resqml2_0_1::_eml20__EpcExternalPartReference* fromGsoap) {
623 FesapiHdfProxy* result = new FesapiHdfProxy(session_, fromGsoap);
624 return result;
625 }
626
627 EML2_NS::AbstractHdfProxy* make(COMMON_NS::DataObjectRepository * repo, const std::string & guid, const std::string & title,
628 const std::string & packageDirAbsolutePath, const std::string & externalFilePath,
629 COMMON_NS::DataObjectRepository::openingMode hdfPermissionAccess = COMMON_NS::DataObjectRepository::openingMode::READ_ONLY) {
630 FesapiHdfProxy* result = new FesapiHdfProxy(session_, repo, guid, title, packageDirAbsolutePath, externalFilePath, hdfPermissionAccess);
631 return result;
632 }
633
634 private:
635 AbstractSession* session_;
636 };
637}
Definition AbstractSession.h:52
EML2_NS::AbstractHdfProxy * make(const COMMON_NS::DataObjectReference &dor)
Definition FesapiHdfProxy.h:614
EML2_NS::AbstractHdfProxy * make(gsoap_resqml2_0_1::_eml20__EpcExternalPartReference *fromGsoap)
Definition FesapiHdfProxy.h:622
Definition FesapiHdfProxy.h:32
void writeGroupAttribute(const std::string &, const std::string &, const std::vector< std::string > &) final
Definition FesapiHdfProxy.h:220
void writeDatasetAttributes(const std::string &, const std::vector< std::string > &, const std::vector< int > &) final
Definition FesapiHdfProxy.h:274
void setCompressionLevel(unsigned int newCompressionLevel) final
Definition FesapiHdfProxy.h:134
void readArrayNdOfUInt64Values(const std::string &datasetName, uint64_t *values) final
Definition FesapiHdfProxy.h:413
void readArrayNdOfInt64Values(const std::string &datasetName, int64_t *values) final
Definition FesapiHdfProxy.h:391
void open() final
Definition FesapiHdfProxy.h:80
std::vector< uint32_t > getElementCountPerChunkDimension(const std::string &) final
Definition FesapiHdfProxy.h:489
void readArrayNdOfIntValues(const std::string &datasetName, int *values, uint64_t const *numValuesInEachDimension, uint64_t const *offsetInEachDimension, unsigned int numDimensions) final
void writeGroupAttributes(const std::string &, const std::vector< std::string > &, const std::vector< double > &)
Definition FesapiHdfProxy.h:229
int getHdfDatatypeClassInDataset(const std::string &datasetName) final
void readArrayNdOfUShortValues(const std::string &datasetName, unsigned short *values) final
Definition FesapiHdfProxy.h:458
void readArrayNdOfDoubleValues(hdf5_hid_t dataset, hdf5_hid_t filespace, void *values, uint64_t slabSize) final
void writeArrayNdSlab(const std::string &groupName, const std::string &name, COMMON_NS::AbstractObject::numericalDatatypeEnum datatype, const void *values, const uint64_t *numValuesInEachDimension, const uint64_t *offsetValuesInEachDimension, unsigned int numDimensions) final
void writeDatasetAttributes(const std::string &, const std::vector< std::string > &, const std::vector< std::string > &) final
Definition FesapiHdfProxy.h:247
void writeDatasetAttributes(const std::string &, const std::vector< std::string > &, const std::vector< double > &) final
Definition FesapiHdfProxy.h:265
std::vector< uint32_t > getElementCountPerDimension(const std::string &datasetName) final
bool isOpened() const final
Definition FesapiHdfProxy.h:85
void readArrayNdOfFloatValues(const std::string &datasetName, float *values) final
Definition FesapiHdfProxy.h:369
FesapiHdfProxy(AbstractSession *session, gsoap_resqml2_0_1::_eml20__EpcExternalPartReference *fromGsoap)
Definition FesapiHdfProxy.h:47
void readArrayNdOfShortValues(const std::string &datasetName, short *values) final
Definition FesapiHdfProxy.h:451
std::string getXmlNamespace() const
Definition FesapiHdfProxy.h:494
void readArrayNdOfDoubleValues(const std::string &datasetName, double *values, uint64_t const *numValuesInEachDimension, uint64_t const *offsetInEachDimension, unsigned int numDimensions) final
std::set< int64_t > async_writeArrayNdSlab(const std::string &groupName, const std::string &name, COMMON_NS::AbstractObject::numericalDatatypeEnum datatype, const void *values, const uint64_t *numValuesInEachDimension, const uint64_t *offsetValuesInEachDimension, unsigned int numDimensions)
void readArrayNdOfDoubleValues(const std::string &datasetName, double *values) final
Definition FesapiHdfProxy.h:305
void close() final
Definition FesapiHdfProxy.h:90
void readArrayNdOfDoubleValues(const std::string &datasetName, double *values, uint64_t const *blockCountPerDimension, uint64_t const *offsetInEachDimension, uint64_t const *strideInEachDimension, uint64_t const *blockSizeInEachDimension, unsigned int numDimensions) final
void writeArrayNd(const std::string &groupName, const std::string &name, COMMON_NS::AbstractObject::numericalDatatypeEnum datatype, const void *values, const uint64_t *numValuesInEachDimension, unsigned int numDimensions) final
bool isCompressed(const std::string &) final
Definition FesapiHdfProxy.h:482
void writeDatasetAttribute(const std::string &, const std::string &, const std::vector< std::string > &) final
Definition FesapiHdfProxy.h:256
void readArrayNdOfInt8Values(const std::string &datasetName, int8_t *values) final
Definition FesapiHdfProxy.h:465
void readArrayNdOfFloatValues(const std::string &datasetName, float *values, uint64_t const *numValuesInEachDimension, uint64_t const *offsetInEachDimension, unsigned int numDimensions) final
void readArrayNdOfUIntValues(const std::string &datasetName, unsigned int *values) final
Definition FesapiHdfProxy.h:443
void createArrayNd(const std::string &groupName, const std::string &name, COMMON_NS::AbstractObject::numericalDatatypeEnum datatype, const uint64_t *numValuesInEachDimension, unsigned int numDimensions) final
void readArrayNdOfInt64Values(const std::string &datasetName, int64_t *values, uint64_t const *numValuesInEachDimension, uint64_t const *offsetInEachDimension, unsigned int numDimensions) final
bool exist(const std::string &absolutePathInHdfFile) const final
FesapiHdfProxy(AbstractSession *session, const COMMON_NS::DataObjectReference &dor)
Definition FesapiHdfProxy.h:53
void writeItemizedListOfList(const std::string &groupName, const std::string &name, COMMON_NS::AbstractObject::numericalDatatypeEnum cumulativeLengthDatatype, const void *cumulativeLength, uint64_t cumulativeLengthSize, COMMON_NS::AbstractObject::numericalDatatypeEnum elementsDatatype, const void *elements, uint64_t elementsSize) final
void readArrayNdOfIntValues(const std::string &datasetName, int *values) final
Definition FesapiHdfProxy.h:420
void writeGroupAttributes(const std::string &, const std::vector< std::string > &, const std::vector< int > &) final
Definition FesapiHdfProxy.h:238
void writeGroupAttributes(const std::string &, const std::vector< std::string > &, const std::vector< std::string > &) final
Definition FesapiHdfProxy.h:211
void readArrayNdOfUInt8Values(const std::string &datasetName, uint8_t *values) final
Definition FesapiHdfProxy.h:471
FesapiHdfProxy(AbstractSession *session, COMMON_NS::DataObjectRepository *repo, const std::string &guid, const std::string &title, const std::string &packageDirAbsolutePath, const std::string &externalFilePath, COMMON_NS::DataObjectRepository::openingMode hdfPermissionAccess)
Definition FesapiHdfProxy.h:38