diff --git a/src/libgourou.cpp b/src/libgourou.cpp
index 6607afd..e34b676 100644
--- a/src/libgourou.cpp
+++ b/src/libgourou.cpp
@@ -525,7 +525,7 @@ namespace gourou
time_t expirationTime = parseDateTime(expiration.c_str(), "%Y-%m-%dT%H:%M:%S");
if (time(NULL) > expirationTime)
- GOUROU_LOG(WARN, "WARNING: ACSM file expired (" << expiration << "). It may not work");
+ GOUROU_LOG(WARN, "WARNING: ACSM file expired (" << expiration << "), It may not work.");
}
// Build req file
diff --git a/utils/acsmdownloader.cpp b/utils/acsmdownloader.cpp
index 554a1a9..cc9a5d9 100644
--- a/utils/acsmdownloader.cpp
+++ b/utils/acsmdownloader.cpp
@@ -64,19 +64,18 @@ public:
if (exportPrivateKey)
{
std::string filename;
- if (!outputFile)
- filename = std::string("Adobe_PrivateLicenseKey--") + user->getUsername() + ".der";
- else
+ if (outputFile)
filename = outputFile;
-
- if (outputDir)
+ else
{
- if (!fileExists(outputDir))
- mkpath(outputDir);
-
- filename = std::string(outputDir) + "/" + filename;
+ filename = std::string("Adobe_PrivateLicenseKey--") + user->getUsername() + ".der";
+
+ if (outputDir)
+ filename = std::string(outputDir) + "/" + filename;
}
+ createPath(filename.c_str());
+
processor.exportPrivateLicenseKey(filename);
std::cout << "Private license key exported to " << filename << std::endl;
@@ -86,7 +85,9 @@ public:
gourou::FulfillmentItem* item = processor.fulfill(acsmFile, notify);
std::string filename;
- if (!outputFile)
+ if (outputFile)
+ filename = outputFile;
+ else
{
filename = item->getMetadata("title");
if (filename == "")
@@ -96,18 +97,13 @@ public:
// Remove invalid characters
std::replace(filename.begin(), filename.end(), '/', '_');
}
- }
- else
- filename = outputFile;
-
- if (outputDir)
- {
- if (!fileExists(outputDir))
- mkpath(outputDir);
- filename = std::string(outputDir) + "/" + filename;
+ if (outputDir)
+ filename = std::string(outputDir) + "/" + filename;
}
+ createPath(filename.c_str());
+
gourou::DRMProcessor::ITEM_TYPE type = processor.download(item, filename, resume);
if (!outputFile)
@@ -186,8 +182,8 @@ static void usage(const char* cmd)
std::cout << basename((char*)cmd) << " download EPUB file from ACSM request file" << std::endl << std::endl;
std::cout << "Usage: " << basename((char*)cmd) << " [OPTIONS] file.acsm" << std::endl << std::endl;
std::cout << "Global Options:" << std::endl;
- std::cout << " " << "-O|--output-dir" << "\t" << "Optional output directory were to put result (default ./)" << std::endl;
- std::cout << " " << "-o|--output-file" << "\t" << "Optional output filename (default
)" << std::endl;
+ std::cout << " " << "-O|--output-dir" << "\t" << "Optional output directory were to put result (default ./) (not compatible with -o)" << std::endl;
+ std::cout << " " << "-o|--output-file" << "\t" << "Optional output filename (default ) (not compatible with -O)" << std::endl;
std::cout << " " << "-f|--acsm-file" << "\t" << "Backward compatibility: ACSM request file for epub download" << std::endl;
std::cout << " " << "-e|--export-private-key"<< "\t" << "Export private key in DER format" << std::endl;
std::cout << " " << "-r|--resume" << "\t\t" << "Try to resume download (in case of previous failure)" << std::endl;
@@ -309,6 +305,12 @@ int main(int argc, char** argv)
return -1;
}
+ if (outputDir && outputFile)
+ {
+ std::cout << "Error : you cannot use both -o and -O" << std::endl;
+ return -1;
+ }
+
ACSMDownloader downloader;
int i;
@@ -339,7 +341,7 @@ int main(int argc, char** argv)
}
else
{
- if (!fileExists(acsmFile))
+ if (!pathExists(acsmFile))
{
std::cout << "Error : " << acsmFile << " doesn't exists" << std::endl;
ret = -1;
diff --git a/utils/adept_activate.cpp b/utils/adept_activate.cpp
index b224de5..b12b617 100644
--- a/utils/adept_activate.cpp
+++ b/utils/adept_activate.cpp
@@ -240,7 +240,7 @@ int main(int argc, char** argv)
if (_outputDir[0] == '.' || _outputDir[0] != '/')
{
// realpath doesn't works if file/dir doesn't exists
- if (fileExists(_outputDir))
+ if (pathExists(_outputDir))
outputDir = strdup(realpath(_outputDir, 0));
else
outputDir = strdup(abspath(_outputDir));
@@ -250,7 +250,7 @@ int main(int argc, char** argv)
}
std::string pass;
- if (fileExists(outputDir))
+ if (pathExists(outputDir))
{
int key;
diff --git a/utils/adept_loan_mgt.cpp b/utils/adept_loan_mgt.cpp
index fd060ab..ab46d98 100644
--- a/utils/adept_loan_mgt.cpp
+++ b/utils/adept_loan_mgt.cpp
@@ -109,7 +109,7 @@ private:
std::string loanDir = std::string(adeptDir) + std::string("/") + LOANS_DIR;
- if (!fileExists(loanDir.c_str()))
+ if (!pathExists(loanDir.c_str()))
return;
dp = opendir (loanDir.c_str());
diff --git a/utils/adept_remove.cpp b/utils/adept_remove.cpp
index c678f3d..47112ab 100644
--- a/utils/adept_remove.cpp
+++ b/utils/adept_remove.cpp
@@ -81,19 +81,16 @@ public:
gourou::DRMProcessor processor(&client, deviceFile, activationFile, devicekeyFile);
std::string filename;
- if (!outputFile)
- filename = std::string(inputFile);
- else
+ if (outputFile)
filename = outputFile;
-
- if (outputDir)
+ else
{
- if (!fileExists(outputDir))
- mkpath(outputDir);
+ filename = std::string(inputFile);
- filename = std::string(outputDir) + "/" + filename;
+ if (outputDir)
+ filename = std::string(outputDir) + "/" + filename;
}
-
+
if (endsWith(filename, ".epub"))
type = gourou::DRMProcessor::ITEM_TYPE::EPUB;
else if (endsWith(filename, ".pdf"))
@@ -102,7 +99,9 @@ public:
{
EXCEPTION(gourou::DRM_FORMAT_NOT_SUPPORTED, "Unsupported file format of " << filename);
}
-
+
+ createPath(filename.c_str());
+
if (inputFile != filename)
{
unlink(filename.c_str());
@@ -147,8 +146,8 @@ static void usage(const char* cmd)
std::cout << "Usage: " << basename((char*)cmd) << " [OPTIONS] file(.epub|pdf)" << std::endl << std::endl;
std::cout << "Global Options:" << std::endl;
- std::cout << " " << "-O|--output-dir" << "\t" << "Optional output directory were to put result (default ./)" << std::endl;
- std::cout << " " << "-o|--output-file" << "\t" << "Optional output filename (default inplace DRM removal>)" << std::endl;
+ std::cout << " " << "-O|--output-dir" << "\t" << "Optional output directory were to put result (default ./) (not compatible with -o)" << std::endl;
+ std::cout << " " << "-o|--output-file" << "\t" << "Optional output filename (default inplace DRM removal>) (not compatible with -O)" << std::endl;
std::cout << " " << "-f|--input-file" << "\t" << "Backward compatibility: EPUB/PDF file to process" << std::endl;
std::cout << " " << "-v|--verbose" << "\t\t" << "Increase verbosity, can be set multiple times" << std::endl;
std::cout << " " << "-V|--version" << "\t\t" << "Display libgourou version" << std::endl;
@@ -259,6 +258,12 @@ int main(int argc, char** argv)
return -1;
}
+ if (outputDir && outputFile)
+ {
+ std::cout << "Error : you cannot use both -o and -O" << std::endl;
+ return -1;
+ }
+
ADEPTRemove remover;
int i;
diff --git a/utils/launcher.cpp b/utils/launcher.cpp
index 6eb2bcf..6b29f78 100644
--- a/utils/launcher.cpp
+++ b/utils/launcher.cpp
@@ -23,7 +23,7 @@ int main(int argc, char** argv)
fullPath = std::string(mountPoint) + util;
- if (std::string(util) == "launcher" || !fileExists(fullPath.c_str()))
+ if (std::string(util) == "launcher" || !pathExists(fullPath.c_str()))
fullPath = std::string(mountPoint) + DEFAULT_UTIL;
free(argv0);
diff --git a/utils/utils_common.cpp b/utils/utils_common.cpp
index 383af5f..61fce6d 100644
--- a/utils/utils_common.cpp
+++ b/utils/utils_common.cpp
@@ -33,6 +33,7 @@
#include
#include
#include
+#include
#include
@@ -51,10 +52,10 @@ void version(void)
std::cout << "Current libgourou version : " << gourou::DRMProcessor::VERSION << std::endl ;
}
-bool fileExists(const char* filename)
+bool pathExists(const char* path)
{
struct stat _stat;
- int ret = stat(filename, &_stat);
+ int ret = stat(path, &_stat);
return (ret == 0);
}
@@ -67,15 +68,15 @@ const char* findFile(const char* filename, bool inDefaultDirs)
if (adeptDir && adeptDir[0])
{
path = adeptDir + std::string("/") + filename;
- if (fileExists(path.c_str()))
+ if (pathExists(path.c_str()))
return strdup(path.c_str());
}
path = gourou::DRMProcessor::getDefaultAdeptDir() + filename;
- if (fileExists(path.c_str()))
+ if (pathExists(path.c_str()))
return strdup(path.c_str());
- if (fileExists(filename))
+ if (pathExists(filename))
return strdup(filename);
if (!inDefaultDirs) return 0;
@@ -83,7 +84,7 @@ const char* findFile(const char* filename, bool inDefaultDirs)
for (int i=0; i<(int)ARRAY_SIZE(defaultDirs); i++)
{
path = std::string(defaultDirs[i]) + filename;
- if (fileExists(path.c_str()))
+ if (pathExists(path.c_str()))
return strdup(path.c_str());
}
@@ -152,3 +153,12 @@ void fileCopy(const char* in, const char* out)
close (fdIn);
close (fdOut);
}
+
+void createPath(const char* filename)
+{
+ char* basepath = strdup(filename);
+ char* outputDir = dirname(basepath);
+ if (outputDir && !pathExists(outputDir))
+ mkpath(outputDir);
+ free(basepath);
+}
diff --git a/utils/utils_common.h b/utils/utils_common.h
index 9289209..519b8aa 100644
--- a/utils/utils_common.h
+++ b/utils/utils_common.h
@@ -50,9 +50,9 @@ void version(void);
const char* findFile(const char* filename, bool inDefaultDirs=true);
/**
- * @brief Does the file (or directory exists)
+ * @brief Does the file (or directory) exists
*/
-bool fileExists(const char* filename);
+bool pathExists(const char* path);
/**
* @brief Recursively created dir
@@ -64,4 +64,9 @@ void mkpath(const char *dir);
*/
void fileCopy(const char* in, const char* out);
+/**
+ * @brief Create intermediate directories if it does not exists
+ */
+void createPath(const char* filename);
+
#endif