/* This file is part of vdr-filebrowser. vdr-filebrowser 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 3 of the License, or (at your option) any later version. vdr-filebrowser 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 Foobar. If not, see . */ #ifndef FILEBROWSER_TOOLS_H #define FILEBROWSER_TOOLS_H #include #include "statebag.h" #ifdef DEBUG #define D(s) s #else #define D(s) #endif template class cListContainer : public cListObject { protected: T* Object; bool FreeOnDel; public: cListContainer(T *Object, bool FreeOnDel=true) { this->Object = Object; this->FreeOnDel = FreeOnDel; } ~cListContainer() { if(FreeOnDel && Object) delete Object; }; T* GetObject() { return Object; }; void Free() { if(Object) delete Object; }; cListContainer* Next() { return (cListContainer*)cListObject::Next(); }; cListContainer* Prev() { return (cListContainer*)cListObject::Prev(); }; }; class cStringContainer : public cListContainer { public: cStringContainer(char* Object, bool FreeOnDel=true) : cListContainer(Object, FreeOnDel) {}; ~cStringContainer() {}; }; class cStringContainerList : public cList { public: bool Contains(const char* String); void Remove(const char* String); }; class cConfigReader { protected: cReadLine* Reader; FILE* File; public: cConfigReader(cFilebrowserStatebag* Statebag, const char* Filename); ~cConfigReader(); char* Read(); private: void StripComment(char* string); bool IsBlank(const char* string); }; class cConfigParser { protected: char* Line; char* Buffer; char* Pos; int FieldNumber; int CurrentLength; static const char Delimiter=':'; static const char Escape='%'; public: cConfigParser(char* Line, bool TakePointer=false); ~cConfigParser(); char* First(); char* Next(); int GetFieldNumber() { return FieldNumber; }; int GetCurrentLength() { return CurrentLength; }; }; class cCommandParser { public: class cHandlerParameters { public: bool DoReplacements; bool ShellEscape; char Key; void* Data; }; typedef char* (*ParseProc)(const char*, const char*, const cHandlerParameters*); protected: class cHandler : public cListObject { public: ParseProc Proc; cHandlerParameters Params; }; class cHandlerList : public cList {}; cHandlerList* Handlers; bool DoReplacements; bool ShellEscape; cString Command; static char* ReplacementHandler(const char* OrgString, const char* CurrentPos, const cHandlerParameters* Params); public: cCommandParser(const cString &Command, bool DoReplacements=true, bool ShellEscape=true); ~cCommandParser(); void AddHandler(char Key, ParseProc Proc, void* Data); void AddReplacement(char Key, const char* String); cString Parse(); /* Escapes a string to be used as argument for sh Puts it into single quotes and escapes/quotes single quotes in Argument Writes length of result (without \0) into EscapedLength You need to free the return value! */ static char* EscapeShellArgument(char* Argument, int* EscapedLength); }; #endif