< prev index next >

src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.cpp

Print this page

        

*** 23,72 **** * questions. */ #include "Platform.h" - #ifdef LINUX - #include "JavaVirtualMachine.h" #include "LinuxPlatform.h" #include "PlatformString.h" #include "IniFile.h" #include "Helpers.h" #include <stdlib.h> #include <pwd.h> #include <sys/file.h> #include <sys/stat.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <limits.h> #define LINUX_JPACKAGE_TMP_DIR "/.java/jpackage/tmp" - TString GetEnv(const TString &name) { TString result; ! char *value = ::getenv((TCHAR*)name.c_str()); if (value != NULL) { result = value; } return result; } LinuxPlatform::LinuxPlatform(void) : Platform(), ! GenericPlatform(), PosixPlatform() { FMainThread = pthread_self(); } LinuxPlatform::~LinuxPlatform(void) { } void LinuxPlatform::ShowMessage(TString title, TString description) { printf("%s %s\n", PlatformString(title).toPlatformString(), PlatformString(description).toPlatformString()); fflush(stdout); } --- 23,90 ---- * questions. */ #include "Platform.h" #include "JavaVirtualMachine.h" #include "LinuxPlatform.h" #include "PlatformString.h" #include "IniFile.h" #include "Helpers.h" + #include "FilePath.h" #include <stdlib.h> #include <pwd.h> #include <sys/file.h> #include <sys/stat.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <limits.h> + #include <signal.h> #define LINUX_JPACKAGE_TMP_DIR "/.java/jpackage/tmp" TString GetEnv(const TString &name) { TString result; ! char *value = ::getenv((TCHAR*) name.c_str()); if (value != NULL) { result = value; } return result; } LinuxPlatform::LinuxPlatform(void) : Platform(), ! PosixPlatform() { FMainThread = pthread_self(); } LinuxPlatform::~LinuxPlatform(void) { } + TString LinuxPlatform::GetPackageAppDirectory() { + return FilePath::IncludeTrailingSeparator( + GetPackageRootDirectory()) + _T("app"); + } + + TString LinuxPlatform::GetAppName() { + TString result = GetModuleFileName(); + result = FilePath::ExtractFileName(result); + return result; + } + + TString LinuxPlatform::GetPackageLauncherDirectory() { + return GetPackageRootDirectory(); + } + + TString LinuxPlatform::GetPackageRuntimeBinDirectory() { + return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) + _T("runtime/bin"); + } + void LinuxPlatform::ShowMessage(TString title, TString description) { printf("%s %s\n", PlatformString(title).toPlatformString(), PlatformString(description).toPlatformString()); fflush(stdout); }
*** 172,201 **** TPlatformNumber result = pages * page_size; result = result / 1048576; // Convert from bytes to megabytes. return result; } ! #ifdef DEBUG ! bool LinuxPlatform::IsNativeDebuggerPresent() { ! // gdb opens file descriptors stdin=3, stdout=4, stderr=5 whereas ! // a typical prog uses only stdin=0, stdout=1, stderr=2. bool result = false; - FILE *fd = fopen("/tmp", "r"); ! if (fileno(fd) > 5) { result = true; } - fclose(fd); return result; } - int LinuxPlatform::GetProcessID() { - int pid = getpid(); - return pid; - } - #endif //DEBUG //---------------------------------------------------------------------------- #ifndef __UNIX_JPACKAGE_PLATFORM__ #define __UNIX_JPACKAGE_PLATFORM__ --- 190,283 ---- TPlatformNumber result = pages * page_size; result = result / 1048576; // Convert from bytes to megabytes. return result; } ! void PosixProcess::Cleanup() { ! if (FOutputHandle != 0) { ! close(FOutputHandle); ! FOutputHandle = 0; ! } ! ! if (FInputHandle != 0) { ! close(FInputHandle); ! FInputHandle = 0; ! } ! } ! ! #define PIPE_READ 0 ! #define PIPE_WRITE 1 ! ! bool PosixProcess::Execute(const TString Application, ! const std::vector<TString> Arguments, bool AWait) { bool result = false; ! if (FRunning == false) { ! FRunning = true; ! ! int handles[2]; ! ! if (pipe(handles) == -1) { ! return false; ! } ! ! struct sigaction sa; ! sa.sa_handler = SIG_IGN; ! sigemptyset(&sa.sa_mask); ! sa.sa_flags = 0; ! ! FChildPID = fork(); ! ! // PID returned by vfork is 0 for the child process and the ! // PID of the child process for the parent. ! if (FChildPID == -1) { ! // Error ! TString message = PlatformString::Format( ! _T("Error: Unable to create process %s"), ! Application.data()); ! throw Exception(message); ! } else if (FChildPID == 0) { ! Cleanup(); ! TString command = Application; ! ! for (std::vector<TString>::const_iterator iterator = ! Arguments.begin(); iterator != Arguments.end(); ! iterator++) { ! command += TString(_T(" ")) + *iterator; ! } ! #ifdef DEBUG ! printf("%s\n", command.data()); ! #endif // DEBUG ! ! dup2(handles[PIPE_READ], STDIN_FILENO); ! dup2(handles[PIPE_WRITE], STDOUT_FILENO); ! ! close(handles[PIPE_READ]); ! close(handles[PIPE_WRITE]); ! ! execl("/bin/sh", "sh", "-c", command.data(), (char *) 0); ! ! _exit(127); ! } else { ! FOutputHandle = handles[PIPE_READ]; ! FInputHandle = handles[PIPE_WRITE]; ! ! if (AWait == true) { ! ReadOutput(); ! Wait(); ! Cleanup(); ! FRunning = false; result = true; + } else { + result = true; + } + } } return result; } //---------------------------------------------------------------------------- #ifndef __UNIX_JPACKAGE_PLATFORM__ #define __UNIX_JPACKAGE_PLATFORM__
*** 227,236 **** --- 309,319 ---- #define JPACKAGE_STRDUP(strSource) \ strdup((strSource)) //return "error code" (like on Windows) + static int JPACKAGE_STRNCPY(char *strDest, size_t numberOfElements, const char *strSource, size_t count) { char *s = strncpy(strDest, strSource, count); // Duplicate behavior of the Windows' _tcsncpy_s() by adding a NULL // terminator at the end of the string.
*** 336,363 **** XMLAttribute* _next; // Next attribute for this tag }; // Public interface static void RemoveNonAsciiUTF8FromBuffer(char *buf); ! XMLNode* ParseXMLDocument (TCHAR* buf); ! void FreeXMLDocument (XMLNode* root); // Utility methods for parsing document ! XMLNode* FindXMLChild (XMLNode* root, const TCHAR* name); ! TCHAR* FindXMLAttribute (XMLAttribute* attr, const TCHAR* name); // Debugging void PrintXMLDocument(XMLNode* node, int indt); - #include <sys/types.h> #include <sys/stat.h> #include <setjmp.h> #include <stdlib.h> #include <wctype.h> - #define JWS_assert(s, msg) \ if (!(s)) { Abort(msg); } // Internal declarations --- 419,444 ---- XMLAttribute* _next; // Next attribute for this tag }; // Public interface static void RemoveNonAsciiUTF8FromBuffer(char *buf); ! XMLNode* ParseXMLDocument(TCHAR* buf); ! void FreeXMLDocument(XMLNode* root); // Utility methods for parsing document ! XMLNode* FindXMLChild(XMLNode* root, const TCHAR* name); ! TCHAR* FindXMLAttribute(XMLAttribute* attr, const TCHAR* name); // Debugging void PrintXMLDocument(XMLNode* node, int indt); #include <sys/types.h> #include <sys/stat.h> #include <setjmp.h> #include <stdlib.h> #include <wctype.h> #define JWS_assert(s, msg) \ if (!(s)) { Abort(msg); } // Internal declarations
*** 455,505 **** char* q; char c; p = q = buf; // We are not using NEXT_CHAR() to check if *q is NULL, as q is output // location and offset for q is smaller than for p. ! while(*p != '\0') { c = *p; ! if ( (c & 0x80) == 0) { /* Range A */ *q++ = *p; NEXT_CHAR(p); ! } else if ((c & 0xE0) == 0xC0){ /* Range B */ ! *q++ = (char)0xFF; NEXT_CHAR(p); NEXT_CHAR_OR_BREAK(p); } else { /* Range C */ ! *q++ = (char)0xFF; NEXT_CHAR(p); SKIP_CHARS_OR_BREAK(p, 2); } } /* Null terminate string */ *q = '\0'; } static TCHAR* SkipWhiteSpace(TCHAR *p) { if (p != NULL) { ! while(iswspace(*p)) NEXT_CHAR_OR_BREAK(p); } return p; } static TCHAR* SkipXMLName(TCHAR *p) { TCHAR c = *p; /* Check if start of token */ ! if ( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '_' || c == ':') { ! while( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || ! c == '_' || c == ':' || c == '.' || c == '-' ) { NEXT_CHAR(p); c = *p; if (c == '\0') break; } } --- 536,586 ---- char* q; char c; p = q = buf; // We are not using NEXT_CHAR() to check if *q is NULL, as q is output // location and offset for q is smaller than for p. ! while (*p != '\0') { c = *p; ! if ((c & 0x80) == 0) { /* Range A */ *q++ = *p; NEXT_CHAR(p); ! } else if ((c & 0xE0) == 0xC0) { /* Range B */ ! *q++ = (char) 0xFF; NEXT_CHAR(p); NEXT_CHAR_OR_BREAK(p); } else { /* Range C */ ! *q++ = (char) 0xFF; NEXT_CHAR(p); SKIP_CHARS_OR_BREAK(p, 2); } } /* Null terminate string */ *q = '\0'; } static TCHAR* SkipWhiteSpace(TCHAR *p) { if (p != NULL) { ! while (iswspace(*p)) NEXT_CHAR_OR_BREAK(p); } return p; } static TCHAR* SkipXMLName(TCHAR *p) { TCHAR c = *p; /* Check if start of token */ ! if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '_' || c == ':') { ! while (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || ! c == '_' || c == ':' || c == '.' || c == '-') { NEXT_CHAR(p); c = *p; if (c == '\0') break; } }
*** 514,524 **** if (JPACKAGE_STRNCMP(p, _T("-->"), 3) == 0) { SKIP_CHARS(p, 3); return p; } NEXT_CHAR(p); ! } while(*p != '\0'); } } return p; } --- 595,605 ---- if (JPACKAGE_STRNCMP(p, _T("-->"), 3) == 0) { SKIP_CHARS(p, 3); return p; } NEXT_CHAR(p); ! } while (*p != '\0'); } } return p; }
*** 546,556 **** if (JPACKAGE_STRNCMP(p, _T("?>"), 2) == 0) { SKIP_CHARS(p, 2); return p; } NEXT_CHAR(p); ! } while(*p != '\0'); } } return p; } --- 627,637 ---- if (JPACKAGE_STRNCMP(p, _T("?>"), 2) == 0) { SKIP_CHARS(p, 2); return p; } NEXT_CHAR(p); ! } while (*p != '\0'); } } return p; }
*** 561,576 **** static void ConvertBuiltInEntities(TCHAR* p) { TCHAR* q; q = p; // We are not using NEXT_CHAR() to check if *q is NULL, // as q is output location and offset for q is smaller than for p. ! while(*p) { if (IsPCData(p)) { /* dont convert &xxx values within PData */ TCHAR *end; end = SkipPCData(p); ! while(p < end) { *q++ = *p; NEXT_CHAR(p); } } else { if (JPACKAGE_STRNCMP(p, _T("&amp;"), 5) == 0) { --- 642,657 ---- static void ConvertBuiltInEntities(TCHAR* p) { TCHAR* q; q = p; // We are not using NEXT_CHAR() to check if *q is NULL, // as q is output location and offset for q is smaller than for p. ! while (*p) { if (IsPCData(p)) { /* dont convert &xxx values within PData */ TCHAR *end; end = SkipPCData(p); ! while (p < end) { *q++ = *p; NEXT_CHAR(p); } } else { if (JPACKAGE_STRNCMP(p, _T("&amp;"), 5) == 0) {
*** 617,628 **** /* Copy token from buffer to Token variable */ static void SetToken(int type, TCHAR* start, TCHAR* end) { int len = end - start; if (len > MaxTokenSize) { if (CurTokenName != NULL) free(CurTokenName); ! CurTokenName = (TCHAR *)malloc((len + 1) * sizeof(TCHAR)); ! if (CurTokenName == NULL ) { return; } MaxTokenSize = len; } --- 698,709 ---- /* Copy token from buffer to Token variable */ static void SetToken(int type, TCHAR* start, TCHAR* end) { int len = end - start; if (len > MaxTokenSize) { if (CurTokenName != NULL) free(CurTokenName); ! CurTokenName = (TCHAR *) malloc((len + 1) * sizeof (TCHAR)); ! if (CurTokenName == NULL) { return; } MaxTokenSize = len; }
*** 640,658 **** q = CurPos; CurPos = SkipWhiteSpace(CurPos); CurPos = SkipXMLComment(CurPos); /* Must be called befor DocTypes */ CurPos = SkipXMLDocType(CurPos); /* <! ... > directives */ CurPos = SkipXMLProlog(CurPos); /* <? ... ?> directives */ ! } while(CurPos != q); return CurPos; } /* Parses next token and initializes the global token variables above The tokennizer automatically skips comments (<!-- comment -->) and <! ... > directives. ! */ static void GetNextToken(void) { TCHAR *p, *q; /* Skip white space and comment sections */ p = SkipFilling(); --- 721,739 ---- q = CurPos; CurPos = SkipWhiteSpace(CurPos); CurPos = SkipXMLComment(CurPos); /* Must be called befor DocTypes */ CurPos = SkipXMLDocType(CurPos); /* <! ... > directives */ CurPos = SkipXMLProlog(CurPos); /* <? ... ?> directives */ ! } while (CurPos != q); return CurPos; } /* Parses next token and initializes the global token variables above The tokennizer automatically skips comments (<!-- comment -->) and <! ... > directives. ! */ static void GetNextToken(void) { TCHAR *p, *q; /* Skip white space and comment sections */ p = SkipFilling();
*** 677,687 **** CurTokenType = TOKEN_EMPTY_CLOSE_BRACKET; SKIP_CHARS(p, 2); } else { /* Search for end of data */ q = p + 1; ! while(*q && *q != '<') { if (IsPCData(q)) { q = SkipPCData(q); } else { NEXT_CHAR(q); } --- 758,768 ---- CurTokenType = TOKEN_EMPTY_CLOSE_BRACKET; SKIP_CHARS(p, 2); } else { /* Search for end of data */ q = p + 1; ! while (*q && *q != '<') { if (IsPCData(q)) { q = SkipPCData(q); } else { NEXT_CHAR(q); }
*** 695,705 **** CurPos = p; } static XMLNode* CreateXMLNode(int type, TCHAR* name) { XMLNode* node; ! node = (XMLNode*)malloc(sizeof(XMLNode)); if (node == NULL) { return NULL; } node->_type = type; node->_name = name; --- 776,786 ---- CurPos = p; } static XMLNode* CreateXMLNode(int type, TCHAR* name) { XMLNode* node; ! node = (XMLNode*) malloc(sizeof (XMLNode)); if (node == NULL) { return NULL; } node->_type = type; node->_name = name;
*** 709,719 **** return node; } static XMLAttribute* CreateXMLAttribute(TCHAR *name, TCHAR* value) { XMLAttribute* attr; ! attr = (XMLAttribute*)malloc(sizeof(XMLAttribute)); if (attr == NULL) { return NULL; } attr->_name = name; attr->_value = value; --- 790,800 ---- return node; } static XMLAttribute* CreateXMLAttribute(TCHAR *name, TCHAR* value) { XMLAttribute* attr; ! attr = (XMLAttribute*) malloc(sizeof (XMLAttribute)); if (attr == NULL) { return NULL; } attr->_name = name; attr->_value = value;
*** 722,733 **** } XMLNode* ParseXMLDocument(TCHAR* buf) { XMLNode* root; int err_code = setjmp(jmpbuf); ! switch (err_code) ! { case JMP_NO_ERROR: #ifndef _UNICODE /* Remove UTF-8 encoding from buffer */ RemoveNonAsciiUTF8FromBuffer(buf); #endif --- 803,813 ---- } XMLNode* ParseXMLDocument(TCHAR* buf) { XMLNode* root; int err_code = setjmp(jmpbuf); ! switch (err_code) { case JMP_NO_ERROR: #ifndef _UNICODE /* Remove UTF-8 encoding from buffer */ RemoveNonAsciiUTF8FromBuffer(buf); #endif
*** 744,754 **** if (root_node != NULL) { FreeXMLDocument(root_node); root_node = NULL; } if (CurTokenName != NULL) free(CurTokenName); ! fprintf(stderr,"Error during parsing jnlp file...\n"); exit(-1); break; default: root = NULL; break; --- 824,834 ---- if (root_node != NULL) { FreeXMLDocument(root_node); root_node = NULL; } if (CurTokenName != NULL) free(CurTokenName); ! fprintf(stderr, "Error during parsing jnlp file...\n"); exit(-1); break; default: root = NULL; break;
*** 767,783 **** /* Create node for new element tag */ node = CreateXMLNode(xmlTagType, JPACKAGE_STRDUP(CurTokenName)); /* We need to save root node pointer to be able to cleanup if an error happens during parsing */ ! if(!root_node) { root_node = node; } /* Parse attributes. This section eats a all input until EOF, a > or a /> */ attr = ParseXMLAttribute(); ! while(attr != NULL) { attr->_next = node->_attributes; node->_attributes = attr; attr = ParseXMLAttribute(); } --- 847,863 ---- /* Create node for new element tag */ node = CreateXMLNode(xmlTagType, JPACKAGE_STRDUP(CurTokenName)); /* We need to save root node pointer to be able to cleanup if an error happens during parsing */ ! if (!root_node) { root_node = node; } /* Parse attributes. This section eats a all input until EOF, a > or a /> */ attr = ParseXMLAttribute(); ! while (attr != NULL) { attr->_next = node->_attributes; node->_attributes = attr; attr = ParseXMLAttribute(); }
*** 785,800 **** * TOKEN_EMPTY_CLOSE_BRACKET */ GetNextToken(); /* Skip until '>', '/>' or EOF. This should really be an error, */ /* but we are loose */ ! // if(CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET || ! // CurTokenType == TOKEN_CLOSE_BRACKET || ! // CurTokenType == TOKEN_EOF) { ! // println("XML Parsing error: wrong kind of token found"); ! // return NULL; ! // } if (CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET) { GetNextToken(); /* We are done with the sublevel - fall through to continue */ /* parsing tags at the same level */ --- 865,880 ---- * TOKEN_EMPTY_CLOSE_BRACKET */ GetNextToken(); /* Skip until '>', '/>' or EOF. This should really be an error, */ /* but we are loose */ ! // if(CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET || ! // CurTokenType == TOKEN_CLOSE_BRACKET || ! // CurTokenType == TOKEN_EOF) { ! // println("XML Parsing error: wrong kind of token found"); ! // return NULL; ! // } if (CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET) { GetNextToken(); /* We are done with the sublevel - fall through to continue */ /* parsing tags at the same level */
*** 806,816 **** if (CurTokenType == TOKEN_END_TAG) { /* Find closing bracket '>' for end tag */ do { GetNextToken(); ! } while(CurTokenType != TOKEN_EOF && CurTokenType != TOKEN_CLOSE_BRACKET); GetNextToken(); } } --- 886,896 ---- if (CurTokenType == TOKEN_END_TAG) { /* Find closing bracket '>' for end tag */ do { GetNextToken(); ! } while (CurTokenType != TOKEN_EOF && CurTokenType != TOKEN_CLOSE_BRACKET); GetNextToken(); } }
*** 824,834 **** } else if (CurTokenType == TOKEN_PCDATA) { /* Create node for pcdata */ node = CreateXMLNode(xmlPCDataType, JPACKAGE_STRDUP(CurTokenName)); /* We need to save root node pointer to be able to cleanup if an error happens during parsing */ ! if(!root_node) { root_node = node; } GetNextToken(); return node; } --- 904,914 ---- } else if (CurTokenType == TOKEN_PCDATA) { /* Create node for pcdata */ node = CreateXMLNode(xmlPCDataType, JPACKAGE_STRDUP(CurTokenName)); /* We need to save root node pointer to be able to cleanup if an error happens during parsing */ ! if (!root_node) { root_node = node; } GetNextToken(); return node; }
*** 841,852 **** static XMLAttribute* ParseXMLAttribute(void) { TCHAR* q = NULL; TCHAR* name = NULL; TCHAR* PrevPos = NULL; ! do ! { /* We need to check this condition to avoid endless loop in case if an error happend during parsing. */ if (PrevPos == CurPos) { if (name != NULL) { free(name); --- 921,931 ---- static XMLAttribute* ParseXMLAttribute(void) { TCHAR* q = NULL; TCHAR* name = NULL; TCHAR* PrevPos = NULL; ! do { /* We need to check this condition to avoid endless loop in case if an error happend during parsing. */ if (PrevPos == CurPos) { if (name != NULL) { free(name);
*** 874,884 **** return NULL; } /* Find end of name */ q = CurPos; ! while(*q && !iswspace(*q) && *q !='=') NEXT_CHAR(q); SetToken(TOKEN_UNKNOWN, CurPos, q); if (name) { free(name); name = NULL; --- 953,963 ---- return NULL; } /* Find end of name */ q = CurPos; ! while (*q && !iswspace(*q) && *q != '=') NEXT_CHAR(q); SetToken(TOKEN_UNKNOWN, CurPos, q); if (name) { free(name); name = NULL;
*** 892,915 **** /* Next TCHARacter must be '=' for a valid attribute. If it is not, this is really an error. We ignore this, and just try to parse an attribute out of the rest of the string. */ ! } while(*CurPos != '='); NEXT_CHAR(CurPos); CurPos = SkipWhiteSpace(CurPos); /* Parse CDATA part of attribute */ if ((*CurPos == '\"') || (*CurPos == '\'')) { TCHAR quoteChar = *CurPos; q = ++CurPos; ! while(*q != '\0' && *q != quoteChar) NEXT_CHAR(q); SetToken(TOKEN_CDATA, CurPos, q); CurPos = q + 1; } else { q = CurPos; ! while(*q != '\0' && !iswspace(*q)) NEXT_CHAR(q); SetToken(TOKEN_CDATA, CurPos, q); CurPos = q; } //Note: no need to free name and CurTokenName duplicate; they're assigned --- 971,994 ---- /* Next TCHARacter must be '=' for a valid attribute. If it is not, this is really an error. We ignore this, and just try to parse an attribute out of the rest of the string. */ ! } while (*CurPos != '='); NEXT_CHAR(CurPos); CurPos = SkipWhiteSpace(CurPos); /* Parse CDATA part of attribute */ if ((*CurPos == '\"') || (*CurPos == '\'')) { TCHAR quoteChar = *CurPos; q = ++CurPos; ! while (*q != '\0' && *q != quoteChar) NEXT_CHAR(q); SetToken(TOKEN_CDATA, CurPos, q); CurPos = q + 1; } else { q = CurPos; ! while (*q != '\0' && !iswspace(*q)) NEXT_CHAR(q); SetToken(TOKEN_CDATA, CurPos, q); CurPos = q; } //Note: no need to free name and CurTokenName duplicate; they're assigned
*** 953,963 **** if (attr == NULL) return NULL; if (JPACKAGE_STRCMP(attr->_name, name) == 0) return attr->_value; return FindXMLAttribute(attr->_next, name); } - void PrintXMLDocument(XMLNode* node, int indt) { if (node == NULL) return; if (node->_type == xmlTagType) { JPACKAGE_PRINTF(_T("\n")); --- 1032,1041 ----
*** 985,1181 **** PrintXMLAttributes(attr->_next); } static void indent(int indt) { int i; ! for(i = 0; i < indt; i++) { JPACKAGE_PRINTF(_T(" ")); } } const TCHAR *CDStart = _T("<![CDATA["); const TCHAR *CDEnd = _T("]]>"); - static TCHAR* SkipPCData(TCHAR *p) { TCHAR *end = JPACKAGE_STRSTR(p, CDEnd); if (end != NULL) { ! return end+sizeof(CDEnd); } return (++p); } static int IsPCData(TCHAR *p) { ! const int size = sizeof(CDStart); return (JPACKAGE_STRNCMP(CDStart, p, size) == 0); } - - namespace { - template<class funcType> - class DllFunction { - const Library& lib; - funcType funcPtr; - std::string theName; - - public: - DllFunction(const Library& library, - const std::string &funcName): lib(library) { - funcPtr = reinterpret_cast<funcType>(lib.GetProcAddress(funcName)); - if (!funcPtr) { - throw std::runtime_error("Failed to load function \"" - + funcName + "\" from \"" - + library.GetName() + "\" library"); - } - } - - operator funcType() const { - return funcPtr; - } - }; - } // namespace - - extern "C" { - typedef Status (*XInitThreadsFuncPtr)(); - typedef Display* (*XOpenDisplayFuncPtr)(char *display_name); - - typedef Atom (*XInternAtomFuncPtr)( - Display *display, char *atom_name, Bool only_if_exists); - - typedef Window (*XDefaultRootWindowFuncPtr)(Display *display); - - typedef int (*XCloseDisplayFuncPtr)(Display *display); - } - - ProcessReactivator::ProcessReactivator(pid_t pid): _pid(pid) { - const std::string libname = "libX11.so"; - if(!libX11.Load(libname)) { - throw std::runtime_error("Failed to load \"" + libname + "\" library"); - } - - DllFunction<XInitThreadsFuncPtr> XInitThreadsFunc(libX11, "XInitThreads"); - - XInitThreadsFunc(); - - DllFunction<XOpenDisplayFuncPtr> XOpenDisplayFunc(libX11, "XOpenDisplay"); - - _display = XOpenDisplayFunc(NULL); - - DllFunction<XInternAtomFuncPtr> XInternAtomFunc(libX11, "XInternAtom"); - - _atomPid = XInternAtomFunc(_display, (char*)"_NET_WM_PID", True); - - if (_atomPid == None) { - return; - } - - DllFunction<XDefaultRootWindowFuncPtr> XDefaultRootWindowFunc(libX11, - "XDefaultRootWindow"); - - searchWindowHelper(XDefaultRootWindowFunc(_display)); - - reactivateProcess(); - - DllFunction<XCloseDisplayFuncPtr> XCloseDisplayFunc(libX11, - "XCloseDisplay"); - - XCloseDisplayFunc(_display); - } - - extern "C" { - typedef int (*XGetWindowPropertyFuncPtr)( - Display *display, Window w, Atom property, long long_offset, - long long_length, Bool d, Atom req_type, Atom *actual_type_return, - int *actual_format_return, unsigned long *nitems_return, - unsigned long *bytes_after_return, unsigned char **prop_return); - - typedef Status (*XQueryTreeFuncPtr)( - Display *display, Window w, Window *root_return, Window *parent_return, - Window **children_return, unsigned int *nchildren_return); - - typedef int (*XFreeFuncPtr)(void *data); - } - - void ProcessReactivator::searchWindowHelper(Window w) { - - DllFunction<XGetWindowPropertyFuncPtr> XGetWindowPropertyFunc(libX11, - "XGetWindowProperty"); - - DllFunction<XFreeFuncPtr> XFreeFunc(libX11, "XFree"); - - Atom type; - int format; - unsigned long num, bytesAfter; - unsigned char* propPid = 0; - if (Success == XGetWindowPropertyFunc(_display, w, _atomPid, 0, 1, - False, XA_CARDINAL, &type, &format, &num, &bytesAfter, &propPid)) { - if (propPid != 0) { - if (_pid == *((pid_t *)propPid)) { - _result.push_back(w); - } - XFreeFunc(propPid); - } - } - - DllFunction<XQueryTreeFuncPtr> XQueryTreeFunc(libX11, "XQueryTree"); - - Window root, parent; - Window* child; - unsigned int numChildren; - if (0 != XQueryTreeFunc(_display, w, &root, - &parent, &child, &numChildren)) { - for (unsigned int i = 0; i < numChildren; i++) { - searchWindowHelper(child[i]); - } - } - } - - - extern "C" { - typedef Status (*XGetWindowAttributesFuncPtr)(Display *display, Window w, - XWindowAttributes *window_attributes_return); - - typedef Status (*XSendEventFuncPtr)(Display *display, Window w, Bool propagate, - long event_mask, XEvent *event_send); - - typedef int (*XRaiseWindowFuncPtr)(Display *display, Window w); - } - - void ProcessReactivator::reactivateProcess() { - - DllFunction<XGetWindowAttributesFuncPtr> XGetWindowAttributesFunc(libX11, - "XGetWindowAttributes"); - - DllFunction<XSendEventFuncPtr> XSendEventFunc(libX11, "XSendEvent"); - - DllFunction<XRaiseWindowFuncPtr> XRaiseWindowFunc(libX11, "XRaiseWindow"); - - DllFunction<XInternAtomFuncPtr> XInternAtomFunc(libX11, "XInternAtom"); - - for (std::list<Window>::const_iterator it = _result.begin(); - it != _result.end(); it++) { - // try sending an event to activate window, - // after that we can try to raise it. - XEvent xev; - Atom atom = XInternAtomFunc ( - _display, (char*)"_NET_ACTIVE_WINDOW", False); - xev.xclient.type = ClientMessage; - xev.xclient.serial = 0; - xev.xclient.send_event = True; - xev.xclient.display = _display; - xev.xclient.window = *it; - xev.xclient.message_type = atom; - xev.xclient.format = 32; - xev.xclient.data.l[0] = 2; - xev.xclient.data.l[1] = 0; - xev.xclient.data.l[2] = 0; - xev.xclient.data.l[3] = 0; - xev.xclient.data.l[4] = 0; - XWindowAttributes attr; - XGetWindowAttributesFunc(_display, *it, &attr); - XSendEventFunc(_display, attr.root, False, - SubstructureRedirectMask | SubstructureNotifyMask, &xev); - XRaiseWindowFunc(_display, *it); - } - } - - - #endif // LINUX --- 1063,1087 ---- PrintXMLAttributes(attr->_next); } static void indent(int indt) { int i; ! for (i = 0; i < indt; i++) { JPACKAGE_PRINTF(_T(" ")); } } const TCHAR *CDStart = _T("<![CDATA["); const TCHAR *CDEnd = _T("]]>"); static TCHAR* SkipPCData(TCHAR *p) { TCHAR *end = JPACKAGE_STRSTR(p, CDEnd); if (end != NULL) { ! return end + sizeof (CDEnd); } return (++p); } static int IsPCData(TCHAR *p) { ! const int size = sizeof (CDStart); return (JPACKAGE_STRNCMP(CDStart, p, size) == 0); }
< prev index next >