tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileWriter.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 41 tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/decodeplugins/dictionary/DictionaryFileWriter.java@838cdffd57ce
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
* Writer for dictionary file
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.decodeplugins.dictionary;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.io.File;
hgs
parents:
diff changeset
    22
import java.util.ArrayList;
hgs
parents:
diff changeset
    23
import java.util.Collections;
hgs
parents:
diff changeset
    24
import java.util.Comparator;
hgs
parents:
diff changeset
    25
import java.util.Iterator;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.DataType;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.Dictionary;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.LocationStore;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceComponent;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceDataStore;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceDictionaryEncoder;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TypeDef;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TypeDefStore;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.engine.LocationListBase;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.engine.LocationProperties;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.file.FileUtils;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.model.Trace;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.model.TraceConstantTable;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.model.TraceConstantTableEntry;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.model.TraceGroup;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    43
import com.nokia.tracecompiler.model.TraceObjectUtils;
hgs
parents:
diff changeset
    44
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    45
import com.nokia.tracecompiler.project.FormattingUtils;
hgs
parents:
diff changeset
    46
import com.nokia.tracecompiler.project.PropertyNames;
hgs
parents:
diff changeset
    47
import com.nokia.tracecompiler.project.TraceProjectAPI;
hgs
parents:
diff changeset
    48
import com.nokia.tracecompiler.project.TraceProjectAPI.TraceFormatFlags;
hgs
parents:
diff changeset
    49
import com.nokia.tracecompiler.rules.FillerParameterRule;
hgs
parents:
diff changeset
    50
import com.nokia.tracecompiler.rules.HiddenTraceObjectRule;
hgs
parents:
diff changeset
    51
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    52
import com.nokia.tracecompiler.source.SourceUtils;
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
/**
hgs
parents:
diff changeset
    55
 * Writer for dictionary file
hgs
parents:
diff changeset
    56
 * 
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
final class DictionaryFileWriter {
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	 * Comparator for file references
hgs
parents:
diff changeset
    62
	 */
hgs
parents:
diff changeset
    63
	private final class FileRefComparator implements
hgs
parents:
diff changeset
    64
			Comparator<DictionaryFileRef> {
hgs
parents:
diff changeset
    65
		public int compare(DictionaryFileRef o1, DictionaryFileRef o2) {
hgs
parents:
diff changeset
    66
			int val = o1.path.compareTo(o2.path);
hgs
parents:
diff changeset
    67
			if (val == 0) {
hgs
parents:
diff changeset
    68
				val = o1.file.compareTo(o2.file);
hgs
parents:
diff changeset
    69
			}
hgs
parents:
diff changeset
    70
			return val;
hgs
parents:
diff changeset
    71
		}
hgs
parents:
diff changeset
    72
	}
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
	/**
hgs
parents:
diff changeset
    75
	 * Dictionary file
hgs
parents:
diff changeset
    76
	 */
hgs
parents:
diff changeset
    77
	private DictionaryFile dictionaryFile;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
	/**
hgs
parents:
diff changeset
    80
	 * Sequential number for trace definitions
hgs
parents:
diff changeset
    81
	 */
hgs
parents:
diff changeset
    82
	private int defref;
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
	/**
hgs
parents:
diff changeset
    85
	 * Sequential number for file definitions
hgs
parents:
diff changeset
    86
	 */
hgs
parents:
diff changeset
    87
	private int fileref;
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
	/**
hgs
parents:
diff changeset
    90
	 * Constructor
hgs
parents:
diff changeset
    91
	 * 
hgs
parents:
diff changeset
    92
	 * @param dictionaryFile
hgs
parents:
diff changeset
    93
	 *            the dictionary file
hgs
parents:
diff changeset
    94
	 */
hgs
parents:
diff changeset
    95
	DictionaryFileWriter(DictionaryFile dictionaryFile) {
hgs
parents:
diff changeset
    96
		this.dictionaryFile = dictionaryFile;
hgs
parents:
diff changeset
    97
	}
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
	/**
hgs
parents:
diff changeset
   100
	 * Writes the dictionary file
hgs
parents:
diff changeset
   101
	 */
hgs
parents:
diff changeset
   102
	void write() {
hgs
parents:
diff changeset
   103
		defref = 0;
hgs
parents:
diff changeset
   104
		fileref = 0;
hgs
parents:
diff changeset
   105
		File file = new File(dictionaryFile.getAbsolutePathWithID());
hgs
parents:
diff changeset
   106
		// Delete removes possible read-only flags
hgs
parents:
diff changeset
   107
		if (file.exists()) {
hgs
parents:
diff changeset
   108
			file.delete();
hgs
parents:
diff changeset
   109
		}
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
		TraceDictionaryEncoder encoder = new TraceDictionaryEncoder();
hgs
parents:
diff changeset
   112
		File path = file.getParentFile();
hgs
parents:
diff changeset
   113
		if (!path.exists()) {
hgs
parents:
diff changeset
   114
			FileUtils.createDirectories(path);
hgs
parents:
diff changeset
   115
		}
hgs
parents:
diff changeset
   116
		encoder.createNewDictionary(file.getAbsolutePath());
hgs
parents:
diff changeset
   117
		Dictionary.startDictionary();
hgs
parents:
diff changeset
   118
		createTypedefs();
hgs
parents:
diff changeset
   119
		createDefs();
hgs
parents:
diff changeset
   120
		createLocations();
hgs
parents:
diff changeset
   121
		createComponent();
hgs
parents:
diff changeset
   122
		Dictionary.endDictionary();
hgs
parents:
diff changeset
   123
	}
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
	/**
hgs
parents:
diff changeset
   126
	 * Creates the type definitions
hgs
parents:
diff changeset
   127
	 */
hgs
parents:
diff changeset
   128
	private void createTypedefs() {
hgs
parents:
diff changeset
   129
		TypeDefStore.startTypeDefs();
hgs
parents:
diff changeset
   130
		ArrayList<String> typeList = buildTypeList();
hgs
parents:
diff changeset
   131
		writeTypeDefinitions(typeList);
hgs
parents:
diff changeset
   132
		TypeDefStore.endTypeDefs();
hgs
parents:
diff changeset
   133
	}
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
	/**
hgs
parents:
diff changeset
   136
	 * Builds the list of parameter types
hgs
parents:
diff changeset
   137
	 * 
hgs
parents:
diff changeset
   138
	 * @return the list of types found from the model
hgs
parents:
diff changeset
   139
	 */
hgs
parents:
diff changeset
   140
	private ArrayList<String> buildTypeList() {
hgs
parents:
diff changeset
   141
		TraceModel model = dictionaryFile.getOwner().getModel();
hgs
parents:
diff changeset
   142
		ArrayList<String> typeList = new ArrayList<String>();
hgs
parents:
diff changeset
   143
		for (TraceGroup group : model) {
hgs
parents:
diff changeset
   144
			for (Trace trace : group) {
hgs
parents:
diff changeset
   145
				for (TraceParameter parameter : trace) {
hgs
parents:
diff changeset
   146
					if ((parameter.getExtension(HiddenTraceObjectRule.class) == null)
hgs
parents:
diff changeset
   147
							|| (parameter
hgs
parents:
diff changeset
   148
									.getExtension(FillerParameterRule.class) != null)) {
hgs
parents:
diff changeset
   149
						String type = parameter.getType();
hgs
parents:
diff changeset
   150
						if (!typeList.contains(type)) {
hgs
parents:
diff changeset
   151
							typeList.add(type);
hgs
parents:
diff changeset
   152
						}
hgs
parents:
diff changeset
   153
					}
hgs
parents:
diff changeset
   154
				}
hgs
parents:
diff changeset
   155
			}
hgs
parents:
diff changeset
   156
		}
hgs
parents:
diff changeset
   157
		return typeList;
hgs
parents:
diff changeset
   158
	}
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
	/**
hgs
parents:
diff changeset
   161
	 * Writes the data type definitions
hgs
parents:
diff changeset
   162
	 * 
hgs
parents:
diff changeset
   163
	 * @param typeList
hgs
parents:
diff changeset
   164
	 *            the list of data types
hgs
parents:
diff changeset
   165
	 */
hgs
parents:
diff changeset
   166
	private void writeTypeDefinitions(ArrayList<String> typeList) {
hgs
parents:
diff changeset
   167
		for (String type : typeList) {
hgs
parents:
diff changeset
   168
			DataType dt = mapTypeToDataType(type);
hgs
parents:
diff changeset
   169
			if (dt != null) {
hgs
parents:
diff changeset
   170
				// Normal parameters
hgs
parents:
diff changeset
   171
				int size = mapParameterTypeToSize(type);
hgs
parents:
diff changeset
   172
				String formatChar = SourceUtils.mapNormalTypeToFormat(type);
hgs
parents:
diff changeset
   173
				if (formatChar != null && formatChar.length() > 1
hgs
parents:
diff changeset
   174
						&& formatChar.charAt(0) == '%') {
hgs
parents:
diff changeset
   175
					formatChar = formatChar.substring(1);
hgs
parents:
diff changeset
   176
					TypeDefStore.writeTypeDef(type, size, formatChar, dt);
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
					// Write alternative format characters
hgs
parents:
diff changeset
   179
					writeAlternativeFormatChars(formatChar, type, size, dt);
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
				} else {
hgs
parents:
diff changeset
   182
					TypeDefStore.writeTypeDef(type, size, null, dt);
hgs
parents:
diff changeset
   183
				}
hgs
parents:
diff changeset
   184
			} else {
hgs
parents:
diff changeset
   185
				// Enum parameters
hgs
parents:
diff changeset
   186
				TraceModel model = dictionaryFile.getOwner().getModel();
hgs
parents:
diff changeset
   187
				TraceConstantTable table = model.findConstantTableByName(type);
hgs
parents:
diff changeset
   188
				if (table != null) {
hgs
parents:
diff changeset
   189
					TypeDefStore.startTypeDef(table.getName(),
hgs
parents:
diff changeset
   190
							mapParameterTypeToSize(table.getType()), null,
hgs
parents:
diff changeset
   191
							DataType.ENUM);
hgs
parents:
diff changeset
   192
					for (TraceConstantTableEntry entry : table) {
hgs
parents:
diff changeset
   193
						TypeDef.writeTypeMember(entry.getID(), entry.getName(),
hgs
parents:
diff changeset
   194
								null);
hgs
parents:
diff changeset
   195
					}
hgs
parents:
diff changeset
   196
					TypeDefStore.endTypeDef();
hgs
parents:
diff changeset
   197
				}
hgs
parents:
diff changeset
   198
			}
hgs
parents:
diff changeset
   199
		}
hgs
parents:
diff changeset
   200
	}
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
	/**
hgs
parents:
diff changeset
   203
	 * Writes alternative format characters to the Dictionary
hgs
parents:
diff changeset
   204
	 * 
hgs
parents:
diff changeset
   205
	 * @param formatChar
hgs
parents:
diff changeset
   206
	 *            formatchar
hgs
parents:
diff changeset
   207
	 * @param type
hgs
parents:
diff changeset
   208
	 *            parameter type
hgs
parents:
diff changeset
   209
	 * @param size
hgs
parents:
diff changeset
   210
	 *            parameter size
hgs
parents:
diff changeset
   211
	 * @param dt
hgs
parents:
diff changeset
   212
	 *            data type
hgs
parents:
diff changeset
   213
	 */
hgs
parents:
diff changeset
   214
	private void writeAlternativeFormatChars(String formatChar, String type,
hgs
parents:
diff changeset
   215
			int size, DataType dt) {
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
		// If there's big L, write also 'll' type
hgs
parents:
diff changeset
   218
		if (formatChar.indexOf('L') != -1) {
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
			// Double small l
hgs
parents:
diff changeset
   221
			String newFormatChar = formatChar.replace("L", "ll"); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   222
			TypeDefStore.writeTypeDef(type, size, newFormatChar, dt);
hgs
parents:
diff changeset
   223
			writeCapitalHexType(newFormatChar, type, size, dt);
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
		}
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
		// Write alternative option to float types
hgs
parents:
diff changeset
   228
		else if (formatChar.equals("f") || formatChar.equals("e") //$NON-NLS-1$//$NON-NLS-2$
hgs
parents:
diff changeset
   229
				|| formatChar.equals("g")) { //$NON-NLS-1$
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
			String newFormatChar = 'L' + formatChar;
hgs
parents:
diff changeset
   232
			TypeDefStore.writeTypeDef(type, size, newFormatChar, dt);
hgs
parents:
diff changeset
   233
		}
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
		else {
hgs
parents:
diff changeset
   236
			// If length is one, add also formatchar with "l"
hgs
parents:
diff changeset
   237
			if (formatChar.length() == 1) {
hgs
parents:
diff changeset
   238
				String newFormatChar = "l" + formatChar; //$NON-NLS-1$
hgs
parents:
diff changeset
   239
				TypeDefStore.writeTypeDef(type, size, newFormatChar, dt);
hgs
parents:
diff changeset
   240
				writeCapitalHexType(newFormatChar, type, size, dt);
hgs
parents:
diff changeset
   241
			}
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
			// Check capital hex need
hgs
parents:
diff changeset
   244
			writeCapitalHexType(formatChar, type, size, dt);
hgs
parents:
diff changeset
   245
		}
hgs
parents:
diff changeset
   246
	}
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
	/**
hgs
parents:
diff changeset
   249
	 * Writes capital hex type
hgs
parents:
diff changeset
   250
	 * 
hgs
parents:
diff changeset
   251
	 * @param formatChar
hgs
parents:
diff changeset
   252
	 *            formatchar
hgs
parents:
diff changeset
   253
	 * @param type
hgs
parents:
diff changeset
   254
	 *            parameter type
hgs
parents:
diff changeset
   255
	 * @param size
hgs
parents:
diff changeset
   256
	 *            parameter size
hgs
parents:
diff changeset
   257
	 * @param dt
hgs
parents:
diff changeset
   258
	 *            data type
hgs
parents:
diff changeset
   259
	 */
hgs
parents:
diff changeset
   260
	private void writeCapitalHexType(String formatChar, String type, int size,
hgs
parents:
diff changeset
   261
			DataType dt) {
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
		// Write also capital X if there are hex values
hgs
parents:
diff changeset
   264
		if (formatChar.indexOf('x') != -1) {
hgs
parents:
diff changeset
   265
			type = type.toUpperCase();
hgs
parents:
diff changeset
   266
			TypeDefStore.writeTypeDef(type, size, formatChar.replace('x', 'X'),
hgs
parents:
diff changeset
   267
					dt);
hgs
parents:
diff changeset
   268
		}
hgs
parents:
diff changeset
   269
	}
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
	/**
hgs
parents:
diff changeset
   272
	 * Gets the parameter size from type
hgs
parents:
diff changeset
   273
	 * 
hgs
parents:
diff changeset
   274
	 * @param type
hgs
parents:
diff changeset
   275
	 *            the type
hgs
parents:
diff changeset
   276
	 * @return the size in bytes
hgs
parents:
diff changeset
   277
	 */
hgs
parents:
diff changeset
   278
	private int mapParameterTypeToSize(String type) {
hgs
parents:
diff changeset
   279
		int size = SourceUtils.mapParameterTypeToSize(type);
hgs
parents:
diff changeset
   280
		if (size == 0) {
hgs
parents:
diff changeset
   281
			if (type.equals(TraceParameter.ASCII)) {
hgs
parents:
diff changeset
   282
				size = 1;
hgs
parents:
diff changeset
   283
			} else if (type.equals(TraceParameter.UNICODE)) {
hgs
parents:
diff changeset
   284
				size = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   285
			}
hgs
parents:
diff changeset
   286
		}
hgs
parents:
diff changeset
   287
		return size;
hgs
parents:
diff changeset
   288
	}
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
	/**
hgs
parents:
diff changeset
   291
	 * Creates the trace definitions
hgs
parents:
diff changeset
   292
	 */
hgs
parents:
diff changeset
   293
	private void createDefs() {
hgs
parents:
diff changeset
   294
		// This should check for duplicates
hgs
parents:
diff changeset
   295
		TraceDataStore.startDataStore();
hgs
parents:
diff changeset
   296
		TraceModel model = dictionaryFile.getOwner().getModel();
hgs
parents:
diff changeset
   297
		TraceProjectAPI api = model.getExtension(TraceProjectAPI.class);
hgs
parents:
diff changeset
   298
		for (TraceGroup group : model) {
hgs
parents:
diff changeset
   299
			for (Trace trace : group) {
hgs
parents:
diff changeset
   300
				trace.addExtension(new DictionaryDefRef(++defref));
hgs
parents:
diff changeset
   301
				TraceFormatFlags flags = new TraceFormatFlags();
hgs
parents:
diff changeset
   302
				flags.isFormattingSupported = true;
hgs
parents:
diff changeset
   303
				String data = api.formatTraceForExport(trace, flags);
hgs
parents:
diff changeset
   304
				data = replaceUnescapeQuotes(data);
hgs
parents:
diff changeset
   305
				TraceDataStore.writeData(defref, DataType.STRING, data);
hgs
parents:
diff changeset
   306
			}
hgs
parents:
diff changeset
   307
		}
hgs
parents:
diff changeset
   308
		TraceDataStore.endDataStore();
hgs
parents:
diff changeset
   309
	}
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
	/**
hgs
parents:
diff changeset
   312
	 * Replaces unescape quates
hgs
parents:
diff changeset
   313
	 * 
hgs
parents:
diff changeset
   314
	 * @param data
hgs
parents:
diff changeset
   315
	 *            the data
hgs
parents:
diff changeset
   316
	 * @return the new string
hgs
parents:
diff changeset
   317
	 */
hgs
parents:
diff changeset
   318
	private String replaceUnescapeQuotes(String data) {
hgs
parents:
diff changeset
   319
		data = data.replace("\\\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   320
		return data;
hgs
parents:
diff changeset
   321
	}
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
	/**
hgs
parents:
diff changeset
   324
	 * Maps a basic type to a Dictionary data type
hgs
parents:
diff changeset
   325
	 * 
hgs
parents:
diff changeset
   326
	 * @param type
hgs
parents:
diff changeset
   327
	 *            the type
hgs
parents:
diff changeset
   328
	 * @return the data type
hgs
parents:
diff changeset
   329
	 */
hgs
parents:
diff changeset
   330
	private DataType mapTypeToDataType(String type) { // CodForChk_Dis_ComplexFunc
hgs
parents:
diff changeset
   331
		DataType retval;
hgs
parents:
diff changeset
   332
		// Unsigned is not supported in Dictionary
hgs
parents:
diff changeset
   333
		if (type.equals(TraceParameter.SDEC32)) {
hgs
parents:
diff changeset
   334
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   335
		} else if (type.equals(TraceParameter.HEX32)) {
hgs
parents:
diff changeset
   336
			retval = DataType.HEX;
hgs
parents:
diff changeset
   337
		} else if (type.equals(TraceParameter.UDEC32)) {
hgs
parents:
diff changeset
   338
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   339
		} else if (type.equals(TraceParameter.OCT32)) {
hgs
parents:
diff changeset
   340
			retval = DataType.OCTAL;
hgs
parents:
diff changeset
   341
		} else if (type.equals(TraceParameter.SDEC16)) {
hgs
parents:
diff changeset
   342
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   343
		} else if (type.equals(TraceParameter.HEX16)) {
hgs
parents:
diff changeset
   344
			retval = DataType.HEX;
hgs
parents:
diff changeset
   345
		} else if (type.equals(TraceParameter.UDEC16)) {
hgs
parents:
diff changeset
   346
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   347
		} else if (type.equals(TraceParameter.OCT16)) {
hgs
parents:
diff changeset
   348
			retval = DataType.OCTAL;
hgs
parents:
diff changeset
   349
		} else if (type.equals(TraceParameter.SDEC8)) {
hgs
parents:
diff changeset
   350
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   351
		} else if (type.equals(TraceParameter.HEX8)) {
hgs
parents:
diff changeset
   352
			retval = DataType.HEX;
hgs
parents:
diff changeset
   353
		} else if (type.equals(TraceParameter.UDEC8)) {
hgs
parents:
diff changeset
   354
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   355
		} else if (type.equals(TraceParameter.OCT8)) {
hgs
parents:
diff changeset
   356
			retval = DataType.OCTAL;
hgs
parents:
diff changeset
   357
		} else if (type.equals(TraceParameter.SDEC64)) {
hgs
parents:
diff changeset
   358
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   359
		} else if (type.equals(TraceParameter.HEX64)) {
hgs
parents:
diff changeset
   360
			retval = DataType.HEX;
hgs
parents:
diff changeset
   361
		} else if (type.equals(TraceParameter.UDEC64)) {
hgs
parents:
diff changeset
   362
			retval = DataType.INTEGER;
hgs
parents:
diff changeset
   363
		} else if (type.equals(TraceParameter.OCT64)) {
hgs
parents:
diff changeset
   364
			retval = DataType.OCTAL;
hgs
parents:
diff changeset
   365
		} else if (type.equals(TraceParameter.ASCII)) {
hgs
parents:
diff changeset
   366
			retval = DataType.STRING;
hgs
parents:
diff changeset
   367
		} else if (type.equals(TraceParameter.UNICODE)) {
hgs
parents:
diff changeset
   368
			retval = DataType.STRING;
hgs
parents:
diff changeset
   369
		} else if (type.equals(TraceParameter.FLOAT_FIX)) {
hgs
parents:
diff changeset
   370
			retval = DataType.FLOAT;
hgs
parents:
diff changeset
   371
		} else if (type.equals(TraceParameter.FLOAT_EXP)) {
hgs
parents:
diff changeset
   372
			retval = DataType.FLOAT;
hgs
parents:
diff changeset
   373
		} else if (type.equals(TraceParameter.FLOAT_OPT)) {
hgs
parents:
diff changeset
   374
			retval = DataType.FLOAT;
hgs
parents:
diff changeset
   375
		} else if (type.equals(TraceParameter.POINTER)) {
hgs
parents:
diff changeset
   376
			retval = DataType.HEX;
hgs
parents:
diff changeset
   377
		} else {
hgs
parents:
diff changeset
   378
			retval = null;
hgs
parents:
diff changeset
   379
		}
hgs
parents:
diff changeset
   380
		return retval;
hgs
parents:
diff changeset
   381
	}
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
	/**
hgs
parents:
diff changeset
   384
	 * Creates the location definitions
hgs
parents:
diff changeset
   385
	 */
hgs
parents:
diff changeset
   386
	private void createLocations() {
hgs
parents:
diff changeset
   387
		ArrayList<DictionaryFileRef> files = new ArrayList<DictionaryFileRef>();
hgs
parents:
diff changeset
   388
		LocationStore.startLocations();
hgs
parents:
diff changeset
   389
		for (TraceGroup group : dictionaryFile.getOwner().getModel()) {
hgs
parents:
diff changeset
   390
			for (Trace trace : group) {
hgs
parents:
diff changeset
   391
				writeLocation(files, trace);
hgs
parents:
diff changeset
   392
			}
hgs
parents:
diff changeset
   393
		}
hgs
parents:
diff changeset
   394
		// Build XML and assign ID's to refs
hgs
parents:
diff changeset
   395
		Collections.sort(files, new FileRefComparator());
hgs
parents:
diff changeset
   396
		String lastpath = null;
hgs
parents:
diff changeset
   397
		for (DictionaryFileRef ref : files) {
hgs
parents:
diff changeset
   398
			if (!ref.path.equals(lastpath)) {
hgs
parents:
diff changeset
   399
				if (lastpath != null) {
hgs
parents:
diff changeset
   400
					LocationStore.endPath();
hgs
parents:
diff changeset
   401
				}
hgs
parents:
diff changeset
   402
				LocationStore.startPath(ref.path);
hgs
parents:
diff changeset
   403
				lastpath = ref.path;
hgs
parents:
diff changeset
   404
			}
hgs
parents:
diff changeset
   405
			LocationStore.writeFile(++fileref, ref.file);
hgs
parents:
diff changeset
   406
			ref.refid = fileref;
hgs
parents:
diff changeset
   407
		}
hgs
parents:
diff changeset
   408
		if (lastpath != null) {
hgs
parents:
diff changeset
   409
			LocationStore.endPath();
hgs
parents:
diff changeset
   410
		}
hgs
parents:
diff changeset
   411
		LocationStore.endLocations();
hgs
parents:
diff changeset
   412
	}
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
	/**
hgs
parents:
diff changeset
   415
	 * Writes the location of a trace
hgs
parents:
diff changeset
   416
	 * 
hgs
parents:
diff changeset
   417
	 * @param files
hgs
parents:
diff changeset
   418
	 *            file references
hgs
parents:
diff changeset
   419
	 * @param trace
hgs
parents:
diff changeset
   420
	 *            trace to be written
hgs
parents:
diff changeset
   421
	 */
hgs
parents:
diff changeset
   422
	private void writeLocation(ArrayList<DictionaryFileRef> files, Trace trace) {
hgs
parents:
diff changeset
   423
		LocationProperties loc = findFirstLocation(trace);
hgs
parents:
diff changeset
   424
		if (loc != null) {
hgs
parents:
diff changeset
   425
			String path = loc.getFilePath();
hgs
parents:
diff changeset
   426
			String file = loc.getFileName();
hgs
parents:
diff changeset
   427
			if (path != null) {
hgs
parents:
diff changeset
   428
				path = FileUtils.convertSeparators(
hgs
parents:
diff changeset
   429
						SourceConstants.FORWARD_SLASH_CHAR, path, true);
hgs
parents:
diff changeset
   430
				// TODO: Remove drive letter. Actually cannot remove drive
hgs
parents:
diff changeset
   431
				// letter because EPOCROOT might not be in the root of the drive
hgs
parents:
diff changeset
   432
			}
hgs
parents:
diff changeset
   433
			DictionaryFileRef ref = getRef(files, file, path);
hgs
parents:
diff changeset
   434
			if (ref == null) {
hgs
parents:
diff changeset
   435
				ref = new DictionaryFileRef(file, path, trace);
hgs
parents:
diff changeset
   436
				files.add(ref);
hgs
parents:
diff changeset
   437
				trace.addExtension(ref);
hgs
parents:
diff changeset
   438
			} else {
hgs
parents:
diff changeset
   439
				trace.addExtension(ref);
hgs
parents:
diff changeset
   440
			}
hgs
parents:
diff changeset
   441
		}
hgs
parents:
diff changeset
   442
	}
hgs
parents:
diff changeset
   443
hgs
parents:
diff changeset
   444
	/**
hgs
parents:
diff changeset
   445
	 * Finds the first location from trace
hgs
parents:
diff changeset
   446
	 * 
hgs
parents:
diff changeset
   447
	 * @param trace
hgs
parents:
diff changeset
   448
	 *            the trace
hgs
parents:
diff changeset
   449
	 * @return the location
hgs
parents:
diff changeset
   450
	 */
hgs
parents:
diff changeset
   451
	private LocationProperties findFirstLocation(Trace trace) {
hgs
parents:
diff changeset
   452
		Iterator<LocationListBase> itr = trace
hgs
parents:
diff changeset
   453
				.getExtensions(LocationListBase.class);
hgs
parents:
diff changeset
   454
		LocationProperties loc = null;
hgs
parents:
diff changeset
   455
		while (itr.hasNext() && loc == null) {
hgs
parents:
diff changeset
   456
			Iterator<LocationProperties> locs = itr.next().iterator();
hgs
parents:
diff changeset
   457
			if (locs.hasNext()) {
hgs
parents:
diff changeset
   458
				loc = locs.next();
hgs
parents:
diff changeset
   459
			}
hgs
parents:
diff changeset
   460
		}
hgs
parents:
diff changeset
   461
		return loc;
hgs
parents:
diff changeset
   462
	}
hgs
parents:
diff changeset
   463
hgs
parents:
diff changeset
   464
	/**
hgs
parents:
diff changeset
   465
	 * Gets a file reference
hgs
parents:
diff changeset
   466
	 * 
hgs
parents:
diff changeset
   467
	 * @param files
hgs
parents:
diff changeset
   468
	 *            the list of file references
hgs
parents:
diff changeset
   469
	 * @param file
hgs
parents:
diff changeset
   470
	 *            file name
hgs
parents:
diff changeset
   471
	 * @param path
hgs
parents:
diff changeset
   472
	 *            file path
hgs
parents:
diff changeset
   473
	 * @return the file reference
hgs
parents:
diff changeset
   474
	 */
hgs
parents:
diff changeset
   475
	private DictionaryFileRef getRef(ArrayList<DictionaryFileRef> files,
hgs
parents:
diff changeset
   476
			String file, String path) {
hgs
parents:
diff changeset
   477
		DictionaryFileRef retval = null;
hgs
parents:
diff changeset
   478
		for (int i = 0; i < files.size() && retval == null; i++) {
hgs
parents:
diff changeset
   479
			DictionaryFileRef ref = files.get(i);
hgs
parents:
diff changeset
   480
			if (ref.file.equals(file) && ref.path.equals(path)) {
hgs
parents:
diff changeset
   481
				retval = ref;
hgs
parents:
diff changeset
   482
			}
hgs
parents:
diff changeset
   483
		}
hgs
parents:
diff changeset
   484
		return retval;
hgs
parents:
diff changeset
   485
	}
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
	/**
hgs
parents:
diff changeset
   488
	 * Creates the component definition
hgs
parents:
diff changeset
   489
	 */
hgs
parents:
diff changeset
   490
	private void createComponent() {
hgs
parents:
diff changeset
   491
		TraceModel model = dictionaryFile.getOwner().getModel();
hgs
parents:
diff changeset
   492
		int compid = model.getID();
hgs
parents:
diff changeset
   493
		// Component prefix and suffix are in property file.
hgs
parents:
diff changeset
   494
		// If not there, the default values are used
hgs
parents:
diff changeset
   495
		String prefix = TraceObjectUtils.findProperty(model,
hgs
parents:
diff changeset
   496
				PropertyNames.PREFIX);
hgs
parents:
diff changeset
   497
		if (prefix == null || prefix.length() == 0) {
hgs
parents:
diff changeset
   498
			prefix = FormattingUtils.getDefaultComponentPrefix(model);
hgs
parents:
diff changeset
   499
		}
hgs
parents:
diff changeset
   500
		String suffix = TraceObjectUtils.findProperty(model,
hgs
parents:
diff changeset
   501
				PropertyNames.SUFFIX);
hgs
parents:
diff changeset
   502
		if (suffix == null || suffix.length() == 0) {
hgs
parents:
diff changeset
   503
			suffix = FormattingUtils.getDefaultComponentSuffix(model);
hgs
parents:
diff changeset
   504
		}
hgs
parents:
diff changeset
   505
		Dictionary.startComponent(compid, dictionaryFile.getProjectName(),
hgs
parents:
diff changeset
   506
				prefix, suffix);
hgs
parents:
diff changeset
   507
		for (TraceGroup group : model) {
hgs
parents:
diff changeset
   508
			createGroup(group);
hgs
parents:
diff changeset
   509
		}
hgs
parents:
diff changeset
   510
		Dictionary.endComponent();
hgs
parents:
diff changeset
   511
	}
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
	/**
hgs
parents:
diff changeset
   514
	 * Creates a group definition
hgs
parents:
diff changeset
   515
	 * 
hgs
parents:
diff changeset
   516
	 * @param group
hgs
parents:
diff changeset
   517
	 *            the group
hgs
parents:
diff changeset
   518
	 */
hgs
parents:
diff changeset
   519
	private void createGroup(TraceGroup group) {
hgs
parents:
diff changeset
   520
		String prefix = TraceObjectUtils.findProperty(group,
hgs
parents:
diff changeset
   521
				PropertyNames.PREFIX);
hgs
parents:
diff changeset
   522
		if (prefix == null || prefix.length() == 0) {
hgs
parents:
diff changeset
   523
			prefix = FormattingUtils.getDefaultGroupPrefix(group);
hgs
parents:
diff changeset
   524
		}
hgs
parents:
diff changeset
   525
		String suffix = TraceObjectUtils.findProperty(group,
hgs
parents:
diff changeset
   526
				PropertyNames.SUFFIX);
hgs
parents:
diff changeset
   527
		if (suffix == null || suffix.length() == 0) {
hgs
parents:
diff changeset
   528
			suffix = FormattingUtils.getDefaultGroupSuffix(group);
hgs
parents:
diff changeset
   529
		}
hgs
parents:
diff changeset
   530
		TraceComponent.startGroup(group.getID(), group.getName(), prefix,
hgs
parents:
diff changeset
   531
				suffix);
hgs
parents:
diff changeset
   532
		for (Trace trace : group) {
hgs
parents:
diff changeset
   533
			createTrace(trace);
hgs
parents:
diff changeset
   534
		}
hgs
parents:
diff changeset
   535
		TraceComponent.endGroup();
hgs
parents:
diff changeset
   536
	}
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
	/**
hgs
parents:
diff changeset
   539
	 * Creates a trace definition
hgs
parents:
diff changeset
   540
	 * 
hgs
parents:
diff changeset
   541
	 * @param trace
hgs
parents:
diff changeset
   542
	 *            the trace
hgs
parents:
diff changeset
   543
	 */
hgs
parents:
diff changeset
   544
	private void createTrace(Trace trace) {
hgs
parents:
diff changeset
   545
		DictionaryDefRef defref = trace.getExtension(DictionaryDefRef.class);
hgs
parents:
diff changeset
   546
		if (defref != null) {
hgs
parents:
diff changeset
   547
			DictionaryFileRef fileref = trace
hgs
parents:
diff changeset
   548
					.getExtension(DictionaryFileRef.class);
hgs
parents:
diff changeset
   549
			com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceGroup.startTrace(defref
hgs
parents:
diff changeset
   550
					.getRefId(), trace.getName());
hgs
parents:
diff changeset
   551
			if (fileref != null) {
hgs
parents:
diff changeset
   552
				writeTraceWithLocation(fileref.getRefId(), trace);
hgs
parents:
diff changeset
   553
			} else {
hgs
parents:
diff changeset
   554
				com.nokia.tracecompiler.decodeplugins.dictionary.encoder.Trace.writeInstance(trace
hgs
parents:
diff changeset
   555
						.getID(), 0, 0, "", //$NON-NLS-1$
hgs
parents:
diff changeset
   556
						""); //$NON-NLS-1$
hgs
parents:
diff changeset
   557
			}
hgs
parents:
diff changeset
   558
			com.nokia.tracecompiler.decodeplugins.dictionary.encoder.TraceGroup.endTrace();
hgs
parents:
diff changeset
   559
		}
hgs
parents:
diff changeset
   560
		trace.removeExtensions(DictionaryRef.class);
hgs
parents:
diff changeset
   561
hgs
parents:
diff changeset
   562
	}
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
	/**
hgs
parents:
diff changeset
   565
	 * Writes a trace which has a source location
hgs
parents:
diff changeset
   566
	 * 
hgs
parents:
diff changeset
   567
	 * @param refId
hgs
parents:
diff changeset
   568
	 *            file reference number
hgs
parents:
diff changeset
   569
	 * @param trace
hgs
parents:
diff changeset
   570
	 *            the trace
hgs
parents:
diff changeset
   571
	 */
hgs
parents:
diff changeset
   572
	private void writeTraceWithLocation(int refId, Trace trace) {
hgs
parents:
diff changeset
   573
		LocationProperties loc = findFirstLocation(trace);
hgs
parents:
diff changeset
   574
		int line = 0;
hgs
parents:
diff changeset
   575
		String className = ""; //$NON-NLS-1$
hgs
parents:
diff changeset
   576
		String functionName = ""; //$NON-NLS-1$
hgs
parents:
diff changeset
   577
		if (loc != null) {
hgs
parents:
diff changeset
   578
			line = loc.getLineNumber();
hgs
parents:
diff changeset
   579
			className = loc.getClassName();
hgs
parents:
diff changeset
   580
			functionName = loc.getFunctionName();
hgs
parents:
diff changeset
   581
		}
hgs
parents:
diff changeset
   582
		com.nokia.tracecompiler.decodeplugins.dictionary.encoder.Trace.writeInstance(trace.getID(),
hgs
parents:
diff changeset
   583
				refId, line, functionName, className);
hgs
parents:
diff changeset
   584
	}
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
}