268 lines
6.2 KiB
C++
268 lines
6.2 KiB
C++
#include "ImagicDownManager.h"
|
|
#include "Utility.h"
|
|
#include "cocostudio/CocoStudio.h"
|
|
#include "UI/CocosGUI.h"
|
|
|
|
SINGLETON_STORAGE(ImagicDownManager);
|
|
|
|
ImagicDownManager::ImagicDownManager()
|
|
:m_iIdexCout(0)
|
|
{
|
|
cocos2d::Director::getInstance()->getScheduler()->schedule(CC_SCHEDULE_SELECTOR(ImagicDownManager::upTime),this,0.0f,false);
|
|
}
|
|
ImagicDownManager::~ImagicDownManager(void)
|
|
{
|
|
cocos2d::Director::getInstance()->getScheduler()->unschedule(CC_SCHEDULE_SELECTOR(ImagicDownManager::upTime),this);
|
|
}
|
|
std::string DownImagicGetFileName(std::string kName)
|
|
{
|
|
std::string::size_type iStart = 0;
|
|
while (true)
|
|
{
|
|
std::string::size_type iTempPos = kName.find("/",iStart);
|
|
if (iTempPos == std::string::npos)
|
|
{
|
|
break;
|
|
}
|
|
iStart = iTempPos;
|
|
iStart++;
|
|
}
|
|
size_t iEnd = kName.size();
|
|
return kName.substr(iStart,iEnd-iStart);
|
|
}
|
|
|
|
void ImagicDownManager::GetImagic(HttpClient *sender, HttpResponse *response)
|
|
{
|
|
response->retain();
|
|
m_pGetList.push_back(response);
|
|
}
|
|
|
|
void ImagicDownManager::OnImagic()
|
|
{
|
|
if (m_pGetList.size() == 0)
|
|
{
|
|
return;
|
|
}
|
|
HttpResponse *response = m_pGetList[0];
|
|
m_pGetList.erase(m_pGetList.begin());
|
|
std::string kUrl = response->getHttpRequest()->getUrl();
|
|
std::string kImagicName = cocos2d::FileUtils::getInstance()->getWritablePath()+"test.png";
|
|
|
|
ImagicDownInfoList::iterator itor1 = m_pDownList.begin();
|
|
while(itor1 != m_pDownList.end())
|
|
{
|
|
ImagicDownInfo& kInfo = *itor1;
|
|
if (kInfo.kUrl.find(kUrl.c_str()) != std::string::npos)
|
|
{
|
|
kImagicName = kInfo.kImagicName;
|
|
break;
|
|
}
|
|
itor1++;
|
|
}
|
|
std::vector<char> *buffer = response->getResponseData();
|
|
if (buffer->size() == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Image* img = new Image;
|
|
img->initWithImageData((unsigned char*)buffer->data(),buffer->size());
|
|
bool bSucess = false;
|
|
if (img->getData())
|
|
{
|
|
bSucess = img->saveToFile(kImagicName, false);
|
|
}
|
|
|
|
delete img;
|
|
img = nullptr;
|
|
|
|
if (!bSucess) return; // 头像获取不到的时候直接返回;
|
|
|
|
ImagicDownInfoList::iterator itor2 = m_pDownList.begin();
|
|
while(itor2 != m_pDownList.end())
|
|
{
|
|
ImagicDownInfo& kInfo = *itor2;
|
|
if (kInfo.kUrl.find(kUrl.c_str()) != std::string::npos)
|
|
{
|
|
if (kInfo.pSprite)
|
|
{
|
|
if (bSucess)
|
|
{
|
|
utility::setImagic(kInfo.pSprite,kImagicName,kInfo.bSameSize, kInfo.bCircle);
|
|
}
|
|
kInfo.pSprite->release();
|
|
}
|
|
if (kInfo.pButtonSprite)
|
|
{
|
|
if (bSucess)
|
|
{
|
|
//utility::setButtonImagic(kInfo.pButtonSprite,kImagicName,kImagicName,kImagicName);
|
|
}
|
|
kInfo.pButtonSprite->release();
|
|
}
|
|
itor2 = m_pDownList.erase(itor2);
|
|
}
|
|
else
|
|
{
|
|
itor2++;
|
|
}
|
|
}
|
|
response->release();
|
|
}
|
|
|
|
Texture2D* ImagicDownManager::getDownTexture(std::string kFile)
|
|
{
|
|
TextureCache* pTextureCache = cocos2d::Director::getInstance()->getTextureCache();
|
|
Texture2D* pTexture = pTextureCache->addImage(kFile.c_str());
|
|
if (pTexture)
|
|
{
|
|
return pTexture;
|
|
}
|
|
pTexture = pTextureCache->addImage(utility::toString("head/", kFile.c_str()));
|
|
if (pTexture)
|
|
{
|
|
return pTexture;
|
|
}
|
|
|
|
std::string kImagicName = DownImagicGetFileName(kFile);
|
|
kImagicName = FileUtils::getInstance()->getWritablePath()+kImagicName;
|
|
std::string StrSavePath = kImagicName;
|
|
pTexture = pTextureCache->addImage(StrSavePath.c_str());
|
|
if (pTexture)
|
|
{
|
|
return pTexture;
|
|
}
|
|
return NULL;
|
|
}
|
|
void ImagicDownManager::addDown(Node* pNode, std::string kUrl, int iUserID, bool isWeixinHead /*= true*/, bool bSameSize /*= true*/, bool bCircle/* = false*/)
|
|
{
|
|
if (kUrl.size() <= 0) return;
|
|
|
|
int iIdex = 0;
|
|
for (int i = 0;i<kUrl.size();i++)
|
|
{
|
|
iIdex += kUrl[i];
|
|
}
|
|
|
|
if (isWeixinHead)
|
|
{
|
|
std::string strSrc = "/0";
|
|
std::string strDes = "/132";
|
|
std::string::size_type pos = 0;
|
|
std::string::size_type srcLen = strSrc.size();
|
|
std::string::size_type desLen = strDes.size();
|
|
pos = kUrl.find(strSrc, pos);
|
|
while (pos != std::string::npos)
|
|
{
|
|
if (kUrl.find(strSrc, (pos + desLen)) == std::string::npos)
|
|
{
|
|
kUrl.replace(pos, srcLen, strDes);
|
|
break;
|
|
}
|
|
pos = kUrl.find(strSrc, (pos + desLen));
|
|
}
|
|
}
|
|
|
|
std::string kFileName = utility::toString(iUserID,"Idex",iIdex);
|
|
addDown(pNode, kUrl, kFileName, bSameSize, bCircle);
|
|
}
|
|
|
|
void ImagicDownManager::addDown(Node* pNode, std::string kUrl, std::string kFileName, bool bSameSize, bool bCircle/* = false*/)
|
|
{
|
|
if (kUrl == "")
|
|
{
|
|
std::string strImagic = "Platform/lobby/imgHead.png";
|
|
utility::setImagic(pNode, strImagic, bSameSize, bCircle);
|
|
return;
|
|
}
|
|
|
|
Sprite* pSprite = dynamic_cast<Sprite*>(pNode);
|
|
Menu* pButtonSprite = dynamic_cast<Menu*>(pNode);
|
|
ui::ImageView* pImageView = dynamic_cast<ui::ImageView*>(pNode);
|
|
|
|
if (!pSprite && !pButtonSprite && !pImageView)
|
|
{
|
|
CCASSERT(false,"");
|
|
return;
|
|
}
|
|
kFileName = FileUtils::getInstance()->getWritablePath()+kFileName+".png";
|
|
std::string StrSavePath = kFileName;
|
|
if (Director::getInstance()->getTextureCache()->addImage(StrSavePath.c_str()))
|
|
{
|
|
if (pSprite)
|
|
{
|
|
utility::setImagic(pSprite,StrSavePath,bSameSize, bCircle);
|
|
}
|
|
if (pButtonSprite)
|
|
{
|
|
//utility::setButtonImagic(pButtonSprite,StrSavePath,StrSavePath,StrSavePath);
|
|
}
|
|
if (pImageView)
|
|
{
|
|
utility::setImagic(pImageView, StrSavePath, bSameSize, bCircle);
|
|
}
|
|
return;
|
|
}
|
|
bool bHaveGet = false;
|
|
for (int i = 0;i<(int)m_pDownList.size();i++)
|
|
{
|
|
ImagicDownInfo& kInfo = m_pDownList[i];
|
|
if (kInfo.kImagicName == kFileName && kInfo.pSprite == pSprite)
|
|
{
|
|
return;
|
|
}
|
|
if (kInfo.kImagicName == kFileName)
|
|
{
|
|
bHaveGet = true;
|
|
}
|
|
|
|
}
|
|
ImagicDownInfo kInfo;
|
|
kInfo.pSprite = pSprite;
|
|
kInfo.pButtonSprite = pButtonSprite;
|
|
kInfo.kImagicName = kFileName;
|
|
kInfo.kUrl = kUrl;
|
|
kInfo.bSameSize = bSameSize;
|
|
kInfo.bCircle = bCircle;
|
|
if (pSprite)
|
|
{
|
|
pSprite->retain();
|
|
}
|
|
if (pButtonSprite)
|
|
{
|
|
pButtonSprite->retain();
|
|
}
|
|
|
|
if (!bHaveGet)
|
|
{
|
|
HttpRequest* pRequest = CWebReq::getInstance().getFileEx(kUrl, CC_CALLBACK_2(ImagicDownManager::GetImagic, this));
|
|
kInfo.pRequest = pRequest;
|
|
}
|
|
m_pDownList.push_back(kInfo);
|
|
}
|
|
void ImagicDownManager::upTime(float fTime)
|
|
{
|
|
OnImagic();
|
|
ImagicDownInfoList::iterator itor = m_pDownList.begin();
|
|
while(itor != m_pDownList.end())
|
|
{
|
|
ImagicDownInfo& kInfo = *itor;
|
|
kInfo.fActTime += fTime;
|
|
if (kInfo.fActTime > 20.0f)
|
|
{
|
|
if (kInfo.pSprite)
|
|
{
|
|
kInfo.pSprite->release();
|
|
}
|
|
if (kInfo.pButtonSprite)
|
|
{
|
|
kInfo.pButtonSprite->release();
|
|
}
|
|
itor = m_pDownList.erase(itor);
|
|
}
|
|
else
|
|
{
|
|
itor++;
|
|
}
|
|
}
|
|
} |