#include "wx/app.h"
#include "wx/log.h"
#include "wx/intl.h"
+ #include "wx/utils.h"
#endif // WX_PRECOMP
#if wxUSE_DEBUGREPORT
#if wxUSE_ZIPSTREAM
#include "wx/wfstream.h"
#include "wx/zipstrm.h"
+ #include "wx/ptr_scpd.h"
#endif // wxUSE_ZIPSTREAM
-#if wxUSE_STACKWALKER
+WX_CHECK_BUILD_OPTIONS("wxQA")
// ----------------------------------------------------------------------------
// XmlStackWalker: stack walker specialization which dumps stack in XML
// ----------------------------------------------------------------------------
+#if wxUSE_STACKWALKER
+
class XmlStackWalker : public wxStackWalker
{
public:
static inline void
HexProperty(wxXmlNode *node, const wxChar *name, unsigned long value)
{
- node->AddProperty(name, wxString::Format(_T("%08x"), value));
+ node->AddProperty(name, wxString::Format(_T("%08lx"), value));
}
static inline void
static inline void
HexElement(wxXmlNode *node, const wxChar *name, unsigned long value)
{
- TextElement(node, name, wxString::Format(_T("%08x"), value));
+ TextElement(node, name, wxString::Format(_T("%08lx"), value));
}
#if wxUSE_STACKWALKER
wxDebugReport::wxDebugReport()
{
// get a temporary directory name
- wxString appname(wxTheApp ? wxTheApp->GetAppName() : _T("wx"));
+ wxString appname = GetReportName();
// we can't use CreateTempFileName() because it creates a file, not a
// directory, so do our best to create a unique name ourselves
wxFileName fn;
fn.AssignTempFileName(appname);
m_dir.Printf(_T("%s%c%s_dbgrpt-%lu-%s"),
- fn.GetPath(), wxFILE_SEP_PATH, appname.c_str(),
+ fn.GetPath().c_str(), wxFILE_SEP_PATH, appname.c_str(),
wxGetProcessId(),
wxDateTime::Now().Format(_T("%Y%m%dT%H%M%S")).c_str());
if ( !m_dir.empty() )
{
- if ( wxRmDir(m_dir) != 0 )
+ // Temp fix: what should this be? eVC++ doesn't like wxRmDir
+#ifdef __WXWINCE__
+ if ( wxRmdir(m_dir.fn_str()) != 0 )
+#else
+ if ( wxRmDir(m_dir.fn_str()) != 0 )
+#endif
{
wxLogSysError(_("Failed to clean up debug report directory \"%s\""),
m_dir.c_str());
wxString wxDebugReport::GetReportName() const
{
- return wxString(wxTheApp ? wxTheApp->GetAppName() : _T("wx"));
+ if(wxTheApp)
+ return wxTheApp->GetAppName();
+
+ return _T("wx");
}
void wxDebugReport::AddFile(const wxString& name, const wxString& description)
m_descriptions.Add(description);
}
+bool
+wxDebugReport::AddText(const wxString& name,
+ const wxString& text,
+ const wxString& description)
+{
+ wxFileName fn(GetDirectory(), name);
+ wxFFile file(fn.GetFullPath(), _T("w"));
+ if ( !file.IsOpened() || !file.Write(text) )
+ return false;
+
+ AddFile(name, description);
+
+ return true;
+}
+
void wxDebugReport::RemoveFile(const wxString& name)
{
const int n = m_files.Index(name);
#if wxUSE_CRASHREPORT
AddDump(context);
#endif // wxUSE_CRASHREPORT
+
+#if !wxUSE_STACKWALKER && !wxUSE_CRASHREPORT
+ wxUnusedVar(context);
+#endif
}
// ----------------------------------------------------------------------------
if ( !path.empty() )
nodeModule->AddProperty(_T("path"), path);
- void *addr;
- size_t len;
+ void *addr = NULL;
+ size_t len = 0;
if ( info.GetAddress(&addr, &len) )
{
HexProperty(nodeModule, _T("address"), (unsigned long)addr);
wxXmlNode *nodeRoot = new wxXmlNode(wxXML_ELEMENT_NODE, _T("report"));
xmldoc.SetRoot(nodeRoot);
nodeRoot->AddProperty(_T("version"), _T("1.0"));
- nodeRoot->AddProperty(_T("kind"), ctx == Context_Curent ? _T("user")
- : _T("exception"));
+ nodeRoot->AddProperty(_T("kind"), ctx == Context_Current ? _T("user")
+ : _T("exception"));
// add system information
wxXmlNode *nodeSystemInfo = new wxXmlNode(wxXML_ELEMENT_NODE, _T("system"));
{
sw.WalkFromException();
}
- else // Context_Curent
+ else // Context_Current
{
sw.Walk();
}
#if wxUSE_ZIPSTREAM
+// leave the default name wxZipOutputStreamPtr free for users
+wxDECLARE_SCOPED_PTR(wxZipOutputStream, wxDbgZipOutputStreamPtr)
+wxDEFINE_SCOPED_PTR(wxZipOutputStream, wxDbgZipOutputStreamPtr)
+
// ----------------------------------------------------------------------------
// wxDebugReportCompress
// ----------------------------------------------------------------------------
// create the streams
wxFileName fn(GetDirectory(), GetReportName(), _T("zip"));
wxFFileOutputStream os(fn.GetFullPath(), _T("wb"));
- wxZipOutputStream zos(os, 9);
+
+ // create this one on the heap as a workaround since otherwise the mingw
+ // 3.2.3 linker cannot find ~wxZipOutputStream() when building a dll
+ // version of the library.
+ wxDbgZipOutputStreamPtr zos(new wxZipOutputStream(os, 9));
// add all files to the ZIP one
wxString name, desc;
wxZipEntry *ze = new wxZipEntry(name);
ze->SetComment(desc);
- if ( !zos.PutNextEntry(ze) )
+ if ( !zos->PutNextEntry(ze) )
return false;
- wxFFileInputStream is(wxFileName(fn.GetPath(), name).GetFullPath());
- if ( !is.IsOk() || !zos.Write(is).IsOk() )
+ wxFileName filename(fn.GetPath(), name);
+ wxFFileInputStream is(filename.GetFullPath());
+ if ( !is.IsOk() || !zos->Write(is).IsOk() )
return false;
}
- if ( !zos.Close() )
+ if ( !zos->Close() )
return false;
m_zipfile = fn.GetFullPath();