summaryrefslogtreecommitdiff
path: root/src/rmd_cache.c
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2020-07-11 16:47:00 -0700
committerVito Caputo <vcaputo@pengaru.com>2020-07-11 16:47:00 -0700
commit3625160acc1715fc380f58ec3c4248485bed2370 (patch)
treedc95a32d81daac298cef69879a639029797fb762 /src/rmd_cache.c
parentcfcca8681b88a171fb2cdbb83daa5f22bbedb6b8 (diff)
*: drop {gtk,qt}-recordmydesktop subdirs
This restores the recordmydesktop/ subdir as root from the mirror I cloned by fork from. I have no particular interest in the gtk/qt frontends and it doesn't appear they were part of a single tree in the past. But I will probably preserve backwards compatibility of the cli so they can continue to work with this fork installed.
Diffstat (limited to 'src/rmd_cache.c')
-rw-r--r--src/rmd_cache.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/rmd_cache.c b/src/rmd_cache.c
new file mode 100644
index 0000000..1353bc2
--- /dev/null
+++ b/src/rmd_cache.c
@@ -0,0 +1,218 @@
+/******************************************************************************
+* recordMyDesktop *
+*******************************************************************************
+* *
+* Copyright (C) 2006,2007,2008 John Varouhakis *
+* *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the Free Software *
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+* *
+* *
+* *
+* For further information contact me at johnvarouhakis@gmail.com *
+******************************************************************************/
+
+#include "config.h"
+#include "rmd_cache.h"
+
+#include "rmd_specsfile.h"
+#include "rmd_types.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+
+
+/**
+*Construct an number postfixed name
+*
+* \param name base name
+*
+* \param newname modified name
+*
+* \n number to be used as a postfix
+*
+*/
+static void rmdCacheFileN(char *name, char **newname, int n) { // Nth cache file
+ char numbuf[8];
+
+ strcpy(*newname, name);
+ strcat(*newname, ".");
+ snprintf(numbuf, 8, "%d", n);
+ strcat(*newname, numbuf);
+}
+
+int rmdSwapCacheFilesWrite(char *name, int n, gzFile *fp, FILE **ucfp) {
+ char *newname = malloc(strlen(name) + 10);
+
+ rmdCacheFileN(name, &newname, n);
+ if (*fp == NULL) {
+ fflush(*ucfp);
+ fclose(*ucfp);
+ *ucfp = fopen(newname, "wb");
+ } else {
+ gzflush(*fp, Z_FINISH);
+ gzclose(*fp);
+ *fp = gzopen(newname, "wb0f");
+ }
+ free(newname);
+
+ return ((*fp == NULL) && (*ucfp == NULL));
+}
+
+int rmdSwapCacheFilesRead(char *name, int n, gzFile *fp, FILE **ucfp) {
+ char *newname = malloc(strlen(name) + 10);
+
+ rmdCacheFileN(name, &newname, n);
+ if (*fp == NULL) {
+ fclose(*ucfp);
+ *ucfp = fopen(newname, "rb");
+ } else {
+ gzclose(*fp);
+ *fp = gzopen(newname, "rb");
+ }
+ free(newname);
+
+ return ((*fp == NULL) && (*ucfp == NULL));
+}
+
+int rmdPurgeCache(CacheData *cache_data_t, int sound) {
+ struct stat buff;
+ char *fname;
+ int exit_value = 0;
+ int nth_cache = 1;
+
+ fname = malloc(strlen(cache_data_t->imgdata) + 10);
+ strcpy(fname, cache_data_t->imgdata);
+
+ while (stat(fname, &buff) == 0) {
+ if (remove(fname)) {
+ fprintf(stderr, "Couldn't remove temporary file %s", cache_data_t->imgdata);
+ exit_value = 1;
+ }
+ rmdCacheFileN(cache_data_t->imgdata, &fname, nth_cache);
+ nth_cache++;
+ }
+
+ free(fname);
+
+ if (sound) {
+ if (remove(cache_data_t->audiodata)) {
+ fprintf(stderr, "Couldn't remove temporary file %s", cache_data_t->audiodata);
+ exit_value = 1;
+ }
+ }
+
+ if (remove(cache_data_t->specsfile)) {
+ fprintf(stderr, "Couldn't remove temporary file %s", cache_data_t->specsfile);
+ exit_value = 1;
+ }
+
+ if (remove(cache_data_t->projname)) {
+ fprintf(stderr, "Couldn't remove temporary directory %s", cache_data_t->projname);
+ exit_value = 1;
+ }
+
+ return exit_value;
+}
+
+void rmdInitCacheData(ProgData *pdata, EncData *enc_data_t, CacheData *cache_data_t) {
+ int width, height, pid;
+ char pidbuf[8];
+
+ //we set the buffer only since there's
+ //no need to initialize the encoder from now.
+ width = ((pdata->brwin.rrect.width + 15) >> 4) << 4;
+ height = ((pdata->brwin.rrect.height + 15) >> 4) << 4;
+
+ (pdata)->enc_data = enc_data_t;
+
+ enc_data_t->yuv.y = (unsigned char *)malloc(height * width);
+ enc_data_t->yuv.u = (unsigned char *)malloc(height * width / 4);
+ enc_data_t->yuv.v = (unsigned char *)malloc(height * width / 4);
+ enc_data_t->yuv.y_width = width;
+ enc_data_t->yuv.y_height = height;
+ enc_data_t->yuv.y_stride = width;
+
+ enc_data_t->yuv.uv_width = width / 2;
+ enc_data_t->yuv.uv_height = height / 2;
+ enc_data_t->yuv.uv_stride = width / 2;
+
+ //now we set the cache files
+ (pdata)->cache_data = cache_data_t;
+
+ cache_data_t->workdir = (pdata->args).workdir;
+ pid = getpid();
+
+ snprintf( pidbuf, 8, "%d", pid );
+ //names are stored relatively to current dir(i.e. no chdir)
+ cache_data_t->projname = malloc(strlen(cache_data_t->workdir) + 12 + strlen(pidbuf) + 3);
+ //projname
+ strcpy(cache_data_t->projname, cache_data_t->workdir);
+ strcat(cache_data_t->projname, "/");
+ strcat(cache_data_t->projname, "rMD-session-");
+ strcat(cache_data_t->projname, pidbuf);
+ strcat(cache_data_t->projname, "/");
+ //image data
+ cache_data_t->imgdata = malloc(strlen(cache_data_t->projname) + 11);
+ strcpy(cache_data_t->imgdata, cache_data_t->projname);
+ strcat(cache_data_t->imgdata, "img.out");
+ //audio data
+ cache_data_t->audiodata = malloc(strlen(cache_data_t->projname) + 10);
+ strcpy(cache_data_t->audiodata, cache_data_t->projname);
+ strcat(cache_data_t->audiodata, "audio.pcm");
+ //specsfile
+ cache_data_t->specsfile = malloc(strlen(cache_data_t->projname) + 10);
+ strcpy(cache_data_t->specsfile, cache_data_t->projname);
+ strcat(cache_data_t->specsfile, "specs.txt");
+
+ //now that've got out buffers and our filenames we start
+ //creating the needed files
+
+ if (mkdir(cache_data_t->projname, 0777)) {
+ fprintf(stderr, "Could not create temporary directory %s !!!\n", cache_data_t->projname);
+ exit(13);
+ }
+
+ if (!pdata->args.zerocompression) {
+ cache_data_t->ifp = gzopen(cache_data_t->imgdata, "wb0f");
+ if (cache_data_t->ifp == NULL) {
+ fprintf(stderr, "Could not create temporary file %s !!!\n", cache_data_t->imgdata);
+ exit(13);
+ }
+ } else {
+ cache_data_t->uncifp = fopen(cache_data_t->imgdata, "wb0f");
+ if (cache_data_t->uncifp == NULL) {
+ fprintf(stderr, "Could not create temporary file %s !!!\n", cache_data_t->imgdata);
+ exit(13);
+ }
+ }
+
+ if (!pdata->args.nosound) {
+ cache_data_t->afp = fopen(cache_data_t->audiodata, "wb");
+ if (cache_data_t->afp == NULL) {
+ fprintf(stderr, "Could not create temporary file %s !!!\n", cache_data_t->audiodata);
+ exit(13);
+ }
+ }
+
+ if (rmdWriteSpecsFile(pdata)) {
+ fprintf(stderr, "Could not write specsfile %s !!!\n", cache_data_t->specsfile);
+ exit(13);
+ }
+}
© All Rights Reserved