示例#1
0
文件: unzip.cpp 项目: luaman/modplug
CZipArchive::CZipArchive(FileReader &file) : ArchiveBase(file)
//------------------------------------------------------------
{
	zlib_filefunc_def functions =
	{
		ZipFileAbstraction::fopen_mem,
		ZipFileAbstraction::fread_mem,
		ZipFileAbstraction::fwrite_mem,
		ZipFileAbstraction::ftell_mem,
		ZipFileAbstraction::fseek_mem,
		ZipFileAbstraction::fclose_mem,
		ZipFileAbstraction::ferror_mem,
		&inFile
	};
	zipFile = unzOpen2(nullptr, &functions);

	if(zipFile == nullptr)
	{
		return;
	}

	// read comment
	{
		unz_global_info info;
		if(unzGetGlobalInfo(zipFile, &info) == UNZ_OK)
		{
			if(info.size_comment > 0)
			{
				if(info.size_comment < Util::MaxValueOfType(info.size_comment))
				{
					info.size_comment++;
				}
				std::vector<char> commentData(info.size_comment);
				if(unzGetGlobalComment(zipFile, &commentData[0], info.size_comment) >= 0)
				{
					commentData[info.size_comment - 1] = '\0';
					comment = mpt::ToWide(mpt::CharsetCP437, &commentData[0]);
				}
			}
		}
	}

	// read contents
	unz_file_pos curFile;
	int status = unzGoToFirstFile(zipFile);
	unzGetFilePos(zipFile, &curFile);

	while(status == UNZ_OK)
	{
		ArchiveFileInfo fileinfo;

		fileinfo.type = ArchiveFileNormal;
		
		unz_file_info info;
		char name[256];
		unzGetCurrentFileInfo(zipFile, &info, name, sizeof(name), nullptr, 0, nullptr, 0);
		fileinfo.name = mpt::PathString::FromWide(mpt::ToWide(mpt::CharsetCP437, std::string(name)));
		fileinfo.size = info.uncompressed_size;

		unzGetFilePos(zipFile, &curFile);
		fileinfo.cookie1 = curFile.pos_in_zip_directory;
		fileinfo.cookie2 = curFile.num_of_file;

		contents.push_back(fileinfo);

		status = unzGoToNextFile(zipFile);
	}

}
/*----------------------------------------------------------------------------*/
bool KsefBillItem :: assign(QDomElement& element)
{
  mN = element.attribute("N").toInt();
  switch(type())
  {
  case Sale:
  {
    SaleData *data = saleData();
    data->C = element.attribute("C").toInt();
    data->CD = element.attribute("CD");
    data->NM = element.attribute("NM");
    data->PRC = element.attribute("PRC").toInt();
    data->Q = element.attribute("Q").toInt();
    data->RT = element.attribute("RT").toInt();
    data->SM = element.attribute("SM").toInt();
    data->TX = element.attribute("TX").toInt();
    data->TX2 = element.attribute("TX2").toInt();
    break;
  }
  case Comment:
  {
    CommentData *data = commentData();
    data->TXT = element.text();
    break;
  }
  case Discount:
  {
    DiscountData *data = discountData();
    data->PR = element.attribute("PR").toInt();
    data->S = element.tagName() == "M";
    data->SM = element.attribute("SM").toInt();
    data->ST = element.attribute("ST").toInt();
    data->TR = element.attribute("TR").toInt();
    data->TY = element.attribute("TY").toInt();
    break;
  }
  case Sum:
  {
    SumData *data = sumData();
    data->CS = element.attribute("CS").toInt();
    data->NO = element.attribute("NO").toInt();
    data->SE = element.attribute("SE").toInt();
    data->SM = element.attribute("SM").toInt();
    //YYYYMMDDhhmmss
    QString t = element.attribute("TS");
    if(t.length() == 14)
    {
      int Y; int M; int D;
      int h, m, s;
      Y = t.left(4).toInt();
      M = t.mid(4, 2).toInt();
      D = t.mid(6, 2).toInt();
      h = t.mid(8, 2).toInt();
      m = t.mid(10, 2).toInt();
      s = t.mid(12, 2).toInt();

      data->TS.setDate(QDate(Y, M, D));
      data->TS.setTime(QTime(h, m, s, 0));
    }
    break;
  }
  case Tax:
  {
    TaxData *data = taxData();
    data->DTPR = element.attribute("DTPR").toInt();
    data->DTSM = element.attribute("DTSM").toInt();
    data->TX = element.attribute("TX").toInt();
    data->TXAL = element.attribute("TXAL").toInt();
    data->TXPR = element.attribute("TXPR").toInt();
    data->TXSM = element.attribute("TXSM").toInt();
    data->TXTY = element.attribute("TXTY").toInt();
    break;
  }
  case SaleFuel:
  {
    SaleFuelData *data = saleFuelData();
    data->C = element.attribute("C").toInt();
    data->CD = element.attribute("CD");
    data->KRK = element.attribute("KRK").toInt();
    data->NM = element.attribute("NM");
    data->OV = element.attribute("OV");
    data->PRC = element.attribute("PRC").toInt();
    data->PRK = element.attribute("PRK").toInt();
    data->Q = element.attribute("Q").toInt();
    data->SM = element.attribute("SM").toInt();
    data->TX = element.attribute("TX").toInt();
    data->TX2 = element.attribute("TX2").toInt();
    break;
  }
  case Payment:
  {
    PaymentData *data = paymentData();
    data->NM = element.attribute("NM");
    data->RM = element.attribute("RM").toInt();
    data->RRN = element.attribute("RRN");
    data->SM = element.attribute("SM").toInt();
    data->T = element.attribute("T").toInt();
    break;
  }
  case Receive:
  {
    ReseiveData *data = reseiveData();
    data->O = element.text() == "O";
    data->SM = element.attribute("SM").toInt();
    break;
  }
  case Deliver:
  {
    DeliverData *data = deliverData();
    data->C = element.attribute("C").toInt();
    data->NM = element.attribute("NM");
    data->NR = element.attribute("NR").toInt();
    data->OV = element.attribute("OV");
    data->Q = element.attribute("Q").toInt();
    break;
  }
  case PumpCheck:
  {
    PumpCheckData *data = pumpCheckData();
    data->C = element.attribute("C").toInt();
    data->KRK = element.attribute("KRK").toInt();
    data->NM = element.attribute("NM");
    data->OV = element.attribute("OV");
    data->PRK = element.attribute("PRK").toInt();
    data->Q = element.attribute("Q").toInt();
    break;
  }
  case ZTax:
  {
    ZTaxData *data = zTaxData();
    data->DTI = element.attribute("DTI").toInt();
    data->DTO = element.attribute("DTO").toInt();
    data->DTPR = element.attribute("DTPR").toInt();
    data->SMI = element.attribute("SMI").toInt();
    data->SMO = element.attribute("SMO").toInt();
    data->TX = element.attribute("TX").toInt();
    data->TXAL = element.attribute("TXAL").toInt();
    data->TXI = element.attribute("TXI").toInt();
    data->TXO = element.attribute("TXO").toInt();
    data->TXPR = element.attribute("TXPR").toInt();
    data->TXTY = element.attribute("TXTY").toInt();
    //YYYYMMDD
    QString t = element.attribute("TS");
    if(t.length() == 8)
    {
      int Y; int M; int D;
      Y = t.left(4).toInt();
      M = t.mid(4, 2).toInt();
      D = t.mid(6, 2).toInt();

      data->TS = QDate(Y, M, D);
    }
    break;
  }
  case ZReceive:
  {
    ZReseiveData *data = zReseiveData();
    data->SMI = element.attribute("SMI").toInt();
    data->SMO = element.attribute("SMO").toInt();
    break;
  }
  case ZBillCount:
  {
    ZBillCountData *data  = zBillCountData();
    data->NI = element.attribute("NI").toInt();
    data->NO = element.attribute("NO").toInt();
    break;
  }
  case ZPayment:
  {
    ZPaymentData *data = zPaymentData();
    data->NM = element.attribute("NM");
    data->SMI = element.attribute("SMI").toInt();
    data->SMO = element.attribute("SMO").toInt();
    data->T = element.attribute("T").toInt();
    break;
  }
  case ZFuel:
  {
    ZFuelData *data = zFuelData();
    data->C = element.attribute("C").toInt();
    data->IF = element.attribute("IF").toInt();
    data->NM = element.attribute("NM");
    data->OF = element.attribute("OF").toInt();
    data->OFP = element.attribute("OFP").toInt();
    data->SF = element.attribute("SF").toInt();
    data->SMI = element.attribute("SMI").toInt();
    break;
  }
  case ZTank:
  {
    ZTankData *data = zTankData();
    data->C = element.attribute("C").toInt();
    data->NR = element.attribute("NR").toInt();
    data->SF = element.attribute("SF").toInt();
    break;
  }
  case ZFPayment:
  {
    ZFPaymentData *data = zFPaymentData();
    data->C = element.attribute("C").toInt();
    data->NM = element.attribute("NM");
    data->OF = element.attribute("OF").toInt();
    data->SM = element.attribute("SM").toInt();
    data->T = element.attribute("T").toInt();
    break;
  }
  case ZPump:
  {
    ZPumpData *data = zPumpData();
    data->NP = element.attribute("NP").toInt();
    data->NR = element.attribute("NR").toInt();
    break;
  }
  default:
    return false;
  }
  return true;
}