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 /*------------------------------------------------------------*/ 35 BEntry *archive_file(bool create = TRUE); 36 37 class TWindow : public BWindow { 38 public: 39 TWindow(BRect frame, const char *title, BPositionIO *stream); 40 ~TWindow(); 41 virtual bool QuitRequested(); 42 virtual void Quit(); 43 44 private: 45 BBox *fMainView; 46 BShelf *fShelf; 47 BPositionIO *fArchiveStream; 48 }; 49 50 /*------------------------------------------------------------*/ 51 52 int 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 96 BEntry *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 126 TWindow::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 /*------------------------------------------------------------*/ 155 TWindow::~TWindow() 156 { 157 } 158 159 /*------------------------------------------------------------*/ 160 161 void TWindow::Quit() 162 { 163 delete fShelf; // by deleting the Shelf we'll save the state 164 fShelf = NULL; 165 inherited::Quit(); 166 } 167 168 /*------------------------------------------------------------*/ 169 170 bool 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