package net.varkhan.serv.p2p.connect.protocol;
import net.varkhan.base.conversion.serializer.Serializer;
import net.varkhan.base.conversion.serializer.primitives.StringSerializer;
import net.varkhan.base.conversion.serializer.primitives.VariadicSerializer;
import net.varkhan.serv.p2p.connect.PeerProperties;
import net.varkhan.serv.p2p.connect.config.MapProperties;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 5/29/11
* @time 10:14 AM
*/
public class BinaryPropertiesSerializer<C> implements Serializer<PeerProperties, C> {
public MapProperties decode(InputStream stm, C ctx) {
MapProperties props = new MapProperties();
long rnum=VariadicSerializer._decode(stm);
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
for(int r=0;r<rnum&&r<realms.length;r++) {
PeerProperties.Realm realm =realms[r];
long size=VariadicSerializer._decode(stm);
for(long i=0;i<size;i++) {
String key=StringSerializer._decode(stm);
String val=StringSerializer._decode(stm);
props.setProperty(realm, key, val);
}
}
return props;
}
public MapProperties decode(ByteBuffer buf, C ctx) {
MapProperties props = new MapProperties();
long rnum=VariadicSerializer._decode(buf);
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
for(int r=0;r<rnum&&r<realms.length;r++) {
PeerProperties.Realm realm =realms[r];
long size=VariadicSerializer._decode(buf);
for(long i=0;i<size;i++) {
String key=StringSerializer._decode(buf);
String val=StringSerializer._decode(buf);
props.setProperty(realm, key, val);
}
}
return props;
}
public MapProperties decode(byte[] dat, long pos, long len, C ctx) {
MapProperties props = new MapProperties();
long rnum=VariadicSerializer._decode(dat, pos, len);
pos+=VariadicSerializer._length(rnum);
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
for(int r=0;r<rnum&&r<realms.length;r++) {
PeerProperties.Realm realm =realms[r];
long size=VariadicSerializer._decode(dat, pos, len);
pos+=VariadicSerializer._length(size);
for(long i=0;i<size;i++) {
String key=StringSerializer._decode(dat, pos, len);
pos+=StringSerializer._length(key);
String val=StringSerializer._decode(dat, pos, len);
pos+=StringSerializer._length(val);
props.setProperty(realm, key, val);
}
}
return props;
}
public long encode(PeerProperties obj, OutputStream stm, C ctx) {
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
long c=VariadicSerializer._encode(realms.length, stm);
for(PeerProperties.Realm realm : realms) {
PeerProperties p=obj.getProperties(realm);
for(String key : p.getPropertyNames()) {
c+=StringSerializer._encode(key, stm);
c+=StringSerializer._encode(p.getProperty(key), stm);
}
}
return c;
}
public long encode(PeerProperties obj, ByteBuffer buf, C ctx) {
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
long c=VariadicSerializer._encode(realms.length, buf);
for(PeerProperties.Realm realm : realms) {
PeerProperties p=obj.getProperties(realm);
for(String key : p.getPropertyNames()) {
c+=StringSerializer._encode(key, buf);
c+=StringSerializer._encode(p.getProperty(key), buf);
}
}
return c;
}
public long encode(PeerProperties obj, byte[] dat, long pos, long len, C ctx) {
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
long c=VariadicSerializer._encode(realms.length, dat, pos, len);
for(PeerProperties.Realm realm : realms) {
PeerProperties p=obj.getProperties(realm);
for(String key : p.getPropertyNames()) {
c+=StringSerializer._encode(key, dat, pos+c, len-c);
c+=StringSerializer._encode(p.getProperty(key), dat, pos+c, len-c);
}
}
return c;
}
public long length(PeerProperties obj, C ctx) {
PeerProperties.Realm[] realms=PeerProperties.Realm.values();
long c=VariadicSerializer._length(realms.length);
for(PeerProperties.Realm realm : realms) {
PeerProperties p=obj.getProperties(realm);
for(String key : p.getPropertyNames()) {
c+=StringSerializer._length(key);
c+=StringSerializer._length(p.getProperty(key));
}
}
return c;
}
}