296 lines
4.9 KiB
Plaintext
296 lines
4.9 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Class Library
|
|
// ----------------------------------------------
|
|
// Name: XSCNotifier
|
|
// Description: provides all Base Notification requirements ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// START Definitions ...
|
|
//
|
|
|
|
//
|
|
// a Notification Model ...
|
|
typedef void (*OnMessage)(
|
|
string, // action ...
|
|
string // payload ...
|
|
);
|
|
|
|
//
|
|
struct XNotifierEventListener
|
|
{
|
|
string action;
|
|
OnMessage listeners[];
|
|
};
|
|
|
|
//
|
|
// END Definitions ...
|
|
//
|
|
|
|
//
|
|
// START Import and Inclused requirements ...
|
|
//
|
|
|
|
//
|
|
// Includes ...
|
|
#include "../Libraries/x-saherelm.models.lib.mq5"
|
|
#include "../Libraries/x-saherelm.common.lib.mq5"
|
|
|
|
//
|
|
// END Import and Inclused requirements ...
|
|
//
|
|
|
|
//
|
|
// START Overrides ...
|
|
//
|
|
|
|
//
|
|
// END Overrides ...
|
|
//
|
|
|
|
//
|
|
// a Class for Handle base requirements ...
|
|
// for indicators ...
|
|
class XSCNotifier
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Constructor ...
|
|
void XSCNotifier()
|
|
{
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
void ~XSCNotifier()
|
|
{
|
|
}
|
|
|
|
//
|
|
// START Properties ...
|
|
//
|
|
|
|
//
|
|
// END Properties ...
|
|
//
|
|
|
|
//
|
|
// START Provided Functions ...
|
|
//
|
|
bool AddEventListener(
|
|
string action, // Specific Action ...
|
|
OnMessage listener // Specific Listener ...
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
int aIndex = FindActionIndex(action);
|
|
if (aIndex < 0)
|
|
{
|
|
//
|
|
// Create a New Structure ...
|
|
XNotifierEventListener model;
|
|
|
|
//
|
|
model.action = action;
|
|
|
|
//
|
|
Add(
|
|
listener,
|
|
model.listeners);
|
|
|
|
//
|
|
Add(
|
|
model,
|
|
mEventListeners);
|
|
|
|
//
|
|
result = true;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Just Add Listener to Exists model ...
|
|
Add(
|
|
listener,
|
|
mEventListeners[aIndex].listeners);
|
|
|
|
//
|
|
result = true;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool NotifyEvent(
|
|
string action, // action ...
|
|
string payload // payload ...
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
int actionIndex = FindActionIndex(action);
|
|
result = actionIndex >= 0;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
int aListenersCount = ArraySize(mEventListeners[actionIndex].listeners);
|
|
result = aListenersCount > 0;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 0; i < aListenersCount; i++)
|
|
{
|
|
//
|
|
OnMessage iListener = mEventListeners[actionIndex].listeners[i];
|
|
|
|
//
|
|
// Call Listener ...
|
|
iListener(
|
|
action,
|
|
payload);
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END Provided Functions ...
|
|
//
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
XNotifierEventListener mEventListeners[];
|
|
|
|
//
|
|
// Find Specific Actions Index in Registered Event Listeners ...
|
|
int FindActionIndex(string action)
|
|
{
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
int listenersCount = ArraySize(mEventListeners);
|
|
if (listenersCount <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
for (int i = 0; i < listenersCount; i++)
|
|
{
|
|
//
|
|
XNotifierEventListener iModel = mEventListeners[i];
|
|
|
|
//
|
|
if (iModel.action == action)
|
|
{
|
|
//
|
|
result = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
};
|
|
|
|
//
|
|
// START Usefull Functions ...
|
|
//
|
|
|
|
//
|
|
void Clean(
|
|
OnMessage &buffer[] // Buffer ...
|
|
)
|
|
{
|
|
//
|
|
ArrayFree(buffer);
|
|
|
|
//
|
|
ArrayResize(
|
|
buffer,
|
|
0);
|
|
}
|
|
void Clean(
|
|
XNotifierEventListener &buffer[] // Buffer ...
|
|
)
|
|
{
|
|
//
|
|
ArrayFree(buffer);
|
|
|
|
//
|
|
ArrayResize(
|
|
buffer,
|
|
0);
|
|
}
|
|
|
|
//
|
|
void Add(
|
|
OnMessage item, // Item ...
|
|
OnMessage &buffer[] // Buffer ...
|
|
)
|
|
{
|
|
//
|
|
ArrayResize(
|
|
buffer,
|
|
ArraySize(buffer) + 1);
|
|
|
|
//
|
|
buffer[ArraySize(buffer) - 1] = item;
|
|
}
|
|
void Add(
|
|
XNotifierEventListener &item, // Item ...
|
|
XNotifierEventListener &buffer[] // Buffer ...
|
|
)
|
|
{
|
|
//
|
|
ArrayResize(
|
|
buffer,
|
|
ArraySize(buffer) + 1);
|
|
|
|
//
|
|
buffer[ArraySize(buffer) - 1] = item;
|
|
}
|
|
|
|
//
|
|
// END Usefull Functions ...
|
|
//
|