Do not use tmpnam() but a custom function.

This commit is contained in:
Ole Loots 2013-12-29 22:23:51 +01:00
parent d451b543c6
commit e154748542
3 changed files with 79 additions and 4 deletions

View File

@ -23,7 +23,10 @@
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <mint/osbind.h>
#include <cflib.h>
#include "desktop/gui.h"
#include "desktop/netsurf.h"
@ -37,6 +40,7 @@
#include "css/css.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
#include "atari/gui.h"
#include "atari/rootwin.h"
@ -109,6 +113,39 @@ static struct s_context_info * get_context_info( struct gui_window * gw, short m
}
/***
*
* \param prefix
* \param sufffix
* \return pointer to static buffer owned by get_tmpfilename()
*/
static char * get_tmpfilename(const char * prefix, const char * suffix)
{
int i=0;
static char tmpfilename[PATH_MAX];
char * tmpdir;
const char * tmp_path_suffix = "";
// TODO: make function public?
tmpdir = getenv("TMPDIR");
if(tmpdir == NULL){
tmpdir = (char*)"u:\\tmp\\";
}
if(tmpdir[strlen(tmpdir)-1] != '\\'){
tmp_path_suffix = "\\";
}
do{
/* generate a new filename: */
snprintf(tmpfilename, PATH_MAX, "%s%s%s%d%s", tmpdir,
tmp_path_suffix, prefix, i++, suffix);
/* check with cflib: */
} while(file_exists(tmpfilename));
return(tmpfilename);
}
//TODO: do not open popup for gui_window, but for a rootwin?
void context_popup(struct gui_window * gw, short x, short y)
{
@ -275,7 +312,9 @@ void context_popup(struct gui_window * gw, short x, short y)
data = content_get_source_data(gw->browser->bw->current_content,
&size);
if (size > 0 && data != NULL){
snprintf(tempfile, 127, "%s%s.htm", "u:", tmpnam(NULL));
snprintf(tempfile, 127, "%s", get_tmpfilename("ns-", ".html"));
/* the GEMDOS cmdline contains the length of the commandline
in the first byte: */
cmdline[0] = (unsigned char)strlen(tempfile);
LOG(("Creating temporay source file: %s\n", tempfile));
fp_tmpfile = fopen(tempfile, "w");
@ -283,6 +322,10 @@ void context_popup(struct gui_window * gw, short x, short y)
fwrite(data, size, 1, fp_tmpfile);
fclose(fp_tmpfile);
// Send SH_WDRAW to notify files changed:
gemtk_send_msg(SH_WDRAW, 0, -1, 0, 0, 0, 0);
// start application:
if(strlen(tempfile)<=125){
shel_write(1, 1, 1, editor, cmdline);
}

View File

@ -60,6 +60,10 @@ void gemtk_clip_grect(VdiHdl vh, GRECT *rect);
void gemtk_wind_get_str(short aes_handle, short mode, char *str, int len);
/* send application message */
void gemtk_send_msg(short msg_type, short data2, short data3, short data4,
short data5, short data6, short data7);
#ifndef POINT_WITHIN
# define POINT_WITHIN(_x,_y, r) ((_x >= r.g_x) && (_x <= r.g_x + r.g_w ) \

View File

@ -95,10 +95,38 @@ void gemtk_clip_grect(VdiHdl vh, GRECT *rect)
vs_clip_pxy(vh, pxy);
}
/** Send an Message to a GUIWIN using AES message pipe
* \param win the GUIWIN which shall receive the message
* \param msg_type the WM_ message definition
* \param a the 4th parameter to appl_write
* \param b the 5th parameter to appl_write
* \param c the 6th parameter to appl_write
* \param d the 7th parameter to appl_write
*/
void gemtk_send_msg(short msg_type, short data2, short data3, short data4,
short data5, short data6, short data7)
{
short msg[8];
msg[0] = msg_type;
msg[1] = gl_apid;
msg[2] = data2;
msg[3] = data3;
msg[4] = data4;
msg[5] = data5;
msg[6] = data6;
msg[7] = data7;
appl_write(gl_apid, 16, &msg);
}
void gemtk_wind_get_str(short aes_handle, short mode, char *str, int len)
{
char tmp_str[255];
// TODO: remove or implement function
if(len>255) {
len = 255;
}