@@ -140,7 +140,7 @@ void SignatureSiVa::validate(const string &policy) const
140140}
141141
142142
143- SiVaContainer::SiVaContainer (const string &path, const string &ext, bool useHashCode)
143+ SiVaContainer::SiVaContainer (const string &path, const string &ext, bool useHashCode, bool offline )
144144 : d(new Private)
145145{
146146 DEBUG (" SiVaContainer::SiVaContainer(%s, %s, %d)" , path.c_str (), ext.c_str (), useHashCode);
@@ -159,6 +159,10 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
159159 d->dataFiles .push_back (new DataFilePrivate (move (ifs), File::fileName (path), " application/pdf" , File::fileName (path)));
160160 }
161161
162+ if (offline) {
163+ return ;
164+ }
165+
162166 XMLByte buf[48 *100 ];
163167 string b64;
164168 is->clear ();
@@ -185,6 +189,7 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
185189 Connect::Result r = Connect (url, " POST" , 0 , {}, CONF (verifyServiceCerts)).exec ({
186190 {" Content-Type" , " application/json;charset=UTF-8" }
187191 }, (const unsigned char *)req.c_str (), req.size ());
192+ req.clear ();
188193
189194 if (!r.isOK () && !r.isStatusCode (" 400" ))
190195 THROW (" Failed to send request to SiVa" );
@@ -254,7 +259,7 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
254259 for (const json &error: signature.value <json>(" errors" , {}))
255260 {
256261 string message = error[" content" ];
257- if (message.find (" Bad digest for DataFile" ) == 0 && useHashCode)
262+ if (message.find (" Bad digest for DataFile" ) != string::npos && useHashCode)
258263 THROW (message.c_str ());
259264 s->_exceptions .emplace_back (EXCEPTION_PARAMS (message.c_str ()));
260265 }
@@ -265,7 +270,7 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
265270 if (message == " X509IssuerName has none or invalid namespace: null" ||
266271 message == " X509SerialNumber has none or invalid namespace: null" )
267272 ex.setCode (Exception::IssuerNameSpaceWarning);
268- else if (message.find (" Bad digest for DataFile" ) == 0 )
273+ else if (message.find (" Bad digest for DataFile" ) != string::npos )
269274 ex.setCode (Exception::DataFileNameSpaceWarning);
270275 else if (message == " Old and unsupported format: SK-XML version: 1.0" )
271276 continue ;
@@ -277,10 +282,8 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
277282
278283SiVaContainer::~SiVaContainer ()
279284{
280- for (const Signature *s: d->signatures )
281- delete s;
282- for (const DataFile *f: d->dataFiles )
283- delete f;
285+ for_each (d->signatures .cbegin (), d->signatures .cend (), default_delete<Signature>());
286+ for_each (d->dataFiles .cbegin (), d->dataFiles .cend (), default_delete<DataFile>());
284287 delete d;
285288}
286289
@@ -314,30 +317,28 @@ vector<DataFile *> SiVaContainer::dataFiles() const
314317 return d->dataFiles ;
315318}
316319
317- unique_ptr<Container> SiVaContainer::openInternal (const string &path)
320+ unique_ptr<Container> SiVaContainer::openInternal (const string &path, OpenFlags flags )
318321{
319322 static const set<string> supported = {" PDF" , " DDOC" };
320323 string ext = File::fileExtension (path);
321324 transform (ext.begin (), ext.end (), ext.begin (), ::toupper);
322325 if (!supported.count (ext))
323326 return {};
324327 try {
325- return unique_ptr<Container>(new SiVaContainer (path, ext, true ));
328+ return unique_ptr<Container>(new SiVaContainer (path, ext, true , flags & OpenOffline ));
326329 } catch (const Exception &e) {
327- if (e.msg ().find (" Bad digest for DataFile" ) == 0 )
328- return unique_ptr<Container>(new SiVaContainer (path, ext, false ));
330+ if (e.msg ().find (" Bad digest for DataFile" ) != string::npos )
331+ return unique_ptr<Container>(new SiVaContainer (path, ext, false , flags & OpenOffline ));
329332 throw ;
330333 }
331334}
332335
333336stringstream* SiVaContainer::parseDDoc (istream &is, bool useHashCode)
334337{
335- auto transcode = [](const XMLCh *chr) {
336- return xsd::cxx::xml::transcode<char >(chr);
337- };
338+ using xsd::cxx::xml::transcode;
339+ using cpXMLCh = const XMLCh*;
338340 try
339341 {
340- using cpXMLCh = const XMLCh*;
341342 unique_ptr<DOMDocument> dom (SecureDOMParser ().parseIStream (is));
342343 DOMNodeList *nodeList = dom->getElementsByTagName (cpXMLCh (u" DataFile" ));
343344 for (XMLSize_t i = 0 ; i < nodeList->getLength (); ++i)
@@ -354,7 +355,9 @@ stringstream* SiVaContainer::parseDDoc(istream &is, bool useHashCode)
354355 if (const XMLCh *b64 = item->getTextContent ())
355356 {
356357 d->dataFiles .push_back (new DataFilePrivate (unique_ptr<istream>(new stringstream (base64_decode (b64))),
357- transcode (item->getAttribute (cpXMLCh (u" Filename" ))), transcode (item->getAttribute (cpXMLCh (u" MimeType" ))), transcode (item->getAttribute (cpXMLCh (u" Id" )))));
358+ transcode<char >(item->getAttribute (cpXMLCh (u" Filename" ))),
359+ transcode<char >(item->getAttribute (cpXMLCh (u" MimeType" ))),
360+ transcode<char >(item->getAttribute (cpXMLCh (u" Id" )))));
358361 }
359362
360363 if (!useHashCode)
@@ -387,7 +390,7 @@ stringstream* SiVaContainer::parseDDoc(istream &is, bool useHashCode)
387390 catch (const XMLException& e)
388391 {
389392 try {
390- string result = transcode (e.getMessage ());
393+ string result = transcode< char > (e.getMessage ());
391394 THROW (" Failed to parse DDoc XML: %s" , result.c_str ());
392395 } catch (const xsd::cxx::xml::invalid_utf16_string & /* ex */ ) {
393396 THROW (" Failed to parse DDoc XML." );
@@ -396,7 +399,7 @@ stringstream* SiVaContainer::parseDDoc(istream &is, bool useHashCode)
396399 catch (const DOMException& e)
397400 {
398401 try {
399- string result = transcode (e.getMessage ());
402+ string result = transcode< char > (e.getMessage ());
400403 THROW (" Failed to parse DDoc XML: %s" , result.c_str ());
401404 } catch (const xsd::cxx::xml::invalid_utf16_string & /* ex */ ) {
402405 THROW (" Failed to parse DDoc XML." );
0 commit comments