summaryrefslogtreecommitdiff
path: root/source/utilities/BulkHandler.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/utilities/BulkHandler.h')
-rw-r--r--source/utilities/BulkHandler.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/source/utilities/BulkHandler.h b/source/utilities/BulkHandler.h
new file mode 100644
index 0000000..71147ab
--- /dev/null
+++ b/source/utilities/BulkHandler.h
@@ -0,0 +1,81 @@
+/******************************************************************************
+*
+* Copyright (C) ST-Ericsson SA 2011
+* License terms: 3-clause BSD license
+*
+******************************************************************************/
+
+#ifndef _BULK_HANDLER_H_
+#define _BULK_HANDLER_H_
+
+#ifdef _WIN32
+#include "WinApiWrappers.h"
+#else
+#include "LinuxApiWrappers.h"
+#endif
+#include "Buffers.h"
+#include "LcmInterface.h"
+#include "Logger.h"
+#include <string>
+
+class CLCDriverMethods;
+
+/// <summary>
+/// Bulk handler state.
+/// </summary>
+enum BulkState {
+ BULK_INACTIVE,
+ BULK_RX,
+ BULK_TX
+};
+
+#define SESSION_END_MASK (1 << 4)
+#define SELECT_COMMAND(state, acknowledge) (state | (((uint32)acknowledge) << 4))
+
+enum BulkCommand {
+ BULK_WRITE_REQUEST = BULK_RX,
+ BULK_READ_REQUEST = BULK_TX,
+ BULK_RX_SESSION_END = BULK_WRITE_REQUEST | SESSION_END_MASK,
+ BULK_TX_SESSION_END = BULK_READ_REQUEST | SESSION_END_MASK
+};
+
+/// <summary>
+/// Bulk Buffer class used to manipulate
+/// the bulk buffers linear list filled
+/// with bulk chunks data
+/// </summary>
+class BulkHandler
+{
+public:
+ BulkHandler(CLCDriverMethods *methods, Buffers *buffers, LcmInterface *lcmInterface, Logger *logger);
+ ~BulkHandler();
+
+ int Receive(const std::string &sourceFile);
+ int Send(const std::string &destinationFile);
+ void Finish();
+ void HandleCommandRequest(uint16 session, uint32 chunkSize, uint64 offset, uint32 length, bool acknowledge);
+private:
+ CLCDriverMethods *m_Methods;
+ Buffers *m_pBuffers;
+ LcmInterface *m_pLcmInterface;
+ Logger *m_pLogger;
+ BulkState m_State;
+ TL_BulkVectorList_t *m_pBulkVector;
+ std::string m_sFilePath;
+ CSemaphoreQueue m_ReceiveQueue;
+ CThreadWrapper *m_pFileWriteThread;
+private:
+ void HandleReadRequest(uint16 session, uint32 chunkSize, uint64 offset, uint32 length);
+ void HandleWriteRequest(uint16 session, uint32 chunkSize, uint64 offset, uint32 length);
+ void HandleRxSessionEnd(uint16 session, uint32 chunkSize, uint64 offset, uint32 length);
+ void HandleTxSessionEnd(uint16 session, uint32 chunkSize, uint64 offset, uint32 length);
+#ifdef _WIN32
+ static unsigned int WINAPI FileWriteThreadFunction(void *arg);
+#else
+ static void *FileWriteThreadFunction(void *arg);
+#endif
+ void FlushReceiveQueue();
+ void WriteBulkVector(TL_BulkVectorList_t *bulkVector);
+};
+
+#endif