class Api
{
public:
        enum ServerType
        {
                SERVER_REAL = \'0\',
                SERVER_TEST = \'1\',
        };

        enum Code
        {
                CODE_COMPLETE = 0,
                CODE_ID_ERROR,
                CODE_PASSWORD_ERROR,
        };

        Api();
        ~Api();

        /**
         * 블로킹 함수
         * Api를 시작한다.
         */
        Code Start(const CString& id, const CString& password, const CString& officialPassword, ServerType serverType);

        /**
         * 논블로킹 함수
         * 계좌리스트를 조회하고 결과를 Callback받습니다.
         * Callback은 다른 스레드에서 실행됩니다.
         */
        Code CallbackAccountList(IAccountListHandler* accountListHandler);

        /**
         * 블로킹 함수
         * 계좌리스트를 가져옵니다.
         */
        Code GetAccountList(CStringList* accountList);

        /**
         * 논블로킹 함수
         * 조회하고 결과를 Callback받습니다.
         * Callback은 다른 스레드에서 실행됩니다.
         */
        Code CallbackQuery(const QueryData& queryData, IQueryHandler* quertyHandler);

        /**
         * 블로킹 함수
         * 조회합니다.
         */
        Code BlockingQuery(const QueryData& queryData, CMapStrToStrPtr* resultData);

        /**
         * 논블로킹 함수
         * 실시간 체결데이터의 Callback을 등록합니다.
         * Callback은 다른 스레드에서 실행됩니다.
         */
        Code RegisterToCallbackContractData(IContractHandler* contractHandler);

        /**
         * 논블로킹 함수
         * 실시간 옵션시세의 Callback을 등록합니다.
         * Callback은 다른 스레드에서 실행됩니다.
         */
        Code RegisterToCallbackOptionPrice(const CString& code, IOptionPriceHandler* optionPriceHandler);

        /**
         * 논블로킹 함수
         * 실시간 선물시세의 Callback을 등록합니다.
         * Callback은 다른 스레드에서 실행됩니다.
         */
        Code RegisterToCallbackFuturePrice(const CString& code, IFuturePriceHandler* futurePriceHandler);
};