protected void ConnectionHandler(object o, EventArgs eargs) {
if(!_online) {
return;
}
ConnectionEventArgs cargs = eargs as ConnectionEventArgs;
Connection old_con = cargs.Connection;
//first make sure that it is a new StructuredConnection
if (old_con.MainType != ConnectionType.Structured) {
return;
}
lock(_transfer_sync) {
if(!_online) {
return;
}
ConnectionTable tab = _node.ConnectionTable;
Connection lc = null, rc = null;
try {
lc = tab.GetLeftStructuredNeighborOf((AHAddress) _node.Address);
}
catch(Exception) {}
try {
rc = tab.GetRightStructuredNeighborOf((AHAddress) _node.Address);
}
catch(Exception) {}
if(lc != null) {
if(lc.Address != _left_addr) {
if(_left_transfer_state != null) {
_left_transfer_state.Interrupt();
_left_transfer_state = null;
}
_left_addr = lc.Address;
if(Count > 0) {
_left_transfer_state = new TransferState(lc, this);
}
}
}
else if(_left_addr != null) {
if(_left_transfer_state != null) {
_left_transfer_state.Interrupt();
_left_transfer_state = null;
}
_left_addr = null;
}
if(rc != null) {
if(rc.Address != _right_addr) {
if(_right_transfer_state != null) {
_right_transfer_state.Interrupt();
_right_transfer_state = null;
}
_right_addr = rc.Address;
if(Count > 0) {
_right_transfer_state = new TransferState(rc, this);
}
}
}
else if(_right_addr != null) {
if(_right_transfer_state != null) {
_right_transfer_state.Interrupt();
_right_transfer_state = null;
}
_right_addr = null;
}
}
}