From 7fea5645e2e9da312d2b02a1e22087f4b9aba1ce Mon Sep 17 00:00:00 2001
From: Neozaru <neozaru@mailoo.org>
Date: Wed, 4 Jun 2014 22:50:13 +0200
Subject: [PATCH 1/2] 'getinfo' daemon HTTP-RPC returns 'target_height' for
 progress estimations

---
 src/cryptonote_core/cryptonote_core.cpp                | 10 +++++++++-
 src/cryptonote_core/cryptonote_core.h                  |  5 +++++
 .../cryptonote_protocol_handler.inl                    |  5 +++++
 src/rpc/core_rpc_server.cpp                            |  1 +
 src/rpc/core_rpc_server_commands_defs.h                |  2 ++
 tests/core_proxy/core_proxy.h                          |  1 +
 6 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp
index b6bfa09c8..b2389fce2 100644
--- a/src/cryptonote_core/cryptonote_core.cpp
+++ b/src/cryptonote_core/cryptonote_core.cpp
@@ -28,7 +28,8 @@ namespace cryptonote
               m_blockchain_storage(m_mempool),
               m_miner(this),
               m_miner_address(boost::value_initialized<account_public_address>()), 
-              m_starter_message_showed(false)
+              m_starter_message_showed(false),
+              m_target_blockchain_height(0)
   {
     set_cryptonote_protocol(pprotocol);
   }
@@ -516,4 +517,11 @@ namespace cryptonote
     return true;
   }
   //-----------------------------------------------------------------------------------------------
+  void core::set_target_blockchain_height(uint64_t target_blockchain_height) {
+    m_target_blockchain_height = target_blockchain_height;
+  }
+  //-----------------------------------------------------------------------------------------------
+  uint64_t core::get_target_blockchain_height() const {
+    return m_target_blockchain_height;
+  }
 }
diff --git a/src/cryptonote_core/cryptonote_core.h b/src/cryptonote_core/cryptonote_core.h
index cde52d5a2..7ef0f8b1d 100644
--- a/src/cryptonote_core/cryptonote_core.h
+++ b/src/cryptonote_core/cryptonote_core.h
@@ -90,6 +90,9 @@ namespace cryptonote
      void print_blockchain_outs(const std::string& file);
      void on_synchronized();
 
+     void set_target_blockchain_height(uint64_t target_blockchain_height);
+     uint64_t get_target_blockchain_height() const;
+
    private:
      bool add_new_tx(const transaction& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prefix_hash, size_t blob_size, tx_verification_context& tvc, bool keeped_by_block);
      bool add_new_tx(const transaction& tx, tx_verification_context& tvc, bool keeped_by_block);
@@ -124,6 +127,8 @@ namespace cryptonote
      epee::math_helper::once_a_time_seconds<60*60*12, false> m_store_blockchain_interval;
      friend class tx_validate_inputs;
      std::atomic<bool> m_starter_message_showed;
+
+     uint64_t m_target_blockchain_height;
    };
 }
 
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
index 2584f1097..b74a81586 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
@@ -108,6 +108,11 @@ namespace cryptonote
       return true;
     }
 
+    /* As I don't know if accessing hshd from core could be a good practice, 
+    I prefer pushing target height to the core at the same time it is pushed to the user.
+    Nz. */
+    m_core.set_target_blockchain_height(hshd.current_height);
+    
     int64_t diff = static_cast<int64_t>(hshd.current_height) - static_cast<int64_t>(m_core.get_current_blockchain_height());
     LOG_PRINT_CCONTEXT_YELLOW("Sync data returned unknown top block: " << m_core.get_current_blockchain_height() << " -> " << hshd.current_height
       << " [" << std::abs(diff) << " blocks (" << diff / (24 * 60 * 60 / DIFFICULTY_TARGET) << " days) "
diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp
index e4a7c9773..03af66f4f 100644
--- a/src/rpc/core_rpc_server.cpp
+++ b/src/rpc/core_rpc_server.cpp
@@ -81,6 +81,7 @@ namespace cryptonote
   {
     CHECK_CORE_BUSY();
     res.height = m_core.get_current_blockchain_height();
+    res.target_height = m_core.get_target_blockchain_height();
     res.difficulty = m_core.get_blockchain_storage().get_difficulty_for_next_block();
     res.tx_count = m_core.get_blockchain_storage().get_total_transactions() - res.height; //without coinbase
     res.tx_pool_size = m_core.get_pool_transactions_count();
diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h
index 48df16e59..6e87fb48c 100644
--- a/src/rpc/core_rpc_server_commands_defs.h
+++ b/src/rpc/core_rpc_server_commands_defs.h
@@ -214,6 +214,7 @@ namespace cryptonote
     {
       std::string status;
       uint64_t height;
+      uint64_t target_height;
       uint64_t difficulty;
       uint64_t tx_count;
       uint64_t tx_pool_size;
@@ -226,6 +227,7 @@ namespace cryptonote
       BEGIN_KV_SERIALIZE_MAP()
         KV_SERIALIZE(status)
         KV_SERIALIZE(height)
+        KV_SERIALIZE(target_height)
         KV_SERIALIZE(difficulty)
         KV_SERIALIZE(tx_count)
         KV_SERIALIZE(tx_pool_size)
diff --git a/tests/core_proxy/core_proxy.h b/tests/core_proxy/core_proxy.h
index d5be53f1d..60f0b3c2d 100644
--- a/tests/core_proxy/core_proxy.h
+++ b/tests/core_proxy/core_proxy.h
@@ -41,6 +41,7 @@ namespace tests
   public:
     void on_synchronized(){}
     uint64_t get_current_blockchain_height(){return 1;}
+    void set_target_blockchain_height(uint64_t) {}
     bool init(const boost::program_options::variables_map& vm);
     bool deinit(){return true;}
     bool get_short_chain_history(std::list<crypto::hash>& ids);

From de76efe9fe08cb649de661fe1a1211cf016cab87 Mon Sep 17 00:00:00 2001
From: Neozaru <neozaru@mailoo.org>
Date: Wed, 4 Jun 2014 23:10:33 +0200
Subject: [PATCH 2/2] Added static_cast to hshd.current_height

---
 src/cryptonote_protocol/cryptonote_protocol_handler.inl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
index b74a81586..a2f0bb3ad 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
@@ -111,7 +111,7 @@ namespace cryptonote
     /* As I don't know if accessing hshd from core could be a good practice, 
     I prefer pushing target height to the core at the same time it is pushed to the user.
     Nz. */
-    m_core.set_target_blockchain_height(hshd.current_height);
+    m_core.set_target_blockchain_height(static_cast<int64_t>(hshd.current_height));
     
     int64_t diff = static_cast<int64_t>(hshd.current_height) - static_cast<int64_t>(m_core.get_current_blockchain_height());
     LOG_PRINT_CCONTEXT_YELLOW("Sync data returned unknown top block: " << m_core.get_current_blockchain_height() << " -> " << hshd.current_height