root/src/apps/diskusage/Scanner.h
/*
 * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
 * Distributed under the terms of the MIT/X11 license.
 *
 * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software
 * as long as it is accompanied by it's documentation and this copyright notice.
 * The software comes with no warranty, etc.
 */
#ifndef SCANNER_H
#define SCANNER_H


#include <string>

#include <Looper.h>
#include <Message.h>
#include <Messenger.h>
#include <Volume.h>

#include "Snapshot.h"


class BDirectory;

using std::string;


class Scanner: public BLooper {
public:
                                                                Scanner(BVolume* volume, BHandler* handler);
        virtual                                         ~Scanner();

        virtual void                            MessageReceived(BMessage* message);

                        VolumeSnapshot*         Snapshot() const
                                                                        { return fBusy ? NULL : fSnapshot; }
                        void                            Refresh(FileInfo* startInfo = NULL);
                        void                            Cancel();
                        bool                            IsBusy() const
                                                                        { return fBusy; }
                        const char*                     Task() const
                                                                        { return fTask.c_str(); }
                        float                           Progress() const
                                                                        { return min_c(1.0, fProgress); }
                        FileInfo*                       CurrentDir() const
                                                                        { return fBusy ? NULL : fSnapshot->currentDir; }
                        void                            ChangeDir(FileInfo* info)
                                                                        { fSnapshot->currentDir = info; }
                        void                            SetDesiredPath(string &path);
                        dev_t                           Device() const
                                                                        { return fVolume->Device(); }
                        void                            RequestQuit();

private:
                        void                            _RunScan(FileInfo *startInfo);
                        FileInfo*                       _GetFileInfo(BDirectory* dir, FileInfo* parent);
                        void                            _ChangeToDesired();
                        bool                            _DirectoryContains(FileInfo* currentDir,
                                                                        entry_ref* ref);

                        BMessenger                      fListener;
                        BMessage                        fDoneMessage;
                        BMessage                        fProgressMessage;

                        BVolume*                        fVolume;
                        off_t                           fVolumeBytesInUse;
                        off_t                           fVolumeBytesScanned;
                        float                           fProgress;
                        float                           fLastReport;
                        VolumeSnapshot*         fSnapshot;
                        string                          fDesiredPath;
                        string                          fTask;
                        bool                            fBusy;
                        bool                            fQuitRequested;
};

#endif // SCANNER_H