diff options
Diffstat (limited to 'commands.c')
-rw-r--r-- | commands.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/commands.c b/commands.c new file mode 100644 index 0000000..f1649ea --- /dev/null +++ b/commands.c @@ -0,0 +1,239 @@ +/* + * Image plugin to VDR (C++) + * + * (C) 2004 Andreas Brachold <vdr04-at-deltab.de> + * + * This code is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#include <malloc.h> +#include <ctype.h> +#include <stdlib.h> +#include <unistd.h> + +#include "commands.h" +#include "setup-image.h" + + +// --- cImageCommand ------------------------------------------------------------- + +char *cImageCommand::m_szLastResult = NULL; + +cImageCommand::cImageCommand(void) +: m_szTitle(NULL) +, m_szCommand(NULL) +, m_bConfirm(false) +{ + +} + +cImageCommand::~cImageCommand() +{ + if(m_szTitle) + { + free(m_szTitle); + m_szTitle = NULL; + } + if(m_szCommand) + { + free(m_szCommand); + m_szCommand = NULL; + } +} + +bool cImageCommand::Parse(const char *s) +{ + const char *p = strchr(s, ':'); + if(p) + { + int l = p - s; + if(l > 0) + { + m_szTitle = MALLOC(char, l + 1); + stripspace(strn0cpy(m_szTitle, s, l + 1)); + if(!isempty(m_szTitle)) + { + int l = strlen(m_szTitle); + if(l > 1 && m_szTitle[l - 1] == '?') + { + m_bConfirm = true; + m_szTitle[l - 1] = 0; + } + m_szCommand = stripspace(strdup(skipspace(p + 1))); + return !isempty(m_szCommand); + } + } + } + return false; +} + + + +const char *cImageCommand::Execute(const char *szFileName) +{ + char *szCmdBuf = NULL; + + if(m_szLastResult) + { + free(m_szLastResult); + m_szLastResult = NULL; + } + + // Combine command and filename + if(szFileName && m_szCommand) { + + if(NULL == strstr(m_szCommand, "%s")) { + /// Merge command and filename e.g : identify 'my_image.png' + asprintf(&szCmdBuf, "%s \'%s\'", m_szCommand, szFileName); + } + else { + /// Replace Mode, replace any %s with filename + /// e.g. : jpegtran -rotate 90 %s > $CONVERT_TEMPDIR/tmp.jpg && mv $CONVERT_TEMPDIR/tmp.jpg %s + /// would to jpegtran -rotate 90 'my_image.png' > $CONVERT_TEMPDIR/tmp.jpg && mv $CONVERT_TEMPDIR/tmp.jpg 'my_image.png' + char *szF; + asprintf(&szF, "\'%s\'", szFileName); + if(szF) { + szCmdBuf = (char*)calloc(PATH_MAX,1); + if(szCmdBuf) + { + char* d = szCmdBuf; + char* s = m_szCommand; + for(;d-szCmdBuf < PATH_MAX-1 && *s != '\0';++s,++d) + { + if(*s == '%' && *(s+1) == 's') + { + strncat(szCmdBuf,szF,PATH_MAX-1); + d += strlen(szF)-1; + ++s; + } + else + *d = *s; + } + } + } + free(szF); + } + } + + const char *szCmd = szCmdBuf ? szCmdBuf : m_szCommand; + dsyslog("imageplugin: executing command '%s'", szCmd); + + // Set environment + ImageSetup.SetEnv(); + + FILE *p = popen(szCmd, "r"); + if(p) + { + int l = 0; + int c; + while((c = fgetc(p)) != EOF) + { + if(l % 20 == 0) { + m_szLastResult = (char *)realloc(m_szLastResult, l + 21); + if(!m_szLastResult) + break; + } + m_szLastResult[l++] = c; + } + if(m_szLastResult) + m_szLastResult[l] = 0; + pclose(p); + } + else + esyslog("imageplugin: can't open pipe for command '%s'", szCmd); + + if(szCmdBuf) + free(szCmdBuf); + + return m_szLastResult; +} + +cImageCommands::cImageCommands(void) +: m_szFileName(NULL) +{ + +} + +cImageCommands::~ cImageCommands() +{ + Clear(); +} + +void cImageCommands::Clear(void) +{ + if(m_szFileName) + free(m_szFileName); + m_szFileName = NULL; + cList < cImageCommand >::Clear(); +} + + +bool cImageCommands::Load(const char *szFileName/* = NULL*/, bool bAllowComments /*=true*/, bool bMustExist /*= false*/) +{ + Clear(); + if(szFileName) + { + m_szFileName = strdup(szFileName); + m_bAllowComments = bAllowComments; + } + + bool bRet = !bMustExist; + if(m_szFileName && access(m_szFileName, F_OK) == 0) + { + isyslog("imageplugin: loading %s", m_szFileName); + FILE *f = fopen(m_szFileName, "r"); + if(f) + { + int n = 0; + char szBuf[8192]; + bRet = true; + while(fgets(szBuf, sizeof(szBuf), f) > 0) + { + ++n; + if(m_bAllowComments) + { + char *p = strchr(szBuf, '#'); + if(p) + *p = 0; + } + stripspace(szBuf); + if(!isempty(szBuf)) + { + cImageCommand *l = new cImageCommand; + if(l->Parse(szBuf)) + { + Add(l); + } + else + { + esyslog("imageplugin: error in %s, line %d\n",m_szFileName, n); + delete l; + bRet = false; + break; + } + } + } + fclose(f); + } else + { + esyslog("imageplugin: error %s: %m", m_szFileName); + bRet = false; + } + } + if(!bRet) + esyslog("imageplugin: error while reading '%s'\n", m_szFileName); + return bRet; +} |