root/src/tests/kits/interface/bshelf/Container/ContainerApplication.cpp
// ContainerApplication.cpp


#include "ContainerApplication.h"


const char *XSHELF_INSPECTOR_APP        = "application/x-vnd.reh-XShelfInspector";      // Mime XShelfInspector
const char *BACKSTORE_PATH                              = "XContainer/XContainer_data";


ContainerApplication :: ContainerApplication()
                                                                        : IEApplication("application/x-vnd.reh-XContainer")
{
        fTest   = false;
        fStream = NULL;
        fRemove = false;        
        BEntry          *entry;
        fContainerWindow = NULL;

        if ((entry = archive_file())) 
        {
                fStream = new BFile(entry, O_RDWR);
                delete entry;
        }
        
        fContainerWindow = new ContainerWindow(fStream);
}


ContainerApplication :: ~ ContainerApplication()
{
        be_roster -> StopWatching(fMsgnr);      
        if (fStream != NULL) delete fStream;
        
        if ( (fRemove == true) && (fTest == false)      )       // delete backing store file
        {
                BPath           path;
                BPath           parent;
                if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK) return; // path: /boot/home/config/settings
                path.Append (BACKSTORE_PATH);                                                           
                
                path.GetParent(&parent);                                                                                // lock for parent
                create_directory(parent.Path(), 0777);                  // create directory
                parent.Unset();                                                                                                                 // close
                
                BEntry  entry(path.Path());             
                entry_ref       ref;
                entry.GetRef(&ref);                                             
                                        
                BFile file;
                file.SetTo(&ref,B_ERASE_FILE);                                                  // erase file
                file.Unset();
        }
}



BEntry  *ContainerApplication :: archive_file(bool create)
{
        BPath           path;
        BEntry  *entry = NULL;
        BPath           parent;
        
        if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)    // path: /boot/home/config/settings 
                return NULL;

        path.Append (BACKSTORE_PATH);   

        if (create) 
        {
                path.GetParent(&parent);                                                                                        // lock for parent
                create_directory(parent.Path(), 0777);                          // create directory
                parent.Unset();                                                                                                                         // close

                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;
}
        

void ContainerApplication::MessageReceived(BMessage *message)
{

        switch(message->what)
        {
                case CLEAR_FILE:
                        {
                                message -> FindBool("Remove",&fRemove);
                        }
                        break;  

                case TEST_REPLICANT:
                        {
                                message -> FindBool("Test",&fTest);
                        }
                        break;  

                case B_SOME_APP_ACTIVATED:
                case B_SOME_APP_LAUNCHED:
                        {
                                fContainerWindow -> Lock();
                                        bool value =  be_roster -> IsRunning(XSHELF_INSPECTOR_APP);
                                        fContainerWindow->EnableRemoveButton(value);                                                                    // Only when XShelf.. is running
                                        fContainerWindow->EnableTestButton(value);                                                                              // Buttons are enabled
                                fContainerWindow -> Unlock();
                        }
                        break;

                case B_SOME_APP_QUIT:                                                                                                                   // Quit XContaier when XShelfInspector is quitting
                        {
                                fTest = false;
                                bool value =  be_roster -> IsRunning(XSHELF_INSPECTOR_APP);
                                if ( !value && fContainerWindow->Lock() ) fContainerWindow -> QuitRequested();          
                        }
                        break;
        
                default:
                        BApplication::MessageReceived(message);
                        break;
        }

}

void ContainerApplication::ReadyToRun()
{               
        fMsgnr = BMessenger(this);
        be_roster -> StartWatching(fMsgnr);
        PostMessage(B_SOME_APP_LAUNCHED);
}



int main()
{       
        ContainerApplication    theApplication;

        theApplication.Run();

        return(0);
}