4 * Created on: Nov 14, 2010
21 #include "W1Configure.hh"
27 template <class NumberDataType>
28 bool string_to_number(NumberDataType& result,
29 const std::string& string_param,
30 std::ios_base& (*format)(std::ios_base&))
32 std::istringstream iss(string_param);
33 return !(iss >> format >> result).fail();
42 char *W1Util::parse_directory_path(const char *file_path) {
49 if (file_path != NULL) {
51 b_count = strlen(file_path);
52 for (p = &((char *)file_path)[b_count]; p != (char *)file_path; p--) {
56 b_count = (b_count - f_size) + 1;
57 ret_val = strndup(file_path, b_count);
58 log_debug("dir: %s\n", ret_val);
66 bool W1Util::mkdirs(char *path) {
73 // go through each directory one by and and create if not exist
74 for (p = path; *p; p++) {
79 // test whether directory exist and is writable
80 if (access(path, F_OK)) {
81 log_debug("trying to create directory: %s\n", path);
82 err_flg = mkdir(path, S_IRWXU);
91 if (ret_val == true) {
92 // test also the existense of whole directory
93 if (access(path, F_OK)) {
94 log_debug("trying to create directory: %s\n", path);
95 err_flg = mkdir(path, S_IRWXU);
104 log_error("Could not create NULL directory\n");
109 std::ofstream *W1Util::open_for_writing(const char *f_path) {
116 if (f_path != NULL) {
117 b_count = strlen(f_path);
118 if ((f_path[b_count - 1] != '/') &&
119 (f_path[b_count - 1] != '\\')) {
120 ret_val = new ofstream();
121 ret_val->open(f_path, ios::app);
122 if (ret_val->is_open() == false) {
123 d_path = parse_directory_path(f_path);
124 if (d_path != NULL) {
125 b_flg = mkdirs(d_path);
129 ret_val->open(f_path, ios::app);
134 log_error("Could not open file, invalid file name. (%s)\n", f_path);
138 log_error("Could not open file, invalid file name. (= NULL)\n");
143 string W1Util::concat_paths(string path_start, string path_end) {
144 return concat_paths(path_start.c_str(), path_end.c_str());
147 string W1Util::concat_paths(const char *path_start, const char *path_end) {
153 if (path_start != NULL) {
154 ret_val = path_start;
155 if (path_end != NULL) {
157 b_count = ret_val.length();
158 pos = ret_val.find_last_of("/");
159 if (pos == (b_count -1)) {
160 ret_val.append(end_str);
163 pos = end_str.find_first_of("/");
165 ret_val.append(end_str);
169 ret_val.append(end_str);
175 if (path_end != NULL) {
182 bool W1Util::is_subdirectory(const char *path, dirent *direntry) {
184 struct stat stat_info;
188 if (direntry != NULL) {
189 if ((strcmp(direntry->d_name, ".") == 0) ||
190 (strcmp(direntry->d_name, "..") == 0)) {
194 fname = concat_paths(path, direntry->d_name);
195 stat(fname.c_str(), &stat_info);
196 ret_val = S_ISDIR(stat_info.st_mode);
197 //log_debug("stat for: %s: %d\n", fname.c_str(), ret_val);
203 bool W1Util::is_datafile(const char *path, dirent *direntry) {
205 struct stat stat_info;
211 if (direntry != NULL) {
212 name = direntry->d_name;
213 pos = name.find(DATAFILE_SUFFIX);
215 fname = concat_paths(path, direntry->d_name);
216 stat(fname.c_str(), &stat_info);
217 ret_val = S_ISREG(stat_info.st_mode);
224 * get sub-directories sorted in alphabetical order.
226 vector<string> W1Util::get_subdirectories(const string& path) {
230 vector<string> ret_val;
232 log_debug("scanning path: %s\n", path.c_str());
234 if (path.empty() == false) {
235 dir = opendir(path.c_str());
239 direntry = readdir(dir);
240 if (direntry != NULL) {
241 bool_flg = is_subdirectory(path.c_str(), direntry);
242 if (bool_flg == true) {
243 ret_val.push_back(string(direntry->d_name));
244 //log_debug("added dir: %s\n", direntry->d_name);
252 sort(ret_val.begin(), ret_val.end());
259 * get sub-directories sorted in alphabetical order.
261 vector<string> W1Util::get_data_files(const string& path) {
264 vector<string> ret_val;
267 if (path.empty() == false) {
268 dir = opendir(path.c_str());
272 direntry = readdir(dir);
273 if (direntry != NULL) {
274 if (is_datafile(path.c_str(), direntry) == true) {
275 ret_val.push_back(string(direntry->d_name));
283 sort(ret_val.begin(), ret_val.end());
289 Date W1Util::parse_date_str(string date_str) {
291 stringstream ss(date_str);
294 ss >>ret_val.year >>c >>ret_val.month >>c >>ret_val.day >>ret_val.hour >>c >>ret_val.min >>c >>ret_val.sec;