Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
onlyoffice_core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boris Kocherov
onlyoffice_core
Commits
717d91a1
Commit
717d91a1
authored
Dec 16, 2016
by
ElenaSubbotina
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
3dd4dda2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
303 additions
and
0 deletions
+303
-0
ASCOfficeDocFile/DocDocxConverter/OleObject.cpp
ASCOfficeDocFile/DocDocxConverter/OleObject.cpp
+303
-0
No files found.
ASCOfficeDocFile/DocDocxConverter/OleObject.cpp
0 → 100644
View file @
717d91a1
/*
* (c) Copyright Ascensio System SIA 2010-2016
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include "OleObject.h"
namespace
DocFileFormat
{
OleObject
::
OleObject
(
const
CharacterPropertyExceptions
*
chpx
,
StructuredStorageReader
*
docStorage
,
bool
bOlderVersion_
)
:
bLinked
(
false
),
updateMode
(
NoLink
),
bOlderVersion
(
bOlderVersion_
),
isEquation
(
false
),
isEmbedded
(
false
)
{
if
(
!
docStorage
)
return
;
if
(
!
chpx
)
return
;
oleStorage
=
docStorage
->
GetStorage
();
if
(
!
oleStorage
)
return
;
HRESULT
res
=
S_OK
;
POLE
::
Stream
*
ObjectPoolStorage
=
new
POLE
::
Stream
(
oleStorage
,
"ObjectPool"
);
if
(
ObjectPoolStorage
)
{
ObjectId
=
getOleEntryName
(
chpx
);
std
::
string
sObjectId
(
ObjectId
.
begin
(),
ObjectId
.
end
()
);
{
std
::
string
name
=
"ObjectPool/"
+
sObjectId
+
"/"
;
processOleStream
(
name
+
"Ole"
);
if
(
bLinked
)
{
processLinkInfoStream
(
name
+
"LinkInfo"
);
}
else
{
processCompObjStream
(
name
+
"CompObj"
);
}
processPICStream
(
name
+
"PIC"
);
processEquationNativeStream
(
name
+
"Equation Native"
);
}
delete
ObjectPoolStorage
;
}
}
void
OleObject
::
processLinkInfoStream
(
const
std
::
string
&
linkStream
)
{
try
{
POLE
::
Stream
*
pLinkStream
=
NULL
;
HRESULT
res
=
S_OK
;
pLinkStream
=
//oleStorage->stream(linkStream);
new
POLE
::
Stream
(
oleStorage
,
linkStream
);
if
(
pLinkStream
)
{
VirtualStreamReader
reader
(
pLinkStream
,
0
,
false
);
//there are two versions of the Link string, one contains ANSI characters, the other contains
//unicode characters.
//Both strings seem not to be standardized:
//The length prefix is a character count EXCLUDING the terminating zero
//Read the ANSI version
short
cch
=
reader
.
ReadInt16
();
unsigned
char
*
str
=
reader
.
ReadBytes
(
cch
,
true
);
FormatUtils
::
GetSTLCollectionFromBytes
<
std
::
wstring
>
(
&
this
->
Link
,
str
,
cch
,
ENCODING_WINDOWS_1250
);
RELEASEARRAYOBJECTS
(
str
);
//skip the terminating zero of the ANSI string
//even if the characters are ANSI chars, the terminating zero has 2 bytes
reader
.
ReadBytes
(
2
,
false
);
//skip the next 4 bytes (flags?)
reader
.
ReadBytes
(
4
,
false
);
//Read the Unicode version
this
->
Link
.
clear
();
cch
=
reader
.
ReadInt16
();
str
=
reader
.
ReadBytes
(
(
cch
*
2
),
true
);
FormatUtils
::
GetSTLCollectionFromBytes
<
std
::
wstring
>
(
&
this
->
Link
,
str
,
(
cch
*
2
),
ENCODING_UTF16
);
RELEASEARRAYOBJECTS
(
str
);
//skip the terminating zero of the Unicode string
reader
.
ReadBytes
(
2
,
false
);
delete
pLinkStream
;
}
}
catch
(...)
{
}
}
void
OleObject
::
processEquationNativeStream
(
const
std
::
string
&
eqStream
)
{
try
{
POLE
::
Stream
*
pCompStream
=
NULL
;
HRESULT
res
=
S_OK
;
pCompStream
=
new
POLE
::
Stream
(
oleStorage
,
eqStream
);
if
(
pCompStream
)
{
VirtualStreamReader
reader
(
pCompStream
,
0
,
false
);
int
sz
=
reader
.
GetSize
();
unsigned
char
*
Buffer
=
reader
.
ReadBytes
(
sz
,
true
);
if
(
Buffer
&&
sz
>
0
)
{
isEquation
=
true
;
delete
[]
Buffer
;
}
delete
pCompStream
;
}
}
catch
(...)
{
}
}
void
OleObject
::
processPICStream
(
const
std
::
string
&
picStream
)
{
try
{
HRESULT
res
=
S_OK
;
POLE
::
Stream
*
pPICStream
=
new
POLE
::
Stream
(
oleStorage
,
picStream
);
if
(
pPICStream
)
{
VirtualStreamReader
reader
(
pPICStream
,
0
,
false
);
int
sz
=
reader
.
GetSize
();
int
cbHeader
=
reader
.
ReadUInt32
();
reader
.
ReadBytes
(
4
,
false
);
int
x
=
reader
.
ReadUInt32
();
int
y
=
reader
.
ReadUInt32
();
pictureDesciptor
.
dyaGoal
=
reader
.
ReadUInt32
();
pictureDesciptor
.
dxaGoal
=
reader
.
ReadUInt32
();
reader
.
ReadBytes
(
20
,
false
);
pictureDesciptor
.
mx
=
reader
.
ReadUInt32
();
pictureDesciptor
.
my
=
reader
.
ReadUInt32
();
}
}
catch
(...)
{
}
}
void
OleObject
::
processCompObjStream
(
const
std
::
string
&
compStream
)
{
try
{
HRESULT
res
=
S_OK
;
POLE
::
Stream
*
pCompStream
=
new
POLE
::
Stream
(
oleStorage
,
compStream
);
if
(
pCompStream
)
{
VirtualStreamReader
reader
(
pCompStream
,
0
,
false
);
//skip the CompObjHeader
reader
.
ReadBytes
(
28
,
false
);
int
sz_obj
=
reader
.
GetSize
()
-
reader
.
GetPosition
();
if
(
sz_obj
>
4
)
{
UserType
=
reader
.
ReadLengthPrefixedAnsiString
(
sz_obj
);
sz_obj
=
reader
.
GetSize
()
-
reader
.
GetPosition
();
if
(
sz_obj
>
4
)
ClipboardFormat
=
reader
.
ReadLengthPrefixedAnsiString
(
sz_obj
);
sz_obj
=
reader
.
GetSize
()
-
reader
.
GetPosition
();
if
(
sz_obj
>
4
)
Program
=
reader
.
ReadLengthPrefixedAnsiString
(
sz_obj
);
}
delete
pCompStream
;
}
}
catch
(...)
{
}
}
void
OleObject
::
processOleStream
(
const
std
::
string
&
oleStreamName
)
{
try
{
POLE
::
Stream
*
pOleStream
;
HRESULT
res
=
S_OK
;
pOleStream
=
new
POLE
::
Stream
(
oleStorage
,
oleStreamName
);
if
(
pOleStream
)
{
VirtualStreamReader
reader
(
pOleStream
,
0
,
false
);
//skip version
reader
.
ReadBytes
(
4
,
false
);
//read the embedded/linked flag
int
flag
=
reader
.
ReadInt32
();
bLinked
=
FormatUtils
::
BitmaskToBool
(
flag
,
0x1
);
//Link update option
this
->
updateMode
=
(
LinkUpdateOption
)
reader
.
ReadInt32
();
switch
(
this
->
updateMode
)
{
case
NoLink
:
{
this
->
UpdateMode
=
L"NoLink"
;
}
break
;
case
Always
:
{
this
->
UpdateMode
=
L"Always"
;
}
break
;
case
OnCall
:
{
this
->
UpdateMode
=
L"OnCall"
;
}
break
;
}
delete
pOleStream
;
}
}
catch
(...)
{
}
}
std
::
wstring
OleObject
::
getOleEntryName
(
const
CharacterPropertyExceptions
*
chpx
)
{
std
::
wstring
ret
;
if
(
chpx
!=
NULL
)
{
for
(
std
::
list
<
SinglePropertyModifier
>::
const_iterator
iter
=
chpx
->
grpprl
->
begin
();
iter
!=
chpx
->
grpprl
->
end
();
iter
++
)
{
if
(
iter
->
OpCode
==
sprmCPicLocation
||
iter
->
OpCode
==
sprmOldCPicLocation
)
{
ret
=
(
L"_"
+
FormatUtils
::
IntToWideString
(
FormatUtils
::
BytesToUInt32
(
iter
->
Arguments
,
0
,
iter
->
argumentsSize
)
)
);
break
;
}
}
}
return
ret
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment