Exemple #1
0
        public void TestContinue()
        {
            int MAX_BIFF_DATA = RecordInputStream.MAX_RECORD_DATA_SIZE;
            int TEXT_LEN = MAX_BIFF_DATA + 1000; // deliberately over-size
            String textChunk = "ABCDEGGHIJKLMNOP"; // 16 chars
            StringBuilder sb = new StringBuilder(16384);
            while (sb.Length < TEXT_LEN)
            {
                sb.Append(textChunk);
            }
            sb.Length = (/*setter*/TEXT_LEN);

            StringRecord sr = new StringRecord();
            sr.String = (/*setter*/sb.ToString());
            byte[] ser = sr.Serialize();
            Assert.AreEqual(StringRecord.sid, LittleEndian.GetUShort(ser, 0));
            if (LittleEndian.GetUShort(ser, 2) > MAX_BIFF_DATA)
            {
                throw new AssertionException(
                        "StringRecord should have been split with a continue record");
            }
            // Confirm expected size of first record, and ushort strLen.
            Assert.AreEqual(MAX_BIFF_DATA, LittleEndian.GetUShort(ser, 2));
            Assert.AreEqual(TEXT_LEN, LittleEndian.GetUShort(ser, 4));

            // Confirm first few bytes of ContinueRecord
            ILittleEndianInput crIn = new LittleEndianByteArrayInputStream(ser, (MAX_BIFF_DATA + 4));
            int nCharsInFirstRec = MAX_BIFF_DATA - (2 + 1); // strLen, optionFlags
            int nCharsInSecondRec = TEXT_LEN - nCharsInFirstRec;
            Assert.AreEqual(ContinueRecord.sid, crIn.ReadUShort());
            Assert.AreEqual(1 + nCharsInSecondRec, crIn.ReadUShort());
            Assert.AreEqual(0, crIn.ReadUByte());
            Assert.AreEqual('N', crIn.ReadUByte());
            Assert.AreEqual('O', crIn.ReadUByte());

            // re-read and make sure string value is the same
            RecordInputStream in1 = TestcaseRecordInputStream.Create(ser);
            StringRecord sr2 = new StringRecord(in1);
            Assert.AreEqual(sb.ToString(), sr2.String);
        }
Exemple #2
0
        /**
         * Constructs a Name record and Sets its fields appropriately.
         *
         * @param in the RecordInputstream to Read the record from
         */
        public NameRecord(RecordInputStream ris)
        {
            byte[] remainder = ris.ReadAllContinuedRemainder();
            ILittleEndianInput in1 = new LittleEndianByteArrayInputStream(remainder);
            field_1_option_flag                 = in1.ReadShort();
		    field_2_keyboard_shortcut           = (byte)in1.ReadByte();
		    int field_3_length_name_text        = in1.ReadByte();
		    int field_4_length_name_definition  = in1.ReadShort();
		    field_5_externSheetIndex_plus1      = in1.ReadShort();
		    field_6_sheetNumber                 = in1.ReadUShort();
		    int field_7_length_custom_menu      = in1.ReadUByte();
		    int field_8_length_description_text = in1.ReadUByte();
		    int field_9_length_help_topic_text  = in1.ReadUByte();
		    int field_10_length_status_bar_text = in1.ReadUByte();

		    //store the name in byte form if it's a built-in name
		    field_11_nameIsMultibyte = (in1.ReadByte() != 0);
		    if (IsBuiltInName) {
			    field_12_built_in_code = (byte)in1.ReadByte();
		    } else {
			    if (field_11_nameIsMultibyte) {
                    field_12_name_text = StringUtil.ReadUnicodeLE(in1, field_3_length_name_text);
			    } else {
                    field_12_name_text = StringUtil.ReadCompressedUnicode(in1, field_3_length_name_text);
			    }
		    }
          int nBytesAvailable = in1.Available() - (field_7_length_custom_menu
				+ field_8_length_description_text + field_9_length_help_topic_text + field_10_length_status_bar_text);
		    field_13_name_definition = SSFormula.Formula.Read(field_4_length_name_definition, in1, nBytesAvailable);

		    //Who says that this can only ever be compressed unicode???
            field_14_custom_menu_text = StringUtil.ReadCompressedUnicode(in1, field_7_length_custom_menu);
            field_15_description_text = StringUtil.ReadCompressedUnicode(in1, field_8_length_description_text);
            field_16_help_topic_text = StringUtil.ReadCompressedUnicode(in1, field_9_length_help_topic_text);
            field_17_status_bar_text = StringUtil.ReadCompressedUnicode(in1, field_10_length_status_bar_text);

        }
        public void TestReadFully()
        {
            byte[] srcBuf = HexRead.ReadFromString("99 88 77 66 55 44 33");
            ILittleEndianInput lei = new LittleEndianByteArrayInputStream(srcBuf);

            // do Initial read to increment the read index beyond zero
            Assert.AreEqual(0x8899, lei.ReadUShort());

            byte[] actBuf = new byte[4];
            lei.ReadFully(actBuf);

            if (actBuf[0] == 0x00 && srcBuf[0] == 0x77 && srcBuf[3] == 0x44)
            {
                throw new AssertionException("Identified bug in ReadFully() - source buffer was modified");
            }

            byte[] expBuf = HexRead.ReadFromString("77 66 55 44");
            Assert.IsTrue(Arrays.Equals(actBuf, expBuf));
            Assert.AreEqual(0x33, lei.ReadUByte());
            Assert.AreEqual(0, lei.Available());
        }