Files
src-1.2/external/3rd/library/soePlatform/ChatAPI/utils/Base/ccspanutil.cpp
T

166 lines
4.0 KiB
C++

#include "ccspanutil.h"
#include <stdlib.h>
#include <string.h>
#ifdef EXTERNAL_DISTRO
namespace NAMESPACE
{
#endif
namespace Base
{
char * CSpanUtil::getDescriptionFromCardNum(const char *cardNum)
{
// if the card number is less than this we wont be able to determine it, and we dont want to crash so . . .
if(strlen(cardNum) < 8 )
return "Credit Card";
switch(cardNum[0])
{
case '3':
if(cardNum[1] == '4')
return "AMEX";
if(cardNum[1] == '7')
{
// RG 5/9 changed to fix rrc=233. We do not support OP anyway.
// Card prefix check is unclear.
//
// if(cardNum[3] == '7')
// return "OP";
// else
return "AMEX";
}
if((cardNum[1] == '0') || (cardNum[1] == '6'))
return "DINERS";
if(cardNum[1] == '8')
{
if((cardNum[2] >= '1') && (cardNum[2] <= '8'))
return "DINERS";
}
if(cardNum[1] == '5')
{
char temp[3];
memcpy(temp, &cardNum[2], 2);
temp[2] = 0;
int value = atoi(temp);
if((value >= 28) && (value <= 89))
return "JCB";
}
break;
case '4':
// RG 5/6 changed to fix rrc=233. We do not support SW anyway.
// Card prefix check is unclear.
//
// if(cardNum[1] == '9')
// return "SW";
// else
return "VISA";
break;
case '5':
if(cardNum[1] == '6')
return "Switch/solo";
if((cardNum[1] >= '1') && (cardNum[1] <= '5'))
return "MC";
if(memcmp(cardNum, "504990", 6) == 0)
return "Bill me Later";
break;
case '6':
{
char temp[8];
memcpy(temp, cardNum, 7);
temp[7] = 0;
int value7 = atoi(temp);
temp[6] = 0;
int value6 = atoi(temp);
temp[5] = 0;
int value5 = atoi(temp);
// september 29 2005 added new card IIN ranges for Discover per email from
// paymentTech email effective Oct 1, 2005
if((value5 == 60110) ||
(value5 == 60112) ||
(value5 == 60113) ||
(value5 == 60114) ||
(value5 == 60115) ||
(value5 == 60116) ||
(value6 == 601174) ||
(value6 >= 601177 && value6 <= 601179) ||
(value6 >=601186 && value6 <= 600189) ||
(value5 == 60119) ||
(value6 >= 650000 && value6 <=650999))
return "DISCOVER";
if(value6 == 603571)
return "Saved Value";
return "Switch/Solo";
}
break;
case '7':
return "Switch/Solo";
break;
case '9':
//if((cardNum[1] == '4') && (cardNum[1] == '5'))
return "Carte Blanche";
break;
}
return "Credit Card";
}
// generates a credit card span for an account number string up to a length of any size.
std::string CSpanUtil::generateCCSpan(std::string cardNumber)
{
// according to the PCI standard on visa's web site, the max number of displayable digits for a cc are the first 6 and last 4
// we will however require that at least the middle half of the card is not shown
std::string ccSpan;
const std::string asteriks = "*";
// if the length of the card is an odd number we will display the larger portion of the card on the front viewable amount.
// for Amex this will look like 1234********123
// on a 16 digit card, the most digits will be displayed being 1234********1234
// a 12 digit card would look like 123******123
// as per qa request and devtrack bug 2440 masking is first 4 and las 4 visible
unsigned displayableBeginningDigits = 4;
unsigned displayableEndingDigits = 4;
if(cardNumber.length() <= 8)
return cardNumber;
ccSpan = cardNumber.substr(0, displayableBeginningDigits);
unsigned totalMasked = cardNumber.length() - displayableBeginningDigits - displayableEndingDigits;
// now add in characters to mask the middle numbers
for(unsigned maskedDigits = 0; maskedDigits < totalMasked; maskedDigits++)
ccSpan += asteriks;
ccSpan += cardNumber.substr((totalMasked+displayableBeginningDigits));
return ccSpan;
}
std::string CSpanUtil::generateCCDescription(std::string cardNumber)
{
std::string ccDescription;
// get the card type
ccDescription = std::string(getDescriptionFromCardNum(cardNumber.c_str())) + std::string("(") + generateCCSpan(cardNumber) + std::string(")");
return ccDescription;
}
};
#ifdef EXTERNAL_DISTRO
};
#endif