View Javadoc
1   // NAME
2   //      $RCSfile: DefaultAsnOctetsPrintable.java,v $
3   // DESCRIPTION
4   //      [given below in javadoc format]
5   // DELTA
6   //      $Revision: 3.3 $
7   // CREATED
8   //      $Date: 2006/01/17 17:43:54 $
9   // COPYRIGHT
10  //      Westhawk Ltd
11  // TO DO
12  //
13  
14  /*
15   * Copyright (C) 2005 - 2006 by Westhawk Ltd
16   * <a href="www.westhawk.co.uk">www.westhawk.co.uk</a>
17   *
18   * Permission to use, copy, modify, and distribute this software
19   * for any purpose and without fee is hereby granted, provided
20   * that the above copyright notices appear in all copies and that
21   * both the copyright notice and this permission notice appear in
22   * supporting documentation.
23   * This software is provided "as is" without express or implied
24   * warranty.
25   * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
26   */
27  
28  package uk.co.westhawk.snmp.stack;
29  
30  /*-
31   * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
32   * SNMP Java Client
33   * ჻჻჻჻჻჻
34   * Copyright 2023 MetricsHub, Westhawk
35   * ჻჻჻჻჻჻
36   * This program is free software: you can redistribute it and/or modify
37   * it under the terms of the GNU Lesser General Public License as
38   * published by the Free Software Foundation, either version 3 of the
39   * License, or (at your option) any later version.
40   *
41   * This program is distributed in the hope that it will be useful,
42   * but WITHOUT ANY WARRANTY; without even the implied warranty of
43   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
44   * GNU General Lesser Public License for more details.
45   *
46   * You should have received a copy of the GNU General Lesser Public
47   * License along with this program.  If not, see
48   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
49   * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
50   */
51  
52  /**
53   * Default implementation of AsnOctetsPrintableFace.
54   * This class has no effect on the way AsnOctets with type IPADDRESS 
55   * or OPAQUE are printed.
56   *
57   * <p>
58   * When the type is ASN_OCTET_STR, the method tries to guess whether
59   * or not the string is printable; without the knowledge of the MIB
60   * it cannot distinguish between OctetString and any textual
61   * conventions, like DisplayString, InternationalDisplayString or DateAndTime.
62   * </p>
63   *
64   * @since 4_14
65   * @author <a href="mailto:snmp@westhawk.co.uk">Birgit Arkesteijn</a>
66   * @version $Revision: 3.3 $ $Date: 2006/01/17 17:43:54 $
67   */
68  public class DefaultAsnOctetsPrintable implements AsnOctetsPrintableFace {
69      static final String version_id = "@(#)$Id: DefaultAsnOctetsPrintable.java,v 3.3 2006/01/17 17:43:54 birgit Exp $ Copyright Westhawk Ltd";
70  
71      public DefaultAsnOctetsPrintable() {
72      }
73  
74      /**
75       * Returns whether or not the AsnOctets' byte array represent a printable
76       * string or not.
77       *
78       * <p>
79       * This method can only make a rough guess. There is no way it always
80       * gets it right.
81       * It is much better to embed MIB knowledge in your implementation, and
82       * use toCalendar() or toDisplayString(), than calling toString().
83       * </p>
84       *
85       * @see AsnOctets#toCalendar()
86       * @see AsnOctets#toDisplayString()
87       * @see AsnOctets#toHex()
88       * @see AsnOctets#toString()
89       */
90      public boolean isPrintable(byte[] value) {
91          int length = value.length;
92          int b = ' '; // the first printable char in the ASCII table
93          int e = '~'; // the last printable char in the ASCII table
94  
95          /*
96           * About the test for 'value[i] == 0':
97           * (Quote from one of our customers:)
98           * I've seen cases where there are embedded nulls in a sysdescr
99           * - not always at the end either - and we need to get complete
100          * data back from the device even in this situation.
101          */
102 
103         boolean isPrintable = true;
104         int i = 0;
105         while (i < length && isPrintable) {
106             isPrintable = ((value[i] >= b && value[i] <= e)
107                     ||
108                     Character.isWhitespace((char) value[i])
109                     ||
110                     value[i] == 0);
111             i++;
112         }
113 
114         return isPrintable;
115     }
116 
117     /**
118      * Returns the String according to the platform's default character set.
119      *
120      * @see AsnOctetsPrintableFace#toInternationalDisplayString(byte[] value)
121      */
122     public String toInternationalDisplayString(byte[] value) {
123         String str = "";
124         if (value.length > 0) {
125             // this will use the platform's default charset.
126             str = new String(value).trim();
127         }
128         return str;
129     }
130 
131 }