package com.kitty.poclient.upnp;
import java.util.Date;
import org.fourthline.cling.controlpoint.SubscriptionCallback;
import org.fourthline.cling.model.gena.CancelReason;
import org.fourthline.cling.model.gena.GENASubscription;
import org.fourthline.cling.model.message.UpnpResponse;
import org.fourthline.cling.model.meta.Service;
import org.fourthline.cling.model.types.UnsignedIntegerFourBytes;
import org.fourthline.cling.support.lastchange.LastChange;
import android.util.Log;
import com.kitty.poclient.R;
import com.kitty.poclient.bean.CurrentCacheChangeInfo;
import com.kitty.poclient.common.CrashHandler;
import com.kitty.poclient.common.MymusicManager;
import com.kitty.poclient.common.UIHelper;
import com.kitty.poclient.common.UpnpApp;
import com.kitty.poclient.common.WatchDog;
import com.kitty.poclient.data.VirtualData;
import com.kitty.poclient.domain.Music;
import com.kitty.poclient.util.IDUtil;
import com.kitty.poclient.util.JsonUtil;
public class CacheControlSubscriptionCallback extends SubscriptionCallback {
String TAG = "CacheControlSubscriptionCallback";
private LastChange lastChange;
public CacheControlSubscriptionCallback(Service service) {
super(service);
}
@Override
protected void established(GENASubscription arg0) {
Log.e(TAG, "CacheControlSubscriptionCallback established");
WatchDog.cacheSubFailCount = 0;
CrashHandler.getInstance().saveCrashInfo2FileII("CacheControlSubscriptionCallback established: time=" + new Date(System.currentTimeMillis()));
}
@Override
protected void ended(GENASubscription arg0, CancelReason arg1, UpnpResponse arg2) {
Log.e(TAG, "CacheControlSubscriptionCallback ended");
CrashHandler.getInstance().saveCrashInfo2FileII("CacheControlSubscriptionCallback ended: CancelReason=" + arg1 + ";UpnpResponse=" + arg2);
// TabMusicActivity.receiveCacheSub();
// MyMusicActivity.receiveCacheSub();
MymusicManager.receiveCacheSub();
}
@Override
protected void eventsMissed(GENASubscription arg0, int arg1) {
Log.e(TAG, "CacheControlSubscriptionCallback eventsMissed");
CrashHandler.getInstance().saveCrashInfo2FileII("CacheControlSubscriptionCallback eventsMissed: time=" + new Date(System.currentTimeMillis()));
}
// Called when establishing a local or remote subscription failed.
@Override
protected void failed(GENASubscription arg0, UpnpResponse arg1, Exception ex, String arg3) {
Log.e(TAG, "CacheControlSubscriptionCallback failed: ex=" + ex);
CrashHandler.getInstance().saveCrashInfo2FileII("CacheControlSubscriptionCallback failed: ex=" + ex + " time=" + new Date(System.currentTimeMillis()));
WatchDog.cacheSubFailCount++;
if (WatchDog.cacheSubFailCount <= 3) {
// TabMusicActivity.receiveCacheSub();
// MyMusicActivity.receiveCacheSub();
} else {
UpnpApp.reconnect();
}
}
@Override
protected void eventReceived(GENASubscription sub) {
Log.e(TAG, "CacheControlSubscriptionCallback eventReceived");
UnsignedIntegerFourBytes currentSequence = sub.getCurrentSequence();
Log.e(TAG, "currentSequence=" + currentSequence);
String xml = sub.getCurrentValues().get("LastChange").toString();
Log.e(TAG, "currentValuesXml=" + xml);
//缓存更新信息接收
/**
* downloadaction:缓存的动作,开始下载:start,下载结束:finish,下载空间不足:NotspaceEnough
* cacheuri:缓存uri
* statusCode:缓存状态,1=等待中,2=正在缓存,3=暂停,4=完成
* errorcode:缓存错误码
* 注:新盒子有serialNumber,以标注该订阅信息的有效性,旧盒子没此字段
*/
if (xml.contains("CurrentCacheChange")) {
//解释xml
CurrentCacheChangeInfo cachInfo = new JsonUtil().getCurrentCacheChangeInfo(xml);
String uri = cachInfo.getCacheuri();
String statusCode = cachInfo.getStatusCode();
String errorCode = cachInfo.getErrorcode();
long id = Long.parseLong(uri.substring(uri.lastIndexOf("=") + 1));
int serialNumber = 0;
if(!cachInfo.getSerialNumber().equals("")){
serialNumber = Integer.valueOf(cachInfo.getSerialNumber());
}
//更新local缓存
updateCacheState(id, uri, statusCode);
//更新播放器状态
updateBtnPlayer();
//显示错误信息
if (!"200".equals(errorCode)) {
/**99-文件验证失败 100-连接服务器错误 101-网络故障中断缓存 102-用户原因中断缓存 103-存储空间不足 104-内存不足 */
showErrorMsg(id, errorCode);
}
WatchDog.formerCacheSubSerialNumber = serialNumber;
}
}
private void dealWithMissingSub() {
Log.e(TAG, "dealWithMissingSub");
/* TabMusicActivity.getCacheInfo();
TabMusicActivity.getMediaInfo();
TabMusicActivity.getTransportInfo();*/
// MyMusicActivity.getCacheInfo();
// MyMusicActivity.getMediaInfo();
// MyMusicActivity.getTransportInfo();
MymusicManager.getCacheInfo();
MymusicManager.getMediaInfo();
MymusicManager.getTransportInfo();
}
/* 99-文件验证失败 100-连接服务器错误 101-网络故障中断缓存 102-用户原因中断缓存 103-存储空间不足 104-内存不足 */
private void showErrorMsg(long id, String errorCode) {
// 通知界面提示出错信息
if (!"200".equals(errorCode)) {
// System.out.println("errorCode=" + errorCode);
String musicName = IDUtil.getMusicNameFromId(id, null);
String errorMessage = "";
String croutonText = "";
if ("99".equals(errorCode)) {
errorMessage = "校验失败";
} else if ("100".equals(errorCode)) {
errorMessage = "连接服务器错误";
} else if ("101".equals(errorCode)) {
errorMessage = "网络故障";
} else if ("102".equals(errorCode)) {
errorMessage = "WHAT U A STUPID ASSHOLE...";
} else if ("103".equals(errorCode)) {
errorMessage = "存储空间不足";
croutonText = UpnpApp.mainHandler.getString(R.string.cache_space_not_enough_alert);
} else if ("104".equals(errorCode)) {
errorMessage = "内存不足";
} else {
errorMessage = "";
}
if(!croutonText.equals("")){
UpnpApp.mainHandler.showAlert(croutonText);
}
Log.e(TAG, musicName + "缓存失败:" + errorMessage);
}
}
private void updateBtnPlayer() {
// 通知界面刷新播放图标
UIHelper.refreshPlayerButton();
}
private void updateCacheState(long id, String uri, String statusCode) {
// 更新缓存状态存储MAP
WatchDog.cacheStateMap.put(id, statusCode);
Log.e(TAG, "put: id=" + id + ";statusCode=" + statusCode);
if (Music.CACHE_DOWNLOADING.equals(statusCode)) {
WatchDog.clearFormerCaching(id);// 取消其他曲目的 正在缓存 状态
Log.i("CacheMsg", "WatchDog.clearFormerCaching id:" + id);
} else if (Music.CACHE_FAILURE_NOSPACE.equals(statusCode)) {
WatchDog.clearFormerCachingNospace(id);// 取消其他曲目的 空间不足 状态
Log.i("CacheMsg", "WatchDog.clearFormerCachingNospace id:" + id);
} else {
//TODO
}
Log.i("CacheMsg", "WatchDog.cacheStateMap.containsKey(id):"+WatchDog.cacheStateMap.containsKey(id));
//更新localAlbums缓存状态
if(VirtualData.albums!=null && VirtualData.albums.size()>0){
int albumIndex = VirtualData.localAlbums.getParentAlbumIndex(id);
if(albumIndex!=-1){
VirtualData.localAlbums.refreshAlbumCacheStatus(albumIndex);
UIHelper.refreshLocalAlbumsView();
}
}
//更新localThemes缓存状态
if(VirtualData.localThemes!=null && VirtualData.localThemes.size()>0){
int packIndex = VirtualData.localThemes.getParentPackIndex(id);
if(packIndex!=-1){
VirtualData.localThemes.refreshThemeCacheStatus(packIndex);
UIHelper.refreshLocalThemesView();
}
}
//更新localSingles缓存状态
// do nothing
// 通知界面刷新缓存状态
UIHelper.refreshLocalSinglesView();
}
private void onCurrentCacheChange(int instanceId, String currentCacheChange) {
System.out.println(TAG + "currentCacheChange=" + currentCacheChange);
}
}