blob: 00fcc8b79dd99b47c36098fe79c85ed80054c7db [file] [log] [blame]
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.traceview;
import com.android.sdkstats.SdkStatsService;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.Properties;
public class MainWindow extends ApplicationWindow {
private final static String PING_NAME = "Traceview";
private final static String PING_VERSION = "1.0";
private TraceReader mReader;
private String mTraceName;
// A global cache of string names.
public static HashMap<String, String> sStringCache = new HashMap<String, String>();
public MainWindow(String traceName, TraceReader reader) {
super(null);
mReader = reader;
mTraceName = traceName;
}
public void run() {
setBlockOnOpen(true);
open();
Display.getCurrent().dispose();
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Traceview: " + mTraceName);
shell.setBounds(100, 10, 1282, 900);
}
@Override
protected Control createContents(Composite parent) {
ColorController.assignMethodColors(parent.getDisplay(), mReader.getMethods());
SelectionController selectionController = new SelectionController();
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
parent.setLayout(gridLayout);
Display display = parent.getDisplay();
Color darkGray = display.getSystemColor(SWT.COLOR_DARK_GRAY);
// Create a sash form to separate the timeline view (on top)
// and the profile view (on bottom)
SashForm sashForm1 = new SashForm(parent, SWT.VERTICAL);
sashForm1.setBackground(darkGray);
sashForm1.SASH_WIDTH = 3;
GridData data = new GridData(GridData.FILL_BOTH);
sashForm1.setLayoutData(data);
// Create the timeline view
new TimeLineView(sashForm1, mReader, selectionController);
// Create the profile view
new ProfileView(sashForm1, mReader, selectionController);
return sashForm1;
}
/**
* Convert the old two-file format into the current concatenated one.
*
* @param base Base path of the two files, i.e. base.key and base.data
* @return Path to a temporary file that will be deleted on exit.
* @throws IOException
*/
private static String makeTempTraceFile(String base) throws IOException {
// Make a temporary file that will go away on exit and prepare to
// write into it.
File temp = File.createTempFile(base, ".trace");
temp.deleteOnExit();
FileChannel dstChannel = new FileOutputStream(temp).getChannel();
// First copy the contents of the key file into our temp file.
FileChannel srcChannel = new FileInputStream(base + ".key").getChannel();
long size = dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
srcChannel.close();
// Then concatenate the data file.
srcChannel = new FileInputStream(base + ".data").getChannel();
dstChannel.transferFrom(srcChannel, size, srcChannel.size());
// Clean up.
srcChannel.close();
dstChannel.close();
// Return the path of the temp file.
return temp.getPath();
}
/**
* Returns the tools revision number.
*/
private static String getRevision() {
Properties p = new Properties();
try{
String toolsdir = System.getProperty("com.android.traceview.toolsdir"); //$NON-NLS-1$
File sourceProp;
if (toolsdir == null || toolsdir.length() == 0) {
sourceProp = new File("source.properties"); //$NON-NLS-1$
} else {
sourceProp = new File(toolsdir, "source.properties"); //$NON-NLS-1$
}
p.load(new FileInputStream(sourceProp));
String revision = p.getProperty("Pkg.Revision"); //$NON-NLS-1$
if (revision != null && revision.length() > 0) {
return revision;
}
} catch (FileNotFoundException e) {
// couldn't find the file? don't ping.
} catch (IOException e) {
// couldn't find the file? don't ping.
}
return null;
}
public static void main(String[] args) {
TraceReader reader = null;
boolean regression = false;
// ping the usage server
String revision = getRevision();
if (revision != null) {
SdkStatsService.ping(PING_NAME, revision, null);
}
// Process command line arguments
int argc = 0;
int len = args.length;
while (argc < len) {
String arg = args[argc];
if (arg.charAt(0) != '-') {
break;
}
if (arg.equals("-r")) {
regression = true;
} else {
break;
}
argc++;
}
if (argc != len - 1) {
System.out.printf("Usage: java %s [-r] trace%n", MainWindow.class.getName());
System.out.printf(" -r regression only%n");
return;
}
String traceName = args[len - 1];
File file = new File(traceName);
if (file.exists() && file.isDirectory()) {
System.out.printf("Qemu trace files not supported yet.\n");
System.exit(1);
// reader = new QtraceReader(traceName);
} else {
// If the filename as given doesn't exist...
if (!file.exists()) {
// Try appending .trace.
if (new File(traceName + ".trace").exists()) {
traceName = traceName + ".trace";
// Next, see if it is the old two-file trace.
} else if (new File(traceName + ".data").exists()
&& new File(traceName + ".key").exists()) {
try {
traceName = makeTempTraceFile(traceName);
} catch (IOException e) {
System.err.printf("cannot convert old trace file '%s'\n", traceName);
System.exit(1);
}
// Otherwise, give up.
} else {
System.err.printf("trace file '%s' not found\n", traceName);
System.exit(1);
}
}
reader = new DmTraceReader(traceName, regression);
}
reader.getTraceUnits().setTimeScale(TraceUnits.TimeScale.MilliSeconds);
new MainWindow(traceName, reader).run();
}
}