/**
 * 版权所有(C)2012-2016, 大连飞创信息技术有限公司
 * 文件名称：DFITCMdApi.h
 * 文件说明：定义XSpeed行情API接口
 * 当前版本：1.0.14.45
 * 作者：XSpeed项目组
 * 发布日期：2015年5月6日
 */

#ifndef DLMDAPI_H_
#define DLMDAPI_H_


#include "DFITCApiStruct.h"


#ifdef WIN32
    #ifdef DFITCAPI_EXPORTS
        #define MDAPI_API __declspec(dllexport)
    #else
        #define MDAPI_API __declspec(dllimport)
    #endif//DFITCAPI_EXPORTS
#else
    #define MDAPI_API 
#endif//WIN32

namespace DFITCXSPEEDMDAPI
{
    class DFITCMdSpi
    {
    public:
        DFITCMdSpi(){}

        /** 
         * 网络连接正常响应
         */
        virtual void OnFrontConnected(){};

        /**
         * 网络连接不正常响应
         */
        virtual void OnFrontDisconnected(int nReason){};

        /**
         * 登陆请求响应:当用户发出登录请求后，前置机返回响应时此方法会被调用，通知用户登录是否成功。
         * @param pRspUserLogin:用户登录信息结构地址。
         * @param pRspInfo:若请求失败，返回错误信息地址，该结构含有错误信息。
         */
        virtual void OnRspUserLogin(struct DFITCUserLoginInfoRtnField * pRspUserLogin, struct DFITCErrorRtnField * pRspInfo) {}

        /**
         * 登出请求响应:当用户发出退出请求后，前置机返回响应此方法会被调用，通知用户退出状态。
         * @param pRspUsrLogout:返回用户退出信息结构地址。
         * @param pRspInfo:若请求失败，返回错误信息地址。
         */
        virtual void OnRspUserLogout(struct DFITCUserLogoutInfoRtnField * pRspUsrLogout, struct DFITCErrorRtnField * pRspInfo) {}

        /**
         * 错误应答
         * @param pRspInfo:错误信息地址。
         */
        virtual void OnRspError(struct DFITCErrorRtnField *pRspInfo) {}

        /**
         * 行情订阅应答:当用户发出行情订阅该方法会被调用。
         * @param pSpecificInstrument:指向合约响应结构，该结构包含合约的相关信息。
         * @param pRspInfo:错误信息，如果发生错误，该结构含有错误信息。
         */
        virtual void OnRspSubMarketData(struct DFITCSpecificInstrumentField * pSpecificInstrument, struct DFITCErrorRtnField * pRspInfo) {}

        /**
         * 取消订阅行情应答:当用户发出退订请求后该方法会被调用。
         * @param pSpecificInstrument:指向合约响应结构，该结构包含合约的相关信息。
         * @param pRspInfo:错误信息，如果发生错误，该结构含有错误信息。
         */
        virtual void OnRspUnSubMarketData(struct DFITCSpecificInstrumentField * pSpecificInstrument, struct DFITCErrorRtnField * pRspInfo) {}

        /**
         * 订阅询价应答
         * @param pSpecificInstrument:指向合约响应结构，该结构包含合约的相关信息。
         * @param pRspInfo:错误信息，如果发生错误，该结构含有错误信息。
         */
        virtual void OnRspSubForQuoteRsp(struct DFITCSpecificInstrumentField * pSpecificInstrument, struct DFITCErrorRtnField * pRspInfo) {}

        /**
         * 取消订阅询价应答
         * @param pSpecificInstrument:指向合约响应结构，该结构包含合约的相关信息。
         * @param pRspInfo:错误信息，如果发生错误，该结构含有错误信息。
         */
        virtual void OnRspUnSubForQuoteRsp(struct DFITCSpecificInstrumentField * pSpecificInstrument, struct DFITCErrorRtnField * pRspInfo) {}

        /**
         * 行情消息应答:如果订阅行情成功且有行情返回时，该方法会被调用。
         * @param pMarketDataField:指向行情信息结构的指针，结构体中包含具体的行情信息。
         */
        virtual void OnMarketData(struct DFITCDepthMarketDataField * pMarketDataField) {}

        /**
         * 自定义组合行情消息应答:如果订阅行情成功且有行情返回时，该方法会被调用。
         * @param pMarketDataField:指向行情信息结构的指针，结构体中包含具体的行情信息。
         */
        virtual void OnCustomMarketData(struct DFITCCustomMarketDataField * pMarketDataField) {}

        /**
         * 询价通知
         * @param pForQuoteField:指向询价信息结构的指针，结构体中包含具体的询价信息。
         */
        virtual void OnRtnForQuoteRsp(struct DFITCQuoteSubscribeRtnField * pForQuoteField) {}

        /**
         * 交易日确认响应:用于接收交易日信息。
         * @param pTradingDayRtnData: 返回交易日请求确认响应结构的地址。
         */
        virtual void OnRspTradingDay(struct DFITCTradingDayRtnField * pTradingDayRtnData){};
    };//end of DFITCMdSpi

    class MDAPI_API DFITCMdApi
    {
    public:
        /**
         * 创建行情API实例
         * @return 创建出的UserApi
         */
        static DFITCMdApi * CreateDFITCMdApi();

        /**
         * 进行一系列初始化工作:注册回调函数接口,连接行情前置。
         * @param pszSvrAddr:行情前置网络地址。
         *                  网络地址的格式为:"protocol://ipaddress:port",如"tcp://127.0.0.1:10915"
         *                  其中protocol的值为tcp,udp,udpb(广播行情),表示接收行情的方式;如果是udp接收行情数据,udp的端口将由API自行确定，
		 *                  如果是udpb广播行情，需要与期货公司确认报盘广播行情端口。
         *                  ipaddress表示行情前置的IP,port表示行情前置的端口
         * @param pSpi:类DFITCMdSpi对象实例
         * @return 0 - 成功; -1 - 失败。
         */
        virtual int Init(char * pszSvrAddr, DFITCMdSpi * pSpi) = 0;

        /**
         * 删除接口对象本身，不再使用本接口对象时,调用该函数删除接口对象。
         */
        virtual void Release() = 0;

        /**
         * 订阅行情:该方法发出订阅某个或者某些合约行情请求。
         * @param ppInstrumentID[]:指针数组，每个指针指向一个合约。（*代表订阅所有合约，也可订阅某交易所所有合约如DCE）
         * @param nCount:合约个数
         * @return 0 - 请求发送成功; -1 - 请求发送失败。
         */
        virtual int SubscribeMarketData(char * ppInstrumentID[], int nCount, int nRequestID) = 0;

        /**
         * 退订行情:该方法发出退订某个/某些合约行情请求。
         * @param ppInstrumentID[]:指针数组，每个指针指向一个合约。（*代表订阅退订所有合约，也可退订某交易所所有合约如DCE）
         * @param nCount:合约个数
         * @return 0 - 请求发送成功; -1 - 请求发送失败
         */
        virtual int UnSubscribeMarketData(char * ppInstrumentID[], int nCount, int nRequestID) = 0;

        /**
         * 订阅询价
         * @param ppInstrumentID[]:指针数组，每个指针指向一个合约。（*代表订阅所有询价，也可订阅某交易所所有询价如DCE）
         * @param nCount:合约个数
         * @return 0 - 请求发送成功; -1 - 请求发送失败
         */
        virtual int SubscribeForQuoteRsp(char * ppInstrumentID[], int nCount, int nRequestID) = 0;

       /**
         * 退订询价
         * @param ppInstrumentID[]:指针数组，每个指针指向一个合约。（*代表订阅退订所有询价，也可退订某交易所所有询价如DCE）
         * @param nCount:合约个数
         * @return 0 - 请求发送成功; -1 - 请求发送失败
         */
        virtual int UnSubscribeForQuoteRsp(char * ppInstrumentID[], int nCount, int nRequestID) = 0;

        /**
         * 用户发出登陆请求
         * @param pReqUserLoginField:指向用户登录请求结构的地址。
         * @return 0 - 请求发送成功; -1 - 请求发送失败; -2 - 检测异常。
         */ 
        virtual int ReqUserLogin(struct DFITCUserLoginField * pReqUserLoginField) = 0;

        /**
         * 用户发出登出请求
         * @param pReqUserLogoutField:指向用户登录请出结构的地址。
         * @return 0 - 请求发送成功; -1 - 请求发送失败; -2 - 检测异常。
         */ 
        virtual int ReqUserLogout(struct DFITCUserLogoutField * pReqUserLogoutField) = 0;

        /**
         * 交易日查询请求
         * @return 0 - 请求发送成功; -1 - 请求发送失败。
         */
        virtual int ReqTradingDay(struct DFITCTradingDayField * pTradingDay) = 0;

    protected:
        virtual ~DFITCMdApi() = 0;

    };//end of MDAPI_API
} //end of namespace

#endif//DLMDAPI_H_
