trace/traceviewer/com.nokia.trace.dictionary/src/com/nokia/trace/dictionary/model/decodeparameters/EnumParameter.java
changeset 11 5b9d4d8641ce
equal deleted inserted replaced
10:ed1c9f64298a 11:5b9d4d8641ce
       
     1 /*
       
     2  * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). 
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description:
       
    15  *
       
    16  * Enum parameter
       
    17  *
       
    18  */
       
    19 package com.nokia.trace.dictionary.model.decodeparameters;
       
    20 
       
    21 import java.nio.ByteBuffer;
       
    22 import java.util.ArrayList;
       
    23 import java.util.List;
       
    24 import java.util.Collections;
       
    25 import java.util.Comparator;
       
    26 
       
    27 /**
       
    28  * Enum parameter
       
    29  */
       
    30 public class EnumParameter extends DecodeParameter {
       
    31 
       
    32 	/**
       
    33 	 * Size of the enum
       
    34 	 */
       
    35 	private int size;
       
    36 
       
    37 	/**
       
    38 	 * List of Enum members
       
    39 	 */
       
    40 	private ArrayList<EnumMember> members;
       
    41 
       
    42 	/**
       
    43 	 * Constructor
       
    44 	 * 
       
    45 	 * @param type
       
    46 	 *            type
       
    47 	 * @param hidden
       
    48 	 *            hidden
       
    49 	 * @param size
       
    50 	 *            size
       
    51 	 */
       
    52 	public EnumParameter(String type, boolean hidden, int size) {
       
    53 		super(type, hidden);
       
    54 		this.size = size;
       
    55 		members = new ArrayList<EnumMember>();
       
    56 	}
       
    57 
       
    58 	/*
       
    59 	 * (non-Javadoc)
       
    60 	 * 
       
    61 	 * @see
       
    62 	 * com.nokia.trace.dictionary.model.decodeparameters.DecodeParameter#decode
       
    63 	 * (java.nio.ByteBuffer, int, java.lang.StringBuffer, int, int,
       
    64 	 * java.util.ArrayList)
       
    65 	 */
       
    66 	@Override
       
    67 	public int decode(ByteBuffer dataFrame, int offset,
       
    68 			StringBuffer traceString, int dataStart, int dataLength,
       
    69 			List<String> parameterList) {
       
    70 		// Check that there is enough data left in the buffer
       
    71 		int bytesRemaining = dataLength - (offset - dataStart);
       
    72 		if (bytesRemaining < size) {
       
    73 			postDataMissingEvent(traceString, bytesRemaining, size);
       
    74 		} else {
       
    75 			int data = 0;
       
    76 			if (size == ONE_BYTE) {
       
    77 				data = DecodeUtils.getIntegerFromBuffer(dataFrame, offset,
       
    78 						ONE_BYTE);
       
    79 			} else if (size == TWO_BYTES) {
       
    80 				data = DecodeUtils.getIntegerFromBuffer(dataFrame, offset,
       
    81 						TWO_BYTES);
       
    82 			} else if (size == FOUR_BYTES) {
       
    83 				data = DecodeUtils.getIntegerFromBuffer(dataFrame, offset,
       
    84 						FOUR_BYTES);
       
    85 			}
       
    86 			String memberName = getMemberName(data);
       
    87 			traceString.append(memberName);
       
    88 			parameterList.add(memberName);
       
    89 		}
       
    90 		offset = offset + size;
       
    91 		return offset;
       
    92 	}
       
    93 
       
    94 	/**
       
    95 	 * Adds enum member to this parameter
       
    96 	 * 
       
    97 	 * @param member
       
    98 	 */
       
    99 	public void addMember(EnumMember member) {
       
   100 		int pos = Collections.binarySearch(members, member,
       
   101 				new Comparator<EnumMember>() {
       
   102 
       
   103 					public int compare(EnumMember o1, EnumMember o2) {
       
   104 						int id1 = o1.getValue();
       
   105 						int id2 = o2.getValue();
       
   106 						return id1 > id2 ? 1 : id1 < id2 ? -1 : 0;
       
   107 					}
       
   108 
       
   109 				});
       
   110 		if (pos < 0) {
       
   111 			members.add(-pos - 1, member);
       
   112 		}
       
   113 	}
       
   114 
       
   115 	/**
       
   116 	 * Gets members name with value
       
   117 	 * 
       
   118 	 * @param value
       
   119 	 * @return members name
       
   120 	 */
       
   121 	public String getMemberName(int value) {
       
   122 		int pos = Collections.binarySearch(members, Integer.valueOf(value),
       
   123 				new Comparator<Object>() {
       
   124 
       
   125 					public int compare(Object o1, Object o2) {
       
   126 						int id1 = ((EnumMember) o1).getValue();
       
   127 						int id2 = ((Integer) o2).intValue();
       
   128 						return id1 > id2 ? 1 : id1 < id2 ? -1 : 0;
       
   129 					}
       
   130 
       
   131 				});
       
   132 		String name = ""; //$NON-NLS-1$
       
   133 		if (pos >= 0) {
       
   134 			EnumMember member = members.get(pos);
       
   135 			name = member.getName();
       
   136 		}
       
   137 		return name;
       
   138 	}
       
   139 
       
   140 	/*
       
   141 	 * (non-Javadoc)
       
   142 	 * 
       
   143 	 * @see
       
   144 	 * com.nokia.trace.dictionary.model.decodeparameters.DecodeParameter#getSize
       
   145 	 * ()
       
   146 	 */
       
   147 	@Override
       
   148 	public int getSize() {
       
   149 		return size;
       
   150 	}
       
   151 
       
   152 	/**
       
   153 	 * Sets size
       
   154 	 * 
       
   155 	 * @param size
       
   156 	 *            the size to set
       
   157 	 */
       
   158 	public void setSize(int size) {
       
   159 		this.size = size;
       
   160 	}
       
   161 
       
   162 }