////////////////////////////////////////////////////////////////////////// // getResource ReObjectRef< CsResource > CsCore::getResource( const BcChar* pFullName ) { ReObjectRef< CsResource > Handle; if( pFullName != NULL ) { BcChar FullNameBuffer[ 1024 ]; BcAssertMsg( BcStrLength( pFullName ) < sizeof( FullNameBuffer ), "CsPackageImporter: Full name too long." ); BcStrCopy( FullNameBuffer, pFullName ); BcChar* pPackageNameBuffer = NULL; BcChar* pResourceNameBuffer = NULL; BcChar* pTypeNameBuffer = NULL; BcAssertMsg( BcStrStr( FullNameBuffer, "." ) != NULL, "CsCore: Missing package from \"%s\"", FullNameBuffer ); BcAssertMsg( BcStrStr( FullNameBuffer, ":" ) != NULL, "CsCore: Missing type from \"%s\"", FullNameBuffer ); pPackageNameBuffer = &FullNameBuffer[ 0 ]; pResourceNameBuffer = BcStrStr( FullNameBuffer, "." ); pTypeNameBuffer = BcStrStr( FullNameBuffer, ":" ); *pResourceNameBuffer++ = '\0'; *pTypeNameBuffer++ = '\0'; BcName PackageName = pPackageNameBuffer; BcName ResourceName = pResourceNameBuffer; internalFindResource( PackageName, ResourceName, ReManager::GetClass( pTypeNameBuffer ), Handle ); BcAssertMsg( Handle.isValid(), "CsCore: Unable to find \"%s\"", FullNameBuffer ); } return Handle; }
////////////////////////////////////////////////////////////////////////// // internalRequestResource BcBool CsCore::internalRequestResource( const BcName& Package, const BcName& Name, const ReClass* Class, ReObjectRef< CsResource >& Handle ) { // Find package CsPackage* pPackage = findPackage( Package ); if( pPackage || Package == BcName::NONE ) { // If we can't find resource, throw an error. if( internalFindResource( Package, Name, Class, Handle ) == BcFalse ) { BcPrintf( "CsCore::requestResource: Resource not availible \"%s.%s:%s\" requested.\n", (*Package).c_str(), (*Name).c_str(), (*Class->getName()).c_str() ); } } else { BcPrintf( "CsCore::requestResource: Invalid package \"%s\" requested.\n", (*Package).c_str() ); } return Handle.isValid(); }
////////////////////////////////////////////////////////////////////////// // internalRequestResource BcBool CsCore::internalRequestResource( const BcName& Name, const BcName& Type, CsResourceRef<>& Handle ) { #if PSY_SERVER // Attempt to import on request if need be. BcPath FileName = getResourceFullName( Name, Type ); if( shouldImportResource( FileName, BcFalse ) ) { if( internalImportResource( FileName, Handle, NULL, BcFalse ) ) { return Handle.isValid(); } } #endif // Try to find resource, if we can't, allocate a new one and put into create list. if( internalFindResource( Name, Type, Handle ) == BcFalse ) { // Only request if we have a name. if( Name.isValid() ) { // Create a file reader for resource (using full name!) CsFile* pFile = createFileReader( getResourceFullName( Name, Type ) ); // Allocate resource. Handle = allocResource( Name, Type, pFile ); if( Handle.isValid() ) { // Call default initialiser. Handle->initialise(); // Acquire (callback from load will release). Handle->acquire(); // Trigger a file load. if( pFile->load( CsFileReadyDelegate::bind< CsResource, &CsResource::delegateFileReady >( (CsResource*)Handle ), CsFileChunkDelegate::bind< CsResource, &CsResource::delegateFileChunkReady >( (CsResource*)Handle ) ) ) { // Put into create list. if( Handle.isValid() ) { BcScopedLock< BcMutex > Lock( ContainerLock_ ); CreateResources_.push_back( Handle ); } } else { BcPrintf( "CsCore::requestResource: Failed to load %s (%s).\n", (*Name).c_str(), pFile->getName().c_str() ); // Release (callback from load won't happen on failure). Handle->release(); Handle = NULL; } } else { BcPrintf( "CsCore::requestResource: Failed to create %s (%s).\n", (*Name).c_str(), pFile->getName().c_str() ); Handle = NULL; } } else { BcPrintf( "CsCore::requestResource: Resource name invalid.\n" ); Handle = NULL; } } return Handle.isValid(); }