1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9
10#include <new>
11
12#include <Application.h>
13
14#include <AutoDeleter.h>
15
16#include "DataSource.h"
17#include "MessageCodes.h"
18
19#include "main_window/MainWindow.h"
20
21
22static const char* const kSignature = "application/x-vnd.Haiku-DebugAnalyzer";
23
24
25class DebugAnalyzer : public BApplication {
26public:
27	DebugAnalyzer()
28		:
29		BApplication(kSignature),
30		fWindowCount(0)
31	{
32	}
33
34	virtual void ReadyToRun()
35	{
36printf("ReadyToRun()\n");
37		if (fWindowCount == 0 && _CreateWindow(NULL) != B_OK)
38			PostMessage(B_QUIT_REQUESTED);
39	}
40
41	virtual void ArgvReceived(int32 argc, char** argv)
42	{
43		printf("ArgvReceived()\n");
44		for (int32 i = 0; i < argc; i++)
45			printf("  arg %" B_PRId32 ": \"%s\"\n", i, argv[i]);
46
47		for (int32 i = 1; i < argc; i++) {
48			PathDataSource* dataSource = new(std::nothrow) PathDataSource;
49			if (dataSource == NULL) {
50				// no memory
51				fprintf(stderr, "DebugAnalyzer::ArgvReceived(): Out of "
52					"memory!");
53				return;
54			}
55
56			status_t error = dataSource->Init(argv[i]);
57			if (error != B_OK) {
58				fprintf(stderr, "Failed to create data source for path "
59					"\"%s\": %s\n", argv[i], strerror(error));
60				// TODO: Alert!
61				continue;
62			}
63
64			_CreateWindow(dataSource);
65		}
66
67	}
68
69	virtual void RefsReceived(BMessage* message)
70	{
71printf("RefsReceived()\n");
72	}
73
74private:
75	status_t _CreateWindow(DataSource* dataSource)
76	{
77		ObjectDeleter<DataSource> dataSourceDeleter(dataSource);
78
79		MainWindow* window;
80		try {
81			window = new MainWindow(dataSource);
82		} catch (std::bad_alloc&) {
83			fprintf(stderr, "DebugAnalyzer::_CreateWindow(): Out of memory!\n");
84			return B_NO_MEMORY;
85		}
86
87		// the data source is owned by the window now
88		dataSourceDeleter.Detach();
89
90		window->Show();
91
92		fWindowCount++;
93
94		return B_OK;
95	}
96
97	virtual void MessageReceived(BMessage* message)
98	{
99		switch (message->what) {
100			case MSG_WINDOW_QUIT:
101				if (--fWindowCount == 0)
102					PostMessage(B_QUIT_REQUESTED);
103				break;
104			default:
105				BApplication::MessageReceived(message);
106				break;
107		}
108	}
109
110private:
111	int32	fWindowCount;
112};
113
114
115int
116main(int argc, const char* const* argv)
117{
118	DebugAnalyzer app;
119	app.Run();
120
121	return 0;
122}
123