int qtNotifyStateXsldbgApp(XsldbgMessageEnum type, int commandId, XsldbgCommandStateEnum commandState, const char *text) { int result = 0; msg.type = type; msg.commandId = commandId; msg.commandState = commandState; if (text != NULL) { msg.text = (xmlChar*)xmlMemStrdup(text); if (msg.text == NULL) return result; /* out of memory */ } else msg.text = NULL; notifyXsldbgApp(XSLDBG_MSG_PROCESSING_RESULT, msgPtr); if (msg.text != NULL) { xmlFree(msg.text); msg.text = NULL; } result = 1; return result; }
/** * xslDbgShellOutput: * @arg : Is valid, either a local file name which will be expanded * if needed, or a "file://" protocol URI * * Set the output file name to use * * Returns 1 on success, * 0 otherwise */ int xslDbgShellOutput(const xmlChar *arg) { int result = 0; if (arg && (xmlStrLen(arg) > 0)){ if (!xmlStrnCmp(arg, "file:/", 6)){ /* convert URI to local file name */ xmlChar *outputFileName = filesURItoFileName(arg); if (outputFileName){ optionsSetStringOption(OPTIONS_OUTPUT_FILE_NAME, outputFileName); notifyXsldbgApp(XSLDBG_MSG_FILE_CHANGED, 0L); xmlFree(outputFileName); result = 1; } } else if (xmlStrEqual(arg, (xmlChar*)"-")) { optionsSetStringOption(OPTIONS_OUTPUT_FILE_NAME, NULL); notifyXsldbgApp(XSLDBG_MSG_FILE_CHANGED, 0L); result = 1; } else if (!xmlStrnCmp(arg, "ftp://", 6) || !xmlStrnCmp(arg, "http://", 7)){ xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("output")); return 0; } else { /* assume that we were provided a local file name * that may need expanding */ xmlChar *expandedName = filesExpandName(arg); // The output file must not be the same as our SOURCE or DATA file if (expandedName && (!xmlStrEqual(optionsGetStringOption(OPTIONS_SOURCE_FILE_NAME), expandedName)) && (!xmlStrEqual(optionsGetStringOption(OPTIONS_DATA_FILE_NAME), expandedName)) ){ optionsSetStringOption(OPTIONS_OUTPUT_FILE_NAME, expandedName); notifyXsldbgApp(XSLDBG_MSG_FILE_CHANGED, 0L); xmlFree(expandedName); result = 1; }else{ xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("output")); } } } else { xsldbgGenericErrorFunc(i18n("Error: Missing arguments for the command %1.\n").arg("output")); } return result; }
int notifyListSend(void) { int result = 0; if (notifyList && msgList) { notifyXsldbgApp(XSLDBG_MSG_LIST, notifyList); result = 1; } return result; }
/** * xslDbgSystem: * @arg : Is valid * * Print what a system file @arg maps to via the current xml catalog * * Returns 1 on sucess, * 0 otherwise */ int xslDbgSystem(const xmlChar * arg) { int result = 0; xmlChar *name; if (!arg || (xmlStrlen(arg) == 0)) { #ifdef WITH_XSLDBG_DEBUG_PROCESS xsltGenericError(xsltGenericErrorContext, "Error: NULL argument provided\n"); #endif return result; } name = xmlCatalogResolveSystem(arg); if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { if (name) { notifyXsldbgApp(XSLDBG_MSG_RESOLVE_CHANGE, name); result = 1; xmlFree(name); } else { notifyXsldbgApp(XSLDBG_MSG_RESOLVE_CHANGE, ""); xsldbgGenericErrorFunc(i18n("SystemID \"%1\" was not found in current catalog.\n").arg(xsldbgText(arg))); } } else { if (name) { xsldbgGenericErrorFunc(i18n("SystemID \"%1\" maps to: \"%2\"\n").arg(xsldbgText(arg)).arg(xsldbgText(name))); xmlFree(name); result = 1; } else { xsldbgGenericErrorFunc(i18n("SystemID \"%1\" was not found in current catalog.\n").arg(xsldbgText(arg))); } } return result; }
/* this is where the thread get to do all its work */ void * xsldbgThreadMain(void *) { // int defaultArgc = 2; // char *defaultArgv[2]; // int i; if (getThreadStatus() != XSLDBG_MSG_THREAD_INIT){ fprintf(stderr, "xsldbg thread is not ready to be started. Or one is already running.\n"); return NULL; /* we can't start more than one thread of xsldbg */ } // defaultArgv[0] = xmlMemStrdup("xsldbg"); // defaultArgv[1] = xmlMemStrdup("--shell"); /* defaultArgv[2] = xmlMemStrdup("xsldoc.xsl"); defaultArgv[3] = xmlMemStrdup("xsldoc.xml"); */ /* for (i = 0; i < defaultArgc; i++){ if (defaultArgv[i] == NULL){ fprintf(stderr, "Start thread failed. Unable to create xsldbg arguments\n"); return NULL; } } */ xsldbgSetThreadCleanupFunc(xsldbgThreadCleanupQt); setThreadStatus(XSLDBG_MSG_THREAD_RUN); setInputStatus(XSLDBG_MSG_AWAITING_INPUT); fprintf(stderr, "Starting thread\n"); /* call the "main of xsldbg" found in debugXSL.c */ // xsldbgMain(defaultArgc, defaultArgv); xsldbgMain(0,0); fprintf(stderr, "Stopping thread\n"); /* for (i = 0; i < defaultArgc; i++){ xmlFree(defaultArgv[i]); } */ setThreadStatus(XSLDBG_MSG_THREAD_DEAD); setInputStatus(XSLDBG_MSG_PROCESSING_INPUT); notifyXsldbgApp(XSLDBG_MSG_THREAD_DEAD, NULL); return NULL; }
static int printXPathObject(xmlXPathObjectPtr item, xmlChar* xPath){ int result = 0; if (item){ switch (item->type) { case XPATH_BOOLEAN: xsltGenericError(xsltGenericErrorContext, "= %s\n%s\n", xPath, xmlBoolToText(item->boolval)); result = 1; break; case XPATH_NUMBER: xsltGenericError(xsltGenericErrorContext, "= %s\n%0g\n", xPath, item->floatval); result = 1; break; /* case XPATH_NODESET:*/ default:{ /* We may need to convert this XPath to a string, plus ensure that we print required the number of lines of text */ int indx; const char *fileName = filesTempFileName(0); FILE *file = NULL; if (!fileName) break; file = fopen(fileName, "w+"); if (!file) { xsldbgGenericErrorFunc(i18n("Error: Unable to save temporary results to %1.\n").arg(xsldbgText(fileName))); break; } else { fprintf(file, "= %s\n", xPath); switch(item->type){ case XPATH_NODESET: if (item->nodesetval){ for (indx = 0; indx < item->nodesetval->nodeNr; indx++){ xslDbgCatToFile(item->nodesetval-> nodeTab[indx], file); } } else { xsldbgGenericErrorFunc(i18n("Error: XPath %1 results in an empty Node Set.\n").arg(xsldbgText(xPath))); } break; case XPATH_STRING: if (item->stringval) fprintf(file, "\'%s\'", item->stringval); else fprintf(file, "%s", i18n("NULL string value supplied.").utf8().data()); break; default:{ xmlXPathObjectPtr tempObj = xmlXPathObjectCopy(item); if (tempObj) tempObj = xmlXPathConvertString(tempObj); if (tempObj && tempObj->stringval){ fprintf(file, "%s", tempObj->stringval); }else{ fprintf(file, "%s", i18n("Unable to convert XPath to string.").utf8().data()); } if (tempObj) xmlXPathFreeObject(tempObj); } break; fprintf(file,"\n"); } /* inner switch statement */ if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { fclose(file); file = NULL; /* send the data to application */ notifyXsldbgApp(XSLDBG_MSG_FILEOUT, fileName); } else { int lineCount = 0, gdbModeEnabled = 0; /* save the value of option to speed things up * a bit */ gdbModeEnabled = optionsGetIntOption(OPTIONS_GDB); rewind(file); /* when gdb mode is enable then only print the first * GDB_LINES_TO_PRINT lines */ while (!feof(file)) { if (fgets ((char *) nodeViewBuffer, sizeof(nodeViewBuffer), file)) xsltGenericError (xsltGenericErrorContext, "%s", nodeViewBuffer); if (gdbModeEnabled) { lineCount++; /* there is an overhead of two lines * when print expression values */ if (lineCount == GDB_LINES_TO_PRINT + 2) { xsltGenericError (xsltGenericErrorContext, "..."); break; } } } xsltGenericError (xsltGenericErrorContext, "\n"); } if (file) fclose(file); result = 1; break; } } } } return result; }
/** * qtXslDbgShellReadline: * @prompt: the prompt value * * Read a string * * Returns a copy of the text inputed or NULL if EOF in stdin found. * The caller is expected to free the returned string. */ xmlChar * qtXslDbgShellReadline(xmlChar * prompt) { const char *inputReadBuff; static char last_read[DEBUG_BUFFER_SIZE] = { '\0' }; if (getThreadStatus() != XSLDBG_MSG_THREAD_RUN) { #ifdef HAVE_READLINE xmlChar *line_read; /* Get a line from the user. */ line_read = (xmlChar *) readline((char *) prompt); /* If the line has any text in it, save it on the history. */ if (line_read && *line_read) { add_history((char *) line_read); strncpy((char*)last_read, (char*)line_read, DEBUG_BUFFER_SIZE - 1); } else { /* if only <Enter>is pressed then try last saved command line */ line_read = (xmlChar *) xmlMemStrdup(last_read); } return (line_read); #else char line_read[DEBUG_BUFFER_SIZE]; if (prompt != NULL) xsltGenericError(xsltGenericErrorContext, "%s", prompt); if (!fgets(line_read, DEBUG_BUFFER_SIZE - 1, stdin)) return (NULL); line_read[DEBUG_BUFFER_SIZE - 1] = 0; /* if only <Enter>is pressed then try last saved command line */ if ((strlen(line_read) == 0) || (line_read[0] == '\n')) { strcpy(line_read, last_read); } else { strcpy(last_read, line_read); } return (xmlChar *) xmlMemStrdup(line_read); #endif } else{ setInputStatus(XSLDBG_MSG_AWAITING_INPUT); notifyXsldbgApp(XSLDBG_MSG_AWAITING_INPUT, NULL); while (getInputReady() == 0){ usleep(10000); /* have we been told to die */ if (getThreadStatus() == XSLDBG_MSG_THREAD_STOP){ fprintf(stderr, "About to stop thread\n"); xslDebugStatus = DEBUG_QUIT; return NULL; } } setInputStatus(XSLDBG_MSG_READ_INPUT); inputReadBuff = getFakeInput(); if(inputReadBuff){ notifyXsldbgApp(XSLDBG_MSG_READ_INPUT, inputReadBuff); return (xmlChar*)xmlMemStrdup(inputReadBuff); }else{ return NULL; } } }