1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_extensions.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include "logpacker.hxx" 28*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XSingleServiceFactory.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XStorage.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XTransactedObject.hpp> 32*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/ElementModes.hpp> 33*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx> 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski using namespace com::sun::star::embed; 37*b1cdbd2cSJim Jagielski using namespace com::sun::star::io; 38*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang; 39*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno; 40*b1cdbd2cSJim Jagielski using ::com::sun::star::ucb::XSimpleFileAccess; 41*b1cdbd2cSJim Jagielski using ::rtl::OUString; 42*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer; 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski namespace 46*b1cdbd2cSJim Jagielski { getZipfileurl(const OUString & csvfileurl)47*b1cdbd2cSJim Jagielski static const OUString getZipfileurl(const OUString& csvfileurl) 48*b1cdbd2cSJim Jagielski { 49*b1cdbd2cSJim Jagielski OUStringBuffer buf(csvfileurl); 50*b1cdbd2cSJim Jagielski buf.setLength(csvfileurl.getLength()-3); 51*b1cdbd2cSJim Jagielski buf.appendAscii("zip"); 52*b1cdbd2cSJim Jagielski return buf.makeStringAndClear(); 53*b1cdbd2cSJim Jagielski }; 54*b1cdbd2cSJim Jagielski countLines(const Sequence<sal_Int8> & data)55*b1cdbd2cSJim Jagielski static sal_Int32 countLines(const Sequence<sal_Int8>& data) 56*b1cdbd2cSJim Jagielski { 57*b1cdbd2cSJim Jagielski sal_Int32 result = 0; 58*b1cdbd2cSJim Jagielski for(sal_Int32 idx = data.getLength()-1; idx>=0; --idx) 59*b1cdbd2cSJim Jagielski if(data[idx]==0x0a) result++; 60*b1cdbd2cSJim Jagielski return result; 61*b1cdbd2cSJim Jagielski }; 62*b1cdbd2cSJim Jagielski } 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski namespace oooimprovement 65*b1cdbd2cSJim Jagielski { LogPacker(const Reference<XMultiServiceFactory> & sf)66*b1cdbd2cSJim Jagielski LogPacker::LogPacker(const Reference<XMultiServiceFactory>& sf) 67*b1cdbd2cSJim Jagielski : m_ServiceFactory(sf) 68*b1cdbd2cSJim Jagielski {} 69*b1cdbd2cSJim Jagielski pack(const OUString & fileurl)70*b1cdbd2cSJim Jagielski sal_Int32 LogPacker::pack(const OUString& fileurl) 71*b1cdbd2cSJim Jagielski { 72*b1cdbd2cSJim Jagielski Reference<XSimpleFileAccess> file_access( 73*b1cdbd2cSJim Jagielski m_ServiceFactory->createInstance(OUString::createFromAscii("com.sun.star.ucb.SimpleFileAccess")), 74*b1cdbd2cSJim Jagielski UNO_QUERY_THROW); 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski Reference<XStorage> storage; 77*b1cdbd2cSJim Jagielski { 78*b1cdbd2cSJim Jagielski Reference<XSingleServiceFactory> storage_factory( 79*b1cdbd2cSJim Jagielski m_ServiceFactory->createInstance(OUString::createFromAscii("com.sun.star.embed.StorageFactory")), 80*b1cdbd2cSJim Jagielski UNO_QUERY_THROW); 81*b1cdbd2cSJim Jagielski Sequence<Any> storage_init_args(2); 82*b1cdbd2cSJim Jagielski storage_init_args[0] = Any(getZipfileurl(fileurl)); 83*b1cdbd2cSJim Jagielski storage_init_args[1] = Any(ElementModes::WRITE); 84*b1cdbd2cSJim Jagielski storage = Reference<XStorage>( 85*b1cdbd2cSJim Jagielski storage_factory->createInstanceWithArguments(storage_init_args), 86*b1cdbd2cSJim Jagielski UNO_QUERY_THROW); 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski Reference<XOutputStream> zipped_stream = storage->openStreamElement( 90*b1cdbd2cSJim Jagielski OUString::createFromAscii("logdata.csv"), 91*b1cdbd2cSJim Jagielski ElementModes::WRITE)->getOutputStream(); 92*b1cdbd2cSJim Jagielski Reference<XInputStream> unzipped_stream = file_access->openFileRead(fileurl); 93*b1cdbd2cSJim Jagielski const sal_Int32 bufsize = 1024; 94*b1cdbd2cSJim Jagielski sal_Int32 read_bytes; 95*b1cdbd2cSJim Jagielski sal_Int32 logged_events = -1; // ignore header row 96*b1cdbd2cSJim Jagielski Sequence<sal_Int8> buf(bufsize); 97*b1cdbd2cSJim Jagielski do 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski read_bytes = unzipped_stream->readBytes(buf, bufsize); 100*b1cdbd2cSJim Jagielski buf.realloc(read_bytes); 101*b1cdbd2cSJim Jagielski logged_events += countLines(buf); 102*b1cdbd2cSJim Jagielski zipped_stream->writeBytes(buf); 103*b1cdbd2cSJim Jagielski } while(read_bytes == bufsize); 104*b1cdbd2cSJim Jagielski unzipped_stream->closeInput(); 105*b1cdbd2cSJim Jagielski zipped_stream->flush(); 106*b1cdbd2cSJim Jagielski zipped_stream->closeOutput(); 107*b1cdbd2cSJim Jagielski Reference<XTransactedObject>(storage, UNO_QUERY_THROW)->commit(); 108*b1cdbd2cSJim Jagielski file_access->kill(fileurl); 109*b1cdbd2cSJim Jagielski return logged_events; 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski } 112