source: SMSSender/lib/libdatatypes/src/snumber.cpp @ 43:10dd65d71f7f

3.0
Last change on this file since 43:10dd65d71f7f was 43:10dd65d71f7f, checked in by Sämy Zehnder <saemy.zehnder@…>, 12 years ago
  • Did a lot of work...
File size: 5.5 KB
Line 
1/*
2 * SNumber.cpp
3 *
4 *  Created on: May 19, 2009
5 *      Author: saemy
6 */
7
8#include "snumber.h"
9
10#include <QDebug>
11#include <QStringList>
12
13#include <StdExceptions.h>
14
15#include <typeconvert.h>
16#include <strutils.h>
17
18/**
19 * Format:
20 *  c       country code (1-digit)
21 *  cc      country code (2-digits)
22 *  CC      country code trim zeros
23 *
24 *  a       area code (1-digit)
25 *  aa      area code (2-digits)
26 *  aaa     area code (3-digits)
27 *
28 *  AAA     area code trim zeros
29 *
30 *  u       The user number
31 *
32 *  'foo'   Ignored part
33 */
34const QString SNumber::IsoFormat      = "'+'cc' 'aaa' 'u"; // +41 079 1234567
35const QString SNumber::IsoFormatShort = "'+'CC' 'AAA' 'u"; // +41 79 1234567
36
37SNumber::SNumber() {
38    clear();
39}
40SNumber::SNumber(const QString& numberStr, const QString& format /* = SNumber::IsoFormat */) {
41    setNumber(numberStr, format);
42}
43SNumber::SNumber(const SNumber& other) {
44    fromString(other.toString("ccaaau"), "ccaaau");
45}
46
47void SNumber::clear() {
48    countryCode_ = 0;
49    areaCode_    = 0;
50    userNumber_  = "";
51}
52
53bool SNumber::isEmpty() const {
54    return countryCode() == -1;
55}
56bool SNumber::isValid() const {
57    return (countryCode_ > 0) &&
58           (areaCode_    > 0) &&
59           (userNumber_  != "");
60}
61
62
63short SNumber::countryCode() const{
64    return countryCode_;
65}
66short SNumber::areaCode() const{
67    return areaCode_;
68}
69QString SNumber::userNumber() const{
70    return userNumber_;
71}
72
73/* CC & AAA are not applicable here! */
74bool SNumber::setNumber(const QString& numberStr, const QString& format /* = SNumber::IsoFormat */){
75    clear();
76
77    qDebug() << numberStr;
78    qDebug() << format;
79
80    const QLatin1Char quote('\'');
81    if (format.isEmpty())
82        return false;
83
84    bool inQuote = false;
85    int  j = 0;
86    for (int i = 0; i < format.count(); i++) {
87        if (format.at(i) == quote) {
88            inQuote = !inQuote;
89            continue;
90        }
91
92        if (inQuote) {
93            if (format.at(i) == numberStr.at(j)) {
94                j++;
95                continue;
96            } else {
97                clear();
98                break;
99            }
100        }
101
102        if (format.mid(i, 2) == "cc") {
103            setCountryCode(numberStr.mid(j, 2).toShort());
104            j += 2;
105            i++;
106        } else if (format.mid(i, 1) == "c") {
107            setCountryCode(numberStr.mid(i, 1).toShort());
108            j++;
109        } else if (format.mid(i, 3) == "aaa") {
110            setAreaCode(numberStr.mid(j, 3).toShort());
111            j += 3;
112            i += 2;
113        } else if (format.mid(i, 2) == "aa") {
114            setAreaCode(numberStr.mid(j, 2).toShort());
115            j += 2;
116            i++;
117        } else if (format.mid(i, 1) == "a") {
118            setAreaCode(numberStr.mid(j, 1).toShort());
119            j++;
120        } else if (format.at(i) == 'u') {
121            QString userNumber = "";
122            while (j < numberStr.count()) {
123                userNumber += numberStr.at(j);
124                j++;
125            }
126            setUserNumber(userNumber);
127            j++;
128        } else if (format.at(i) == numberStr.at(j)) {
129            j++;
130        } else {
131            clear();
132            break;
133        }
134    }
135
136    return isValid();
137}
138
139bool SNumber::isStringPositiveNumber(const QString& str) {
140    if (str == "")
141        return false;
142
143    for (int i = 0; i < str.count(); i++) {
144        if (!str.at(i).isNumber())
145            return false;
146    }
147
148    return true;
149}
150
151void SNumber::setCountryCode(short countryCode){
152    if ((countryCode <= 0) || (countryCode >= 100))
153        return;
154
155    countryCode_ = countryCode;
156}
157void SNumber::setAreaCode(short areaCode){
158    if ((areaCode <= 0) || (areaCode >= 1000))
159        return;
160
161    areaCode_ = areaCode;
162}
163void SNumber::setUserNumber(const QString& userNumberStr){
164    if (userNumberStr.toInt() <= 0)
165        return;
166
167    userNumber_ = userNumberStr;
168}
169
170QString SNumber::toString(const QString& format /* = SNumber::IsoFormat */) const {
171    if (!isValid()) {
172        return "";
173    }
174
175    const QLatin1Char quote('\'');
176    if (format.isEmpty())
177        return QString();
178
179    QString res = "";
180
181    bool inQuote = false;
182    for (int i = 0; i < format.length(); i++) {
183        if (format.at(i) == quote) {
184            inQuote = !inQuote;
185            continue;
186        }
187
188        if (inQuote) {
189            res += format.at(i);
190            continue;
191        }
192
193        if (format.mid(i, 2) == "CC") {
194            res += QString::number(countryCode());
195            i++;
196        } else if (format.mid(i, 2) == "cc") {
197            res += QString::number(countryCode()).rightJustified(2, '0');
198            i++;
199        } else if (format.mid(i, 1) == "c") {
200            res += QString::number(countryCode()).rightJustified(1, '0');
201        } else if (format.mid(i, 3) == "AAA") {
202            res += QString::number(areaCode());
203            i += 2;
204        } else if (format.mid(i, 3) == "aaa") {
205            res += QString::number(areaCode()).rightJustified(3, '0');
206            i += 2;
207        } else if (format.mid(i, 2) == "aa") {
208            res += QString::number(areaCode()).rightJustified(2, '0');
209            i += 1;
210        } else if (format.mid(i, 1) == "a") {
211            res += QString::number(areaCode()).rightJustified(1, '0');
212        } else if (format.at(i) == 'u') {
213            res += userNumber();
214        } else {
215            res += format.at(i);
216        }
217    }
218    return res;
219}
220
221void SNumber::fromString(const QString& string, const QString& format /* = SNumber::IsoFormat */) {
222    setNumber(string, format);
223}
224
225bool SNumber::operator==(const SNumber& n) const {
226    return this->toString() == n.toString();
227}
Note: See TracBrowser for help on using the repository browser.