CViewReport::CViewReport(CWnd* pParent /*=NULL*/, CReport *pRpt /*=NULL*/) : CPWResizeDialog(CViewReport::IDD, pParent), m_pRpt(pRpt), m_bMemoryAllocOK(false) { // Convert LF to CRLF StringX sxCRLF(L"\r\n"), sxLF(L"\n"); m_pString = m_pRpt->GetString(); Replace(m_pString, sxCRLF, sxLF); Replace(m_pString, sxLF, sxCRLF); m_dwDatasize = (DWORD)(m_pString.length() * sizeof(wchar_t)); m_backgroundcolour = RGB(255, 255, 255); m_backgroundbrush.CreateSolidBrush(m_backgroundcolour); m_textcolor = ::GetSysColor(COLOR_WINDOWTEXT); }
/* SaveToDisk creates a new file of name "<tcAction>_Report.txt" e.g. "Merge_Report.txt" in the same directory as the current database or appends to this file if it already exists. */ bool CReport::SaveToDisk() { FILE *fd; stringT path(m_csDataBase); stringT drive, dir, file, ext; if (!pws_os::splitpath(path, drive, dir, file, ext)) { pws_os::IssueError(_T("StartReport: Finding path to database")); return false; } Format(m_cs_filename, IDSC_REPORTFILENAME, drive.c_str(), dir.c_str(), m_tcAction.c_str()); if ((fd = pws_os::FOpen(m_cs_filename, _T("a+b"))) == NULL) { pws_os::IssueError(_T("StartReport: Opening log file")); return false; } // **** MOST LIKELY ACTION **** // If file is new/emtpy AND we are UNICODE, write BOM, as some text editors insist! // **** LEAST LIKELY ACTIONS as it requires the user to use both U & NU versions **** // Text editors really don't like files with both UNICODE and ASCII characters, so - // If we are UNICODE and file is not, convert file to UNICODE before appending // If we are not UNICODE but file is, convert file to ASCII before appending bool bFileIsUnicode = isFileUnicode(m_cs_filename); #ifdef UNICODE const unsigned int iBOM = 0xFEFF; if (pws_os::fileLength(fd) == 0) { // File is empty - write BOM putwc(iBOM, fd); } else if (!bFileIsUnicode) { // Convert ASCII contents to UNICODE // Close original first fclose(fd); // Open again to read FILE *f_in = pws_os::FOpen(m_cs_filename, _S("rb")); // Open new file stringT cs_out = m_cs_filename + _S(".tmp"); FILE *f_out = pws_os::FOpen(cs_out, _S("wb")); // Write BOM putwc(iBOM, f_out); size_t nBytesRead; unsigned char inbuffer[4096]; wchar_t outwbuffer[4096]; // Now copy do { nBytesRead = fread(inbuffer, sizeof(inbuffer), 1, f_in); if (nBytesRead > 0) { size_t len = pws_os::mbstowcs(outwbuffer, 4096, reinterpret_cast<const char *>(inbuffer), nBytesRead); if (len != 0) fwrite(outwbuffer, sizeof(outwbuffer[0])*len, 1, f_out); } else break; } while(nBytesRead > 0); // Close files fclose(f_in); fclose(f_out); // Swap them pws_os::RenameFile(cs_out, m_cs_filename); // Re-open file if ((fd = pws_os::FOpen(m_cs_filename, _S("ab"))) == NULL) { pws_os::IssueError(_T("StartReport: Opening log file")); return false; } } #else if (bFileIsUnicode) { // Convert UNICODE contents to ASCII // Close original first fclose(fd); // Open again to read FILE *f_in = pws_os::FOpen(m_cs_filename, "rb"); // Open new file stringT cs_out = m_cs_filename + _T(".tmp"); FILE *f_out = pws_os::FOpen(cs_out, "wb"); UINT nBytesRead; WCHAR inwbuffer[4096]; unsigned char outbuffer[4096]; // Skip over BOM fseek(f_in, 2, SEEK_SET); // Now copy do { nBytesRead = fread(inwbuffer, sizeof(inwbuffer), 1, f_in); if (nBytesRead > 0) { size_t len = pws_os::wcstombs((char *)outbuffer, 4096, inwbuffer, nBytesRead); if (len != 0) fwrite(outbuffer, len, 1, f_out); } else break; } while(nBytesRead > 0); // Close files fclose(f_in); fclose(f_out); // Swap them pws_os::RenameFile(cs_out, m_cs_filename); // Re-open file if ((fd = pws_os::FOpen(m_cs_filename, _S("ab"))) == NULL) { pws_os::IssueError(_T("StartReport: Opening log file")); return false; } } #endif // Convert LF to CRLF StringX sxCRLF(L"\r\n"), sxLF(L"\n"); StringX sx = m_osxs.rdbuf()->str(); Replace(sx, sxCRLF, sxLF); Replace(sx, sxLF, sxCRLF); fwrite(reinterpret_cast<const void *>(sx.c_str()), sizeof(BYTE), sx.length() * sizeof(TCHAR), fd); fclose(fd); return true; }