/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // ---------------------------------------------- // Name: XSCAlert // Description: provides all Alerts 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 // // Imports ... #include "../Classes/x-saherelm.base.class.mq5" // // Class Definition ... class XSCAlert : public XSCBase { // // Public ... public: // // Props ... // // Constructor ... XSCAlert( string prefix = "X-Alert", // Alerts Prefixe bool enableAlerts = true, // Enable Alerts bool logAlerts = true, // Log Alerts bool terminalAlerts = false, // Terminal Alerts bool mailAlerts = false, // Mail Alerts bool pushAlerts = false // Push Alerts ) { // mPrefix = prefix; mLogAlerts = logAlerts; mMailAlerts = mailAlerts; mPushAlerts = pushAlerts; mEnableAlerts = enableAlerts; mTerminalAlerts = terminalAlerts; // // Normalize Prefix if Not Provided ... if (!IsValid(mPrefix)) { mPrefix = GetTag(); } } // // Deconstructor ... ~XSCAlert() {} // // Override ... string GetTag() override { return GetSpecificToken(this); } // // Properties Getter(s) / Setter(s) ... // string GetPrefix() { return mPrefix; } // void SetPrefix(string value) { mPrefix = value; } // bool GetLogAlerts() { return mLogAlerts; } // void SetLogAlerts(bool value) { mLogAlerts = value; } // bool GetEnableAlerts() { return mEnableAlerts; } // void SetEnableAlerts(bool value) { mEnableAlerts = value; } // bool GetPushAlerts() { return mPushAlerts; } // void SetPushAlerts(bool value) { mPushAlerts = value; } // bool GetMailAlerts() { return mMailAlerts; } // void SetMailAlerts(bool value) { mMailAlerts = value; } // bool GetTerminalAlerts() { return mTerminalAlerts; } // void SetTerminalAlerts(bool value) { mTerminalAlerts = value; } // // Tools Funtions ... // // Alerts ... // // Logging an Alert ... void LogAlert(string message) { // // Validate Args ... if (!CanLogAlert()) { return; } // Log(message); } // // Terminal Alert ... void TerminalAlert(string message) { // // Validate Args ... if (!CanTerminalAlert()) { return; } // // Prepare Message ... message = PrepareMessage(message); // Send Terminal Alert ... Alert(message); } // // Mail Alert ... void MailAlert(string message) { // // Validate Args ... if (!CanMailAlert()) { return; } // // Send Mail Alert ... SendMail(GetPrefix(), message); } // // Send Push Notification ... void PushAlert(string message) { // // Validate Args ... if (!CanPushAlert()) { return; } // // Prepare Message ... message = PrepareMessage(message); // // Send Push Notification Alert ... SendNotification(message); } // // Send an Alert by Handling all Different Specified // type's of Alert's if they are Enabled ... void Alert(string message) { // // Handle Log, if Enabled ... LogAlert(message); // // Handle Mail if Enabled ... MailAlert(message); // // Handle Push if Enabled ... PushAlert(message); // // Handle Terminal if Enabled ... TerminalAlert(message); } // // Logs ... // // Log a Message ... void Log(string message) { // if (!CanLog()) { return; } // Print(GetPrefix(), " > ", message); } void Log(string tag, string message) { // if (!CanLog()) { return; } // Print(GetPrefix(), "_", tag, " > ", message); } void LogEmpty() { // if (!CanLog()) { return; } // Print(" "); } // // Log Specific Array ... template void LogArray( T &array[], // Array to Log string label = NULL // Array Label ) { // if (!CanLog()) { return; } // Print(GetPrefix(), ">", (IsValid(label) ? label : "")); ArrayPrint(array); } // // Error ... // // Log an Error ... void LogError( int error = -1 // Specific Error, if it's equal to -1, use Last Error ... ) { // if (!CanLog()) { return; } // if (error <= -1) { error = GetLastError(); } // string errorMsg = GetErrorDescription(error); // Log("Error: " + errorMsg); } // // Retrieve Specified Error Code Description ... string GetErrorDescription(int err_code) { // string result = ""; // switch (err_code) { // //--- Constant Description // case ERR_SUCCESS: result = "The operation completed successfully"; break; // case ERR_INTERNAL_ERROR: result = "Unexpected internal error"; break; // case ERR_WRONG_INTERNAL_PARAMETER: result = "Wrong parameter in the inner call of the client terminal function"; break; // case ERR_INVALID_PARAMETER: result = "Wrong parameter when calling the system function"; break; // case ERR_NOT_ENOUGH_MEMORY: result = "Not enough memory to perform the system function"; break; // case ERR_STRUCT_WITHOBJECTS_ORCLASS: result = "The structure contains objects of strings and/or dynamic arrays and/or structure of such objects and/or classes"; break; // case ERR_INVALID_ARRAY: result = "Array of a wrong type, wrong size, or a damaged object of a dynamic array"; break; // case ERR_ARRAY_RESIZE_ERROR: result = "Not enough memory for the relocation of an array, or an attempt to change the size of a static array"; break; // case ERR_STRING_RESIZE_ERROR: result = "Not enough memory for the relocation of string"; break; // case ERR_NOTINITIALIZED_STRING: result = "Not initialized string"; break; // case ERR_INVALID_DATETIME: result = "Invalid date and/or time"; break; // case ERR_ARRAY_BAD_SIZE: result = "Requested array size exceeds 2 GB"; break; // case ERR_INVALID_POINTER: result = "Wrong pointer"; break; // case ERR_INVALID_POINTER_TYPE: result = "Wrong type of pointer"; break; // case ERR_FUNCTION_NOT_ALLOWED: result = "System function is not allowed to call"; break; // //--- Charts // case ERR_CHART_WRONG_ID: result = "Wrong chart ID"; break; // case ERR_CHART_NO_REPLY: result = "Chart does not respond"; break; // case ERR_CHART_NOT_FOUND: result = "Chart not found"; break; // case ERR_CHART_NO_EXPERT: result = "No Expert Advisor in the chart that could handle the event"; break; // case ERR_CHART_CANNOT_OPEN: result = "Chart opening error"; break; // case ERR_CHART_CANNOT_CHANGE: result = "Failed to change chart symbol and period"; break; // case ERR_CHART_CANNOT_CREATE_TIMER: result = "Failed to create timer"; break; // case ERR_CHART_WRONG_PROPERTY: result = "Wrong chart property ID"; break; // case ERR_CHART_SCREENSHOT_FAILED: result = "Error creating screenshots"; break; // case ERR_CHART_NAVIGATE_FAILED: result = "Error navigating through chart"; break; // case ERR_CHART_TEMPLATE_FAILED: result = "Error applying template"; break; // case ERR_CHART_WINDOW_NOT_FOUND: result = "Subwindow containing the indicator was not found"; break; // case ERR_CHART_INDICATOR_CANNOT_ADD: result = "Error adding an indicator to chart"; break; // case ERR_CHART_INDICATOR_CANNOT_DEL: result = "Error deleting an indicator from the chart"; break; // case ERR_CHART_INDICATOR_NOT_FOUND: result = "Indicator not found on the specified chart"; break; // //--- Graphical Objects case ERR_OBJECT_ERROR: result = "Error working with a graphical object"; break; // case ERR_OBJECT_NOT_FOUND: result = "Graphical object was not found"; break; // case ERR_OBJECT_WRONG_PROPERTY: result = "Wrong ID of a graphical object property"; break; // case ERR_OBJECT_GETDATE_FAILED: result = "Unable to get date corresponding to the value"; break; // case ERR_OBJECT_GETVALUE_FAILED: result = "Unable to get value corresponding to the date"; break; // //--- MarketInfo // case ERR_MARKET_UNKNOWN_SYMBOL: result = "Unknown symbol"; break; // case ERR_MARKET_NOT_SELECTED: result = "Symbol is not selected in MarketWatch"; break; // case ERR_MARKET_WRONG_PROPERTY: result = "Wrong identifier of a symbol property"; break; // case ERR_MARKET_LASTTIME_UNKNOWN: result = "Time of the last tick is not known (no ticks)"; break; // case ERR_MARKET_SELECT_ERROR: result = "Error adding or deleting a symbol in MarketWatch"; break; // //--- History Access // case ERR_HISTORY_NOT_FOUND: result = "Requested history not found"; break; // case ERR_HISTORY_WRONG_PROPERTY: result = "Wrong ID of the history property"; break; // //--- Global_Variables // case ERR_GLOBALVARIABLE_NOT_FOUND: result = "Global variable of the client terminal is not found"; break; // case ERR_GLOBALVARIABLE_EXISTS: result = "Global variable of the client terminal with the same name already exists"; break; // case ERR_MAIL_SEND_FAILED: result = "Email sending failed"; break; // case ERR_PLAY_SOUND_FAILED: result = "Sound playing failed"; break; // case ERR_MQL5_WRONG_PROPERTY: result = "Wrong identifier of the program property"; break; // case ERR_TERMINAL_WRONG_PROPERTY: result = "Wrong identifier of the terminal property"; break; // case ERR_FTP_SEND_FAILED: result = "File sending via ftp failed"; break; // case ERR_NOTIFICATION_SEND_FAILED: result = "Error in sending notification"; break; // //--- Custom Indicator Buffers // case ERR_BUFFERS_NO_MEMORY: result = "Not enough memory for the distribution of indicator buffers"; break; // case ERR_BUFFERS_WRONG_INDEX: result = "Wrong indicator buffer index"; break; // //--- Custom Indicator Properties // case ERR_CUSTOM_WRONG_PROPERTY: result = "Wrong ID of the custom indicator property"; break; // //--- Account // case ERR_ACCOUNT_WRONG_PROPERTY: result = "Wrong account property ID"; break; // case ERR_TRADE_WRONG_PROPERTY: result = "Wrong trade property ID"; break; // case ERR_TRADE_DISABLED: result = "Trading by Expert Advisors prohibited"; break; // case ERR_TRADE_POSITION_NOT_FOUND: result = "Position not found"; break; // case ERR_TRADE_ORDER_NOT_FOUND: result = "Order not found"; break; // case ERR_TRADE_DEAL_NOT_FOUND: result = "Deal not found"; break; // case ERR_TRADE_SEND_FAILED: result = "Trade request sending failed"; break; // //--- Indicators // case ERR_INDICATOR_UNKNOWN_SYMBOL: result = "Unknown symbol"; break; // case ERR_INDICATOR_CANNOT_CREATE: result = "Indicator cannot be created"; break; // case ERR_INDICATOR_NO_MEMORY: result = "Not enough memory to add the indicator"; break; // case ERR_INDICATOR_CANNOT_APPLY: result = "The indicator cannot be applied to another indicator"; break; // case ERR_INDICATOR_CANNOT_ADD: result = "Error applying an indicator to chart"; break; // case ERR_INDICATOR_DATA_NOT_FOUND: result = "Requested data not found"; break; // case ERR_INDICATOR_WRONG_HANDLE: result = "Wrong indicator handle"; break; // case ERR_INDICATOR_WRONG_PARAMETERS: result = "Wrong number of parameters when creating an indicator"; break; // case ERR_INDICATOR_PARAMETERS_MISSING: result = "No parameters when creating an indicator"; break; // case ERR_INDICATOR_CUSTOM_NAME: result = "The first parameter in the array must be the name of the custom indicator"; break; // case ERR_INDICATOR_PARAMETER_TYPE: result = "Invalid parameter type in the array when creating an indicator"; break; // case ERR_INDICATOR_WRONG_INDEX: result = "Wrong index of the requested indicator buffer"; break; // //--- Depth of Market // case ERR_BOOKS_CANNOT_ADD: result = "Depth Of Market can not be added"; break; // case ERR_BOOKS_CANNOT_DELETE: result = "Depth Of Market can not be removed"; break; // case ERR_BOOKS_CANNOT_GET: result = "The data from Depth Of Market can not be obtained"; break; // case ERR_BOOKS_CANNOT_SUBSCRIBE: result = "Error in subscribing to receive new data from Depth Of Market"; break; // //--- File Operations // case ERR_TOO_MANY_FILES: result = "More than 64 files cannot be opened at the same time"; break; // case ERR_WRONG_FILENAME: result = "Invalid file name"; break; // case ERR_TOO_LONG_FILENAME: result = "Too long file name"; break; // case ERR_CANNOT_OPEN_FILE: result = "File opening error"; break; // case ERR_FILE_CACHEBUFFER_ERROR: result = "Not enough memory for cache to read"; break; // case ERR_CANNOT_DELETE_FILE: result = "File deleting error"; break; // case ERR_INVALID_FILEHANDLE: result = "A file with this handle was closed, or was not opening at all"; break; // case ERR_WRONG_FILEHANDLE: result = "Wrong file handle"; break; // case ERR_FILE_NOTTOWRITE: result = "The file must be opened for writing"; break; // case ERR_FILE_NOTTOREAD: result = "The file must be opened for reading"; break; // case ERR_FILE_NOTBIN: result = "The file must be opened as a binary one"; break; // case ERR_FILE_NOTTXT: result = "The file must be opened as a text"; break; // case ERR_FILE_NOTTXTORCSV: result = "The file must be opened as a text or CSV"; break; // case ERR_FILE_NOTCSV: result = "The file must be opened as CSV"; break; // case ERR_FILE_READERROR: result = "File reading error"; break; // case ERR_FILE_BINSTRINGSIZE: result = "String size must be specified, because the file is opened as binary"; break; // case ERR_INCOMPATIBLE_FILE: result = "A text file must be for string arrays, for other arrays - binary"; break; // case ERR_FILE_IS_DIRECTORY: result = "This is not a file, this is a directory"; break; // case ERR_FILE_NOT_EXIST: result = "File does not exist"; break; // case ERR_FILE_CANNOT_REWRITE: result = "File can not be rewritten"; break; // case ERR_WRONG_DIRECTORYNAME: result = "Wrong directory name"; break; // case ERR_DIRECTORY_NOT_EXIST: result = "Directory does not exist"; break; // case ERR_FILE_ISNOT_DIRECTORY: result = "This is a file, not a directory"; break; // case ERR_CANNOT_DELETE_DIRECTORY: result = "The directory cannot be removed"; break; // case ERR_CANNOT_CLEAN_DIRECTORY: result = "Failed to clear the directory (probably one or more files are blocked and removal operation failed)"; break; // case ERR_FILE_WRITEERROR: result = "Failed to write a resource to a file"; break; // //--- String Casting // case ERR_NO_STRING_DATE: result = "No date in the string"; break; // case ERR_WRONG_STRING_DATE: result = "Wrong date in the string"; break; // case ERR_WRONG_STRING_TIME: result = "Wrong time in the string"; break; // case ERR_STRING_TIME_ERROR: result = "Error converting string to date"; break; // case ERR_STRING_OUT_OF_MEMORY: result = "Not enough memory for the string"; break; // case ERR_STRING_SMALL_LEN: result = "The string length is less than expected"; break; // case ERR_STRING_TOO_BIGNUMBER: result = "Too large number, more than ULONG_MAX"; break; // case ERR_WRONG_FORMATSTRING: result = "Invalid format string"; break; // case ERR_TOO_MANY_FORMATTERS: result = "Amount of format specifiers more than the parameters"; break; // case ERR_TOO_MANY_PARAMETERS: result = "Amount of parameters more than the format specifiers"; break; // case ERR_WRONG_STRING_PARAMETER: result = "Damaged parameter of string type"; break; // case ERR_STRINGPOS_OUTOFRANGE: result = "Position outside the string"; break; // case ERR_STRING_ZEROADDED: result = "0 added to the string end, a useless operation"; break; // case ERR_STRING_UNKNOWNTYPE: result = "Unknown data type when converting to a string"; break; // case ERR_WRONG_STRING_OBJECT: result = "Damaged string object"; break; // //--- Operations with Arrays // case ERR_INCOMPATIBLE_ARRAYS: result = "Copying incompatible arrays. String array can be copied only to a string array, and a numeric array - in numeric array only"; break; // case ERR_SMALL_ASSERIES_ARRAY: result = "The receiving array is declared as AS_SERIES, and it is of insufficient size"; break; // case ERR_SMALL_ARRAY: result = "Too small array, the starting position is outside the array"; break; // case ERR_ZEROSIZE_ARRAY: result = "An array of zero length"; break; // case ERR_NUMBER_ARRAYS_ONLY: result = "Must be a numeric array"; break; // case ERR_ONEDIM_ARRAYS_ONLY: result = "Must be a one-dimensional array"; break; // case ERR_SERIES_ARRAY: result = "Timeseries cannot be used"; break; // case ERR_DOUBLE_ARRAY_ONLY: result = "Must be an array of type double"; break; // case ERR_FLOAT_ARRAY_ONLY: result = "Must be an array of type float"; break; // case ERR_LONG_ARRAY_ONLY: result = "Must be an array of type long"; break; // case ERR_INT_ARRAY_ONLY: result = "Must be an array of type int"; break; // case ERR_SHORT_ARRAY_ONLY: result = "Must be an array of type short"; break; // case ERR_CHAR_ARRAY_ONLY: result = "Must be an array of type char"; break; // //--- Operations with OpenCL // case ERR_OPENCL_NOT_SUPPORTED: result = "OpenCL functions are not supported on this computer"; break; // case ERR_OPENCL_INTERNAL: result = "Internal error occurred when running OpenCL"; break; // case ERR_OPENCL_INVALID_HANDLE: result = "Invalid OpenCL handle"; break; // case ERR_OPENCL_CONTEXT_CREATE: result = "Error creating the OpenCL context"; break; // case ERR_OPENCL_QUEUE_CREATE: result = "Failed to create a run queue in OpenCL"; break; // case ERR_OPENCL_PROGRAM_CREATE: result = "Error occurred when compiling an OpenCL program"; break; // case ERR_OPENCL_TOO_LONG_KERNEL_NAME: result = "Too long kernel name (OpenCL kernel)"; break; // case ERR_OPENCL_KERNEL_CREATE: result = "Error creating an OpenCL kernel"; break; // case ERR_OPENCL_SET_KERNEL_PARAMETER: result = "Error occurred when setting parameters for the OpenCL kernel"; break; // case ERR_OPENCL_EXECUTE: result = "OpenCL program runtime error"; break; // case ERR_OPENCL_WRONG_BUFFER_SIZE: result = "Invalid size of the OpenCL buffer"; break; // case ERR_OPENCL_WRONG_BUFFER_OFFSET: result = "Invalid offset in the OpenCL buffer"; break; // case ERR_OPENCL_BUFFER_CREATE: result = "Failed to create and OpenCL buffer"; break; // //--- User-Defined Errors default: result = "UNKNOWN Erro ..."; break; } // return result; } // // Retrieve Specified Error Code Description ... string GetTradeServerReturnCodeDescription(int return_code) { // string result = ""; // switch (return_code) { // case TRADE_RETCODE_REQUOTE: result = "Requote"; break; // case TRADE_RETCODE_REJECT: result = "Request rejected"; break; // case TRADE_RETCODE_CANCEL: result = "Request canceled by trader"; break; // case TRADE_RETCODE_PLACED: result = "Order placed"; break; // case TRADE_RETCODE_DONE: result = "Request completed"; break; // case TRADE_RETCODE_DONE_PARTIAL: result = "Only part of the request was completed"; break; // case TRADE_RETCODE_ERROR: result = "Request processing error"; break; // case TRADE_RETCODE_TIMEOUT: result = "Request canceled by timeout"; break; // case TRADE_RETCODE_INVALID: result = "Invalid request"; break; // case TRADE_RETCODE_INVALID_VOLUME: result = "Invalid volume in the request"; break; // case TRADE_RETCODE_INVALID_PRICE: result = "Invalid price in the request"; break; // case TRADE_RETCODE_INVALID_STOPS: result = "Invalid stops in the request"; break; // case TRADE_RETCODE_TRADE_DISABLED: result = "Trade is disabled"; break; // case TRADE_RETCODE_MARKET_CLOSED: result = "Market is closed"; break; // case TRADE_RETCODE_NO_MONEY: result = "There is not enough money to complete the request"; break; // case TRADE_RETCODE_PRICE_CHANGED: result = "Prices changed"; break; // case TRADE_RETCODE_PRICE_OFF: result = "There are no quotes to process the request"; break; // case TRADE_RETCODE_INVALID_EXPIRATION: result = "Invalid order expiration date in the request"; break; // case TRADE_RETCODE_ORDER_CHANGED: result = "Order state changed"; break; // case TRADE_RETCODE_TOO_MANY_REQUESTS: result = "Too frequent requests"; break; // case TRADE_RETCODE_NO_CHANGES: result = "No changes in request"; break; // case TRADE_RETCODE_SERVER_DISABLES_AT: result = "Autotrading disabled by server"; break; // case TRADE_RETCODE_CLIENT_DISABLES_AT: result = "Autotrading disabled by client terminal"; break; // case TRADE_RETCODE_LOCKED: result = "Request locked for processing"; break; // case TRADE_RETCODE_FROZEN: result = "Order or position frozen"; break; // case TRADE_RETCODE_INVALID_FILL: result = "Invalid order filling type"; break; // case TRADE_RETCODE_CONNECTION: result = "No connection with the trade server"; break; // case TRADE_RETCODE_ONLY_REAL: result = "Operation is allowed only for live accounts"; break; // case TRADE_RETCODE_LIMIT_ORDERS: result = "The number of pending orders has reached the limit"; break; // case TRADE_RETCODE_LIMIT_VOLUME: result = "The volume of orders and positions for the symbol has reached the limit"; break; // default: result = "Invalid return code of the trade server"; break; } // return result; } // // Protected ... protected: // // Private ... // bool CanLog() { return mLogAlerts; } // bool CanLogAlert() { // bool result = GetEnableAlerts() && GetLogAlerts(); // return result; } // bool CanTerminalAlert() { // bool result = GetEnableAlerts() && GetTerminalAlerts(); // return result; } // bool CanMailAlert() { // bool result = GetEnableAlerts() && GetMailAlerts(); // return result; } // bool CanPushAlert() { // bool result = GetEnableAlerts() && GetPushAlerts(); // return result; } private: // // Props ... string mPrefix; // Alerts Prefixe bool mEnableAlerts; // Enable Alerts bool mLogAlerts; // Log Alerts bool mTerminalAlerts; // Terminal Alerts bool mMailAlerts; // Mail Alerts bool mPushAlerts; // Push Alerts // // Tools ... // // Clear Escape String and // Attach Alert Prefix to Message ... string PrepareMessage(string message) { // StringReplace(message, "\n", " | "); // StringConcatenate(message, GetPrefix(), " > ", message); // return message; } }; // // a Base Class by Support Alert ... class XSCBaseAlert : public XSCBase { // // Public ... public: // // Props ... // // Constructor(s) ... void XSCBaseAlert() { // // Instance Alert ... mAlert = new XSCAlert(); } // // Deconstructors ... void ~XSCBaseAlert() { // delete mAlert; } // // Alert Handler Functions ... // // Alert Functions Getter(s) / Setters(s) ... // string GetAlertPrefix() { return mAlert.GetPrefix(); } // void SetAlertPrefix(string value) { mAlert.SetPrefix(value); } // bool GetAlertLogAlerts() { return mAlert.GetLogAlerts(); } // void SetAlertLogAlerts(bool value) { mAlert.SetLogAlerts(value); } // bool GetAlertEnableAlerts() { return mAlert.GetEnableAlerts(); } // void SetAlertEnableAlerts(bool value) { mAlert.SetEnableAlerts(value); } // bool GetAlertPushAlerts() { return mAlert.GetPushAlerts(); } // void SetAlertPushAlerts(bool value) { mAlert.SetPushAlerts(value); } // bool GetAlertMailAlerts() { return mAlert.GetMailAlerts(); } // void SetAlertMailAlerts(bool value) { mAlert.SetMailAlerts(value); } // bool GetAlertTerminalAlerts() { return mAlert.GetTerminalAlerts(); } // void SetAlertTerminalAlerts(bool value) { mAlert.SetTerminalAlerts(value); } // // Alert Actions ... // // Logging an Alert ... void LogAlert(string message) { mAlert.LogAlert(message); } // // Terminal Alert ... void TerminalAlert(string message) { mAlert.TerminalAlert(message); } // // Mail Alert ... void MailAlert(string message) { mAlert.MailAlert(message); } // // Send Push Notification ... void PushAlert(string message) { mAlert.PushAlert(message); } // // Send an Alert by Handling all Different Specified // type's of Alert's if they are Enabled ... void Alert(string message) { mAlert.Alert(message); } // // Logs ... // // Log a Message ... void Log(string message) { mAlert.Log(message); } void Log(string tag, string message) { mAlert.Log(tag, message); } void LogEmpty() { mAlert.LogEmpty(); } // // Log Specific Array ... template void LogArray( T &array[], // Array to Log string label = NULL // Array Label ) { mAlert.LogArray(array, label); } // // Error ... // // Log an Error ... void LogError( int error = -1 // Specific Error, if it's equal to -1, use Last Error ... ) { mAlert.LogError(error); } // // Retrieve Specified Error Code Description ... string GetErrorDescription(int err_code) { return mAlert.GetErrorDescription(err_code); } // // Retrieve Specified Error Code Description ... string GetTradeServerReturnCodeDescription(int return_code) { return mAlert.GetTradeServerReturnCodeDescription(return_code); } // // Protected ... protected: // // Alert ... XSCAlert *mAlert; // // Private ... private: }; //