MCPcopy Create free account
hub / github.com/WinMerge/winmerge / UnpackFile

Method UnpackFile

Plugins/src_VCPP/DisplayXMLFiles/WinMergeScript.cpp:282–340  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

280
281
282STDMETHODIMP CWinMergeScript::UnpackFile(BSTR fileSrc, BSTR fileDst, VARIANT_BOOL *pbChanged, INT *pSubcode, VARIANT_BOOL *pbSuccess)
283{
284 USES_CONVERSION;
285
286 // Open input file for read binary
287 FILE *pInput = _wfopen(fileSrc, L"rb");
288 // Init data structure used in handlers
289 CXMLData oData;
290 oData.iDepth = 0;
291 oData.bInElement = false;
292 oData.bNeedsEnding = false;
293 // Get file size
294 fseek(pInput, 0L, SEEK_END);
295 size_t size = ftell(pInput);
296 fseek(pInput, 0L, SEEK_SET);
297 // Open output file for write binary
298 oData.pOutput = _wfopen(fileDst, L"wb");
299
300 // Set all handlers
301 char *buf = new char[size];
302 XML_Parser parser = XML_ParserCreate(NULL);
303 XML_SetUserData(parser, &oData);
304 XML_SetElementHandler(parser, StartElementHandler, EndElementHandler);
305 XML_SetDefaultHandler(parser, DefaultHandler);
306 XML_SetProcessingInstructionHandler(parser, ProcessingInstructionHandler);
307 XML_SetCommentHandler(parser, CommentHandler);
308 XML_SetXmlDeclHandler(parser, XmlDeclHandler);
309 XML_SetUnknownEncodingHandler(parser, WinMerge_Plug_UnknownEncodingHandler, this);
310 size_t len = fread(buf, 1, size, pInput);
311 // Parse
312 if (XML_Parse(parser, buf, static_cast<int>(len), true) == XML_STATUS_ERROR)
313 {
314 // There was an error
315 // Give a warning and return without converting anything
316 char sError[1024];
317 sprintf(sError, "The xml has an error: %s at line %d",
318 XML_ErrorString(XML_GetErrorCode(parser)),
319 XML_GetCurrentLineNumber(parser));
320
321 MergeApp_LogError(m_pMergeApp, sError);
322 XML_ParserFree(parser);
323 delete [] buf;
324 fclose(pInput);
325 fclose(oData.pOutput);
326 *pbChanged = VARIANT_FALSE;
327 *pbSuccess = VARIANT_FALSE;
328 return S_FALSE;
329 }
330 XML_ParserFree(parser);
331 delete [] buf;
332
333 // Close all files
334 fclose(pInput);
335 fclose(oData.pOutput);
336
337 *pbChanged = VARIANT_TRUE;
338 *pbSuccess = VARIANT_TRUE;
339 return S_OK;

Callers

nothing calls this directly

Calls 14

XML_ParserCreateFunction · 0.85
XML_SetUserDataFunction · 0.85
XML_SetElementHandlerFunction · 0.85
XML_SetDefaultHandlerFunction · 0.85
XML_SetCommentHandlerFunction · 0.85
XML_SetXmlDeclHandlerFunction · 0.85
XML_ParseFunction · 0.85
XML_ErrorStringFunction · 0.85
XML_GetErrorCodeFunction · 0.85
XML_GetCurrentLineNumberFunction · 0.85

Tested by

no test coverage detected