[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18149] branches/blender2.5/blender/source : 2.5: Error reporting

Brecht Van Lommel brecht at blender.org
Mon Dec 29 14:38:08 CET 2008


Revision: 18149
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18149
Author:   blendix
Date:     2008-12-29 14:38:08 +0100 (Mon, 29 Dec 2008)

Log Message:
-----------
2.5: Error reporting

* Added a report list to operator, to which they can report errors and
  warnings. When the operator ends, it will display them with a popup. For
  python these should become exceptions when calling operators.
* Added a function to make a popup menu from a report list.
* Also added a utility function to prepend a string before the reports to
  indicate what they relates to. Also made the report functions used
  BLI_dynstr to simplify the code.
* Made file reading and writing report errors to the user again using this
  system, also replacing the left over uncommented bad level error() calls.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_blender.h
    branches/blender2.5/blender/source/blender/blenkernel/BKE_report.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/context.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/report.c
    branches/blender2.5/blender/source/blender/blenlib/BLI_dynstr.h
    branches/blender2.5/blender/source/blender/blenlib/intern/BLI_dynstr.c
    branches/blender2.5/blender/source/blender/blenloader/BLO_readfile.h
    branches/blender2.5/blender/source/blender/blenloader/intern/readblenentry.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.h
    branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
    branches/blender2.5/blender/source/blender/editors/space_file/filelist.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
    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/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_files.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/creator/creator.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_blender.h	2008-12-29 13:02:18 UTC (rev 18148)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_blender.h	2008-12-29 13:38:08 UTC (rev 18149)
@@ -40,6 +40,7 @@
 struct ListBase;
 struct MemFile;
 struct bContext;
+struct ReportList;
 
 #define BLENDER_VERSION			250
 #define BLENDER_SUBVERSION		0
@@ -47,9 +48,9 @@
 #define BLENDER_MINVERSION		250
 #define BLENDER_MINSUBVERSION	0
 
-int	BKE_read_file(struct bContext *C, char *dir, void *type_r);
-int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, void *type_r);
-int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile);
+int BKE_read_file(struct bContext *C, char *dir, void *type_r, struct ReportList *reports);
+int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, void *type_r, struct ReportList *reports);
+int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile, struct ReportList *reports);
 
 void free_blender(void);
 void initglobals(void);

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_report.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_report.h	2008-12-29 13:02:18 UTC (rev 18148)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_report.h	2008-12-29 13:38:08 UTC (rev 18149)
@@ -49,7 +49,6 @@
 enum ReportListFlags {
 	RPT_PRINT = 1,
 	RPT_STORE = 2,
-	RPT_HAS_ERROR = 4
 };
 
 typedef struct Report {
@@ -72,6 +71,9 @@
 void BKE_report(ReportList *reports, ReportType type, const char *message);
 void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...);
 
+void BKE_reports_prepend(ReportList *reports, const char *prepend);
+void BKE_reports_prependf(ReportList *reports, const char *prepend, ...);
+
 ReportType BKE_report_print_level(ReportList *reports);
 void BKE_report_print_level_set(ReportList *reports, ReportType level);
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c	2008-12-29 13:02:18 UTC (rev 18148)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/blender.c	2008-12-29 13:38:08 UTC (rev 18149)
@@ -424,15 +424,12 @@
    2: OK, and with new user settings
 */
 
-int BKE_read_file(bContext *C, char *dir, void *unused) 
+int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports) 
 {
-	ReportList reports;
 	BlendFileData *bfd;
 	int retval= 1;
-	
-	BKE_reports_init(&reports, RPT_STORE);
 
-	bfd= BLO_read_from_file(dir, &reports);
+	bfd= BLO_read_from_file(dir, reports);
 	if (bfd) {
 		if(bfd->user) retval= 2;
 		
@@ -440,50 +437,35 @@
 		
 		handle_subversion_warning(G.main);
 	} 
-	else {
-// XXX		error("Loading %s failed: %s", dir, BLO_bre_as_string(bre));
-	}
-
-	BKE_reports_clear(&reports);
+	else
+		BKE_reports_prependf(reports, "Loading %s failed: ", dir);
 		
 	return (bfd?retval:0);
 }
 
-int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, void *unused)
+int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, void *unused, ReportList *reports)
 {
-	ReportList reports;
 	BlendFileData *bfd;
 
-	BKE_reports_init(&reports, RPT_STORE);
-
-	bfd= BLO_read_from_memory(filebuf, filelength, &reports);
-	if (bfd) {
+	bfd= BLO_read_from_memory(filebuf, filelength, reports);
+	if (bfd)
 		setup_app_data(C, bfd, "<memory2>");
-	} else {
-// XXX		error("Loading failed: %s", BLO_bre_as_string(bre));
-	}
-		
-	BKE_reports_clear(&reports);
+	else
+		BKE_reports_prepend(reports, "Loading failed: ");
 
 	return (bfd?1:0);
 }
 
 /* memfile is the undo buffer */
-int BKE_read_file_from_memfile(bContext *C, MemFile *memfile)
+int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *reports)
 {
-	ReportList reports;
 	BlendFileData *bfd;
-	
-	BKE_reports_init(&reports, RPT_STORE);
 
-	bfd= BLO_read_from_memfile(CTX_data_main(C), G.sce, memfile, &reports);
-	if (bfd) {
+	bfd= BLO_read_from_memfile(CTX_data_main(C), G.sce, memfile, reports);
+	if (bfd)
 		setup_app_data(C, bfd, "<memory1>");
-	} else {
-// XXX		error("Loading failed: %s", BLO_bre_as_string(bre));
-	}
-		
-	BKE_reports_clear(&reports);
+	else
+		BKE_reports_prepend(reports, "Loading failed: ");
 
 	return (bfd?1:0);
 }
@@ -516,10 +498,10 @@
 	G.fileflags |= G_FILE_NO_UI;
 
 	if(UNDO_DISK) 
-		success= BKE_read_file(C, uel->str, NULL);
+		success= BKE_read_file(C, uel->str, NULL, NULL);
 	else
-		success= BKE_read_file_from_memfile(C, &uel->memfile);
-	
+		success= BKE_read_file_from_memfile(C, &uel->memfile, NULL);
+
 	/* restore */
 	strcpy(G.sce, scestr);
 	G.fileflags= fileflags;
@@ -571,7 +553,6 @@
 
 	/* disk save version */
 	if(UNDO_DISK) {
-		ReportList reports;
 		static int counter= 0;
 		char tstr[FILE_MAXDIR+FILE_MAXFILE];
 		char numstr[32];
@@ -583,22 +564,17 @@
 		sprintf(numstr, "%d.blend", counter);
 		BLI_make_file_string("/", tstr, btempdir, numstr);
 	
-		BKE_reports_init(&reports, 0);
-		success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, &reports);
-		BKE_reports_clear(&reports);
+		success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL);
 		
 		strcpy(curundo->str, tstr);
 	}
 	else {
-		ReportList reports;
 		MemFile *prevfile=NULL;
 		
 		if(curundo->prev) prevfile= &(curundo->prev->memfile);
 		
 		memused= MEM_get_memory_in_use();
-		BKE_reports_init(&reports, 0);
-		success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags, &reports);
-		BKE_reports_clear(&reports);
+		success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags, NULL);
 		curundo->undosize= MEM_get_memory_in_use() - memused;
 	}
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/context.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/context.c	2008-12-29 13:02:18 UTC (rev 18148)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/context.c	2008-12-29 13:38:08 UTC (rev 18149)
@@ -60,9 +60,6 @@
 		struct ARegion *region;
 		struct uiBlock *block;
 
-		bContextDataCallback screen_cb;
-		bContextDataCallback area_cb;
-		bContextDataCallback region_cb;
 		bContextDataCallback block_cb;
 	} wm;
 	
@@ -191,26 +188,22 @@
 	C->wm.window= win;
 	C->wm.screen= (win)? win->screen: NULL;
 	C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
-	C->wm.screen_cb= (C->wm.screen)? C->wm.screen->context: NULL;
 }
 
 void CTX_wm_screen_set(bContext *C, bScreen *screen)
 {
 	C->wm.screen= screen;
 	C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
-	C->wm.screen_cb= (C->wm.screen)? C->wm.screen->context: NULL;
 }
 
 void CTX_wm_area_set(bContext *C, ScrArea *area)
 {
 	C->wm.area= area;
-	C->wm.area_cb= (area && area->type)? area->type->context: NULL;
 }
 
 void CTX_wm_region_set(bContext *C, ARegion *region)
 {
 	C->wm.region= region;
-	C->wm.region_cb= (region && region->type)? region->type->context: NULL;
 }
 
 void CTX_wm_ui_block_set(bContext *C, struct uiBlock *block, bContextDataCallback cb)
@@ -240,21 +233,25 @@
 
 	/* we check recursion to ensure that we do not get infinite
 	 * loops requesting data from ourselfs in a context callback */
-	if(!done && recursion < 1 && C->wm.block_cb) {
+	if(!done && recursion < 1 && C->wm.block) {
 		C->data.recursion= 1;
 		done= C->wm.block_cb(C, member, result);
 	}
-	if(!done && recursion < 2 && C->wm.region_cb) {
+	if(!done && recursion < 2 && C->wm.region) {
 		C->data.recursion= 2;
-		done= C->wm.region_cb(C, member, result);
+		if(C->wm.region->type->context)
+			done= C->wm.region->type->context(C, member, result);
 	}
-	if(!done && recursion < 3 && C->wm.area_cb) {
+	if(!done && recursion < 3 && C->wm.area) {
 		C->data.recursion= 3;
-		done= C->wm.area_cb(C, member, result);
+		if(C->wm.area->type->context)
+			done= C->wm.area->type->context(C, member, result);
 	}
-	if(!done && recursion < 4 && C->wm.screen_cb) {
+	if(!done && recursion < 4 && C->wm.screen) {
+		bContextDataCallback cb= C->wm.screen->context;
 		C->data.recursion= 4;
-		done= C->wm.screen_cb(C, member, result);
+		if(cb)
+			done= cb(C, member, result);
 	}
 
 	C->data.recursion= recursion;

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/report.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/report.c	2008-12-29 13:02:18 UTC (rev 18148)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/report.c	2008-12-29 13:38:08 UTC (rev 18149)
@@ -30,6 +30,7 @@
 #include "DNA_listBase.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
 
 #include "BKE_report.h"
 
@@ -59,6 +60,9 @@
 
 void BKE_reports_init(ReportList *reports, int flag)
 {
+	if(!reports)
+		return;
+
 	memset(reports, 0, sizeof(ReportList));
 
 	reports->storelevel= RPT_WARNING;
@@ -70,6 +74,9 @@
 {
 	Report *report;
 
+	if(!reports)
+		return;
+
 	for(report=reports->list.first; report; report=report->next)
 		MEM_freeN(report->message);
 
@@ -81,18 +88,12 @@
 	Report *report;
 	int len;
 
-	if(!reports)
-		return;
-	
-	if(type >= RPT_ERROR)
-		reports->flag |= RPT_HAS_ERROR;
-
-	if((reports->flag & RPT_PRINT) && (type >= reports->printlevel)) {
+	if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
 		printf("%s: %s\n", report_type_str(type), message);
 		fflush(stdout); /* this ensures the message is printed before a crash */
 	}
 
-	if((reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
+	if(reports && (reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
 		report= MEM_callocN(sizeof(Report), "Report");
 		report->type= type;
 		report->typestr= report_type_str(type);
@@ -107,83 +108,110 @@
 
 void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
 {
+	DynStr *ds;
 	Report *report;
 	va_list args;
-	char *message;
-	int len= 256, maxlen= 65536, retval;
 
-	if(!reports)
-		return;
-
-	if(type >= RPT_ERROR)
-		reports->flag |= RPT_HAS_ERROR;
-
-	if((reports->flag & RPT_PRINT) && (type >= reports->printlevel)) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list