//****************************************************************************** // //****************************************************************************** /* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #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); // need to consider Endian issues here! 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; // long err; 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; // by deleting the Shelf we'll save the state fShelf = NULL; BWindow::Quit(); } /*------------------------------------------------------------*/ bool TWindow::QuitRequested() { long c = be_app->CountWindows(); if (c == 1) { be_app->PostMessage(B_QUIT_REQUESTED); // BFile *file; 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)); //+ delete fShelf; // by deleting the Shelf we'll save the state } } return TRUE; }