13 #include <config_folders.h>
14 #include <config_eot.h>
16 #include <osl/file.hxx>
17 #include <rtl/bootstrap.hxx>
21 #include <com/sun/star/io/XInputStream.hpp>
34 #include <libeot/libeot.h>
44 osl::Directory dir( path );
45 if( dir.reset() == osl::Directory::E_None )
49 osl::DirectoryItem item;
50 if( dir.getNextItem( item ) != osl::Directory::E_None )
52 osl::FileStatus
status( osl_FileStatus_Mask_FileURL );
53 if( item.getFileStatus( status ) == osl::File::E_None )
54 osl::File::remove( status.getFileURL());
61 OUString path =
"${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER
"/" SAL_CONFIGFILE(
"bootstrap")
"::UserInstallation}";
62 rtl::Bootstrap::expandMacros( path );
63 path +=
"/user/temp/embeddedfonts/";
69 const char* extra, std::vector< unsigned char >
const & key,
bool eot )
72 osl::File file( fileUrl );
73 switch( file.open( osl_File_OpenFlag_Create | osl_File_OpenFlag_Write ))
75 case osl::File::E_None:
77 case osl::File::E_EXIST:
80 SAL_WARN(
"vcl.fonts",
"Cannot open file for temporary font" );
84 std::vector< char > fontData;
85 fontData.reserve( 1000000 );
88 uno::Sequence< sal_Int8 > buffer;
89 sal_uInt64 read = stream->readBytes( buffer, 1024 );
90 auto bufferRange = asNonConstRange(buffer);
91 for( sal_uInt64
pos = 0;
92 pos < read && keyPos < key.size();
94 bufferRange[
pos ] ^= key[ keyPos++ ];
96 if( !eot && read > 0 )
98 sal_uInt64 writtenTotal = 0;
99 while( writtenTotal < read )
102 file.write( buffer.getConstArray(), read, written );
103 writtenTotal += written;
106 fontData.insert( fontData.end(), buffer.getConstArray(), buffer.getConstArray() + read );
110 bool sufficientFontRights(
false);
114 unsigned uncompressedFontSize = 0;
115 unsigned char *nakedPointerToUncompressedFont =
nullptr;
116 libeot::EOTMetadata eotMetadata;
117 libeot::EOTError uncompressError =
118 libeot::EOT2ttf_buffer( reinterpret_cast<unsigned char *>(fontData.data()), fontData.size(), &eotMetadata, &nakedPointerToUncompressedFont, &uncompressedFontSize );
119 std::shared_ptr<unsigned char> uncompressedFont( nakedPointerToUncompressedFont, libeot::EOTfreeBuffer );
120 if( uncompressError != libeot::EOT_SUCCESS )
122 SAL_WARN(
"vcl.fonts",
"Failed to uncompress font" );
123 osl::File::remove( fileUrl );
126 sal_uInt64 writtenTotal = 0;
127 while( writtenTotal < uncompressedFontSize )
130 if( file.write( uncompressedFont.get() + writtenTotal, uncompressedFontSize - writtenTotal, written ) != osl::File::E_None )
132 SAL_WARN(
"vcl.fonts",
"Error writing temporary font file" );
133 osl::File::remove( fileUrl );
136 writtenTotal += written;
138 sufficientFontRights = libeot::EOTcanLegallyEdit( &eotMetadata );
139 libeot::EOTfreeMetadata( &eotMetadata );
143 if( file.close() != osl::File::E_None )
145 SAL_WARN(
"vcl.fonts",
"Writing temporary font file failed" );
146 osl::File::remove( fileUrl );
151 sufficientFontRights = sufficientTTFRights(fontData.data(), fontData.size(), FontRights::EditingAllowed);
153 if( !sufficientFontRights )
158 SAL_INFO(
"vcl.fonts",
"Ignoring embedded font that is not usable for editing" );
159 osl::File::remove( fileUrl );
162 m_aAccumulatedFonts.emplace_back(std::make_pair(fontName, fileUrl));
168 struct UpdateFontsGuard
184 if (m_aAccumulatedFonts.empty())
186 UpdateFontsGuard aUpdateFontsGuard;
187 for (
const auto& rEntry : m_aAccumulatedFonts)
189 m_aAccumulatedFonts.clear();
194 OUString path =
"${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER
"/" SAL_CONFIGFILE(
"bootstrap")
"::UserInstallation}";
195 rtl::Bootstrap::expandMacros( path );
196 path +=
"/user/temp/embeddedfonts/fromdocs/";
197 osl::Directory::createPath( path );
198 OUString filename = fontName;
199 static int uniqueCounter = 0;
200 if( strcmp( extra,
"?" ) == 0 )
201 filename += OUString::number( uniqueCounter++ );
203 filename += OStringToOUString( extra, RTL_TEXTENCODING_ASCII_US );
205 return path + filename;
231 case FontRights::ViewingAllowed:
233 return ( copyright & 0x02 ) != 0x02;
234 case FontRights::EditingAllowed:
236 return copyright == 0 || ( copyright & 0x08 );
245 OUString path =
"${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER
"/" SAL_CONFIGFILE(
"bootstrap")
"::UserInstallation}";
246 rtl::Bootstrap::expandMacros( path );
247 path +=
"/user/temp/embeddedfonts/fromsystem/";
248 osl::Directory::createPath( path );
249 OUString filename = OUString::Concat(familyName) +
"_" + OUString::number( family ) +
"_" + OUString::number( italic )
250 +
"_" + OUString::number( weight ) +
"_" + OUString::number( pitch )
252 OUString url = path + filename;
253 if( osl::File( url ).open( osl_File_OpenFlag_Read ) == osl::File::E_None )
265 i < fontInfo->Count();
293 if( selected !=
nullptr )
298 if( sufficientTTFRights(
data, size, rights ))
300 osl::File file( url );
301 if( file.open( osl_File_OpenFlag_Write | osl_File_OpenFlag_Create ) == osl::File::E_None )
303 sal_uInt64 written = 0;
304 sal_uInt64 totalSize = size;
306 while( written < totalSize && !error)
308 sal_uInt64 nowWritten;
309 switch( file.write( static_cast< const char* >(
data ) + written, size - written, nowWritten ))
311 case osl::File::E_None:
312 written += nowWritten;
314 case osl::File::E_AGAIN:
315 case osl::File::E_INTR:
324 osl::File::remove( url );
332 return ok ? url :
"";
exports com.sun.star.frame. status
static void clearDir(const OUString &path)
void activateFonts()
Adds the accumulated fonts to the list of known fonts.
void CloseTTFont(TrueTypeFont *ttf)
TrueTypeFont destructor.
bool addEmbeddedFont(const css::uno::Reference< css::io::XInputStream > &stream, const OUString &fontName, const char *extra, std::vector< unsigned char > const &key, bool eot=false)
Reads a font from the input stream, saves it to a temporary font file and adds it to the list of font...
FontRights
Specification of what kind of operation is allowed when embedding a font.
static OutputDevice * GetDefaultDevice()
Get the default "device" (in this case the default window).
virtual void FreeEmbedFontData(const void *pData, tools::Long nDataLen)=0
FontItalic GetItalic() const
void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info)
Returns global font information about the TrueType font.
bool AddTempDevFont(const OUString &rFileURL, const OUString &rFontName)
sal_uInt32 typeFlags
type flags (copyright bits)
FontFamily GetFamilyType() const
#define SAL_CONFIGFILE(name)
static void ImplRefreshAllFontData(bool bNewFontLists)
static void activateFont(const OUString &fontName, const OUString &fileUrl)
Adds the given font to the list of known fonts.
FontWeight GetWeight() const
static void clearTemporaryFontFiles()
Removes all temporary fonts in the path used by fileUrlForTemporaryFont().
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
static OUString fileUrlForTemporaryFont(const OUString &fontName, const char *extra)
Returns a URL for a file where to store contents of a given temporary font.
static OUString fontFileUrl(std::u16string_view familyName, FontFamily family, FontItalic italic, FontWeight weight, FontPitch pitch, FontRights rights)
Returns URL for a font file for the given font, or empty if it does not exist.
exports com.sun.star.chart2. data
abstract base class for physical font faces
#define SAL_INFO(area, stream)
SalGraphics const * GetGraphics() const
Get the graphic context that the output device uses to draw on.
static bool sufficientTTFRights(const void *data, tools::Long size, FontRights rights)
Returns if the restrictions specified in the font (if present) allow embedding the font for a particu...
std::unique_ptr< vcl::font::PhysicalFontFaceCollection > GetFontFaceCollection() const
#define SAL_WARN(area, stream)
virtual void GetDevFontList(vcl::font::PhysicalFontCollection *)=0
void(* f)(TrueTypeTable *)
FontPitch GetPitch() const
static void ImplClearAllFontData(bool bNewFontLists)
const OUString & GetFamilyName() const
virtual const void * GetEmbedFontData(const vcl::font::PhysicalFontFace *pFont, tools::Long *pDataLen)=0
Return value of GetTTGlobalFontInfo()
SFErrCodes OpenTTFontBuffer(const void *pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont **ttf, const FontCharMapRef xCharMap)
TrueTypeFont constructor.