43 auto xmlContent =
owner->xmlContent;
45 std::vector<XMLEle*> cdata;
47 std::vector<int> sharedBuffers;
48 std::vector<ssize_t> xmlSizes;
49 std::vector<XMLEle *> sharedCData;
51 std::unordered_map<XMLEle*, XMLEle*> replacement;
53 int ownerSharedBufferId = 0;
70 replacement[blobContent] = clone;
71 cdata.push_back(clone);
73 if (attached ==
"true")
84 sharedBuffers.push_back(
owner->sharedBuffers[ownerSharedBufferId++]);
85 xmlSizes.push_back(size);
86 sharedCData.push_back(
nullptr);
90 sharedBuffers.push_back(-1);
91 xmlSizes.push_back(-1);
92 sharedCData.push_back(blobContent);
96 if (replacement.empty())
100 char * model = (
char*)malloc(
sprlXMLEle(xmlContent, 0) + 1);
101 int modelSize =
sprXMLEle(model, xmlContent, 0);
117 std::vector<size_t> modelCdataOffset(cdata.size());
119 char * model = (
char*)malloc(
sprlXMLEle(xmlContent, 0) + 1);
120 int modelSize =
sprXMLEle(model, xmlContent, 0);
125 for(
size_t i = 0; i < cdata.size(); ++i)
131 std::vector<int> fds(cdata.size());
132 std::vector<void*> blobs(cdata.size());
133 std::vector<size_t> sizes(cdata.size());
134 std::vector<size_t> attachedSizes(cdata.size());
137 for(
size_t i = 0; i < cdata.size(); ++i)
139 if (sharedBuffers[i] != -1)
141 fds[i] = sharedBuffers[i];
145 attachedSizes[i] = dataSize;
149 if (xmlSizes[i] != -1 && ((
size_t)xmlSizes[i]) <= dataSize)
151 dataSize = xmlSizes[i];
163 for(
size_t i = 0; i < cdata.size(); ++i)
165 int cdataOffset = modelCdataOffset[i];
166 if (cdataOffset > modelOffset)
171 modelOffset = cdataOffset + 1;
180 unsigned long buffSze = sizes[i];
181 const unsigned char* src = (
const unsigned char*)blobs[i];
188 unsigned long sze = buffSze > 3 * 16384 ? 3 * 16384 : buffSze;
190 char* buffer = (
char*) malloc(4 * sze / 3 + 4);
192 int base64Count =
to64frombits_s((
unsigned char*)buffer, src, sze, (4 * sze / 3 + 4));
216 if (modelOffset < modelSize)
219 modelOffset = modelSize;
int to64frombits_s(unsigned char *out, const unsigned char *in, int inlen, size_t outlen)
Convert bytes array to base64.
size_t sprXMLEle(char *s, XMLEle *ep, int level)
sample print ep to string s. N.B. s must be at least as large as that reported by sprlXMLEle()+1....
size_t sprXMLCDataOffset(XMLEle *root, XMLEle *ep, int level)
return exact position of cdata of child in printed representation of root N.B. set level = 0 on first...