| 280 | |
| 281 | |
| 282 | STDMETHODIMP 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; |
nothing calls this directly
no test coverage detected