1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 26b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * Copyright (C) 2010 Google Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions of source code must retain the above copyright 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions in binary form must reproduce the above 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution. 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Neither the name of Google Inc. nor the names of its 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission. 178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "config.h" 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(FILE_SYSTEM) 34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "FileWriterSync.h" 36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "AsyncFileWriter.h" 384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "Blob.h" 394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "FileException.h" 404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blocknamespace WebCore { 42ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::write(Blob* data, ExceptionCode& ec) 446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(writer()); 464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_complete); 474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = 0; 484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!data) { 494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = FileException::TYPE_MISMATCH_ERR; 504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang prepareForWrite(); 544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang writer()->write(position(), data); 554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang writer()->waitForOperationToComplete(); 564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_complete); 574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = FileException::ErrorCodeToExceptionCode(m_error); 584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (ec) 594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang setPosition(position() + data->size()); 614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (position() > length()) 624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang setLength(position()); 636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 64ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::seek(long long position, ExceptionCode& ec) 666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(writer()); 684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_complete); 694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = 0; 704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang seekInternal(position); 716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 72ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::truncate(long long offset, ExceptionCode& ec) 746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(writer()); 764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_complete); 774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = 0; 784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (offset < 0) { 794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = FileException::INVALID_STATE_ERR; 804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang prepareForWrite(); 834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang writer()->truncate(offset); 844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang writer()->waitForOperationToComplete(); 854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_complete); 864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = FileException::ErrorCodeToExceptionCode(m_error); 874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (ec) 884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (offset < position()) 904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang setPosition(offset); 914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang setLength(offset); 926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 93ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::didWrite(long long bytes, bool complete) 956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_error == FileError::OK); 974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(!m_complete); 984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifndef NDEBUG 994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_complete = complete; 1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#else 1014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT_UNUSED(complete, complete); 1024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 1036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 104967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 1054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::didTruncate() 1066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_error == FileError::OK); 1084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(!m_complete); 1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifndef NDEBUG 1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_complete = true; 1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 1126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 113ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::didFail(FileError::ErrorCode error) 1156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_error == FileError::OK); 1174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_error = error; 1184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(!m_complete); 1194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifndef NDEBUG 1204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_complete = true; 1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 1226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 123ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangFileWriterSync::FileWriterSync() 1254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang : m_error(FileError::OK) 1264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifndef NDEBUG 1274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang , m_complete(true) 1284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 1296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 130ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterSync::prepareForWrite() 1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_complete); 1354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_error = FileError::OK; 1364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifndef NDEBUG 1374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_complete = false; 1384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 1394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerFileWriterSync::~FileWriterSync() 1426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} // namespace WebCore 1476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif // ENABLE(FILE_SYSTEM) 149