diff --git a/src/core/piinit.cpp b/src/core/piinit.cpp index dac6a2c2..991b5a27 100644 --- a/src/core/piinit.cpp +++ b/src/core/piinit.cpp @@ -41,6 +41,7 @@ extern clock_serv_t __pi_mac_clock; #endif #ifdef PIP_ICU +# include # include #endif /* @@ -66,7 +67,7 @@ void __sighandler__(PISignals::Signal s) { if (s == PISignals::StopTTYInput || s == PISignals::StopTTYOutput) piMSleep(10); if (s == PISignals::UserDefined1) - dumpApplicationToFile(PIDir::home().path() + PIDir::separator + "_PIP_DUMP_" + PIString::fromNumber(PIProcess::currentPID())); + dumpApplicationToFile(PIDir::home().path() + PIDir::separator + PIStringAscii("_PIP_DUMP_") + PIString::fromNumber(PIProcess::currentPID())); } @@ -85,7 +86,8 @@ PIInit::PIInit() { pthread_sigmask(SIG_BLOCK, &ss, 0); signal(SIGPIPE, SIG_IGN); PIStringList ifpathes; - ifpathes << "/bin/ifconfig" << "/sbin/ifconfig" << "/usr/bin/ifconfig" << "/usr/sbin/ifconfig"; + ifpathes << PIStringAscii("/bin/ifconfig") << PIStringAscii("/sbin/ifconfig") + << PIStringAscii("/usr/bin/ifconfig") << PIStringAscii("/usr/sbin/ifconfig"); piForeachC (PIString & i, ifpathes) if (fileExists(i)) { sinfo->ifconfigPath = i; @@ -132,6 +134,8 @@ PIInit::PIInit() { __syslocname__ = __sysoemname__ = 0; //__syslocname__ = new char[256]; //memset(__syslocname__, 0, 256); + UErrorCode e((UErrorCode)0); + u_init(&e); # ifdef WINDOWS CPINFOEX cpinfo; int l = 0; @@ -172,12 +176,12 @@ PIInit::PIInit() { GetSystemInfo(&sysinfo); sinfo->processorsCount = sysinfo.dwNumberOfProcessors; switch (sysinfo.wProcessorArchitecture) { - case PROCESSOR_ARCHITECTURE_AMD64: sinfo->architecture = "x64"; break; - case PROCESSOR_ARCHITECTURE_ARM: sinfo->architecture = "ARM"; break; - case PROCESSOR_ARCHITECTURE_IA64: sinfo->architecture = "Intel Itanium-based"; break; - case PROCESSOR_ARCHITECTURE_INTEL: sinfo->architecture = "x86"; break; + case PROCESSOR_ARCHITECTURE_AMD64: sinfo->architecture = PIStringAscii("x64"); break; + case PROCESSOR_ARCHITECTURE_ARM: sinfo->architecture = PIStringAscii("ARM"); break; + case PROCESSOR_ARCHITECTURE_IA64: sinfo->architecture = PIStringAscii("Intel Itanium-based"); break; + case PROCESSOR_ARCHITECTURE_INTEL: sinfo->architecture = PIStringAscii("x86"); break; case PROCESSOR_ARCHITECTURE_UNKNOWN: - default: sinfo->architecture = "unknown"; break; + default: sinfo->architecture = PIStringAscii("unknown"); break; } int argc_(0); wchar_t ** argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_); @@ -207,16 +211,16 @@ PIInit::PIInit() { #endif sinfo->OS_name = #ifdef WINDOWS - "Windows"; + PIStringAscii("Windows"); #else # ifdef QNX - "QNX"; + PIStringAscii("QNX"); # else # ifdef MAC_OS - "MacOS"; + PIStringAscii("MacOS"); # else # ifdef ANDROID - "Android"; + PIStringAscii("Android"); # else uns.sysname; # endif @@ -239,6 +243,7 @@ PIInit::~PIInit() { #ifdef PIP_ICU if (__syslocname__) delete __syslocname__; if (__sysoemname__) delete __sysoemname__; + u_cleanup(); #endif //if (currentLocale_t != 0) freelocale(currentLocale_t); } diff --git a/src/core/piobject.h b/src/core/piobject.h index a441dc96..8515cd79 100755 --- a/src/core/piobject.h +++ b/src/core/piobject.h @@ -179,7 +179,7 @@ #define PIOBJECT(name) \ protected: \ typedef name __PIObject__; \ - static const PIString __classNameS() {return PIString(#name);} \ + static const PIString __classNameS() {return PIStringAscii(#name);} \ public: \ virtual const char * className() const {return #name;} \ private: @@ -219,9 +219,9 @@ eh.eh_set << fp; \ __EHFunc & f(eh.eh_func[fp]); \ f.scope = __classNameS(); \ - f.func_name = #name; \ + f.func_name = PIStringAscii(#name); \ f.addr = fp; \ - f.type_ret = #ret; \ + f.type_ret = PIStringAscii(#ret); \ } \ }; \ __##name##0_Initializer__ __##name##0_init__; \ @@ -237,11 +237,11 @@ eh.eh_set << fp; \ __EHFunc & f(eh.eh_func[fp]); \ f.scope = __classNameS(); \ - f.func_name = #name; \ + f.func_name = PIStringAscii(#name); \ f.addr = fp; \ - f.type_ret = #ret; \ - f.types << #a0; \ - f.names << #n0; \ + f.type_ret = PIStringAscii(#ret); \ + f.types << PIStringAscii(#a0); \ + f.names << PIStringAscii(#n0); \ } \ }; \ __##name##1##n0##_Initializer__ __##name##1##n0##_init__; \ @@ -257,11 +257,11 @@ eh.eh_set << fp; \ __EHFunc & f(eh.eh_func[fp]); \ f.scope = __classNameS(); \ - f.func_name = #name; \ + f.func_name = PIStringAscii(#name); \ f.addr = fp; \ - f.type_ret = #ret; \ - f.types << #a0 << #a1; \ - f.names << #n0 << #n1; \ + f.type_ret = PIStringAscii(#ret); \ + f.types << PIStringAscii(#a0) << PIStringAscii(#a1); \ + f.names << PIStringAscii(#n0) << PIStringAscii(#n1); \ } \ }; \ __##name##2##n0##n1##_Initializer__ __##name##2##n0##n1##_init__; \ @@ -277,11 +277,11 @@ eh.eh_set << fp; \ __EHFunc & f(eh.eh_func[fp]); \ f.scope = __classNameS(); \ - f.func_name = #name; \ + f.func_name = PIStringAscii(#name); \ f.addr = fp; \ - f.type_ret = #ret; \ - f.types << #a0 << #a1 << #a2; \ - f.names << #n0 << #n1 << #n2; \ + f.type_ret = PIStringAscii(#ret); \ + f.types << PIStringAscii(#a0) << PIStringAscii(#a1) << PIStringAscii(#a2); \ + f.names << PIStringAscii(#n0) << PIStringAscii(#n1) << PIStringAscii(#n2); \ } \ }; \ __##name##3##n0##n1##n2##_Initializer__ __##name##3##n0##n1##n2##_init__; \ @@ -297,11 +297,11 @@ eh.eh_set << fp; \ __EHFunc & f(eh.eh_func[fp]); \ f.scope = __classNameS(); \ - f.func_name = #name; \ + f.func_name = PIStringAscii(#name); \ f.addr = fp; \ - f.type_ret = #ret; \ - f.types << #a0 << #a1 << #a2 << #a3; \ - f.names << #n0 << #n1 << #n2 << #n3; \ + f.type_ret = PIStringAscii(#ret); \ + f.types << PIStringAscii(#a0) << PIStringAscii(#a1) << PIStringAscii(#a2) << PIStringAscii(#a3); \ + f.names << PIStringAscii(#n0) << PIStringAscii(#n1) << PIStringAscii(#n2) << PIStringAscii(#n3); \ } \ }; \ __##name##4##n0##n1##n2##n3##_Initializer__ __##name##4##n0##n1##n2##n3##_init__; \ @@ -363,11 +363,11 @@ #define EVENT_VHANDLER EVENT_VHANDLER0 -#define EVENT0(name) EVENT_HANDLER0(void, name) {PIObject::raiseEvent(this, #name);} -#define EVENT1(name, a0, n0) EVENT_HANDLER1(void, name, a0, n0) {PIObject::raiseEvent(this, #name, n0);} -#define EVENT2(name, a0, n0, a1, n1) EVENT_HANDLER2(void, name, a0, n0, a1, n1) {PIObject::raiseEvent(this, #name, n0, n1);} -#define EVENT3(name, a0, n0, a1, n1, a2, n2) EVENT_HANDLER3(void, name, a0, n0, a1, n1, a2, n2) {PIObject::raiseEvent(this, #name, n0, n1, n2);} -#define EVENT4(name, a0, n0, a1, n1, a2, n2, a3, n3) EVENT_HANDLER4(void, name, a0, n0, a1, n1, a2, n2, a3, n3) {PIObject::raiseEvent(this, #name, n0, n1, n2, n3);} +#define EVENT0(name) EVENT_HANDLER0(void, name) {PIObject::raiseEvent(this, PIStringAscii(#name));} +#define EVENT1(name, a0, n0) EVENT_HANDLER1(void, name, a0, n0) {PIObject::raiseEvent(this, PIStringAscii(#name), n0);} +#define EVENT2(name, a0, n0, a1, n1) EVENT_HANDLER2(void, name, a0, n0, a1, n1) {PIObject::raiseEvent(this, PIStringAscii(#name), n0, n1);} +#define EVENT3(name, a0, n0, a1, n1, a2, n2) EVENT_HANDLER3(void, name, a0, n0, a1, n1, a2, n2) {PIObject::raiseEvent(this, PIStringAscii(#name), n0, n1, n2);} +#define EVENT4(name, a0, n0, a1, n1, a2, n2, a3, n3) EVENT_HANDLER4(void, name, a0, n0, a1, n1, a2, n2, a3, n3) {PIObject::raiseEvent(this, PIStringAscii(#name), n0, n1, n2, n3);} #define EVENT EVENT0 #define RAISE_EVENT0(src, event) (src)->event(); @@ -377,27 +377,27 @@ #define RAISE_EVENT4(src, event, v0, v1, v2, v3) (src)->event(v0, v1, v2, v3); #define RAISE_EVENT RAISE_EVENT0 -#define CONNECTU(src, event, dest, handler) PIObject::piConnectU(src, #event, dest, dest, #handler); +#define CONNECTU(src, event, dest, handler) PIObject::piConnectU(src, PIStringAscii(#event), dest, dest, PIStringAscii(#handler)); -#define CONNECT0(ret, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*))(&(src)->__stat_eh_##event##__), 0); -#define CONNECT1(ret, a0, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0))(&(src)->__stat_eh_##event##__), 1); -#define CONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1))(&(src)->__stat_eh_##event##__), 2); -#define CONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1, a2))(&(src)->__stat_eh_##event##__), 3); -#define CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1, a2, a3))(&(src)->__stat_eh_##event##__), 4); +#define CONNECT0(ret, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*))(&(src)->__stat_eh_##event##__), 0); +#define CONNECT1(ret, a0, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0))(&(src)->__stat_eh_##event##__), 1); +#define CONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1))(&(src)->__stat_eh_##event##__), 2); +#define CONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1, a2))(&(src)->__stat_eh_##event##__), 3); +#define CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1, a2, a3))(&(src)->__stat_eh_##event##__), 4); #define CONNECT CONNECT0 -#define WEAK_CONNECT0(ret, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__), 0, 0); -#define WEAK_CONNECT1(ret, a0, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__), 0, 1); -#define WEAK_CONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__), 0, 2); -#define WEAK_CONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), 0, 3); -#define WEAK_CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), 0, 4); +#define WEAK_CONNECT0(ret, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__), 0, 0); +#define WEAK_CONNECT1(ret, a0, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__), 0, 1); +#define WEAK_CONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__), 0, 2); +#define WEAK_CONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), 0, 3); +#define WEAK_CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), 0, 4); #define WEAK_CONNECT WEAK_CONNECT0 -#define DISCONNECT0(ret, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__)); -#define DISCONNECT1(ret, a0, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__)); -#define DISCONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__)); -#define DISCONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__)); -#define DISCONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT0(ret, src, event, dest, handler) PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT1(ret, a0, src, event, dest, handler) PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__)); #define DISCONNECT DISCONNECT0 #define HANDLER(handler) __stat_eh_##handler##__ @@ -427,7 +427,7 @@ public: //! Returns object name - PIString name() const {return property("name").toString();} + PIString name() const {return property(PIStringAscii("name")).toString();} //! Returns object class name virtual const char * className() const {return "PIObject";} @@ -436,14 +436,15 @@ public: virtual const char * superClassName() const {return "";} //! Return if debug of this object is active - bool debug() const {return property("debug").toBool();} + bool debug() const {return property(PIStringAscii("debug")).toBool();} //! Set object name - void setName(const PIString & name) {setProperty("name", name);} + void setName(const PIString & name) {setProperty(PIStringAscii("name"), name);} + void setName(const char * name) {setName(PIStringAscii(name));} //! Set object debug active - void setDebug(bool debug) {setProperty("debug", debug);} + void setDebug(bool debug) {setProperty(PIStringAscii("debug"), debug);} //! Returns properties of the object const PIMap & properties() const {return properties_;} @@ -453,12 +454,15 @@ public: //! Returns property with name "name" PIVariant property(const PIString & name) const {if (!properties_.contains(name)) return PIVariant(); return properties_.value(name);} + PIVariant property(const char * name) const {return property(PIStringAscii(name));} //! Set property with name "name" to "value". If there is no such property in object it will be added void setProperty(const PIString & name, const PIVariant & value) {properties_[name] = value; propertyChanged(name);} + void setProperty(const char * name, const PIVariant & value) {setProperty(PIStringAscii(name), value);} //! Returns if property with name "name" exists bool isPropertyExists(const PIString & name) const {return properties_.contains(name);} + bool isPropertyExists(const char * name) const {return isPropertyExists(PIStringAscii(name));} void setThreadSafe(bool yes) {thread_safe_ = yes;} bool isThreadSafe() const {return thread_safe_;} @@ -690,7 +694,7 @@ protected: virtual void propertyChanged(const PIString & name) {} - static const PIString __classNameS() {return PIString("PIObject");} + static const PIString __classNameS() {return PIStringAscii("PIObject");} EVENT(deleted) diff --git a/src/core/pistring.cpp b/src/core/pistring.cpp index 7094dedd..b04e2965 100755 --- a/src/core/pistring.cpp +++ b/src/core/pistring.cpp @@ -182,6 +182,17 @@ PIString PIString::fromUTF8(const char * s) { } +PIString PIString::fromAscii(const char * s) { + PIString ret; + int l = 0; + while (s[l] != '\0') { + ret.push_back(PIChar(short(s[l]))); + ++l; + } + return ret; +} + + void PIString::buildData(const char * cp) const { data_.clear(); #ifdef PIP_ICU @@ -251,6 +262,15 @@ const char * PIString::dataUTF8() const { } +const char * PIString::dataAscii() const { + data_.clear(); + for (int i = 0; i < size_s(); ++i) + data_.push_back(uchar(at(i).ch)); + data_.push_back(uchar('\0')); + return (const char *)data_.data(); +} + + PIString & PIString::operator +=(const char * str) { int l = 0; while (str[l] != '\0') ++l; diff --git a/src/core/pistring.h b/src/core/pistring.h index e2e13c01..09b29798 100755 --- a/src/core/pistring.h +++ b/src/core/pistring.h @@ -28,6 +28,8 @@ #include "pibytearray.h" #include "pichar.h" +#define PIStringAscii PIString::fromAscii + class PIStringList; class PIP_EXPORT PIString: public PIDeque @@ -482,6 +484,13 @@ public: * execution of this function.\n * \sa \a data(), \a dataConsole() */ const char * dataUTF8() const; + + /*! \brief Return \c char * representation of this string in ASCII + * \details This function fill buffer by sequence + * of chars. Minimum length of this buffer is count + * of symbols. Returned \c char * is valid until next + * execution of this function.\n */ + const char * dataAscii() const; //! \brief Return \c std::string representation of this string std::string stdString() const {return convertToStd();} @@ -717,6 +726,9 @@ public: //! \brief Return string constructed from UTF-8 static PIString fromUTF8(const char * s); + //! \brief Return string constructed from ASCII + static PIString fromAscii(const char * s); + //! \brief Return string contains human readable size in B/kB/MB/GB/TB //! \details Example: \snippet pistring.cpp PIString::readableSize static PIString readableSize(llong bytes) {PIString s; s.setReadableSize(bytes); return s;} @@ -930,7 +942,7 @@ public: //! \relatesalso PIStringList \relatesalso PIByteArray \brief Output operator to PIByteArray -inline PIByteArray & operator <<(PIByteArray & s, const PIStringList & v) {s << v.size_s(); for (int i = 0; i < v.size_s(); ++i) s << v[i]; return s;} +inline PIByteArray & operator <<(PIByteArray & s, const PIStringList & v) {s << int(v.size_s()); for (int i = 0; i < v.size_s(); ++i) s << v[i]; return s;} //! \relatesalso PIStringList \relatesalso PIByteArray \brief Input operator from PIByteArray inline PIByteArray & operator >>(PIByteArray & s, PIStringList & v) {int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} diff --git a/src/io/piethernet.cpp b/src/io/piethernet.cpp index 0b13f1f2..048585ad 100755 --- a/src/io/piethernet.cpp +++ b/src/io/piethernet.cpp @@ -69,7 +69,7 @@ #ifndef WINDOWS PIString getSockAddr(sockaddr * s) { - return s == 0 ? PIString() : PIString(inet_ntoa(((sockaddr_in*)s)->sin_addr)); + return s == 0 ? PIString() : PIStringAscii(inet_ntoa(((sockaddr_in*)s)->sin_addr)); } #endif @@ -189,7 +189,7 @@ PIString PIEthernet::macFromBytes(const PIByteArray & mac) { PIByteArray PIEthernet::macToBytes(const PIString & mac) { PIByteArray r; - PIStringList sl = mac.split(":"); + PIStringList sl = mac.split(PIStringAscii(":")); piForeachC (PIString & i, sl) r << uchar(i.toInt(16)); return r; @@ -198,15 +198,15 @@ PIString PIEthernet::macFromBytes(const PIByteArray & mac) { PIString PIEthernet::applyMask(const PIString & ip, const PIString & mask) { struct in_addr ia; - ia.s_addr = inet_addr(ip.data()) & inet_addr(mask.data()); - return PIString(inet_ntoa(ia)); + ia.s_addr = inet_addr(ip.dataAscii()) & inet_addr(mask.dataAscii()); + return PIStringAscii(inet_ntoa(ia)); } PIString PIEthernet::getBroadcast(const PIString & ip, const PIString & mask) { struct in_addr ia; - ia.s_addr = inet_addr(ip.data()) | ~inet_addr(mask.data()); - return PIString(inet_ntoa(ia)); + ia.s_addr = inet_addr(ip.dataAscii()) | ~inet_addr(mask.dataAscii()); + return PIStringAscii(inet_ntoa(ia)); } @@ -224,7 +224,7 @@ bool PIEthernet::openDevice() { PRIVATE->addr_.sin_port = htons(port_); PIFlags params = parameters(); if (params[PIEthernet::Broadcast]) PRIVATE->addr_.sin_addr.s_addr = INADDR_ANY; - else PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.data()); + else PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); #ifdef QNX PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); #endif @@ -343,14 +343,14 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) { if (ci != 0) mreq.imr_ifindex = ci->index;*/ #endif if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; - else mreq.imr_address.s_addr = inet_addr(ip_.data()); + else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii()); /*#ifndef WINDOWS PIEthernet::InterfaceList il = interfaces(); const PIEthernet::Interface * ci = il.getByAddress(ip_); if (ci != 0) mreq.imr_ifindex = ci->index; #endif*/ //piCout << "join group" << group << "ip" << ip_ << "with index" << mreq.imr_ifindex << "socket" << sock; - mreq.imr_multiaddr.s_addr = inet_addr(group.data()); + mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii()); if (ethSetsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) { piCoutObj << "Can`t join multicast group " << group << ", " << ethErrorString(); return false; @@ -377,8 +377,8 @@ bool PIEthernet::leaveMulticastGroup(const PIString & group) { struct ip_mreqn mreq; memset(&mreq, 0, sizeof(mreq)); if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; - else mreq.imr_address.s_addr = inet_addr(ip_.data()); - mreq.imr_multiaddr.s_addr = inet_addr(group.data()); + else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii()); + mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii()); if (ethSetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { piCoutObj << "Can`t leave multicast group " << group << ", " << ethErrorString(); return false; @@ -430,7 +430,7 @@ bool PIEthernet::listen(bool threaded) { parseAddress(path(), &ip_, &port_); memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); PRIVATE->addr_.sin_port = htons(port_); - PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.data()); + PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX PRIVATE->addr_.sin_len = sizeof(*addr_); @@ -481,7 +481,7 @@ int PIEthernet::read(void * read_to, int max_size) { memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); parseAddress(path(), &ip_, &port_); PRIVATE->addr_.sin_port = htons(port_); - PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.data()); + PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); @@ -535,7 +535,7 @@ int PIEthernet::read(void * read_to, int max_size) { //piCout << "eth" << path() << "read return" << rs << errorString(); if (rs > 0) { port_r = ntohs(PRIVATE->raddr_.sin_port); - ip_r = inet_ntoa(PRIVATE->raddr_.sin_addr); + ip_r = PIStringAscii(inet_ntoa(PRIVATE->raddr_.sin_addr)); //piCout << "received from" << lastReadAddress(); received(read_to, rs); } @@ -560,7 +560,7 @@ int PIEthernet::write(const void * data, int max_size) { case TCP_SingleTCP: memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); PRIVATE->addr_.sin_port = htons(port_s); - PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_s.data()); + PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_s.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX PRIVATE->addr_.sin_len = sizeof(*addr_); @@ -580,7 +580,7 @@ int PIEthernet::write(const void * data, int max_size) { case UDP: PRIVATE->saddr_.sin_port = htons(port_s); /*if (params[PIEthernet::Broadcast]) PRIVATE->saddr_.sin_addr.s_addr = INADDR_BROADCAST; - else*/ PRIVATE->saddr_.sin_addr.s_addr = inet_addr(ip_s.data()); + else*/ PRIVATE->saddr_.sin_addr.s_addr = inet_addr(ip_s.dataAscii()); PRIVATE->saddr_.sin_family = AF_INET; //piCout << "[PIEth] write to" << ip_s << ":" << port_s << "socket" << sock_s << max_size << "bytes ..."; return ethSendto(sock_s, data, max_size, 0, (sockaddr * )&PRIVATE->saddr_, sizeof(PRIVATE->saddr_)); @@ -590,7 +590,7 @@ int PIEthernet::write(const void * data, int max_size) { memset(&PRIVATE->addr_, 0, sizeof(PRIVATE->addr_)); parseAddress(path(), &ip_, &port_); PRIVATE->addr_.sin_port = htons(port_); - PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.data()); + PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii()); PRIVATE->addr_.sin_family = AF_INET; #ifdef QNX PRIVATE->addr_.sin_len = sizeof(*addr_); @@ -656,7 +656,7 @@ void PIEthernet::server_func(void * eth) { piMSleep(10); return; } - PIString ip(inet_ntoa(client_addr.sin_addr)); + PIString ip = PIStringAscii(inet_ntoa(client_addr.sin_addr)); ip += ":" + PIString::fromNumber(htons(client_addr.sin_port)); PIEthernet * e = new PIEthernet(s, ip); ce->clients_mutex.lock(); @@ -826,10 +826,10 @@ PIEthernet::InterfaceList PIEthernet::interfaces() { PIStringList inl; struct ifreq ir; for (int i = 0; i < icnt; ++i) { - PIString in(ifc.ifc_req[i].ifr_name); + PIString in = PIStringAscii(ifc.ifc_req[i].ifr_name); if (in.isEmpty()) continue; ci.name = in; - strcpy(ir.ifr_name, in.data()); + strcpy(ir.ifr_name, in.dataAscii()); if (ioctl(s, SIOCGIFHWADDR, &ir) == 0) ci.mac = macFromBytes(PIByteArray(ir.ifr_hwaddr.sa_data, 6)); if (ioctl(s, SIOCGIFADDR, &ir) >= 0) @@ -858,7 +858,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() { ci.netmask = getSockAddr(ret->ifa_netmask); ci.mac.clear(); # ifdef QNX - int fd = ::open((PIString("/dev/io-net/") + ci.name).data(), O_RDONLY); + int fd = ::open((PIString("/dev/io-net/") + ci.name).dataAscii(), O_RDONLY); if (fd != 0) { nic_config_t nic; devctl(fd, DCMD_IO_NET_GET_CONFIG, &nic, sizeof(nic), 0); @@ -868,7 +868,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() { # else # ifdef MAC_OS PIString req = PISystemInfo::instance()->ifconfigPath + " " + ci.name + " | grep ether"; - FILE * fp = popen(req.data(), "r"); + FILE * fp = popen(req.dataAscii(), "r"); if (fp != 0) { char in[256]; if (fgets(in, 256, fp) != 0) { @@ -922,12 +922,12 @@ PIString PIEthernet::interfaceAddress(const PIString & interface_) { #else struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); - strcpy(ifr.ifr_name, interface_.data()); + strcpy(ifr.ifr_name, interface_.dataAscii()); int s = socket(AF_INET, SOCK_DGRAM, 0); ioctl(s, SIOCGIFADDR, &ifr); ::close(s); struct sockaddr_in * sa = (struct sockaddr_in * )&ifr.ifr_addr; - return PIString(inet_ntoa(sa->sin_addr)); + return PIStringAscii(inet_ntoa(sa->sin_addr)); #endif } diff --git a/src/io/piethernet.h b/src/io/piethernet.h index 6a8afaa0..970fb471 100755 --- a/src/io/piethernet.h +++ b/src/io/piethernet.h @@ -61,16 +61,16 @@ public: //! Set read address - void setReadAddress(const PIString & ip, int port) {setPath(ip + ":" + PIString::fromNumber(port));} + void setReadAddress(const PIString & ip, int port) {setPath(ip + PIStringAscii(":") + PIString::fromNumber(port));} //! Set read address in format "i.i.i.i:p" void setReadAddress(const PIString & ip_port) {setPath(ip_port);} //! Set read IP - void setReadIP(const PIString & ip) {parseAddress(path(), &ip_, &port_); setPath(ip + ":" + PIString::fromNumber(port_));} + void setReadIP(const PIString & ip) {parseAddress(path(), &ip_, &port_); setPath(ip + PIStringAscii(":") + PIString::fromNumber(port_));} //! Set read port - void setReadPort(int port) {parseAddress(path(), &ip_, &port_); setPath(ip_ + ":" + PIString::fromNumber(port));} + void setReadPort(int port) {parseAddress(path(), &ip_, &port_); setPath(ip_ + PIStringAscii(":") + PIString::fromNumber(port));} //! Set send address @@ -97,7 +97,7 @@ public: //! Returns send address in format "i.i.i.i:p" - PIString sendAddress() const {return ip_s + ":" + PIString::fromNumber(port_s);} + PIString sendAddress() const {return ip_s + PIStringAscii(":") + PIString::fromNumber(port_s);} //! Returns send IP PIString sendIP() const {return ip_s;} @@ -107,7 +107,7 @@ public: //! Returns address of last received UDP packet in format "i.i.i.i:p" - PIString lastReadAddress() const {return ip_r + ":" + PIString::fromNumber(port_r);} + PIString lastReadAddress() const {return ip_r + PIStringAscii(":") + PIString::fromNumber(port_r);} //! Returns IP of last received UDP packet PIString lastReadIP() const {return ip_r;} @@ -117,46 +117,46 @@ public: //! Set parameters to "parameters_". You should to reopen %PIEthernet to apply them - void setParameters(PIFlags parameters_) {setProperty("parameters", (int)parameters_);} + void setParameters(PIFlags parameters_) {setProperty(PIStringAscii("parameters"), (int)parameters_);} //! Set parameter "parameter" to state "on". You should to reopen %PIEthernet to apply this void setParameter(PIEthernet::Parameters parameter, bool on = true); //! Returns if parameter "parameter" is set - bool isParameterSet(PIEthernet::Parameters parameter) const {return ((PIFlags)(property("parameters").toInt()))[parameter];} + bool isParameterSet(PIEthernet::Parameters parameter) const {return ((PIFlags)(property(PIStringAscii("parameters")).toInt()))[parameter];} //! Returns parameters - PIFlags parameters() const {return (PIFlags)(property("parameters").toInt());} + PIFlags parameters() const {return (PIFlags)(property(PIStringAscii("parameters")).toInt());} //PIByteArray macAddress() {if (!init_) init(); struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); memcpy(ifr.ifr_name, "eth0", 5); ioctl(sock, SIOCSIFHWADDR, &ifr); return PIByteArray(&ifr.ifr_hwaddr.sa_data, 6);} //! Returns %PIEthernet type - Type type() const {return (Type)(property("type").toInt());} + Type type() const {return (Type)(property(PIStringAscii("type")).toInt());} //! Returns read timeout - double readTimeout() const {return property("readTimeout").toDouble();} + double readTimeout() const {return property(PIStringAscii("readTimeout")).toDouble();} //! Returns write timeout - double writeTimeout() const {return property("writeTimeout").toDouble();} + double writeTimeout() const {return property(PIStringAscii("writeTimeout")).toDouble();} //! Set timeout for read - void setReadTimeout(double ms) {setProperty("readTimeout", ms);} + void setReadTimeout(double ms) {setProperty(PIStringAscii("readTimeout"), ms);} //! Set timeout for write - void setWriteTimeout(double ms) {setProperty("writeTimeout", ms);} + void setWriteTimeout(double ms) {setProperty(PIStringAscii("writeTimeout"), ms);} //! Returns TTL (Time To Live) - int TTL() const {return property("TTL").toInt();} + int TTL() const {return property(PIStringAscii("TTL")).toInt();} //! Returns multicast TTL (Time To Live) - int multicastTTL() const {return property("MulticastTTL").toInt();} + int multicastTTL() const {return property(PIStringAscii("MulticastTTL")).toInt();} //! Set TTL (Time To Live), default is 64 - void setTTL(int ttl) {setProperty("TTL", ttl);} + void setTTL(int ttl) {setProperty(PIStringAscii("TTL"), ttl);} //! Set multicast TTL (Time To Live), default is 1 - void setMulticastTTL(int ttl) {setProperty("MulticastTTL", ttl);} + void setMulticastTTL(int ttl) {setProperty(PIStringAscii("MulticastTTL"), ttl);} //! Join to multicast group with address "group". Use only for UDP @@ -173,7 +173,7 @@ public: bool connect(); //! Connect to TCP server with address "ip":"port". Use only for TCP_Client - bool connect(const PIString & ip, int port) {setPath(ip + ":" + PIString::fromNumber(port)); return connect();} + bool connect(const PIString & ip, int port) {setPath(ip + PIStringAscii(":") + PIString::fromNumber(port)); return connect();} //! Connect to TCP server with address "ip_port". Use only for TCP_Client bool connect(const PIString & ip_port) {setPath(ip_port); return connect();} @@ -377,7 +377,7 @@ protected: void propertyChanged(const PIString & name); - PIString fullPathPrefix() const {return "eth";} + PIString fullPathPrefix() const {return PIStringAscii("eth");} void configureFromFullPath(const PIString & full_path); bool configureDevice(const void * e_main, const void * e_parent = 0); @@ -407,7 +407,7 @@ protected: private: EVENT_HANDLER(void, clientDeleted); static void server_func(void * eth); - void setType(Type t, bool reopen = true) {setProperty("type", (int)t); if (reopen && isOpened()) {closeDevice(); init(); openDevice();}} + void setType(Type t, bool reopen = true) {setProperty(PIStringAscii("type"), (int)t); if (reopen && isOpened()) {closeDevice(); init(); openDevice();}} inline static int ethErrorCore(); inline static PIString ethErrorString(); diff --git a/src/io/piiodevice.h b/src/io/piiodevice.h index 0f25a0dc..59037523 100755 --- a/src/io/piiodevice.h +++ b/src/io/piiodevice.h @@ -68,10 +68,10 @@ public: DeviceMode mode() const {return mode_;} //! Current path of device - PIString path() const {return property("path").toString();} + PIString path() const {return property(PIStringAscii("path")).toString();} //! Set path of device - void setPath(const PIString & path) {setProperty("path", path);} + void setPath(const PIString & path) {setProperty(PIStringAscii("path"), path);} //! Return \b true if mode is ReadOnly or ReadWrite bool isReadable() const {return (mode_ & ReadOnly);} @@ -95,17 +95,17 @@ public: //! Set execution of \a open enabled while threaded read on closed device - void setReopenEnabled(bool yes = true) {setProperty("reopenEnabled", yes);} + void setReopenEnabled(bool yes = true) {setProperty(PIStringAscii("reopenEnabled"), yes);} //! Set timeout in milliseconds between \a open tryings if reopen is enabled - void setReopenTimeout(int msecs) {setProperty("reopenTimeout", msecs);} + void setReopenTimeout(int msecs) {setProperty(PIStringAscii("reopenTimeout"), msecs);} //! Return reopen enable - bool isReopenEnabled() const {return property("reopenEnabled").toBool();} + bool isReopenEnabled() const {return property(PIStringAscii("reopenEnabled")).toBool();} //! Return reopen timeout - int reopenTimeout() {return property("reopenTimeout").toInt();} + int reopenTimeout() {return property(PIStringAscii("reopenTimeout")).toInt();} /** \brief Set "threaded read slot" diff --git a/src/io/pipeer.cpp b/src/io/pipeer.cpp index 6e11eb64..a668d781 100755 --- a/src/io/pipeer.cpp +++ b/src/io/pipeer.cpp @@ -757,15 +757,16 @@ void PIPeer::checkNetwork() { void PIPeer::initNetwork() { + piCoutObj << "initNetwork ..."; eth_send.init(); destroyEths(); destroyMBcasts(); - piCoutObj << "initNetwork"; self_info.addresses.clear(); PIStringList sl = PIEthernet::allAddresses(); initEths(sl); sl.removeAll("127.0.0.1"); initMBcasts(sl); + piCoutObj << "initNetwork done"; } diff --git a/src/thread/pithread.cpp b/src/thread/pithread.cpp index 3a705b7a..d39e287c 100755 --- a/src/thread/pithread.cpp +++ b/src/thread/pithread.cpp @@ -209,6 +209,7 @@ void * PIThread::thread_function(void * t) { while (!ct.terminating) { if (ct.lockRun) ct.mutex_.lock(); ct.run(); + //printf("thread %p tick\n", &ct); if (ct.ret_func != 0) ct.ret_func(ct.data_); if (ct.lockRun) ct.mutex_.unlock(); if (ct.delay_ > 0) { @@ -229,12 +230,12 @@ void * PIThread::thread_function(void * t) { if (ct.lockRun) ct.mutex_.unlock(); ct.terminating = ct.running_ = false; //cout << "thread " << t << " exiting ... " << endl; + ct.thread = 0; #ifndef WINDOWS pthread_exit(0); #else ExitThread(0); #endif - ct.thread = 0; return 0; } @@ -260,12 +261,12 @@ void * PIThread::thread_function_once(void * t) { ct.end(); ct.terminating = ct.running_ = false; //cout << "thread " << t << " exiting ... " << endl; + ct.thread = 0; #ifndef WINDOWS pthread_exit(0); #else ExitThread(0); #endif - ct.thread = 0; return 0; }