bookmarks/xbelreader.cpp
author hgs
Fri, 17 Sep 2010 12:10:47 -0400
changeset 9 1d51612454b5
child 15 5ea3798f1248
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
*
hgs
parents:
diff changeset
     5
* This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
* it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
* the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
* 
hgs
parents:
diff changeset
     9
* This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
* GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
* along with this program.  If not, 
hgs
parents:
diff changeset
    16
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
#include <QXmlStreamReader>
hgs
parents:
diff changeset
    20
#include <QIODevice>
hgs
parents:
diff changeset
    21
#include <QList>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include "xbelreader.h"
hgs
parents:
diff changeset
    24
#include "BookmarksManager.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
XbelReader::XbelReader(BookmarksManager *bmgr) : 
hgs
parents:
diff changeset
    27
    m_bmgr(bmgr), m_xml(new QXmlStreamReader)
hgs
parents:
diff changeset
    28
{
hgs
parents:
diff changeset
    29
}
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
XbelReader::~XbelReader() {
hgs
parents:
diff changeset
    32
    if(m_xml) delete m_xml;
hgs
parents:
diff changeset
    33
}
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
bool XbelReader::read(QIODevice *device)
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
    if(!device) {
hgs
parents:
diff changeset
    38
        m_xml->raiseError(QObject::tr("Invalid Device passed into XBEL Reader."));
hgs
parents:
diff changeset
    39
    }
hgs
parents:
diff changeset
    40
    if(!m_bmgr) { 
hgs
parents:
diff changeset
    41
        m_xml->raiseError(QObject::tr("Invalid BookmarkManager passed into XBEL Reader."));
hgs
parents:
diff changeset
    42
    } else {
hgs
parents:
diff changeset
    43
        m_xml->setDevice(device);
hgs
parents:
diff changeset
    44
        if(m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
    45
           if(m_xml->name() == "xbel" && 
hgs
parents:
diff changeset
    46
              m_xml->attributes().value("version") == "1.0")
hgs
parents:
diff changeset
    47
               readXBEL();
hgs
parents:
diff changeset
    48
           else
hgs
parents:
diff changeset
    49
               m_xml->raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
hgs
parents:
diff changeset
    50
        } else 
hgs
parents:
diff changeset
    51
            m_xml->raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
        
hgs
parents:
diff changeset
    54
    return !m_xml->error();
hgs
parents:
diff changeset
    55
}
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
/**
hgs
parents:
diff changeset
    58
 * This function should be called before reading any xml elements
hgs
parents:
diff changeset
    59
 * It attempts to validate that the file being read is actually an 
hgs
parents:
diff changeset
    60
 * xbel file.
hgs
parents:
diff changeset
    61
 * @return whether the file is an XBEL file.
hgs
parents:
diff changeset
    62
 */
hgs
parents:
diff changeset
    63
bool XbelReader::isValidXbel() 
hgs
parents:
diff changeset
    64
{
hgs
parents:
diff changeset
    65
    // The xbel element must exist and must be version 1.0
hgs
parents:
diff changeset
    66
    return true;
hgs
parents:
diff changeset
    67
}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
QString XbelReader::errorString() const
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    return QObject::tr("%1\nLine %2, column %3")
hgs
parents:
diff changeset
    72
            .arg(m_xml->errorString())
hgs
parents:
diff changeset
    73
            .arg(m_xml->lineNumber())
hgs
parents:
diff changeset
    74
            .arg(m_xml->columnNumber());
hgs
parents:
diff changeset
    75
}
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
void XbelReader::readXBEL()
hgs
parents:
diff changeset
    78
{
hgs
parents:
diff changeset
    79
    QString folder = "";
hgs
parents:
diff changeset
    80
    QList<QString> folders;
hgs
parents:
diff changeset
    81
    while (m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
    82
        if (m_xml->name() == "folder")
hgs
parents:
diff changeset
    83
            readFolder(folders);
hgs
parents:
diff changeset
    84
        else if (m_xml->name() == "bookmark")
hgs
parents:
diff changeset
    85
            readBookmark(folders);
hgs
parents:
diff changeset
    86
        else
hgs
parents:
diff changeset
    87
            m_xml->skipCurrentElement();
hgs
parents:
diff changeset
    88
    }
hgs
parents:
diff changeset
    89
}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
QString XbelReader::readFolder(QList<QString>& parentFolders)
hgs
parents:
diff changeset
    92
{
hgs
parents:
diff changeset
    93
    QString folderName = "";
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
    while (m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
    96
        if (m_xml->name() == "title")
hgs
parents:
diff changeset
    97
            folderName = m_xml->readElementText();
hgs
parents:
diff changeset
    98
        else if (m_xml->name() == "folder") {
hgs
parents:
diff changeset
    99
            QList<QString> folders;
hgs
parents:
diff changeset
   100
            folders = folders + parentFolders;
hgs
parents:
diff changeset
   101
            if(!folderName.isEmpty())
hgs
parents:
diff changeset
   102
                folders.append(folderName);
hgs
parents:
diff changeset
   103
            readFolder(folders);
hgs
parents:
diff changeset
   104
        } else if (m_xml->name() == "bookmark") {
hgs
parents:
diff changeset
   105
            QList<QString> folders;
hgs
parents:
diff changeset
   106
            folders = folders + parentFolders;
hgs
parents:
diff changeset
   107
            if(!folderName.isEmpty())
hgs
parents:
diff changeset
   108
                folders.append(folderName);
hgs
parents:
diff changeset
   109
            readBookmark(folders);
hgs
parents:
diff changeset
   110
        } else
hgs
parents:
diff changeset
   111
            m_xml->skipCurrentElement();
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
    return folderName;
hgs
parents:
diff changeset
   114
}
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
void XbelReader::readBookmark(QList<QString>& parentFolders)
hgs
parents:
diff changeset
   117
{
hgs
parents:
diff changeset
   118
    QXmlStreamAttributes attrs = m_xml->attributes();
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    // if there is no URL attribute skip this bookmark.
hgs
parents:
diff changeset
   121
    if(!attrs.hasAttribute("href")) {
hgs
parents:
diff changeset
   122
        m_xml->skipCurrentElement();
hgs
parents:
diff changeset
   123
        return;
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
    
hgs
parents:
diff changeset
   126
    QString url = attrs.value("href").toString();
hgs
parents:
diff changeset
   127
    QString title = "Untitled";
hgs
parents:
diff changeset
   128
    QString desc = "";
hgs
parents:
diff changeset
   129
    QList<QString> tags;
hgs
parents:
diff changeset
   130
    tags = tags + parentFolders;
hgs
parents:
diff changeset
   131
    
hgs
parents:
diff changeset
   132
    while (m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
   133
        if (m_xml->name() == "title")
hgs
parents:
diff changeset
   134
            title = m_xml->readElementText();
hgs
parents:
diff changeset
   135
        else if(m_xml->name() == "desc")
hgs
parents:
diff changeset
   136
            desc = m_xml->readElementText();
hgs
parents:
diff changeset
   137
        else if(m_xml->name() == "info")
hgs
parents:
diff changeset
   138
            readInfo(tags);
hgs
parents:
diff changeset
   139
        else
hgs
parents:
diff changeset
   140
            m_xml->skipCurrentElement();
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    int bmID = m_bmgr->addBookmark(title, url);
hgs
parents:
diff changeset
   144
    if (bmID > 0) {
hgs
parents:
diff changeset
   145
        QList<QString>::iterator iter;
hgs
parents:
diff changeset
   146
        for (iter = tags.begin(); iter != tags.end(); ++iter)
hgs
parents:
diff changeset
   147
            m_bmgr->addTag(bmID, *iter);
hgs
parents:
diff changeset
   148
    }
hgs
parents:
diff changeset
   149
}
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
/**
hgs
parents:
diff changeset
   152
 * Reads the info element.
hgs
parents:
diff changeset
   153
 * @param tags - A reference to a list of string tags
hgs
parents:
diff changeset
   154
 */
hgs
parents:
diff changeset
   155
void XbelReader::readInfo(QList<QString>& tags) 
hgs
parents:
diff changeset
   156
{
hgs
parents:
diff changeset
   157
    QString owner = "http://www.nokia.com";
hgs
parents:
diff changeset
   158
    while(m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
   159
        if(m_xml->name() == "metadata")
hgs
parents:
diff changeset
   160
            readMetadata(tags, owner);
hgs
parents:
diff changeset
   161
        else
hgs
parents:
diff changeset
   162
            m_xml->skipCurrentElement();
hgs
parents:
diff changeset
   163
    }
hgs
parents:
diff changeset
   164
}
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
/**
hgs
parents:
diff changeset
   167
 * This function reads the metadata XBEL tag.
hgs
parents:
diff changeset
   168
 * @param tags - A reference to a list of strings. This is passed into
hgs
parents:
diff changeset
   169
 * readTags.
hgs
parents:
diff changeset
   170
 * @param owner - A reference to the owner string. This is to allow for
hgs
parents:
diff changeset
   171
 * future support for this attribute.
hgs
parents:
diff changeset
   172
 */
hgs
parents:
diff changeset
   173
void XbelReader::readMetadata(QList<QString>& tags, QString &owner) 
hgs
parents:
diff changeset
   174
{
hgs
parents:
diff changeset
   175
    if(m_xml->attributes().hasAttribute("owner"))
hgs
parents:
diff changeset
   176
    owner = m_xml->attributes().value("owner").toString();
hgs
parents:
diff changeset
   177
    while(m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
   178
        if(m_xml->name() == "tags")
hgs
parents:
diff changeset
   179
            readTags(tags);
hgs
parents:
diff changeset
   180
        else
hgs
parents:
diff changeset
   181
            m_xml->skipCurrentElement();
hgs
parents:
diff changeset
   182
    }
hgs
parents:
diff changeset
   183
    
hgs
parents:
diff changeset
   184
}
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
/**
hgs
parents:
diff changeset
   187
 * Reads the tags and tag attributes, adding all tags found to 
hgs
parents:
diff changeset
   188
 * the list of string tags passed into the function.
hgs
parents:
diff changeset
   189
 * @param tags - Reference to a list of string tags.
hgs
parents:
diff changeset
   190
 */
hgs
parents:
diff changeset
   191
void XbelReader::readTags(QList<QString>& tags) 
hgs
parents:
diff changeset
   192
{
hgs
parents:
diff changeset
   193
    while(m_xml->readNextStartElement()) {
hgs
parents:
diff changeset
   194
        if(m_xml->name() == "tag") 
hgs
parents:
diff changeset
   195
            tags.append(m_xml->readElementText());
hgs
parents:
diff changeset
   196
        else
hgs
parents:
diff changeset
   197
            m_xml->skipCurrentElement();
hgs
parents:
diff changeset
   198
    }
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
}
hgs
parents:
diff changeset
   201