Salome HOME
Merge V8_4_BR branch.
[modules/kernel.git] / src / SALOMESDS / SALOMESDS_DataScopeServer.hxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony GEAY (EDF R&D)
20
21 #ifndef __SALOMESDS_DATASCOPEERVER_HXX__
22 #define __SALOMESDS_DATASCOPEERVER_HXX__
23
24 #include "SALOMEconfig.h"
25 #include CORBA_SERVER_HEADER(SALOME_SDS)
26
27 #include "SALOMESDS_RefCountServ.hxx"
28 #include "SALOMESDS_AutoRefCountPtr.hxx"
29 #include "SALOMESDS_BasicDataServer.hxx"
30 #include "SALOMESDS_Defines.hxx"
31
32 #include <Python.h>
33
34 #include <string>
35 #include <vector>
36 #include <list>
37
38 namespace SALOMESDS
39 {
40   class SALOMESDS_EXPORT DataScopeKiller : public POA_SALOME::DataScopeKiller
41   {
42   public:
43     DataScopeKiller(CORBA::ORB_ptr orb):_orb(CORBA::ORB::_duplicate(orb)) { }
44     void shutdown();
45   private:
46     CORBA::ORB_var _orb;
47   };
48   
49   class SALOMESDS_EXPORT RequestSwitcher : public POA_SALOME::RequestSwitcher, public POAHolder
50   {
51   public:
52     RequestSwitcher(CORBA::ORB_ptr orb);
53     void holdRequests();
54     void activeRequests();
55     PortableServer::POA_var getPOA() const { return _poa_for_request_control; }
56   private:
57     PortableServer::POA_var _poa_for_request_control;
58     PortableServer::POAManager_var _poa_manager_under_control;
59   };
60
61   class KeyWaiter;
62   class PickelizedPyObjServer;
63
64   class SALOMESDS_EXPORT DataScopeServerBase : public virtual POA_SALOME::DataScopeServerBase, public POAHolder
65   {
66   public:
67     DataScopeServerBase(CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName);
68     DataScopeServerBase(const DataScopeServerBase& other);
69   public: // remote access methods
70     void ping();
71     char *getScopeName();
72     SALOME::StringVec *listVars();
73     CORBA::Boolean existVar(const char *varName);
74     SALOME::BasicDataServer_ptr retrieveVarInternal(const char *varName);
75     void deleteVar(const char *varName);
76     CORBA::Boolean shutdownIfNotHostedByDSM(SALOME::DataScopeKiller_out killer);
77     SALOME::ByteVec *fetchSerializedContent(const char *varName);
78     SALOME::SeqOfByteVec *getAllKeysOfVarWithTypeDict(const char *varName);
79     SALOME::RequestSwitcher_ptr getRequestSwitcher();
80     void takeANap(CORBA::Double napDurationInSec);
81   public:
82     ~DataScopeServerBase();
83     BasicDataServer *retrieveVarInternal2(const std::string& varName);
84     void initializePython(int argc, char *argv[]);
85     void registerToSalomePiDict() const;
86     void setPOA(PortableServer::POA_var poa);
87     void registerInNS(SALOME::DataScopeServerBase_ptr ptr);
88     PyObject *getGlobals() const { return _globals; }
89     PyObject *getLocals() const { return _locals; }
90     PyObject *getPickler() const { return _pickler; }
91     PortableServer::POA_var getPOA() const { return _poa; }
92     CORBA::ORB_var getORB() { return _orb; }
93     std::string getScopeNameCpp() const { return _name; }
94     static std::string BuildTmpVarNameFrom(const std::string& varName);
95   public:
96     std::vector< std::string> getAllVarNames() const;
97     void checkNotAlreadyExistingVar(const std::string& varName) const;
98     void checkExistingVar(const std::string& varName) const;
99     PickelizedPyObjServer *checkVarExistingAndDict(const std::string& varName);
100   public:
101     void moveStatusOfVarFromRdWrToRdOnly(const std::string& varName);
102     void moveStatusOfVarFromRdOnlyToRdWr(const std::string& varName);
103     void moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit(const std::string& varName);
104     void moveStatusOfVarFromRdExtOrRdExtInitToRdExt(const std::string& varName);
105   protected:
106     std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator retrieveVarInternal3(const std::string& varName) const;
107     std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator retrieveVarInternal4(const std::string& varName);
108   protected:
109     PyObject *_globals;
110     PyObject *_locals;
111     PyObject *_pickler;
112     PortableServer::POA_var _poa;
113     CORBA::ORB_var _orb;
114     std::string _name;
115     std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > > _vars;
116     SALOME::DataScopeKiller_var _killer;
117     AutoServantPtr<RequestSwitcher> _rs;
118     static std::size_t COUNTER;
119   };
120   
121   class SALOMESDS_EXPORT DataScopeServer : public DataScopeServerBase, public virtual POA_SALOME::DataScopeServer
122   {
123   public:
124     DataScopeServer(CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName);
125     DataScopeServer(const DataScopeServer& other);
126     SALOME::BasicDataServer_ptr retrieveVar(const char *varName) { return retrieveVarInternal(varName); }
127     SALOME::PickelizedPyObjRdOnlyServer_ptr createRdOnlyVar(const char *varName, const SALOME::ByteVec& constValue);
128     SALOME::PickelizedPyObjRdExtServer_ptr createRdExtVar(const char *varName, const SALOME::ByteVec& constValue);
129     SALOME::PickelizedPyObjRdWrServer_ptr createRdWrVar(const char *typeName, const char *varName);
130     ~DataScopeServer();
131   };
132
133   class SALOMESDS_EXPORT DataScopeServerTransaction : public DataScopeServerBase, public virtual POA_SALOME::DataScopeServerTransaction
134   {
135   public://not remotely callable
136     DataScopeServerTransaction(CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName);
137     DataScopeServerTransaction(const DataScopeServerTransaction& other);
138     ~DataScopeServerTransaction();
139     void createRdOnlyVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
140     void createRdExtVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
141     void createRdExtInitVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
142     void createRdWrVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
143     PortableServer::POA_var getPOA4KeyWaiter() const { return _poa_for_key_waiter; }
144     void addWaitKey(KeyWaiter *kw);
145     void pingKey(PyObject *keyObj);
146     void notifyKey(const std::string& varName, PyObject *keyObj, PyObject *valueObj);
147     SALOME::ByteVec *waitForMonoThrRev(SALOME::KeyWaiter_ptr kw);
148     SALOME::ByteVec *waitForAndKill(SALOME::KeyWaiter_ptr kw);
149   public://remotely callable
150     char *getAccessOfVar(const char *varName);
151     void fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data);
152     SALOME::Transaction_ptr createRdOnlyVarTransac(const char *varName, const SALOME::ByteVec& constValue);
153     SALOME::Transaction_ptr createRdExtVarTransac(const char *varName, const SALOME::ByteVec& constValue);
154     SALOME::Transaction_ptr createRdExtInitVarTransac(const char *varName, const SALOME::ByteVec& constValue);
155     SALOME::Transaction_ptr createRdWrVarTransac(const char *varName, const SALOME::ByteVec& constValue);
156     SALOME::Transaction_ptr addKeyValueInVarHard(const char *varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
157     SALOME::Transaction_ptr addKeyValueInVarErrorIfAlreadyExisting(const char *varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
158     SALOME::TransactionMultiKeyAddSession_ptr addMultiKeyValueSession(const char *varName);
159     SALOME::Transaction_ptr removeKeyInVarErrorIfNotAlreadyExisting(const char *varName, const SALOME::ByteVec& key);
160     SALOME::TransactionRdWrAccess_ptr createWorkingVarTransac(const char *varName, const SALOME::ByteVec& constValue);
161     SALOME::Transaction_ptr killVarTransac(const char *varName);
162     SALOME::KeyWaiter_ptr waitForKeyInVar(const char *varName, const SALOME::ByteVec& keyVal);
163     SALOME::KeyWaiter_ptr waitForKeyInVarAndKillIt(const char *varName, const SALOME::ByteVec& keyVal, SALOME::Transaction_out transac);
164     void atomicApply(const SALOME::ListOfTransaction& transactions);
165   private:
166     PyObject *getPyCmpFunc();
167   private:
168     PortableServer::POA_var _poa_for_key_waiter;
169     std::list< KeyWaiter * > _waiting_keys;
170   };
171 }
172
173 #endif