1//******************************************************************************
2//
3//******************************************************************************
4
5/*
6	Copyright 1999, Be Incorporated.   All Rights Reserved.
7	This file may be used under the terms of the Be Sample Code License.
8*/
9
10#define DEBUG 1
11#include <Debug.h>
12
13#include <stdio.h>
14#include <unistd.h>
15#include <string.h>
16#include <stdlib.h>
17
18#include <Application.h>
19#include <Window.h>
20#include <Box.h>
21#include <File.h>
22
23#include <Path.h>
24#include <Entry.h>
25#include <FindDirectory.h>
26#include <Shelf.h>
27#include <ByteOrder.h>
28
29#define MAGIC_1	'pjpp'
30#define MAGIC_2	'jahh'
31#define MAGIC_1_SWAP	'ppjp'
32#define MAGIC_2_SWAP	'hhaj'
33
34/*------------------------------------------------------------*/
35BEntry *archive_file(bool create = TRUE);
36
37class TWindow : public BWindow {
38public:
39					TWindow(BRect frame, const char *title, BPositionIO *stream);
40					~TWindow();
41virtual bool		QuitRequested();
42virtual void		Quit();
43
44private:
45		BBox		*fMainView;
46		BShelf		*fShelf;
47		BPositionIO	*fArchiveStream;
48};
49
50/*------------------------------------------------------------*/
51
52int main(int argc, char* argv[])
53{
54	BApplication	*app = new BApplication("application/x-vnd.Be-MYTE");
55	BEntry			*entry;
56	BRect			frame;
57	bool			frame_set =  FALSE;
58	TWindow			*w = NULL;
59	BFile			*stream = NULL;
60
61	if ((entry = archive_file())) {
62		long	d1 = 0;
63		long	d2 = 0;
64		long	err;
65
66		stream = new BFile(entry, O_RDWR);
67
68		// need to consider Endian issues here!
69		err = stream->Read(&d1, sizeof(d1));
70		err = stream->Read(&d2, sizeof(d2));
71
72		if ((d1 == MAGIC_1) && (d2 == MAGIC_2)) {
73			err = stream->Read(&frame, sizeof(frame));
74			frame_set = TRUE;
75		} else if ((d1 == MAGIC_1_SWAP) &&
76			(d2 == MAGIC_2_SWAP)) {
77				err = stream->Read(&frame, sizeof(frame));
78				swap_data(B_RECT_TYPE, &frame, sizeof(BRect), B_SWAP_ALWAYS);
79				frame_set = TRUE;
80		}
81		delete entry;
82	}
83	if (!frame_set)
84		frame = BRect(100, 50, 300, 400);
85
86	w = new TWindow(frame, "Container", stream);
87	w->Show();
88	app->Run();
89	delete stream;
90	delete app;
91	return 0;
92}
93
94/* ---------------------------------------------------------------- */
95
96BEntry *archive_file(bool create)
97{
98	BPath		path;
99	BEntry		*entry = NULL;
100//	long		err;
101
102
103	if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
104		return NULL;
105	path.Append ("Container_data");
106
107	if (create) {
108		int	fd;
109		fd  = open(path.Path(), O_RDWR);
110		if (fd < 0)
111			fd = creat(path.Path(), 0777);
112		if (fd > 0)
113			close(fd);
114	}
115
116	entry = new BEntry(path.Path());
117	if (entry->InitCheck() != B_NO_ERROR) {
118		delete entry;
119		entry = NULL;
120	}
121	return entry;
122}
123
124/*------------------------------------------------------------*/
125
126TWindow::TWindow(BRect frame, const char *title, BPositionIO *stream)
127	: BWindow(frame, title, B_TITLED_WINDOW, 0)
128{
129	BRect	b;
130	Lock();
131
132	b = frame;
133	b.OffsetTo(B_ORIGIN);
134
135	BView *parent = new BBox(b, "parent", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS, B_PLAIN_BORDER);
136	parent->SetViewColor(216, 216, 216, 0);
137	AddChild(parent);
138
139	fArchiveStream = stream;
140
141	b.InsetBy(5,5);
142	fMainView = new BBox(b, "MainView", B_FOLLOW_ALL);
143	fMainView->SetViewColor(216, 216, 216, 0);
144	fMainView->SetLabel("The Drop Zone");
145	parent->AddChild(fMainView);
146
147	fShelf = new BShelf(fArchiveStream, fMainView);
148	fShelf->SetDisplaysZombies(true);
149	fArchiveStream->Seek(0, SEEK_SET);
150
151	Unlock();
152}
153
154/*------------------------------------------------------------*/
155TWindow::~TWindow()
156{
157}
158
159/*------------------------------------------------------------*/
160
161void TWindow::Quit()
162{
163	delete fShelf;	// by deleting the Shelf we'll save the state
164	fShelf = NULL;
165	BWindow::Quit();
166}
167
168/*------------------------------------------------------------*/
169
170bool TWindow::QuitRequested()
171{
172	long c = be_app->CountWindows();
173
174	if (c == 1) {
175		be_app->PostMessage(B_QUIT_REQUESTED);
176
177//		BFile	*file;
178		if (fArchiveStream) {
179			long	err;
180			long	d1 = MAGIC_1;
181			long	d2 = MAGIC_2;
182			err = fArchiveStream->Write(&d1, sizeof(d1));
183			err = fArchiveStream->Write(&d2, sizeof(d2));
184
185			BRect frame = Frame();
186			err = fArchiveStream->Write(&frame, sizeof(frame));
187
188//+			delete fShelf;	// by deleting the Shelf we'll save the state
189		}
190	}
191	return TRUE;
192}
193