You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
6.2 KiB
149 lines
6.2 KiB
#if !defined Object_h
|
|
#define Object_h
|
|
|
|
#include "Utils.h"
|
|
|
|
#include <cmath>
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <map>
|
|
#include <set>
|
|
#include <vector>
|
|
#include <utility>
|
|
|
|
namespace merge_lib
|
|
{
|
|
//This class represents pdf objects, and defines methods for performing
|
|
//all necessary operations on pdf objects
|
|
//Each object consists of two parts: content and object's number
|
|
//<object number> <number> obj
|
|
//<content>
|
|
//endobj
|
|
//Object can contain several links to other object. These objects has been named "children".
|
|
//Each reference (child object) should be kept with it position(s) in object's content.
|
|
//After each content modification, all references should be changed too.
|
|
//This convention lighten the recalculation object numbers work.
|
|
class Object
|
|
{
|
|
public:
|
|
friend class PageElementHandler;
|
|
typedef std::vector<unsigned int> ReferencePositionsInContent;
|
|
typedef std::pair<Object *, ReferencePositionsInContent > ChildAndItPositionInContent;
|
|
typedef std::map <unsigned int, ChildAndItPositionInContent> Children;
|
|
Object(unsigned int objectNumber, unsigned int generationNumber, const std::string & objectContent,
|
|
std::string fileName = "", std::pair<unsigned int, unsigned int> streamBounds = std::make_pair ((unsigned int)0,(unsigned int)0), bool hasStream = false
|
|
):
|
|
_number(objectNumber), _generationNumber(generationNumber), _oldNumber(objectNumber), _content(objectContent),_parents(),_children(),_isPassed(false),
|
|
_fileName(fileName), _streamBounds(streamBounds), _hasStream(hasStream), _hasStreamInContent(false)
|
|
{
|
|
}
|
|
virtual ~Object();
|
|
Object * getClone(std::vector<Object *> & clones);
|
|
void addChild(Object * child, const std::vector<unsigned int> childPositionsInContent);
|
|
void addChild(const Children & children);
|
|
ReferencePositionsInContent removeChild(Object * child);
|
|
void forgetAboutChildren(unsigned int leftBound, unsigned int rightBound);
|
|
Object * getChild(unsigned int objectNumber);
|
|
bool findObject(const std::string & token, Object* & foundObject, unsigned int & tokenPositionInContent);
|
|
std::vector<Object *> getChildrenByBounds(unsigned int leftBound, unsigned int rightBound);
|
|
std::vector<Object *> getSortedByPositionChildren(unsigned int leftBound, unsigned int rightBound);
|
|
void removeChildrenByBounds(unsigned int leftBound, unsigned int rightBound);
|
|
const Children & getChildren();
|
|
|
|
void removeHimself();
|
|
|
|
unsigned int getObjectNumber() const;
|
|
unsigned int getgenerationNumber() const;
|
|
|
|
|
|
std::string & getObjectContent();
|
|
|
|
void setObjectContent(const std::string & objectContent);
|
|
void appendContent(const std::string & addToContent);
|
|
void eraseContent(unsigned int from, unsigned int size);
|
|
void insertToContent(unsigned int position, const char * insertedStr, unsigned int length);
|
|
void insertToContent(unsigned int position, const std::string & insertedStr);
|
|
|
|
//vector <object number, its size>
|
|
void serialize(std::ofstream & out, std::map< unsigned int, std::pair<unsigned long long, unsigned int > > & sizesAndGenerationNumbers);
|
|
|
|
void recalculateObjectNumbers(unsigned int & newNumber);
|
|
|
|
bool isPassed()
|
|
{
|
|
return _isPassed;
|
|
}
|
|
void retrieveMaxObjectNumber(unsigned int & maxNumber);
|
|
void resetIsPassed()
|
|
{
|
|
if(_isPassed)
|
|
_isPassed = false;
|
|
Children::iterator it;
|
|
for ( it=_children.begin() ; it != _children.end(); it++ )
|
|
{
|
|
if((*it).second.first->isPassed())
|
|
(*it).second.first->resetIsPassed();
|
|
}
|
|
|
|
}
|
|
unsigned int getOldNumber()
|
|
{
|
|
return _oldNumber;
|
|
}
|
|
void setObjectNumber(unsigned int objNumber)
|
|
{
|
|
_number = objNumber;
|
|
_oldNumber = objNumber;
|
|
|
|
}
|
|
bool getStream(std::string &);
|
|
bool hasStream();
|
|
bool getHeader(std::string &content);
|
|
void forgetStreamInFile()
|
|
{
|
|
_hasStreamInContent = true;
|
|
_hasStream = true;
|
|
}
|
|
|
|
std::string getNameSimpleValue(const std::string &content, const std::string &patten, size_t pos = 0);
|
|
|
|
unsigned int getChildPosition(const Object * child); //throw (Exception)
|
|
const std::set<Object *> & getParents()
|
|
{
|
|
return _parents;
|
|
}
|
|
|
|
Object* findPatternInObjOrParents(const std::string &pattern);
|
|
|
|
private:
|
|
//methods
|
|
Object(const Object & copy);
|
|
Object * _getClone(std::map<unsigned int, Object *> & clones);
|
|
void _addChild(Object * child, const ReferencePositionsInContent & childPositionsInContent);
|
|
void _setObjectNumber(unsigned int objectNumber);
|
|
void _addParent(Object * child);
|
|
bool _findObject(const std::string & token, Object* & foundObject, unsigned int & tokenPositionInContent);
|
|
void _serialize(std::ofstream & out, const std::string & stream);
|
|
void _recalculateObjectNumbers(unsigned int & maxNumber);
|
|
void _recalculateReferencePositions(unsigned int changedReference, int displacement);
|
|
void _retrieveMaxObjectNumber(unsigned int & maxNumber);
|
|
void _serialize(std::ofstream & out, std::map<unsigned int, unsigned long long> & sizes);
|
|
bool _getStreamFromContent(std::string & stream);
|
|
|
|
//members
|
|
unsigned int _number;
|
|
unsigned int _generationNumber;
|
|
unsigned int _oldNumber;
|
|
std::string _content;
|
|
std::set <Object *> _parents;
|
|
Children _children;
|
|
bool _isPassed;
|
|
std::pair<unsigned int, unsigned int> _streamBounds;
|
|
std::string _fileName;
|
|
bool _hasStream;
|
|
bool _hasStreamInContent;
|
|
|
|
};
|
|
}
|
|
#endif
|
|
|
|
|