1996-05-14 10:08:10 +00:00
|
|
|
#define STRICT
|
|
|
|
#define XVT_INCL_NATIVE
|
1997-11-17 10:28:04 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
#include <controls.h>
|
1995-05-16 09:35:12 +00:00
|
|
|
#include <execp.h>
|
|
|
|
#include <golem.h>
|
1997-10-07 14:29:35 +00:00
|
|
|
#include <msksheet.h>
|
1995-05-16 09:35:12 +00:00
|
|
|
#include <prefix.h>
|
|
|
|
#include <relation.h>
|
|
|
|
#include <urldefid.h>
|
|
|
|
#include <utility.h>
|
|
|
|
|
1997-11-17 10:28:04 +00:00
|
|
|
#include <mapi.h>
|
1997-10-07 14:29:35 +00:00
|
|
|
#include <shellapi.h>
|
1995-05-16 09:35:12 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
#include "bagn006.h"
|
1995-05-16 09:35:12 +00:00
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// GotoURL
|
|
|
|
// Liberamente tradotto da Windows Developer Journal August 1997
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
1997-10-07 14:29:35 +00:00
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
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;
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
HIDDEN bool file2app(const char* filename, TString& app)
|
|
|
|
{
|
|
|
|
bool ok = FALSE;
|
|
|
|
|
|
|
|
if (*filename != '.')
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
1997-10-08 10:46:39 +00:00
|
|
|
HINSTANCE hinst = FindExecutable(filename, ".", app.get_buffer());
|
1997-10-07 14:29:35 +00:00
|
|
|
DWORD* pinst = (DWORD*)hinst;
|
|
|
|
UINT err = LOWORD(pinst);
|
1997-10-08 10:46:39 +00:00
|
|
|
ok = err > 32;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!ok)
|
|
|
|
{
|
1997-11-07 08:51:14 +00:00
|
|
|
TString ext(_MAX_EXT);
|
1997-10-08 10:46:39 +00:00
|
|
|
if (*filename == '.')
|
1997-11-07 08:51:14 +00:00
|
|
|
ext = filename;
|
1997-10-08 10:46:39 +00:00
|
|
|
else
|
1997-11-07 08:51:14 +00:00
|
|
|
_splitpath(filename, NULL, NULL, NULL, ext.get_buffer());
|
|
|
|
ext.lower();
|
1997-10-08 10:46:39 +00:00
|
|
|
|
|
|
|
TFilename key;
|
|
|
|
if (get_reg_key(HKEY_CLASSES_ROOT, ext, key) == ERROR_SUCCESS)
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
1997-10-08 10:46:39 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
1997-11-17 10:28:04 +00:00
|
|
|
TFilename key;
|
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
word icon = 0;
|
1997-11-17 10:28:04 +00:00
|
|
|
int icon_number = 0;
|
1997-10-08 10:46:39 +00:00
|
|
|
|
1997-11-06 08:05:16 +00:00
|
|
|
TString ext(_MAX_EXT);
|
|
|
|
if (*filename == '.' && strlen(filename) < _MAX_EXT)
|
|
|
|
ext = filename;
|
1997-10-08 10:46:39 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (internet_address(filename))
|
1997-11-06 08:05:16 +00:00
|
|
|
ext = ".htm";
|
1997-11-17 10:28:04 +00:00
|
|
|
else
|
1997-11-06 08:05:16 +00:00
|
|
|
_splitpath(filename, NULL, NULL, NULL, ext.get_buffer());
|
1997-10-08 10:46:39 +00:00
|
|
|
}
|
1997-11-06 08:05:16 +00:00
|
|
|
ext.lower();
|
1997-10-08 10:46:39 +00:00
|
|
|
|
1997-11-06 08:05:16 +00:00
|
|
|
if (ext != ".exe")
|
|
|
|
{
|
1997-11-07 08:51:14 +00:00
|
|
|
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)
|
1997-10-08 10:46:39 +00:00
|
|
|
{
|
1997-11-07 08:51:14 +00:00
|
|
|
icon_number = atoi(key.mid(comma+1));
|
|
|
|
key.cut(comma);
|
1997-10-08 10:46:39 +00:00
|
|
|
}
|
|
|
|
}
|
1997-11-07 08:51:14 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!file2app(filename, key))
|
|
|
|
file2app(".htm", key);
|
|
|
|
}
|
|
|
|
}
|
1997-10-07 14:29:35 +00:00
|
|
|
}
|
1997-10-08 10:46:39 +00:00
|
|
|
else
|
|
|
|
key = filename;
|
1997-11-17 10:28:04 +00:00
|
|
|
|
|
|
|
// Toglie eventuali parametri sulla riga si comando
|
|
|
|
const int space_pos = key.find(' ');
|
|
|
|
if (space_pos > 0) key.cut(space_pos);
|
|
|
|
|
|
|
|
HINSTANCE hInst = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
|
|
|
HICON hicon = ExtractIcon(hInst, key, icon_number);
|
|
|
|
if (hicon == NULL && icon_number != 0)
|
|
|
|
hicon = ExtractIcon(hInst, key, 0);
|
|
|
|
if (hicon != NULL)
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
|
|
|
DWORD dwicon = DWORD((DWORD*)hicon);
|
1997-10-08 10:46:39 +00:00
|
|
|
icon = LOWORD(dwicon);
|
1997-11-17 10:28:04 +00:00
|
|
|
}
|
1997-10-08 10:46:39 +00:00
|
|
|
|
|
|
|
return icon;
|
|
|
|
}
|
|
|
|
|
1997-11-17 10:28:04 +00:00
|
|
|
HIDDEN word mail2icon()
|
|
|
|
{
|
1997-11-20 08:07:02 +00:00
|
|
|
word icon = 0;
|
|
|
|
|
|
|
|
// Non so se questo debba rimanere
|
1997-11-17 10:28:04 +00:00
|
|
|
TFilename key;
|
|
|
|
if (get_reg_key(HKEY_CLASSES_ROOT, "msgfile\\shell\\open\\command", key) == ERROR_SUCCESS)
|
|
|
|
{
|
|
|
|
const int space = key.find(' ');
|
|
|
|
if (space) key.cut(space);
|
|
|
|
icon = file2icon(key);
|
|
|
|
}
|
1997-11-20 08:07:02 +00:00
|
|
|
|
|
|
|
if (icon == 0)
|
|
|
|
icon = file2icon(".msg");
|
1997-11-17 10:28:04 +00:00
|
|
|
if (icon == 0)
|
|
|
|
icon = file2icon(".mmf");
|
|
|
|
return icon;
|
|
|
|
}
|
|
|
|
|
1997-11-07 08:51:14 +00:00
|
|
|
bool goto_url(const char* url)
|
1997-10-08 10:46:39 +00:00
|
|
|
{
|
1997-11-06 08:05:16 +00:00
|
|
|
TFilename app(url);
|
1997-11-07 08:51:14 +00:00
|
|
|
app.lower();
|
|
|
|
const TString ext(app.ext());
|
|
|
|
|
1997-11-06 08:05:16 +00:00
|
|
|
TConfig link(CONFIG_USER, "Link");
|
1997-11-07 08:51:14 +00:00
|
|
|
app = link.get(ext);
|
1997-11-06 08:05:16 +00:00
|
|
|
if (app.not_empty())
|
|
|
|
{
|
|
|
|
app << ' ' << url;
|
|
|
|
UINT error = WinExec(app, SW_SHOWNORMAL);
|
|
|
|
if (error > 32)
|
|
|
|
return TRUE;
|
1997-11-07 08:51:14 +00:00
|
|
|
else
|
|
|
|
link.set(ext, "");
|
1997-11-06 08:05:16 +00:00
|
|
|
}
|
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
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)
|
|
|
|
{
|
|
|
|
if (file2app(".htm", app))
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
1997-10-08 10:46:39 +00:00
|
|
|
app << ' ' << url;
|
|
|
|
error = WinExec(app, SW_SHOWNORMAL);
|
|
|
|
if (error > 32)
|
|
|
|
retflag = TRUE;
|
|
|
|
}
|
1997-10-07 14:29:35 +00:00
|
|
|
}
|
1997-10-08 10:46:39 +00:00
|
|
|
else
|
|
|
|
retflag = TRUE;
|
|
|
|
|
|
|
|
return retflag;
|
|
|
|
}
|
|
|
|
|
1997-12-04 14:16:30 +00:00
|
|
|
bool edit_url(const char* url)
|
|
|
|
{
|
|
|
|
bool retflag = FALSE;
|
|
|
|
|
|
|
|
HINSTANCE hinst = ShellExecute(NULL, "edit", 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;
|
|
|
|
if (fexist(url) && file2app(".wri", app))
|
|
|
|
{
|
|
|
|
app << ' ' << url;
|
|
|
|
error = WinExec(app, SW_SHOWNORMAL);
|
|
|
|
if (error > 32)
|
|
|
|
retflag = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
retflag = goto_url(url);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
retflag = TRUE;
|
|
|
|
|
|
|
|
return retflag;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
|
1997-11-07 08:51:14 +00:00
|
|
|
bool print_url(const char* url)
|
1997-10-08 10:46:39 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
1997-10-13 14:04:22 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Maschera GOLEM
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class TGolem_mask : public TMask
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
static bool file_handler(TMask_field& f, KEY k);
|
|
|
|
static bool link_handler(TMask_field& f, KEY k);
|
|
|
|
static bool main_link_handler(TMask_field& f, KEY k);
|
|
|
|
static bool ole_handler(TMask_field& f, KEY k);
|
|
|
|
|
|
|
|
public:
|
|
|
|
TGolem_mask();
|
|
|
|
virtual ~TGolem_mask() { }
|
|
|
|
};
|
|
|
|
|
|
|
|
bool TGolem_mask::file_handler(TMask_field& f, KEY k)
|
|
|
|
{
|
|
|
|
TMask& m = f.mask();
|
|
|
|
|
|
|
|
if (k == K_F9)
|
|
|
|
{
|
|
|
|
FILE_SPEC fs;
|
|
|
|
xvt_fsys_convert_str_to_dir(".", &fs.dir);
|
|
|
|
strcpy(fs.type, "");
|
|
|
|
strcpy(fs.name, "*.*");
|
|
|
|
strcpy(fs.creator, "GOLEM");
|
|
|
|
|
1997-11-07 15:07:06 +00:00
|
|
|
DIRECTORY dir; xvt_fsys_get_dir(&dir);
|
1997-10-13 14:04:22 +00:00
|
|
|
FL_STATUS ok = xvt_dm_post_file_open(&fs, "Selezionare il file ...");
|
1997-11-07 15:07:06 +00:00
|
|
|
xvt_fsys_set_dir(&dir);
|
|
|
|
|
1997-10-13 14:04:22 +00:00
|
|
|
if (ok == FL_OK)
|
|
|
|
{
|
|
|
|
TFilename file;
|
|
|
|
xvt_fsys_convert_dir_to_str(&fs.dir, file.get_buffer(), file.size());
|
|
|
|
file.add(fs.name);
|
1997-11-07 15:07:06 +00:00
|
|
|
m.set(S_FILE, file);
|
1997-10-13 14:04:22 +00:00
|
|
|
k = K_TAB;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (k == K_TAB && f.focusdirty())
|
|
|
|
{
|
|
|
|
TFilename file = m.get(S_FILE);
|
|
|
|
if (fexist(file))
|
|
|
|
{
|
|
|
|
char ext[_MAX_EXT];
|
|
|
|
char name[_MAX_FNAME];
|
|
|
|
_splitpath(file, NULL, NULL, name, ext);
|
|
|
|
file = name; file.ext(ext);
|
|
|
|
m.enable(S_LINK);
|
|
|
|
m.disable(F_NEWREC);
|
|
|
|
m.enable(F_LINK);
|
|
|
|
m.enable(F_PRINT);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const bool full = file.not_empty();
|
|
|
|
m.set(S_LINK, full ? "X" : "");
|
|
|
|
m.disable(S_LINK);
|
|
|
|
m.enable(F_NEWREC, full);
|
|
|
|
m.enable(F_LINK, full);
|
|
|
|
m.disable(F_PRINT);
|
|
|
|
file.cut(0);
|
|
|
|
}
|
|
|
|
m.set(S_ALIAS, file);
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TGolem_mask::link_handler(TMask_field& f, KEY k)
|
|
|
|
{
|
|
|
|
if (k == K_SPACE)
|
|
|
|
{
|
|
|
|
TMask& m = f.mask();
|
|
|
|
TFilename url = m.get(S_FILE);
|
|
|
|
short id = f.dlg();
|
|
|
|
if (id == F_NEWREC && url.not_empty())
|
|
|
|
{
|
|
|
|
if (!fexist(url))
|
|
|
|
{
|
|
|
|
TFilename name;
|
|
|
|
char ext[_MAX_EXT];
|
|
|
|
_splitpath(url, NULL, NULL, name.get_buffer(), ext);
|
|
|
|
if (name.not_empty() && *ext)
|
|
|
|
{
|
|
|
|
name.ext(ext);
|
|
|
|
url.tempdir();
|
|
|
|
url.add(name);
|
|
|
|
ofstream out(url); // Crea un file vuoto
|
|
|
|
}
|
|
|
|
else
|
|
|
|
url.cut(0);
|
|
|
|
m.set(S_FILE, url, TRUE); // ... memorizza il suo nome ...
|
|
|
|
m.reset(S_LINK); // Non puo' essere un collegamento
|
|
|
|
}
|
|
|
|
else
|
|
|
|
id = F_LINK;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (url.not_empty())
|
|
|
|
{
|
|
|
|
bool open = TRUE;
|
|
|
|
if (id == DLG_PRINT)
|
|
|
|
open = !print_url(url);
|
|
|
|
if (open)
|
|
|
|
goto_url(url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TGolem_mask::main_link_handler(TMask_field& f, KEY k)
|
|
|
|
{
|
|
|
|
if (k == K_SPACE)
|
|
|
|
{
|
|
|
|
TSheet_field& sheet = f.mask().sfield(F_SHEET);
|
|
|
|
if (sheet.items() > 0)
|
|
|
|
{
|
|
|
|
sheet.check_row(sheet.selected());
|
|
|
|
TMask& sm = sheet.sheet_mask();
|
|
|
|
TMask_field& link = sm.field(f.dlg());
|
|
|
|
link_handler(link, K_SPACE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TGolem_mask::ole_handler(TMask_field& f, KEY k)
|
|
|
|
{
|
|
|
|
if (k == K_SPACE)
|
|
|
|
{
|
|
|
|
TSheet_field& sheet = f.mask().sfield(F_SHEET);
|
1997-11-06 08:05:16 +00:00
|
|
|
TMask& sm = sheet.sheet_mask();
|
|
|
|
|
|
|
|
int selected = sheet.selected();
|
|
|
|
if (sheet.items() == 0 || !sm.field(S_FILE).empty())
|
|
|
|
{
|
1997-10-13 14:04:22 +00:00
|
|
|
sheet.row(-1);
|
1997-11-06 08:05:16 +00:00
|
|
|
selected = sheet.items()-1;
|
|
|
|
}
|
|
|
|
sheet.check_row(selected);
|
1997-10-13 14:04:22 +00:00
|
|
|
|
|
|
|
TString16 ext = f.prompt();
|
1997-11-17 10:28:04 +00:00
|
|
|
if (ext == "mailto")
|
|
|
|
{
|
|
|
|
TMail_message msg("");
|
|
|
|
msg.send();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
TFilename file;
|
|
|
|
file.temp(NULL, ext);
|
|
|
|
sm.set(S_FILE, file);
|
|
|
|
ofstream out(file);
|
|
|
|
sheet.row(selected) = file;
|
|
|
|
sheet.force_update();
|
|
|
|
|
|
|
|
TFilename app; file2app(ext, app);
|
|
|
|
app << ' ' << file;
|
|
|
|
WinExec(app, SW_SHOWNORMAL);
|
|
|
|
}
|
1997-10-13 14:04:22 +00:00
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
TGolem_mask::TGolem_mask()
|
|
|
|
: TMask("bagn006")
|
|
|
|
{
|
|
|
|
TSheet_field& sheet = sfield(F_SHEET);
|
|
|
|
|
|
|
|
set_handler(F_NEWREC, main_link_handler);
|
|
|
|
set_handler(F_LINK, main_link_handler);
|
|
|
|
set_handler(F_PRINT, main_link_handler);
|
|
|
|
|
|
|
|
TMask& sm = sheet.sheet_mask();
|
|
|
|
sm.set_handler(S_FILE, file_handler);
|
|
|
|
sm.set_handler(F_NEWREC, link_handler);
|
|
|
|
sm.set_handler(F_LINK, link_handler);
|
|
|
|
sm.set_handler(F_PRINT, link_handler);
|
|
|
|
|
|
|
|
TConfig ini(CONFIG_USER, "Link");
|
|
|
|
TString_array list;
|
1997-11-17 10:28:04 +00:00
|
|
|
ini.list_variables(list);
|
|
|
|
|
|
|
|
// Elimina la posta se c'e'
|
|
|
|
const int mmf_pos = list.find("mailto");
|
|
|
|
if (mmf_pos >= 0) list.destroy(mmf_pos);
|
|
|
|
|
|
|
|
// Ordina alfabeticamente
|
1997-10-13 14:04:22 +00:00
|
|
|
list.sort();
|
1997-11-17 10:28:04 +00:00
|
|
|
|
1997-10-13 14:04:22 +00:00
|
|
|
const int ITEMS_PER_ROW = 15;
|
1997-11-17 10:28:04 +00:00
|
|
|
const int MAX_ITEMS = ITEMS_PER_ROW * 2;
|
|
|
|
|
|
|
|
// Aggiungi la posta se attiva
|
|
|
|
if (GetProfileInt("Mail", "MAPI", 0))
|
|
|
|
{
|
|
|
|
const int items = list.items();
|
|
|
|
const int mmf_pos = (items >= MAX_ITEMS) ? MAX_ITEMS-1 : -1;
|
|
|
|
list.add("mailto", mmf_pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
FOR_EACH_ARRAY_ROW(list, r, row)
|
|
|
|
{
|
|
|
|
TString16 ext = *row;
|
1998-02-24 10:37:28 +00:00
|
|
|
unsigned icon;
|
1997-10-13 14:04:22 +00:00
|
|
|
|
1997-11-17 10:28:04 +00:00
|
|
|
if (ext == "mailto")
|
|
|
|
{
|
|
|
|
icon = mail2icon();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1997-10-13 14:04:22 +00:00
|
|
|
ext.insert(".", 0);
|
1997-11-17 10:28:04 +00:00
|
|
|
icon = file2icon(ext);
|
|
|
|
}
|
1997-10-13 14:04:22 +00:00
|
|
|
if (icon)
|
1997-11-17 10:28:04 +00:00
|
|
|
{
|
|
|
|
const int x = (i < ITEMS_PER_ROW ? i*5 : (i-ITEMS_PER_ROW)*5) + 1;
|
|
|
|
const int y = i < ITEMS_PER_ROW ? 0 : 2;
|
|
|
|
TButton_field& btn = add_button(301+i, 0, ext, x, y, 3, 2);
|
|
|
|
btn.set_handler(ole_handler);
|
1998-02-24 10:37:28 +00:00
|
|
|
btn.set_native_icon(icon);
|
1997-11-17 10:28:04 +00:00
|
|
|
i++;
|
|
|
|
if (i > MAX_ITEMS)
|
|
|
|
break;
|
|
|
|
}
|
1997-10-13 14:04:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-10-08 10:46:39 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Campi GOLEM
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
TString& TGolem_field::get_window_data()
|
|
|
|
{
|
|
|
|
return _str;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TGolem_field::set_window_data(const char* data)
|
|
|
|
{
|
1998-02-24 10:37:28 +00:00
|
|
|
unsigned icon = 0;
|
1997-10-08 10:46:39 +00:00
|
|
|
|
|
|
|
char* pipe = strchr(data, '|');
|
|
|
|
if (pipe)
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
1997-11-07 08:51:14 +00:00
|
|
|
*pipe = '\0'; // Poor man TToken_string
|
1997-10-08 10:46:39 +00:00
|
|
|
icon = file2icon(data);
|
|
|
|
*pipe = '|';
|
|
|
|
}
|
|
|
|
|
|
|
|
TPushbutton_control* btn = (TPushbutton_control*)_ctl;
|
|
|
|
if (icon)
|
1998-02-24 10:37:28 +00:00
|
|
|
btn->set_native_icon(icon);
|
1997-10-08 10:46:39 +00:00
|
|
|
else
|
1997-10-07 14:29:35 +00:00
|
|
|
btn->set_bmp(BMP_OLE, 0);
|
1995-05-16 09:35:12 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
RCT rct; btn->get_rect(rct);
|
1997-12-30 10:07:11 +00:00
|
|
|
xvt_dwin_invalidate_rect(btn->parent(), &rct);
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
bool TGolem_field::is_editable() const
|
|
|
|
{ return FALSE; }
|
1995-05-16 09:35:12 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
void TGolem_field::parse_head(TScanner& scanner)
|
1995-05-16 09:35:12 +00:00
|
|
|
{
|
1997-10-07 14:29:35 +00:00
|
|
|
_ctl_data._width = scanner.integer();
|
|
|
|
if (_ctl_data._width <= 0) _ctl_data._width = 10;
|
|
|
|
_ctl_data._height = scanner.integer(); // Height
|
|
|
|
if (_ctl_data._height <= 0) _ctl_data._height = 1;
|
|
|
|
_ctl_data._bmp_up = BMP_OLE;
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
void TGolem_field::create(WINDOW parent)
|
|
|
|
{
|
|
|
|
_ctl = new TPushbutton_control(parent, _ctl_data._dlg,
|
|
|
|
_ctl_data._x, _ctl_data._y,
|
|
|
|
_ctl_data._width+2, _ctl_data._height,
|
|
|
|
_ctl_data._flags, _ctl_data._prompt,
|
|
|
|
_ctl_data._bmp_up, _ctl_data._bmp_dn);
|
|
|
|
}
|
1995-05-16 09:35:12 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
bool TGolem_field::autoload(const TRelation& r)
|
1995-05-16 09:35:12 +00:00
|
|
|
{
|
1997-10-07 14:29:35 +00:00
|
|
|
const bool ok = TEditable_field::autoload(r);
|
|
|
|
if (ok)
|
|
|
|
_old_value = get();
|
|
|
|
else
|
|
|
|
_old_value.cut(0);
|
|
|
|
return ok;
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
bool TGolem_field::autosave(TRelation& r)
|
|
|
|
{
|
|
|
|
if (field() != NULL)
|
1995-05-16 09:35:12 +00:00
|
|
|
{
|
1997-10-07 14:29:35 +00:00
|
|
|
TToken_string new_value(get(), '\n');
|
|
|
|
if (new_value != _old_value)
|
|
|
|
{
|
1997-11-07 15:07:06 +00:00
|
|
|
TDir dir;
|
|
|
|
const int logicnum = r.lfile().num();
|
|
|
|
dir.get(logicnum, _nolock, _nordir, _sysdirop);
|
1997-10-07 14:29:35 +00:00
|
|
|
const long ditta = dir.is_com() ? 0 : prefix().get_codditta();
|
1997-11-07 15:07:06 +00:00
|
|
|
|
|
|
|
TFilename golem_path;
|
1997-10-07 14:29:35 +00:00
|
|
|
golem_path = firm2dir(ditta);
|
|
|
|
golem_path.add("golem");
|
|
|
|
if (!fexist(golem_path))
|
|
|
|
make_dir(golem_path);
|
|
|
|
|
|
|
|
const int old_items = _old_value.items();
|
|
|
|
const int new_items = new_value.items();
|
|
|
|
const int items = new_items > old_items ? new_items : old_items;
|
|
|
|
|
|
|
|
TToken_string old_row, new_row;
|
|
|
|
TFilename old_file, new_file;
|
|
|
|
for (int i = 0; i < items; i++)
|
|
|
|
{
|
|
|
|
old_row = _old_value.get(i); // Devo usare l'indice ogni volta ...
|
|
|
|
new_row = new_value.get(i); // ... perche' le TToken_string cambiano!
|
|
|
|
|
|
|
|
old_file = old_row.get(0);
|
|
|
|
new_file = new_row.get(0);
|
|
|
|
|
|
|
|
if (old_file != new_file)
|
|
|
|
{
|
1997-11-07 15:07:06 +00:00
|
|
|
const was_stored = old_row.get_char(2) <= ' ' &&
|
|
|
|
golem_path.compare(old_file, golem_path.len(), TRUE) == 0;
|
|
|
|
const tobe_stored = new_row.get_char(2) <= ' ';
|
1997-10-07 14:29:35 +00:00
|
|
|
if (was_stored && fexist(old_file))
|
|
|
|
::remove(old_file);
|
1997-11-07 15:07:06 +00:00
|
|
|
if (tobe_stored && !new_file.blank())
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
|
|
|
char ext[_MAX_EXT];
|
|
|
|
_splitpath(new_file, NULL, NULL, NULL, ext);
|
1997-11-07 15:07:06 +00:00
|
|
|
old_file.temp(golem_path, ext);
|
1997-10-08 10:46:39 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
fcopy(new_file, old_file);
|
|
|
|
new_row.add(old_file, 0);
|
|
|
|
new_value.add(new_row, i);
|
|
|
|
|
|
|
|
// Cancella il file originale se temporaneo
|
|
|
|
TFilename tmp; tmp.tempdir();
|
|
|
|
if (tmp.compare(new_file, tmp.len(), TRUE) == 0)
|
|
|
|
::remove(new_file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1997-11-07 15:07:06 +00:00
|
|
|
set(_old_value = new_value);
|
1997-10-07 14:29:35 +00:00
|
|
|
}
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
1997-10-07 14:29:35 +00:00
|
|
|
return TEditable_field::autosave(r);
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
bool TGolem_field::on_key(KEY key)
|
|
|
|
{
|
|
|
|
bool ok = TRUE;
|
|
|
|
if (key == K_SPACE)
|
|
|
|
{
|
1997-10-13 14:04:22 +00:00
|
|
|
TMask* msk = new TGolem_mask;
|
1997-10-07 14:29:35 +00:00
|
|
|
TSheet_field& sheet = msk->sfield(F_SHEET);
|
1995-05-16 09:35:12 +00:00
|
|
|
|
1997-11-20 08:07:02 +00:00
|
|
|
TToken_string tmp(get(), '\n');
|
1997-10-07 14:29:35 +00:00
|
|
|
if (roman())
|
1995-05-16 09:35:12 +00:00
|
|
|
{
|
1997-11-17 10:28:04 +00:00
|
|
|
FOR_EACH_TOKEN(tmp, row)
|
1997-10-07 14:29:35 +00:00
|
|
|
{
|
|
|
|
if (*row > ' ')
|
|
|
|
sheet.row(-1) = row;
|
|
|
|
}
|
|
|
|
if (msk->run() == K_ENTER)
|
1995-05-16 09:35:12 +00:00
|
|
|
{
|
1997-10-07 14:29:35 +00:00
|
|
|
tmp.cut(0);
|
1997-11-17 10:28:04 +00:00
|
|
|
FOR_EACH_SHEET_ROW(sheet, r, row)
|
1995-05-16 09:35:12 +00:00
|
|
|
{
|
1997-11-17 10:28:04 +00:00
|
|
|
if ((*row)[0] > ' ')
|
|
|
|
tmp.add(*row);
|
1997-10-07 14:29:35 +00:00
|
|
|
}
|
|
|
|
set(tmp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1997-10-13 14:04:22 +00:00
|
|
|
TMask& sm = sheet.sheet_mask();
|
1997-10-07 14:29:35 +00:00
|
|
|
for (int i = 0; i < 3; i++)
|
|
|
|
sm.set(S_FILE+i, tmp.get());
|
|
|
|
|
|
|
|
if (sm.run() == K_ENTER)
|
|
|
|
{
|
|
|
|
tmp.cut(0);
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
|
|
tmp.add(sm.get(S_FILE+i));
|
|
|
|
set(tmp);
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
delete msk;
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
1997-10-07 14:29:35 +00:00
|
|
|
return ok;
|
1995-05-16 09:35:12 +00:00
|
|
|
}
|
1997-10-07 14:29:35 +00:00
|
|
|
|
|
|
|
TGolem_field::TGolem_field(TMask* m)
|
|
|
|
: TEditable_field(m), _old_value(80, '\n')
|
|
|
|
{ }
|
|
|
|
|
|
|
|
TGolem_field::~TGolem_field()
|
|
|
|
{ }
|
1995-06-19 08:13:19 +00:00
|
|
|
|
1997-10-07 14:29:35 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
1997-11-17 10:28:04 +00:00
|
|
|
// Mail message
|
1997-10-07 14:29:35 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
1995-06-19 08:13:19 +00:00
|
|
|
|
1997-11-17 10:28:04 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
const char* const szMAPIDLL = "MAPI32.DLL";
|
|
|
|
#else
|
|
|
|
const char* const szMAPIDLL = "MAPI.DLL";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static HINSTANCE _hlibMAPI = NULL;
|
|
|
|
|
|
|
|
LPMAPILOGON lpfnMAPILogon = NULL;
|
|
|
|
LPMAPILOGOFF lpfnMAPILogoff = NULL;
|
|
|
|
LPMAPISENDMAIL lpfnMAPISendMail = NULL;
|
|
|
|
LPMAPISENDDOCUMENTS lpfnMAPISendDocuments = NULL;
|
|
|
|
LPMAPIFINDNEXT lpfnMAPIFindNext = NULL;
|
|
|
|
LPMAPIREADMAIL lpfnMAPIReadMail = NULL;
|
|
|
|
LPMAPISAVEMAIL lpfnMAPISaveMail = NULL;
|
|
|
|
LPMAPIDELETEMAIL lpfnMAPIDeleteMail = NULL;
|
|
|
|
LPMAPIFREEBUFFER lpfnMAPIFreeBuffer = NULL;
|
|
|
|
LPMAPIADDRESS lpfnMAPIAddress = NULL;
|
|
|
|
LPMAPIDETAILS lpfnMAPIDetails = NULL;
|
|
|
|
LPMAPIRESOLVENAME lpfnMAPIResolveName = NULL;
|
|
|
|
|
|
|
|
bool TMail_message::load_mapi(void)
|
|
|
|
{
|
|
|
|
if (_hlibMAPI) // Check in already loaded
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
// Check if MAPI is installed on the system
|
|
|
|
BOOL MAPI_installed = GetProfileInt("Mail", "MAPI", 0);
|
|
|
|
if(!MAPI_installed)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
UINT fuError = SetErrorMode(SEM_NOOPENFILEERRORBOX);
|
|
|
|
_hlibMAPI = LoadLibrary(szMAPIDLL);
|
|
|
|
SetErrorMode(fuError);
|
|
|
|
|
|
|
|
DWORD* err = (DWORD*)_hlibMAPI;
|
|
|
|
if ((DWORD)err < 32)
|
|
|
|
return FALSE;
|
|
|
|
|
1997-11-20 08:07:02 +00:00
|
|
|
if (!(lpfnMAPILogon = (LPMAPILOGON)GetProcAddress (_hlibMAPI, "MAPILogon"))) return FALSE;
|
|
|
|
if (!(lpfnMAPILogoff = (LPMAPILOGOFF)GetProcAddress (_hlibMAPI, "MAPILogoff"))) return FALSE;
|
|
|
|
if (!(lpfnMAPISendMail = (LPMAPISENDMAIL)GetProcAddress (_hlibMAPI, "MAPISendMail"))) return FALSE;
|
|
|
|
if (!(lpfnMAPISendDocuments = (LPMAPISENDDOCUMENTS) GetProcAddress (_hlibMAPI, "MAPISendDocuments"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIFindNext = (LPMAPIFINDNEXT)GetProcAddress (_hlibMAPI, "MAPIFindNext"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIReadMail = (LPMAPIREADMAIL)GetProcAddress (_hlibMAPI, "MAPIReadMail"))) return FALSE;
|
|
|
|
if (!(lpfnMAPISaveMail = (LPMAPISAVEMAIL)GetProcAddress (_hlibMAPI, "MAPISaveMail"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIDeleteMail = (LPMAPIDELETEMAIL)GetProcAddress (_hlibMAPI, "MAPIDeleteMail"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIFreeBuffer = (LPMAPIFREEBUFFER)GetProcAddress (_hlibMAPI, "MAPIFreeBuffer"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIAddress = (LPMAPIADDRESS)GetProcAddress (_hlibMAPI, "MAPIAddress"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIDetails = (LPMAPIDETAILS)GetProcAddress (_hlibMAPI, "MAPIDetails"))) return FALSE;
|
|
|
|
if (!(lpfnMAPIResolveName = (LPMAPIRESOLVENAME)GetProcAddress (_hlibMAPI, "MAPIResolveName"))) return FALSE;
|
1997-11-17 10:28:04 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TMail_message::unload_mapi()
|
|
|
|
{
|
|
|
|
if (_hlibMAPI)
|
|
|
|
{
|
|
|
|
FreeLibrary(_hlibMAPI);
|
|
|
|
_hlibMAPI = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TMail_message::send()
|
|
|
|
{
|
|
|
|
TWait_cursor hourglass;
|
|
|
|
bool ok = load_mapi();
|
|
|
|
if (!ok)
|
|
|
|
return error_box("Impossibile inizializzare MAPI");
|
|
|
|
|
|
|
|
LHANDLE lhSession = 0;
|
|
|
|
ULONG err = lpfnMAPILogon(0L, "", "",
|
|
|
|
MAPI_LOGON_UI | MAPI_USE_DEFAULT,
|
|
|
|
0L, &lhSession);
|
|
|
|
if (err == SUCCESS_SUCCESS)
|
|
|
|
{
|
|
|
|
const int MAX_RECIPIENTS = _recipients.items() + _copy_recipients.items() + 1;
|
|
|
|
MapiRecipDesc* msgRecipient = new MapiRecipDesc[MAX_RECIPIENTS];
|
|
|
|
memset(msgRecipient, 0, MAX_RECIPIENTS*sizeof(MapiRecipDesc));
|
|
|
|
|
|
|
|
int nr = 0;
|
|
|
|
if (_sender.not_empty())
|
|
|
|
{
|
|
|
|
msgRecipient[nr].ulRecipClass = MAPI_ORIG;
|
|
|
|
msgRecipient[nr++].lpszName = _sender.get_buffer();
|
|
|
|
}
|
|
|
|
FOR_EACH_ARRAY_ROW(_recipients, rec, recipient)
|
|
|
|
{
|
|
|
|
msgRecipient[nr].ulRecipClass = MAPI_TO;
|
|
|
|
msgRecipient[nr++].lpszName = recipient->get_buffer();
|
|
|
|
}
|
|
|
|
FOR_EACH_ARRAY_ROW(_copy_recipients, cc_rec, cc_recipient)
|
|
|
|
{
|
|
|
|
msgRecipient[nr].ulRecipClass = MAPI_CC;
|
|
|
|
msgRecipient[nr++].lpszName = cc_recipient->get_buffer();
|
|
|
|
}
|
|
|
|
|
|
|
|
const int MAX_ATTACHMENTS = _attachments.items() + 1;
|
|
|
|
MapiFileDesc* msgAttachment = new MapiFileDesc[MAX_ATTACHMENTS];
|
|
|
|
memset(msgAttachment, 0, MAX_ATTACHMENTS*sizeof(MapiFileDesc));
|
|
|
|
int na = 0;
|
|
|
|
FOR_EACH_ARRAY_ROW(_attachments, att, attachment)
|
|
|
|
{
|
|
|
|
TString80 tmp; tmp.spaces(32);
|
|
|
|
*this << '\n' << tmp;
|
|
|
|
msgAttachment[na].nPosition = len()-1;
|
|
|
|
msgAttachment[na++].lpszPathName = attachment->get_buffer();
|
|
|
|
}
|
|
|
|
|
|
|
|
MapiMessage msgSend;
|
|
|
|
memset(&msgSend, 0, sizeof(MapiMessage));
|
|
|
|
msgSend.lpszNoteText = get_buffer();
|
|
|
|
msgSend.lpszSubject = _subject.get_buffer();
|
|
|
|
msgSend.nRecipCount = nr;
|
|
|
|
msgSend.lpRecips = msgRecipient;
|
|
|
|
msgSend.nFileCount = na;
|
|
|
|
msgSend.lpFiles = msgAttachment;
|
|
|
|
|
|
|
|
err = lpfnMAPISendMail(lhSession, 0, &msgSend, MAPI_DIALOG, 0L);
|
|
|
|
|
|
|
|
delete msgRecipient;
|
|
|
|
delete msgAttachment;
|
|
|
|
|
|
|
|
err = lpfnMAPILogoff(lhSession, 0L, 0L, 0L);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ok = error_box("Impossibile collegarsi a MAPI");
|
|
|
|
|
|
|
|
unload_mapi();
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TMail_message::add_recipient_ex(const char* recipient, int type)
|
|
|
|
{
|
|
|
|
TFilename rec(recipient);
|
|
|
|
rec.trim();
|
|
|
|
bool ok = rec.not_empty();
|
|
|
|
if (ok) switch(type)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
_copy_recipients.add(rec);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (rec.is_relative_path())
|
|
|
|
rec.make_absolute_path();
|
|
|
|
ok = fexist(rec);
|
|
|
|
if (ok)
|
|
|
|
_attachments.add(rec);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
_recipients.add(rec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
TMail_message::TMail_message(const char* recipient, const char* subject,
|
|
|
|
const char* text, const char* sender)
|
|
|
|
: TString(text), _subject(subject), _sender(sender)
|
|
|
|
{
|
|
|
|
add_recipient(recipient);
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Obsolete DDE management
|
|
|
|
///////////////////////////////////////////////////////////
|
1995-06-19 08:13:19 +00:00
|
|
|
|
|
|
|
#include <dde.h>
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// DDE
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
1996-06-07 15:59:22 +00:00
|
|
|
static TDDE* CUR_DDE = NULL;
|
1995-06-19 08:13:19 +00:00
|
|
|
|
|
|
|
HIDDEN BOOLEAN hook(HWND hwnd,
|
|
|
|
UINT msg,
|
|
|
|
UINT wparam,
|
|
|
|
ULONG lparam,
|
|
|
|
long* ret)
|
1996-06-07 15:59:22 +00:00
|
|
|
{
|
|
|
|
CHECK(CUR_DDE, "No DDE available");
|
|
|
|
bool normal_process = TRUE;
|
|
|
|
|
|
|
|
if (CUR_DDE->hwnd() == (word)hwnd) switch (msg)
|
1995-06-19 08:13:19 +00:00
|
|
|
{
|
1996-06-07 15:59:22 +00:00
|
|
|
case WM_DDE_INITIATE:
|
|
|
|
if (wparam != CUR_DDE->hwnd()) // Non initiarti da solo!
|
|
|
|
{
|
|
|
|
ATOM app = LOWORD(lparam);
|
|
|
|
ATOM topic = HIWORD(lparam);
|
|
|
|
TString a(256), t(256);
|
|
|
|
if (app)
|
|
|
|
GlobalGetAtomName(app, (char*)(const char*)a, a.size());
|
|
|
|
if (topic)
|
|
|
|
GlobalGetAtomName(topic, (char*)(const char*)t, t.size());
|
|
|
|
|
|
|
|
bool ok = FALSE;
|
|
|
|
const char* an = CUR_DDE->get_app_name();
|
|
|
|
if (an && *an)
|
1996-06-18 13:33:27 +00:00
|
|
|
ok = a.empty() || a.compare(an, -1, TRUE) == 0;
|
|
|
|
if (ok) // Server name ok
|
|
|
|
{
|
|
|
|
const bool query_topics = t.empty() || t == "*";
|
|
|
|
TToken_string topics = CUR_DDE->get_topics();
|
|
|
|
ok = !topics.empty_items(); // No topics?
|
|
|
|
if (ok && !query_topics)
|
|
|
|
{
|
|
|
|
ok = FALSE;
|
1997-11-17 10:28:04 +00:00
|
|
|
// for (const char* topo = topics.get(0); topo; topo = topics.get())
|
|
|
|
FOR_EACH_TOKEN(topics, topo)
|
1996-06-18 13:33:27 +00:00
|
|
|
{
|
|
|
|
if (t.compare(topo, -1, TRUE) == 0)
|
|
|
|
{
|
|
|
|
ok = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ok) // Topic ok
|
|
|
|
{
|
|
|
|
ok = CUR_DDE->do_initiate(wparam, t);
|
|
|
|
if (ok) // Connection ok
|
|
|
|
{
|
|
|
|
if (!query_topics)
|
|
|
|
topics = t;
|
|
|
|
for (t = topics.get(0); t.not_empty(); t = topics.get())
|
|
|
|
{ // E' obbligatorio crearne dei nuovi! Non spostare fuori dal ciclo!
|
|
|
|
app = GlobalAddAtom(CUR_DDE->get_app_name());
|
|
|
|
topic = GlobalAddAtom(t);
|
|
|
|
SendMessage((HWND)wparam, WM_DDE_ACK, (WPARAM)hwnd, MAKELPARAM(app,topic));
|
|
|
|
}
|
1996-06-07 15:59:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
normal_process = FALSE;
|
|
|
|
}
|
1995-06-19 08:13:19 +00:00
|
|
|
break;
|
1996-06-07 15:59:22 +00:00
|
|
|
case WM_DDE_ACK:
|
|
|
|
{
|
|
|
|
ATOM a = LOWORD(lparam); if (a) GlobalDeleteAtom(a);
|
|
|
|
ATOM t = HIWORD(lparam); if (t) GlobalDeleteAtom(t);
|
|
|
|
CUR_DDE->do_ack(wparam);
|
|
|
|
normal_process = FALSE;
|
|
|
|
}
|
1997-02-19 11:55:38 +00:00
|
|
|
break;
|
|
|
|
case WM_DDE_DATA:
|
|
|
|
{
|
|
|
|
ATOM i = HIWORD(lparam); if (i) GlobalDeleteAtom(i);
|
|
|
|
}
|
|
|
|
break;
|
1996-06-07 15:59:22 +00:00
|
|
|
case WM_DDE_EXECUTE:
|
|
|
|
{
|
1996-06-18 13:33:27 +00:00
|
|
|
const TString cmd((const char*)lparam);
|
1996-06-07 15:59:22 +00:00
|
|
|
DDEACK ack; memset(&ack, 0, sizeof(ack));
|
|
|
|
ack.fAck = CUR_DDE->do_execute(wparam, cmd);
|
1997-02-19 11:55:38 +00:00
|
|
|
// Ritorna indietro l'handle globale che verra' distrutto dal chiamante
|
1996-06-07 15:59:22 +00:00
|
|
|
PostMessage((HWND)wparam, WM_DDE_ACK, (WPARAM)hwnd, lparam);
|
|
|
|
normal_process = FALSE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_DDE_TERMINATE:
|
|
|
|
CUR_DDE->do_terminate(wparam);
|
|
|
|
normal_process = FALSE;
|
|
|
|
break;
|
1996-06-27 07:15:21 +00:00
|
|
|
case WM_DROPFILES:
|
|
|
|
if (CUR_DDE->do_custom_message(msg, wparam, lparam))
|
|
|
|
{
|
|
|
|
*ret = 0;
|
|
|
|
normal_process = FALSE;
|
|
|
|
}
|
|
|
|
break;
|
1996-06-07 15:59:22 +00:00
|
|
|
default:
|
|
|
|
if (msg > (UINT)WM_USER && msg < 0x7FFF)
|
|
|
|
{
|
|
|
|
if (CUR_DDE->do_custom_message(msg, wparam, lparam))
|
|
|
|
normal_process = FALSE;
|
|
|
|
}
|
1995-06-19 08:13:19 +00:00
|
|
|
break;
|
|
|
|
}
|
1996-06-07 15:59:22 +00:00
|
|
|
|
|
|
|
return normal_process;
|
1995-06-19 08:13:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TDDE::TDDE()
|
1996-08-05 09:43:06 +00:00
|
|
|
: _server(0), _old_hook(-1)
|
1996-06-27 07:15:21 +00:00
|
|
|
{
|
|
|
|
CHECK(CUR_DDE == NULL, "Double DDE");
|
1996-06-07 15:59:22 +00:00
|
|
|
CUR_DDE = this;
|
1996-06-27 07:15:21 +00:00
|
|
|
_hwnd = (word)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
|
1995-06-19 08:13:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TDDE::~TDDE()
|
1996-08-05 09:43:06 +00:00
|
|
|
{
|
|
|
|
do_events(); // Flush degli venti in coda prima di sganciare tutto
|
1995-06-19 08:13:19 +00:00
|
|
|
terminate();
|
1996-06-07 15:59:22 +00:00
|
|
|
_hwnd = 0;
|
|
|
|
CUR_DDE = NULL;
|
1995-06-19 08:13:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool TDDE::initiate(const char* app, const char* topic)
|
|
|
|
{
|
1996-08-05 09:43:06 +00:00
|
|
|
if (_old_hook == -1)
|
1996-06-27 07:15:21 +00:00
|
|
|
{
|
|
|
|
_old_hook = xvt_vobj_get_attr(NULL_WIN, ATTR_EVENT_HOOK);
|
|
|
|
xvt_vobj_set_attr(NULL_WIN, ATTR_EVENT_HOOK, (long)hook);
|
|
|
|
}
|
|
|
|
|
1995-06-19 08:13:19 +00:00
|
|
|
_server = 0;
|
|
|
|
ATOM a_app = GlobalAddAtom(app);
|
|
|
|
ATOM a_topic = GlobalAddAtom(topic);
|
1996-06-07 15:59:22 +00:00
|
|
|
SendMessage(HWND_BROADCAST, WM_DDE_INITIATE, (WPARAM)_hwnd, MAKELPARAM(a_app, a_topic));
|
1995-06-19 08:13:19 +00:00
|
|
|
GlobalDeleteAtom(a_app);
|
|
|
|
GlobalDeleteAtom(a_topic);
|
1996-06-27 07:15:21 +00:00
|
|
|
|
1995-06-19 08:13:19 +00:00
|
|
|
return _server != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TDDE::execute(const char* cmd) const
|
|
|
|
{
|
|
|
|
HGLOBAL hg = GlobalAlloc(GMEM_DDESHARE, strlen(cmd)+1);
|
|
|
|
char* c = (char*)GlobalLock(hg);
|
|
|
|
strcpy(c, cmd);
|
|
|
|
GlobalUnlock(hg);
|
1996-06-07 15:59:22 +00:00
|
|
|
return PostMessage((HWND)_server, WM_DDE_EXECUTE, (WPARAM)_hwnd, MAKELPARAM(0, hg));
|
1996-06-27 07:15:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool TDDE::execute(const char* app, const char* topic, const char* cmd, const char* filename)
|
|
|
|
{
|
|
|
|
bool running = initiate(app, topic);
|
|
|
|
if (!running)
|
|
|
|
{
|
|
|
|
if (filename == NULL || *filename == '\0')
|
|
|
|
filename = app;
|
|
|
|
|
|
|
|
TExternal_app server(filename);
|
|
|
|
if (server.run(TRUE) == 0)
|
|
|
|
{
|
|
|
|
for (int failures = 0; !running && failures < 10; failures++)
|
|
|
|
{
|
|
|
|
const clock_t end = clock() + 3*CLOCKS_PER_SEC;
|
|
|
|
while (clock() < end)
|
|
|
|
do_events();
|
|
|
|
running = initiate(app, topic);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (running)
|
|
|
|
{
|
|
|
|
if (cmd && *cmd)
|
|
|
|
execute(cmd);
|
|
|
|
terminate();
|
|
|
|
}
|
|
|
|
|
|
|
|
return running;
|
1995-06-19 08:13:19 +00:00
|
|
|
}
|
|
|
|
|
1996-06-10 15:41:53 +00:00
|
|
|
bool TDDE::start_server()
|
|
|
|
{
|
1996-08-05 09:43:06 +00:00
|
|
|
if (_old_hook == -1)
|
1996-06-27 07:15:21 +00:00
|
|
|
{
|
|
|
|
_old_hook = xvt_vobj_get_attr(NULL_WIN, ATTR_EVENT_HOOK);
|
|
|
|
xvt_vobj_set_attr(NULL_WIN, ATTR_EVENT_HOOK, (long)hook);
|
|
|
|
}
|
1996-06-10 15:41:53 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
1995-06-19 08:13:19 +00:00
|
|
|
|
|
|
|
void TDDE::terminate()
|
|
|
|
{
|
1996-08-05 09:43:06 +00:00
|
|
|
if (_old_hook != -1)
|
1995-06-19 08:13:19 +00:00
|
|
|
{
|
|
|
|
xvt_vobj_set_attr(NULL_WIN, ATTR_EVENT_HOOK, _old_hook);
|
1996-08-05 09:43:06 +00:00
|
|
|
_old_hook = -1;
|
1996-06-07 15:59:22 +00:00
|
|
|
PostMessage((HWND)_server, (WPARAM)_hwnd, WM_DDE_TERMINATE, (LPARAM)0);
|
|
|
|
_server = 0;
|
1995-06-19 08:13:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|