22hours/typress

[CB] Print버튼누르면 인쇄.(Unhook())

Opened this issue · 17 comments

CB상에서 인쇄

호출과정 : Server-Service -> InterruptLogin -> CB

Server-service에서 하는게 제일깔끔하긴 한데..

사전에 TotalPage수 모두 파악

  • WMI에 TotalPage
  • PDF로 StartPagePrinter 후 실제 Print
  • PrintTicket ?

CB상에서 인쇄,

  • CB Socket이용해서 Data받아온다.
  • if( >=0 ) unhook()

CB Socket에서 로직을 조금 추가해야 겠다.

  • loop 형태도 만들고, if(잔여 프린트물)
  • 지금 현재 마일리지 값을 서버로 전송/수신 해주고,

사용하지 않고 있는 PrinterSocket을 여기서 사용하면 될듯 하다.

  • MyService : Hook 코드 안에 PrinterSocket.Receive()으로 대기
  • CB : Print -> PrinterSocket.Send()

그러면 CB상에서 Socket 2개 필요한가?

  • CB자체 소켓.
  • PrinterSocket 송신용 소켓.

마일리지가 부족할 경우, Print를 아예 취소할 수도 있어야 한다.

PrintController.Receive(); <--- Socket을 통한 대기

  1. if(pk.IsPrint == true) ----잔액확인---> Unhook();
  2. `else printJob.Cancle(); <----잔액없을 경우 || 2분이 초과된 경우
  3. 신호가 장시간 동안 오지 않는 경우 ---> Socket에 2분정도의 시간제한을 걸어야겠다.
    -> Thread.Sleep() 을 통한 Count로 break문 걸면 된다.

PrinterServer (.NET)

  • Network Server
  • Local Server
  1. Service에서 PrintSocket 대기
  2. Hooking 함수에서 Receive
  • WaitForSingleObject()
  • Bit 주는 방식

Return Value를 통해 경우를 조금 더 줄여보자.

image

To-do 정리

  • Real PrintCnt 를 언제 넘겨주어야 하는지? ------> 후불제
  • Real PrintCnt 를 실셈하는 모듈 구현해보기? ----> 후불제
  • PrintJob.Cancle 모듈 구현하기
  • 로그인창이 중도에 끊겼을때, 어떻게 처리할 것인가?
    • Return Value 를 이용할 것인가?
    • Timer을 이용할 것인가?
      -> Thread.Sleep(1000) 을 통한 Cnt++

PrintJob.Cancle 구현 성공.

#25 참고
image

후불제를 했을 때 생기는 문제점

image

  • 지금 현재 UI의 구성을 바꿔야 한다. ------> 이것을 바꾸면 너무 조잡해지지 않나 싶다.
  • DB업데이트를 서버자체에서 해줘야한다. -----> 이정도는 수정 가능.
private void ExecutePrint(object obj)
        {
            if (System.Windows.Forms.MessageBox.Show("출력할 인쇄물이 남았습니까?", "TYPRESS Print", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                System.Windows.Forms.MessageBox.Show("출력을 진행합니다.");

                App.PrintSocketConnect();
                UpdateDB();

                dp.Opt = 1; // 소켓 종료 메세지
                App.SendPacketToServer(dp);
                dp.Opt = 0;

                pp.IsPrinted = true;
                App.SendPrintPacketToServer(pp);
                pp.IsPrinted = false;

                System.Environment.Exit(0);
            }
            else
            {
                App.SendPacketToServer(new DataPacket());
                System.Windows.Forms.MessageBox.Show("로그아웃");
                ViewHandler.OpenLoginViewFromMain();
                System.Environment.Exit(1);
            }
        } 

UI 수정필요

image

  • View Main을 Print위로 합친다.
  • UI상에서 단위를 명확하게 하자. (레이아웃 구성때문에 내가 직접 수정하지 않았음.)

ThreadHandler.PrintedOpt

  • 일단 Monitor는 별도의 스레드로 진행이 된다.
  • Monitor Thread : AddJob을 잡아내고나서, 거기에서 ThreadHandler.PrintedOpt의 값을 기다리며(Timer), Cancle시키는지, Pass하는지(그대로 Print를 하는지)를 기다림.

  • Print를 클릭했는지 ----> 잔액이 남아있는지 -----> 남아있다면 Pass
    -----> 잔액이 없다면 Cancle()
  • Cancle을 클릭했는지 -------------------------------> Cancle()
  • 시간초과, 오류로 연결끊어짐 등 -------------------> Cancle()

To-do (상수화 필요)

  • packet.Opt
  • PrintedOpt
    image
  • MessageBox UI에서 볼 수 있도록 해야 함.

Cancle 시, Hooking 함수에서 WaitOne을 해결해주어야 함.

image

  • Cancle시 무한루프 발생
  • DataPacket에서 bool IsPrinted;를 Int형으로 변환해서 선택지를 늘려야할 듯 하다.
  • Cancle마일리지 부족의 경우에 PrintSocket쪽에 패킷을 전달해주어야 한다.

DvPrinter.Monitor

  • 이 쪽에서 반응을 안한다는 뜻
  • Monitor에서 잡히긴 하는데, if문에 걸리지가 않음.
                        if (bJobRelatedChange == ((pdwChange & PRINTER_CHANGES.PRINTER_CHANGE_ADD_JOB) == PRINTER_CHANGES.PRINTER_CHANGE_ADD_JOB))
                        {
                            int ThreadTimer = 0;
                            while (ThreadHandler.PrintedOpt == (int)PRINTOPT.PRINT_OPT_LISTEN && ThreadTimer <= 60) 
                            {
                                Thread.Sleep(1000);
                                ThreadTimer++;
                            }
                            if(ThreadHandler.PrintedOpt == (int)PRINTOPT.PRINT_OPT_CANCLE || ThreadTimer >= 60) pji.Cancel();
                            ThreadHandler.PrintedOpt = (int)PRINTOPT.PRINT_OPT_LISTEN;
                        }
    public class PRINTER_CHANGES
    {
        public const uint PRINTER_CHANGE_ADD_PRINTER = 1;
        public const uint PRINTER_CHANGE_SET_PRINTER = 2;
        public const uint PRINTER_CHANGE_DELETE_PRINTER = 4;
        public const uint PRINTER_CHANGE_FAILED_CONNECTION_PRINTER = 8;
        public const uint PRINTER_CHANGE_PRINTER = 0xFF;
        public const uint PRINTER_CHANGE_ADD_JOB = 0x100;
        public const uint PRINTER_CHANGE_SET_JOB = 0x200;
        public const uint PRINTER_CHANGE_DELETE_JOB = 0x400;
        public const uint PRINTER_CHANGE_WRITE_JOB = 0x800;
        public const uint PRINTER_CHANGE_JOB = 0xFF00;
        public const uint PRINTER_CHANGE_ADD_FORM = 0x10000;
        public const uint PRINTER_CHANGE_SET_FORM = 0x20000;
        public const uint PRINTER_CHANGE_DELETE_FORM = 0x40000;
        public const uint PRINTER_CHANGE_FORM = 0x70000;
        public const uint PRINTER_CHANGE_ADD_PORT = 0x100000;
        public const uint PRINTER_CHANGE_CONFIGURE_PORT = 0x200000;
        public const uint PRINTER_CHANGE_DELETE_PORT = 0x400000;
        public const uint PRINTER_CHANGE_PORT = 0x700000;
        public const uint PRINTER_CHANGE_ADD_PRINT_PROCESSOR = 0x1000000;
        public const uint PRINTER_CHANGE_DELETE_PRINT_PROCESSOR = 0x4000000;
        public const uint PRINTER_CHANGE_PRINT_PROCESSOR = 0x7000000;
        public const uint PRINTER_CHANGE_ADD_PRINTER_DRIVER = 0x10000000;
        public const uint PRINTER_CHANGE_SET_PRINTER_DRIVER = 0x20000000;
        public const uint PRINTER_CHANGE_DELETE_PRINTER_DRIVER = 0x40000000;
        public const uint PRINTER_CHANGE_PRINTER_DRIVER = 0x70000000;
        public const uint PRINTER_CHANGE_TIMEOUT = 0x80000000;
        public const uint PRINTER_CHANGE_ALL = 0x7777FFFF;
    }

  • Cancle 버튼만 눌렀을때, back-end랑 front-end랑 잘 안맞는 부분이 있는 것 같다.
  • 한글 무한루프