Add type cast definitions for CPDF_Stream.
[pdfium.git] / core / include / fpdfapi / fpdf_objects.h
index 250b6e0..45ca665 100644 (file)
@@ -16,6 +16,7 @@ class CPDF_CryptoHandler;
 class CPDF_Dictionary;
 class CPDF_Document;
 class CPDF_IndirectObjects;
+class CPDF_Name;
 class CPDF_Null;
 class CPDF_Number;
 class CPDF_Parser;
@@ -37,8 +38,6 @@ class IFX_FileRead;
 #define PDFOBJ_NULL 8
 #define PDFOBJ_REFERENCE 9
 
-typedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream* pStream,
-                                                       void* pUserData);
 class CPDF_Object {
  public:
   int GetType() const { return m_Type; }
@@ -80,6 +79,35 @@ class CPDF_Object {
 
   FX_BOOL IsModified() const { return FALSE; }
 
+  bool IsArray() const { return m_Type == PDFOBJ_ARRAY; }
+  bool IsBoolean() const { return m_Type == PDFOBJ_BOOLEAN; }
+  bool IsDictionary() const { return m_Type == PDFOBJ_DICTIONARY; }
+  bool IsName() const { return m_Type == PDFOBJ_NAME; }
+  bool IsNumber() const { return m_Type == PDFOBJ_NUMBER; }
+  bool IsStream() const { return m_Type == PDFOBJ_STREAM; }
+  bool IsString() const { return m_Type == PDFOBJ_STRING; }
+
+  CPDF_Array* AsArray();
+  const CPDF_Array* AsArray() const;
+
+  CPDF_Boolean* AsBoolean();
+  const CPDF_Boolean* AsBoolean() const;
+
+  CPDF_Dictionary* AsDictionary();
+  const CPDF_Dictionary* AsDictionary() const;
+
+  CPDF_Name* AsName();
+  const CPDF_Name* AsName() const;
+
+  CPDF_Number* AsNumber();
+  const CPDF_Number* AsNumber() const;
+
+  CPDF_Stream* AsStream();
+  const CPDF_Stream* AsStream() const;
+
+  CPDF_String* AsString();
+  const CPDF_String* AsString() const;
+
  protected:
   CPDF_Object(FX_DWORD type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
   ~CPDF_Object() {}
@@ -114,6 +142,13 @@ class CPDF_Boolean : public CPDF_Object {
   FX_BOOL m_bValue;
   friend class CPDF_Object;
 };
+inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) {
+  return obj ? obj->AsBoolean() : nullptr;
+}
+inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) {
+  return obj ? obj->AsBoolean() : nullptr;
+}
+
 class CPDF_Number : public CPDF_Object {
  public:
   static CPDF_Number* Create(int value) { return new CPDF_Number(value); }
@@ -124,13 +159,7 @@ class CPDF_Number : public CPDF_Object {
     return new CPDF_Number(str);
   }
 
-  static CPDF_Number* Create(FX_BOOL bInteger, void* pData) {
-    return new CPDF_Number(bInteger, pData);
-  }
-
-  CPDF_Number() : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(false), m_Integer(0) {}
-
-  CPDF_Number(FX_BOOL bInteger, void* pData);
+  CPDF_Number() : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(0) {}
 
   CPDF_Number(int value);
 
@@ -170,6 +199,13 @@ class CPDF_Number : public CPDF_Object {
   };
   friend class CPDF_Object;
 };
+inline CPDF_Number* ToNumber(CPDF_Object* obj) {
+  return obj ? obj->AsNumber() : nullptr;
+}
+inline const CPDF_Number* ToNumber(const CPDF_Object* obj) {
+  return obj ? obj->AsNumber() : nullptr;
+}
+
 class CPDF_String : public CPDF_Object {
  public:
   static CPDF_String* Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE) {
@@ -201,6 +237,13 @@ class CPDF_String : public CPDF_Object {
   FX_BOOL m_bHex;
   friend class CPDF_Object;
 };
+inline CPDF_String* ToString(CPDF_Object* obj) {
+  return obj ? obj->AsString() : nullptr;
+}
+inline const CPDF_String* ToString(const CPDF_Object* obj) {
+  return obj ? obj->AsString() : nullptr;
+}
+
 class CPDF_Name : public CPDF_Object {
  public:
   static CPDF_Name* Create(const CFX_ByteString& str) {
@@ -229,6 +272,13 @@ class CPDF_Name : public CPDF_Object {
   CFX_ByteString m_Name;
   friend class CPDF_Object;
 };
+inline CPDF_Name* ToName(CPDF_Object* obj) {
+  return obj ? obj->AsName() : nullptr;
+}
+inline const CPDF_Name* ToName(const CPDF_Object* obj) {
+  return obj ? obj->AsName() : nullptr;
+}
+
 class CPDF_Array : public CPDF_Object {
  public:
   static CPDF_Array* Create() { return new CPDF_Array(); }
@@ -299,6 +349,13 @@ class CPDF_Array : public CPDF_Object {
   CFX_PtrArray m_Objects;
   friend class CPDF_Object;
 };
+inline CPDF_Array* ToArray(CPDF_Object* obj) {
+  return obj ? obj->AsArray() : nullptr;
+}
+inline const CPDF_Array* ToArray(const CPDF_Object* obj) {
+  return obj ? obj->AsArray() : nullptr;
+}
+
 class CPDF_Dictionary : public CPDF_Object {
  public:
   static CPDF_Dictionary* Create() { return new CPDF_Dictionary(); }
@@ -404,6 +461,13 @@ class CPDF_Dictionary : public CPDF_Object {
 
   friend class CPDF_Object;
 };
+inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) {
+  return obj ? obj->AsDictionary() : nullptr;
+}
+inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) {
+  return obj ? obj->AsDictionary() : nullptr;
+}
+
 class CPDF_Stream : public CPDF_Object {
  public:
   static CPDF_Stream* Create(uint8_t* pData,
@@ -427,8 +491,6 @@ class CPDF_Stream : public CPDF_Object {
 
   FX_BOOL Identical(CPDF_Stream* pOther) const;
 
-  CPDF_StreamFilter* GetStreamFilter(FX_BOOL bRaw = FALSE) const;
-
   FX_DWORD GetRawSize() const { return m_dwSize; }
 
   FX_BOOL ReadRawData(FX_FILESIZE start_pos,
@@ -437,10 +499,6 @@ class CPDF_Stream : public CPDF_Object {
 
   FX_BOOL IsMemoryBased() const { return m_GenNum == (FX_DWORD)-1; }
 
-  CPDF_Stream* Clone(FX_BOOL bDirect,
-                     FPDF_LPFCloneStreamCallback lpfCallback,
-                     void* pUserData) const;
-
  protected:
   ~CPDF_Stream();
 
@@ -465,6 +523,13 @@ class CPDF_Stream : public CPDF_Object {
   friend class CPDF_StreamAcc;
   friend class CPDF_AttachmentAcc;
 };
+inline CPDF_Stream* ToStream(CPDF_Object* obj) {
+  return obj ? obj->AsStream() : nullptr;
+}
+inline const CPDF_Stream* ToStream(const CPDF_Object* obj) {
+  return obj ? obj->AsStream() : nullptr;
+}
+
 class CPDF_StreamAcc {
  public:
   CPDF_StreamAcc();
@@ -507,39 +572,7 @@ class CPDF_StreamAcc {
 
   uint8_t* m_pSrcData;
 };
-CFX_DataFilter* FPDF_CreateFilter(const CFX_ByteStringC& name,
-                                  const CPDF_Dictionary* pParam,
-                                  int width = 0,
-                                  int height = 0);
-#define FPDF_FILTER_BUFFER_SIZE 20480
-class CPDF_StreamFilter {
- public:
-  ~CPDF_StreamFilter();
-
-  FX_DWORD ReadBlock(uint8_t* buffer, FX_DWORD size);
-
-  FX_DWORD GetSrcPos() { return m_SrcOffset; }
-
-  const CPDF_Stream* GetStream() { return m_pStream; }
-
- protected:
-  CPDF_StreamFilter() {}
 
-  FX_DWORD ReadLeftOver(uint8_t* buffer, FX_DWORD buf_size);
-
-  const CPDF_Stream* m_pStream;
-
-  CFX_DataFilter* m_pFilter;
-
-  CFX_BinaryBuf* m_pBuffer;
-
-  FX_DWORD m_BufOffset;
-
-  FX_DWORD m_SrcOffset;
-
-  uint8_t m_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];
-  friend class CPDF_Stream;
-};
 class CPDF_Null : public CPDF_Object {
  public:
   static CPDF_Null* Create() { return new CPDF_Null(); }