diff -r fa7a3cc6effd -r 6d08f4a05d93 imgtools/romtools/rofsbuild/src/cache/cachevalidator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/romtools/rofsbuild/src/cache/cachevalidator.cpp Fri Jun 25 18:11:34 2010 +0800 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cache/cacheexception.hpp" +#include "cache/cacheentry.hpp" +#include "cache/cache.hpp" +#include "cache/cachevalidator.hpp" + +using namespace std ; +CacheValidator* CacheValidator::Only = (CacheValidator*)0; + + +CacheValidator* CacheValidator::GetInstance(void) throw (CacheException) +{ + if(! CacheValidator::Only) + { + CacheValidator::Only = new (nothrow) CacheValidator(); + if(! CacheValidator::Only) + throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE); + } + + return CacheValidator::Only; +} + + +CacheEntry* CacheValidator::Validate(const char* OriginalFilename, int CurrentCompressionID) +{ + if(! OriginalFilename) + return (CacheEntry*)0; + + //an executable will be validated if its creation time does not altered and the compression method is not different against previous image build used. + CacheEntry* entryref = Cache::GetInstance()->GetEntryList(OriginalFilename); + if(! entryref) + { + return (CacheEntry*)0; + } + while(entryref) + { + boost::filesystem::path originalfile(OriginalFilename); + time_t originalcreationtime = last_write_time(originalfile); + string creationtime(ctime(&originalcreationtime)); + size_t newlinepos = creationtime.find("\n"); + while(newlinepos != string::npos) + { + creationtime.erase(newlinepos, 1); + newlinepos = creationtime.find(("\n")); + } + if((creationtime.compare(entryref->GetOriginalFileCreateTime())== 0) || (atoi(entryref->GetCachedFileCompressionID())==CurrentCompressionID)) + { + boost::filesystem::path cachedfile(entryref->GetCachedFilename()); + string filename = cachedfile.file_string(); + ifstream filecontentreader(filename.c_str(), ios_base::in | ios_base::binary); + if(! filecontentreader.is_open()){ + cerr << "Cannot open cached file " << filename << endl ; + return NULL; + } + filecontentreader.seekg(0, ios_base::end); + int contentlength = filecontentreader.tellg(); + char* bufferref = new char[contentlength + 1]; + filecontentreader.seekg(0, ios_base::beg); + filecontentreader.read(bufferref, contentlength); + bufferref[contentlength] = 0 ; + entryref->SetCachedFileBuffer(bufferref, contentlength); + delete []bufferref; + + cout << "Using cached" << OriginalFilename << endl ; + + return entryref; + } + + entryref = entryref->GetNextEntry(); + } + + return (CacheEntry*)0; +} + + +CacheValidator::CacheValidator(void) +{ + return; +}