|
@@ -33,56 +33,57 @@ using namespace i18n::phonenumbers;
|
|
using icu::Locale;
|
|
using icu::Locale;
|
|
using std::string;
|
|
using std::string;
|
|
|
|
|
|
-const PhoneNumberUtil& _phoneUtil(*PhoneNumberUtil::GetInstance());
|
|
|
|
-static PhoneNumberOfflineGeocoder *_phoneGeoCoder = new PhoneNumberOfflineGeocoder();
|
|
|
|
|
|
+const PhoneNumberUtil &_phoneUtil(*PhoneNumberUtil::GetInstance());
|
|
|
|
+static PhoneNumberOfflineGeocoder *_phoneGeoCoder =
|
|
|
|
+ new PhoneNumberOfflineGeocoder();
|
|
|
|
|
|
-const char* telnum_linetype(PhoneNumberUtil::PhoneNumberType ltype)
|
|
|
|
|
|
+const char *telnum_linetype(PhoneNumberUtil::PhoneNumberType ltype)
|
|
{
|
|
{
|
|
switch(ltype) {
|
|
switch(ltype) {
|
|
- case PhoneNumberUtil::FIXED_LINE:
|
|
|
|
- return "fixed-line";
|
|
|
|
- case PhoneNumberUtil::MOBILE:
|
|
|
|
- return "mobile";
|
|
|
|
- // In some regions (e.g. the USA), it is impossible to distinguish between
|
|
|
|
- // fixed-line and mobile numbers by looking at the phone number itself.
|
|
|
|
- case PhoneNumberUtil::FIXED_LINE_OR_MOBILE:
|
|
|
|
- return "fixed-line-or-mobile";
|
|
|
|
- // Freephone lines
|
|
|
|
- case PhoneNumberUtil::TOLL_FREE:
|
|
|
|
- return "toll-free";
|
|
|
|
- case PhoneNumberUtil::PREMIUM_RATE:
|
|
|
|
- return "premium-rate";
|
|
|
|
- // The cost of this call is shared between the caller and the recipient, and
|
|
|
|
- // is hence typically less than PREMIUM_RATE calls. See
|
|
|
|
- // http://en.wikipedia.org/wiki/Shared_Cost_Service for more information.
|
|
|
|
- case PhoneNumberUtil::SHARED_COST:
|
|
|
|
- return "shared-cost";
|
|
|
|
- // Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
|
|
|
|
- case PhoneNumberUtil::VOIP:
|
|
|
|
- return "voip";
|
|
|
|
- // A personal number is associated with a particular person, and may be
|
|
|
|
- // routed to either a MOBILE or FIXED_LINE number. Some more information can
|
|
|
|
- // be found here: http://en.wikipedia.org/wiki/Personal_Numbers
|
|
|
|
- case PhoneNumberUtil::PERSONAL_NUMBER:
|
|
|
|
- return "personal-number";
|
|
|
|
- case PhoneNumberUtil::PAGER:
|
|
|
|
- return "pager";
|
|
|
|
- // Used for "Universal Access Numbers" or "Company Numbers". They may be
|
|
|
|
- // further routed to specific offices, but allow one number to be used for a
|
|
|
|
- // company.
|
|
|
|
- case PhoneNumberUtil::UAN:
|
|
|
|
- return "uan";
|
|
|
|
- // Used for "Voice Mail Access Numbers".
|
|
|
|
- case PhoneNumberUtil::VOICEMAIL:
|
|
|
|
- return "voicemail";
|
|
|
|
- // A phone number is of type UNKNOWN when it does not fit any of the known
|
|
|
|
- // patterns for a specific region.
|
|
|
|
- case PhoneNumberUtil::UNKNOWN:
|
|
|
|
- return "unknown";
|
|
|
|
- }
|
|
|
|
|
|
+ case PhoneNumberUtil::FIXED_LINE:
|
|
|
|
+ return "fixed-line";
|
|
|
|
+ case PhoneNumberUtil::MOBILE:
|
|
|
|
+ return "mobile";
|
|
|
|
+ // In some regions (e.g. the USA), it is impossible to distinguish between
|
|
|
|
+ // fixed-line and mobile numbers by looking at the phone number itself.
|
|
|
|
+ case PhoneNumberUtil::FIXED_LINE_OR_MOBILE:
|
|
|
|
+ return "fixed-line-or-mobile";
|
|
|
|
+ // Freephone lines
|
|
|
|
+ case PhoneNumberUtil::TOLL_FREE:
|
|
|
|
+ return "toll-free";
|
|
|
|
+ case PhoneNumberUtil::PREMIUM_RATE:
|
|
|
|
+ return "premium-rate";
|
|
|
|
+ // The cost of this call is shared between the caller and the recipient, and
|
|
|
|
+ // is hence typically less than PREMIUM_RATE calls. See
|
|
|
|
+ // http://en.wikipedia.org/wiki/Shared_Cost_Service for more information.
|
|
|
|
+ case PhoneNumberUtil::SHARED_COST:
|
|
|
|
+ return "shared-cost";
|
|
|
|
+ // Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
|
|
|
|
+ case PhoneNumberUtil::VOIP:
|
|
|
|
+ return "voip";
|
|
|
|
+ // A personal number is associated with a particular person, and may be
|
|
|
|
+ // routed to either a MOBILE or FIXED_LINE number. Some more information can
|
|
|
|
+ // be found here: http://en.wikipedia.org/wiki/Personal_Numbers
|
|
|
|
+ case PhoneNumberUtil::PERSONAL_NUMBER:
|
|
|
|
+ return "personal-number";
|
|
|
|
+ case PhoneNumberUtil::PAGER:
|
|
|
|
+ return "pager";
|
|
|
|
+ // Used for "Universal Access Numbers" or "Company Numbers". They may be
|
|
|
|
+ // further routed to specific offices, but allow one number to be used for a
|
|
|
|
+ // company.
|
|
|
|
+ case PhoneNumberUtil::UAN:
|
|
|
|
+ return "uan";
|
|
|
|
+ // Used for "Voice Mail Access Numbers".
|
|
|
|
+ case PhoneNumberUtil::VOICEMAIL:
|
|
|
|
+ return "voicemail";
|
|
|
|
+ // A phone number is of type UNKNOWN when it does not fit any of the known
|
|
|
|
+ // patterns for a specific region.
|
|
|
|
+ case PhoneNumberUtil::UNKNOWN:
|
|
|
|
+ return "unknown";
|
|
|
|
+ }
|
|
return "unknown";
|
|
return "unknown";
|
|
}
|
|
}
|
|
-int telnum_possible(char* number, char* region)
|
|
|
|
|
|
+int telnum_possible(char *number, char *region)
|
|
{
|
|
{
|
|
string numStr(number);
|
|
string numStr(number);
|
|
string regionStr(region);
|
|
string regionStr(region);
|
|
@@ -91,14 +92,15 @@ int telnum_possible(char* number, char* region)
|
|
return (isPossible ? 1 : 0);
|
|
return (isPossible ? 1 : 0);
|
|
}
|
|
}
|
|
|
|
|
|
-char* telnum_cc(char* number)
|
|
|
|
|
|
+char *telnum_cc(char *number)
|
|
{
|
|
{
|
|
string numStr(number);
|
|
string numStr(number);
|
|
string defaultRegion("ZZ");
|
|
string defaultRegion("ZZ");
|
|
PhoneNumber parsedNumber;
|
|
PhoneNumber parsedNumber;
|
|
|
|
|
|
- PhoneNumberUtil::ErrorType error = _phoneUtil.Parse(numStr, defaultRegion, &parsedNumber);
|
|
|
|
- if (error != PhoneNumberUtil::NO_PARSING_ERROR) {
|
|
|
|
|
|
+ PhoneNumberUtil::ErrorType error =
|
|
|
|
+ _phoneUtil.Parse(numStr, defaultRegion, &parsedNumber);
|
|
|
|
+ if(error != PhoneNumberUtil::NO_PARSING_ERROR) {
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
string regionCode;
|
|
string regionCode;
|
|
@@ -106,36 +108,41 @@ char* telnum_cc(char* number)
|
|
return strdup(regionCode.c_str());
|
|
return strdup(regionCode.c_str());
|
|
}
|
|
}
|
|
|
|
|
|
-telnum_t* telnum_parse(char* number, char* region)
|
|
|
|
|
|
+telnum_t *telnum_parse(char *number, char *region)
|
|
{
|
|
{
|
|
string numStr(number);
|
|
string numStr(number);
|
|
string regionStr(region);
|
|
string regionStr(region);
|
|
|
|
|
|
PhoneNumber parsedNumber;
|
|
PhoneNumber parsedNumber;
|
|
- PhoneNumberUtil::ErrorType error = _phoneUtil.Parse(numStr, regionStr, &parsedNumber);
|
|
|
|
- telnum_t* res = telnum_new(number);
|
|
|
|
- if(res==NULL) {
|
|
|
|
|
|
+ PhoneNumberUtil::ErrorType error =
|
|
|
|
+ _phoneUtil.Parse(numStr, regionStr, &parsedNumber);
|
|
|
|
+ telnum_t *res = telnum_new(number);
|
|
|
|
+ if(res == NULL) {
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
- if (error != PhoneNumberUtil::NO_PARSING_ERROR) {
|
|
|
|
|
|
+ if(error != PhoneNumberUtil::NO_PARSING_ERROR) {
|
|
string error = "Parsing number failed";
|
|
string error = "Parsing number failed";
|
|
res->error = strdup(error.c_str());
|
|
res->error = strdup(error.c_str());
|
|
return res;
|
|
return res;
|
|
}
|
|
}
|
|
- if (!_phoneUtil.IsValidNumber(parsedNumber)) {
|
|
|
|
|
|
+ if(!_phoneUtil.IsValidNumber(parsedNumber)) {
|
|
string error = "Invalid number";
|
|
string error = "Invalid number";
|
|
res->error = strdup(error.c_str());
|
|
res->error = strdup(error.c_str());
|
|
return res;
|
|
return res;
|
|
}
|
|
}
|
|
res->valid = 1;
|
|
res->valid = 1;
|
|
string formattedNumberE164, formattedNumberNational;
|
|
string formattedNumberE164, formattedNumberNational;
|
|
- _phoneUtil.Format(parsedNumber, PhoneNumberUtil::E164, &formattedNumberE164);
|
|
|
|
- _phoneUtil.Format(parsedNumber, PhoneNumberUtil::NATIONAL, &formattedNumberNational);
|
|
|
|
|
|
+ _phoneUtil.Format(
|
|
|
|
+ parsedNumber, PhoneNumberUtil::E164, &formattedNumberE164);
|
|
|
|
+ _phoneUtil.Format(
|
|
|
|
+ parsedNumber, PhoneNumberUtil::NATIONAL, &formattedNumberNational);
|
|
res->normalized = strdup(formattedNumberE164.c_str());
|
|
res->normalized = strdup(formattedNumberE164.c_str());
|
|
res->natnum = strdup(formattedNumberNational.c_str());
|
|
res->natnum = strdup(formattedNumberNational.c_str());
|
|
- string descNumber = _phoneGeoCoder->GetDescriptionForNumber(parsedNumber, Locale("en"));
|
|
|
|
|
|
+ string descNumber =
|
|
|
|
+ _phoneGeoCoder->GetDescriptionForNumber(parsedNumber, Locale("en"));
|
|
res->ndesc = strdup(descNumber.c_str());
|
|
res->ndesc = strdup(descNumber.c_str());
|
|
- res->ltype = strdup(telnum_linetype(_phoneUtil.GetNumberType(parsedNumber)));
|
|
|
|
|
|
+ res->ltype =
|
|
|
|
+ strdup(telnum_linetype(_phoneUtil.GetNumberType(parsedNumber)));
|
|
// res->cctel = _phoneUtil.GetCountryCodeForRegion(regionStr);
|
|
// res->cctel = _phoneUtil.GetCountryCodeForRegion(regionStr);
|
|
string regionCode;
|
|
string regionCode;
|
|
_phoneUtil.GetRegionCodeForNumber(parsedNumber, ®ionCode);
|
|
_phoneUtil.GetRegionCodeForNumber(parsedNumber, ®ionCode);
|
|
@@ -145,10 +152,10 @@ telnum_t* telnum_parse(char* number, char* region)
|
|
return res;
|
|
return res;
|
|
}
|
|
}
|
|
|
|
|
|
-telnum_t* telnum_new(char* number)
|
|
|
|
|
|
+telnum_t *telnum_new(char *number)
|
|
{
|
|
{
|
|
- telnum_t* tn = (telnum_t*)malloc(sizeof(telnum_t));
|
|
|
|
- if(tn==NULL) {
|
|
|
|
|
|
+ telnum_t *tn = (telnum_t *)malloc(sizeof(telnum_t));
|
|
|
|
+ if(tn == NULL) {
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
tn->valid = 0;
|
|
tn->valid = 0;
|
|
@@ -163,30 +170,30 @@ telnum_t* telnum_new(char* number)
|
|
return tn;
|
|
return tn;
|
|
}
|
|
}
|
|
|
|
|
|
-void telnum_free(telnum_t* tn)
|
|
|
|
|
|
+void telnum_free(telnum_t *tn)
|
|
{
|
|
{
|
|
- if(tn==NULL) {
|
|
|
|
|
|
+ if(tn == NULL) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (tn->number) {
|
|
|
|
|
|
+ if(tn->number) {
|
|
free(tn->number);
|
|
free(tn->number);
|
|
}
|
|
}
|
|
- if (tn->normalized) {
|
|
|
|
|
|
+ if(tn->normalized) {
|
|
free(tn->normalized);
|
|
free(tn->normalized);
|
|
}
|
|
}
|
|
- if (tn->error) {
|
|
|
|
|
|
+ if(tn->error) {
|
|
free(tn->error);
|
|
free(tn->error);
|
|
}
|
|
}
|
|
- if (tn->ltype) {
|
|
|
|
|
|
+ if(tn->ltype) {
|
|
free(tn->ltype);
|
|
free(tn->ltype);
|
|
}
|
|
}
|
|
- if (tn->ndesc) {
|
|
|
|
|
|
+ if(tn->ndesc) {
|
|
free(tn->ndesc);
|
|
free(tn->ndesc);
|
|
}
|
|
}
|
|
- if (tn->ccname) {
|
|
|
|
|
|
+ if(tn->ccname) {
|
|
free(tn->ccname);
|
|
free(tn->ccname);
|
|
}
|
|
}
|
|
- if (tn->natnum) {
|
|
|
|
|
|
+ if(tn->natnum) {
|
|
free(tn->natnum);
|
|
free(tn->natnum);
|
|
}
|
|
}
|
|
free(tn);
|
|
free(tn);
|