Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#define DEBUG 1
#include <Debug.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <Application.h>
#include <Window.h>
#include <Box.h>
#include <File.h>
#include <Path.h>
#include <Entry.h>
#include <FindDirectory.h>
#include <Shelf.h>
#include <ByteOrder.h>
#define MAGIC_1 'pjpp'
#define MAGIC_2 'jahh'
#define MAGIC_1_SWAP 'ppjp'
#define MAGIC_2_SWAP 'hhaj'
BEntry *archive_file(bool create = TRUE);
class TWindow : public BWindow {
public:
TWindow(BRect frame, const char *title, BPositionIO *stream);
~TWindow();
virtual bool QuitRequested();
virtual void Quit();
private:
BBox *fMainView;
BShelf *fShelf;
BPositionIO *fArchiveStream;
};
int main(int argc, char* argv[])
{
BApplication *app = new BApplication("application/x-vnd.Be-MYTE");
BEntry *entry;
BRect frame;
bool frame_set = FALSE;
TWindow *w = NULL;
BFile *stream = NULL;
if ((entry = archive_file())) {
long d1 = 0;
long d2 = 0;
long err;
stream = new BFile(entry, O_RDWR);
err = stream->Read(&d1, sizeof(d1));
err = stream->Read(&d2, sizeof(d2));
if ((d1 == MAGIC_1) && (d2 == MAGIC_2)) {
err = stream->Read(&frame, sizeof(frame));
frame_set = TRUE;
} else if ((d1 == MAGIC_1_SWAP) &&
(d2 == MAGIC_2_SWAP)) {
err = stream->Read(&frame, sizeof(frame));
swap_data(B_RECT_TYPE, &frame, sizeof(BRect), B_SWAP_ALWAYS);
frame_set = TRUE;
}
delete entry;
}
if (!frame_set)
frame = BRect(100, 50, 300, 400);
w = new TWindow(frame, "Container", stream);
w->Show();
app->Run();
delete stream;
delete app;
return 0;
}
BEntry *archive_file(bool create)
{
BPath path;
BEntry *entry = NULL;
if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
return NULL;
path.Append ("Container_data");
if (create) {
int fd;
fd = open(path.Path(), O_RDWR);
if (fd < 0)
fd = creat(path.Path(), 0777);
if (fd > 0)
close(fd);
}
entry = new BEntry(path.Path());
if (entry->InitCheck() != B_NO_ERROR) {
delete entry;
entry = NULL;
}
return entry;
}
TWindow::TWindow(BRect frame, const char *title, BPositionIO *stream)
: BWindow(frame, title, B_TITLED_WINDOW, 0)
{
BRect b;
Lock();
b = frame;
b.OffsetTo(B_ORIGIN);
BView *parent = new BBox(b, "parent", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS, B_PLAIN_BORDER);
parent->SetViewColor(216, 216, 216, 0);
AddChild(parent);
fArchiveStream = stream;
b.InsetBy(5,5);
fMainView = new BBox(b, "MainView", B_FOLLOW_ALL);
fMainView->SetViewColor(216, 216, 216, 0);
fMainView->SetLabel("The Drop Zone");
parent->AddChild(fMainView);
fShelf = new BShelf(fArchiveStream, fMainView);
fShelf->SetDisplaysZombies(true);
fArchiveStream->Seek(0, SEEK_SET);
Unlock();
}
TWindow::~TWindow()
{
}
void TWindow::Quit()
{
delete fShelf;
fShelf = NULL;
BWindow::Quit();
}
bool TWindow::QuitRequested()
{
long c = be_app->CountWindows();
if (c == 1) {
be_app->PostMessage(B_QUIT_REQUESTED);
if (fArchiveStream) {
long err;
long d1 = MAGIC_1;
long d2 = MAGIC_2;
err = fArchiveStream->Write(&d1, sizeof(d1));
err = fArchiveStream->Write(&d2, sizeof(d2));
BRect frame = Frame();
err = fArchiveStream->Write(&frame, sizeof(frame));
}
}
return TRUE;
}