utilities/downloadmanager/src/downloadinfo.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 "downloadinfo.h"
hgs
parents:
diff changeset
    18
#include "dmcommon.h"
hgs
parents:
diff changeset
    19
#include <QStringList>
hgs
parents:
diff changeset
    20
#include <QSettings>
hgs
parents:
diff changeset
    21
#define ORGANIZATION "Nokia"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
class DownloadInfoPrivate
hgs
parents:
diff changeset
    24
{
hgs
parents:
diff changeset
    25
    DM_DECLARE_PUBLIC(DownloadInfo);
hgs
parents:
diff changeset
    26
public:
hgs
parents:
diff changeset
    27
    DownloadInfoPrivate();
hgs
parents:
diff changeset
    28
    ~DownloadInfoPrivate();
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
    QSettings* m_dlInfo;
hgs
parents:
diff changeset
    31
    QString m_clientName;
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
};
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
DownloadInfoPrivate::DownloadInfoPrivate()
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
    m_dlInfo = 0;
hgs
parents:
diff changeset
    38
    m_clientName = "";
hgs
parents:
diff changeset
    39
}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
DownloadInfoPrivate::~DownloadInfoPrivate()
hgs
parents:
diff changeset
    42
{
hgs
parents:
diff changeset
    43
    if(m_dlInfo)
hgs
parents:
diff changeset
    44
    {
hgs
parents:
diff changeset
    45
         m_dlInfo->sync();
hgs
parents:
diff changeset
    46
         delete m_dlInfo;
hgs
parents:
diff changeset
    47
         m_dlInfo = 0;
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
}
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
/*
hgs
parents:
diff changeset
    52
Constructor
hgs
parents:
diff changeset
    53
*/
hgs
parents:
diff changeset
    54
DownloadInfo::DownloadInfo(const QString& clientName)
hgs
parents:
diff changeset
    55
{
hgs
parents:
diff changeset
    56
    DM_INITIALIZE(DownloadInfo);
hgs
parents:
diff changeset
    57
    priv->m_clientName = clientName;
hgs
parents:
diff changeset
    58
    priv->m_dlInfo = new QSettings(ORGANIZATION, clientName);
hgs
parents:
diff changeset
    59
}
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
/*
hgs
parents:
diff changeset
    62
Destructor
hgs
parents:
diff changeset
    63
*/
hgs
parents:
diff changeset
    64
DownloadInfo::~DownloadInfo()
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    DM_UNINITIALIZE(DownloadInfo);
hgs
parents:
diff changeset
    67
}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
/*
hgs
parents:
diff changeset
    70
Sets a string value. Gives option to updte the info file immediately or later
hgs
parents:
diff changeset
    71
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
    72
*/
hgs
parents:
diff changeset
    73
int DownloadInfo::setValue(int aDlId, Key aKey, const QString& aStrValue, int aParentId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
    76
    if(aParentId > INVALID_DL_ID)
hgs
parents:
diff changeset
    77
        priv->m_dlInfo->setValue(genStrKey(aParentId, aDlId, aKey), aStrValue);
hgs
parents:
diff changeset
    78
    else
hgs
parents:
diff changeset
    79
        priv->m_dlInfo->setValue(genStrKey(aDlId, aKey), aStrValue);
hgs
parents:
diff changeset
    80
    return 0;
hgs
parents:
diff changeset
    81
}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
/*
hgs
parents:
diff changeset
    84
Sets a string value. Gives option to updte the info file immediately or later
hgs
parents:
diff changeset
    85
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
    86
*/
hgs
parents:
diff changeset
    87
int DownloadInfo::setValueForChild(int aDlId, Key aKey, const QString& aStrValue, int aChildId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
    88
{
hgs
parents:
diff changeset
    89
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
    90
    if(aChildId > INVALID_DL_ID)
hgs
parents:
diff changeset
    91
        priv->m_dlInfo->setValue(genStrKey(aDlId, aChildId, aKey), aStrValue);
hgs
parents:
diff changeset
    92
    else
hgs
parents:
diff changeset
    93
        priv->m_dlInfo->setValue(genStrKey(aDlId, aKey), aStrValue);
hgs
parents:
diff changeset
    94
    return 0;
hgs
parents:
diff changeset
    95
}
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
/*
hgs
parents:
diff changeset
    98
Sets an int value. Gives option to updte the info file immediately or later
hgs
parents:
diff changeset
    99
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   100
*/
hgs
parents:
diff changeset
   101
int DownloadInfo::setValue(int aDlId, Key aKeyInt, long aLongValue, int aParentId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
   102
{
hgs
parents:
diff changeset
   103
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   104
    QString strKey;
hgs
parents:
diff changeset
   105
    if(aParentId > INVALID_DL_ID)
hgs
parents:
diff changeset
   106
        strKey = genStrKey(aParentId, aDlId, aKeyInt);
hgs
parents:
diff changeset
   107
    else
hgs
parents:
diff changeset
   108
        strKey = genStrKey(aDlId, aKeyInt);
hgs
parents:
diff changeset
   109
    QVariant v((int)aLongValue);
hgs
parents:
diff changeset
   110
    priv->m_dlInfo->setValue(strKey, v);
hgs
parents:
diff changeset
   111
    return 0;
hgs
parents:
diff changeset
   112
}
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
/*
hgs
parents:
diff changeset
   115
Sets an int value. Gives option to updte the info file immediately or later
hgs
parents:
diff changeset
   116
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   117
*/
hgs
parents:
diff changeset
   118
int DownloadInfo::setValueForChild(int aDlId, Key aKeyInt, long aLongValue, int aChildId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
   119
{
hgs
parents:
diff changeset
   120
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   121
    QString strKey;
hgs
parents:
diff changeset
   122
    if(aChildId > INVALID_DL_ID)
hgs
parents:
diff changeset
   123
        strKey = genStrKey(aDlId, aChildId, aKeyInt);
hgs
parents:
diff changeset
   124
    else
hgs
parents:
diff changeset
   125
        strKey = genStrKey(aDlId, aKeyInt);
hgs
parents:
diff changeset
   126
    QVariant v((int)aLongValue);
hgs
parents:
diff changeset
   127
    priv->m_dlInfo->setValue(strKey, v);
hgs
parents:
diff changeset
   128
    return 0;
hgs
parents:
diff changeset
   129
}
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
/*
hgs
parents:
diff changeset
   132
Sets media object list belonging to the parent. Gives option to updte the info file immediately or later
hgs
parents:
diff changeset
   133
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   134
*/
hgs
parents:
diff changeset
   135
int DownloadInfo::setValue(int aDlId, Key aKey, const QList<QVariant>& aChildIds)
hgs
parents:
diff changeset
   136
{
hgs
parents:
diff changeset
   137
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   138
    QString strKey = genStrKey(aDlId, aKey);
hgs
parents:
diff changeset
   139
    QVariant v(aChildIds);
hgs
parents:
diff changeset
   140
    priv->m_dlInfo->setValue(strKey, v);
hgs
parents:
diff changeset
   141
    return 0;
hgs
parents:
diff changeset
   142
}
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
/*
hgs
parents:
diff changeset
   145
Updates(serializes) the info with all set values at once.
hgs
parents:
diff changeset
   146
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   147
*/
hgs
parents:
diff changeset
   148
int DownloadInfo::update()
hgs
parents:
diff changeset
   149
{
hgs
parents:
diff changeset
   150
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   151
    priv->m_dlInfo->sync();
hgs
parents:
diff changeset
   152
    return 0;
hgs
parents:
diff changeset
   153
}
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
/*
hgs
parents:
diff changeset
   156
Deletes the download info of a particular download represented by aDlId.
hgs
parents:
diff changeset
   157
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   158
*/
hgs
parents:
diff changeset
   159
int DownloadInfo::remove(int aDlId, int aParentId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
   160
{
hgs
parents:
diff changeset
   161
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   162
    QString strDlId;
hgs
parents:
diff changeset
   163
    strDlId = priv->m_clientName;
hgs
parents:
diff changeset
   164
    strDlId.append("/");
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    QString str;
hgs
parents:
diff changeset
   167
    if(aParentId > INVALID_DL_ID)
hgs
parents:
diff changeset
   168
    {
hgs
parents:
diff changeset
   169
        str.setNum(aParentId);
hgs
parents:
diff changeset
   170
        strDlId.append(str);
hgs
parents:
diff changeset
   171
        strDlId.append("/");
hgs
parents:
diff changeset
   172
    }
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    str.setNum(aDlId);
hgs
parents:
diff changeset
   175
    strDlId.append(str);
hgs
parents:
diff changeset
   176
    priv->m_dlInfo->remove(strDlId);
hgs
parents:
diff changeset
   177
    return 0;
hgs
parents:
diff changeset
   178
}
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
/*
hgs
parents:
diff changeset
   181
Retrieves the string value
hgs
parents:
diff changeset
   182
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   183
*/
hgs
parents:
diff changeset
   184
int DownloadInfo::getValue(int aDlId, Key aKeyStr, QString& aStrValue, int aParentId)
hgs
parents:
diff changeset
   185
{
hgs
parents:
diff changeset
   186
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   187
    aStrValue = "";
hgs
parents:
diff changeset
   188
    QString strDlId;
hgs
parents:
diff changeset
   189
    if (aParentId > INVALID_DL_ID)
hgs
parents:
diff changeset
   190
        strDlId = genStrKey(aParentId, aDlId, aKeyStr);
hgs
parents:
diff changeset
   191
    else
hgs
parents:
diff changeset
   192
        strDlId = genStrKey(aDlId, aKeyStr);
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
    if(priv->m_dlInfo->contains(strDlId))
hgs
parents:
diff changeset
   195
    {
hgs
parents:
diff changeset
   196
        aStrValue = priv->m_dlInfo->value(strDlId).toString();
hgs
parents:
diff changeset
   197
        return 0;
hgs
parents:
diff changeset
   198
    }
hgs
parents:
diff changeset
   199
    return -1;
hgs
parents:
diff changeset
   200
}
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
/*
hgs
parents:
diff changeset
   203
Retrieves the string value
hgs
parents:
diff changeset
   204
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   205
*/
hgs
parents:
diff changeset
   206
int DownloadInfo::getValueForChild(int aDlId, Key aKeyStr, QString& aStrValue, int aChildId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
   207
{
hgs
parents:
diff changeset
   208
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   209
    aStrValue = "";
hgs
parents:
diff changeset
   210
    QString strDlId;
hgs
parents:
diff changeset
   211
    if (aChildId > INVALID_DL_ID)
hgs
parents:
diff changeset
   212
        strDlId = genStrKey(aDlId, aChildId, aKeyStr);
hgs
parents:
diff changeset
   213
    else
hgs
parents:
diff changeset
   214
        strDlId = genStrKey(aDlId, aKeyStr);
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    if(priv->m_dlInfo->contains(strDlId))
hgs
parents:
diff changeset
   217
    {
hgs
parents:
diff changeset
   218
        aStrValue = priv->m_dlInfo->value(strDlId).toString();
hgs
parents:
diff changeset
   219
        return 0;
hgs
parents:
diff changeset
   220
    }
hgs
parents:
diff changeset
   221
    return -1;
hgs
parents:
diff changeset
   222
}
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
/*
hgs
parents:
diff changeset
   225
Retrieves the int value
hgs
parents:
diff changeset
   226
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   227
*/
hgs
parents:
diff changeset
   228
int DownloadInfo::getValue(int aDlId, Key aKeyInt, long& aLongValue, int aParentId)
hgs
parents:
diff changeset
   229
{
hgs
parents:
diff changeset
   230
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   231
    QString strDlId;
hgs
parents:
diff changeset
   232
    if(aParentId > INVALID_DL_ID)
hgs
parents:
diff changeset
   233
        strDlId = genStrKey(aParentId, aDlId, aKeyInt);
hgs
parents:
diff changeset
   234
    else
hgs
parents:
diff changeset
   235
        strDlId = genStrKey(aDlId, aKeyInt);
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
    if(priv->m_dlInfo->contains(strDlId))
hgs
parents:
diff changeset
   238
    {
hgs
parents:
diff changeset
   239
        aLongValue = priv->m_dlInfo->value(strDlId).toInt();
hgs
parents:
diff changeset
   240
        return 0;
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
    return -1;
hgs
parents:
diff changeset
   243
}
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
/*
hgs
parents:
diff changeset
   246
Retrieves the int value
hgs
parents:
diff changeset
   247
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   248
*/
hgs
parents:
diff changeset
   249
int DownloadInfo::getValueForChild(int aDlId, Key aKeyInt, long& aLongValue, int aChildId /*= INVALID_DL_ID*/)
hgs
parents:
diff changeset
   250
{
hgs
parents:
diff changeset
   251
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   252
    QString strDlId;
hgs
parents:
diff changeset
   253
    if(aChildId > INVALID_DL_ID)
hgs
parents:
diff changeset
   254
        strDlId = genStrKey(aDlId, aChildId, aKeyInt);
hgs
parents:
diff changeset
   255
    else
hgs
parents:
diff changeset
   256
        strDlId = genStrKey(aDlId, aKeyInt);
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
    if(priv->m_dlInfo->contains(strDlId)) 
hgs
parents:
diff changeset
   259
    {
hgs
parents:
diff changeset
   260
        aLongValue = priv->m_dlInfo->value(strDlId).toInt();
hgs
parents:
diff changeset
   261
        return 0;
hgs
parents:
diff changeset
   262
    }
hgs
parents:
diff changeset
   263
    return -1;
hgs
parents:
diff changeset
   264
}
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
/*
hgs
parents:
diff changeset
   267
Retrieves the mediaObject list
hgs
parents:
diff changeset
   268
Returns : 0 on success, non zero on error
hgs
parents:
diff changeset
   269
*/
hgs
parents:
diff changeset
   270
int DownloadInfo::getValue(int aDlId, Key aKey, QList<QVariant>& aChildIds)
hgs
parents:
diff changeset
   271
{
hgs
parents:
diff changeset
   272
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   273
    QString strDlId = genStrKey(aDlId, aKey);
hgs
parents:
diff changeset
   274
    if(priv->m_dlInfo->contains(strDlId)) 
hgs
parents:
diff changeset
   275
    {
hgs
parents:
diff changeset
   276
        QStringList strList(priv->m_dlInfo->value(strDlId).toStringList());
hgs
parents:
diff changeset
   277
        for (int i = 0; i < strList.count(); i++) 
hgs
parents:
diff changeset
   278
            aChildIds.append(strList[i]);
hgs
parents:
diff changeset
   279
        return 0;
hgs
parents:
diff changeset
   280
    }
hgs
parents:
diff changeset
   281
    return -1;
hgs
parents:
diff changeset
   282
}
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
/*
hgs
parents:
diff changeset
   285
Returns all download ids in a vector
hgs
parents:
diff changeset
   286
*/
hgs
parents:
diff changeset
   287
QVector<int> DownloadInfo::getAllDownloads(const QString& aClientName)
hgs
parents:
diff changeset
   288
{
hgs
parents:
diff changeset
   289
    QVector<int> ids;
hgs
parents:
diff changeset
   290
    QSettings *dlInfo = new QSettings(ORGANIZATION, aClientName);
hgs
parents:
diff changeset
   291
    dlInfo->beginGroup(aClientName);
hgs
parents:
diff changeset
   292
    QStringList idList = dlInfo->childGroups();
hgs
parents:
diff changeset
   293
    dlInfo->endGroup();
hgs
parents:
diff changeset
   294
    for(int i=0; i<idList.size(); i++)
hgs
parents:
diff changeset
   295
    {
hgs
parents:
diff changeset
   296
        ids.append(idList[i].toInt());
hgs
parents:
diff changeset
   297
    }
hgs
parents:
diff changeset
   298
    delete dlInfo;
hgs
parents:
diff changeset
   299
    return ids;
hgs
parents:
diff changeset
   300
}
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
/*
hgs
parents:
diff changeset
   303
Helper function to generate a string key combining dlId and the InfoKey
hgs
parents:
diff changeset
   304
*/
hgs
parents:
diff changeset
   305
QString DownloadInfo::genStrKey(int aDlId, Key aKey)
hgs
parents:
diff changeset
   306
{   
hgs
parents:
diff changeset
   307
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   308
    QString strDlId = "";
hgs
parents:
diff changeset
   309
    strDlId = priv->m_clientName;
hgs
parents:
diff changeset
   310
    strDlId.append("/");
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
    QString str;
hgs
parents:
diff changeset
   313
    str.setNum(aDlId);
hgs
parents:
diff changeset
   314
    strDlId.append(str);
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
    strDlId.append("/");
hgs
parents:
diff changeset
   317
    str.setNum((int)aKey);
hgs
parents:
diff changeset
   318
    strDlId.append(str);
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
    return strDlId;
hgs
parents:
diff changeset
   321
}
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
/*
hgs
parents:
diff changeset
   324
Helper function to generate a string key combining dlId, mediaObjdlId and the InfoKey
hgs
parents:
diff changeset
   325
*/
hgs
parents:
diff changeset
   326
QString DownloadInfo::genStrKey(int aParentId, int aChildId, Key aKey)
hgs
parents:
diff changeset
   327
{   
hgs
parents:
diff changeset
   328
    DM_PRIVATE(DownloadInfo);
hgs
parents:
diff changeset
   329
    QString strDlId = "";
hgs
parents:
diff changeset
   330
    strDlId = priv->m_clientName;
hgs
parents:
diff changeset
   331
    strDlId.append("/");
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
    QString str;
hgs
parents:
diff changeset
   334
    str.setNum(aParentId);
hgs
parents:
diff changeset
   335
    strDlId.append(str);
hgs
parents:
diff changeset
   336
    strDlId.append("/");
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
    str.setNum(aChildId);
hgs
parents:
diff changeset
   339
    strDlId.append(str);
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
    strDlId.append("/");
hgs
parents:
diff changeset
   342
    str.setNum((int)aKey);
hgs
parents:
diff changeset
   343
    strDlId.append(str);
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
    return strDlId;
hgs
parents:
diff changeset
   346
}