Files
LayaNative2.0/Conch/source/common/resource/JCResource.cpp
T
2020-11-11 16:17:13 +08:00

155 lines
3.6 KiB
C++

/**
@file JCResource.cpp
@brief
@author James
@version 1.0
@date 2016_5_12
*/
#include "JCResource.h"
#include "JCResManager.h"
namespace laya{
JCResStateDispatcher::JCResStateDispatcher()
{
m_nResState = getting;
m_nErrNo = noError;
}
JCResource::JCResource()
{
m_pResManager = NULL;
m_nUsedMem=0;
m_nResSize =0;
m_nTouch = 0;
}
JCResource::~JCResource()
{
if(m_pResManager && m_nUsedMem )
{
m_pResManager->freeRes(this,true);
}
m_pResManager = NULL;
}
/*
注意:资源释放后再恢复,如果不做特殊处理,是不会再次出发onload的回调的。因为已经被删掉了。
*/
void JCResStateDispatcher::setState( JCResource::ResState p_state )
{
m_nResState = p_state;
switch(p_state)
{
case getting:
break;
case ready:
{
swap(m_allOnReadyCB, m_tmpOnReadyCB);
m_allOnReadyCB.clear();
m_allOnErrCB.clear();
int nNum = m_tmpOnReadyCB.size();
for (int i = 0; i < nNum; i++){
m_tmpOnReadyCB[i](this);
}
m_tmpOnReadyCB.clear();
}
break;
case error:
{
swap(m_allOnErrCB, m_tmpOnErrCB);
m_allOnErrCB.clear();
m_allOnReadyCB.clear();
int nNum = m_tmpOnErrCB.size();
for( int i=0; i<nNum; i++){
m_tmpOnErrCB[i](this,m_nErrNo);
}
m_tmpOnErrCB.clear();
}
break;
//如果资源被释放了,则onload和onerror都会被清掉,在恢复的时候,不会再调到对应的函数了。
//如果需要调用,就要在回调中再次添加监听
case freed:
{
swap(m_allOnFreeCB, m_tmpOnFreeCB);
m_allOnFreeCB.clear();
int nNum = m_tmpOnFreeCB.size();
for(int i=0; i<nNum; i++){
m_tmpOnFreeCB[i](this);
}
m_tmpOnFreeCB.clear();
}
break;
}
}
//资源准备好之后的回调。可以调用多次,添加多个回调
void JCResStateDispatcher::setOnReadyCB( JCResource::ResOnReadyCB cb )
{
switch( m_nResState )
{
case ready:
cb(this);
break;
case getting:
m_allOnReadyCB.push_back(cb);
break;
case freed:
case error://error的话要再次重试
m_nResState = getting;
m_allOnReadyCB.push_back(cb);
restoreRes(); //完成后需要设置state? 现在如果需要恢复资源的话,调用者自己控制
//还是这里做吧,要不总是容易忘了
//文件资源 怎么办
break;
}
}
void JCResStateDispatcher::setOnFreeCB( JCResource::ResOnReadyCB cb )
{
switch( m_nResState ){
case error:
m_nResState = getting;
case ready:
case getting:
m_allOnFreeCB.push_back(cb);
break;
case freed:
cb(this);
break;
}
}
void JCResStateDispatcher::setOnErrorCB(ResOnErrCB cb)
{
switch( m_nResState ){
case ready:
case freed:
break;
case getting:
m_allOnErrCB.push_back(cb);
break;
case error://问题,如果多次调用,例如想再重试一下,那直接调用并不是期望的
m_nResState = getting;
m_allOnErrCB.push_back(cb);
restoreRes();
//cb(this,mnErrNo );
break;
}
}
void JCResource::touch(bool p_bRestoreRes)
{
if(m_pResManager){
m_pResManager->touchRes(this,p_bRestoreRes);
}
}
void JCResource::setResSize(int sz)
{
if(sz==m_nResSize)return;
m_nResSize = sz;
if(m_pResManager){
m_pResManager->updateRes(this);
}
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------