summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/applets/vmemo/vmemo.cpp41
-rw-r--r--noncore/apps/opie-console/TEHistory.cpp27
2 files changed, 56 insertions, 12 deletions
diff --git a/core/applets/vmemo/vmemo.cpp b/core/applets/vmemo/vmemo.cpp
index 8ba1eb7..1a8f154 100644
--- a/core/applets/vmemo/vmemo.cpp
+++ b/core/applets/vmemo/vmemo.cpp
@@ -285,118 +285,141 @@ bool VMemo::startRecording() {
Config config( "Vmemo" );
config.setGroup( "System" );
odebug << "Start recording engines" << oendl;
recording = true;
if (openDSP() == -1) {
recording = false;
return false;
}
config.setGroup("Defaults");
date = TimeString::dateString( QDateTime::currentDateTime(),false,true);
date.replace(QRegExp("'"),"");
date.replace(QRegExp(" "),"_");
date.replace(QRegExp(":"),"-");
date.replace(QRegExp(","),"");
QString fName;
config.setGroup( "System" );
fName = QPEApplication::documentDir() ;
fileName = config.readEntry("RecLocation", fName);
int s;
s=fileName.find(':');
if(s)
fileName=fileName.right(fileName.length()-s-2);
odebug << "pathname will be "+fileName << oendl;
if( fileName.left(1).find('/') == -1)
fileName="/"+fileName;
if( fileName.right(1).find('/') == -1)
fileName+="/";
fName = "vm_"+ date + ".wav";
fileName += fName;
odebug << "filename is " + fileName << oendl;
useAlerts = config.readBoolEntry("Alert",1);
if(useAlerts) {
msgLabel = new QLabel( 0, "alertLabel" );
msgLabel->setText( tr("<B><P><font size=+2>VMemo-Recording</font></B><p>%1</p>").arg("vm_"+ date));
msgLabel->show();
}
// open tmp file here
- char *pointer;
- pointer=tmpnam(NULL);
- odebug << "Opening tmp file " << pointer << "" << oendl;
+ char *tmpFilePath = 0;
+ char *tmpDir = getenv("TMPDIR");
+ if (tmpDir && *tmpDir != '\0') {
+ tmpFilePath = new char[strlen(tmpDir) + strlen("/vmemo-wav-XXXXXX") + 1];
+ strcpy(tmpFilePath, tmpDir);
+ free(tmpDir);
+ } else {
+ tmpFilePath = new char[strlen("/tmp/vmemo-wav-XXXXXX") + 1];
+ strcpy(tmpFilePath, "/tmp");
+ }
+ strcat(tmpFilePath, "/vmemo-wav-XXXXXX");
+ mode_t currUmask = umask(S_IRWXO | S_IRWXG);
+ int tmpFd = mkstemp(tmpFilePath);
+ umask(currUmask);
+ if (tmpFd == -1) {
+ owarn << "Could not open temp file with template " << tmpFilePath
+ << oendl;
+ delete [] tmpFilePath;
+ return false;
+ } else
+ odebug << "Opened temp file " << tmpFilePath << "" << oendl;
+
+ close(tmpFd);
- if(openWAV(pointer ) == -1) {
+ if(openWAV(tmpFilePath ) == -1) {
QString err("Could not open the temp file\n");
err += fileName;
QMessageBox::critical(0, "vmemo", err, "Abort");
::close(dsp);
return false;
}
if( record() ) {
- QString cmd;
if( fileName.find(".wav",0,true) == -1)
fileName += ".wav";
- cmd.sprintf("mv %s "+fileName, pointer);
-// move tmp file to regular file here
-
- system(cmd.latin1());
+ int retVal = rename(tmpFilePath, fileName.local8Bit());
+ if (retVal == -1) {
+ owarn << "Could not move " << tmpFilePath << " to " << fileName
+ << oendl;
+ delete [] tmpFilePath;
+ return false;
+ }
+ delete [] tmpFilePath;
QArray<int> cats(1);
cats[0] = config.readNumEntry("Category", 0);
QString dlName("vm_");
dlName += date;
DocLnk l;
l.setFile(fileName);
l.setName(dlName);
l.setType("audio/x-wav");
l.setCategories(cats);
l.writeLink();
return true;
} else
return false;
}
void VMemo::stopRecording() {
// show();
odebug << "Stopped recording" << oendl;
recording = false;
if(useAlerts) {
msgLabel->close();
msgLabel=0;
delete msgLabel;
}
t_timer->stop();
Config cfg("Vmemo");
cfg.setGroup("Defaults");
// if( cfg.readNumEntry("hideIcon",0) == 1 )
// hide();
}
int VMemo::openDSP() {
Config cfg("Vmemo");
cfg.setGroup("Record");
speed = cfg.readNumEntry("SampleRate", 22050);
channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1)
if (cfg.readNumEntry("SixteenBit", 1)==1) {
format = AFMT_S16_LE;
resolution = 16;
} else {
format = AFMT_U8;
resolution = 8;
}
diff --git a/noncore/apps/opie-console/TEHistory.cpp b/noncore/apps/opie-console/TEHistory.cpp
index 317ce57..e2be42a 100644
--- a/noncore/apps/opie-console/TEHistory.cpp
+++ b/noncore/apps/opie-console/TEHistory.cpp
@@ -1,149 +1,170 @@
/* -------------------------------------------------------------------------- */
/* */
/* [TEHistory.C] History Buffer */
/* */
/* -------------------------------------------------------------------------- */
/* */
/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
/* */
/* This file is part of Konsole - an X terminal for KDE */
/* */
/* -------------------------------------------------------------------------- */
/* */
/* Ported Konsole to Qt/Embedded */
/* */
/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */
/* */
/* -------------------------------------------------------------------------- */
#include "TEHistory.h"
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#define HERE printf("%s(%d): here\n",__FILE__,__LINE__)
/*
An arbitrary long scroll.
One can modify the scroll only by adding either cells
or newlines, but access it randomly.
The model is that of an arbitrary wide typewriter scroll
in that the scroll is a serie of lines and each line is
a serie of cells with no overwriting permitted.
The implementation provides arbitrary length and numbers
of cells and line/column indexed read access to the scroll
at constant costs.
FIXME: some complain about the history buffer comsuming the
memory of their machines. This problem is critical
since the history does not behave gracefully in cases
where the memory is used up completely.
I put in a workaround that should handle it problem
now gracefully. I'm not satisfied with the solution.
FIXME: Terminating the history is not properly indicated
in the menu. We should throw a signal.
FIXME: There is noticable decrease in speed, also. Perhaps,
there whole feature needs to be revisited therefore.
Disadvantage of a more elaborated, say block-oriented
scheme with wrap around would be it's complexity.
*/
//FIXME: tempory replacement for tmpfile
// this is here one for debugging purpose.
//#define tmpfile xTmpFile
FILE* xTmpFile()
{
static int fid = 0;
char fname[80];
sprintf(fname,"TmpFile.%d",fid++);
return fopen(fname,"w");
}
// History Buffer ///////////////////////////////////////////
/*
A Row(X) data type which allows adding elements to the end.
*/
HistoryBuffer::HistoryBuffer()
{
ion = -1;
length = 0;
}
HistoryBuffer::~HistoryBuffer()
{
setScroll(FALSE);
}
void HistoryBuffer::setScroll(bool on)
{
if (on == hasScroll()) return;
if (on)
{
assert( ion < 0 );
assert( length == 0);
- FILE* tmp = tmpfile(); if (!tmp) { perror("konsole: cannot open temp file.\n"); return; }
- ion = dup(fileno(tmp)); if (ion<0) perror("konsole: cannot dup temp file.\n");
- fclose(tmp);
+ char* tmpDir = getenv("TMPDIR");
+ char* tmpFilePath = 0;
+ if (tmpDir && *tmpDir != '\0') {
+ tmpFilePath = new char[strlen(tmpDir) + strlen("/opie-console-HistoryBuffer-XXXXXX") + 1];
+ strcpy(tmpFilePath, tmpDir);
+ free(tmpDir);
+ } else {
+ tmpFilePath = new char[strlen("/tmp/opie-console-HistoryBuffer-XXXXXX") + 1];
+ strcpy(tmpFilePath, "/tmp");
+ }
+ strcat(tmpFilePath, "/opie-console-HistoryBuffer-XXXXXX");
+ mode_t currUmask = umask(S_IRWXO | S_IRWXG);
+ int tmpfd = mkstemp(tmpFilePath);
+ delete [] tmpFilePath;
+ umask(currUmask);
+ if (tmpfd == -1) {
+ perror("konsole: cannot open temp file.\n");
+ return;
+ }
+ ion = dup(tmpfd);
+ if (ion<0)
+ perror("konsole: cannot dup temp file.\n");
+ close(tmpfd);
}
else
{
assert( ion >= 0 );
close(ion);
ion = -1;
length = 0;
}
}
bool HistoryBuffer::hasScroll()
{
return ion >= 0;
}
void HistoryBuffer::add(const unsigned char* bytes, int len)
{ int rc;
assert(hasScroll());
rc = lseek(ion,length,SEEK_SET); if (rc < 0) { perror("HistoryBuffer::add.seek"); setScroll(FALSE); return; }
rc = write(ion,bytes,len); if (rc < 0) { perror("HistoryBuffer::add.write"); setScroll(FALSE); return; }
length += rc;
}
void HistoryBuffer::get(unsigned char* bytes, int len, int loc)
{ int rc;
assert(hasScroll());
if (loc < 0 || len < 0 || loc + len > length)
fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc);
rc = lseek(ion,loc,SEEK_SET); if (rc < 0) { perror("HistoryBuffer::get.seek"); setScroll(FALSE); return; }
rc = read(ion,bytes,len); if (rc < 0) { perror("HistoryBuffer::get.read"); setScroll(FALSE); return; }
}
int HistoryBuffer::len()
{
return length;
}
// History Scroll //////////////////////////////////////
/*
The history scroll makes a Row(Row(Cell)) from
two history buffers. The index buffer contains
start of line positions which refere to the cells
buffer.
Note that index[0] addresses the second line
(line #1), while the first line (line #0) starts
at 0 in cells.