From f955b1a48e3cc5a42296c32ae5b5b13d7bf06b92 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 8 Oct 1997 10:46:39 +0000 Subject: [PATCH] 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 --- include/execp.cpp | 77 --------------- include/execp.h | 7 -- include/golem.cpp | 231 +++++++++++++++++++++++++++++++++++--------- include/isam.cpp | 22 ++--- include/progind.cpp | 11 ++- include/strings.cpp | 114 +++++++++++++--------- include/strings.h | 9 +- 7 files changed, 274 insertions(+), 197 deletions(-) diff --git a/include/execp.cpp b/include/execp.cpp index 7a90620e6..6aa48d297 100755 --- a/include/execp.cpp +++ b/include/execp.cpp @@ -5,7 +5,6 @@ #include #if XVT_OS == XVT_OS_WIN -#include #include #include #include @@ -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; -} diff --git a/include/execp.h b/include/execp.h index 1cf7184d7..b005b3c56 100755 --- a/include/execp.h +++ b/include/execp.h @@ -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 diff --git a/include/golem.cpp b/include/golem.cpp index 8ad190442..3956e64cb 100755 --- a/include/golem.cpp +++ b/include/golem.cpp @@ -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); diff --git a/include/isam.cpp b/include/isam.cpp index 06defad4e..95f365b41 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -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; diff --git a/include/progind.cpp b/include/progind.cpp index 30d44c2b4..d40a8c2b0 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -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); diff --git a/include/strings.cpp b/include/strings.cpp index 6cf15de00..e2dafb905 100755 --- a/include/strings.cpp +++ b/include/strings.cpp @@ -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

-{ +{ + 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); diff --git a/include/strings.h b/include/strings.h index 23f40f38e..8d101a277 100755 --- a/include/strings.h +++ b/include/strings.h @@ -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