mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-15 06:05:49 -06:00
Для удобного поиска серверов к параметрам сервера добавлен Keywords параметр. Это текстовый параметр в котором через пробел можно перечислить слова по которым будет проводиться поиск сервера при нажатии F4. Тут можно например указать IP сервера для соединения использующего туннель putty. GUI интерфейса для настройки параметра нет. Если ключевые слова заданы то отображаются в [].
739 lines
15 KiB
C++
739 lines
15 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// pgAdmin III - PostgreSQL Tools
|
|
//
|
|
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
|
|
// This software is released under the PostgreSQL Licence
|
|
//
|
|
// pgServer.h - PostgreSQL Server
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef PGSERVER_H
|
|
#define PGSERVER_H
|
|
|
|
#include "db/pgConn.h"
|
|
#include "pgCollection.h"
|
|
|
|
class frmMain;
|
|
class pgServer;
|
|
class pluginUtilityFactory;
|
|
|
|
class pgServerFactory : public pgaFactory
|
|
{
|
|
public:
|
|
pgServerFactory();
|
|
virtual dlgProperty *CreateDialog(frmMain *frame, pgObject *node, pgObject *parent);
|
|
virtual pgObject *CreateObjects(pgCollection *obj, ctlTree *browser, const wxString &restr = wxEmptyString);
|
|
virtual pgCollection *CreateCollection(pgObject *obj);
|
|
|
|
int GetClosedIconId()
|
|
{
|
|
return WantSmallIcon() ? smallClosedId : closedId;
|
|
}
|
|
|
|
protected:
|
|
int closedId, smallClosedId;
|
|
};
|
|
extern pgServerFactory serverFactory;
|
|
#define DEFAULT_SSH_PORT 22
|
|
|
|
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
|
|
class CSSHTunnelThread;
|
|
#endif
|
|
|
|
class pgServer : public pgObject
|
|
{
|
|
public:
|
|
pgServer(const wxString &newServer = wxT(""), const wxString &newHostAddr = wxT(""), const wxString &newDescription = wxT(""),
|
|
const wxString &newService = wxT(""), const wxString &newDatabase = wxT(""), const wxString &newUsername = wxT(""), int newPort = 5432,
|
|
bool storePwd = false, const wxString &newRolename = wxT(""), const wxString& newConnStr = wxT(""), bool restore = true, int sslMode = 0,
|
|
const wxString &colour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW).GetAsString(wxC2S_HTML_SYNTAX), const wxString &group = wxEmptyString,
|
|
bool sshTunnel = false, const wxString &newTunnelHost = wxEmptyString, const wxString &newTunnelUserName = wxEmptyString, bool authModePwd = true,
|
|
const wxString &newTunnelPassword = wxEmptyString, const wxString &newPublicKey = wxEmptyString, const wxString &newIdentityFile = wxEmptyString,
|
|
const int &sshPort = DEFAULT_SSH_PORT);
|
|
~pgServer();
|
|
int GetIconId();
|
|
|
|
wxString GetTypeName() const
|
|
{
|
|
return wxT("Server");
|
|
}
|
|
wxString GetTranslatedMessage(int kindOfMessage) const;
|
|
int Connect(frmMain *form, bool askPassword = true, const wxString &pwd = wxEmptyString, bool forceStorePassword = false, bool askTunnelPassword = false);
|
|
bool Disconnect(frmMain *form);
|
|
void StorePassword();
|
|
bool GetPasswordIsStored();
|
|
void InvalidatePassword()
|
|
{
|
|
passwordValid = false;
|
|
}
|
|
|
|
bool StartService();
|
|
bool StopService();
|
|
bool GetServerRunning();
|
|
bool GetServerControllable();
|
|
bool ReloadConfiguration();
|
|
bool IsReplayPaused();
|
|
bool PauseReplay();
|
|
bool ResumeReplay();
|
|
bool AddNamedRestorePoint();
|
|
|
|
pgServer *GetServer() const;
|
|
|
|
wxString GetIdentifier() const;
|
|
wxString GetVersionString();
|
|
wxString GetVersionNumber();
|
|
OID GetLastSystemOID();
|
|
wxString GetHostAddr() const
|
|
{
|
|
return hostaddr;
|
|
}
|
|
wxString GetService() const
|
|
{
|
|
return service;
|
|
}
|
|
wxString GetDatabaseName() const
|
|
{
|
|
return database;
|
|
}
|
|
wxString GetUsername() const
|
|
{
|
|
return username;
|
|
}
|
|
wxString GetPassword() const
|
|
{
|
|
return (password == wxEmptyString ? conn->GetPassword() : password);
|
|
}
|
|
bool GetStorePwd() const
|
|
{
|
|
return storePwd;
|
|
}
|
|
wxString GetRolename() const
|
|
{
|
|
return rolename;
|
|
}
|
|
wxString GetConnStr() const
|
|
{
|
|
return connstr;
|
|
}
|
|
bool GetRestore() const
|
|
{
|
|
return restore;
|
|
}
|
|
wxString GetLastError() const;
|
|
|
|
bool GetDiscovered() const
|
|
{
|
|
return discovered;
|
|
}
|
|
void iSetDiscovered(const bool b)
|
|
{
|
|
discovered = b;
|
|
}
|
|
wxString GetServiceID() const
|
|
{
|
|
return serviceId;
|
|
}
|
|
void iSetServiceID(const wxString &s);
|
|
wxString GetDiscoveryID() const
|
|
{
|
|
return discoveryId;
|
|
}
|
|
void iSetDiscoveryID(const wxString &s)
|
|
{
|
|
discoveryId = s;
|
|
}
|
|
|
|
bool GetCreatePrivilege() const
|
|
{
|
|
return createPrivilege;
|
|
}
|
|
void iSetCreatePrivilege(const bool b)
|
|
{
|
|
createPrivilege = b;
|
|
}
|
|
bool GetSuperUser() const
|
|
{
|
|
return superUser;
|
|
}
|
|
void iSetSuperUser(const bool b)
|
|
{
|
|
superUser = b;
|
|
}
|
|
bool GetCreateRole() const
|
|
{
|
|
return createRole;
|
|
}
|
|
void iSetCreateRole(const bool b)
|
|
{
|
|
createRole = b;
|
|
}
|
|
|
|
bool GetInRecovery() const
|
|
{
|
|
return inRecovery;
|
|
}
|
|
void iSetInRecovery(const bool b)
|
|
{
|
|
inRecovery = b;
|
|
}
|
|
bool GetReplayPaused() const
|
|
{
|
|
return replayPaused;
|
|
}
|
|
void SetReplayPaused(const bool b)
|
|
{
|
|
replayPaused = b;
|
|
}
|
|
wxDateTime GetConfLoadedSince()
|
|
{
|
|
return confLoadedSince;
|
|
}
|
|
void iSetConfLoadedSince(const wxDateTime &d)
|
|
{
|
|
confLoadedSince = d;
|
|
}
|
|
wxString GetReceiveLoc() const
|
|
{
|
|
return receiveLoc;
|
|
}
|
|
void iSetReceiveLoc(const wxString &s)
|
|
{
|
|
receiveLoc = s;
|
|
}
|
|
wxString GetReplayLoc() const
|
|
{
|
|
return replayLoc;
|
|
}
|
|
void iSetReplayLoc(const wxString &s)
|
|
{
|
|
replayLoc = s;
|
|
}
|
|
wxString GetReplayTimestamp() const
|
|
{
|
|
return replayTimestamp;
|
|
}
|
|
void iSetReplayTimestamp(const wxString &s)
|
|
{
|
|
replayTimestamp = s;
|
|
}
|
|
|
|
pgConn *CreateConn(wxString dbName = wxEmptyString, OID oid = 0, wxString applicationname = wxEmptyString);
|
|
|
|
wxString GetLastDatabase() const
|
|
{
|
|
return lastDatabase;
|
|
}
|
|
void iSetLastDatabase(const wxString &s)
|
|
{
|
|
lastDatabase = s;
|
|
}
|
|
wxString GetLastSchema() const
|
|
{
|
|
return lastSchema;
|
|
}
|
|
void iSetLastSchema(const wxString &s)
|
|
{
|
|
lastSchema = s;
|
|
}
|
|
wxString GetDescription() const
|
|
{
|
|
return description;
|
|
}
|
|
void iSetDescription(const wxString &s)
|
|
{
|
|
description = s;
|
|
}
|
|
void iSetHostAddr(const wxString &s)
|
|
{
|
|
hostaddr = s;
|
|
}
|
|
|
|
wxString GetDbRestriction() const
|
|
{
|
|
return dbRestriction;
|
|
}
|
|
void iSetDbRestriction(const wxString &s)
|
|
{
|
|
dbRestriction = s;
|
|
}
|
|
|
|
long GetServerIndex() const
|
|
{
|
|
return serverIndex;
|
|
}
|
|
void iSetServerIndex(long l)
|
|
{
|
|
serverIndex = l;
|
|
}
|
|
wxString GetFullName();
|
|
wxString GetFullIdentifier();
|
|
int GetPort() const
|
|
{
|
|
return port;
|
|
}
|
|
int GetSSL() const
|
|
{
|
|
return ssl;
|
|
}
|
|
bool GetConnected() const
|
|
{
|
|
return connected;
|
|
}
|
|
void iSetService(const wxString &newVal)
|
|
{
|
|
service = newVal;
|
|
}
|
|
void iSetDatabase(const wxString &newVal)
|
|
{
|
|
database = newVal;
|
|
}
|
|
void iSetPort(int newval)
|
|
{
|
|
port = newval;
|
|
}
|
|
void iSetSSL(int newval)
|
|
{
|
|
ssl = newval;
|
|
}
|
|
void iSetUsername(const wxString &newVal)
|
|
{
|
|
username = newVal;
|
|
}
|
|
void iSetPassword(const wxString &newVal)
|
|
{
|
|
password = newVal;
|
|
}
|
|
void iSetStorePwd(const bool b)
|
|
{
|
|
storePwd = b;
|
|
}
|
|
void iSetRolename(const wxString &newVal)
|
|
{
|
|
rolename = newVal;
|
|
}
|
|
void iSetConnStr(const wxString& newVal)
|
|
{
|
|
connstr = newVal;
|
|
}
|
|
void iSetRestore(const bool b)
|
|
{
|
|
restore = b;
|
|
}
|
|
bool SetPassword(const wxString &newVal);
|
|
wxDateTime GetUpSince()
|
|
{
|
|
return upSince;
|
|
}
|
|
void iSetUpSince(const wxDateTime &d)
|
|
{
|
|
upSince = d;
|
|
}
|
|
void iSetColour(const wxString &s)
|
|
{
|
|
colour = s;
|
|
}
|
|
wxString GetColour()
|
|
{
|
|
return colour;
|
|
}
|
|
|
|
void iSetGroup(const wxString &s)
|
|
{
|
|
group = s;
|
|
}
|
|
wxString GetGroup()
|
|
{
|
|
return group;
|
|
}
|
|
|
|
bool HasPrivilege(const wxString &objTyp, const wxString &objName, const wxString &priv)
|
|
{
|
|
return conn->HasPrivilege(objTyp, objName, priv);
|
|
}
|
|
bool ExecuteVoid(const wxString &sql)
|
|
{
|
|
return conn->ExecuteVoid(sql);
|
|
}
|
|
wxString ExecuteScalar(const wxString &sql)
|
|
{
|
|
return conn->ExecuteScalar(sql);
|
|
}
|
|
pgSet *ExecuteSet(const wxString &sql)
|
|
{
|
|
return conn->ExecuteSet(sql);
|
|
}
|
|
void ShowTreeDetail(ctlTree *browser, frmMain *form = 0, ctlListView *properties = 0, ctlSQLBox *sqlPane = 0);
|
|
void ShowHint(frmMain *form, bool force);
|
|
void ShowStatistics(frmMain *form, ctlListView *statistics);
|
|
void SetPuttyTunnel(pluginUtilityFactory *puttytunnel) {
|
|
puttyTunnel=puttytunnel;
|
|
}
|
|
pluginUtilityFactory* GetPuttyTunnel() {return puttyTunnel;}
|
|
wxString GetHelpPage(bool forCreate) const
|
|
{
|
|
return wxT("pg/managing-databases");
|
|
}
|
|
wxMenu *GetNewMenu();
|
|
|
|
bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded)
|
|
{
|
|
return true;
|
|
}
|
|
bool GetCanHint();
|
|
bool CanEdit()
|
|
{
|
|
return true;
|
|
}
|
|
bool CanDrop()
|
|
{
|
|
return true;
|
|
}
|
|
bool CanBackupGlobals()
|
|
{
|
|
return true;
|
|
}
|
|
bool HasStats()
|
|
{
|
|
return true;
|
|
}
|
|
bool HasDepends()
|
|
{
|
|
return false;
|
|
}
|
|
bool HasReferences()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
pgConn *connection()
|
|
{
|
|
return conn;
|
|
}
|
|
|
|
wxString GetSSLCert() const
|
|
{
|
|
return sslcert;
|
|
}
|
|
void SetSSLCert(const wxString &s)
|
|
{
|
|
sslcert = s;
|
|
}
|
|
wxString GetSSLKey() const
|
|
{
|
|
return sslkey;
|
|
}
|
|
void SetSSLKey(const wxString &s)
|
|
{
|
|
sslkey = s;
|
|
}
|
|
wxString GetSSLRootCert() const
|
|
{
|
|
return sslrootcert;
|
|
}
|
|
void SetSSLRootCert(const wxString &s)
|
|
{
|
|
sslrootcert = s;
|
|
}
|
|
wxString GetSSLCrl() const
|
|
{
|
|
return sslcrl;
|
|
}
|
|
void SetSSLCrl(const wxString &s)
|
|
{
|
|
sslcrl = s;
|
|
}
|
|
wxString GetKeywords() const
|
|
{
|
|
return keywords;
|
|
}
|
|
void iSetKeywords(const wxString &s)
|
|
{
|
|
keywords = s;
|
|
}
|
|
|
|
bool GetSSLCompression() const
|
|
{
|
|
return sslcompression;
|
|
}
|
|
void iSetSSLCompression(const bool b)
|
|
{
|
|
sslcompression = b;
|
|
}
|
|
|
|
|
|
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
|
|
//SSH Tunnel
|
|
bool GetSSHTunnel() const
|
|
{
|
|
return sshTunnel;
|
|
}
|
|
void iSetSSHTunnel(const bool b)
|
|
{
|
|
sshTunnel = b;
|
|
}
|
|
bool GetAuthModePwd() const
|
|
{
|
|
return authModePwd;
|
|
}
|
|
void iSetAuthModePwd(const bool b)
|
|
{
|
|
authModePwd = b;
|
|
}
|
|
wxString GetLocalListenHost() const
|
|
{
|
|
return local_listenhost;
|
|
}
|
|
void SetLocalListenHost(const wxString &s)
|
|
{
|
|
local_listenhost = s;
|
|
}
|
|
int GetLocalListenPort() const
|
|
{
|
|
return local_listenport;
|
|
}
|
|
void SetLocalListenPort(int newVal)
|
|
{
|
|
local_listenport = newVal;
|
|
}
|
|
wxString GetTunnelHost() const
|
|
{
|
|
return tunnelHost;
|
|
}
|
|
void SetTunnelHost(const wxString &s)
|
|
{
|
|
tunnelHost = s;
|
|
}
|
|
wxString GetTunnelUserName() const
|
|
{
|
|
return tunnelUserName;
|
|
}
|
|
void SetTunnelUserName(const wxString &s)
|
|
{
|
|
tunnelUserName = s;
|
|
}
|
|
wxString GetTunnelPassword() const
|
|
{
|
|
return tunnelPassword;
|
|
}
|
|
void SetTunnelPassword(const wxString &s)
|
|
{
|
|
tunnelPassword = s;
|
|
}
|
|
wxString GetPublicKeyFile() const
|
|
{
|
|
return publicKeyFile;
|
|
}
|
|
void SetPublicKeyFile(const wxString &s)
|
|
{
|
|
publicKeyFile = s;
|
|
}
|
|
wxString GetIdentityFile() const
|
|
{
|
|
return identityFile;
|
|
}
|
|
void SetIdentityFile(const wxString &s)
|
|
{
|
|
identityFile = s;
|
|
}
|
|
int GetTunnelPort() const
|
|
{
|
|
return tunnelPort;
|
|
}
|
|
void iSetTunnelPort(const int newval)
|
|
{
|
|
tunnelPort = newval;
|
|
}
|
|
#endif
|
|
|
|
void ShowDependencies(frmMain *form, ctlListView *Dependencies, const wxString &where = wxEmptyString);
|
|
void ShowDependents(frmMain *form, ctlListView *referencedBy, const wxString &where = wxEmptyString);
|
|
|
|
private:
|
|
wxString passwordFilename();
|
|
|
|
pgConn *conn;
|
|
long serverIndex;
|
|
bool connected, passwordValid, autovacuumRunning;
|
|
wxString service, hostaddr, database, username, password, rolename, connstr, ver, error;
|
|
wxString lastDatabase, lastSchema, description, serviceId, discoveryId;
|
|
wxDateTime upSince;
|
|
int port, ssl;
|
|
bool storePwd, restore, discovered, createPrivilege, superUser, createRole;
|
|
OID lastSystemOID;
|
|
OID dbOid;
|
|
wxString versionNum;
|
|
wxString dbRestriction;
|
|
wxString colour;
|
|
wxString group,keywords;
|
|
wxString sslcert, sslkey, sslrootcert, sslcrl;
|
|
bool sslcompression;
|
|
bool sshTunnel;
|
|
|
|
bool inRecovery, replayPaused;
|
|
wxString receiveLoc, replayLoc, replayTimestamp;
|
|
wxDateTime confLoadedSince;
|
|
pluginUtilityFactory *puttyTunnel=NULL; // if exists putty tunnel for pgServer
|
|
|
|
#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT)
|
|
bool createSSHTunnel();
|
|
|
|
//SSH Tunnel
|
|
CSSHTunnelThread *tunnelObj;
|
|
bool authModePwd;
|
|
int local_listenport;
|
|
int tunnelPort;
|
|
wxString tunnelHost, tunnelUserName, tunnelPassword, publicKeyFile, identityFile, local_listenhost;
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
SC_HANDLE scmHandle;
|
|
SC_HANDLE serviceHandle;
|
|
wxArrayString GetDependentServices(SC_HANDLE handle);
|
|
#endif
|
|
};
|
|
|
|
|
|
// collection of pgServer
|
|
class pgServerCollection : public pgCollection
|
|
{
|
|
public:
|
|
pgServerCollection(pgaFactory *factory);
|
|
wxString GetTranslatedMessage(int kindOfMessage) const;
|
|
void ShowTreeDetail(ctlTree *browser, frmMain *form = 0, ctlListView *properties = 0, ctlSQLBox *sqlPane = 0) {};
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
|
|
class pgServerObjFactory : public pgaFactory
|
|
{
|
|
public:
|
|
pgServerObjFactory(const wxChar *tn, const wxChar *ns, const wxChar *nls, wxImage *img, wxImage *imgSm = 0)
|
|
: pgaFactory(tn, ns, nls, img, imgSm) {}
|
|
virtual pgCollection *CreateCollection(pgObject *obj);
|
|
};
|
|
|
|
|
|
// Object that lives under a server
|
|
class pgServerObject : public pgObject
|
|
{
|
|
public:
|
|
pgServerObject(pgaFactory &factory, const wxString &newName = wxEmptyString) : pgObject(factory, newName) {}
|
|
pgServerObject(int newType, const wxString &newName) : pgObject(newType, newName) {}
|
|
|
|
void iSetServer(pgServer *s)
|
|
{
|
|
server = s;
|
|
}
|
|
pgServer *GetServer() const
|
|
{
|
|
return server;
|
|
}
|
|
|
|
void FillOwned(ctlTree *browser, ctlListView *referencedBy, const wxArrayString &dblist, const wxString &query);
|
|
|
|
bool CanCreate();
|
|
bool CanDrop();
|
|
bool CanEdit()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
protected:
|
|
pgServer *server;
|
|
};
|
|
|
|
|
|
// collection of pgServerObject
|
|
class pgServerObjCollection : public pgCollection
|
|
{
|
|
public:
|
|
pgServerObjCollection(pgaFactory *factory, pgServer *server);
|
|
bool CanCreate();
|
|
};
|
|
|
|
class addServerFactory : public actionFactory
|
|
{
|
|
public:
|
|
addServerFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
};
|
|
|
|
|
|
class startServiceFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
startServiceFactory (menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
class stopServiceFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
stopServiceFactory (menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
|
|
class connectServerFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
connectServerFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
|
|
class disconnectServerFactoryAll : public contextActionFactory
|
|
{
|
|
public:
|
|
disconnectServerFactoryAll(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
class disconnectServerFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
disconnectServerFactory(menuFactoryList* list, wxMenu* mnu, ctlMenuToolbar* toolbar);
|
|
wxWindow* StartDialog(frmMain* form, pgObject* obj);
|
|
bool CheckEnable(pgObject* obj);
|
|
};
|
|
|
|
class reloadconfServiceFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
reloadconfServiceFactory (menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
class pausereplayServiceFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
pausereplayServiceFactory (menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
class resumereplayServiceFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
resumereplayServiceFactory (menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
class addnamedrestorepointServiceFactory : public contextActionFactory
|
|
{
|
|
public:
|
|
addnamedrestorepointServiceFactory (menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
|
|
wxWindow *StartDialog(frmMain *form, pgObject *obj);
|
|
bool CheckEnable(pgObject *obj);
|
|
};
|
|
|
|
#endif
|