Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions TTXSamples/TTXttyrec/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ add_library(
TTXttyplay.c
gettimeofday.c
gettimeofday.h
autofilename.c
autofilename.h
ReadMe.txt
ReadMe-ja.txt
)
Expand Down Expand Up @@ -58,6 +60,8 @@ add_library(
TTXttyrec.c
gettimeofday.c
gettimeofday.h
autofilename.c
autofilename.h
ReadMe.txt
ReadMe-ja.txt
)
Expand Down
21 changes: 1 addition & 20 deletions TTXSamples/TTXttyrec/TTXttyplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "codeconv.h"

#include "gettimeofday.h"
#include "autofilename.h"

#define ORDER 6001
#define ID_MENU_REPLAY 55302
Expand Down Expand Up @@ -113,26 +114,6 @@ void ChangeTitleStatus() {
SendMessage(pvar->cv->HWin, WM_COMMAND, MAKELONG(ID_SETUP_WINDOW, 0), 0);
}

void ConvertSafeStrFtimeFormat(wchar_t *fmt) {
static const wchar_t *kws=L"aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYz%N";
if (fmt != NULL) {
while (*fmt != L'\0') {
if (*fmt == L'%') {
fmt++;
if (*fmt == L'\0') {
fmt--;
*fmt=L'\0';
break;
}
if (wcschr(kws, *fmt) == NULL) {
*fmt = L'%';
}
}
fmt++;
}
}
}

void ChangeTitleTime(struct timeval tv) {
char tbuff[TitleBuffSize];
time_t tvs = tv.tv_sec;
Expand Down
182 changes: 154 additions & 28 deletions TTXSamples/TTXttyrec/TTXttyrec.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
#include "ttcommdlg.h"

#include "gettimeofday.h"
#include "autofilename.h"

#define ORDER 6000
#define ID_MENUITEM 55301

#define INISECTION "ttyrec"
#define INISECTIONW L"ttyrec"

static HANDLE hInst; /* Instance handle of TTX*.DLL */

Expand All @@ -31,6 +33,12 @@ typedef struct {
HMENU FileMenu;
BOOL record;
BOOL rec_stsize;
BOOL rec_auto;
wchar_t *rec_name;
wchar_t *rec_path;
int tel_mode;
int tel_buf_len;
char *tel_buf;
} TInstVar;

struct recheader {
Expand Down Expand Up @@ -98,11 +106,34 @@ static void PASCAL TTXInit(PTTSet ts, PComVar cv) {
pvar->fh = INVALID_HANDLE_VALUE;
pvar->rec_stsize = FALSE;
pvar->record = FALSE;
pvar->rec_auto = FALSE;
pvar->rec_name = NULL;
pvar->rec_path = NULL;
pvar->tel_mode = 0;
pvar->tel_buf_len = 32;
pvar->tel_buf = (char*)malloc(pvar->tel_buf_len);
}

static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
(pvar->origReadIniFile)(fn, ts);
pvar->rec_stsize = GetOnOff(INISECTION, "RecordStartSize", fn, TRUE);
pvar->rec_auto = GetOnOff(INISECTION, "RecordAutoStart", fn, FALSE);

DWORD len = MAX_PATH;
wchar_t *buff = (wchar_t*)malloc(len);
GetPrivateProfileStringW(INISECTIONW, L"RecordDefaultName", L"teraterm.tty", buff, len, fn);
free(pvar->rec_name);
pvar->rec_name = buff;

buff = (wchar_t*)malloc(len);
GetPrivateProfileStringW(INISECTIONW, L"RecordDefaultPath", L"", buff, len, fn);
free(pvar->rec_path);
pvar->rec_path = buff;
}

static void PASCAL TTXGetSetupHooks(TTXSetupHooks *hooks) {
pvar->origReadIniFile = *hooks->ReadIniFile;
*hooks->ReadIniFile = TTXReadIniFile;
}

void WriteData(HANDLE fh, char *buff, int len) {
Expand All @@ -120,17 +151,110 @@ void WriteData(HANDLE fh, char *buff, int len) {
return;
}

static void PASCAL TTXGetSetupHooks(TTXSetupHooks *hooks) {
pvar->origReadIniFile = *hooks->ReadIniFile;
*hooks->ReadIniFile = TTXReadIniFile;
void WriteDataTelnet(HANDLE fh, char *buff, int len) {
char *p;
int sz;

if (pvar->tel_buf_len < len){
free(pvar->tel_buf);
pvar->tel_buf_len = len;
pvar->tel_buf = (char *)malloc(pvar->tel_buf_len);
}
p = pvar->tel_buf;
for (int i=0; i < len; i ++){
char ch = buff[i];
switch (pvar->tel_mode) {
case 0:
if (ch == (char)0xff) {
pvar->tel_mode = 1;
}
else {
*p++ = ch;
}
break;
case 1:
if (ch == (char)0xff) {
*p++ = ch;
pvar->tel_mode = 0;
}
else if ((char)0xfb <= ch && ch <= (char)0xfe) {
pvar->tel_mode = 2;
}
else if (ch == (char)0xfa) {
pvar->tel_mode = 3;
}
else {
pvar->tel_mode = 0;
}
break;
case 2:
pvar->tel_mode = 0;
break;
case 3:
if (ch == (char)0xff) {
pvar->tel_mode = 4;
}
break;
case 4:
if (ch == (char)0xf0) {
pvar->tel_mode = 0;
}
else if (ch != (char)0xff) {
pvar->tel_mode = 3;
}
break;
default:
pvar->tel_mode = 0;
break;
}
}

sz = (int)(p - pvar->tel_buf);
if (sz > 0) {
WriteData(fh, pvar->tel_buf, sz);
}

return;
}

void StartRecording(wchar_t *fname)
{
pvar->fh = CreateFileW(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (pvar->fh != INVALID_HANDLE_VALUE) {
pvar->record = TRUE;
CheckMenuItem(pvar->FileMenu, ID_MENUITEM, MF_BYCOMMAND | MF_CHECKED);
if (pvar->cv->Ready) {
if (pvar->rec_stsize) {
char buff[20];
_snprintf_s(buff, sizeof(buff), _TRUNCATE, "\033[8;%d;%dt",
pvar->ts->TerminalHeight, pvar->ts->TerminalWidth);
WriteData(pvar->fh, buff, (int)strlen(buff));
}
}
}
}

void StopRecording()
{
if (pvar->fh != INVALID_HANDLE_VALUE) {
CloseHandle(pvar->fh);
pvar->fh = INVALID_HANDLE_VALUE;
}
pvar->record = FALSE;
CheckMenuItem(pvar->FileMenu, ID_MENUITEM, MF_BYCOMMAND | MF_UNCHECKED);
}

int PASCAL TTXrecv(SOCKET s, char *buff, int len, int flags) {
int rlen;

rlen = pvar->origPrecv(s, buff, len, flags);
if (pvar->record && rlen > 0) {
WriteData(pvar->fh, buff, rlen);
if (pvar->cv->TelFlag) {
WriteDataTelnet(pvar->fh, buff, rlen);
}
else {
WriteData(pvar->fh, buff, rlen);
}
}
return rlen;
}
Expand All @@ -148,25 +272,43 @@ BOOL PASCAL TTXReadFile(HANDLE fh, LPVOID buff, DWORD len, LPDWORD rbytes, LPOVE
static void PASCAL TTXOpenTCP(TTXSockHooks *hooks) {
pvar->origPrecv = *hooks->Precv;
*hooks->Precv = TTXrecv;
if (pvar->rec_auto) {
wchar_t *_fname;
_fname = GetAutoFilename(pvar->cv, pvar->rec_name, pvar->rec_path, L"teraterm.tty");
StartRecording(_fname);
free(_fname);
}
}

static void PASCAL TTXCloseTCP(TTXSockHooks *hooks) {
if (pvar->origPrecv) {
*hooks->Precv = pvar->origPrecv;
}
if (pvar->rec_auto) {
StopRecording();
}
}

static void PASCAL TTXOpenFile(TTXFileHooks *hooks) {
if (pvar->cv->PortType == IdSerial) {
pvar->origPReadFile = *hooks->PReadFile;
*hooks->PReadFile = TTXReadFile;
if (pvar->rec_auto) {
wchar_t *_fname;
_fname = GetAutoFilename(pvar->cv, pvar->rec_name, pvar->rec_path, L"teraterm.tty");
StartRecording(_fname);
free(_fname);
}
}
}

static void PASCAL TTXCloseFile(TTXFileHooks *hooks) {
if (pvar->origPReadFile) {
*hooks->PReadFile = pvar->origPReadFile;
}
if (pvar->rec_auto) {
StopRecording();
}
}

static void PASCAL TTXModifyMenu(HMENU menu) {
Expand Down Expand Up @@ -199,21 +341,14 @@ static int PASCAL TTXProcessCommand(HWND hWin, WORD cmd)
{
if (cmd==ID_MENUITEM) {
if (pvar->record) {
if (pvar->fh != INVALID_HANDLE_VALUE) {
CloseHandle(pvar->fh);
pvar->fh = INVALID_HANDLE_VALUE;
}
pvar->record = FALSE;
CheckMenuItem(pvar->FileMenu, ID_MENUITEM, MF_BYCOMMAND | MF_UNCHECKED);
StopRecording();
}
else {
TTOPENFILENAMEW ofn;
wchar_t *fname;
wchar_t *uimsg1, *uimsg2;

if (pvar->fh != INVALID_HANDLE_VALUE) {
CloseHandle(pvar->fh);
}
StopRecording();

GetI18nStrWW("TTXttyrec", "FILE_FILTER", L"ttyrec(*.tty)\\0*.tty\\0All files(*.*)\\0*.*\\0\\0", pvar->ts->UILanguageFileW, &uimsg1);
GetI18nStrWW("TTXttyrec", "FILE_DEFAULTEXTENSION", L"tty", pvar->ts->UILanguageFileW, &uimsg2);
Expand All @@ -226,18 +361,8 @@ static int PASCAL TTXProcessCommand(HWND hWin, WORD cmd)
//ofn.lpstrTitle = L"";
ofn.Flags = OFN_OVERWRITEPROMPT;
if (TTGetSaveFileNameW(&ofn, &fname)) {
pvar->fh = CreateFileW(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
StartRecording(fname);
free(fname);
if (pvar->fh != INVALID_HANDLE_VALUE) {
pvar->record = TRUE;
CheckMenuItem(pvar->FileMenu, ID_MENUITEM, MF_BYCOMMAND | MF_CHECKED);
if (pvar->rec_stsize) {
char buff[20];
_snprintf_s(buff, sizeof(buff), _TRUNCATE, "\033[8;%d;%dt",
pvar->ts->TerminalHeight, pvar->ts->TerminalWidth);
WriteData(pvar->fh, buff, (int)strlen(buff));
}
}
}
free(uimsg1);
free(uimsg2);
Expand All @@ -248,10 +373,11 @@ static int PASCAL TTXProcessCommand(HWND hWin, WORD cmd)
}

static void PASCAL TTXEnd(void) {
if (pvar->fh != INVALID_HANDLE_VALUE) {
CloseHandle(pvar->fh);
pvar->fh = INVALID_HANDLE_VALUE;
}
StopRecording();
free(pvar->tel_buf);
pvar->tel_buf = NULL;
free(pvar->rec_name);
pvar->rec_name = NULL;
}

static TTXExports Exports = {
Expand Down
Loading
Loading