Push
====

RS からのPush を実行するためには、SA にて各Push オペレーションに対する処理をコールバック関数の形で実装しておく必要がある。
また、SA は :c:func:`arms_pull` によってPull が正常に完了した後、 Push の待ち受け処理を開始する必要がある。

Push 待ち受け開始
------------------

================================ ==============================
API 名                           解説
================================ ==============================
:c:func:`arms_push_method_query` Push 方式の折衝を行う
:c:func:`arms_event_loop`        Push の待ちうけ処理を開始する
================================ ==============================

:c:func:`arms_push_method_query` を実行すると、RS との間でPush 方式(https-simple/https-tunnel) の折衝を行う。
この後、 :c:func:`arms_event_loop` を実行すると、折衝した方法でPush 待ちうけ処理が開始される。
この関数を実行すると、RS からのPush を受け付けるためのループ処理に入る。

Pushメッセージ処理
------------------

=============================== ===================================
API 名                          解説
=============================== ===================================
:c:func:`arms_config_cb_t`      コンフィグ設定コールバック関数
:c:func:`arms_read_config_cb_t` コンフィグ読み出しコールバック関数
:c:func:`arms_get_status_cb_t`  ステータス取得コールバック関数
:c:func:`arms_command_cb_t`     コマンド実行コールバック関数
=============================== ===================================

Push メッセージがRS から渡されると、事前に登録しておいたコールバック関数が呼ばれることになる。
SA は、指示されたメッセージに従い、コールバック関数の中で各種処理を実行する。

コンフィグ設定

RS よりコンフィグ設定メッセージがPush されると、下記の順で処理が進行する。

* libarms 内で設定メッセージ処理後に想定されるモジュール一覧を作成
* 現在動作中のモジュール一覧と比較
* 設定後に消去すべきモジュールID を用いて :c:func:`arms_config_cb_t` 呼び出し。アクションは ARMS_PUSH_REMOVE_MODULE。
* RS から渡されたコンフィグをそれぞれのID 向けに :c:func:`arms_config_cb_t` 呼び出し。アクションはARMS_PUSH_STORE_CONFIG。
* すべてコンフィグを渡し終わると、一度だけ :c:func:`arms_config_cb_t` 呼び出し。アクションは ARMS_PUSH_EXEC_STORED_CONFIG。このときid=0 となる。
* 上記すべてが成功すると、RS に対して処理完了通知
* Push できることを確認して処理完了

ARMS_PUSH_EXEC_STORED_CONFIG での呼び出しでがエラーを返した場合、あるいは処理完了通知が通信障害などで実行できなかった場合は、ロールバック処理を行う。
