utilities/downloadmanager/src/filestorage.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/**
hgs
parents:
diff changeset
     2
   This file is part of CWRT package **
hgs
parents:
diff changeset
     3
hgs
parents:
diff changeset
     4
   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). **
hgs
parents:
diff changeset
     5
hgs
parents:
diff changeset
     6
   This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     7
   it under the terms of the GNU (Lesser) General Public License as 
hgs
parents:
diff changeset
     8
   published by the Free Software Foundation, version 2.1 of the License. 
hgs
parents:
diff changeset
     9
   This program is distributed in the hope that it will be useful, but
hgs
parents:
diff changeset
    10
   WITHOUT ANY WARRANTY; without even the implied warranty of 
hgs
parents:
diff changeset
    11
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
hgs
parents:
diff changeset
    12
   (Lesser) General Public License for more details. You should have 
hgs
parents:
diff changeset
    13
   received a copy of the GNU (Lesser) General Public License along 
hgs
parents:
diff changeset
    14
   with this program. If not, see <http://www.gnu.org/licenses/>.
hgs
parents:
diff changeset
    15
*/
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
#include "filestorage.h"
hgs
parents:
diff changeset
    18
#include "storageutility.h"
hgs
parents:
diff changeset
    19
#include <QFile>
hgs
parents:
diff changeset
    20
#include <QDir>
hgs
parents:
diff changeset
    21
#include <QVariant>
hgs
parents:
diff changeset
    22
#include <qregexp.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
class FileStoragePrivate
hgs
parents:
diff changeset
    25
{
hgs
parents:
diff changeset
    26
    DM_DECLARE_PUBLIC(FileStorage);
hgs
parents:
diff changeset
    27
public:
hgs
parents:
diff changeset
    28
    FileStoragePrivate();
hgs
parents:
diff changeset
    29
    ~FileStoragePrivate();
hgs
parents:
diff changeset
    30
    // client name
hgs
parents:
diff changeset
    31
    QString m_clientName;
hgs
parents:
diff changeset
    32
    // folder paths
hgs
parents:
diff changeset
    33
    QString m_tempPath;                     // temporary path till dl completes
hgs
parents:
diff changeset
    34
    QFile *m_file;
hgs
parents:
diff changeset
    35
    ClientDownload* m_download;
hgs
parents:
diff changeset
    36
};  
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
FileStoragePrivate::FileStoragePrivate()
hgs
parents:
diff changeset
    39
{
hgs
parents:
diff changeset
    40
    m_tempPath = "";
hgs
parents:
diff changeset
    41
    m_file = 0;
hgs
parents:
diff changeset
    42
    m_download = 0;
hgs
parents:
diff changeset
    43
}
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
FileStoragePrivate::~FileStoragePrivate()
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
    if(m_file)
hgs
parents:
diff changeset
    48
    {
hgs
parents:
diff changeset
    49
        // close the file if it is open
hgs
parents:
diff changeset
    50
        if(m_file->isOpen())
hgs
parents:
diff changeset
    51
        {
hgs
parents:
diff changeset
    52
            m_file->close();
hgs
parents:
diff changeset
    53
        }
hgs
parents:
diff changeset
    54
        delete m_file;
hgs
parents:
diff changeset
    55
        m_file = 0;
hgs
parents:
diff changeset
    56
    }
hgs
parents:
diff changeset
    57
}
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
FileStorage::FileStorage(const QString& clientName, ClientDownload* download)
hgs
parents:
diff changeset
    60
{
hgs
parents:
diff changeset
    61
    DM_INITIALIZE(FileStorage);
hgs
parents:
diff changeset
    62
    priv->m_clientName = clientName;
hgs
parents:
diff changeset
    63
    priv->m_file = new QFile();
hgs
parents:
diff changeset
    64
    priv->m_download = download;
hgs
parents:
diff changeset
    65
    priv->m_tempPath = StorageUtility::createTemporaryPath(clientName);
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
FileStorage::~FileStorage()
hgs
parents:
diff changeset
    69
{
hgs
parents:
diff changeset
    70
    DM_UNINITIALIZE(FileStorage);
hgs
parents:
diff changeset
    71
}
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
int FileStorage::createStore()
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    // validate filename
hgs
parents:
diff changeset
    78
    QString validFilename;
hgs
parents:
diff changeset
    79
    QString filename = priv->m_download->attributes().value(DlFileName).toString();
hgs
parents:
diff changeset
    80
    StorageUtility::validateFileName(filename, validFilename);
hgs
parents:
diff changeset
    81
    // generate unique filename
hgs
parents:
diff changeset
    82
    QString permPath = priv->m_download->attributes().value(DlDestPath).toString();
hgs
parents:
diff changeset
    83
    QString uniqueFilename;
hgs
parents:
diff changeset
    84
    StorageUtility::generateUniqueFileName(validFilename, priv->m_tempPath, permPath, uniqueFilename);  
hgs
parents:
diff changeset
    85
    
hgs
parents:
diff changeset
    86
    // set the new filename
hgs
parents:
diff changeset
    87
    QDir filePath(priv->m_tempPath);
hgs
parents:
diff changeset
    88
    priv->m_download->attributes().insert(DlFileName, uniqueFilename);
hgs
parents:
diff changeset
    89
    QFileInfo newFileinfo(filePath, uniqueFilename);
hgs
parents:
diff changeset
    90
    QString newFilename = newFileinfo.filePath();
hgs
parents:
diff changeset
    91
    priv->m_file->setFileName(newFilename);   
hgs
parents:
diff changeset
    92
    if (!priv->m_file->open(QIODevice::ReadWrite))
hgs
parents:
diff changeset
    93
        return -1;
hgs
parents:
diff changeset
    94
    else
hgs
parents:
diff changeset
    95
        return 0;
hgs
parents:
diff changeset
    96
}
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
int FileStorage::open(QIODevice::OpenMode mode)
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
    QDir filePath(priv->m_tempPath);
hgs
parents:
diff changeset
   104
    QFileInfo fileinfo(filePath, priv->m_download->attributes().value(DlFileName).toString());
hgs
parents:
diff changeset
   105
    QString filename = fileinfo.filePath();
hgs
parents:
diff changeset
   106
    // if already exists, open the file
hgs
parents:
diff changeset
   107
    if(priv->m_file && (QFile::exists(filename)) && !priv->m_file->isOpen())
hgs
parents:
diff changeset
   108
    {
hgs
parents:
diff changeset
   109
        priv->m_file->setFileName(filename);
hgs
parents:
diff changeset
   110
        if (!priv->m_file->open(mode))
hgs
parents:
diff changeset
   111
            return -1;
hgs
parents:
diff changeset
   112
        else
hgs
parents:
diff changeset
   113
            return 0;
hgs
parents:
diff changeset
   114
    }
hgs
parents:
diff changeset
   115
    return -1;  
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
int FileStorage::write(const QByteArray& data,bool lastChunk)
hgs
parents:
diff changeset
   119
{
hgs
parents:
diff changeset
   120
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
   121
    // write the data chunk
hgs
parents:
diff changeset
   122
    int value = priv->m_file->write(data);
hgs
parents:
diff changeset
   123
    if(lastChunk)
hgs
parents:
diff changeset
   124
    {
hgs
parents:
diff changeset
   125
        close();
hgs
parents:
diff changeset
   126
        // move the file to permanent destination path
hgs
parents:
diff changeset
   127
        moveDlFile();
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
    return value;
hgs
parents:
diff changeset
   130
}
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
int FileStorage::close()
hgs
parents:
diff changeset
   133
{
hgs
parents:
diff changeset
   134
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
   135
    if(priv->m_file && priv->m_file->isOpen())
hgs
parents:
diff changeset
   136
    {
hgs
parents:
diff changeset
   137
        priv->m_file->close();
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
    return 0;
hgs
parents:
diff changeset
   140
}
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
int FileStorage::deleteStore()
hgs
parents:
diff changeset
   143
{
hgs
parents:
diff changeset
   144
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
   145
    // remove the temporary file
hgs
parents:
diff changeset
   146
    QDir tempFilePath(priv->m_tempPath);
hgs
parents:
diff changeset
   147
    QFileInfo tempFileinfo(tempFilePath, priv->m_download->attributes().value(DlFileName).toString());
hgs
parents:
diff changeset
   148
    QString tempFileName = tempFileinfo.filePath();
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
    // remove the temporary file
hgs
parents:
diff changeset
   151
    if(QFile::exists(tempFileName))
hgs
parents:
diff changeset
   152
    {
hgs
parents:
diff changeset
   153
        close();
hgs
parents:
diff changeset
   154
        QFile::remove(tempFileName); 
hgs
parents:
diff changeset
   155
    }
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
    return 0;
hgs
parents:
diff changeset
   158
}
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
int FileStorage::storedDataSize()
hgs
parents:
diff changeset
   161
{
hgs
parents:
diff changeset
   162
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
   163
    QDir tempFilePath(priv->m_tempPath);
hgs
parents:
diff changeset
   164
    QFileInfo tempFileinfo(tempFilePath, priv->m_download->attributes().value(DlFileName).toString());
hgs
parents:
diff changeset
   165
    QString tempFilename = tempFileinfo.filePath();
hgs
parents:
diff changeset
   166
    QFile tempFile(tempFilename);
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
    if(tempFile.exists())
hgs
parents:
diff changeset
   169
        return tempFile.size();
hgs
parents:
diff changeset
   170
    else
hgs
parents:
diff changeset
   171
        return 0;
hgs
parents:
diff changeset
   172
}
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
void FileStorage::moveDlFile()
hgs
parents:
diff changeset
   175
{
hgs
parents:
diff changeset
   176
    DM_PRIVATE(FileStorage);
hgs
parents:
diff changeset
   177
    QString permPath = priv->m_download->attributes().value(DlDestPath).toString();
hgs
parents:
diff changeset
   178
    QString filename = priv->m_download->attributes().value(DlFileName).toString();
hgs
parents:
diff changeset
   179
    QDir permDir(permPath);
hgs
parents:
diff changeset
   180
    if(!permDir.exists())
hgs
parents:
diff changeset
   181
    {
hgs
parents:
diff changeset
   182
        QDir tempDir;
hgs
parents:
diff changeset
   183
        if(!tempDir.mkpath (permPath))
hgs
parents:
diff changeset
   184
        {
hgs
parents:
diff changeset
   185
            return;
hgs
parents:
diff changeset
   186
        }
hgs
parents:
diff changeset
   187
    }
hgs
parents:
diff changeset
   188
    
hgs
parents:
diff changeset
   189
    QDir newFilePath(permPath);
hgs
parents:
diff changeset
   190
    QFileInfo newFileinfo(newFilePath, filename);
hgs
parents:
diff changeset
   191
    QString newFileName = newFileinfo.filePath();
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    // remove the file if already exists
hgs
parents:
diff changeset
   194
    if(QFile::exists(newFileName)) {
hgs
parents:
diff changeset
   195
        QFile::remove(newFileName);    
hgs
parents:
diff changeset
   196
    }
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    QDir tempFilePath(priv->m_tempPath);
hgs
parents:
diff changeset
   199
    QFileInfo tempFileinfo(tempFilePath, filename);
hgs
parents:
diff changeset
   200
    QString tempFilename = tempFileinfo.filePath();
hgs
parents:
diff changeset
   201
    
hgs
parents:
diff changeset
   202
    QFile::copy(tempFilename, newFileName);
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
    // remove the temporary file
hgs
parents:
diff changeset
   205
    QFile::remove(tempFilename);    
hgs
parents:
diff changeset
   206
    return;
hgs
parents:
diff changeset
   207
}