execp.* Tolte funzioni sugli url e spostate nei golem

golem.cpp    Potenziata la gestione delle icone
isam.cpp     Modificata la creazione dei file temporanei
progind.cpp  Cambiati i colori della barra
strings.*    Potenziata la generazione dei file temporanei


git-svn-id: svn://10.65.10.50/trunk@5339 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1997-10-08 10:46:39 +00:00
parent ab3cf55295
commit f955b1a48e
7 changed files with 274 additions and 197 deletions

View File

@ -5,7 +5,6 @@
#include <xvt.h>
#if XVT_OS == XVT_OS_WIN
#include <shellapi.h>
#include <toolhelp.h>
#include <string.h>
#include <ctype.h>
@ -362,79 +361,3 @@ TExternal_app::TExternal_app(const char* p)
_exitcode = 0;
}
///////////////////////////////////////////////////////////////////////////////
// GotoURL
// Liberamente tradotto da Windows Developer Journal August 1997
///////////////////////////////////////////////////////////////////////////////
static long get_reg_key(HKEY key, const char* subkey, TString& retdata)
{
HKEY hkey;
long retval = RegOpenKey(key, subkey, &hkey);
if (retval == ERROR_SUCCESS)
{
long datasize = retdata.size();
RegQueryValue(hkey, NULL, retdata.get_buffer(), &datasize);
RegCloseKey(hkey);
}
return retval;
}
bool ext2app(const char* ext, TString& app)
{
bool ok = FALSE;
TString key(_MAX_PATH);
key = ext;
if (key[0] != '.')
key.insert(".", 0);
if (get_reg_key(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS)
{
key << "\\shell\\open\\command";
if (get_reg_key(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS)
{
key.strip("\"");
int pos = key.find("%1");
if (pos > 0)
key.cut(pos);
key.trim();
app = key;
ok = TRUE;
}
}
return ok;
}
bool goto_url(const char* url)
{
bool retflag = FALSE;
HINSTANCE hinst = ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL);
DWORD winst = DWORD((DWORD*)hinst);
UINT error = UINT(winst); // Tutto 'sto giro per evitare un warning
if (error <= 32)
{
TString app(_MAX_PATH);
if (ext2app(".htm", app))
{
app << ' ' << url;
error = WinExec(app, SW_SHOWNORMAL);
if (error > 32)
retflag = TRUE;
}
}
else
retflag = TRUE;
return retflag;
}
bool print_url(const char* url)
{
HINSTANCE hinst = ShellExecute(NULL, "print", url, NULL, NULL, SW_SHOWNORMAL);
DWORD winst = DWORD((DWORD*)hinst);
UINT error = UINT(winst); // Tutto 'sto giro per evitare un warning
return error >= 32;
}

View File

@ -51,11 +51,4 @@ public:
TExternal_app(const char* p);
};
// Estrae lapplicazione associata all'estensione
bool ext2app(const char* ext, TString& app);
// Va ad un URl qualsiasi
bool goto_url(const char* url);
// Stampa un URl qualsiasi
bool print_url(const char* url);
#endif

View File

@ -13,6 +13,174 @@
#include "bagn006.h"
///////////////////////////////////////////////////////////////////////////////
// GotoURL
// Liberamente tradotto da Windows Developer Journal August 1997
///////////////////////////////////////////////////////////////////////////////
HIDDEN long get_reg_key(HKEY key, const char* subkey, TString& retdata)
{
HKEY hkey;
long retval = RegOpenKey(key, subkey, &hkey);
if (retval == ERROR_SUCCESS)
{
long datasize = retdata.size();
RegQueryValue(hkey, NULL, retdata.get_buffer(), &datasize);
RegCloseKey(hkey);
}
return retval;
}
HIDDEN bool file2app(const char* filename, TString& app)
{
bool ok = FALSE;
if (*filename != '.')
{
HINSTANCE hinst = FindExecutable(filename, ".", app.get_buffer());
DWORD* pinst = (DWORD*)hinst;
UINT err = LOWORD(pinst);
ok = err > 32;
}
if (!ok)
{
char ext[_MAX_EXT];
if (*filename == '.')
strncpy(ext, filename, _MAX_EXT);
else
_splitpath(filename, NULL, NULL, NULL, ext);
TFilename key;
if (get_reg_key(HKEY_CLASSES_ROOT, ext, key) == ERROR_SUCCESS)
{
key << "\\shell\\open\\command";
if (get_reg_key(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS)
{
key.strip("\"");
int pos = key.find("%1");
if (pos > 0)
key.cut(pos);
key.trim();
app = key;
ok = TRUE;
}
}
}
if (ok && !fexist(app))
ok = warning_box("Il programma %s e' stato rimosso!", app.get_buffer());
return ok;
}
HIDDEN bool internet_address(const char* filename)
{
const TFilename url(filename);
if (url.find("://") > 0)
return TRUE;
if (url.find("www.") >= 0)
return TRUE;
const char* extensions[] = { "com","edu","gov","it","mil","net","org", NULL };
const char* ext = url.ext();
for (int e = 0; extensions[e]; e++)
if (stricmp(ext, extensions[e]) == 0)
return TRUE;
return FALSE;
}
HIDDEN word file2icon(const char* filename)
{
word icon = 0;
char ext[_MAX_EXT];
if (*filename == '.')
strncpy(ext, filename, _MAX_EXT);
else
{
if (internet_address(filename))
strcpy(ext, ".htm");
else
_splitpath(filename, NULL, NULL, NULL, ext);
}
int icon_number = 0;
TFilename key;
if (stricmp(ext, ".exe") != 0)
{
if (get_reg_key(HKEY_CLASSES_ROOT, ext, key) == ERROR_SUCCESS)
{
key << "\\DefaultIcon";
if (get_reg_key(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS) // Windows 95 only
{
const int comma = key.find(',');
if (comma > 0)
{
icon_number = atoi(key.mid(comma+1));
key.cut(comma);
}
}
else
{
if (!file2app(filename, key))
file2app(".htm", key);
}
}
}
else
key = filename;
if (fexist(key))
{
HINSTANCE hInst = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
HICON hicon = ExtractIcon(hInst, key, icon_number);
if (hicon == NULL)
ExtractIcon(hInst, key, 0);
if (hicon == NULL)
warning_box("Impossibile accedere alll'icona del programma %s", key.get_buffer());
DWORD dwicon = DWORD((DWORD*)hicon);
icon = LOWORD(dwicon);
}
return icon;
}
HIDDEN bool goto_url(const char* url)
{
bool retflag = FALSE;
HINSTANCE hinst = ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL);
DWORD winst = DWORD((DWORD*)hinst);
UINT error = UINT(winst); // Tutto 'sto giro per evitare un warning
if (error <= 32)
{
TFilename app(_MAX_PATH);
if (file2app(".htm", app))
{
app << ' ' << url;
error = WinExec(app, SW_SHOWNORMAL);
if (error > 32)
retflag = TRUE;
}
}
else
retflag = TRUE;
return retflag;
}
HIDDEN bool print_url(const char* url)
{
HINSTANCE hinst = ShellExecute(NULL, "print", url, NULL, NULL, SW_SHOWNORMAL);
DWORD winst = DWORD((DWORD*)hinst);
UINT error = UINT(winst); // Tutto 'sto giro per evitare un warning
return error >= 32;
}
///////////////////////////////////////////////////////////
// Campi GOLEM
///////////////////////////////////////////////////////////
@ -23,47 +191,22 @@ TString& TGolem_field::get_window_data()
}
void TGolem_field::set_window_data(const char* data)
{
TFilename app(_MAX_PATH);
if (*data > ' ')
{
WORD icon = 0;
char* pipe = strchr(data, '|');
if (pipe)
{
TFilename file(data);
const int pipe = file.find('|');
if (pipe > 0) file.cut(pipe);
HINSTANCE hinst = FindExecutable(file, ".", app.get_buffer());
DWORD* pinst = (DWORD*)hinst;
UINT err = LOWORD(pinst);
if (err <= 32)
ext2app(".htm", app);
if (err > 32 && !fexist(app))
{
warning_box("Il file %s e' associato all'applicazione\n"
"%s, che non e' presente sul sistema",
file.get_buffer(), app.get_buffer());
}
}
TPushbutton_control* btn = (TPushbutton_control*)_ctl;
if (app.not_empty())
{
HINSTANCE hInst = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
HICON hicon = ExtractIcon(hInst, app, 0);
DWORD dwicon = DWORD((DWORD*)hicon);
WORD icon = LOWORD(dwicon);
if (icon)
btn->set_icon(icon);
else
{
#ifdef DBG
warning_box("Can't extract %s icon!", app.get_buffer());
#endif
btn->set_bmp(BMP_OLE, 0);
}
*pipe = '\0';
icon = file2icon(data);
*pipe = '|';
}
else
{
TPushbutton_control* btn = (TPushbutton_control*)_ctl;
if (icon)
btn->set_icon(icon);
else
btn->set_bmp(BMP_OLE, 0);
}
RCT rct; btn->get_rect(rct);
xi_invalidate_rect(btn->parent(), &rct);
@ -139,16 +282,8 @@ bool TGolem_field::autosave(TRelation& r)
{
char ext[_MAX_EXT];
_splitpath(new_file, NULL, NULL, NULL, ext);
// Very childish! I can do much better
for (long n = 1; ; n++)
{
TString16 name; name.format("%08ld%s", n, ext);
old_file = golem_path;
old_file.add(name);
if (!fexist(old_file))
break;
}
old_file.temp(golem_path, ext);
fcopy(new_file, old_file);
new_row.add(old_file, 0);
new_value.add(new_row, i);

View File

@ -1604,25 +1604,22 @@ TIsamtempfile::TIsamtempfile(int logicnum, const char* radix, bool create)
if (radix && *radix)
{
if (*radix == '%')
n = radix;
n = radix + 1;
else
{
n.tempdir();
n << '/' << radix;
n << SLASH << radix;
}
n.ext("dbf");
}
n.ext("dbf");
else
n.temp(NULL, "dbf");
if (!create)
{
TDir dir; dir.get(logicnum);
const word& len = dir.len();
// Tolgo il % senno' che fa la fopen ?
if (n[0] == '%')
n = n.sub(1);
FILE* f = fopen(n, "r");
TString err;
@ -1635,13 +1632,6 @@ TIsamtempfile::TIsamtempfile(int logicnum, const char* radix, bool create)
}
_autodel = create > TRUE;
n.ext("");
// Ci rimetto il % se prima l'avevo tolto, senno' che fa la open ?
if (n[0] != '%')
n.insert("%", 0);
open(n, create, eod, eox);
}
@ -1676,6 +1666,8 @@ int TIsamtempfile::open(
tmpname << &radix[1] ;
else
tmpname.temp(radix);
tmpname.ext("");
getisfd (_isamfile, num());
strcpy(filehnd()->d->SysName, (const char*)tmpname);
filehnd()->d->EOX = eox;

View File

@ -1,5 +1,6 @@
#include <math.h>
#include <colors.h>
#include <defmask.h>
#include <progind.h>
#include <controls.h>
@ -112,17 +113,21 @@ void TIndwin::update_bar()
RCT r; xvt_vobj_get_client_rect(w, &r);
// Rettangolo contenente l'intera barra
r.left = CHARX; r.right -= CHARX;
r.left += CHARX; r.right -= CHARX;
r.top = (int)_bar;
r.bottom = r.top + 2*CHARY;
RCT b = r;
// Rettangolo in rilievo
b.right = b.left + int((r.right-r.left)*prc);
xi_draw_3d_rect(w, &b, FALSE, 2, 0, 0, 0);
// xi_draw_3d_rect(w, &b, FALSE, 2, 0, 0, 0);
xi_draw_3d_rect(w, &b, FALSE, 2,
BTN_LIGHT_COLOR, BTN_BACK_COLOR, BTN_DARK_COLOR);
// Rettangolo scavato
b.left = b.right; b.right = r.right;
xi_draw_3d_rect(w, &b, TRUE, 2, 0, 0, 0);
// xi_draw_3d_rect(w, &b, TRUE, 2, 0, 0, 0);
xi_draw_3d_rect(w, &b, TRUE, 2,
BTN_LIGHT_COLOR, BTN_BACK_COLOR, BTN_DARK_COLOR);
char n[8]; sprintf(n, "%d%%", (int)floor(prc * 100.0 + 0.5));
xvt_dwin_draw_text(w, r.left+r.right/2-CHARX, (r.bottom+r.top+CHARY)/2-3, n, -1);

View File

@ -26,8 +26,7 @@ class TString512 : public TFixed_string
char _str512[513];
public:
TString512(const char* s = "") : TFixed_string(_str512, 513) { set(s); }
TString512(const TString& s) : TFixed_string(_str512, 513) { set(s); }
TString512() : TFixed_string(_str512, 513) { }
const TString& operator =(const char* s);
const TString& operator =(const TString& s) { return operator =((const char*)s); }
void strncpy(const char* s, int n);
@ -91,7 +90,8 @@ void TString::resize(
// nuovo spazio
// @comm Non funziona con le stringhe static e per valori negativi di <p size>
{
{
CHECKD(size >= 0, "Invalid string resize ", size);
char* s = new char[size+1];
if (cpy && _str) strcpy(s, _str);
else *s = '\0';
@ -114,7 +114,7 @@ TString& TString::set(
// @rdesc Ritorna l'indirizzo della stringa inizializzata
{
if (s == NULL) s = "";
const int sz = *s ? strlen(s) : 7;
const int sz = *s ? strlen(s) : 15;
if (sz > size()) resize(sz, FALSE);
strcpy(_str, s);
@ -134,7 +134,7 @@ int TString::make_room(
const int lun = len();
const int spare = size() - lun;
if (spare < s)
resize(size() + 2*s, TRUE);
resize(3 * (size() + s) / 2, TRUE);
return lun;
}
@ -146,15 +146,20 @@ TString::TString(const TString& s) : _str(NULL), _size(0)
TString::TString(int size, char c) : _str(NULL), _size(0)
{
/*
resize(size, FALSE);
*(_str+size--)='\0';
for (;c && size>=0; size--)
*(_str+size)=c;
*/
if (size > 0)
fill(c, size); // Guy: Much simpler and faster (uses memset)
else
resize(15, FALSE);
}
TString::TString() : _str(NULL), _size(0)
{ resize(7, FALSE); }
{ resize(15, FALSE); }
TString::~TString()
{
@ -964,13 +969,6 @@ TString& TFixed_string::format(
// Filename
///////////////////////////////////////////////////////////
const char SLASH =
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
'\\';
#else
'/';
#endif
// Certified 90%
const char* TFilename::ext() const
{
@ -983,10 +981,14 @@ const char* TFilename::ext() const
void TFilename::ext(const char* e)
{
char* d = strrchr(name(), '.');
if (d && is_not_slash(*(d+1))) *d = '\0';
if (*e && *e != '.') *this << ".";
*this << e;
if (d && is_not_slash(*(d+1)))
*d = '\0';
if (*e)
{
if (*e != '.')
*this << ".";
*this << e;
}
}
@ -1134,40 +1136,60 @@ const TFilename& TFilename::tempdir()
// @mfunc Genera il nome di un file temporaneo
const TFilename& TFilename::temp(
const char* prefix) // @parm Eventuale prefisso da assegnare al file temporaneo
const char* prefix, // @parm Eventuale prefisso da assegnare al file temporaneo
const char* extension) // @parm Eventuale estensione da assegnare al file temporaneo
// @comm Nel generare il nome del file controlla se esistone dei caratteri jolly
// e li elimina.
{
tempdir();
if (prefix && *prefix)
{
set(prefix); // Copia prefisso e ...
strip("$#*?."); // ... toglie caratteri jolly
{
if (extension && *extension)
{
static unsigned long numero = 0;
TFilename prefisso(prefix);
if (prefisso.empty())
prefisso.tempdir();
if (is_not_slash(prefisso.right(1)[0]))
prefisso << SLASH;
const TFixed_string f(prefix);
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
if (f.find("$$") != -1)
// Childish: You could use findfirst!
do
{
char pid[8];
sprintf(pid, "%d", getpid());
pid[3] = '\0';
*this << pid;
}
#else
if (f.find("$$") != -1) *this << getpid();
if (f.find("##") != -1) *this << getuid();
#endif
format("%s%ld", prefisso.get_buffer(), ++numero);
ext(extension);
} while (fexist(_str));
}
else cut(0);
char* t = tempnam(NULL, (char*)_str);
CHECK(t != NULL, "Can't execute tempnam");
set(t);
free(t);
else
{
tempdir();
if (prefix && *prefix)
{
set(prefix); // Copia prefisso e ...
strip("$#*?."); // ... toglie caratteri jolly
const TFixed_string f(prefix);
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
if (f.find("$$") != -1)
{
char pid[8];
sprintf(pid, "%d", getpid());
pid[3] = '\0';
*this << pid;
}
#else
if (f.find("$$") != -1) *this << getpid();
if (f.find("##") != -1) *this << getuid();
#endif
}
else
cut(0);
char* t = tempnam(NULL, (char*)_str);
CHECK(t != NULL, "Can't execute tempnam");
set(t);
free(t);
}
#ifdef DBG
if (fexist(_str))
fatal_box("Il file '%s' esiste gia'", _str);

View File

@ -421,7 +421,7 @@ public:
// @cmember Ritorna il nome del direttorio
const char* path() const;
// @cmember Genera il nome di un file temporaneo
const TFilename& temp(const char* prefix = NULL);
const TFilename& temp(const char* prefix = NULL, const char* extension = NULL);
// @cmember Genera il nome della directory temporanea
const TFilename& tempdir();
};
@ -590,4 +590,11 @@ public:
{}
};
const char SLASH =
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
'\\';
#else
'/';
#endif
#endif