Add support for PDF (needs uPDFParser library)
This commit is contained in:
		@@ -22,6 +22,8 @@
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <uPDFParser.h>
 | 
			
		||||
 | 
			
		||||
#include <libgourou.h>
 | 
			
		||||
#include <libgourou_common.h>
 | 
			
		||||
#include <libgourou_log.h>
 | 
			
		||||
@@ -299,11 +301,11 @@ namespace gourou
 | 
			
		||||
	appendTextElem(root, "adept:expiration", buffer);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    ByteArray DRMProcessor::sendRequest(const std::string& URL, const std::string& POSTdata, const char* contentType)
 | 
			
		||||
    ByteArray DRMProcessor::sendRequest(const std::string& URL, const std::string& POSTdata, const char* contentType, std::map<std::string, std::string>* responseHeaders)
 | 
			
		||||
    {
 | 
			
		||||
	if (contentType == 0)
 | 
			
		||||
	    contentType = "";
 | 
			
		||||
	std::string reply = client->sendHTTPRequest(URL, POSTdata, contentType);
 | 
			
		||||
	std::string reply = client->sendHTTPRequest(URL, POSTdata, contentType, responseHeaders);
 | 
			
		||||
 | 
			
		||||
	pugi::xml_document replyDoc;
 | 
			
		||||
	replyDoc.load_buffer(reply.c_str(), reply.length());
 | 
			
		||||
@@ -580,12 +582,16 @@ namespace gourou
 | 
			
		||||
	return new FulfillmentItem(fulfillReply, user);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void DRMProcessor::download(FulfillmentItem* item, std::string path)
 | 
			
		||||
    DRMProcessor::ITEM_TYPE DRMProcessor::download(FulfillmentItem* item, std::string path)
 | 
			
		||||
    {
 | 
			
		||||
	ITEM_TYPE res = EPUB;
 | 
			
		||||
	
 | 
			
		||||
	if (!item)
 | 
			
		||||
	    EXCEPTION(DW_NO_ITEM, "No item");
 | 
			
		||||
 | 
			
		||||
	std::map<std::string, std::string> headers;
 | 
			
		||||
	
 | 
			
		||||
	ByteArray replyData = sendRequest(item->getDownloadURL());
 | 
			
		||||
	ByteArray replyData = sendRequest(item->getDownloadURL(), "", 0, &headers);
 | 
			
		||||
 | 
			
		||||
	writeFile(path, replyData);
 | 
			
		||||
 | 
			
		||||
@@ -593,9 +599,53 @@ namespace gourou
 | 
			
		||||
 | 
			
		||||
	std::string rightsStr = item->getRights();
 | 
			
		||||
 | 
			
		||||
	void* handler = client->zipOpen(path);
 | 
			
		||||
	client->zipWriteFile(handler, "META-INF/rights.xml", rightsStr);
 | 
			
		||||
	client->zipClose(handler);
 | 
			
		||||
	if (headers.count("Content-Type") && headers["Content-Type"] == "application/pdf")
 | 
			
		||||
	    res = PDF;
 | 
			
		||||
 | 
			
		||||
	if (res == EPUB)
 | 
			
		||||
	{
 | 
			
		||||
	    void* handler = client->zipOpen(path);
 | 
			
		||||
	    client->zipWriteFile(handler, "META-INF/rights.xml", rightsStr);
 | 
			
		||||
	    client->zipClose(handler);
 | 
			
		||||
	}
 | 
			
		||||
	else if (res == PDF)
 | 
			
		||||
	{
 | 
			
		||||
	    uPDFParser::Parser parser;
 | 
			
		||||
 | 
			
		||||
	    try
 | 
			
		||||
	    {
 | 
			
		||||
		GOUROU_LOG(DEBUG, "Parse PDF");
 | 
			
		||||
		parser.parse(path);
 | 
			
		||||
	    }
 | 
			
		||||
	    catch(std::invalid_argument& e)
 | 
			
		||||
	    {
 | 
			
		||||
		GOUROU_LOG(ERROR, "Invalid PDF");
 | 
			
		||||
		return res;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    std::vector<uPDFParser::Object*> objects = parser.objects();
 | 
			
		||||
	    std::vector<uPDFParser::Object*>::reverse_iterator it;
 | 
			
		||||
 | 
			
		||||
	    for(it = objects.rbegin(); it != objects.rend(); it++)
 | 
			
		||||
	    {
 | 
			
		||||
		// Update EBX_HANDLER with rights
 | 
			
		||||
		if ((*it)->hasKey("Filter") && (**it)["Filter"]->str() == "/EBX_HANDLER")
 | 
			
		||||
		{
 | 
			
		||||
		    uPDFParser::Object* ebx = (*it)->clone();
 | 
			
		||||
		    (*ebx)["ADEPT_ID"] = new uPDFParser::String(item->getResource());
 | 
			
		||||
		    (*ebx)["EBX_BOOKID"] = new uPDFParser::String(item->getResource());
 | 
			
		||||
		    ByteArray zipped;
 | 
			
		||||
		    client->deflate(rightsStr, zipped);
 | 
			
		||||
		    (*ebx)["ADEPT_LICENSE"] = new uPDFParser::String(zipped.toBase64());
 | 
			
		||||
		    parser.addObject(ebx);
 | 
			
		||||
		    break;
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    parser.write(path, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void DRMProcessor::buildSignInRequest(pugi::xml_document& signInRequest,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user