
Опытный
 
Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев
Репутация: 9 Всего: 23
|
Помогите! Дали мне класс принтера, но он для матричников и печати на рулоне. А надо дописать, чтобы он поддерживал графпечать (лазерные, струйники). Да и вообще сказали, что сам класс тоже бы переписать не помешало ибо его кривовато написали. Вот так. P.S.Может этот вопрос покажется глупым, то так напишите А вот этот кривой класс //----Код-- | Код | #include "Printer.h" #include<stdio.h> #include <io.h> #include <fcntl.h>
CPrinter::CPrinter() { pParamList = new Queue; }
CPrinter::~CPrinter() { Queue* ptTestArray=pParamList; Queue* ptOldArray=pParamList; if(ptTestArray->NextComponent!=NULL) { ptTestArray=ptTestArray->NextComponent; while(ptTestArray!=NULL) { ptOldArray=ptTestArray; if(ptTestArray->Buf!=NULL) delete(ParamVar*)ptTestArray->Buf; ptTestArray=ptTestArray->NextComponent; delete ptOldArray; } } if(pParamList->Buf!=NULL) delete (ParamVar*)pParamList->Buf; delete pParamList; }
int CPrinter::GetPrintData(char* FileName,PRINTERDATA &TerminalPrintData, char *OutData) { unsigned int File; char strLine[255]; OutData[0]=0; pPrinterData=&TerminalPrintData; File=open(FileName,O_BINARY|O_RDONLY); if(File!=-1) { int Point=0; memset(strLine, 0, sizeof(strLine)); while(read(File,&strLine[Point++],1)!=0) { if((strLine[Point-1]==0x0D)||(strLine[Point-1]==0x0A)) { strLine[Point-1]=0; TranslateLine(strLine,OutData); Point=0; } } int TmpLen=strlen(OutData); OutData[TmpLen++]='\n'; //0x0c; OutData[TmpLen]=0x0; close(File); return 0; } return -1; }
int CPrinter::TranslateLine(char *strLine, char *OutData) { int NumberFild=0; short maxlen = 255; char strWorld[255];
if(!SeparateWorld(NumberFild,strLine,strWorld,maxlen)) { if(!strcmp(strWorld,"var")) { ParamVar Var; if(SeparateWorld(1,strLine,strWorld,maxlen)) return 1; if(strWorld[0]!='@') return 1; strWorld[16]=0; strcpy(Var.VarName,strWorld);
if(SeparateWorld(2,strLine,strWorld,maxlen)) return 1; strWorld[50]=0; strcpy(Var.VarId,strWorld);
if(SeparateWorld(3,strLine,strWorld,maxlen)) return 1; strWorld[16]=0; strcpy(Var.VarType,strWorld);
if(SeparateWorld(4,strLine,strWorld,maxlen)) return 1; strWorld[16]=0; Var.VarLen=atoi(strWorld);
if(SeparateWorld(5,strLine,strWorld,maxlen)) return 0; strWorld[16]=0; strcpy(Var.VarPlaceType,strWorld);
if(SeparateWorld(6,strLine,strWorld,maxlen)) return 0; //strWorld[16]=0; strcpy(Var.VarMetodVisualisation,strWorld); AddParamVar(Var); return 0; } else { char PrintData[255]; memset(PrintData, 0, sizeof(PrintData)); if(!strcmp(strWorld,"print")) { if(SeparateLine(strLine,PrintData)) return 1; char LoadData[255]; LoadPrintData(PrintData,LoadData); strcpy(&OutData[strlen(OutData)],PrintData); return 0; } else { return 0; }
} } return 1; }
int CPrinter::SeparateWorld(int NumberField, char *strLine, char *strWorld, short maxlen) { memset(strWorld, 0, maxlen+1); int Point=0; int PointWorld=0; int Number=0; while(strLine[Point]!=0 && Point<=maxlen) { while((strLine[Point]==' ')||(strLine[Point]==',')) Point++; while((strLine[Point]!=' ')&&(strLine[Point]!=0)&&(strLine[Point]!=',')) { if(Number==NumberField) { strWorld[PointWorld++]=strLine[Point]; } Point++; } strWorld[PointWorld]=0; if(Number==NumberField) return 0; if(strLine[Point]==0) return 1; Number++; } return 1; }
int CPrinter::LoadPrintData(char *PrintData, char *OutData) { int Point=0; int CursorPoint=0; CPrinter::ParamVar Var; strcpy(OutData,PrintData); for(;;) { while((PrintData[Point]!='@')&&(PrintData[Point]!=0)) Point++; if (PrintData[Point]==0) { // PrintData[Point++]=0x0D; PrintData[Point++]=0x0A; PrintData[Point]=0; return 0; } int Place = Point; char TmpBuf[255]; int TmpNumber=0; TmpBuf[TmpNumber++]=PrintData[Point++]; while((PrintData[Point]>=0x30)&&(PrintData[Point]<=0x39)) { TmpBuf[TmpNumber++]=PrintData[Point++]; } TmpBuf[TmpNumber]=0; if(GetParamVar(TmpBuf,Var)) return 1; char strOut[16]; GetPrintParam(Var,strOut); if(Var.VarType[0] =='C') { int Len=strlen(strOut); int LenOll=strlen(PrintData); strcpy(TmpBuf,&PrintData[Point]); strcpy(&PrintData[Place+Len],TmpBuf); PrintData[LenOll]=0; } int NewPoint=0; CursorPoint=Point+strlen(strOut); while(strOut[NewPoint]!=0) PrintData[Place++]=strOut[NewPoint++]; }
}
int CPrinter::AddParamVar(CPrinter::ParamVar &Var) { Queue* pQueue=new Queue; ParamVar* pParamVar=new ParamVar; *pParamVar=Var; pQueue->Buf=pParamVar; pQueue->NextComponent=pParamList->NextComponent; pParamList->NextComponent=pQueue; return 0; }
int CPrinter::GetParamVar(char *TmpBuf, CPrinter::ParamVar& Var) { Queue* ptTestArray=pParamList; ParamVar* ptAddress; while(ptTestArray->NextComponent!=NULL) { ptTestArray=ptTestArray->NextComponent; ptAddress=(ParamVar*)ptTestArray->Buf; if(strcmp(ptAddress->VarName,TmpBuf)==0) { Var=*ptAddress; return 0; } } return 1; }
int CPrinter::GetPrintParam(CPrinter::ParamVar& Var, char* strOut) { char TmpBuf[128]; memset(TmpBuf, 0, sizeof(TmpBuf)); for(;;) { if (!stricmp(Var.VarId, "Number")) strcpy(TmpBuf, pPrinterData->Number); else if (!stricmp(Var.VarId, "RRN")) strcpy(TmpBuf, pPrinterData->RRN); else if (!stricmp(Var.VarId, "PAN")) strcpy(TmpBuf, pPrinterData->PAN); else if (!stricmp(Var.VarId, "EXP")) strcpy(TmpBuf, pPrinterData->EXP); else if (!stricmp(Var.VarId, "Date")) strcpy(TmpBuf, pPrinterData->Date); else if (!stricmp(Var.VarId, "Time")) strcpy(TmpBuf, pPrinterData->Time); else if (!stricmp(Var.VarId, "Amount")) strcpy(TmpBuf, pPrinterData->Amount); else if (!stricmp(Var.VarId, "Summ")) strcpy(TmpBuf, pPrinterData->Summ); else if (!stricmp(Var.VarId, "Persent")) strcpy(TmpBuf, pPrinterData->Persent); else if (!stricmp(Var.VarId, "AmountCurrency")) strcpy(TmpBuf, pPrinterData->AmountCurrency); else if (!stricmp(Var.VarId, "TerminalId")) strcpy(TmpBuf, pPrinterData->TerminalId); else if (!stricmp(Var.VarId, "MerchantId")) strcpy(TmpBuf, pPrinterData->MerchantId); else if (!stricmp(Var.VarId, "CardType")) strcpy(TmpBuf, pPrinterData->CardType); else if (!stricmp(Var.VarId, "ActionCode")) strcpy(TmpBuf, pPrinterData->ActionCode); else if (!stricmp(Var.VarId, "ApprovalCode")) strcpy(TmpBuf, pPrinterData->ApprovalCode); else
if (!stricmp(Var.VarId, "ArticleName")) strcpy(TmpBuf, pPrinterData->ArticleName); else
if (!stricmp(Var.VarId, "ArticleSerial")) strcpy(TmpBuf, pPrinterData->ArticleSerial); else
if (!stricmp(Var.VarId, "ArticleADD_1")) strcpy(TmpBuf, pPrinterData->ArticleADD_1); else
if (!stricmp(Var.VarId, "ArticleADD_2")) strcpy(TmpBuf, pPrinterData->ArticleADD_2); else
if (!stricmp(Var.VarId, "Reconciliation")) strcpy(TmpBuf, pPrinterData->Reconciliation); else
if (!stricmp(Var.VarId, "Name")) strcpy(TmpBuf, pPrinterData->Name); else
if (!stricmp(Var.VarId, "Comment")) strcpy(TmpBuf, pPrinterData->Comment);
int Len=strlen(TmpBuf); if(Var.VarLen==0) { strcpy(strOut,TmpBuf); return 0; } if(Len>Var.VarLen) { TmpBuf[Var.VarLen]=0; strcpy(strOut,TmpBuf); return 0; }
//------------------ Visualisation --------------------- if (strlen(Var.VarMetodVisualisation)) { int len = strlen(Var.VarMetodVisualisation) >= Var.VarLen ? Var.VarLen: strlen(Var.VarMetodVisualisation);
for (int i=0; i<len; i++) { if (Var.VarMetodVisualisation[i+1]=='X' || Var.VarMetodVisualisation[i+1]=='x') TmpBuf[i]=Var.VarMetodVisualisation[i+1]; } } //------------------------------------------------------
if(!strcmp(Var.VarPlaceType,"right")) { int offset=Var.VarLen-Len; int Loop; for(Loop=0;Loop<offset;Loop++) strOut[Loop]=' '; strcpy(&strOut[offset],TmpBuf); return 0; } if(!strcmp(Var.VarPlaceType,"center")) { int offset=Var.VarLen / 2 - Len / 2; int Loop; for(Loop=0;Loop<offset;Loop++) strOut[Loop]=' '; strcpy(&strOut[offset],TmpBuf); return 0; }
if(!strcmp(Var.VarPlaceType,"left")) { int Loop; strcpy(strOut,TmpBuf); for(Loop=Len;Loop<Var.VarLen;Loop++) strOut[Loop]=' '; strOut[Var.VarLen]=0; return 0; }
} }
int CPrinter::SeparateLine(char *strLine, char *PrintData) { int Point=0; int PointWorld=0; if(strLine[Point]!=0) { while(strLine[Point]!='"') Point++; Point++; PrintData[PointWorld++]=strLine[Point++]; while((strLine[Point]!='"')&&(strLine[Point]!=0)) { PrintData[PointWorld++]=strLine[Point]; Point++; } PrintData[PointWorld]=0; if(strLine[Point]==0) return 1; return 0; } return 1; }
|
//----Заголовочный файл | Код | #include<stdio.h> #include<stdlib.h> #include<string.h>
struct PRINTERDATA { char Number[20]; char PAN[20]; char EXP[10]; char RRN[20]; char Date[10]; char Time[10]; char Summ[20]; char Persent[20]; char Amount[20]; char AmountCurrency[20]; char TerminalId[20]; char MerchantId[20]; char CardType[20]; char ActionCode[20]; char ApprovalCode[20]; char Comment[0xFF]; char ArticleName[40]; char ArticleSerial[40]; char ArticleADD_1[40]; char ArticleADD_2[40]; char Reconciliation[10]; char Name[40];
PRINTERDATA() { memset(this, 0, sizeof(PRINTERDATA)); }; };
class CPrinter { public: struct Queue { void* Buf; Queue* NextComponent; Queue() { Buf=NULL; NextComponent=NULL; } };
struct ParamVar { char VarName[16]; char VarId[100]; char VarType[16]; int VarLen; char VarPlaceType[16]; char VarMetodVisualisation[128]; };
public: int GetParamVar(char*TmpBuf,ParamVar& Var); int TranslateLine(char* strLine,char* OutData); int GetPrintData(char* FileName,PRINTERDATA& TerminalPrintData, char* OutData); CPrinter(); virtual ~CPrinter(); protected: int SeparateLine(char* strLine,char* PrintData); int GetPrintParam(ParamVar& Var, char* strOut); Queue* pParamList; PRINTERDATA* pPrinterData; int AddParamVar(ParamVar& Var); int LoadPrintData(char* PrintData,char* OutData); int SeparateWorld(int NumberField,char*strLine,char*strWorld, short maxlen); };
|
--------------------
Имеющий язык - да не убоится спросить! 
|