www.pudn.com > isync2[1].0.rar > CTransferCard.cpp


/*************************************************************************************************\
*    文件名称 :CTransferCard.cpp
*    CopyRight (c) 2004 汉王科技公司
*
*    作者    : 王欣
*    创建时间: 2004年09月06日
*    当前版本: 0.1
*
*    说明    :见类头文件说明
*
\**************************************************************************************************/
#include 
#include 
#include "CTransferCard.h"
#include 
#include 

const char *CardDataFile = "../Data/card.dat";
const char *CardGroupsFile = "../Data/Groups.dat";

const int CTransferCard::len;
char CTransferCard::errString[len];
const char *CTransferCard::errInfo[RET_OK + 1] =
{
  "error open database",
  "error read database",
  "error write database",

  "database full"
  "read database over"
  "program return normally"
};

CTransferCard::CTransferCard ()
 : cardDb(CardDataFile)
{
  transfered = 0;
  stat = UN_INITIAL;
}

CTransferCard::~CTransferCard ()
{
  TransferComplete();
  readId = 0;
  transfered = 0;
}

void CTransferCard::AddType (const char *typeName)
{
  typeVct.push_back(typeName);
}

CTransferCard::RetValue_T CTransferCard::InitRead (void)
{
  assert(UN_INITIAL == stat);
  if (cardDb.Open(CDatabase::R) == false)
  {
    return ERR_OPENDB;
  }
  stat = IPHONE_TO_PC;
  readId = cardDb.FindFirst();
  return (0 == readId) ? RET_READ_OVER : RET_OK;
}

CTransferCard::RetValue_T CTransferCard::InitWrite (void)
{
  assert(UN_INITIAL == stat);
  if (cardDb.Open(CDatabase::RW) == false)
  {
    return ERR_OPENDB;
  }
  stat = PC_TO_IPHONE;
  return AddGroupsFromFile(this) ? ERR_READDB : RET_OK;
}

CTransferCard::RetValue_T CTransferCard::ReadCard (CardStruct_T *pcard)
{
  assert(IPHONE_TO_PC == stat);
  if (0 == readId)
  {
    return RET_READ_OVER;
  }
  if (cardDb.Fetch(pcard, readId) == false)
  {
    return ERR_READDB;
  }
  ++transfered;
  readId = cardDb.FindNext(readId);
  return RET_OK;
}

bool CTransferCard::SaveTypeInfo (void)
{
  std::string types;
  for (size_t i = 0; i < typeVct.size(); ++i)
  {
    types += typeVct[i] + ";";
  }
  FILE *pf = fopen(CardGroupsFile, "w");
  if (pf != NULL)
  {
    if (fwrite(types.c_str(), types.size(), 1, pf) < 0)
    {
      perror("In CSettingWnd::WndCallback, fwrite ");
      return false;
    }
    fclose(pf);
  }
  else
  {
    perror("In CSettingWnd::WndCallback, fopen ");
    return false;
  }
  return true;
}

void CTransferCard::TransferComplete (void)
{
  if (stat != UN_INITIAL)
  {
    if (PC_TO_IPHONE == stat)
    {
#ifdef NDEBUG
      SaveTypeInfo();
#else
      bool ret = SaveTypeInfo();
#endif
      assert(true == ret);
    }
    cardDb.Close();
    stat = UN_INITIAL;
  }
}

CTransferCard::RetValue_T CTransferCard::WriteCard (CardStruct_T *pcard)
{
  assert(PC_TO_IPHONE == stat);
  
  size_t ret = cardDb.Insert(pcard);
  switch (ret)
  {
    case CDatabase::DBERR_DATABASE_FULL:
      return RET_DBFULL;
    break;

    case CDatabase::DBERR_READDATA:
    case CDatabase::DBERR_WRITEHEADITEM:
    case CDatabase::DBERR_WRITEDATA:
      return ERR_WRITEDB;
    break;

    default:
    break;
  }
  ++transfered;
  //
  SVIter_T pos_begin = typeVct.begin(), pos_end = typeVct.end();
  if (strcmp(pcard->szType, NoTypeName) != 0 && 
      find(pos_begin, pos_end, pcard->szType) == pos_end)    // it it a new type
  {
    typeVct.push_back(pcard->szType);
  }
  return RET_OK;
}