/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * */ #include #include #include #include #include #include #include #include #include #include namespace oox { namespace core { using namespace css::io; using namespace css::uno; DocumentEncryption::DocumentEncryption(const css::uno::Reference< css::uno::XComponentContext >& rxContext, Reference const & xDocumentStream, oox::ole::OleStorage& rOleStorage, Sequence& rMediaEncData) : mxContext(rxContext) , mxDocumentStream(xDocumentStream) , mrOleStorage(rOleStorage) , mMediaEncData(rMediaEncData) { // Select engine for (int i = 0; i < rMediaEncData.getLength(); i++) { if (rMediaEncData[i].Name == "CryptoType") { OUString sCryptoType; rMediaEncData[i].Value >>= sCryptoType; if (sCryptoType == "IRM") { mEngine.reset(new IRMEngine(mxContext)); } else if (sCryptoType == "Standard" || sCryptoType == "Agile") { mEngine.reset(new Standard2007Engine(mxContext)); } else { SAL_WARN("oox", "Requested encryption method \"" << sCryptoType << "\" is not supported"); } } } } bool DocumentEncryption::encrypt() { if (!mEngine) return false; Reference xInputStream (mxDocumentStream->getInputStream(), UNO_SET_THROW); Reference xSeekable(xInputStream, UNO_QUERY); if (!xSeekable.is()) return false; sal_uInt32 aLength = xSeekable->getLength(); // check length of the stream xSeekable->seek(0); // seek to begin of the document stream if (!mrOleStorage.isStorage()) return false; mEngine->setupEncryption(mMediaEncData); Reference xOutputStream(mrOleStorage.openOutputStream("EncryptedPackage"), UNO_SET_THROW); mEngine->encrypt(xInputStream, xOutputStream, aLength); xOutputStream->flush(); xOutputStream->closeOutput(); mEngine->writeEncryptionInfo(mrOleStorage); return true; } } // namespace core } // namespace oox /* vim:set shiftwidth=4 softtabstop=4 expandtab: */