You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
5.6 KiB
288 lines
5.6 KiB
//
|
|
// Collections(list) class
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "regevent.h"
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
class CNode
|
|
{
|
|
|
|
public:
|
|
CNode(
|
|
VOID* pKey,
|
|
VOID* pKey2,
|
|
VOID* pContext,
|
|
VOID* pContext2,
|
|
VOID* pContext3
|
|
)
|
|
{
|
|
m_pKey = pKey;
|
|
m_pKey2 = pKey2;
|
|
m_pContext = pContext;
|
|
m_pContext2 = pContext2;
|
|
m_pContext3 = pContext3;
|
|
};
|
|
|
|
VOID* m_pKey;
|
|
VOID* m_pKey2;
|
|
VOID* m_pContext;
|
|
VOID* m_pContext2;
|
|
VOID* m_pContext3;
|
|
CNode* m_pNext;
|
|
};
|
|
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
class CGenericList
|
|
{
|
|
|
|
public:
|
|
CRITICAL_SECTION m_ObjectListCritical;
|
|
|
|
CNode* m_Head;
|
|
|
|
CGenericList()
|
|
{
|
|
m_Head = NULL;
|
|
InitializeCriticalSection(&m_ObjectListCritical);
|
|
};
|
|
|
|
~CGenericList()
|
|
{
|
|
DeleteCriticalSection(&m_ObjectListCritical);
|
|
};
|
|
|
|
BOOL Insert(VOID *key, VOID *key2, VOID *context, VOID *context2, VOID *context3);
|
|
|
|
// removal based on first key
|
|
BOOL RemoveKey(VOID *key, VOID **pkey2, VOID **pcontext, VOID **pcontext2, VOID **pcontext3);
|
|
|
|
// removal based on second key
|
|
BOOL RemoveKey2(VOID **pkey, VOID *key2, VOID **pcontext, VOID **pcontext2, VOID **pcontext3);
|
|
|
|
// removal from list.
|
|
BOOL Remove(VOID **pkey, VOID **pkey2, VOID **pcontext, VOID **pcontext2, VOID **pcontext3);
|
|
};
|
|
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
class CControlObjectList
|
|
{
|
|
private:
|
|
CGenericList m_ControlObjectList;
|
|
|
|
public:
|
|
|
|
ULONG m_NumElements;
|
|
|
|
CControlObjectList()
|
|
{
|
|
m_NumElements = 0;
|
|
};
|
|
|
|
BOOL Insert(CFtpControlConnection *pControlConnection);
|
|
|
|
BOOL Remove(CFtpControlConnection *pControlConnection);
|
|
|
|
bool
|
|
IsSourcePortAvailable(
|
|
ULONG nPublicSourceAddress,
|
|
USHORT nPublicSourcePortToVerify
|
|
);
|
|
|
|
void ShutdownAll();
|
|
|
|
|
|
};
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
class CDataChannelList
|
|
{
|
|
private:
|
|
CGenericList m_DataChannelObjectList;
|
|
ULONG m_NumElements;
|
|
|
|
public:
|
|
CDataChannelList()
|
|
{
|
|
m_NumElements = 0;
|
|
};
|
|
|
|
BOOL Insert(IDataChannel *pDataChannel,USHORT icsPort,HANDLE CreationHandle,HANDLE DeletionHandle);
|
|
|
|
BOOL Remove(IDataChannel **pDataChannel,USHORT *icsPort,HANDLE *CreationHandle,HANDLE *DeletionHandle);
|
|
|
|
BOOL Remove(IDataChannel *pDataChannel,USHORT *icsPort);
|
|
|
|
BOOL Remove(IDataChannel *pDataChannel,USHORT *icsPort,HANDLE *DeletionHandle);
|
|
|
|
};
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
class CRegisteredEventList
|
|
{
|
|
private:
|
|
CGenericList m_RegEventObjectList;
|
|
ULONG m_NumElements;
|
|
|
|
public:
|
|
CRegisteredEventList() { m_NumElements = 0; };
|
|
|
|
BOOL Insert(HANDLE WaitHandle, HANDLE hEvent,EVENT_CALLBACK CallBack, void *Context, void *Context2);
|
|
|
|
BOOL Remove(HANDLE WaitHandle, HANDLE *hEvent);
|
|
|
|
BOOL Remove(HANDLE *WaitHandle, HANDLE hEvent,EVENT_CALLBACK *CallBack,void **context,void **context2);
|
|
};
|
|
|
|
//
|
|
// Doubly-linked list manipulation routines. Implemented as macros
|
|
// but logically these are procedures.
|
|
//
|
|
|
|
//
|
|
// VOID
|
|
// InitializeListHead(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define InitializeListHead(ListHead) (\
|
|
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
|
|
|
|
//
|
|
// BOOLEAN
|
|
// IsListEmpty(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define IsListEmpty(ListHead) \
|
|
((ListHead)->Flink == (ListHead))
|
|
|
|
//
|
|
// PLIST_ENTRY
|
|
// RemoveHeadList(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define RemoveHeadList(ListHead) \
|
|
(ListHead)->Flink;\
|
|
{RemoveEntryList((ListHead)->Flink)}
|
|
|
|
//
|
|
// PLIST_ENTRY
|
|
// RemoveTailList(
|
|
// PLIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define RemoveTailList(ListHead) \
|
|
(ListHead)->Blink;\
|
|
{RemoveEntryList((ListHead)->Blink)}
|
|
|
|
//
|
|
// VOID
|
|
// RemoveEntryList(
|
|
// PLIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define RemoveEntryList(Entry) {\
|
|
PLIST_ENTRY _EX_Blink;\
|
|
PLIST_ENTRY _EX_Flink;\
|
|
_EX_Flink = (Entry)->Flink;\
|
|
_EX_Blink = (Entry)->Blink;\
|
|
_EX_Blink->Flink = _EX_Flink;\
|
|
_EX_Flink->Blink = _EX_Blink;\
|
|
}
|
|
|
|
//
|
|
// VOID
|
|
// InsertTailList(
|
|
// PLIST_ENTRY ListHead,
|
|
// PLIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define InsertTailList(ListHead,Entry) {\
|
|
PLIST_ENTRY _EX_Blink;\
|
|
PLIST_ENTRY _EX_ListHead;\
|
|
_EX_ListHead = (ListHead);\
|
|
_EX_Blink = _EX_ListHead->Blink;\
|
|
(Entry)->Flink = _EX_ListHead;\
|
|
(Entry)->Blink = _EX_Blink;\
|
|
_EX_Blink->Flink = (Entry);\
|
|
_EX_ListHead->Blink = (Entry);\
|
|
}
|
|
|
|
//
|
|
// VOID
|
|
// InsertHeadList(
|
|
// PLIST_ENTRY ListHead,
|
|
// PLIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define InsertHeadList(ListHead,Entry) {\
|
|
PLIST_ENTRY _EX_Flink;\
|
|
PLIST_ENTRY _EX_ListHead;\
|
|
_EX_ListHead = (ListHead);\
|
|
_EX_Flink = _EX_ListHead->Flink;\
|
|
(Entry)->Flink = _EX_Flink;\
|
|
(Entry)->Blink = _EX_ListHead;\
|
|
_EX_Flink->Blink = (Entry);\
|
|
_EX_ListHead->Flink = (Entry);\
|
|
}
|
|
|
|
//
|
|
//
|
|
// PSINGLE_LIST_ENTRY
|
|
// PopEntryList(
|
|
// PSINGLE_LIST_ENTRY ListHead
|
|
// );
|
|
//
|
|
|
|
#define PopEntryList(ListHead) \
|
|
(ListHead)->Next;\
|
|
{\
|
|
PSINGLE_LIST_ENTRY FirstEntry;\
|
|
FirstEntry = (ListHead)->Next;\
|
|
if (FirstEntry != NULL) { \
|
|
(ListHead)->Next = FirstEntry->Next;\
|
|
} \
|
|
}
|
|
|
|
|
|
//
|
|
// VOID
|
|
// PushEntryList(
|
|
// PSINGLE_LIST_ENTRY ListHead,
|
|
// PSINGLE_LIST_ENTRY Entry
|
|
// );
|
|
//
|
|
|
|
#define PushEntryList(ListHead,Entry) \
|
|
(Entry)->Next = (ListHead)->Next; \
|
|
(ListHead)->Next = (Entry)
|
|
|
|
|