utilities/downloadmanager/src/drmstorage.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 "drmstorage.h"
hgs
parents:
diff changeset
    18
#include "storageutility.h"
hgs
parents:
diff changeset
    19
#include "dmcommoninternal.h"
hgs
parents:
diff changeset
    20
#include <QFile>
hgs
parents:
diff changeset
    21
#include <QDir>
hgs
parents:
diff changeset
    22
#include <QVariant>
hgs
parents:
diff changeset
    23
#include <qregexp.h>
hgs
parents:
diff changeset
    24
#include <f32file.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
DrmStorage::DrmStorage(const QString& clientName, ClientDownload* download)
hgs
parents:
diff changeset
    28
{
hgs
parents:
diff changeset
    29
    m_file = 0;
hgs
parents:
diff changeset
    30
    m_clientName = clientName;
hgs
parents:
diff changeset
    31
    m_download = download;
hgs
parents:
diff changeset
    32
    // create temporary path
hgs
parents:
diff changeset
    33
    m_tempPath = StorageUtility::createTemporaryPath(clientName);
hgs
parents:
diff changeset
    34
}
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
DrmStorage::~DrmStorage()
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
    if (m_file) {
hgs
parents:
diff changeset
    39
        close();
hgs
parents:
diff changeset
    40
        delete m_file;
hgs
parents:
diff changeset
    41
        m_file = 0;
hgs
parents:
diff changeset
    42
    }
hgs
parents:
diff changeset
    43
}
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
int DrmStorage::createStore()
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
    // validate filename
hgs
parents:
diff changeset
    48
    QString validFilename;
hgs
parents:
diff changeset
    49
    QString filename = m_download->attributes().value(DlFileName).toString();
hgs
parents:
diff changeset
    50
    StorageUtility::validateFileName(filename, validFilename);
hgs
parents:
diff changeset
    51
    // generate unique filename 
hgs
parents:
diff changeset
    52
    QString permPath = m_download->attributes().value(DlDestPath).toString();
hgs
parents:
diff changeset
    53
    QString uniqueFilename;
hgs
parents:
diff changeset
    54
    StorageUtility::generateUniqueFileName(validFilename, m_tempPath, permPath, uniqueFilename);  
hgs
parents:
diff changeset
    55
    
hgs
parents:
diff changeset
    56
    // set the new filename
hgs
parents:
diff changeset
    57
    m_download->attributes().insert(DlFileName, uniqueFilename);
hgs
parents:
diff changeset
    58
    
hgs
parents:
diff changeset
    59
    // convert to symbian descriptors
hgs
parents:
diff changeset
    60
    QString path = m_tempPath;
hgs
parents:
diff changeset
    61
    path.replace(QString("/"), QString("\\"));
hgs
parents:
diff changeset
    62
    TPtrC ptrPath = SymbianStringToQtString(path);
hgs
parents:
diff changeset
    63
    TPtrC ptrFileName = SymbianStringToQtString(uniqueFilename);
hgs
parents:
diff changeset
    64
    _LIT8(KOmaDrm1DrmMessageContentType, OMA_DRM_MESSAGE_CONTENT_TYPE);
hgs
parents:
diff changeset
    65
    
hgs
parents:
diff changeset
    66
    // create supplier and get importfile which will actually write to the file
hgs
parents:
diff changeset
    67
    QT_TRAP_THROWING(ContentAccess::CSupplier* supplier = ContentAccess::CSupplier::NewLC();
hgs
parents:
diff changeset
    68
                     ContentAccess::CMetaDataArray* metaData = ContentAccess::CMetaDataArray::NewLC();
hgs
parents:
diff changeset
    69
                     supplier->SetOutputDirectoryL(ptrPath);
hgs
parents:
diff changeset
    70
                     m_file = supplier->ImportFileL(KOmaDrm1DrmMessageContentType(), *metaData, ptrFileName));
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
    // perform cleanup
hgs
parents:
diff changeset
    73
    CleanupStack::PopAndDestroy(2); // metaData, supplier
hgs
parents:
diff changeset
    74
    return 0;
hgs
parents:
diff changeset
    75
}
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
int DrmStorage::open(QIODevice::OpenMode /*mode*/)
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    // we cannot open an existing file, so we delete the
hgs
parents:
diff changeset
    81
    // store and create a new one. Download will start/resume
hgs
parents:
diff changeset
    82
    // from beginning
hgs
parents:
diff changeset
    83
    deleteStore();
hgs
parents:
diff changeset
    84
    if (!m_file)
hgs
parents:
diff changeset
    85
        createStore();
hgs
parents:
diff changeset
    86
    return 0;
hgs
parents:
diff changeset
    87
}
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
int DrmStorage::write(const QByteArray& data, bool lastChunk)
hgs
parents:
diff changeset
    90
{
hgs
parents:
diff changeset
    91
    if (!m_file)
hgs
parents:
diff changeset
    92
        return -1;
hgs
parents:
diff changeset
    93
    
hgs
parents:
diff changeset
    94
    // convert the data chunk to 8 bit descriptor
hgs
parents:
diff changeset
    95
    QString strChunk(data);
hgs
parents:
diff changeset
    96
    TPtrC ptrChunk = SymbianStringToQtString(strChunk);
hgs
parents:
diff changeset
    97
    HBufC8* buf8 = q_check_ptr(HBufC8::New(ptrChunk.Length()));
hgs
parents:
diff changeset
    98
    buf8->Des().Copy(ptrChunk);
hgs
parents:
diff changeset
    99
    TPtrC8 ptrData8(*buf8);
hgs
parents:
diff changeset
   100
    
hgs
parents:
diff changeset
   101
    if (m_file) {
hgs
parents:
diff changeset
   102
        // write the data chunk
hgs
parents:
diff changeset
   103
        m_file->WriteData(ptrData8);
hgs
parents:
diff changeset
   104
        if (lastChunk) {
hgs
parents:
diff changeset
   105
            // close the file
hgs
parents:
diff changeset
   106
            close();
hgs
parents:
diff changeset
   107
            // move the file to permanent destination path
hgs
parents:
diff changeset
   108
            // note that moveDlFile uses m_file
hgs
parents:
diff changeset
   109
            moveDlFile();
hgs
parents:
diff changeset
   110
            // clean up memory
hgs
parents:
diff changeset
   111
            delete m_file;
hgs
parents:
diff changeset
   112
            m_file = 0;
hgs
parents:
diff changeset
   113
        }
hgs
parents:
diff changeset
   114
    }
hgs
parents:
diff changeset
   115
    
hgs
parents:
diff changeset
   116
    delete buf8;
hgs
parents:
diff changeset
   117
    buf8 = NULL;
hgs
parents:
diff changeset
   118
    return 0;
hgs
parents:
diff changeset
   119
}
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
int DrmStorage::close()
hgs
parents:
diff changeset
   122
{
hgs
parents:
diff changeset
   123
    if (m_file) {    
hgs
parents:
diff changeset
   124
        // close storage and get filename
hgs
parents:
diff changeset
   125
        m_file->WriteDataComplete();
hgs
parents:
diff changeset
   126
    }
hgs
parents:
diff changeset
   127
    return 0;
hgs
parents:
diff changeset
   128
}
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
int DrmStorage::deleteStore()
hgs
parents:
diff changeset
   131
{
hgs
parents:
diff changeset
   132
    // create filename (with path)
hgs
parents:
diff changeset
   133
    QDir tempFilePath(m_tempPath);
hgs
parents:
diff changeset
   134
    QFileInfo tempFileInfo(tempFilePath, m_download->attributes().value(DlFileName).toString());
hgs
parents:
diff changeset
   135
    QString tempFileName = tempFileInfo.filePath();
hgs
parents:
diff changeset
   136
    
hgs
parents:
diff changeset
   137
    // remove the temporary file
hgs
parents:
diff changeset
   138
    if (QFile::exists(tempFileName)) {
hgs
parents:
diff changeset
   139
        // close the store
hgs
parents:
diff changeset
   140
        close();
hgs
parents:
diff changeset
   141
        if (m_file) {
hgs
parents:
diff changeset
   142
            delete m_file;
hgs
parents:
diff changeset
   143
            m_file = 0;
hgs
parents:
diff changeset
   144
        }
hgs
parents:
diff changeset
   145
        // remove file
hgs
parents:
diff changeset
   146
        QFile::remove(tempFileName);
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
    return 0;
hgs
parents:
diff changeset
   150
}
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
int DrmStorage::storedDataSize()
hgs
parents:
diff changeset
   153
{
hgs
parents:
diff changeset
   154
    // build temporary path with filename
hgs
parents:
diff changeset
   155
    QDir tempFilePath(m_tempPath);
hgs
parents:
diff changeset
   156
    QFileInfo tempFileinfo(tempFilePath, m_download->attributes().value(DlFileName).toString());
hgs
parents:
diff changeset
   157
    QString tempFilename = tempFileinfo.filePath();
hgs
parents:
diff changeset
   158
    QFile tempFile(tempFilename);
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    // return file size if file exists
hgs
parents:
diff changeset
   161
    if(tempFile.exists())
hgs
parents:
diff changeset
   162
        return tempFile.size();
hgs
parents:
diff changeset
   163
    else
hgs
parents:
diff changeset
   164
        return 0;
hgs
parents:
diff changeset
   165
}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
void DrmStorage::moveDlFile()
hgs
parents:
diff changeset
   168
{
hgs
parents:
diff changeset
   169
    // source file
hgs
parents:
diff changeset
   170
    QString fileName = m_download->attributes().value(DlFileName).toString();
hgs
parents:
diff changeset
   171
    QFileInfo srcFileInfo(m_tempPath, fileName);
hgs
parents:
diff changeset
   172
    QString srcFile = srcFileInfo.filePath();
hgs
parents:
diff changeset
   173
    
hgs
parents:
diff changeset
   174
    // if source file does not exist, return
hgs
parents:
diff changeset
   175
    if (!QFile::exists(srcFile))
hgs
parents:
diff changeset
   176
        return;
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    // create the permanent directory
hgs
parents:
diff changeset
   179
    QString permPath = m_download->attributes().value(DlDestPath).toString();
hgs
parents:
diff changeset
   180
    QDir permDir(permPath);
hgs
parents:
diff changeset
   181
    if(!permDir.exists()) {
hgs
parents:
diff changeset
   182
        if(!permDir.mkpath(permPath))
hgs
parents:
diff changeset
   183
            return;
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    if (m_file) {
hgs
parents:
diff changeset
   187
        // name of the file to which 
hgs
parents:
diff changeset
   188
        TPtrC outputFileName(KNullDesC);
hgs
parents:
diff changeset
   189
        QT_TRAP_THROWING(outputFileName.Set(m_file->OutputFileL(0).FileName()));
hgs
parents:
diff changeset
   190
        // convert filename to Qt equivalent
hgs
parents:
diff changeset
   191
        srcFile = SymbianStringToQtString(outputFileName);
hgs
parents:
diff changeset
   192
        // check if file exists and update filename attribute
hgs
parents:
diff changeset
   193
        if (!QFile::exists(srcFile))
hgs
parents:
diff changeset
   194
            return;
hgs
parents:
diff changeset
   195
        
hgs
parents:
diff changeset
   196
        // name without extension
hgs
parents:
diff changeset
   197
        TParse p;
hgs
parents:
diff changeset
   198
        p.SetNoWild(outputFileName, NULL, NULL);
hgs
parents:
diff changeset
   199
        TPtrC namePtr = p.Name();
hgs
parents:
diff changeset
   200
        // suggested extension
hgs
parents:
diff changeset
   201
        TBuf<4> extension;
hgs
parents:
diff changeset
   202
        m_file->GetSuggestedOutputFileExtension(extension);
hgs
parents:
diff changeset
   203
    
hgs
parents:
diff changeset
   204
        // build filename with new extension and convert to Qt equivalent 
hgs
parents:
diff changeset
   205
        HBufC* name = q_check_ptr(HBufC::New(namePtr.Length() + extension.Length()));
hgs
parents:
diff changeset
   206
        TPtr newNamePtr(name->Des());
hgs
parents:
diff changeset
   207
        newNamePtr.Format(_L("%S%S"), &namePtr, &extension);
hgs
parents:
diff changeset
   208
        QString newFileName = SymbianStringToQtString(newNamePtr); 
hgs
parents:
diff changeset
   209
        delete name;
hgs
parents:
diff changeset
   210
        name = NULL;
hgs
parents:
diff changeset
   211
    
hgs
parents:
diff changeset
   212
        // extension has changed, generate unique filename
hgs
parents:
diff changeset
   213
        StorageUtility::generateUniqueFileName(newFileName, m_tempPath, permPath, fileName);
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
    
hgs
parents:
diff changeset
   216
    // remove the file if it already exists
hgs
parents:
diff changeset
   217
    QFileInfo fileInfo(permPath, fileName);
hgs
parents:
diff changeset
   218
    QString destFile = fileInfo.filePath();
hgs
parents:
diff changeset
   219
    if (QFile::exists(destFile))
hgs
parents:
diff changeset
   220
        QFile::remove(destFile);
hgs
parents:
diff changeset
   221
    
hgs
parents:
diff changeset
   222
    // Copy the file to destination and remove old file
hgs
parents:
diff changeset
   223
    QFile::copy(srcFile, destFile);
hgs
parents:
diff changeset
   224
    QFile::remove(srcFile);
hgs
parents:
diff changeset
   225
    
hgs
parents:
diff changeset
   226
    // set the new filename
hgs
parents:
diff changeset
   227
    m_download->attributes().insert(DlFileName, fileName);
hgs
parents:
diff changeset
   228
}
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
QString DrmStorage::SymbianStringToQtString(TDesC& symbianString)
hgs
parents:
diff changeset
   231
{
hgs
parents:
diff changeset
   232
    // convert symbian string to Qt string
hgs
parents:
diff changeset
   233
    return QString::fromUtf16(symbianString.Ptr(), symbianString.Length());
hgs
parents:
diff changeset
   234
}
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
TPtrC DrmStorage::SymbianStringToQtString(QString& qtString)
hgs
parents:
diff changeset
   237
{
hgs
parents:
diff changeset
   238
    // convert QString string to symbian string
hgs
parents:
diff changeset
   239
    return reinterpret_cast<const TText*> (qtString.constData());
hgs
parents:
diff changeset
   240
}