Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

//---------------------------------------------------------------------------

#ifndef UdTransferManagerH
#define UdTransferManagerH

#include <vcl.h>
#include <map>
#include <vector>
#include <syncobjs.hpp>

#include "IDeviceFactory.h"

//---------------------------------------------------------------------------

typedef enum
{
    UdTransferCompleted = 0,
    UdTransferFailed = 1,
    UdTransferAborted = 2,
    UdTransferInProgress = 3,
    UdTransferPending = 4

} UdTransferTaskState;

typedef enum
{
    RampTestDisabled = 0,
    RampTestByDemand = 1,
    RampTestByRatio  = 2

} RampTestType;

typedef std::vector<int>        BatchSizeList;
typedef BatchSizeList::iterator BatchSizeItem;

struct UdTransferStatistics
{
    int     processedFiles;
    int     totalFiles;
    int     processedBytes;
    int     totalBytes;
    bool    completed;
    TDateTime startTime;
    TDateTime endTime;   
    BatchSizeList batches;    
};

struct UdFile
{
    AnsiString  name;
    int         size;
    TDateTime   time;

    UdFile() {}
    UdFile( const UdFile & rhs ) :
        name( rhs.name ), size( rhs.size ), time( rhs.time ) {}

    bool operator<( const UdFile & rhs ) const
    {
        return time < rhs.time;
    };
};

typedef std::vector<UdFile>     UdFileList;
typedef UdFileList::iterator    UdFileItem;

struct UdTransferTask
{
    int                 id;
    int                 batchSize;
    unsigned int        duration;
    int                 frequency;
    bool                recurring;
    AnsiString          sourcePath;
    AnsiString          destination;
    UdFileList          files;
    UdTransferTaskState state;
    RampTestType        rampType;
    double              gradient;
    TDateTime           rampTime;

    UdTransferTask() {}
    UdTransferTask( const UdTransferTask & rhs ) :
        id( rhs.id ), batchSize( rhs.batchSize ), duration( rhs.duration ),
        frequency( rhs.frequency ), recurring( rhs.recurring ), sourcePath( rhs.sourcePath ),
        destination( rhs.destination ), files( rhs.files ), state( rhs.state ),
        rampType( rhs.rampType ), gradient( rhs.gradient ), rampTime( rhs.rampTime ) {}

    bool operator!=( const UdTransferTask & rhs )
    {
        return (batchSize != rhs.batchSize &&
                duration  != rhs.duration &&
                frequency != rhs.frequency &&
                recurring != rhs.recurring &&
                sourcePath != rhs.sourcePath &&
                destination != rhs.destination &&
                state != rhs.state &&
                rampType != rhs.rampType &&
                gradient != rhs.gradient &&
                rampTime != rhs.rampTime);
    }
};

typedef std::vector<UdTransferTask>     UdTransferTaskList;
typedef UdTransferTaskList::iterator    UdTransferTaskItem;

class UdTransferThread;

typedef std::map<int, UdTransferThread *> UdTransferThreadMap;
typedef UdTransferThreadMap::iterator   UdTransferThreadItem;

//---------------------------------------------------------------------------
class UdTransferManager
{
public:
    UdTransferManager();
    virtual ~UdTransferManager();

    void AddNewTask( const UdTransferTask & task );
    void LoadPendingTasks();
    void UpdateTask( const UdTransferTask & task,
                     const AnsiString & comment = "" );
    bool GetTaskDetails( UdTransferTask & task );
    bool LaunchTask( const UdTransferTask & task );
    bool GetTaskStatistics( const int & taskId,
                            UdTransferStatistics & stats );
    void UpdateTaskStatistics( const int & taskId,
                               const UdTransferStatistics & stats );
    bool IsTaskRunning();

    AnsiString GetUsername() { return m_username; }
    AnsiString GetHostname() { return m_hostname; } 

private:
    AnsiString  m_username;
    AnsiString  m_hostname;

    UdTransferThreadMap m_threads;
    UdTransferTaskList  m_tasks;

    Syncobjs::TCriticalSection *  m_tasksLock;

    HINSTANCE           m_deviceSimulatorWrapperDll;
    getDeviceFactory_t  m_getDeviceFactory;
    IDeviceFactory *    m_deviceSimulatorFactory;
};

#endif