package com.sissi.pipeline.in.iq.si;
import com.sissi.context.JIDContext;
import com.sissi.pipeline.TransferBuilder;
import com.sissi.pipeline.TransferParam;
import com.sissi.pipeline.in.ProxyProcessor;
import com.sissi.protocol.Protocol;
import com.sissi.protocol.ProtocolType;
import com.sissi.protocol.iq.bytestreams.Bytestreams;
import com.sissi.protocol.iq.data.XData;
import com.sissi.protocol.iq.data.XDataType;
import com.sissi.protocol.iq.data.XField;
import com.sissi.protocol.iq.data.XValue;
import com.sissi.protocol.iq.si.Feature;
import com.sissi.protocol.iq.si.Si;
import com.sissi.server.exchange.ExchangerContext;
/**
* 离线文件接收
*
* @author kim 2014年2月24日
*/
public class Si2DelegationProcessor extends ProxyProcessor {
private final Feature feature = new Feature().x(new XData().setType(XDataType.SUBMIT).add(new XField().setVar("stream-method").add(new XValue(Bytestreams.XMLNS))));
private final ExchangerContext exchangerContext;
private final TransferBuilder transferBuilder;
private final boolean resource;
public Si2DelegationProcessor(ExchangerContext exchangerContext, TransferBuilder transferBuilder, boolean resource) {
super();
this.exchangerContext = exchangerContext;
this.transferBuilder = transferBuilder;
this.resource = resource;
}
@Override
public boolean input(JIDContext context, Protocol protocol) {
Si si = protocol.cast(Si.class).setFeature(this.feature);
this.exchangerContext.wait(si.host(context.jid().asString(this.resource), super.build(si.parent().getTo()).asString(this.resource)), true, this.transferBuilder.build(new SiTransferParam(si)));
context.write(si.parent().reply().setType(ProtocolType.RESULT));
return true;
}
private class SiTransferParam implements TransferParam {
private final Si si;
public SiTransferParam(Si si) {
super();
this.si = si;
}
@Override
public <T> T find(String key, Class<T> clazz) {
switch (key) {
case TransferParam.KEY_SI:
return clazz.cast(this.si);
}
return null;
}
}
}