import {DataStream} from '../../../common/io/DataStream';
import {DataViewer} from '../../../common/io/DataViewer';
import {ClassUtil} from '../../../common/reflect/ClassUtil';
import {FResourceBlockStorageData} from './FResourceBlockStorageData';
import {FResourceStorage} from './FResourceStorage';
//==========================================================
// 资源分块存储。
//
// @class
// @author maocy
// @version 150507
//==========================================================
export class FResourceBlockStorage extends FResourceStorage {
//..........................................................
// @attribute
protected _ready = false;
protected _dataLength = 0;
protected _blockSize = 0;
protected _blockCount = 0;
//o._blocks = MO.Class.register(o, new MO.AGetter('_blocks'));
protected _blocks: any = null;
protected _resource = null;
//==========================================================
// 构造处理。
//
// @method
//==========================================================
public constructor() {
super();
// 设置属性
//o._blocks = new MO.TObjects();
}
//==========================================================
// 测试是否准备好。
//
// @method
// @return Boolean 是否准备好
//==========================================================
public testReady() {
var o = this;
if (!o._ready) {
var blocks = o._blocks;
var count = blocks.count();
for (var i = 0; i < count; i++) {
var block = blocks.at(i);
if (!block.testReady()) {
return false;
}
}
o._ready = true;
}
return o._ready;
}
//==========================================================
// 加载事件完成后,响应的处理。
//
// @method
// @param buffer:ArrayBuffer 数据
//==========================================================
public load(buffer) {
var o = this;
var resource = o._resource;
//o._compressLength = buffer.byteLength;
// 创建读取流
var view = ClassUtil.create(DataViewer);
view.setEndianCd(true);
view.link(buffer);
// 反序列化数据
var compressCode = view.readString();
var length = o._dataLength = view.readInt32();
var blockSize = o._blockSize = view.readInt32();
var blockCount = o._blockCount = view.readInt32();
var blocks = o._blocks;
for (var i = 0; i < blockCount; i++) {
// 读取数据
var size = view.readInt32();
var blockData = new ArrayBuffer(size);
view.readBytes(blockData, 0, size);
// 创建数据块
var block = ClassUtil.create(FResourceBlockStorageData);
block._guid = resource.guid();
block._index = i;
block.setCompressData(blockData);
blocks.push(block)
}
// 释放资源
view.dispose();
}
//==========================================================
// 释放处理。
//
// @method
//==========================================================
public complete() {
var o = this;
var resource = o._resource;
// 合并数据流
var stream = ClassUtil.create(DataStream);
stream.setEndianCd(true);
stream.setLength(o._dataLength);
var blocks = o._blocks;
var count = blocks.count();
for (var i = 0; i < count; i++) {
var block = blocks.at(i);
var data = block._data;
stream.writeBytes(data.buffer, 0, data.byteLength);
}
// 资源完成处理
stream.flip();
//var span = MO.Timer.current() - resource._compressStartTick;
//MO.Logger.info(o, 'Process resource storage. (guid={1}, block_count={2}, length={3}, total={4}, tick={5})', resource.guid(), count, o._compressLength, o._dataLength, span);
// 加载资源
resource.onComplete(stream);
// 释放数据流
stream.dispose();
}
//==========================================================
// 释放处理。
//
// @method
//==========================================================
public dispose() {
var o = this;
// 清空属性
o._resource = null;
// 是否所有存储块
var blocks = o._blocks;
if (blocks) {
var count = blocks.count();
for (var i = 0; i < count; i++) {
var block = blocks.at(i);
block.dispose();
}
//o._blocks = MO.Lang.Object.dispose(blocks);
}
// 父处理
super.dispose();
}
}