【QuickFIX】02 ログイン時にPassword(554)を送信

＜前 [【QuickFIX】01 サンプルのコンパイル](https://qiita.com/nobu-maple/items/051188f21efc59429808)
次＞ [【QuickFIX】03 送受信ログをMySQLに保存](https://qiita.com/nobu-maple/items/cc943f0c1028f21161c0)


ログイン時の toAdmin メッセージにパスワード(554)を追加して送信します
パスワードは設定ファイルから取得

##クライアントソースファイル
```cpp:tradeclient.cpp
        #include "config.h"

        #include "quickfix/FileStore.h"
        #include "quickfix/SocketInitiator.h"
        #include "quickfix/SessionSettings.h"
        #include "quickfix/Log.h"
        #include "Application.h"
        #include <string>
        #include <iostream>
        #include <fstream>

        #include "../../src/getopt-repl.h"

        int main( int argc, char** argv )
        {
          if ( argc != 2 )
          {
            std::cout << "usage: " << argv[ 0 ]
            << " FILE." << std::endl;
            return 0;
          }
          std::string file = argv[ 1 ];

          try
          {
            FIX::SessionSettings settings( file );

★          Application application( settings );
            FIX::FileStoreFactory storeFactory( settings );
            FIX::ScreenLogFactory logFactory( settings );
            FIX::SocketInitiator initiator( application, storeFactory, settings, logFactory );

            initiator.start();
            application.run();
            initiator.stop();

            return 0;
          }
          catch ( std::exception & e )
          {
            std::cout << e.what();
            return 1;
          }
        }

```

Application application　の引数に読み込んだ設定情報（settings）を追加
他、余分なところはバッサリ削除


##Applicationヘッダーファイル
```cpp:Application.h
        #ifndef TRADECLIENT_APPLICATION_H
        #define TRADECLIENT_APPLICATION_H

        #include "quickfix/Application.h"
        #include "quickfix/MessageCracker.h"
        #include "quickfix/Values.h"
        #include "quickfix/Mutex.h"

        #include <queue>

        class Application :
              public FIX::Application,
              public FIX::MessageCracker
        {
        public:
★        Application( const FIX::SessionSettings& settings )
★          : m_settings( settings ) {}

          void run();

        private:
★        FIX::SessionSettings m_settings;

          void onCreate( const FIX::SessionID& ) {}
          void onLogon( const FIX::SessionID& sessionID );
          void onLogout( const FIX::SessionID& sessionID );
★        void toAdmin( FIX::Message&, const FIX::SessionID& );
          void toApp( FIX::Message&, const FIX::SessionID& )
          throw( FIX::DoNotSend );
          void fromAdmin( const FIX::Message&, const FIX::SessionID& )
          throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::RejectLogon ) {}
          void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
          throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType );

        };

        #endif

```

設定情報を受け取れるように変更
あとはパスワードを送信するための toAdminの実体書くために {} を削除しました
んで、不要部分はバッサリ削除


##Applicationソースファイル
```cpp:Application.cpp
        #include "config.h"

        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>

        void Application::onLogon( const FIX::SessionID& sessionID )
        {
          std::cout << std::endl << "Logon - " << sessionID << std::endl;
        }

        void Application::onLogout( const FIX::SessionID& sessionID )
        {
          std::cout << std::endl << "Logout - " << sessionID << std::endl;
        }

        void Application::fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
        throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType )
        {
          crack( message, sessionID );
          std::cout << std::endl << "IN: " << message << std::endl;
        }

★      void Application::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID )
★      {
★        if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
★        {
★          const FIX::Dictionary& dic = m_settings.get( sessionID );
★          if (dic.has("Password"))
★            message.getHeader().setField(FIX::Password(dic.getString("Password")));
★        }
★      }

        void Application::toApp( FIX::Message& message, const FIX::SessionID& sessionID )
        throw( FIX::DoNotSend )
        {
          try
          {
            FIX::PossDupFlag possDupFlag;
            message.getHeader().getField( possDupFlag );
            if ( possDupFlag ) throw FIX::DoNotSend();
          }
          catch ( FIX::FieldNotFound& ) {}

          std::cout << std::endl
          << "OUT: " << message << std::endl;
        }

        void Application::run()
        {
          while ( true )
          {
            try
            {
★            std::string action;
★            std::cout << std::endl
★              << "quit) Quit" << std::endl
★              << "Action: ";
★            std::cin >> action;
★
★            if ( action == "quit" )
★              break;
            }
            catch ( std::exception & e )
            {
              std::cout << "Message Not Sent: " << e.what();
            }
          }
        }

```

toAdmin の実体を追記
パスワードは設定ファイルから取り出して送信メッセージに含めるようにしてます
ついでに不要部分をバッサリ削除して、削除した影響で ｒｕｎ の中身も変えてます


##コンパイル
```
tradeclient]$ make clean
tradeclient]$ make 
```

エラーが出ないこと
正常にコンパイルできること


##設定ファイルにユーザとパスワードを設定
レート情報取得用のユーザと、発注やら口座情報取得やらの取引用のユーザをそれぞれ追加しときます


```bash:tradeclient.cfg
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=60
FileStorePath=store
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=FIX44.xml
HttpAcceptPort=9911

ValidateUserDefinedFields=N
ResetOnLogout=Y
ResetOnLogon=Y

[SESSION]
BeginString=FIX.4.4
SenderCompID=CAXDemo_Account_Trd
TargetCompID=CNX
SocketConnectHost=127.0.0.1
SocketConnectPort=9999
HeartBtInt=30
Password=Pass1234
SessionType=Trade

[SESSION]
BeginString=FIX.4.4
SenderCompID=CAXDemo_Account_Str
TargetCompID=CNX
SocketConnectHost=127.0.0.1
SocketConnectPort=9999
HeartBtInt=30
Password=Pass1234
SessionType=Ratefeed
```


##vimの着色
余談ですがvimで開発するときの着色設定
使える設定ファイルの確認

```
$ ls  /usr/share/vim/vim74/colors/
README.txt  darkblue.vim  delek.vim   elflord.vim  koehler.vim  murphy.vim  peachpuff.vim  shine.vim  torte.vim
blue.vim    default.vim   desert.vim  evening.vim  morning.vim  pablo.vim   ron.vim        slate.vim  zellner.vim
```

環境によって違うと思います
これを利用する設定

```bash:~/.vimrc
:colorscheme delek
```


＜前 [【QuickFIX】01 サンプルのコンパイル](https://qiita.com/nobu-maple/items/051188f21efc59429808)
次＞ [【QuickFIX】03 送受信ログをMySQLに保存](https://qiita.com/nobu-maple/items/cc943f0c1028f21161c0)

---
# 一覧
[01 サンプルのコンパイル](https://qiita.com/nobu-maple/items/051188f21efc59429808)
[02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)
[03 送受信ログをMySQLに保存](https://qiita.com/nobu-maple/items/cc943f0c1028f21161c0)
[04 情報保存用にMySQLコネクションを保持..他](https://qiita.com/nobu-maple/items/cfe505ad984e16d46af9)
[05 各種メッセージの枠を作成](https://qiita.com/nobu-maple/items/770d8da8c50c4f5a5a54)
[06 独自メッセージ仕様](https://qiita.com/nobu-maple/items/580815f3c304d96bde31)
[07 セッション開始 <h> TradingSessionStatus](https://qiita.com/nobu-maple/items/98369bad8351cb662740)
[08 通貨ペア要求 <x> SecurityListRequest](https://qiita.com/nobu-maple/items/ba0fb7175c378bc4c608)
[09 通貨ペア取得 <y> SecurityList](https://qiita.com/nobu-maple/items/66feda02d9a717bd31b9)
[10 デモ環境サーバへ接続](https://qiita.com/nobu-maple/items/52de92892a03f59c7368)
[11 ログ出力設定](https://qiita.com/nobu-maple/items/828d3859ebf2ab2237f8)
[12 マーケット情報要求 < V > MarketDataRequest](https://qiita.com/nobu-maple/items/1c4f2d27cabde8eff713)
[13 マーケット情報受信 < X > MarketDataIncrementalRefresh](https://qiita.com/nobu-maple/items/eb7855841000eb2b0f04)
[14 口座情報要求 < AN > RequestForPositions](https://qiita.com/nobu-maple/items/30c286f8dbf1e9b0e173)
[15 口座情報取得 < AZ > CollateralResponse](https://qiita.com/nobu-maple/items/a16e3c787ef5e83f3971)

---