1 package org.mortbay.cometd.client.ext; 2 3 import java.util.Map; 4 5 import org.cometd.Client; 6 import org.cometd.Extension; 7 import org.cometd.Message; 8 import org.mortbay.util.ajax.JSON; 9 10 public class TimesyncClientExtension implements Extension 11 { 12 volatile int _lag; 13 volatile int _offset; 14 15 public Message rcv(Client from, Message message) 16 { 17 return message; 18 } 19 20 public Message rcvMeta(Client from, Message message) 21 { 22 Map<String,Object> ext=message.getExt(false); 23 if (ext!=null) 24 { 25 Map<String,Object> sync=(Map<String,Object>)ext.get("timesync"); 26 if (sync!=null) 27 { 28 long now = System.currentTimeMillis(); 29 30 final long tc=((Number)sync.get("tc")).longValue(); 31 final long ts=((Number)sync.get("ts")).longValue(); 32 final int p=((Number)sync.get("p")).intValue(); 33 final int a=((Number)sync.get("a")).intValue(); 34 35 int l=(int)(now-tc-p)/2-a; 36 int o=(int)(ts-tc)-l; 37 38 _lag=(_lag+l)/2; 39 _offset=(_offset+o)/2; 40 } 41 } 42 43 return message; 44 } 45 46 public Message send(Client from, Message message) 47 { 48 return message; 49 } 50 51 public Message sendMeta(Client from, Message message) 52 { 53 Map<String,Object> ext=message.getExt(true); 54 long now = System.currentTimeMillis(); 55 JSON.Literal timesync=new JSON.Literal("{\"tc\":"+now+",\"l\":"+_lag+",\"o\":"+_offset+"}"); 56 ext.put("timesync",timesync); 57 return message; 58 } 59 60 public int getOffset() 61 { 62 return _offset; 63 } 64 65 public int getLag() 66 { 67 return _lag; 68 } 69 70 public long getServerTime() 71 { 72 return System.currentTimeMillis()+_offset; 73 } 74 75 }