Merge branch 'master' into feature/holding-tags-copy
This commit is contained in:
@@ -81,7 +81,7 @@ using namespace Base;
|
||||
|
||||
//**************************************************************************
|
||||
//**************************************************************************
|
||||
// privat classes declaration:
|
||||
// private classes declaration:
|
||||
// - DOMTreeErrorReporter
|
||||
// - StrX
|
||||
// - DOMPrintFilter
|
||||
@@ -195,12 +195,12 @@ class DOMPrintErrorHandler : public DOMErrorHandler
|
||||
{
|
||||
public:
|
||||
|
||||
DOMPrintErrorHandler() {};
|
||||
~DOMPrintErrorHandler() {};
|
||||
DOMPrintErrorHandler() {}
|
||||
~DOMPrintErrorHandler() {}
|
||||
|
||||
/** @name The error handler interface */
|
||||
bool handleError(const DOMError& domError);
|
||||
void resetErrors() {};
|
||||
void resetErrors() {}
|
||||
|
||||
private :
|
||||
/* Unimplemented constructors and operators */
|
||||
@@ -391,10 +391,10 @@ std::vector<Base::Reference<ParameterGrp> > ParameterGrp::GetGroups(void)
|
||||
pcTemp = FindElement(_pGroupNode,"FCParamGroup");
|
||||
|
||||
while (pcTemp) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// already created?
|
||||
if (!(rParamGrp=_GroupMap[Name]).isValid()) {
|
||||
rParamGrp = Base::Reference<ParameterGrp> (new ParameterGrp(((DOMElement*)pcTemp),Name.c_str()));
|
||||
rParamGrp = Base::Reference<ParameterGrp> (new ParameterGrp(static_cast<DOMElement*>(pcTemp),Name.c_str()));
|
||||
_GroupMap[Name] = rParamGrp;
|
||||
}
|
||||
vrParamGrp.push_back( rParamGrp );
|
||||
@@ -443,10 +443,12 @@ void ParameterGrp::SetBool(const char* Name, bool bValue)
|
||||
{
|
||||
// find or create the Element
|
||||
DOMElement *pcElem = FindOrCreateElement(_pGroupNode,"FCBool",Name);
|
||||
// and set the value
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(bValue?"1":"0").unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
if (pcElem) {
|
||||
// and set the value
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(bValue?"1":"0").unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<bool> ParameterGrp::GetBools(const char * sFilter) const
|
||||
@@ -457,10 +459,10 @@ std::vector<bool> ParameterGrp::GetBools(const char * sFilter) const
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCBool");
|
||||
while ( pcTemp) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
if (strcmp(StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),"1"))
|
||||
if (strcmp(StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),"1"))
|
||||
vrValues.push_back(false);
|
||||
else
|
||||
vrValues.push_back(true);
|
||||
@@ -479,10 +481,10 @@ std::vector<std::pair<std::string,bool> > ParameterGrp::GetBoolMap(const char *
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCBool");
|
||||
while ( pcTemp) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
if (strcmp(StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),"1"))
|
||||
if (strcmp(StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),"1"))
|
||||
vrValues.push_back(std::make_pair(Name, false));
|
||||
else
|
||||
vrValues.push_back(std::make_pair(Name, true));
|
||||
@@ -508,11 +510,13 @@ void ParameterGrp::SetInt(const char* Name, long lValue)
|
||||
char cBuf[256];
|
||||
// find or create the Element
|
||||
DOMElement *pcElem = FindOrCreateElement(_pGroupNode,"FCInt",Name);
|
||||
// and set the value
|
||||
sprintf(cBuf,"%li",lValue);
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(cBuf).unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
if (pcElem) {
|
||||
// and set the value
|
||||
sprintf(cBuf,"%li",lValue);
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(cBuf).unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<long> ParameterGrp::GetInts(const char * sFilter) const
|
||||
@@ -523,10 +527,10 @@ std::vector<long> ParameterGrp::GetInts(const char * sFilter) const
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCInt") ;
|
||||
while ( pcTemp ) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
vrValues.push_back( atol (StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()) );
|
||||
vrValues.push_back(atol(StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()) );
|
||||
}
|
||||
pcTemp = FindNextElement(pcTemp,"FCInt") ;
|
||||
}
|
||||
@@ -542,11 +546,11 @@ std::vector<std::pair<std::string,long> > ParameterGrp::GetIntMap(const char * s
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCInt") ;
|
||||
while ( pcTemp ) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
vrValues.push_back(std::make_pair(Name,
|
||||
( atol (StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()))));
|
||||
( atol (StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()))));
|
||||
}
|
||||
pcTemp = FindNextElement(pcTemp,"FCInt") ;
|
||||
}
|
||||
@@ -569,11 +573,13 @@ void ParameterGrp::SetUnsigned(const char* Name, unsigned long lValue)
|
||||
char cBuf[256];
|
||||
// find or create the Element
|
||||
DOMElement *pcElem = FindOrCreateElement(_pGroupNode,"FCUInt",Name);
|
||||
// and set the value
|
||||
sprintf(cBuf,"%lu",lValue);
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(cBuf).unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
if (pcElem) {
|
||||
// and set the value
|
||||
sprintf(cBuf,"%lu",lValue);
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(cBuf).unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<unsigned long> ParameterGrp::GetUnsigneds(const char * sFilter) const
|
||||
@@ -584,10 +590,10 @@ std::vector<unsigned long> ParameterGrp::GetUnsigneds(const char * sFilter) cons
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCUInt");
|
||||
while ( pcTemp ) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
vrValues.push_back( strtoul (StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),0,10) );
|
||||
vrValues.push_back( strtoul (StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),0,10) );
|
||||
}
|
||||
pcTemp = FindNextElement(pcTemp,"FCUInt") ;
|
||||
}
|
||||
@@ -603,11 +609,11 @@ std::vector<std::pair<std::string,unsigned long> > ParameterGrp::GetUnsignedMap(
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCUInt");
|
||||
while ( pcTemp ) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
vrValues.push_back(std::make_pair(Name,
|
||||
( strtoul (StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),0,10) )));
|
||||
( strtoul (StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str(),0,10) )));
|
||||
}
|
||||
pcTemp = FindNextElement(pcTemp,"FCUInt");
|
||||
}
|
||||
@@ -630,11 +636,13 @@ void ParameterGrp::SetFloat(const char* Name, double dValue)
|
||||
char cBuf[256];
|
||||
// find or create the Element
|
||||
DOMElement *pcElem = FindOrCreateElement(_pGroupNode,"FCFloat",Name);
|
||||
// and set the value
|
||||
sprintf(cBuf,"%.12f",dValue); // use %.12f instead of %f to handle values < 1.0e-6
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(cBuf).unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
if (pcElem) {
|
||||
// and set the value
|
||||
sprintf(cBuf,"%.12f",dValue); // use %.12f instead of %f to handle values < 1.0e-6
|
||||
pcElem->setAttribute(XStr("Value").unicodeForm(), XStr(cBuf).unicodeForm());
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<double> ParameterGrp::GetFloats(const char * sFilter) const
|
||||
@@ -645,10 +653,10 @@ std::vector<double> ParameterGrp::GetFloats(const char * sFilter) const
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCFloat") ;
|
||||
while ( pcTemp ) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
vrValues.push_back( atof (StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()) );
|
||||
vrValues.push_back( atof (StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()) );
|
||||
}
|
||||
pcTemp = FindNextElement(pcTemp,"FCFloat");
|
||||
}
|
||||
@@ -664,11 +672,11 @@ std::vector<std::pair<std::string,double> > ParameterGrp::GetFloatMap(const char
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCFloat") ;
|
||||
while ( pcTemp ) {
|
||||
Name = StrX( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrX(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
vrValues.push_back(std::make_pair(Name,
|
||||
( atof (StrX(((DOMElement*)pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()))));
|
||||
( atof (StrX(static_cast<DOMElement*>(pcTemp)->getAttribute(XStr("Value").unicodeForm())).c_str()))));
|
||||
}
|
||||
pcTemp = FindNextElement(pcTemp,"FCFloat");
|
||||
}
|
||||
@@ -694,19 +702,20 @@ void ParameterGrp::SetASCII(const char* Name, const char *sValue)
|
||||
{
|
||||
// find or create the Element
|
||||
DOMElement *pcElem = FindOrCreateElement(_pGroupNode,"FCText",Name);
|
||||
// and set the value
|
||||
DOMNode *pcElem2 = pcElem->getFirstChild();
|
||||
if (!pcElem2) {
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *pDocument = _pGroupNode->getOwnerDocument();
|
||||
DOMText *pText = pDocument->createTextNode(XUTF8Str(sValue).unicodeForm());
|
||||
pcElem->appendChild(pText);
|
||||
if (pcElem) {
|
||||
// and set the value
|
||||
DOMNode *pcElem2 = pcElem->getFirstChild();
|
||||
if (!pcElem2) {
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *pDocument = _pGroupNode->getOwnerDocument();
|
||||
DOMText *pText = pDocument->createTextNode(XUTF8Str(sValue).unicodeForm());
|
||||
pcElem->appendChild(pText);
|
||||
}
|
||||
else {
|
||||
pcElem2->setNodeValue(XUTF8Str(sValue).unicodeForm());
|
||||
}
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
else {
|
||||
pcElem2->setNodeValue(XUTF8Str(sValue).unicodeForm());
|
||||
}
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
|
||||
}
|
||||
|
||||
std::string ParameterGrp::GetASCII(const char* Name, const char * pPreset) const
|
||||
@@ -739,7 +748,7 @@ std::vector<std::string> ParameterGrp::GetASCIIs(const char * sFilter) const
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCText");
|
||||
while ( pcTemp ) {
|
||||
Name = StrXUTF8( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrXUTF8(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
// retrieve the text element
|
||||
@@ -761,7 +770,7 @@ std::vector<std::pair<std::string,std::string> > ParameterGrp::GetASCIIMap(const
|
||||
|
||||
pcTemp = FindElement(_pGroupNode,"FCText");
|
||||
while ( pcTemp) {
|
||||
Name = StrXUTF8( ((DOMElement*)pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
Name = StrXUTF8(static_cast<DOMElement*>(pcTemp)->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str();
|
||||
// check on filter condition
|
||||
if (sFilter == NULL || Name.find(sFilter)!= std::string::npos) {
|
||||
// retrieve the text element
|
||||
@@ -778,22 +787,6 @@ std::vector<std::pair<std::string,std::string> > ParameterGrp::GetASCIIMap(const
|
||||
//**************************************************************************
|
||||
// Access methods
|
||||
|
||||
void ParameterGrp::RemoveGrp(const char* Name)
|
||||
{
|
||||
// remove group handle
|
||||
_GroupMap.erase(Name);
|
||||
|
||||
// check if Element in group
|
||||
DOMElement *pcElem = FindElement(_pGroupNode,"FCParamGroup",Name);
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
else
|
||||
_pGroupNode->removeChild(pcElem);
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
|
||||
void ParameterGrp::RemoveASCII(const char* Name)
|
||||
{
|
||||
// check if Element in group
|
||||
@@ -801,11 +794,12 @@ void ParameterGrp::RemoveASCII(const char* Name)
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
else
|
||||
_pGroupNode->removeChild(pcElem);
|
||||
|
||||
DOMNode* node = _pGroupNode->removeChild(pcElem);
|
||||
node->release();
|
||||
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
|
||||
}
|
||||
|
||||
void ParameterGrp::RemoveBool(const char* Name)
|
||||
@@ -815,8 +809,9 @@ void ParameterGrp::RemoveBool(const char* Name)
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
else
|
||||
_pGroupNode->removeChild(pcElem);
|
||||
|
||||
DOMNode* node = _pGroupNode->removeChild(pcElem);
|
||||
node->release();
|
||||
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
@@ -842,8 +837,9 @@ void ParameterGrp::RemoveFloat(const char* Name)
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
else
|
||||
_pGroupNode->removeChild(pcElem);
|
||||
|
||||
DOMNode* node = _pGroupNode->removeChild(pcElem);
|
||||
node->release();
|
||||
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
@@ -856,8 +852,9 @@ void ParameterGrp::RemoveInt(const char* Name)
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
else
|
||||
_pGroupNode->removeChild(pcElem);
|
||||
|
||||
DOMNode* node = _pGroupNode->removeChild(pcElem);
|
||||
node->release();
|
||||
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
@@ -870,8 +867,38 @@ void ParameterGrp::RemoveUnsigned(const char* Name)
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
else
|
||||
_pGroupNode->removeChild(pcElem);
|
||||
|
||||
DOMNode* node = _pGroupNode->removeChild(pcElem);
|
||||
node->release();
|
||||
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
}
|
||||
|
||||
void ParameterGrp::RemoveGrp(const char* Name)
|
||||
{
|
||||
auto it = _GroupMap.find(Name);
|
||||
if (it == _GroupMap.end())
|
||||
return;
|
||||
|
||||
// if this or any of its children is referenced by an observer
|
||||
// it cannot be deleted
|
||||
if (!it->second->ShouldRemove()) {
|
||||
it->second->Clear();
|
||||
}
|
||||
else {
|
||||
// check if Element in group
|
||||
DOMElement *pcElem = FindElement(_pGroupNode,"FCParamGroup",Name);
|
||||
// if not return
|
||||
if (!pcElem)
|
||||
return;
|
||||
|
||||
// remove group handle
|
||||
_GroupMap.erase(Name);
|
||||
|
||||
DOMNode* node = _pGroupNode->removeChild(pcElem);
|
||||
node->release();
|
||||
}
|
||||
|
||||
// trigger observer
|
||||
Notify(Name);
|
||||
@@ -882,34 +909,63 @@ void ParameterGrp::Clear(void)
|
||||
std::vector<DOMNode*> vecNodes;
|
||||
|
||||
// checking on references
|
||||
std::map <std::string ,Base::Reference<ParameterGrp> >::iterator It1;
|
||||
for (It1 = _GroupMap.begin();It1!=_GroupMap.end();++It1)
|
||||
if (It1->second.getRefCount() > 1)
|
||||
Console().Warning("ParameterGrp::Clear(): Group clear with active references");
|
||||
// remove group handles
|
||||
_GroupMap.clear();
|
||||
std::vector<std::string> removeGrp;
|
||||
for (auto it = _GroupMap.begin();it!=_GroupMap.end();++it) {
|
||||
// If a group is referenced by some observer then do not remove it
|
||||
// but clear it
|
||||
if (!it->second->ShouldRemove()) {
|
||||
it->second->Clear();
|
||||
}
|
||||
else {
|
||||
removeGrp.push_back(it->first);
|
||||
}
|
||||
}
|
||||
|
||||
// searching all nodes
|
||||
for (DOMNode *clChild = _pGroupNode->getFirstChild(); clChild != 0; clChild = clChild->getNextSibling()) {
|
||||
vecNodes.push_back(clChild);
|
||||
// remove group handles
|
||||
for (auto it : removeGrp) {
|
||||
auto pos = _GroupMap.find(it);
|
||||
vecNodes.push_back(pos->second->_pGroupNode);
|
||||
_GroupMap.erase(pos->first);
|
||||
}
|
||||
|
||||
// searching all non-group nodes
|
||||
for (DOMNode *child = _pGroupNode->getFirstChild(); child != 0; child = child->getNextSibling()) {
|
||||
if (XMLString::compareString(child->getNodeName(), XStr("FCParamGroup").unicodeForm()) != 0)
|
||||
vecNodes.push_back(child);
|
||||
}
|
||||
|
||||
// deleting the nodes
|
||||
DOMNode* pcTemp;
|
||||
for (std::vector<DOMNode*>::iterator It=vecNodes.begin();It!=vecNodes.end();++It) {
|
||||
pcTemp = _pGroupNode->removeChild(*It);
|
||||
//delete pcTemp;
|
||||
pcTemp->release();
|
||||
for (auto it = vecNodes.begin(); it != vecNodes.end(); ++it) {
|
||||
DOMNode *child = _pGroupNode->removeChild(*it);
|
||||
child->release();
|
||||
}
|
||||
|
||||
// trigger observer
|
||||
Notify(0);
|
||||
Notify("");
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// Access methods
|
||||
|
||||
bool ParameterGrp::ShouldRemove() const
|
||||
{
|
||||
if (this->getRefCount() > 1)
|
||||
return false;
|
||||
for (auto it : _GroupMap) {
|
||||
bool ok = it.second->ShouldRemove();
|
||||
if (!ok)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *ParameterGrp::FindElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *Start, const char* Type, const char* Name) const
|
||||
{
|
||||
if (XMLString::compareString(Start->getNodeName(), XStr("FCParamGroup").unicodeForm()) != 0 &&
|
||||
XMLString::compareString(Start->getNodeName(), XStr("FCParameters").unicodeForm()) != 0) {
|
||||
Base::Console().Warning("FindElement: %s cannot have the element %s of type %s\n", StrX(Start->getNodeName()).c_str(), Name, Type);
|
||||
return nullptr;
|
||||
}
|
||||
for (DOMNode *clChild = Start->getFirstChild(); clChild != 0; clChild = clChild->getNextSibling()) {
|
||||
if (clChild->getNodeType() == DOMNode::ELEMENT_NODE) {
|
||||
// the right node Type
|
||||
@@ -917,10 +973,10 @@ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *ParameterGrp::FindElement(XERCES_CPP_
|
||||
if (clChild->getAttributes()->getLength() > 0) {
|
||||
if (Name) {
|
||||
if (!strcmp(Name,StrX(clChild->getAttributes()->getNamedItem(XStr("Name").unicodeForm())->getNodeValue()).c_str()))
|
||||
return (DOMElement*)clChild;
|
||||
return static_cast<DOMElement*>(clChild);
|
||||
}
|
||||
else
|
||||
return (DOMElement*)clChild;
|
||||
return static_cast<DOMElement*>(clChild);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -932,13 +988,14 @@ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *ParameterGrp::FindElement(XERCES_CPP_
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *ParameterGrp::FindNextElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *Prev, const char* Type) const
|
||||
{
|
||||
DOMNode *clChild = Prev;
|
||||
if (!clChild) return 0l;
|
||||
if (!clChild)
|
||||
return nullptr;
|
||||
|
||||
while ((clChild = clChild->getNextSibling())!=0) {
|
||||
if (clChild->getNodeType() == DOMNode::ELEMENT_NODE) {
|
||||
// the right node Type
|
||||
if (!strcmp(Type,StrX(clChild->getNodeName()).c_str())) {
|
||||
return (DOMElement*)clChild;
|
||||
return static_cast<DOMElement*>(clChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -949,15 +1006,21 @@ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *ParameterGrp::FindOrCreateElement(XER
|
||||
{
|
||||
// first try to find it
|
||||
DOMElement *pcElem = FindElement(Start,Type,Name);
|
||||
if (pcElem)
|
||||
return pcElem;
|
||||
|
||||
if (!pcElem) {
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *pDocument = _pGroupNode->getOwnerDocument();
|
||||
|
||||
pcElem = pDocument->createElement(XStr(Type).unicodeForm());
|
||||
pcElem-> setAttribute(XStr("Name").unicodeForm(), XStr(Name).unicodeForm());
|
||||
Start->appendChild(pcElem);
|
||||
if (XMLString::compareString(Start->getNodeName(), XStr("FCParamGroup").unicodeForm()) != 0 &&
|
||||
XMLString::compareString(Start->getNodeName(), XStr("FCParameters").unicodeForm()) != 0) {
|
||||
Base::Console().Warning("FindOrCreateElement: %s cannot have the element %s of type %s\n", StrX(Start->getNodeName()).c_str(), Name, Type);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *pDocument = _pGroupNode->getOwnerDocument();
|
||||
|
||||
pcElem = pDocument->createElement(XStr(Type).unicodeForm());
|
||||
pcElem-> setAttribute(XStr("Name").unicodeForm(), XStr(Name).unicodeForm());
|
||||
Start->appendChild(pcElem);
|
||||
|
||||
return pcElem;
|
||||
}
|
||||
|
||||
@@ -1189,7 +1252,7 @@ int ParameterManager::LoadDocument(const char* sFileName)
|
||||
|
||||
try {
|
||||
#if defined (FC_OS_WIN32)
|
||||
LocalFileInputSource inputSource((XMLCh*)file.toStdWString().c_str());
|
||||
LocalFileInputSource inputSource(reinterpret_cast<const XMLCh*>(file.toStdWString().c_str()));
|
||||
#else
|
||||
LocalFileInputSource inputSource(XStr(file.filePath().c_str()).unicodeForm());
|
||||
#endif
|
||||
@@ -1286,7 +1349,7 @@ void ParameterManager::SaveDocument(const char* sFileName) const
|
||||
// to a file once it receives any thing from the serializer.
|
||||
//
|
||||
#if defined (FC_OS_WIN32)
|
||||
XMLFormatTarget *myFormTarget = new LocalFileFormatTarget ((XMLCh*)file.toStdWString().c_str());
|
||||
XMLFormatTarget *myFormTarget = new LocalFileFormatTarget (reinterpret_cast<const XMLCh*>(file.toStdWString().c_str()));
|
||||
#else
|
||||
XMLFormatTarget *myFormTarget = new LocalFileFormatTarget (file.filePath().c_str());
|
||||
#endif
|
||||
@@ -1378,7 +1441,7 @@ void ParameterManager::SaveDocument(XMLFormatTarget* pFormatTarget) const
|
||||
XMLCh tempStr[100];
|
||||
XMLString::transcode("LS", tempStr, 99);
|
||||
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
|
||||
DOMLSSerializer *theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer();
|
||||
DOMLSSerializer *theSerializer = static_cast<DOMImplementationLS*>(impl)->createLSSerializer();
|
||||
|
||||
// set user specified end of line sequence and output encoding
|
||||
theSerializer->setNewLine(gMyEOLSequence);
|
||||
@@ -1388,7 +1451,7 @@ void ParameterManager::SaveDocument(XMLFormatTarget* pFormatTarget) const
|
||||
// do the serialization through DOMWriter::writeNode();
|
||||
//
|
||||
if (_pDocument) {
|
||||
DOMLSOutput *theOutput = ((DOMImplementationLS*)impl)->createLSOutput();
|
||||
DOMLSOutput *theOutput = static_cast<DOMImplementationLS*>(impl)->createLSOutput();
|
||||
theOutput->setEncoding(gOutputEncoding);
|
||||
|
||||
if (gUseFilter) {
|
||||
@@ -1443,7 +1506,7 @@ void ParameterManager::CreateDocument(void)
|
||||
// creating the node for the root group
|
||||
DOMElement* rootElem = _pDocument->getDocumentElement();
|
||||
_pGroupNode = _pDocument->createElement(XStr("FCParamGroup").unicodeForm());
|
||||
((DOMElement*)_pGroupNode)->setAttribute(XStr("Name").unicodeForm(), XStr("Root").unicodeForm());
|
||||
static_cast<DOMElement*>(_pGroupNode)->setAttribute(XStr("Name").unicodeForm(), XStr("Root").unicodeForm());
|
||||
rootElem->appendChild(_pGroupNode);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,13 @@
|
||||
* Juergen Riegel 2002 *
|
||||
***************************************************************************/
|
||||
|
||||
/**
|
||||
* \file Parameter.h
|
||||
* \brief The classes defined here are used to interface with the XML-based
|
||||
* FreeCAD config files: user.cfg and system.cfg files. It can parse, get,
|
||||
* and store the parameters/configurations for the user's preferences.
|
||||
* 3rd party Xerces-C++ XML parser is used to parse and write the XML.
|
||||
*/
|
||||
|
||||
#ifndef BASE__PARAMETER_H
|
||||
#define BASE__PARAMETER_H
|
||||
@@ -93,7 +100,7 @@ class ParameterManager;
|
||||
* kind of preferences and so on.
|
||||
* @see ParameterManager
|
||||
*/
|
||||
class BaseExport ParameterGrp : public Base::Handled,public Base::Subject <const char*>
|
||||
class BaseExport ParameterGrp : public Base::Handled,public Base::Subject <const char*>
|
||||
{
|
||||
|
||||
|
||||
@@ -236,6 +243,7 @@ protected:
|
||||
~ParameterGrp();
|
||||
/// helper function for GetGroup
|
||||
Base::Reference<ParameterGrp> _GetGroup(const char* Name);
|
||||
bool ShouldRemove() const;
|
||||
|
||||
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *FindNextElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *Prev, const char* Type) const;
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ void cleanupSWIG_T(const char* TypeName)
|
||||
|
||||
PyObject *module, *dict;
|
||||
PyInterpreterState *interp = PyThreadState_GET()->interp;
|
||||
PyObject *modules = interp->modules;
|
||||
PyObject *modules = PyImport_GetModuleDict();
|
||||
module = PyDict_GetItemString(modules, "__builtin__");
|
||||
if (module != NULL && PyModule_Check(module)) {
|
||||
dict = PyModule_GetDict(module);
|
||||
|
||||
@@ -404,16 +404,21 @@ void ParameterGroup::onDeleteSelectedItem()
|
||||
QTreeWidgetItem* sel = currentItem();
|
||||
if (isItemSelected(sel) && sel->parent())
|
||||
{
|
||||
if ( QMessageBox::question(this, tr("Remove group"), tr("Do really want to remove this parameter group?"),
|
||||
if ( QMessageBox::question(this, tr("Remove group"), tr("Do you really want to remove this parameter group?"),
|
||||
QMessageBox::Yes, QMessageBox::No|QMessageBox::Default|QMessageBox::Escape) ==
|
||||
QMessageBox::Yes )
|
||||
{
|
||||
QTreeWidgetItem* parent = sel->parent();
|
||||
int index = parent->indexOfChild(sel);
|
||||
parent->takeChild(index);
|
||||
ParameterGroupItem* para = static_cast<ParameterGroupItem*>(parent);
|
||||
para->_hcGrp->RemoveGrp(sel->text(0).toLatin1());
|
||||
|
||||
std::string groupName = sel->text(0).toStdString();
|
||||
// must delete the tree item here because it and its children still
|
||||
// hold a reference to the parameter group
|
||||
delete sel;
|
||||
|
||||
ParameterGroupItem* para = static_cast<ParameterGroupItem*>(parent);
|
||||
para->_hcGrp->RemoveGrp(groupName.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
#include <openssl/hmac.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/md5.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <App/Application.h>
|
||||
@@ -193,31 +195,15 @@ void Cloud::CloudWriter::checkText(DOMText* text) {
|
||||
|
||||
void Cloud::CloudWriter::createBucket()
|
||||
{
|
||||
printf("CREATING BUCKET %s\n", this->Bucket);
|
||||
struct timeval tv;
|
||||
struct tm *tm;
|
||||
char date_formatted[256];
|
||||
char StringToSign[1024];
|
||||
unsigned char *digest;
|
||||
|
||||
struct Cloud::AmzData *RequestData;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
struct data_buffer curl_buffer;
|
||||
|
||||
#if defined(FC_OS_WIN32)
|
||||
#else
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
strftime(date_formatted,256,"%a, %d %b %Y %T %z", tm);
|
||||
#endif
|
||||
|
||||
// CHANGEME
|
||||
sprintf(StringToSign,"PUT\n\napplication/xml\n%s\n/%s/", date_formatted, this->Bucket);
|
||||
|
||||
// We have to use HMAC encoding and SHA1
|
||||
digest=HMAC(EVP_sha1(),this->SecretKey,strlen(this->SecretKey),
|
||||
(const unsigned char *)&StringToSign,strlen(StringToSign),NULL,NULL);
|
||||
char path[1024];
|
||||
sprintf(path, "/%s/", this->Bucket);
|
||||
RequestData = Cloud::ComputeDigestAmzS3v2("PUT", "application/xml", path, this->SecretKey, NULL, 0);
|
||||
|
||||
// Let's build the Header and call to curl
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
@@ -225,27 +211,22 @@ void Cloud::CloudWriter::createBucket()
|
||||
if ( curl )
|
||||
{
|
||||
struct curl_slist *chunk = NULL;
|
||||
char header_data[1024];
|
||||
char Url[256];
|
||||
// Let's build our own header
|
||||
std::string strUrl(this->Url);
|
||||
eraseSubStr(strUrl,"http://");
|
||||
eraseSubStr(strUrl,"https://");
|
||||
|
||||
sprintf(header_data,"Host: %s", strUrl.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
sprintf(header_data,"Date: %s", date_formatted);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = curl_slist_append(chunk, "Content-Type: application/xml");
|
||||
std::string digest_str;
|
||||
digest_str=Base::base64_encode(digest,strlen((const char *)digest));
|
||||
sprintf(header_data,"Authorization: AWS %s:%s", this->AccessKey,
|
||||
digest_str.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = Cloud::BuildHeaderAmzS3v2( strUrl.c_str(), this->TcpPort, this->AccessKey, RequestData);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
sprintf(header_data,"%s:%s/%s/", this->Url,this->TcpPort,
|
||||
|
||||
// Lets build the Url for our Curl call
|
||||
|
||||
sprintf(Url,"%s:%s/%s/", this->Url,this->TcpPort,
|
||||
this->Bucket);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, header_data);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, Url);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
|
||||
// curl read a file not a memory buffer (it shall be able to do it)
|
||||
@@ -266,13 +247,113 @@ void Cloud::CloudWriter::createBucket()
|
||||
}
|
||||
}
|
||||
|
||||
Cloud::CloudWriter::CloudWriter(const char* Url, const char* AccessKey, const char* SecretKey, const char* TcpPort, const char* Bucket)
|
||||
struct Cloud::AmzData *Cloud::ComputeDigestAmzS3v2(char *operation, char *data_type, const char *target, const char *Secret, const char *ptr, long size)
|
||||
{
|
||||
struct AmzData *returnData;
|
||||
struct timeval tv;
|
||||
struct tm *tm;
|
||||
char date_formatted[256];
|
||||
char StringToSign[1024];
|
||||
unsigned char *digest;
|
||||
char StringToSign[1024];
|
||||
unsigned char *digest;
|
||||
unsigned int HMACLength;
|
||||
// Amazon S3 and Swift require the timezone to be define to GMT.
|
||||
// As to simplify the conversion this is performed through the TZ
|
||||
// environment variable and a call to localtime as to convert output of gettimeofday
|
||||
returnData = ( struct Cloud::AmzData *) malloc(sizeof(struct Cloud::AmzData));
|
||||
|
||||
strcpy(returnData->ContentType, data_type);
|
||||
|
||||
#if defined(FC_OS_WIN32)
|
||||
_putenv("TZ=GMT");
|
||||
#else
|
||||
setenv("TZ","GMT",1);
|
||||
#endif
|
||||
// We must check that the bucket exists or not. If not, we have to create it.
|
||||
// We must request the bucketlist if we receive a 404 error. This means that it
|
||||
// doesn't exist. The other option is that the content list is empty.
|
||||
// This piece of code is the same as the Reader except we do not interpret it !
|
||||
#if defined(FC_OS_WIN32)
|
||||
#else
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
strftime(date_formatted,256,"%a, %d %b %Y %T %z", tm);
|
||||
#endif
|
||||
returnData->MD5=NULL;
|
||||
if ( strcmp(operation,"PUT") == 0 )
|
||||
{
|
||||
if ( ptr != NULL )
|
||||
{
|
||||
returnData->MD5=Cloud::MD5Sum(ptr,size);
|
||||
sprintf(StringToSign,"%s\n%s\n%s\n%s\n%s", operation, returnData->MD5, data_type, date_formatted, target);
|
||||
}
|
||||
else
|
||||
sprintf(StringToSign,"%s\n\n%s\n%s\n%s", operation, data_type, date_formatted, target);
|
||||
}
|
||||
else
|
||||
sprintf(StringToSign,"%s\n\n%s\n%s\n%s", operation, data_type, date_formatted, target);
|
||||
// We have to use HMAC encoding and SHA1
|
||||
digest=HMAC(EVP_sha1(),Secret,strlen(Secret),
|
||||
(const unsigned char *)&StringToSign,strlen(StringToSign),NULL,&HMACLength);
|
||||
returnData->digest = Base::base64_encode(digest,HMACLength);
|
||||
strcpy(returnData->dateFormatted,date_formatted);
|
||||
return returnData;
|
||||
|
||||
}
|
||||
|
||||
char *Cloud::MD5Sum(const char *ptr, long size)
|
||||
{
|
||||
char *output;
|
||||
std::string local;
|
||||
unsigned char result[MD5_DIGEST_LENGTH];
|
||||
output=(char *)malloc(2*MD5_DIGEST_LENGTH*sizeof(char)+1);
|
||||
MD5((unsigned char*) ptr, size, result);
|
||||
local= Base::base64_encode(result,MD5_DIGEST_LENGTH);
|
||||
strcpy(output,local.c_str());
|
||||
return(output);
|
||||
}
|
||||
|
||||
struct curl_slist *Cloud::BuildHeaderAmzS3v2(const char *Url, const char *TcpPort, const char *PublicKey, struct Cloud::AmzData *Data)
|
||||
{
|
||||
char header_data[1024];
|
||||
struct curl_slist *chunk = NULL;
|
||||
|
||||
// Build the Host: entry
|
||||
|
||||
sprintf(header_data,"Host: %s:%s", Url, TcpPort);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
|
||||
// Build the Date entry
|
||||
|
||||
sprintf(header_data,"Date: %s", Data->dateFormatted);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
|
||||
// Build the Content-Type entry
|
||||
|
||||
sprintf(header_data,"Content-Type:%s", Data->ContentType);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
|
||||
// If ptr is not null we must compute the MD5-Sum as to validate later the ETag
|
||||
// and add the MD5-Content: entry to the header
|
||||
if ( Data->MD5 != NULL )
|
||||
{
|
||||
sprintf(header_data,"Content-MD5: %s", Data->MD5);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
// We don't need it anymore we can free it
|
||||
free((void *)Data->MD5);
|
||||
}
|
||||
|
||||
// build the Auth entry
|
||||
|
||||
sprintf(header_data,"Authorization: AWS %s:%s", PublicKey,
|
||||
Data->digest.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
||||
Cloud::CloudWriter::CloudWriter(const char* Url, const char* AccessKey, const char* SecretKey, const char* TcpPort, const char* Bucket)
|
||||
{
|
||||
struct Cloud::AmzData *RequestData;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
@@ -284,58 +365,31 @@ Cloud::CloudWriter::CloudWriter(const char* Url, const char* AccessKey, const ch
|
||||
this->TcpPort=TcpPort;
|
||||
this->Bucket=Bucket;
|
||||
this->FileName="";
|
||||
// Amazon S3 and Swift require the timezone to be define to GMT.
|
||||
// As to simplify the conversion this is performed through the TZ
|
||||
// environment variable and a call to localtime as to convert output of gettimeofday
|
||||
#if defined(FC_OS_WIN32)
|
||||
_putenv("TZ=GMT");
|
||||
#else
|
||||
setenv("TZ","GMT",1);
|
||||
#endif
|
||||
// We must check that the bucket exists or not. If not, we have to create it.
|
||||
// We must request the bucketlist if we receive a 404 error. This means that it
|
||||
// doesn't exist. The other option is that the content list is empty.
|
||||
// This piece of code is the same as the Reader except we do not interpret it !
|
||||
#if defined(FC_OS_WIN32)
|
||||
#else
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
strftime(date_formatted,256,"%a, %d %b %Y %T %z", tm);
|
||||
#endif
|
||||
|
||||
sprintf(StringToSign,"GET\n\napplication/xml\n%s\n/%s/", date_formatted, this->Bucket);
|
||||
|
||||
// We have to use HMAC encoding and SHA1
|
||||
digest=HMAC(EVP_sha1(),this->SecretKey,strlen(this->SecretKey),
|
||||
(const unsigned char *)&StringToSign,strlen(StringToSign),NULL,NULL);
|
||||
|
||||
char path[1024];
|
||||
sprintf(path,"/%s/", this->Bucket);
|
||||
RequestData = Cloud::ComputeDigestAmzS3v2("GET", "application/xml", path, this->SecretKey, NULL, 0);
|
||||
// Let's build the Header and call to curl
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl = curl_easy_init();
|
||||
if ( curl )
|
||||
{
|
||||
struct curl_slist *chunk = NULL;
|
||||
char header_data[1024];
|
||||
// Let's build our own header
|
||||
struct curl_slist *chunk = NULL;
|
||||
char Url[256];
|
||||
std::string strUrl(this->Url);
|
||||
eraseSubStr(strUrl,"http://");
|
||||
eraseSubStr(strUrl,"https://");
|
||||
|
||||
sprintf(header_data,"Host: %s:%s", strUrl.c_str(),
|
||||
this->TcpPort);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
sprintf(header_data,"Date: %s", date_formatted);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = curl_slist_append(chunk, "Content-Type: application/xml");
|
||||
std::string digest_str;
|
||||
digest_str=Base::base64_encode(digest,strlen((const char *)digest));
|
||||
sprintf(header_data,"Authorization: AWS %s:%s", this->AccessKey,
|
||||
digest_str.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = Cloud::BuildHeaderAmzS3v2( strUrl.c_str(), this->TcpPort, this->AccessKey, RequestData);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
sprintf(header_data,"%s:%s/%s/", this->Url,this->TcpPort,
|
||||
|
||||
// Lets build the Url for our Curl call
|
||||
|
||||
sprintf(Url,"%s:%s/%s/", this->Url,this->TcpPort,
|
||||
this->Bucket);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, header_data);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, Url);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
|
||||
// curl read a file not a memory buffer (it shall be able to do it)
|
||||
@@ -344,7 +398,8 @@ Cloud::CloudWriter::CloudWriter(const char* Url, const char* AccessKey, const ch
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
free( RequestData);
|
||||
// Let's dump temporarly for debug purpose of s3v4 implementation
|
||||
|
||||
std::stringstream input(s);
|
||||
|
||||
@@ -458,11 +513,7 @@ Cloud::CloudReader::~CloudReader()
|
||||
|
||||
Cloud::CloudReader::CloudReader(const char* Url, const char* AccessKey, const char* SecretKey, const char* TcpPort, const char* Bucket)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct tm *tm;
|
||||
char date_formatted[256];
|
||||
char StringToSign[1024];
|
||||
unsigned char *digest;
|
||||
struct Cloud::AmzData *RequestData;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
@@ -475,58 +526,32 @@ Cloud::CloudReader::CloudReader(const char* Url, const char* AccessKey, const ch
|
||||
this->TcpPort=TcpPort;
|
||||
this->Bucket=Bucket;
|
||||
|
||||
// Amazon S3 and Swift require the timezone to be define to
|
||||
// GMT. As to simplify the conversion this is performed through the TZ
|
||||
// environment variable and a call to localtime as to convert output of gettimeofday
|
||||
#if defined(FC_OS_WIN32)
|
||||
_putenv("TZ=GMT");
|
||||
#else
|
||||
setenv("TZ","GMT",1);
|
||||
#endif
|
||||
char path[1024];
|
||||
sprintf(path,"/%s/", this->Bucket);
|
||||
RequestData = Cloud::ComputeDigestAmzS3v2("GET", "application/xml", path, this->SecretKey, NULL, 0);
|
||||
|
||||
// We must get the directory content
|
||||
|
||||
|
||||
#if defined(FC_OS_WIN32)
|
||||
#else
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
strftime(date_formatted,256,"%a, %d %b %Y %T %z", tm);
|
||||
#endif
|
||||
|
||||
sprintf(StringToSign,"GET\n\napplication/xml\n%s\n/%s/", date_formatted, this->Bucket);
|
||||
|
||||
// We have to use HMAC encoding and SHA1
|
||||
digest=HMAC(EVP_sha1(),this->SecretKey,strlen(this->SecretKey),
|
||||
(const unsigned char *)&StringToSign,strlen(StringToSign),NULL,NULL);
|
||||
|
||||
// Let's build the Header and call to curl
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl = curl_easy_init();
|
||||
if ( curl )
|
||||
{
|
||||
// Let's build our own header
|
||||
struct curl_slist *chunk = NULL;
|
||||
char header_data[1024];
|
||||
// Let's build our own header
|
||||
std::string strUrl(this->Url);
|
||||
char Url[256];
|
||||
std::string strUrl(this->Url);
|
||||
eraseSubStr(strUrl,"http://");
|
||||
eraseSubStr(strUrl,"https://");
|
||||
|
||||
sprintf(header_data,"Host: %s:%s", strUrl.c_str(),
|
||||
this->TcpPort);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
sprintf(header_data,"Date: %s", date_formatted);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = curl_slist_append(chunk, "Content-Type: application/xml");
|
||||
std::string digest_str;
|
||||
digest_str=Base::base64_encode(digest,strlen((const char *)digest));
|
||||
sprintf(header_data,"Authorization: AWS %s:%s", this->AccessKey,
|
||||
digest_str.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = Cloud::BuildHeaderAmzS3v2( strUrl.c_str(), this->TcpPort, this->AccessKey, RequestData);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
sprintf(header_data,"%s:%s/%s/", this->Url,this->TcpPort,
|
||||
|
||||
sprintf(Url,"%s:%s/%s/", this->Url,this->TcpPort,
|
||||
this->Bucket);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, header_data);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, Url);
|
||||
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
|
||||
// curl read a file not a memory buffer (it shall be able to do it)
|
||||
@@ -564,31 +589,16 @@ Cloud::CloudReader::CloudReader(const char* Url, const char* AccessKey, const ch
|
||||
|
||||
void Cloud::CloudReader::DownloadFile(Cloud::CloudReader::FileEntry *entry)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct tm *tm;
|
||||
char date_formatted[256];
|
||||
char StringToSign[1024];
|
||||
unsigned char *digest;
|
||||
struct Cloud::AmzData *RequestData;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
std::string s;
|
||||
|
||||
// We must get the directory content
|
||||
|
||||
|
||||
#if defined(FC_OS_WIN32)
|
||||
#else
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
strftime(date_formatted,256,"%a, %d %b %Y %T %z", tm);
|
||||
#endif
|
||||
|
||||
// CHANGEME
|
||||
sprintf(StringToSign,"GET\n\napplication/octet-stream\n%s\n/%s/%s", date_formatted, this->Bucket, entry->FileName);
|
||||
// We have to use HMAC encoding and SHA1
|
||||
digest=HMAC(EVP_sha1(),this->SecretKey,strlen(this->SecretKey),
|
||||
(const unsigned char *)&StringToSign,strlen(StringToSign),NULL,NULL);
|
||||
char path[1024];
|
||||
sprintf(path, "/%s/%s", this->Bucket, entry->FileName);
|
||||
RequestData = Cloud::ComputeDigestAmzS3v2("GET", "application/octet-stream", path, this->SecretKey, NULL, 0);
|
||||
|
||||
// Let's build the Header and call to curl
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
@@ -596,26 +606,20 @@ void Cloud::CloudReader::DownloadFile(Cloud::CloudReader::FileEntry *entry)
|
||||
if ( curl )
|
||||
{
|
||||
struct curl_slist *chunk = NULL;
|
||||
char header_data[1024];
|
||||
char Url[256];
|
||||
// Let's build our own header
|
||||
std::string strUrl(this->Url);
|
||||
eraseSubStr(strUrl,"http://");
|
||||
eraseSubStr(strUrl,"https://");
|
||||
sprintf(header_data,"Host: %s:%s", strUrl.c_str(),
|
||||
this->TcpPort);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
sprintf(header_data,"Date: %s", date_formatted);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = curl_slist_append(chunk, "Content-Type: application/octet-stream");
|
||||
std::string digest_str;
|
||||
digest_str=Base::base64_encode(digest,strlen((const char *)digest));
|
||||
sprintf(header_data,"Authorization: AWS %s:%s", this->AccessKey,
|
||||
digest_str.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
|
||||
chunk = Cloud::BuildHeaderAmzS3v2( strUrl.c_str(), this->TcpPort, this->AccessKey, RequestData);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
sprintf(header_data,"%s:%s/%s/%s", this->Url,this->TcpPort,
|
||||
this->Bucket,entry->FileName);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, header_data);
|
||||
|
||||
sprintf(Url,"%s:%s/%s/%s", this->Url,this->TcpPort,
|
||||
this->Bucket, entry->FileName);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, Url);
|
||||
|
||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
|
||||
@@ -696,31 +700,14 @@ bool Cloud::CloudWriter::shouldWrite(const std::string& , const Base::Persistenc
|
||||
|
||||
void Cloud::CloudWriter::pushCloud(const char *FileName, const char *data, long size)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct tm *tm;
|
||||
char date_formatted[256];
|
||||
char StringToSign[1024];
|
||||
unsigned char *digest;
|
||||
// char my_data[1024]="a que coucou";
|
||||
|
||||
struct Cloud::AmzData *RequestData;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
struct data_buffer curl_buffer;
|
||||
|
||||
struct data_buffer curl_buffer;
|
||||
|
||||
#if defined(FC_OS_WIN32)
|
||||
#else
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = localtime(&tv.tv_sec);
|
||||
strftime(date_formatted,256,"%a, %d %b %Y %T %z", tm);
|
||||
#endif
|
||||
|
||||
// CHANGEME
|
||||
sprintf(StringToSign,"PUT\n\napplication/octet-stream\n%s\n/%s/%s", date_formatted, this->Bucket, FileName);
|
||||
|
||||
// We have to use HMAC encoding and SHA1
|
||||
digest=HMAC(EVP_sha1(),this->SecretKey,strlen(this->SecretKey),
|
||||
(const unsigned char *)&StringToSign,strlen(StringToSign),NULL,NULL);
|
||||
char path[1024];
|
||||
sprintf(path, "/%s/%s", this->Bucket, FileName);
|
||||
RequestData = Cloud::ComputeDigestAmzS3v2("PUT", "application/octet-stream", path, this->SecretKey, data, size);
|
||||
|
||||
// Let's build the Header and call to curl
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
@@ -728,28 +715,26 @@ void Cloud::CloudWriter::pushCloud(const char *FileName, const char *data, long
|
||||
if ( curl )
|
||||
{
|
||||
struct curl_slist *chunk = NULL;
|
||||
char header_data[1024];
|
||||
char Url[256];
|
||||
// Let's build our own header
|
||||
std::string strUrl(this->Url);
|
||||
eraseSubStr(strUrl,"http://");
|
||||
eraseSubStr(strUrl,"https://");
|
||||
|
||||
sprintf(header_data,"Host: %s:%s", strUrl.c_str(),
|
||||
this->TcpPort);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
sprintf(header_data,"Date: %s", date_formatted);
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
chunk = curl_slist_append(chunk, "Content-Type: application/octet-stream");
|
||||
std::string digest_str;
|
||||
digest_str=Base::base64_encode(digest,strlen((const char *)digest));
|
||||
sprintf(header_data,"Authorization: AWS %s:%s", this->AccessKey,
|
||||
digest_str.c_str());
|
||||
chunk = curl_slist_append(chunk, header_data);
|
||||
|
||||
|
||||
chunk = Cloud::BuildHeaderAmzS3v2( strUrl.c_str(), this->TcpPort, this->AccessKey, RequestData);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
sprintf(header_data,"%s:%s/%s/%s", this->Url,this->TcpPort,
|
||||
|
||||
// Lets build the Url for our Curl call
|
||||
|
||||
sprintf(Url,"%s:%s/%s/%s", this->Url,this->TcpPort,
|
||||
this->Bucket,FileName);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, header_data);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, Url);
|
||||
|
||||
|
||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
|
||||
// curl read a file not a memory buffer (it shall be able to do it)
|
||||
|
||||
@@ -47,8 +47,19 @@ XERCES_CPP_NAMESPACE_END
|
||||
|
||||
namespace Cloud {
|
||||
|
||||
struct AmzData {
|
||||
std::string digest;
|
||||
char dateFormatted[256];
|
||||
char ContentType[256];
|
||||
char Host[256];
|
||||
char *MD5;
|
||||
};
|
||||
|
||||
void eraseSubStr(std::string & Str, const std::string & toErase);
|
||||
size_t CurlWrite_CallbackFunc_StdString(void *contents, size_t size, size_t nmemb, std::string *s);
|
||||
struct AmzData *ComputeDigestAmzS3v2(char *operation, char *data_type, const char *target, const char *Secret, const char *ptr, long size);
|
||||
struct curl_slist *BuildHeaderAmzS3v2(const char *Url, const char *TcpPort, const char *PublicKey, struct AmzData *Data);
|
||||
char *MD5Sum(const char *ptr, long size);
|
||||
|
||||
class CloudAppExport CloudReader
|
||||
{
|
||||
|
||||
@@ -31,10 +31,16 @@ Base::Vector3d toVector3d(const double* a)
|
||||
|
||||
CDxfWrite::CDxfWrite(const char* filepath) :
|
||||
//TODO: these should probably be parms in config file
|
||||
m_entityHandle(0x300),
|
||||
m_layerHandle(0x30),
|
||||
m_blockHandle(0x210),
|
||||
m_blkRecordHandle(0x110),
|
||||
//handles:
|
||||
//boilerplate 0 - A00
|
||||
//used by dxf.cpp A01 - FFFE
|
||||
//ACAD HANDSEED FFFF
|
||||
|
||||
m_handle(0xA00), //room for 2560 handles in boilerplate files
|
||||
//m_entityHandle(0x300), //don't need special ranges for handles
|
||||
//m_layerHandle(0x30),
|
||||
//m_blockHandle(0x210),
|
||||
//m_blkRecordHandle(0x110),
|
||||
m_polyOverride(false),
|
||||
m_layerName("none")
|
||||
{
|
||||
@@ -435,40 +441,53 @@ std::string CDxfWrite::getPlateFile(std::string fileSpec)
|
||||
return outString.str();
|
||||
}
|
||||
|
||||
std::string CDxfWrite::getEntityHandle(void)
|
||||
std::string CDxfWrite::getHandle(void)
|
||||
{
|
||||
m_entityHandle++;
|
||||
m_handle++;
|
||||
std::stringstream ss;
|
||||
ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
ss << m_entityHandle;
|
||||
ss << m_handle;
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
std::string CDxfWrite::getEntityHandle(void)
|
||||
{
|
||||
return getHandle();
|
||||
// m_entityHandle++;
|
||||
// std::stringstream ss;
|
||||
// ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
// ss << m_entityHandle;
|
||||
// return ss.str();
|
||||
}
|
||||
|
||||
std::string CDxfWrite::getLayerHandle(void)
|
||||
{
|
||||
m_layerHandle++;
|
||||
std::stringstream ss;
|
||||
ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
ss << m_layerHandle;
|
||||
return ss.str();
|
||||
return getHandle();
|
||||
// m_layerHandle++;
|
||||
// std::stringstream ss;
|
||||
// ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
// ss << m_layerHandle;
|
||||
// return ss.str();
|
||||
}
|
||||
|
||||
std::string CDxfWrite::getBlockHandle(void)
|
||||
{
|
||||
m_blockHandle++;
|
||||
std::stringstream ss;
|
||||
ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
ss << m_blockHandle;
|
||||
return ss.str();
|
||||
return getHandle();
|
||||
// m_blockHandle++;
|
||||
// std::stringstream ss;
|
||||
// ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
// ss << m_blockHandle;
|
||||
// return ss.str();
|
||||
}
|
||||
|
||||
std::string CDxfWrite::getBlkRecordHandle(void)
|
||||
{
|
||||
m_blkRecordHandle++;
|
||||
std::stringstream ss;
|
||||
ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
ss << m_blkRecordHandle;
|
||||
return ss.str();
|
||||
return getHandle();
|
||||
// m_blkRecordHandle++;
|
||||
// std::stringstream ss;
|
||||
// ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2);
|
||||
// ss << m_blkRecordHandle;
|
||||
// return ss.str();
|
||||
}
|
||||
|
||||
void CDxfWrite::addBlockName(std::string b, std::string h)
|
||||
|
||||
@@ -145,6 +145,7 @@ protected:
|
||||
//! copy boiler plate file
|
||||
std::string getPlateFile(std::string fileSpec);
|
||||
void setDataDir(std::string s) { m_dataDir = s; }
|
||||
std::string getHandle(void);
|
||||
std::string getEntityHandle(void);
|
||||
std::string getLayerHandle(void);
|
||||
std::string getBlockHandle(void);
|
||||
@@ -152,6 +153,7 @@ protected:
|
||||
|
||||
std::string m_optionSource;
|
||||
int m_version;
|
||||
int m_handle;
|
||||
int m_entityHandle;
|
||||
int m_layerHandle;
|
||||
int m_blockHandle;
|
||||
|
||||
@@ -31,8 +31,24 @@ $CMLSTYLE
|
||||
2
|
||||
STANDARD
|
||||
9
|
||||
$PEXTMAX
|
||||
10
|
||||
50
|
||||
20
|
||||
50
|
||||
30
|
||||
50
|
||||
9
|
||||
$PEXTMIN
|
||||
10
|
||||
0
|
||||
20
|
||||
0
|
||||
30
|
||||
0
|
||||
9
|
||||
$HANDSEED
|
||||
5
|
||||
FFF
|
||||
FFFF
|
||||
0
|
||||
ENDSEC
|
||||
|
||||
@@ -5,7 +5,7 @@ OBJECTS
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
500
|
||||
F000
|
||||
330
|
||||
0
|
||||
100
|
||||
@@ -13,13 +13,13 @@ AcDbDictionary
|
||||
3
|
||||
ACAD_GROUP
|
||||
350
|
||||
501
|
||||
F001
|
||||
0
|
||||
DICTIONARY
|
||||
5
|
||||
501
|
||||
F001
|
||||
330
|
||||
500
|
||||
F000
|
||||
100
|
||||
AcDbDictionary
|
||||
0
|
||||
|
||||
@@ -3,7 +3,7 @@ TABLE
|
||||
2
|
||||
STYLE
|
||||
5
|
||||
60
|
||||
70
|
||||
330
|
||||
0
|
||||
100
|
||||
@@ -13,9 +13,9 @@ AcDbSymbolTable
|
||||
0
|
||||
STYLE
|
||||
5
|
||||
61
|
||||
71
|
||||
330
|
||||
60
|
||||
70
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
@@ -41,9 +41,9 @@ arial.ttf
|
||||
0
|
||||
STYLE
|
||||
5
|
||||
62
|
||||
72
|
||||
330
|
||||
60
|
||||
70
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
@@ -73,7 +73,7 @@ TABLE
|
||||
2
|
||||
VIEW
|
||||
5
|
||||
63
|
||||
73
|
||||
330
|
||||
0
|
||||
100
|
||||
@@ -87,7 +87,7 @@ TABLE
|
||||
2
|
||||
UCS
|
||||
5
|
||||
64
|
||||
74
|
||||
330
|
||||
0
|
||||
100
|
||||
@@ -101,7 +101,7 @@ TABLE
|
||||
2
|
||||
APPID
|
||||
5
|
||||
65
|
||||
75
|
||||
330
|
||||
0
|
||||
100
|
||||
@@ -111,9 +111,9 @@ AcDbSymbolTable
|
||||
0
|
||||
APPID
|
||||
5
|
||||
66
|
||||
76
|
||||
330
|
||||
65
|
||||
75
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
@@ -125,9 +125,9 @@ ACAD
|
||||
0
|
||||
APPID
|
||||
5
|
||||
67
|
||||
77
|
||||
330
|
||||
65
|
||||
75
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
@@ -143,7 +143,7 @@ TABLE
|
||||
2
|
||||
DIMSTYLE
|
||||
5
|
||||
68
|
||||
78
|
||||
330
|
||||
0
|
||||
100
|
||||
@@ -153,9 +153,9 @@ AcDbSymbolTable
|
||||
0
|
||||
DIMSTYLE
|
||||
105
|
||||
69
|
||||
79
|
||||
330
|
||||
68
|
||||
78
|
||||
100
|
||||
AcDbSymbolTableRecord
|
||||
100
|
||||
@@ -253,7 +253,7 @@ STANDARD
|
||||
274
|
||||
3
|
||||
340
|
||||
61
|
||||
71
|
||||
275
|
||||
0
|
||||
280
|
||||
|
||||
@@ -38,9 +38,11 @@ class OpenSCADWorkbench ( Workbench ):
|
||||
def __init__(self):
|
||||
self.__class__.Icon = FreeCAD.getResourceDir() + "Mod/OpenSCAD/Resources/icons/OpenSCADWorkbench.svg"
|
||||
self.__class__.MenuText = "OpenSCAD"
|
||||
self.__class__.ToolTip = "OpenSCAD is an application for creating solid 3D CAD." + '\n' +
|
||||
"FreeCAD utizes OpenSCAD's capability as a script-only based modeller that uses its own description language" + '\n' +
|
||||
"Note: the Mesh workbench heavily uses the boolean operations of this workbench because they are quite robust"
|
||||
self.__class__.ToolTip = (
|
||||
"OpenSCAD is an application for creating solid 3D CAD.\n"
|
||||
"FreeCAD utizes OpenSCAD's capability as a script-only based modeller that uses its own description language\n"
|
||||
"Note: the Mesh workbench heavily uses the boolean operations of this workbench because they are quite robust"
|
||||
)
|
||||
|
||||
def Initialize(self):
|
||||
def QT_TRANSLATE_NOOP(scope, text):
|
||||
|
||||
@@ -538,21 +538,26 @@ void QGIViewDimension::updateDim()
|
||||
if ( vp == nullptr ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// QString labelText = QString::fromUtf8(dim->getFormatedValue().c_str());
|
||||
//want this split into value and unit
|
||||
QString labelText = QString::fromUtf8(dim->getFormatedValue(1).c_str()); //just the number
|
||||
QString unitText = QString::fromUtf8(dim->getFormatedValue(2).c_str()); //just the unit
|
||||
|
||||
QString arbText = QString::fromUtf8(dim->FormatSpec.getValue());
|
||||
|
||||
QFont font = datumLabel->getFont();
|
||||
font.setFamily(QString::fromUtf8(vp->Font.getValue()));
|
||||
font.setPixelSize(calculateFontPixelSize(vp->Fontsize.getValue()));
|
||||
datumLabel->setFont(font);
|
||||
|
||||
prepareGeometryChange();
|
||||
datumLabel->setDimString(labelText);
|
||||
datumLabel->setTolString();
|
||||
datumLabel->setUnitString(unitText);
|
||||
if (dim->Arbitrary.getValue()) {
|
||||
datumLabel->setDimString(arbText);
|
||||
} else {
|
||||
datumLabel->setDimString(labelText);
|
||||
datumLabel->setTolString();
|
||||
datumLabel->setUnitString(unitText);
|
||||
}
|
||||
datumLabel->setPosFromCenter(datumLabel->X(),datumLabel->Y());
|
||||
|
||||
datumLabel->setFramed(dim->TheoreticalExact.getValue());
|
||||
|
||||
@@ -113,8 +113,8 @@ class ParameterTestCase(unittest.TestCase):
|
||||
self.failUnless(self.TestPar.HasGroup("44"),"Test on created group failed")
|
||||
# check on Deletion
|
||||
self.TestPar.RemGroup("44")
|
||||
self.failUnless(not self.TestPar.HasGroup("44"),"Test on delete group failed")
|
||||
Temp =0
|
||||
self.failUnless(self.TestPar.HasGroup("44"),"A referenced group must not be deleted")
|
||||
Temp = 0
|
||||
|
||||
#check on special conditions
|
||||
def testInt(self):
|
||||
|
||||
@@ -20,14 +20,14 @@ To build the installer you can do the following:
|
||||
(You can alternatively get nsProcess from https://nsis.sourceforge.io/NsProcess_plugin)
|
||||
7. Copy all FreeCAD files to the folder "~\FreeCAD"
|
||||
e.g. "C:\FreeCAD\Installer\FreeCAD"
|
||||
8. If you use compiled FreeCAD using another MSVC version than MSVC 2015, copy
|
||||
8. If you use compiled FreeCAD using another MSVC version than MSVC 2017, copy
|
||||
its distributable DLLs to the folder FILES_DEPS (see step 2).
|
||||
9. Right-click on the file FreeCAD-installer.nsi and choose "Compile NSIS script"
|
||||
to compile the installer
|
||||
10. The folder ~\MSVCRedist contains already all MSVC 2015 redistributable DLLs necessary
|
||||
for FreeCAD. If another MSVC version was used to compile FreeCAD, replace the DLLs by
|
||||
10. The folder ~\MSVCRedist contains already all MSVC 2017 x64 redistributable DLLs necessary
|
||||
for FreeCAD 0.19dev. If another MSVC version was used to compile FreeCAD, replace the DLLs by
|
||||
the ones of the used MSVC. (They are usually available in the folder
|
||||
C:\Program Files (x86)\MSVC2xxx\VC\redist)
|
||||
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC)
|
||||
|
||||
For test builds of the installer you can turn off the compression. This speeds up
|
||||
the build time for the installer a lot but increases its file size. The compression
|
||||
|
||||
@@ -16,11 +16,12 @@ SetCompressor /SOLID lzma
|
||||
# Version number
|
||||
|
||||
!define APP_VERSION_MAJOR 0
|
||||
!define APP_VERSION_MINOR 18
|
||||
!define APP_VERSION_MINOR 19
|
||||
!define APP_VERSION_REVISION 0
|
||||
!define APP_VERSION_EMERGENCY "" # use "1" for an emergency release of FreeCAD otherwise ""
|
||||
!define APP_VERSION_EMERGENCY "rev18542" # use "1" for an emergency release of FreeCAD otherwise ""
|
||||
# alternatively you can use APP_VERSION_EMERGENCY for a custom suffix of the version number
|
||||
!define APP_EMERGENCY_DOT "" # use "." for an emergency release of FreeCAD otherwise ""
|
||||
!define APP_VERSION_BUILD 10 # Start with 1 for the installer releases of each version
|
||||
!define APP_VERSION_BUILD 1 # Start with 1 for the installer releases of each version
|
||||
|
||||
!define APP_VERSION "${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}.${APP_VERSION_REVISION}${APP_EMERGENCY_DOT}${APP_VERSION_EMERGENCY}" # Version to display
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
declaration.nsh
|
||||
|
||||
Configuration and variables of FreeCAD installer
|
||||
@@ -32,8 +32,8 @@ Configuration and variables of FreeCAD installer
|
||||
!define APP_WIKI_INFO "${APP_NAME} Wiki"
|
||||
!define APP_COPYRIGHT "${APP_NAME} is Copyright © 2001-${COPYRIGHT_YEAR} by the ${APP_NAME} Team"
|
||||
|
||||
!define APP_RUN "bin\FreeCAD.exe"
|
||||
!define BIN_FREECAD "FreeCAD.exe"
|
||||
!define APP_RUN "bin\${APP_NAME}.exe"
|
||||
!define BIN_FREECAD "${APP_NAME}.exe"
|
||||
|
||||
!define APP_REGKEY "Software\${APP_NAME}${APP_SERIES_KEY}" # like "FreeCAD0180"
|
||||
!define APP_REGKEY_SETUP "${APP_REGKEY}\Setup"
|
||||
|
||||
@@ -130,7 +130,10 @@ Function .onInit
|
||||
${endif}
|
||||
${next}
|
||||
|
||||
${if} $OldVersionNumber > ${APP_SERIES_KEY}
|
||||
# NSIS cannot handle numbers with leading zero, thus cut it off before comparing
|
||||
StrCpy $1 $OldVersionNumber "" 1
|
||||
StrCpy $2 ${APP_SERIES_KEY} "" 1
|
||||
${if} $1 > $2
|
||||
# store the version number and reformat it temporarily for the error message
|
||||
StrCpy $R0 $OldVersionNumber
|
||||
StrCpy $OldVersionNumber $R5
|
||||
|
||||
@@ -43,7 +43,7 @@ Section -InstallData
|
||||
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "UninstallString" '"$INSTDIR\${SETUP_UNINSTALLER}"'
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "DisplayVersion" "${APP_VERSION}"
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "DisplayIcon" "$INSTDIR\bin\FreeCAD.exe"
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "DisplayIcon" "$INSTDIR\bin\${APP_NAME}.exe"
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "URLUpdateInfo" "${APP_WEBPAGE}"
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "URLInfoAbout" "https://www.freecadweb.org/"
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "Publisher" "${APP_NAME} Team"
|
||||
@@ -53,10 +53,15 @@ Section -InstallData
|
||||
WriteRegStr SHCTX ${APP_UNINST_KEY} "StartMenu" "$SMPROGRAMS\$StartmenuFolder"
|
||||
|
||||
# if we install over an older existing version, remove the old uninstaller information
|
||||
${if} $OldVersionNumber < ${APP_SERIES_KEY}
|
||||
# NSIS cannot handle numbers with leading zero, thus cut it off before comparing
|
||||
StrCpy $1 $OldVersionNumber "" 1
|
||||
StrCpy $2 ${APP_SERIES_KEY} "" 1
|
||||
${if} $1 < $2
|
||||
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}$OldVersionNumber"
|
||||
DeleteRegKey SHCTX "SOFTWARE\${APP_NAME}$OldVersionNumber"
|
||||
# also delete in the case of an emergency release
|
||||
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}$OldVersionNumber1"
|
||||
DeleteRegKey SHCTX "SOFTWARE\${APP_NAME}$OldVersionNumber1"
|
||||
${endif}
|
||||
|
||||
SectionEnd
|
||||
|
||||
@@ -15,7 +15,7 @@ Section -ProgramFiles SecProgramFiles
|
||||
# be installed directly to C:\programs - the uninstaller will then delete the whole
|
||||
# C:\programs directory
|
||||
StrCpy $String $INSTDIR
|
||||
StrCpy $Search "FreeCAD"
|
||||
StrCpy $Search ${APP_NAME}
|
||||
Call StrPoint # function from Utils.nsh
|
||||
${if} $Pointer == "-1"
|
||||
StrCpy $INSTDIR "$INSTDIR\${APP_DIR}"
|
||||
@@ -43,6 +43,7 @@ Section -ProgramFiles SecProgramFiles
|
||||
File /r "${FILES_FREECAD}\Ext"
|
||||
File /r "${FILES_FREECAD}\lib"
|
||||
File /r "${FILES_FREECAD}\Mod"
|
||||
File /r "${FILES_FREECAD}\resources"
|
||||
|
||||
# Create uninstaller
|
||||
WriteUninstaller "$INSTDIR\${SETUP_UNINSTALLER}"
|
||||
|
||||
Reference in New Issue
Block a user