コード例 #1
0
ファイル: Project.cpp プロジェクト: nbtdev/teardrop
PackageManager* Project::createPackage()
{
	PackageManager* pkgMgr = new PackageManager();
	pkgMgr->metadata()->setName("Untitled Package");
	mPackageManagers.push_back(pkgMgr);
	return pkgMgr;
}
コード例 #2
0
ファイル: Project.cpp プロジェクト: nbtdev/teardrop
bool Project::write(ProgressFeedback* feedback)
{
	String pathname(mPath);
	pathname += PATHSEP;
	pathname += mName;
	pathname += ".project";

	TiXmlDocument doc;
	TiXmlDeclaration decl("1.0", "", "");
	doc.InsertEndChild(decl);

	TiXmlElement project("project");
	std::stringstream ss;
	ss << mVersion;
	std::string str(ss.str());
	project.SetAttribute("version", str.c_str());

	ss.str("");
	ss << mPackageManagers.size();
	str.assign(ss.str());
	project.SetAttribute("package_count", str.c_str());

	String packagePath(mPath);
	packagePath += "/packages/";

	for (PackageManagers::iterator it = mPackageManagers.begin(); it != mPackageManagers.end(); ++it) {
		PackageManager* pkgMgr = *it;

		TiXmlElement package("package");
		String name(pkgMgr->metadata()->getName());
		package.SetAttribute("name", name);

		name = pkgMgr->packageFilename();
		package.SetAttribute("filename", name);

		project.InsertEndChild(package);

		// write out the actual package file
		pkgMgr->save(packagePath);
	}

	doc.InsertEndChild(project);

	doc.SaveFile(pathname);

	return true;
}
コード例 #3
0
ファイル: Project.cpp プロジェクト: nbtdev/teardrop
PackageManager* Project::addPackage(const char* packagePath)
{
	// verify that the package's path is our package directory; if not, copy the 
	// package file to our packages dir first and change the path
	String packagesDir(mPath);
	packagesDir += "/packages/";

	String baseName;
	FileSystem::baseName(baseName, packagePath);

	String packageDir;
	FileSystem::directoryName(packageDir, packagePath);
	
	if (!FileSystem::isSamePath(packagesDir, packageDir)) {
		String fileName;
		FileSystem::fileName(fileName, packagePath);
		
		String newPackagePath(packagesDir);
		newPackagePath.append("/");
		newPackagePath.append(fileName);
		
		if (!FileSystem::copyFile(packagePath, newPackagePath)) {
			// then what?
			return 0;
		}
	}

	PackageManager* pkgMgr = new PackageManager;
	pkgMgr->metadata()->setName(baseName);

	DeferredObjectResolves deferred;
	ObjectIdToObject lut;

	if (!pkgMgr->load(packagesDir, deferred, lut)) {
		delete pkgMgr;
		return 0;
	}

	mPackageManagers.push_back(pkgMgr);

	// then do Phase 2 load (object reference resolution)
	for (DeferredObjectResolves::iterator it = deferred.begin(); it != deferred.end(); ++it) {
		DeferredResolution& d = *it;
		ObjectIdToObject::iterator o = lut.find(d.mUUID);
		if (o != lut.end()) {
			d.mProp->setData(d.mObject, o->second);
		}
	}

	std::list<Metadata*> metaList;
	pkgMgr->getAllMetadata(metaList);

	// load all thumbnails in parallel
	tbb::task* dummy = new(tbb::task::allocate_root()) DummyTask;
	dummy->set_ref_count(metaList.size() + 1);

	for (std::list<Metadata*>::iterator it = metaList.begin(); it != metaList.end(); ++it) {
		tbb::task* t = new(dummy->allocate_child()) ThumbnailTask(*it);
		dummy->spawn(*t);
	}
	dummy->wait_for_all();

	return pkgMgr;
}
コード例 #4
0
ファイル: Project.cpp プロジェクト: nbtdev/teardrop
bool Project::read(ProgressFeedback* feedback)
{
	String pathname(mPath);
	pathname += PATHSEP;
	pathname += mName;
	pathname += ".project";

	TiXmlDocument doc;
	doc.LoadFile(pathname);

	updateFeedback(feedback);

	if (doc.Error()) {
		return false;
	}

	// otherwise, read project file
	TiXmlElement* root = doc.RootElement();

	// TODO: check version compatibility
	const char* nPackageAttr = root->Attribute("package_count");
	int nPkg = -1;
	if (nPackageAttr)
		nPkg = atoi(nPackageAttr);

	TiXmlElement* package = root->FirstChildElement("package");

	// for deferred object-reference resolution
	DeferredObjectResolves deferred;
	ObjectIdToObject lut;

	// for metadata thumbnail loading
	std::list<Metadata*> metaList;

	int p = 0;
	while (package) {
		const char* name = package->Attribute("name");
		const char* filename = package->Attribute("filename");

		std::string pkgInfoText("Loading Package: ");
		updateFeedback(feedback, pkgInfoText.c_str());

		if (name && filename) {
			pkgInfoText.append(name);

			PackageManager* pkgMgr = new PackageManager();
			pkgMgr->metadata()->setName(name);

			String path(mPath);
			path += "/packages/";
			pkgMgr->load(path, deferred, lut);

			// add package metadata to list to post-process
			pkgMgr->getAllMetadata(metaList);

			mPackageManagers.push_back(pkgMgr);
			updateFeedback(feedback, int(float(++p)/float(nPkg)*100.f), pkgInfoText.c_str());
		}

		package = package->NextSiblingElement("package");
	}

	// then do Phase 2 load (object reference resolution)
	for (DeferredObjectResolves::iterator it = deferred.begin(); it != deferred.end(); ++it) {
		DeferredResolution& d = *it;
		ObjectIdToObject::iterator o = lut.find(d.mUUID);
		if (o != lut.end()) {
			d.mProp->setData(d.mObject, o->second);
		}
	}

	// Phase 3 -- initialize all objects in the project
	for (PackageManagers::iterator it = mPackageManagers.begin(); it != mPackageManagers.end(); ++it) {
		(*it)->initializeAllObjects();
	}

	// load all thumbnails in parallel
	tbb::task* dummy = new(tbb::task::allocate_root()) DummyTask;
	dummy->set_ref_count(metaList.size() + 1);
	for (std::list<Metadata*>::iterator it = metaList.begin(); it != metaList.end(); ++it) {
		tbb::task* t = new(dummy->allocate_child()) ThumbnailTask(*it);
		dummy->spawn(*t);
	}

	dummy->wait_for_all();
	return true;
}