[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35505] trunk/blender/source/blender: py/ library api: raise an error if a requested member isn't found.

Campbell Barton ideasman42 at gmail.com
Sun Mar 13 02:15:14 CET 2011


Revision: 35505
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35505
Author:   campbellbarton
Date:     2011-03-13 01:15:14 +0000 (Sun, 13 Mar 2011)
Log Message:
-----------
py/library api: raise an error if a requested member isn't found.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/BLO_readfile.h
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/python/intern/bpy_library.c

Modified: trunk/blender/source/blender/blenloader/BLO_readfile.h
===================================================================
--- trunk/blender/source/blender/blenloader/BLO_readfile.h	2011-03-13 00:26:46 UTC (rev 35504)
+++ trunk/blender/source/blender/blenloader/BLO_readfile.h	2011-03-13 01:15:14 UTC (rev 35505)
@@ -208,7 +208,19 @@
 int BLO_is_a_library(const char *path, char *dir, char *group);
 
 struct Main* BLO_library_append_begin(const struct bContext *C, BlendHandle** bh, char *dir);
-void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag);
+
+/**
+ * Link/Append a named datablock from an external blend file.
+ *
+ * @param C The context, when NULL instancing object in the scene isnt done.
+ * @param mainl The main database to link from (not the active one).
+ * @param bh The blender file handle.
+ * @param name The name of the datablock (without the 2 char ID prefix)
+ * @param idcode The kind of datablock to link.
+ * @param flag Options for linking, used for instancing.
+ * @return Boolean, 0 when the datablock could not be found.
+ */
+int BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag);
 void BLO_library_append_end(const struct bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag);
 
 /* deprecated */

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2011-03-13 00:26:46 UTC (rev 35504)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2011-03-13 01:15:14 UTC (rev 35505)
@@ -12698,7 +12698,9 @@
 	}
 }
 
-static void append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *name, int idcode, short flag)
+/* returns true if the item was found
+ * but it may already have already been appended/linked */
+static int append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *name, int idcode, short flag)
 {
 	Scene *scene= CTX_data_scene(C);
 	Object *ob;
@@ -12706,6 +12708,7 @@
 	BHead *bhead;
 	ID *id;
 	int endloop=0;
+	int found=0;
 
 	bhead = blo_firstbhead(fd);
 	while(bhead && endloop==0) {
@@ -12715,7 +12718,7 @@
 			char *idname= bhead_id_name(fd, bhead);
 				
 			if(strcmp(idname+2, name)==0) {
-
+				found= 1;
 				id= is_yet_read(fd, mainl, bhead);
 				if(id==NULL) {
 					read_libblock(fd, mainl, bhead, LIB_TESTEXT, NULL);
@@ -12762,12 +12765,14 @@
 
 		bhead = blo_nextbhead(fd, bhead);
 	}
+
+	return found;
 }
 
-void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag)
+int BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag)
 {
 	FileData *fd= (FileData*)(*bh);
-	append_named_part(C, mainl, fd, name, idcode, flag);
+	return append_named_part(C, mainl, fd, name, idcode, flag);
 }
 
 static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r)

Modified: trunk/blender/source/blender/python/intern/bpy_library.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_library.c	2011-03-13 00:26:46 UTC (rev 35504)
+++ trunk/blender/source/blender/python/intern/bpy_library.c	2011-03-13 01:15:14 UTC (rev 35505)
@@ -258,6 +258,7 @@
 static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
 {
 	Main *mainl= NULL;
+	int err= 0;
 
 	flag_all_listbases_ids(LIB_PRE_EXISTING, 1);
 
@@ -285,7 +286,11 @@
 						// printf("  %s\n", item_str);
 
 						if(item_str) {
-							BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag);
+							if(!BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag)) {
+								PyErr_Format(PyExc_KeyError, "load: %s does not contain %s[\"%s\"]", self->abspath, name_plural, item_str);
+								err= -1;
+								break;
+							}
 						}
 						else {
 							/* XXX, could complain about this */
@@ -297,26 +302,33 @@
 		}
 	}
 
-	BLO_library_append_end(NULL, mainl, &(self->blo_handle), 0, self->flag);
-	BLO_blendhandle_close(self->blo_handle);
+	if(err == -1) {
+		/* exception raised above, XXX, this leaks some memory */
+		BLO_blendhandle_close(self->blo_handle);
+		self->blo_handle= NULL;
+		return NULL;
+	}
+	else {
+		BLO_library_append_end(NULL, mainl, &(self->blo_handle), 0, self->flag);
+		BLO_blendhandle_close(self->blo_handle);
+		self->blo_handle= NULL;
 
-	{	/* copied from wm_operator.c */
-		/* mark all library linked objects to be updated */
-		recalc_all_library_objects(G.main);
+		{	/* copied from wm_operator.c */
+			/* mark all library linked objects to be updated */
+			recalc_all_library_objects(G.main);
 
-		/* append, rather than linking */
-		if((self->flag & FILE_LINK)==0) {
-			Library *lib= BLI_findstring(&G.main->library, self->abspath, offsetof(Library, name));
-			if(lib)	all_local(lib, 1);
-			else	BLI_assert(!"cant find name of just added library!");
+			/* append, rather than linking */
+			if((self->flag & FILE_LINK)==0) {
+				Library *lib= BLI_findstring(&G.main->library, self->abspath, offsetof(Library, name));
+				if(lib)	all_local(lib, 1);
+				else	BLI_assert(!"cant find name of just added library!");
+			}
 		}
-	}
 
-	flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
+		flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
 
-	self->blo_handle= NULL;
-
-	Py_RETURN_NONE;
+		Py_RETURN_NONE;
+	}
 }
 
 int bpy_lib_init(PyObject *mod_par)




More information about the Bf-blender-cvs mailing list