diff -r ed1c9f64298a -r 5b9d4d8641ce trace/traceviewer/com.nokia.trace.dictionary/src/com/nokia/trace/dictionary/model/decodeparameters/EnumParameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trace/traceviewer/com.nokia.trace.dictionary/src/com/nokia/trace/dictionary/model/decodeparameters/EnumParameter.java Wed Jun 23 14:49:59 2010 +0300 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + * Enum parameter + * + */ +package com.nokia.trace.dictionary.model.decodeparameters; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Collections; +import java.util.Comparator; + +/** + * Enum parameter + */ +public class EnumParameter extends DecodeParameter { + + /** + * Size of the enum + */ + private int size; + + /** + * List of Enum members + */ + private ArrayList members; + + /** + * Constructor + * + * @param type + * type + * @param hidden + * hidden + * @param size + * size + */ + public EnumParameter(String type, boolean hidden, int size) { + super(type, hidden); + this.size = size; + members = new ArrayList(); + } + + /* + * (non-Javadoc) + * + * @see + * com.nokia.trace.dictionary.model.decodeparameters.DecodeParameter#decode + * (java.nio.ByteBuffer, int, java.lang.StringBuffer, int, int, + * java.util.ArrayList) + */ + @Override + public int decode(ByteBuffer dataFrame, int offset, + StringBuffer traceString, int dataStart, int dataLength, + List parameterList) { + // Check that there is enough data left in the buffer + int bytesRemaining = dataLength - (offset - dataStart); + if (bytesRemaining < size) { + postDataMissingEvent(traceString, bytesRemaining, size); + } else { + int data = 0; + if (size == ONE_BYTE) { + data = DecodeUtils.getIntegerFromBuffer(dataFrame, offset, + ONE_BYTE); + } else if (size == TWO_BYTES) { + data = DecodeUtils.getIntegerFromBuffer(dataFrame, offset, + TWO_BYTES); + } else if (size == FOUR_BYTES) { + data = DecodeUtils.getIntegerFromBuffer(dataFrame, offset, + FOUR_BYTES); + } + String memberName = getMemberName(data); + traceString.append(memberName); + parameterList.add(memberName); + } + offset = offset + size; + return offset; + } + + /** + * Adds enum member to this parameter + * + * @param member + */ + public void addMember(EnumMember member) { + int pos = Collections.binarySearch(members, member, + new Comparator() { + + public int compare(EnumMember o1, EnumMember o2) { + int id1 = o1.getValue(); + int id2 = o2.getValue(); + return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; + } + + }); + if (pos < 0) { + members.add(-pos - 1, member); + } + } + + /** + * Gets members name with value + * + * @param value + * @return members name + */ + public String getMemberName(int value) { + int pos = Collections.binarySearch(members, Integer.valueOf(value), + new Comparator() { + + public int compare(Object o1, Object o2) { + int id1 = ((EnumMember) o1).getValue(); + int id2 = ((Integer) o2).intValue(); + return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; + } + + }); + String name = ""; //$NON-NLS-1$ + if (pos >= 0) { + EnumMember member = members.get(pos); + name = member.getName(); + } + return name; + } + + /* + * (non-Javadoc) + * + * @see + * com.nokia.trace.dictionary.model.decodeparameters.DecodeParameter#getSize + * () + */ + @Override + public int getSize() { + return size; + } + + /** + * Sets size + * + * @param size + * the size to set + */ + public void setSize(int size) { + this.size = size; + } + +}