]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/debugrpt.cpp
silently ignore NULL pointers in MSWOnMeasureItem(): apparently this can happen with...
[wxWidgets.git] / src / common / debugrpt.cpp
index 10597eb4eb1c974d65740d8f612e23e2865250c5..194b33788b02206f07f3a1d5bfde9ef7fe957cff 100644 (file)
@@ -27,6 +27,7 @@
     #include "wx/app.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/app.h"
     #include "wx/log.h"
     #include "wx/intl.h"
+    #include "wx/utils.h"
 #endif // WX_PRECOMP
 
 #if wxUSE_DEBUGREPORT
 #endif // WX_PRECOMP
 
 #if wxUSE_DEBUGREPORT
 #if wxUSE_ZIPSTREAM
     #include "wx/wfstream.h"
     #include "wx/zipstrm.h"
 #if wxUSE_ZIPSTREAM
     #include "wx/wfstream.h"
     #include "wx/zipstrm.h"
+    #include "wx/ptr_scpd.h"
 #endif // wxUSE_ZIPSTREAM
 
 #endif // wxUSE_ZIPSTREAM
 
-#if wxUSE_STACKWALKER
+WX_CHECK_BUILD_OPTIONS("wxQA")
 
 // ----------------------------------------------------------------------------
 // XmlStackWalker: stack walker specialization which dumps stack in XML
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
 // XmlStackWalker: stack walker specialization which dumps stack in XML
 // ----------------------------------------------------------------------------
 
+#if wxUSE_STACKWALKER
+
 class XmlStackWalker : public wxStackWalker
 {
 public:
 class XmlStackWalker : public wxStackWalker
 {
 public:
@@ -85,7 +89,7 @@ protected:
 static inline void
 HexProperty(wxXmlNode *node, const wxChar *name, unsigned long value)
 {
 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
@@ -105,7 +109,7 @@ TextElement(wxXmlNode *node, const wxChar *name, const wxString& value)
 static inline void
 HexElement(wxXmlNode *node, const wxChar *name, unsigned long value)
 {
 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
 }
 
 #if wxUSE_STACKWALKER
@@ -178,7 +182,7 @@ void XmlStackWalker::OnStackFrame(const wxStackFrame& frame)
 wxDebugReport::wxDebugReport()
 {
     // get a temporary directory name
 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
 
     // we can't use CreateTempFileName() because it creates a file, not a
     // directory, so do our best to create a unique name ourselves
@@ -187,7 +191,7 @@ wxDebugReport::wxDebugReport()
     wxFileName fn;
     fn.AssignTempFileName(appname);
     m_dir.Printf(_T("%s%c%s_dbgrpt-%lu-%s"),
     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());
 
                  wxGetProcessId(),
                  wxDateTime::Now().Format(_T("%Y%m%dT%H%M%S")).c_str());
 
@@ -223,7 +227,12 @@ wxDebugReport::~wxDebugReport()
 
     if ( !m_dir.empty() )
     {
 
     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());
         {
             wxLogSysError(_("Failed to clean up debug report directory \"%s\""),
                           m_dir.c_str());
@@ -237,7 +246,10 @@ wxDebugReport::~wxDebugReport()
 
 wxString wxDebugReport::GetReportName() const
 {
 
 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)
 }
 
 void wxDebugReport::AddFile(const wxString& name, const wxString& description)
@@ -246,6 +258,21 @@ void wxDebugReport::AddFile(const wxString& name, const wxString& description)
     m_descriptions.Add(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);
 void wxDebugReport::RemoveFile(const wxString& name)
 {
     const int n = m_files.Index(name);
@@ -279,6 +306,10 @@ void wxDebugReport::AddAll(Context context)
 #if wxUSE_CRASHREPORT
     AddDump(context);
 #endif // wxUSE_CRASHREPORT
 #if wxUSE_CRASHREPORT
     AddDump(context);
 #endif // wxUSE_CRASHREPORT
+
+#if !wxUSE_STACKWALKER && !wxUSE_CRASHREPORT
+    wxUnusedVar(context);
+#endif
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -314,8 +345,8 @@ bool wxDebugReport::DoAddLoadedModules(wxXmlNode *nodeModules)
         if ( !path.empty() )
             nodeModule->AddProperty(_T("path"), path);
 
         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);
         if ( info.GetAddress(&addr, &len) )
         {
             HexProperty(nodeModule, _T("address"), (unsigned long)addr);
@@ -387,8 +418,8 @@ bool wxDebugReport::AddContext(wxDebugReport::Context ctx)
     wxXmlNode *nodeRoot = new wxXmlNode(wxXML_ELEMENT_NODE, _T("report"));
     xmldoc.SetRoot(nodeRoot);
     nodeRoot->AddProperty(_T("version"), _T("1.0"));
     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"));
 
     // add system information
     wxXmlNode *nodeSystemInfo = new wxXmlNode(wxXML_ELEMENT_NODE, _T("system"));
@@ -423,7 +454,7 @@ bool wxDebugReport::AddContext(wxDebugReport::Context ctx)
     {
         sw.WalkFromException();
     }
     {
         sw.WalkFromException();
     }
-    else // Context_Curent
+    else // Context_Current
     {
         sw.Walk();
     }
     {
         sw.Walk();
     }
@@ -533,6 +564,10 @@ bool wxDebugReport::DoProcess()
 
 #if wxUSE_ZIPSTREAM
 
 
 #if wxUSE_ZIPSTREAM
 
+// leave the default name wxZipOutputStreamPtr free for users
+wxDECLARE_SCOPED_PTR(wxZipOutputStream, wxDbgZipOutputStreamPtr)
+wxDEFINE_SCOPED_PTR(wxZipOutputStream, wxDbgZipOutputStreamPtr)
+
 // ----------------------------------------------------------------------------
 // wxDebugReportCompress
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxDebugReportCompress
 // ----------------------------------------------------------------------------
@@ -546,7 +581,11 @@ bool wxDebugReportCompress::DoProcess()
     // create the streams
     wxFileName fn(GetDirectory(), GetReportName(), _T("zip"));
     wxFFileOutputStream os(fn.GetFullPath(), _T("wb"));
     // 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;
 
     // add all files to the ZIP one
     wxString name, desc;
@@ -557,15 +596,16 @@ bool wxDebugReportCompress::DoProcess()
         wxZipEntry *ze = new wxZipEntry(name);
         ze->SetComment(desc);
 
         wxZipEntry *ze = new wxZipEntry(name);
         ze->SetComment(desc);
 
-        if ( !zos.PutNextEntry(ze) )
+        if ( !zos->PutNextEntry(ze) )
             return false;
 
             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;
     }
 
             return false;
     }
 
-    if ( !zos.Close() )
+    if ( !zos->Close() )
         return false;
 
     m_zipfile = fn.GetFullPath();
         return false;
 
     m_zipfile = fn.GetFullPath();