1c36cf2e9Sopenharmony_ci/*
2c36cf2e9Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3c36cf2e9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c36cf2e9Sopenharmony_ci * you may not use this file except in compliance with the License.
5c36cf2e9Sopenharmony_ci * You may obtain a copy of the License at
6c36cf2e9Sopenharmony_ci *
7c36cf2e9Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c36cf2e9Sopenharmony_ci *
9c36cf2e9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c36cf2e9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c36cf2e9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c36cf2e9Sopenharmony_ci * See the License for the specific language governing permissions and
13c36cf2e9Sopenharmony_ci * limitations under the License.
14c36cf2e9Sopenharmony_ci */
15c36cf2e9Sopenharmony_ci
16c36cf2e9Sopenharmony_ciimport { Log } from '@ohos/common';
17c36cf2e9Sopenharmony_ciimport { Constants, AppCommonEvent, AppStorageKeyName } from '@ohos/common';
18c36cf2e9Sopenharmony_ciimport AppStorageHelper from '../Common/Adapter/AppStorageHelper';
19c36cf2e9Sopenharmony_ciimport { PrinterCapability, PrinterInfo } from '@ohos/common';
20c36cf2e9Sopenharmony_ciimport emitter from '@ohos.events.emitter';
21c36cf2e9Sopenharmony_ciimport { StringUtil } from '@ohos/common';
22c36cf2e9Sopenharmony_ciimport Util from '../Common/Utils/Util';
23c36cf2e9Sopenharmony_ci
24c36cf2e9Sopenharmony_ciconst TAG = '[DeviceDiscModel]:';
25c36cf2e9Sopenharmony_ci
26c36cf2e9Sopenharmony_ci/**
27c36cf2e9Sopenharmony_ci * PrinterDiscModel
28c36cf2e9Sopenharmony_ci */
29c36cf2e9Sopenharmony_ci
30c36cf2e9Sopenharmony_ci/**
31c36cf2e9Sopenharmony_ci * Printer discovery model
32c36cf2e9Sopenharmony_ci */
33c36cf2e9Sopenharmony_ciexport class PrinterDiscModel {
34c36cf2e9Sopenharmony_ci  public mPrinters: Array<PrinterInfo> = new Array<PrinterInfo>();
35c36cf2e9Sopenharmony_ci
36c36cf2e9Sopenharmony_ci  /**
37c36cf2e9Sopenharmony_ci   * reset
38c36cf2e9Sopenharmony_ci   */
39c36cf2e9Sopenharmony_ci  public reset(): void {
40c36cf2e9Sopenharmony_ci    this.mPrinters = [];
41c36cf2e9Sopenharmony_ci    AppStorageHelper.setValue<Array<PrinterInfo>>(this.mPrinters, AppStorageKeyName.PRINTER_QUEUE_NAME);
42c36cf2e9Sopenharmony_ci  }
43c36cf2e9Sopenharmony_ci
44c36cf2e9Sopenharmony_ci  /**
45c36cf2e9Sopenharmony_ci   * remove device
46c36cf2e9Sopenharmony_ci   *
47c36cf2e9Sopenharmony_ci   * @param deviceId device id
48c36cf2e9Sopenharmony_ci   */
49c36cf2e9Sopenharmony_ci  public removePrinter(printerId: string): void {
50c36cf2e9Sopenharmony_ci    this.mPrinters = this.mPrinters.filter((printer) => printer.printerId !== printerId);
51c36cf2e9Sopenharmony_ci    Log.info(TAG, 'remove printer, printerId = ' + StringUtil.splitMac(printerId) + ', printer num = ' + JSON.stringify(this.mPrinters.length));
52c36cf2e9Sopenharmony_ci    AppStorageHelper.setValue<Array<PrinterInfo>>(this.mPrinters, AppStorageKeyName.PRINTER_QUEUE_NAME);
53c36cf2e9Sopenharmony_ci  }
54c36cf2e9Sopenharmony_ci
55c36cf2e9Sopenharmony_ci  public findPrinter(printerId: string): boolean {
56c36cf2e9Sopenharmony_ci    Log.info(TAG, 'find printer');
57c36cf2e9Sopenharmony_ci    let printer = this.mPrinters.find((printer)=> printer.printerId === printerId);
58c36cf2e9Sopenharmony_ci    Log.debug(TAG, 'find printer, printerId = ' + StringUtil.splitMac(printerId) + ', printer = ' + JSON.stringify(printer));
59c36cf2e9Sopenharmony_ci    if (printer !== undefined && printer !== null) {
60c36cf2e9Sopenharmony_ci      return true;
61c36cf2e9Sopenharmony_ci    } else {
62c36cf2e9Sopenharmony_ci      return false;
63c36cf2e9Sopenharmony_ci    }
64c36cf2e9Sopenharmony_ci  }
65c36cf2e9Sopenharmony_ci
66c36cf2e9Sopenharmony_ci  /**
67c36cf2e9Sopenharmony_ci   * add device
68c36cf2e9Sopenharmony_ci   *
69c36cf2e9Sopenharmony_ci   * @param device Device
70c36cf2e9Sopenharmony_ci   * @return true for added
71c36cf2e9Sopenharmony_ci   */
72c36cf2e9Sopenharmony_ci  public addPrinter(printer: PrinterInfo): boolean {
73c36cf2e9Sopenharmony_ci    for (let index = 0; index < this.mPrinters.length; index++) {
74c36cf2e9Sopenharmony_ci      if (this.mPrinters[index].printerId === printer.printerId) {
75c36cf2e9Sopenharmony_ci        Log.info(TAG, 'printer is already added, printer = ' + StringUtil.encodeCommonString(printer.printerName));
76c36cf2e9Sopenharmony_ci        return false;
77c36cf2e9Sopenharmony_ci      }
78c36cf2e9Sopenharmony_ci    }
79c36cf2e9Sopenharmony_ci    if (Util.isMdnsPrinter(<string> printer.printerId)) { //eprint打印机置顶
80c36cf2e9Sopenharmony_ci      this.mPrinters.unshift(printer);
81c36cf2e9Sopenharmony_ci    } else {
82c36cf2e9Sopenharmony_ci      this.mPrinters.push(printer);
83c36cf2e9Sopenharmony_ci    }
84c36cf2e9Sopenharmony_ci    let printerJSON = JSON.stringify(printer);
85c36cf2e9Sopenharmony_ci    let innerEvent = {
86c36cf2e9Sopenharmony_ci      eventId: AppCommonEvent.ADD_PRINTER_EVENT,
87c36cf2e9Sopenharmony_ci      priority: emitter.EventPriority.HIGH
88c36cf2e9Sopenharmony_ci    };
89c36cf2e9Sopenharmony_ci    let eventData = {
90c36cf2e9Sopenharmony_ci      data: {
91c36cf2e9Sopenharmony_ci        'printer': printerJSON
92c36cf2e9Sopenharmony_ci      }
93c36cf2e9Sopenharmony_ci    };
94c36cf2e9Sopenharmony_ci    emitter.emit(innerEvent, eventData);
95c36cf2e9Sopenharmony_ci    Log.info(TAG, 'add printer, printer :' + StringUtil.encodeCommonString(printer.printerName) + ', printer num = ' + JSON.stringify(this.mPrinters.length));
96c36cf2e9Sopenharmony_ci    AppStorageHelper.setValue<Array<PrinterInfo>>(this.mPrinters, AppStorageKeyName.PRINTER_QUEUE_NAME);
97c36cf2e9Sopenharmony_ci    return true;
98c36cf2e9Sopenharmony_ci  }
99c36cf2e9Sopenharmony_ci
100c36cf2e9Sopenharmony_ci  /**
101c36cf2e9Sopenharmony_ci   * printer state change
102c36cf2e9Sopenharmony_ci   *
103c36cf2e9Sopenharmony_ci   * @param printerId printer id
104c36cf2e9Sopenharmony_ci   * @param state printer state
105c36cf2e9Sopenharmony_ci   * @return true for change
106c36cf2e9Sopenharmony_ci   */
107c36cf2e9Sopenharmony_ci  public printerStateChange(printerId: string, state: number): boolean {
108c36cf2e9Sopenharmony_ci    Log.error(TAG, 'PrinterStateChange printerId: ' + StringUtil.splitMac(printerId) + ' state : ' + JSON.stringify(state));
109c36cf2e9Sopenharmony_ci    for (let index = 0; index < this.mPrinters.length; index++) {
110c36cf2e9Sopenharmony_ci      if (this.mPrinters[index].printerId === printerId) {
111c36cf2e9Sopenharmony_ci        Log.info(TAG, 'printer: ' + StringUtil.splitMac(printerId) + ' state : ' + JSON.stringify(this.mPrinters[index].printerState) + ' change to :' + JSON.stringify(state));
112c36cf2e9Sopenharmony_ci        this.mPrinters[index].printerState = state;
113c36cf2e9Sopenharmony_ci        AppStorageHelper.setValue<Array<PrinterInfo>>(this.mPrinters, AppStorageKeyName.PRINTER_QUEUE_NAME);
114c36cf2e9Sopenharmony_ci
115c36cf2e9Sopenharmony_ci        let innerEvent = {
116c36cf2e9Sopenharmony_ci          eventId: AppCommonEvent.PRINTER_STATE_CHANGE_EVENT,
117c36cf2e9Sopenharmony_ci          priority: emitter.EventPriority.HIGH
118c36cf2e9Sopenharmony_ci        };
119c36cf2e9Sopenharmony_ci        emitter.emit(innerEvent);
120c36cf2e9Sopenharmony_ci      }
121c36cf2e9Sopenharmony_ci    }
122c36cf2e9Sopenharmony_ci    return true;
123c36cf2e9Sopenharmony_ci  }
124c36cf2e9Sopenharmony_ci
125c36cf2e9Sopenharmony_ci  /**
126c36cf2e9Sopenharmony_ci   * printer capability update
127c36cf2e9Sopenharmony_ci   *
128c36cf2e9Sopenharmony_ci   * @param printerId  printer id
129c36cf2e9Sopenharmony_ci   * @param capability printer capability
130c36cf2e9Sopenharmony_ci   * @param options printer capability
131c36cf2e9Sopenharmony_ci   * @param description printer descriptions
132c36cf2e9Sopenharmony_ci   * @return true for update
133c36cf2e9Sopenharmony_ci   */
134c36cf2e9Sopenharmony_ci  public printerUpdateCapability(printerId: string, capability: PrinterCapability, options: string, description: string): boolean {
135c36cf2e9Sopenharmony_ci    Log.info(TAG, 'PrinterUpdateCapability printerId: ' + StringUtil.splitMac(printerId) + ' capability : ' + JSON.stringify(capability));
136c36cf2e9Sopenharmony_ci    for (let index = 0; index < this.mPrinters.length; index++) {
137c36cf2e9Sopenharmony_ci      if (this.mPrinters[index].printerId === printerId) {
138c36cf2e9Sopenharmony_ci        this.mPrinters[index].capability = capability;
139c36cf2e9Sopenharmony_ci        this.mPrinters[index].options = options;
140c36cf2e9Sopenharmony_ci        this.mPrinters[index].description = description;
141c36cf2e9Sopenharmony_ci        AppStorageHelper.setValue<Array<PrinterInfo>>(this.mPrinters, AppStorageKeyName.PRINTER_QUEUE_NAME);
142c36cf2e9Sopenharmony_ci        let innerEvent = {
143c36cf2e9Sopenharmony_ci          eventId: AppCommonEvent.PRINTER_UPDATE_CAPABILITY_EVENT,
144c36cf2e9Sopenharmony_ci          priority: emitter.EventPriority.HIGH
145c36cf2e9Sopenharmony_ci        };
146c36cf2e9Sopenharmony_ci        emitter.emit(innerEvent);
147c36cf2e9Sopenharmony_ci      }
148c36cf2e9Sopenharmony_ci    }
149c36cf2e9Sopenharmony_ci    return true;
150c36cf2e9Sopenharmony_ci  }
151c36cf2e9Sopenharmony_ci}
152