Added archived echoes support
This commit is contained in:
@@ -611,6 +611,7 @@ CfgGed::CfgGed() {
|
||||
// tpl.clear();
|
||||
// twitname.clear();
|
||||
// twitsubj.clear();
|
||||
// unpacker.clear();
|
||||
// username.clear();
|
||||
// wtpl.clear();
|
||||
// xlatcharset.clear();
|
||||
|
@@ -359,6 +359,7 @@ const word CRC_TWITMODE = 0x9DC8;
|
||||
const word CRC_TWITNAME = 0x2055;
|
||||
const word CRC_TWITSUBJ = 0x08C0;
|
||||
const word CRC_TWITTO = 0x9DFE;
|
||||
const word CRC_UNPACKER = 0x5691;
|
||||
const word CRC_URLHANDLER = 0x688E;
|
||||
const word CRC_USEAREA = 0x2FD4;
|
||||
const word CRC_USECHARSET = 0xE1B9;
|
||||
|
@@ -555,6 +555,7 @@ SwitchT:
|
||||
|
||||
SwitchU:
|
||||
switch(crc) {
|
||||
case CRC_UNPACKER : CfgUnpacker (); break;
|
||||
case CRC_URLHANDLER : CfgUrlhandler (); break;
|
||||
case CRC_USEAREA : CfgUsearea (); break;
|
||||
case CRC_USECHARSET : CfgUsecharset (); break;
|
||||
|
@@ -274,6 +274,20 @@ void CfgTwitsubj() {
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
void CfgUnpacker() {
|
||||
|
||||
char* key;
|
||||
std::pair<std::string, std::string> unpackerentry;
|
||||
|
||||
getkeyval(&key, &val);
|
||||
|
||||
unpackerentry.first = key;
|
||||
unpackerentry.second = StripQuotes(val);
|
||||
CFG->unpacker.push_back(unpackerentry);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
void CfgUrlhandler() {
|
||||
|
||||
// Get util number
|
||||
|
@@ -341,6 +341,7 @@ void CfgTwitmode ();
|
||||
void CfgTwitname ();
|
||||
void CfgTwitsubj ();
|
||||
void CfgTwitto ();
|
||||
void CfgUnpacker ();
|
||||
void CfgUrlhandler ();
|
||||
void CfgUsearea ();
|
||||
void CfgUsecharset ();
|
||||
|
@@ -337,6 +337,7 @@ public:
|
||||
int twitmode; // showtwits;
|
||||
std::vector<Node> twitname;
|
||||
gstrarray twitsubj;
|
||||
std::vector< std::pair<std::string, std::string> > unpacker;
|
||||
ExtUtil urlhandler;
|
||||
bool usearea;
|
||||
bool usecharset;
|
||||
|
@@ -26,6 +26,7 @@
|
||||
|
||||
|
||||
#include <golded.h>
|
||||
#include <gdirposx.h>
|
||||
#include <gutlos.h>
|
||||
#include <gmoprot.h>
|
||||
#ifdef __UNIX__
|
||||
@@ -122,6 +123,7 @@ void Cleanup(void) {
|
||||
CFG->xlatescset.clear();
|
||||
CFG->cmdkey.clear();
|
||||
CFG->macro.clear();
|
||||
CFG->unpacker.clear();
|
||||
|
||||
// Free misc data
|
||||
throw_xrelease(CharTable);
|
||||
@@ -465,6 +467,87 @@ int ShellToDos(char* command, char* message, int cls, int cursor, int pause) {
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
const char* Unpack(const char* archive) {
|
||||
|
||||
static Path newname;
|
||||
const char *filename = CleanFilename(archive);
|
||||
|
||||
std::vector< std::pair<std::string, std::string> >::iterator i;
|
||||
for(i = CFG->unpacker.begin(); i != CFG->unpacker.end(); i++) {
|
||||
int dots;
|
||||
const char *ext, *myext;
|
||||
for(dots = 0, ext = i->first.c_str() - 1; ext != NULL; dots++)
|
||||
ext = strchr(ext+1, '.');
|
||||
for(myext = filename + strlen(filename); (myext != filename) and (dots != 0); dots--) {
|
||||
do
|
||||
--myext;
|
||||
while((myext != filename) and (myext[0] != '.'));
|
||||
}
|
||||
if(dots or not strieql(myext+1, i->first.c_str()))
|
||||
continue;
|
||||
|
||||
Path newdir;
|
||||
mktemp(strxcpy(newdir, AddPath(CFG->temppath, "GDXXXXXX"), sizeof(Path)));
|
||||
mkdir(newdir, S_IWUSR);
|
||||
char cmdline[1024];
|
||||
strxcpy(cmdline, i->second.c_str(), sizeof(cmdline));
|
||||
strxcpy(newname, archive, sizeof(Path));
|
||||
strchg(newname, GOLD_WRONG_SLASH_CHR, GOLD_SLASH_CHR);
|
||||
strischg(cmdline, "@file", newname);
|
||||
// Store current drive/dir and change it to the temporary
|
||||
Path orgdir;
|
||||
getcwd(orgdir, sizeof(Path));
|
||||
gchdir(newdir);
|
||||
// Now unpack it
|
||||
ShellToDos(cmdline, "", LGREY|_BLACK, 0, -1);
|
||||
// Restore current directory
|
||||
gchdir(orgdir);
|
||||
strxcpy(newname, AddPath(AddBackslash(newdir), filename), sizeof(Path));
|
||||
newname[strlen(newname) - (i->first.length() + 1)] = NUL;
|
||||
return newname;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
void CleanUnpacked(const char* unpacked) {
|
||||
|
||||
gposixdir d(unpacked);
|
||||
const gdirentry *de;
|
||||
std::string removeme;
|
||||
if(is_dir(unpacked)) {
|
||||
while((de = d.nextentry("*", true)) != NULL) {
|
||||
removeme = de->dirname;
|
||||
removeme += GOLD_SLASH_CHR;
|
||||
removeme += de->name;
|
||||
if(is_dir(removeme.c_str()))
|
||||
rmdir(removeme.c_str());
|
||||
else
|
||||
remove(removeme.c_str());
|
||||
}
|
||||
}
|
||||
Path tmpdir, tmpdir2;
|
||||
strxcpy(tmpdir2, unpacked, sizeof(Path));
|
||||
StripBackslash(tmpdir2);
|
||||
extractdirname(tmpdir, tmpdir2);
|
||||
d.cd(tmpdir);
|
||||
while((de = d.nextentry("*", true)) != NULL) {
|
||||
removeme = de->dirname;
|
||||
removeme += GOLD_SLASH_CHR;
|
||||
removeme += de->name;
|
||||
if(is_dir(removeme.c_str()))
|
||||
rmdir(removeme.c_str());
|
||||
else
|
||||
remove(removeme.c_str());
|
||||
}
|
||||
rmdir(tmpdir);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// Error exit function
|
||||
|
||||
|
Reference in New Issue
Block a user