]> git.cworth.org Git - vogl/blob - src/common/listfiles.cpp
Initial vogl checkin
[vogl] / src / common / listfiles.cpp
1 /**************************************************************************
2  *
3  * Copyright 2013-2014 RAD Game Tools and Valve Software
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26 #include <dirent.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string>
30
31 #include <vogl_core.h>
32 #include <vogl_json.h>
33
34 #include <iomanip>
35 #include <sstream>
36
37 #include "commands.h"
38 #include "listfiles.h"
39
40 int
41 AskForTraceFileList(unsigned int *pbuffer_size, char **pbuffer)
42 {
43     unsigned int cbBuff = sizeof(int32_t);
44     char * pbBuff = (char *)malloc(cbBuff);
45     if (NULL == pbBuff)
46     {
47         printf("OOM\n");
48         return -1;
49     }
50
51     //  First part of buffer is the command id
52     *((int32_t *)pbBuff) = TRACE_LIST_TRACES;
53
54     *pbuffer = pbBuff;
55     *pbuffer_size = cbBuff;
56
57     return 0;
58 }
59
60 //
61 //  Lists the set of trace files on the server
62 //
63 int
64 ListTraceFiles(unsigned int *pbuffer_size, char **pbuffer)
65 {
66     DIR           *d;
67     struct dirent *dir;
68     std::string strTraceLocation;
69     const char *szTraceLocation = NULL;
70
71     vogl::json_document cur_doc;
72     vogl::dynamic_string dst;
73
74     char *pbBuff;
75     unsigned int cbBuff;
76
77     // Add list of files
78     vogl::json_node &meta_node2 = cur_doc.get_root()->add_array("trace_list");
79
80     //
81     //  Find the correct directory
82     //
83     //
84     //  Handle the destination directory for the file as per spec
85     //    $XDG_DATA_HOME defines the base directory relative to which user specific data files should be stored.
86     //    If $XDG_DATA_HOME is either not set or empty, a default equal to $HOME/.local/share should be used.
87     szTraceLocation = getenv("XDG_DATA_HOME");
88     if (NULL == szTraceLocation)
89     {
90         strTraceLocation = getenv("HOME");
91         strTraceLocation += "/.local/share";
92     }
93     else
94     {
95         strTraceLocation = szTraceLocation;
96     }
97     strTraceLocation += "/vogl/";
98
99     d = opendir(strTraceLocation.c_str());
100     if (d)
101     {
102         while ((dir = readdir(d)) != NULL)
103         {
104             if (DT_REG == dir->d_type)
105             {
106                 meta_node2.add_value(dir->d_name);
107             }
108         }
109
110         closedir(d);
111     }
112
113     cur_doc.serialize(dst);
114
115     cbBuff = dst.get_len() + 1 + sizeof(int32_t);
116     pbBuff = (char *)malloc(cbBuff);
117     if (NULL == pbBuff)
118     {
119         printf("OOM\n");
120         return -1;
121     }
122
123     //  First part of buffer is the command id
124     *((int32_t *)pbBuff) = TRACE_LIST;
125     strncpy((char *)(pbBuff+sizeof(int32_t)), dst.get_ptr(), cbBuff - sizeof(int32_t));
126
127     *pbuffer = pbBuff;
128     *pbuffer_size = cbBuff;
129
130     return 0;
131 }
132
133 int DumpTraceFileList(unsigned int buffer_size, char *buffer)
134 {
135     vogl::json_document cur_doc;
136
137     if (0 == buffer_size)
138         return -1;
139
140     cur_doc.deserialize(buffer);
141
142     // Read filelist in.
143     const vogl::json_node *file_array = cur_doc.get_root()->find_child_array( "trace_list" );
144     for (uint i = 0; i < file_array->size(); i++)
145     {
146         const char * str = file_array->value_as_string_ptr(i);
147         printf( "%d: %s\n", i, str );
148     }
149
150     return 0;
151 }
152