51#include <wx/xml/xml.h>
52#include <wx/wfstream.h>
53#include <wx/sstream.h>
54#include <wx/mstream.h>
55#include <wx/protocol/http.h>
88 return(
Assign(MetaData) );
101 return(
Load(File, Extension) );
114 return(
Load(Stream) );
126void CSG_MetaData::_On_Construction(
void)
146 delete(m_pChildren[i]);
149 m_Children.Destroy();
156 m_Prop_Names .Clear();
157 m_Prop_Values.Clear();
198 return(
Ins_Child(MetaData, -1, bAddChildren) );
209 if( !m_Children.Inc_Array() )
223 pChildren[i] = pChildren[i - 1];
236 pChild->m_Name = Name;
237 pChild->m_Content = Content;
269 pChild->
Assign(MetaData, bAddChildren);
289 if( from_Index != to_Index )
294 if( from_Index < to_Index )
296 for(
int i=from_Index; i<to_Index; i++)
298 pChildren[i] = pChildren[i + 1];
303 for(
int i=from_Index; i>to_Index; i--)
305 pChildren[i] = pChildren[i - 1];
309 pChildren[to_Index] = pChild;
327 delete(pChildren[Index]);
331 pChildren[i] = pChildren[j];
334 m_Children.Dec_Array();
345 if( Name.
Find(
'.') > 0 )
361 if( &MetaData !=
this )
387 else if( Name && *Name )
419 m_Children.Destroy();
428 if( Name.
Find(
'.') > 0 )
444 if( JSON_Pointer.
Find(
'/') > 0 )
465int CSG_MetaData::_Get_Child(
const CSG_String &Name)
const
486 return( bNoCase ? !m_Name.CmpNoCase(String) : !m_Name.Cmp(String) );
535 wxString s; va_list argptr;
538 wxString _Format(Format); _Format.Replace(
"%s",
"%ls");
539 va_start(argptr, _Format);
540 s.PrintfV(_Format, argptr);
542 va_start(argptr, Format);
543 s.PrintfV(Format, argptr);
554 wxString s; va_list argptr;
557 wxString _Format(Format); _Format.Replace(
"%s",
"%ls");
558 va_start(argptr, _Format);
559 s.PrintfV(_Format, argptr);
561 va_start(argptr, Format);
562 s.PrintfV(Format, argptr);
573 return( bNoCase ? !m_Content.CmpNoCase(String) : !m_Content.Cmp(String) );
584 if( !Value.
is_Empty() &&_Get_Property(Name) < 0 )
586 m_Prop_Names .Add(Name );
587 m_Prop_Values.Add(Value);
628 m_Prop_Names .Del(i);
629 m_Prop_Values.Del(i);
640 int Index = _Get_Property(Name);
644 m_Prop_Values[Index] = Value;
648 else if( bAddIfNotExists )
650 m_Prop_Names .Add(Name);
651 m_Prop_Values.Add(Value);
702int CSG_MetaData::_Get_Property(
const CSG_String &Name)
const
704 for(
int i=0; i<m_Prop_Names.
Get_Count(); i++)
706 if( Name.
CmpNoCase(m_Prop_Names[i]) == 0 )
734 wxXmlDocument XML; wxXmlNode *pRoot =
new wxXmlNode(NULL, wxXML_ELEMENT_NODE,
Get_Name().c_str());
740 wxStringOutputStream Stream;
744 s = &Stream.GetString();
782 if( &MetaData !=
this )
814 if( File.
Find(
"http://") == 0 )
838 if( XML.Load(_File.
c_str()) )
869 m_Name = pNode->GetName ().wc_str();
870 m_Content = pNode->GetNodeContent().wc_str();
873 wxXmlAttribute *pProperty = pNode->GetAttributes();
877 Add_Property(&pProperty->GetName(), &pProperty->GetValue());
879 pProperty = pProperty->GetNext();
883 wxXmlNode *pChild = pNode->GetChildren();
887 if( pChild->GetType() != wxXML_TEXT_NODE )
892 pChild = pChild->GetNext();
906 wxXmlDocument XML; wxXmlNode *pRoot =
new wxXmlNode(NULL, wxXML_ELEMENT_NODE,
Get_Name().c_str());
923 wxXmlDocument XML; wxXmlNode *pRoot =
new wxXmlNode(NULL, wxXML_ELEMENT_NODE,
Get_Name().c_str());
942 pNode->SetName(Name.
c_str());
948 wxXmlNode *pChild =
new wxXmlNode(pNode, wxXML_TEXT_NODE,
SG_T(
"TEXT"));
978 wxXmlDocument XML; wxMemoryInputStream Stream((
const void *)_XML,
Length);
980#if wxCHECK_VERSION(3, 3, 0)
981 if( XML.Load(Stream) )
983 if( XML.Load(Stream, Encoding) )
999 wxXmlDocument XML; wxMemoryInputStream Stream((
const void *)_XML.
c_str(),
sizeof(
SG_Char) * _XML.
Length());
1001 if( XML.Load(Stream) )
1003 Load(XML.GetRoot());
1014 wxXmlDocument XML; wxXmlNode *pRoot =
new wxXmlNode(NULL, wxXML_ELEMENT_NODE,
Get_Name().c_str());
1020 wxMemoryOutputStream Stream;
1022 if( XML.Save(Stream) )
1024 CSG_Array s(
sizeof(
char), Stream.GetSize());
1049 if( Username && *Username ) { HTTP.SetUser (Username); }
1050 if( Password && *Password ) { HTTP.SetPassword(Password); }
1052 wxString s = Server.
c_str();
1054 if( s.Find(
"http://") == 0 )
1056 s = s.Right(s.Length() - wxString(
"http://").
Length());
1059 if( !HTTP.Connect(s) )
1072 wxInputStream *pStream = HTTP.GetInputStream(s);
1081 if( XML.Load(*pStream) )
1083 Load(XML.GetRoot());
1134 picojson::value root;
1135 std::string err = picojson::parse(root,
JSON.b_str());
1142 _JSON_To_MetaData(root,
this);
1209void CSG_MetaData::_JSON_To_MetaData(
const picojson::value &j,
CSG_MetaData *pNode)
1211 if( j.is<picojson::object>() )
1213 const picojson::object &obj = j.get<picojson::object>();
1215 for(
auto it = obj.begin(); it != obj.end(); ++it )
1218 _JSON_To_MetaData(it->second, pChild);
1222 else if( j.is<picojson::array>() )
1224 const picojson::array &arr = j.get<picojson::array>();
1228 for(
size_t i = 0; i < arr.size(); ++i )
1231 _JSON_To_MetaData(arr[i], pItem);
1237 if( j.is<std::string>() )
1242 else if( j.is<
double>() )
1248 else if( j.is<
bool>() )
1250 pNode->
Set_Content(j.get<
bool>() ?
"true" :
"false");
1267 for(
size_t i=0; i<s.
Length(); ++i)
1271 case '\"': out +=
"\\\"";
break;
1272 case '\\': out +=
"\\\\";
break;
1273 case '\b': out +=
"\\b" ;
break;
1274 case '\f': out +=
"\\f" ;
break;
1275 case '\n': out +=
"\\n" ;
break;
1276 case '\r': out +=
"\\r" ;
break;
1277 case '\t': out +=
"\\t" ;
break;
1278 default: out += s[i] ;
break;
1307 Create(Server, User, Password);
1314 m_pHTTP =
new wxHTTP;
1316 if( !User .is_Empty() ) { m_pHTTP->SetUser (User .wx_str()); }
1317 if( !Password.
is_Empty() ) { m_pHTTP->SetPassword(Password.
wx_str()); }
1319 wxString Host= Server.
wx_str();
unsigned short Port = 80;
1321 #define SERVER_TRIM(s, p) { wxString sp(p); sp += "://"; if( s.Find(p) == 0 ) { s = s.Right(s.Length() - sp.Length()); } }
1326 if( Host.Find(
":") >= 0 )
1330 if( Host.AfterLast(
':').ToLong(&_Port) )
1332 Port = (
unsigned short)_Port;
1335 Host = Host.BeforeLast(
':');
1338 if( !m_pHTTP->Connect(Host, Port) )
1367wxInputStream * CSG_HTTP::_Request(
const CSG_String &Request)
1371 wxString s(
Request.c_str());
if( s[0] !=
'/' ) { s.
Prepend(
"/"); }
1373 wxInputStream *pStream = m_pHTTP->GetInputStream(s);
1377 if( pStream->CanRead() )
1392 wxInputStream *pStream = _Request(
Request);
if( !pStream ) {
return(
false ); }
1396 if( !XML.Load(*pStream) )
1413 wxInputStream *pStream = _Request(
Request);
if( !pStream ) {
return(
false ); }
1417 while( pStream->CanRead() )
1419 char Byte; pStream->Read(&Byte,
sizeof(Byte)); Answer += Byte;
1430 wxInputStream *pStream = _Request(
Request);
if( !pStream ) {
return(
false ); }
1434 while( pStream->CanRead() )
1436 char Byte; pStream->Read(&Byte,
sizeof(Byte)); Answer += Byte;
1447 wxInputStream *pStream = _Request(
Request);
if( !pStream ) {
return(
false ); }
1449 wxFileOutputStream *pFile =
new wxFileOutputStream(File);
1458 pFile->Write(*pStream);
1473#include <wx/protocol/ftp.h>
1480 if( _Source.
Find(
"ftp://") == 0 )
1492 if( !User .is_Empty() ) { ftp.SetUser (User .wx_str()); }
1493 if( !Password.
is_Empty() ) { ftp.SetPassword(Password.
wx_str()); }
1495 if( !ftp.Connect(ftpHost.
c_str(), Port) )
1516 if( ftp.GetFileSize(ftpFile.
c_str()) == -1 )
1525 wxInputStream *pStream = ftp.GetInputStream(ftpFile.
c_str());
1538 wxFileOutputStream *pFile =
new wxFileOutputStream(
SG_File_Make_Path(Target_Directory, ftpFile).c_str());
1553 pFile->Write(*pStream);
1584 Create(Server, User, Password);
1595 #if !wxCHECK_VERSION(3, 3, 0)
1596 m_User = User; m_Password = Password;
1598 wxURI URI; URI.SetUserAndPassword(User.
wx_str(), Password.
wx_str());
1600 m_User = URI.GetUser().
wx_str(); m_Password = URI.GetPassword().wx_str();
1610 m_Server.
Clear(); m_User.Clear(), m_Password.Clear();
1621#if !wxCHECK_VERSION(3, 3, 0)
1642#include <wx/webrequest.h>
1649 wxWebSessionSync::GetDefault().SetBaseURL(Server.
wx_str());
1654 auto request = wxWebSessionSync::GetDefault().CreateRequest(URL.
wx_str());
1656 #if wxCHECK_VERSION(3, 3, 2)
1659 request.UseBasicAuth(wxWebCredentials(User.
wx_str(), wxSecretValue(Password.
wx_str())));
1667static bool _Response_to_Bytes(
const wxWebResponse &Response,
CSG_Bytes &Answer)
1669 wxInputStream *pStream = Response.GetStream();
1671 if( pStream->IsOk() )
1673 int Byte = pStream->GetC();
1675 while( Byte != wxEOF )
1677 Answer += (BYTE)Byte;
1679 Byte = pStream->GetC();
1689static bool _Response_to_MetaData(
const wxWebResponse &Response,
CSG_MetaData &Answer)
1691 wxString MimeType = Response.GetMimeType();
1694 if( MimeType.Contains(
"xml") )
1698 if( XML.Load(*Response.GetStream()) )
1700 Answer.
Load(XML.GetRoot());
1705 else if( MimeType.Contains(
"json") )
1714static bool _Response_to_String(
const wxWebResponse &Response,
CSG_String &Answer)
1716 Answer = Response.AsString().
wx_str();
1722static bool _Response_to_File(
const wxWebResponse &Response,
const SG_Char *File)
1724 wxFileOutputStream Output(File);
1728 Output.Write(*Response.GetStream());
1744 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1745 if( !request.Execute() ) {
return(
false ); }
1748 return( _Response_to_Bytes(request.GetResponse(), Answer) );
1754 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1755 if( !request.Execute() ) {
return(
false ); }
1758 return( _Response_to_MetaData(request.GetResponse(), Answer) );
1764 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1765 if( !request.Execute() ) {
return(
false ); }
1768 return( _Response_to_String(request.GetResponse(), Answer) );
1774 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1775 if( !request.Execute() ) {
return(
false ); }
1778 return( _Response_to_File(request.GetResponse(), File) );
1789 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1790 request.SetMethod(
"POST");
1792 if( !request.Execute() ) {
return false; }
1795 return( _Response_to_Bytes(request.GetResponse(), Answer) );
1801 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1802 request.SetMethod(
"POST");
1804 if( !request.Execute() ) {
return false; }
1807 return( _Response_to_MetaData(request.GetResponse(), Answer) );
1813 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1814 request.SetMethod(
"POST");
1816 if( !request.Execute() ) {
return false; }
1819 return( _Response_to_String(request.GetResponse(), Answer) );
1825 auto request = _Create_Request(m_Server, m_User, m_Password,
Request);
1826 request.SetMethod(
"POST");
1828 if( !request.Execute() ) {
return false; }
1831 return( _Response_to_File(request.GetResponse(), File) );
1842 auto request = _Create_Request(Server,
"",
"",
Request);
1843 if( !request.Execute() ) {
return(
false ); }
1846 return( _Response_to_Bytes(request.GetResponse(), Answer) );
1852 auto request = _Create_Request(Server,
"",
"",
Request);
1853 if( !request.Execute() ) {
return(
false ); }
1856 return( _Response_to_MetaData(request.GetResponse(), Answer) );
1862 auto request = _Create_Request(Server,
"",
"",
Request);
1863 if( !request.Execute() ) {
return(
false ); }
1866 return( _Response_to_String(request.GetResponse(), Answer) );
1873 auto request = _Create_Request(Server,
"",
"",
Request);
1874 if( !request.Execute() ) {
return(
false ); }
1877 return( _Response_to_File(request.GetResponse(), File) );
1888 auto request = _Create_Request(Server,
"",
"",
Request);
1889 request.SetMethod(
"POST");
1891 if( !request.Execute() ) {
return false; }
1894 return( _Response_to_Bytes(request.GetResponse(), Answer) );
1901 auto request = _Create_Request(Server,
"",
"",
Request);
1902 request.SetMethod(
"POST");
1904 if( !request.Execute() ) {
return false; }
1907 return( _Response_to_MetaData(request.GetResponse(), Answer) );
1913 auto request = _Create_Request(Server,
"",
"",
Request);
1914 request.SetMethod(
"POST");
1916 if( !request.Execute() ) {
return false; }
1919 return( _Response_to_String(request.GetResponse(), Answer) );
1925 auto request = _Create_Request(Server,
"",
"",
Request);
1926 request.SetMethod(
"POST");
1928 if( !request.Execute() ) {
return false; }
1931 return( _Response_to_File(request.GetResponse(), File) );
void SG_UI_Msg_Add_Error(const char *Message)
SAGA_API_DLL_EXPORT bool SG_File_Exists(const CSG_String &FileName)
SAGA_API_DLL_EXPORT bool SG_File_Cmp_Extension(const CSG_String &File, const CSG_String &Extension)
SAGA_API_DLL_EXPORT CSG_String SG_File_Make_Path(const CSG_String &Directory, const CSG_String &Name)
SAGA_API_DLL_EXPORT CSG_String SG_Get_String(double Value, int Precision=-99)
void * Get_Array(void) const
sLong Get_Size(void) const
virtual bool Open(const SG_Char *FileName, int Mode=SG_FILE_R, bool bBinary=true, int Encoding=SG_FILE_ENCODING_ANSI)
size_t Write(void *Buffer, size_t Size, size_t Count=1) const
size_t Read(void *Buffer, size_t Size, size_t Count=1) const
class wxStreamBase * Get_Stream(void) const
bool is_Writing(void) const
bool is_Reading(void) const
bool is_Connected(void) const
bool Request(const CSG_String &Request, CSG_Bytes &Answer)
size_t Length(void) const
CSG_String AfterFirst(char Character) const
bool asInt(int &Value) const
int CmpNoCase(const CSG_String &String) const
CSG_String AfterLast(char Character) const
int Cmp(const CSG_String &String) const
CSG_String BeforeFirst(char Character) const
size_t Replace(const CSG_String &Old, const CSG_String &New, bool bReplaceAll=true)
CSG_String BeforeLast(char Character) const
static CSG_String Format(const char *Format,...)
int Trim(bool fromRight=false)
int Find(char Character, bool fromEnd=false) const
bool asDouble(double &Value) const
CSG_String Right(size_t count) const
const SG_Char * c_str(void) const
bool is_Empty(void) const
const class wxString & wx_str(void) const
CSG_String & Prepend(const CSG_String &String)
sLong asLongLong(void) const
int Get_Count(void) const
bool Set_Value(int Field, const CSG_String &Value)
virtual CSG_Table_Record * Add_Record(CSG_Table_Record *pCopy=NULL)
virtual bool Add_Field(const CSG_String &Name, TSG_Data_Type Type, int Position=-1)
bool Post(const CSG_String &Request, const CSG_String &Body, CSG_Bytes &Answer, const CSG_String &ContentType="application/json")
bool Request(const CSG_String &Request, CSG_Bytes &Answer)