/******************************************************************************* * Copyright (c) 2013 Luigi Sgro. All rights reserved. This * program and the accompanying materials are made available under the terms of * the Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Luigi Sgro - initial API and implementation ******************************************************************************/ package com.quantcomponents.ib; import java.util.logging.Level; import java.util.logging.Logger; import com.ib.client.EClientSocket; public abstract class IBClient extends IBWrapperHelper { private static final Logger logger = Logger.getLogger(IBClient.class.getName()); private EClientSocket sender; private int pendingReqId; private volatile boolean requestInProgress; private Exception exception; private String errorMessage; abstract protected void doSendRequest(); public void sendRequest(int reqId) { requestInProgress = true; pendingReqId = reqId; doSendRequest(); } public int getPendingReqId() { return pendingReqId; } public boolean isRequestInProgress() { return requestInProgress; } public boolean hasErrors() { return exception != null || errorMessage != null; } public Exception getException() { return exception; } public String getErrorMessage() { return errorMessage; } @Override public void error(Exception e) { exception = e; errorMessage = e.getMessage(); setRequestComplete(); e.printStackTrace(); } @Override public void error(String str) { errorMessage = str; setRequestComplete(); logger.log(Level.WARNING, "Message from IB: " + str); } @Override public void error(int id, int errorCode, String errorMsg) { if (id == pendingReqId) { errorMessage = "id: " + id + "; code: " + errorCode + " [" + errorMsg + "]"; setRequestComplete(); } if (errorCode == 1101) //Connectivity between IB and TWS has been lost - data lost { errorMessage = "id: " + id + "; code: " + errorCode + " [" + errorMsg + "]"; setRequestComplete(); sendRequest(pendingReqId + 1000000); //resubmit the request } logger.log(Level.WARNING, "Message from IB: id: " + id + "; code: " + errorCode + " [" + errorMsg + "]"); } protected EClientSocket getSender() { return sender; } protected void setRequestComplete() { this.requestInProgress = false; } /* package */ void registerSender(EClientSocket sender) { this.sender = sender; } /* package */ void unregisterSender() { this.sender = null; } }