/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software Systems and others.
* 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.command;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.cdt.debug.mi.core.output.MILogStreamOutput;
import org.eclipse.cdt.debug.mi.core.output.MIOOBRecord;
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
import org.eclipse.cdt.debug.mi.core.output.MIStreamRecord;
/**
* A base class for all mi requests.
*/
public abstract class Command
{
private static int globalCounter;
int token = 0;
MIOutput output;
boolean quiet = false;
/**
* A global counter for all command, the token
* will be use to identify uniquely a command.
* Unless the value wraps around which is unlikely.
*/
private static synchronized int getUniqToken() {
int count = ++globalCounter;
// If we ever wrap around.
if (count <= 0) {
count = globalCounter = 1;
}
return count;
}
/**
* Returns the identifier of this request.
*
* @return the identifier of this request
*/
public int getToken() {
if (token == 0) {
token = getUniqToken();
}
return token;
}
// public void setToken(int token) {
// this.token = token;
// }
public MIOutput getMIOutput() {
return output;
}
public void setMIOutput(MIOutput mi) {
output = mi;
}
/**
* Parse the MIOutput generate after posting the command.
*/
public MIInfo getMIInfo () throws MIException {
MIInfo info = null;
MIOutput out = getMIOutput();
if (out != null) {
info = new MIInfo(out);
if (info.isError()) {
throwMIException(info, out);
}
}
return info;
}
/**
* throw an MIException.
*/
protected void throwMIException (MIInfo info, MIOutput out) throws MIException {
String mesg = info.getErrorMsg().trim();
StringBuffer sb = new StringBuffer();
MIOOBRecord[] oobs = out.getMIOOBRecords();
for (int i = 0; i < oobs.length; i++) {
if (oobs[i] instanceof MILogStreamOutput) {
MIStreamRecord o = (MIStreamRecord) oobs[i];
String s = o.getString();
if (!s.trim().equalsIgnoreCase(mesg)) {
sb.append(s);
}
}
}
String details = sb.toString();
if (details.trim().length() == 0) {
details = mesg;
}
throw new MIException(mesg, details);
}
public boolean isQuiet() {
return this.quiet;
}
public void setQuiet( boolean quiet ) {
this.quiet = quiet;
}
}