From 85252fd9c8ac525c46a827b49312a850937914a4 Mon Sep 17 00:00:00 2001
From: Adrien Matta <matta@lpccaen.in2p3.fr>
Date: Mon, 25 Feb 2019 15:28:59 +0100
Subject: [PATCH] * Adding facility to pass RawTree pointer to NPSpectraServer 
  - Raw Tree could be requested via NPClientSpectra

---
 NPLib/Core/NPSpectraServer.cxx   | 15 +++++++----
 NPLib/Core/NPSpectraServer.h     |  4 +++
 NPLib/Online/NPSpectraClient.cxx | 43 ++++++++++++++++++++++++++++++--
 NPLib/Online/NPSpectraClient.h   |  1 +
 4 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/NPLib/Core/NPSpectraServer.cxx b/NPLib/Core/NPSpectraServer.cxx
index 35331733f..d97e3f1be 100644
--- a/NPLib/Core/NPSpectraServer.cxx
+++ b/NPLib/Core/NPSpectraServer.cxx
@@ -62,19 +62,18 @@ NPL::SpectraServer::SpectraServer(){
   m_Spectra = new TList;
 
   NPL::SendInformation("NPL::SpectraServer","Server started");
+  m_RawTree = NULL;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 void NPL::SpectraServer::CheckRequest(){
- /*FIXME
   if(m_Server && m_Monitor){
     m_Monitor->ResetInterrupt();
-    TSocket* s = m_Monitor->Select();
-    if(s){
+    TSocket* s = m_Monitor->Select(1);
+    if(s && s!=(TSocket*)-1){
         HandleSocket(s);
     }
   }
-  */
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -107,7 +106,7 @@ void NPL::SpectraServer::HandleSocket(TSocket* s){
     }
 
     // send requested object back
-    static TMessage answer(kMESS_OBJECT);
+    static TMessage answer(kMESS_OBJECT|kMESS_ACK);
     answer.SetCompressionLevel(1);
     answer.Reset();
     TObject* h =NULL;
@@ -125,6 +124,12 @@ void NPL::SpectraServer::HandleSocket(TSocket* s){
       answer.WriteObject(tree);
       s->Send(answer);
     }
+    
+    else if (!strcmp(request, "RequestRawTree")){
+      answer.WriteObject(m_RawTree);
+      s->Send(answer);
+    }
+
 
     else{
       h = m_Spectra->FindObject(request);
diff --git a/NPLib/Core/NPSpectraServer.h b/NPLib/Core/NPSpectraServer.h
index 7c13d4526..d1f45d57b 100644
--- a/NPLib/Core/NPSpectraServer.h
+++ b/NPLib/Core/NPSpectraServer.h
@@ -26,6 +26,7 @@
 #include "TServerSocket.h"
 #include "TMonitor.h"
 #include "TMessage.h"
+#include "TTree.h"
 #include "TList.h"
 #include "TH1.h"
 #include "TH2.h"
@@ -52,11 +53,14 @@ namespace NPL{
       void FillSpectra(const std::string& name,const double& valx);
       void FillSpectra(const std::string& name,const double& valx, const double& valy);
       void CheckRequest();
+      // Use for Online purpose 
+      void SetRawTree(TTree* tree){m_RawTree=tree;} ;
 
     private:
       bool m_stop;
       TServerSocket* m_Server;     
       TMonitor* m_Monitor;     
+      TTree* m_RawTree;
       TList* m_Sockets;
       TList* m_Spectra;
   };
diff --git a/NPLib/Online/NPSpectraClient.cxx b/NPLib/Online/NPSpectraClient.cxx
index e90b5f1a2..ef182be5b 100644
--- a/NPLib/Online/NPSpectraClient.cxx
+++ b/NPLib/Online/NPSpectraClient.cxx
@@ -63,7 +63,6 @@ bool NPL::SpectraClient::Connect(){
   m_Sock = new TSocket(m_Address.c_str(),m_Port);
   if(m_Sock->IsValid()){
     NPL::SendInformation("NPL::SpectraClient","Successful connection to spectra server");
-    Sync();
     return true;
   }
   else{
@@ -187,7 +186,7 @@ TTree* NPL::SpectraClient::GetTree(){
   }
 
   TMessage* message=NULL;
-  m_Sock->Send("RequestTree",kMESS_STRING||kMESS_ACK);
+  m_Sock->Send("RequestTree",kMESS_STRING|kMESS_ACK);
 
   if(m_Sock->Recv(message)<=0){
     if(m_Sock){
@@ -211,6 +210,46 @@ TTree* NPL::SpectraClient::GetTree(){
     return NULL;
   }
 }
+////////////////////////////////////////////////////////////////////////////////
+TTree* NPL::SpectraClient::GetRawTree(){
+  if(!m_Sock || !(m_Sock->IsValid())){
+    if(m_Sock){
+      m_Sock->Close("force");
+      delete m_Sock;
+      m_Sock = NULL;
+    }
+    NPL::SendWarning("NPL::SpectraClient","Update failed: Connection lost");
+
+    return NULL;
+  }
+
+  TMessage* message=NULL;
+  m_Sock->Send("RequestRawTree",kMESS_STRING|kMESS_ACK);
+
+  if(m_Sock->Recv(message)<=0){
+    if(m_Sock){
+      m_Sock->Close("force");
+      delete m_Sock;
+      m_Sock = NULL;
+    }
+
+    NPL::SendWarning("NPL::SpectraClient","Update failed: message return unreadable");
+
+    return NULL;
+  }
+
+  if(message){
+    TTree* tree = (TTree*) message->ReadObject(message->GetClass());
+    return tree;
+  }
+  
+  else{
+    NPL::SendInformation("NPL::SpectraClient","Server return an empty tree");
+    return NULL;
+  }
+}
+
+
 
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/NPLib/Online/NPSpectraClient.h b/NPLib/Online/NPSpectraClient.h
index cca37e1ea..8046c0e0f 100644
--- a/NPLib/Online/NPSpectraClient.h
+++ b/NPLib/Online/NPSpectraClient.h
@@ -47,6 +47,7 @@ namespace NPL{
       void UpdateTH1(TH1* Old, TH1* New );
       // Access the tree
       TTree* GetTree();
+      TTree* GetRawTree();
     private: // The sochet use for connection
       TSocket* m_Sock;
       std::string m_Address;
-- 
GitLab