[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16900] branches/blender2.5/blender/source /blender: 2.5 Branch: added WM_report and WM_reportf functions for reporting

Brecht Van Lommel brecht at blender.org
Fri Oct 3 20:03:30 CEST 2008


Revision: 16900
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16900
Author:   blendix
Date:     2008-10-03 20:03:30 +0200 (Fri, 03 Oct 2008)

Log Message:
-----------
2.5 Branch: added WM_report and WM_reportf functions for reporting
information, warnings and errors.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/wm.h

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_report.c

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-10-03 13:16:10 UTC (rev 16899)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-10-03 18:03:30 UTC (rev 16900)
@@ -3509,6 +3509,7 @@
 	wm->screenkeymap.first= wm->screenkeymap.last= NULL;
 	
 	wm->queue.first= wm->queue.last= NULL;
+	wm->reports.first= wm->reports.last= NULL;
 	
 	wm->windrawable= NULL;
 	wm->initialized= 0;

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-10-03 13:16:10 UTC (rev 16899)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-10-03 18:03:30 UTC (rev 16900)
@@ -61,6 +61,8 @@
 	ListBase operators;		/* operator registry */
 	
 	ListBase queue;			/* refresh/redraw wmNotifier structs */
+
+	ListBase reports;		/* information and error reports */
 	
 	/* custom keymaps */
 	ListBase windowkeymap;

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-10-03 13:16:10 UTC (rev 16899)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-10-03 18:03:30 UTC (rev 16900)
@@ -150,6 +150,10 @@
 void WM_gesture_end(struct bContext *C, int type);
 void WM_gesture_free(wmWindow *win);
 
+			/* Reporting information and errors */
+void WM_report(struct bContext *C, int type, const char *message);
+void WM_reportf(struct bContext *C, int type, const char *format, ...);
+
 			/* OpenGL wrappers, mimicing opengl syntax */
 void		wmLoadMatrix		(wmWindow *win, float mat[][4]);
 void		wmGetMatrix			(wmWindow *win, float mat[][4]);

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_types.h	2008-10-03 13:16:10 UTC (rev 16899)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_types.h	2008-10-03 18:03:30 UTC (rev 16900)
@@ -138,6 +138,25 @@
 	short x2, y2;
 } wmBorderSelect;
 
+/* ****************** Messages ********************* */
+
+enum {
+	WM_LOG_DEBUG				= 0,
+	WM_LOG_INFO					= 1000,
+	WM_LOG_WARNING				= 2000,
+	WM_ERROR_UNDEFINED			= 3000,
+	WM_ERROR_INVALID_INPUT		= 3001,
+	WM_ERROR_INVALID_CONTEXT	= 3002,
+	WM_ERROR_OUT_OF_MEMORY		= 3003
+};
+
+typedef struct wmReport {
+	struct wmReport *next, *prev;
+	int type;
+	const char *typestr;
+	char *message;
+} wmReport;
+
 /* *************** migrated stuff, clean later? ******************************** */
 
 typedef struct RecentFile {

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c	2008-10-03 13:16:10 UTC (rev 16899)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c	2008-10-03 18:03:30 UTC (rev 16900)
@@ -43,6 +43,7 @@
 #include "wm_window.h"
 #include "wm_event_system.h"
 #include "wm_event_types.h"
+#include "wm.h"
 
 #include "ED_screen.h"
 
@@ -130,6 +131,7 @@
 {
 	wmWindow *win;
 	wmOperator *op;
+	wmReport *report;
 	
 	while((win= wm->windows.first)) {
 		BLI_remlink(&wm->windows, win);
@@ -141,6 +143,11 @@
 		wm_operator_free(op);
 	}
 
+	while((report= wm->reports.first)) {
+		BLI_remlink(&wm->reports, report);
+		wm_report_free(report);
+	}
+
 	BLI_freelistN(&wm->timekeymap);
 	BLI_freelistN(&wm->windowkeymap);
 	BLI_freelistN(&wm->screenkeymap);

Added: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_report.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_report.c	                        (rev 0)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_report.c	2008-10-03 18:03:30 UTC (rev 16900)
@@ -0,0 +1,134 @@
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_blenlib.h"
+
+#include "BKE_global.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef _WIN32
+#ifndef vsnprintf
+#define vsnprintf _vsnprintf
+#endif
+#endif
+
+static int wmReportLevel= WM_LOG_INFO;
+static int wmReportPrint= 0;
+
+static const char *wm_report_type_str(int type)
+{
+	switch(type) {
+		case WM_LOG_DEBUG: return "Debug";
+		case WM_LOG_INFO: return "Info";
+		case WM_LOG_WARNING: return "Warning";
+		case WM_ERROR_UNDEFINED: return "Error";
+		case WM_ERROR_INVALID_INPUT: return "Invalid Input Error";
+		case WM_ERROR_INVALID_CONTEXT: return "Invalid Context Error";
+		case WM_ERROR_OUT_OF_MEMORY: return "Out Of Memory Error";
+		default: return "Undefined Type";
+	}
+}
+
+static void wm_print_report(wmReport *report)
+{
+	printf("%s: %s\n", report->typestr, report->message);
+	fflush(stdout); /* this ensures the message is printed before a crash */
+}
+
+void WM_report(bContext *C, int type, const char *message)
+{
+	wmReport *report;
+	int len;
+
+	if(!C->wm) {
+		fprintf(stderr, "WM_report: can't report without windowmanager.\n");
+		return;
+	}
+	if(type < wmReportLevel)
+		return;
+
+	report= MEM_callocN(sizeof(wmReport), "wmReport");
+	report->type= type;
+	report->typestr= wm_report_type_str(type);
+
+	len= strlen(message);
+	report->message= MEM_callocN(sizeof(char)*(len+1), "wmReportMessage");
+	memcpy(report->message, message, sizeof(char)*(len+1));
+
+	if(wmReportPrint)
+		wm_print_report(report);
+	
+	BLI_addtail(&C->wm->reports, report);
+}
+
+void WM_reportf(bContext *C, int type, const char *format, ...)
+{
+	wmReport *report;
+	va_list args;
+	char *message;
+	int len= 256, maxlen= 65536, retval;
+
+	if(!C->wm) {
+		fprintf(stderr, "WM_report: can't report without windowmanager.\n");
+		return;
+	}
+	if(type < wmReportLevel)
+		return;
+
+	while(1) {
+		message= MEM_callocN(sizeof(char)*len+1, "wmReportMessage");
+
+		va_start(args, format);
+		retval= vsnprintf(message, len, format, args);
+		va_end(args);
+
+		if(retval == -1) {
+			/* -1 means not enough space, but on windows it may also mean
+			 * there is a formatting error, so we impose a maximum length */
+			MEM_freeN(message);
+			message= NULL;
+
+			len *= 2;
+			if(len > maxlen) {
+				fprintf(stderr, "WM_report message too long or format error.\n");
+				break;
+			}
+		}
+		else if(retval > len) {
+			/* in C99 the actual length required is returned */
+			MEM_freeN(message);
+			message= NULL;
+
+			len= retval;
+		}
+		else
+			break;
+	}
+
+	if(message) {
+		report= MEM_callocN(sizeof(wmReport), "wmReport");
+		report->type= type;
+		report->typestr= wm_report_type_str(type);
+		report->message= message;
+
+		if(wmReportPrint)
+			wm_print_report(report);
+
+		BLI_addtail(&C->wm->reports, report);
+	}
+}
+
+void wm_report_free(wmReport *report)
+{
+	MEM_freeN(report->message);
+	MEM_freeN(report);
+}
+

Modified: branches/blender2.5/blender/source/blender/windowmanager/wm.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/wm.h	2008-10-03 13:16:10 UTC (rev 16899)
+++ branches/blender2.5/blender/source/blender/windowmanager/wm.h	2008-10-03 18:03:30 UTC (rev 16900)
@@ -38,6 +38,8 @@
 			/* register to windowmanager for redo or macro */
 void		wm_operator_register(wmWindowManager *wm, wmOperator *op);
 
+extern void wm_report_free(wmReport *report);
+
 /* wm_operator.c, for init/exit */
 void wm_operatortype_free(void);
 void wm_operatortype_init(void);





More information about the Bf-blender-cvs mailing list