You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

378 lines
11 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Author: Jun0x01@github.com
* Date: 2019.05.19
*/
#include "Workspace.h"
//using namespace SuperMap;
Workspace::Workspace()
{
m_pUGWorkspace = new UGWorkspace();
}
Workspace::Workspace(UGWorkspace *pWorkspace)
{
m_pUGWorkspace = pWorkspace;
}
Workspace::~Workspace()
{
m_pUGWorkspace->Close();
delete m_pUGWorkspace;
m_pUGWorkspace = NULL;
}
UGWorkspace* Workspace::GetUGWorkspace()
{
return m_pUGWorkspace;
}
void Workspace::setUGWorkspace(UGWorkspace *pWorkspace)
{
this->m_pUGWorkspace = pWorkspace;
}
bool Workspace::OpenWorkspaceFile(const string &filePath, const string &password /* = "" */)
{
// Close last opened workspace
m_pUGWorkspace->Close();
// Convert string to UGString
UGString ug_filePath;
ug_filePath.FromStd(filePath);
UGString ug_password;
ug_password.FromStd(password);
UGWorkspaceConnection wkCon;
wkCon.m_strServer = ug_filePath;
wkCon.m_strPassword = ug_password;
// Check workspace's type according to the file's suffix
int index = filePath.rfind('.');
string wkType = filePath.substr(index + 1, filePath.length() - index);
if (wkType.compare("smwu") == 0 || wkType.compare("SMWU") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SMWU;
}
else if (wkType.compare("smw") == 0 || wkType.compare("SMW") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SMW;
}
else if (wkType.compare("sxwu") == 0 || wkType.compare("SXWU") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SXWU;
}
else if (wkType.compare("sxw") == 0 || wkType.compare("SXW") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SXW;
}
// Open the workspace file
if (m_pUGWorkspace->Open(wkCon))
{
//Fixed that failed save workpace file.
m_pUGWorkspace->m_WorkspaceConnection.m_bFailIfExists = false;
int count = m_pUGWorkspace->m_DataSources.GetCount();
if (0 == count)
{
string name = UGStrConvertor::Tostring(m_pUGWorkspace->GetCaption());
Log::Warning("Worksapce: " + name + ", it donesn't contain any datasource or failed to open datasources in workspace.");
}
return true;
}
else
{
Log::Error("Can not open the workspace: " + filePath);
return false;
}
}
bool Workspace::OpenWorkspaceDB(UGWorkspace::UGWorkspaceType type, const string &serverUrl, const string &dbName, const string &userName, const string &password, const string &workspaceName)
{
// Close last opened workspace
m_pUGWorkspace->Close();
// Convert string to UGString
UGString ug_serverUrl;
UGString ug_dbName;
UGString ug_userName;
UGString ug_password;
UGString ug_workspaceName;
ug_serverUrl.FromStd(serverUrl);
ug_dbName.FromStd(dbName);
ug_userName.FromStd(userName);
ug_password.FromStd(password);
ug_workspaceName.FromStd(workspaceName);
UGWorkspaceConnection wkCon;
wkCon.m_nWorkspaceType = type;
wkCon.m_strServer = ug_serverUrl;
wkCon.m_strDatabase = ug_dbName;
wkCon.m_strUser = ug_userName;
wkCon.m_strPassword = ug_password;
wkCon.m_strWorkspaceName = ug_workspaceName;
if (UGWorkspace::/*UGWorkspaceType::*/WS_Version_Sql == type)
{
wkCon.m_strDriver = _U("SQL Server");
}
// Open the workspace file
if (m_pUGWorkspace->Open(wkCon))
{
int count = m_pUGWorkspace->m_DataSources.GetCount();
if (0 == count)
{
Log::Warning("Worksapce: " + workspaceName + ", it donesn't contain any datasource or failed to open datasources in workspace.");
}
return true;
}
else
{
Log::Error("Can not open the workspace: " + workspaceName + ", please check you parameters or db server again.");
return false;
}
}
UGDataSource* Workspace::OpenDatasourceFile(UGEngineType type, const string &name, const string &filePath, const string &password /*= ""*/, bool readOnly /*= false*/)
{
// Convert string to UGString
UGString ug_name;
UGString ug_filePath;
UGString ug_password;
ug_name.FromStd(name);
ug_filePath.FromStd(filePath);
ug_password.FromStd(password);
UGDsConnection dcon;
dcon.m_nType = type;
dcon.m_strAlias = ug_name;
dcon.m_strServer = ug_filePath;
dcon.m_bReadOnly = readOnly;
return m_pUGWorkspace->OpenDataSource(dcon);
}
UGDataSource* Workspace::OpenDatasourceDB(UGEngineType type, const string &name, const string &serverUrl, const string &dbName, const string &userName, const string &password, bool readOnly /*= false*/)
{
// Convert string to UGString
UGString ug_name;
UGString ug_serverUrl;
UGString ug_dbName;
UGString ug_userName;
UGString ug_password;
ug_name.FromStd(name);
ug_serverUrl.FromStd(serverUrl);
ug_dbName.FromStd(dbName);
ug_userName.FromStd(userName);
ug_password.FromStd(password);
UGDsConnection dcon;
dcon.m_nType = type;
dcon.m_strAlias = ug_name;
dcon.m_strServer = ug_serverUrl;
dcon.m_strDatabase = ug_dbName;
dcon.m_strUser = ug_userName;
dcon.m_strPassword = ug_password;
dcon.m_bReadOnly = readOnly;
if (UGC::/*UGEngineType::*/SQLPlus == type)
{
dcon.m_strDriver = _U("SQL Server");
}
return m_pUGWorkspace->OpenDataSource(dcon);
}
UGDataSource* Workspace::OpenDatasourceWeb(UGEngineType type, const string &name, const string &serverUrl, const string &OGCType /*= "" */, const string &serverKey /*= "" */)
{
// Convert string to UGString
UGString ug_name;
UGString ug_serverUrl;
UGString ug_OGCType;
UGString ug_serverKey;
ug_name.FromStd(name);
ug_serverUrl.FromStd(serverUrl);
ug_OGCType.FromStd(OGCType);
ug_serverKey.FromStd(serverKey);
UGDsConnection dcon;
dcon.m_nType = type;
dcon.m_strAlias = ug_name;
dcon.m_strServer = ug_serverUrl;
dcon.m_strDriver = ug_OGCType;
dcon.m_strPassword = ug_serverKey;
return m_pUGWorkspace->OpenDataSource(dcon);
}
void Workspace::CloseDatasource(int index)
{
m_pUGWorkspace->m_DataSources.ReleaseAt(index);
}
void Workspace::CloseDatasource(const string &name)
{
// Convert string to UGString
UGString ug_name;
ug_name.FromStd(name);
m_pUGWorkspace->m_DataSources.ReleaseAt(ug_name);
}
bool Workspace::RemoveMap(const string &mapName)
{
UGString ugMapName;
ugMapName.FromStd(mapName);
return m_pUGWorkspace->m_MapStorages.Remove(ugMapName);
}
bool Workspace::RemoveScene(const string &sceneName)
{
UGString ugSceneName;
ugSceneName.FromStd(sceneName);
return m_pUGWorkspace->m_SceneStorages.Remove(ugSceneName);
}
bool Workspace::Save()
{
return m_pUGWorkspace->Save();
}
bool Workspace::SaveAsFile(const string &wkPath)
{
UGString ugWkPath;
ugWkPath.FromStd(wkPath);
if (ugWkPath.Compare(m_pUGWorkspace->m_WorkspaceConnection.m_strServer) == 0)
{
// same workspace file path
return Save();
}
else
{
UGWorkspaceConnection wkCon;
wkCon = m_pUGWorkspace->m_WorkspaceConnection;
wkCon.m_strServer = ugWkPath;
// 1.Check workspace's type according to the file's suffix
int index = wkPath.rfind('.');
string wkType = wkPath.substr(index + 1, wkPath.length() - index);
if (wkType.compare("smwu") == 0 || wkType.compare("SMWU") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SMWU;
}
else if (wkType.compare("smw") == 0 || wkType.compare("SMW") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SMW;
}
else if (wkType.compare("sxwu") == 0 || wkType.compare("SXWU") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SXWU;
}
else if (wkType.compare("sxw") == 0 || wkType.compare("SXW") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SXW;
}
// 2.Set workspace version
if (wkCon.m_nVersion == 0) {
wkCon.m_nVersion = UG_WORKSPACE_VERSION_20120328;
}
return m_pUGWorkspace->SaveAs(m_pUGWorkspace->m_WorkspaceConnection);
}
}
UGDataSource* Workspace::CreateDatasourceUDB(const string &udbPath, const string &name)
{
UGString ugUDBpath;
ugUDBpath.FromStd(udbPath);
UGString ugName;
ugName.FromStd(name);
UGDataSource* pDatasource = UGDataSourceManager::CreateDataSource(UGC::/*UGEngineType::*/UDB);;
UGDsConnection& cn = pDatasource->GetConnectionInfo();
cn.m_strServer = ugUDBpath;
cn.m_nType = UGC::/*UGEngineType::*/UDB;
cn.m_strAlias = ugName;
cn.m_bReadOnly = false;
//cn.m_bExclusive = true; // 默认为false. 该参数与m_bReadOnly相反使用其一即可。即只有只读和独占两种状态。
//cn.m_bAutoConnect = false; // 默认为true, 使用默认值。若设置成false会导致保存到工作空间后再次打开工作空间时该数据源打开失败
bool isCreated = pDatasource->Create();
if (isCreated)
{
m_pUGWorkspace->m_DataSources.Insert(ugName, pDatasource); // 将新建数据源和工作空间关联,以便保存到文件。
}
else {
delete pDatasource;
pDatasource = NULL;
Log::Error("Failed to created udbthe path is \"" + udbPath + "\"");
}
return pDatasource;
}
void Workspace::Close()
{
m_pUGWorkspace->Close();
}
bool Workspace::CreateAsFile(const string &wkPath, const string password/* = ""*/)
{
// Convert string to UGString
UGString ug_filePath;
ug_filePath.FromStd(wkPath);
UGString ug_password;
ug_password.FromStd(password);
if (UGFile::IsExist(ug_filePath))
{
return false;
}
UGWorkspaceConnection& wkCon = m_pUGWorkspace->m_WorkspaceConnection;
wkCon.m_strServer = ug_filePath;
wkCon.m_strPassword = ug_password;
// Check workspace's type according to the file's suffix
int index = wkPath.rfind('.');
string wkType = wkPath.substr(index + 1, wkPath.length() - index);
if (wkType.compare("smwu") == 0 || wkType.compare("SMWU") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SMWU;
}
else if (wkType.compare("smw") == 0 || wkType.compare("SMW") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SMW;
}
else if (wkType.compare("sxwu") == 0 || wkType.compare("SXWU") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SXWU;
}
else if (wkType.compare("sxw") == 0 || wkType.compare("SXW") == 0)
{
wkCon.m_nWorkspaceType = UGWorkspace::WS_Version_SXW;
}
// 2.Set workspace version
if (wkCon.m_nVersion == 0) {
wkCon.m_nVersion = UG_WORKSPACE_VERSION_20120328;
}
return m_pUGWorkspace->SaveAs(m_pUGWorkspace->m_WorkspaceConnection);
}