v3 Creating Custom Field Types收藏

本文介绍如何在SharePoint 2007中创建自定义字段类型以存储电话号码,包括字段验证、格式化及实现步骤。

MOSS2007的自定义字段类型

v3 Creating Custom Field Types

Custom field types in SharePoint 2007 are pretty darn cool. They allow you to create your own subclasses of the existing SharePoint field types. You can control pretty much every aspect of the fields behavior. Things such as how the field  is displayed/rendered in the SharePoints interface, how the data is formatted when it gets stored in the field, validation, and all kinds of other cool stuff. 

So to try out custom field types I wanted to create a field for storing telephone numbers.

 

The field uses javascript to format the phone number automatically as the user types.  When the item is saved the custom field class strips out all the formatting characters that the javascript puts in and it also checks for proper length.  There are three main components to building a custom field…

·         Custom Field Class – Should inherit from an existing SPField class. Ie. SPFieldText

·         ASCX Control (Optional) – Defines a SharePoint:RenderingTemplate element whichs tells SharePoint how to render your control.

·         Custom Control Class(Optional) – The code-behind for your ascx control which defines how your control is rendered.

To get started open up vs 2005, create a new class library project, and add a reference to the Microsoft.SharePoint.dll.  Now create a new class file and name it TelephoneField.cs.  This will contain the code for our custom field class. Add the following using directives to the top of TelephoneField.cs…

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

using Microsoft.SharePoint;

using System.Text.RegularExpressions;

Now copy and paste the following code into the body of the class (make sure to leave your namespace intact)…

View Code

 

public class TelephoneField : SPFieldText

    {

 

        #region Contstructors

        public TelephoneField(SPFieldCollection fields, string fieldName) : base(fields, fieldName)

        {

 

        }

        public TelephoneField(Microsoft.SharePoint.SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName)

        {

 

        }

        #endregion

 

        /// <summary>

        /// This method validates the data as it is entered into the column. If it doesnt match the criteria a sharepoint exception is thrown.

        /// </summary>

        /// <param name="value"></param>

        /// <returns></returns>

        public override string GetValidatedString(object value)

        {

            string myVal = value as string;

 

            if (myVal == null)

                return String.Empty;

       

            //Strip formating characters from the value..

            myVal = myVal.Replace("(", "");

            myVal = myVal.Replace(")", "");

            myVal = myVal.Replace("-", "");

            myVal = myVal.Replace("+", "");

            myVal = myVal.Replace(" ", "");

            myVal = myVal.Trim();

 

            //Use regex to makes the string only contains numbers and is within the correct range.

            Regex foo = new Regex("^//d{10,11}$");

            if (foo.IsMatch(myVal))

            {

            }

            else

            {

                throw new Microsoft.SharePoint.SPFieldValidationException("The Telephone number field must contain only numbers, (, ), -, or + characters. It must also be between 10 and 11 digits. val:" + myVal);

            }

 

            return myVal;

        }

  

        /// <summary>

        /// Here we can apply formating to our number that will show up on the edit page.

        /// </summary>

        /// <param name="value"></param>

        /// <returns></returns>

        public override object GetFieldValue(string value)

        {

            if (String.IsNullOrEmpty(value))

                return null;

 

            //TODO - Format the phone number here (XXX)XXX-XXXX

 

            return value;

        }

 

        public override Microsoft.SharePoint.WebControls.BaseFieldControl FieldRenderingControl

        {

            get

            {

                Microsoft.SharePoint.WebControls.BaseFieldControl phoneNumberFieldControl = new TelephoneFieldControl();

                phoneNumberFieldControl.FieldName = InternalName;

                return phoneNumberFieldControl;

            }

        }

    }

 

As you can see our custom field class inherits from SPFieldText but you can inherit from pretty any other type of SharePoint field. This  class essentially controls what happens to the formatting of our fields data as it is retrieved from and inserted into the database.  You can see that in the GetValidatedString method we are also performing some validation and providing a message to the user if the data is incorrect.

Now add a text file to your solution and name it TelephoneFieldControl.ascx Copy and past the following into the TelephoneFieldControl.ascx file…

View Code

 

<%@ Control Language="C#" Debug=true  %>

<%@Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls"%>

 

<SharePoint:RenderingTemplate ID="TelephoneFieldControl" runat="server">

    <Template>

    <script language="javascript">

 

<!-- This script is based on the javascript code of Roman Feldblum (web.developer@programmer.net) -->

<!-- Original script : http://javascript.internet.com/forms/format-phone-number.html -->

<!-- Original script is revised by Eralper Yilmaz (http://www.eralper.com) -->

<!-- Revised script : http://www.kodyaz.com -->

 

var zChar = new Array(' ', '(', ')', '-', '.');

var maxphonelength = 13;

var phonevalue1;

var phonevalue2;

var cursorposition;

 

function ParseForNumber1(object){

phonevalue1 = ParseChar(object.value, zChar);

}

function ParseForNumber2(object){

phonevalue2 = ParseChar(object.value, zChar);

}

 

function backspacerUP(object,e) {

if(e){

e = e

} else {

e = window.event

}

if(e.which){

var keycode = e.which

} else {

var keycode = e.keyCode

}

 

ParseForNumber1(object)

 

if(keycode > 48){

ValidatePhone(object)

}

}

 

function backspacerDOWN(object,e) {

if(e){

e = e

} else {

e = window.event

}

if(e.which){

var keycode = e.which

} else {

var keycode = e.keyCode

}

ParseForNumber2(object)

}

 

function GetCursorPosition(){

 

var t1 = phonevalue1;

var t2 = phonevalue2;

var bool = false

for (i=0; i<t1.length; i++)

{

if (t1.substring(i,1) != t2.substring(i,1)) {

if(!bool) {

cursorposition=i

bool=true

}

}

}

}

 

function ValidatePhone(object){

 

var p = phonevalue1

 

p = p.replace(/[^/d]*/gi,"")

 

if (p.length < 3) {

object.value=p

} else if(p.length==3){

pp=p;

d4=p.indexOf('(')

d5=p.indexOf(')')

if(d4==-1){

pp="("+pp;

}

if(d5==-1){

pp=pp+")";

}

object.value = pp;

} else if(p.length>3 && p.length < 7){

p ="(" + p;

l30=p.length;

p30=p.substring(0,4);

p30=p30+")"

 

p31=p.substring(4,l30);

pp=p30+p31;

 

object.value = pp;

 

} else if(p.length >= 7){

p ="(" + p;

l30=p.length;

p30=p.substring(0,4);

p30=p30+")"

 

p31=p.substring(4,l30);

pp=p30+p31;

 

l40 = pp.length;

p40 = pp.substring(0,8);

p40 = p40 + "-"

 

p41 = pp.substring(8,l40);

ppp = p40 + p41;

 

object.value = ppp.substring(0, maxphonelength);

}

 

GetCursorPosition()

 

if(cursorposition >= 0){

if (cursorposition == 0) {

cursorposition = 2

} else if (cursorposition <= 2) {

cursorposition = cursorposition + 1

} else if (cursorposition <= 5) {

cursorposition = cursorposition + 2

} else if (cursorposition == 6) {

cursorposition = cursorposition + 2

} else if (cursorposition == 7) {

cursorposition = cursorposition + 4

e1=object.value.indexOf(')')

e2=object.value.indexOf('-')

if (e1>-1 && e2>-1){

if (e2-e1 == 4) {

cursorposition = cursorposition - 1

}

}

} else if (cursorposition < 11) {

cursorposition = cursorposition + 3

} else if (cursorposition == 11) {

cursorposition = cursorposition + 1

} else if (cursorposition >= 12) {

cursorposition = cursorposition

}

 

var txtRange = object.createTextRange();

txtRange.moveStart( "character", cursorposition);

txtRange.moveEnd( "character", cursorposition - object.value.length);

txtRange.select();

}

 

}

 

function ParseChar(sStr, sChar)

{

if (sChar.length == null)

{

zChar = new Array(sChar);

}

else zChar = sChar;

 

for (i=0; i<zChar.length; i++)

{

sNewStr = "";

 

var iStart = 0;

var iEnd = sStr.indexOf(sChar[i]);

 

while (iEnd != -1)

{

sNewStr += sStr.substring(iStart, iEnd);

iStart = iEnd + 1;

iEnd = sStr.indexOf(sChar[i], iStart);

}

sNewStr += sStr.substring(sStr.lastIndexOf(sChar[i]) + 1, sStr.length);

 

sStr = sNewStr;

}

 

return sNewStr;

}

</script>

 

 

        <asp:TextBox ID="txtNumber" runat="server" MaxLength="15" Size="20" onkeydown="javascript:backspacerDOWN(this,event);" onkeyup="javascript:backspacerUP(this,event);"/>

    </Template>

</SharePoint:RenderingTemplate>

This  file is defining what the display of the field on the edit form will look like.  It contains javascript to perform the formatting of the text and also a textbox control named txtNumber. It would probly be best to put the javascript in an include file but for now we will just include it inline w/ the field.   

Now create another new class file and name it TelephoneFieldControl.cs.  This will contain the codebehind for the ascx file we created previously.  Add the following using directives to the top of the TelephoneFieldControl.cs file…

using System;

using System.Collections.Generic;

using System.Text;

using System.Web.UI.WebControls;

using Microsoft.SharePoint.WebControls;

Then add the following code to the body of the class…

View Code

 

public class TelephoneFieldControl : BaseFieldControl

    {

        protected TextBox txtNumber;

 

        protected override string DefaultTemplateName

        {

            get

            {

                return "TelephoneFieldControl";

            }

        }

 

        public override object Value

        {

            get

            {

                EnsureChildControls();

               

                return txtNumber.Text.Trim();

            }

            set

            {

                EnsureChildControls();

                txtNumber.Text = (string)this.ItemFieldValue;

              

            }

        }

       

        public override void Focus()

        {

            EnsureChildControls();

            txtNumber.Focus();

        }

 

        protected override void CreateChildControls()

        {

            if (Field == null) return;

 

            base.CreateChildControls();

 

            if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display)

                return;

 

            txtNumber = (TextBox)TemplateContainer.FindControl("txtNumber");

            if (txtNumber == null)

                throw new ArgumentException("txtNumber is null. Corrupted TelephoneFieldControl.ascx file.");

            txtNumber.TabIndex = TabIndex;

            txtNumber.CssClass = CssClass;

            txtNumber.ToolTip = Field.Title + " Phone Number";

           

        }

 

 

    }

 

The DefaultTemplateName property lets sharepoint know which rendering template to use this class for.  The value property controls how the data that SharePoint provides gets parsed into our control. The rest of the code is pretty standard as far as ascx controls go.

To finish the assembly project go ahead and create a key file and sign the assembly. It needs to be signed so we can install it into the GAC.

Before we can deploy the new field type we need to create a file called FLDTYPES_Telephone.xml. This is esentially a definition file that makes SharePoint aware of the new field type.  Copy and paste the follow into the FLDTYPES_Telephone.xml file (Make sure to replace the assembly name and public key token in the FieldTypeClass element with the correct values for your assembly)…

<?xml version="1.0" encoding="utf-8"?>

<FieldTypes>

  <FieldType>

    <Field Name="TypeName">PhoneNumber</Field>

    <Field Name="ParentType">Text</Field>

    <Field Name="TypeDisplayName">Phone Number</Field>

    <Field Name="TypeShortDescription">Phone Number</Field>

    <Field Name="UserCreatable">TRUE</Field>

    <Field Name="ShowInListCreate">TRUE</Field>

    <Field Name="ShowInSurveyCreate">TRUE</Field>

    <Field Name="ShowInDocumentLibraryCreate">TRUE</Field>

    <Field Name="ShowInColumnTemplateCreate">TRUE</Field>

    <Field Name="FieldTypeClass">TelephoneFieldType.TelephoneField,TelephoneFieldType,Version=1.0.0.0,Culture=neutral,PublicKeyToken=722d1e996cfca5d7</Field>

    <!-- We will implement this later to add display formating for the fields value. ie (xxx)xxx-xxxx

    <RenderPattern Name="DisplayPattern">

      <Switch>

        <Expr>

          <Column />

        </Expr>

        <Case Value="" />

        <Default>

          <HTML><![CDATA[^]]></HTML>

          <Column HTMLEncode="TRUE" />

        </Default>

      </Switch>

    </RenderPattern>

    -->

  </FieldType>

</FieldTypes>

I’ve commented out the render pattern section but it basically allows you to control how the field data is rendered in standard list views, headers, ect. w/ the use of CAML expressions. Its pretty powerful. There is more detailed info about render patterns in the wss3 SDK.

Deploying the custom field

 

1.       Build your assembly and install it in the GAC on the server.

2.       Copy the ascx control to C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/CONTROLTEMPLATES

3.       Copy the FLDTYPES_Telephone.xml to C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/XML

4.       Reset IIS

Now when you add fields to a list you should have to option of choosing Phone Number as a field type. Go try it out!

Resources used to write this post:

-

请仔细阅读和分析下面函数,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码 要求如下: 1.保持所有原始功能不变,不要遗漏逻辑细节 2.提高执行效率,降低计算复杂度 3.已经给定的结构体名字和元素不要更改,详细的中文注释 4.自动添加中文注释说明功能逻辑 5.不使用 auto,使用显式 for 循环 6.结构体采用32位定义 7.不要使用小函数,保持原始的函数定义 8.严格保持protobuf字段映射关系 特别注意: 1.函数中有关位操作不变,函数间的位操作一致, 详细注释位操作 2.函数中的 HDDMXng::BelUsageAttrib::BelUsageAttrib 映射为 message BelUsageAttrib { optional uint32 flags = 1; optional uint32 type = 2; optional uint32 bitwidth = 3; optional string attribname = 4; optional sint32 defint = 5; optional double defdouble = 6; optional bool defbool = 7; optional string defstring = 8; repeated sint32 listofints = 9 [packed = true]; repeated double listofdoubles = 10 [packed = true]; repeated bool listofbools = 11 [packed = true]; repeated string listofstrings = 12; optional uint32 precision = 13; } 3.采用 google::protobuf::Descriptor 和 google::protobuf::Reflection 进行编程 4.不要使用如 HIBYTE 等宏定义 5.将函数中的 _BYTE attrib_msg[24] 映射为 HDDMXng::BelUsageAttrib attrib_msg void __fastcall HDDMBelUsageAttrib::readme_pb(HDDMBelUsageAttrib *this, std::istream *stream, HDDMDevice *hddmDevice) { google::protobuf::Message *v4; // rdx unsigned int v5; // eax bool v6; // zf unsigned __int64 v7; // r12 __int64 *v8; // rax __int64 *v9; // rbp __int64 v10; // rax int v11; // r14d __int64 v12; // rdx const std::string *v13; // rsi unsigned __int64 v14; // rbp __int64 v15; // rdi __int64 *v16; // rax __int64 v17; // rdi std::string *v18; // r12 std::string *v19; // rbp __int64 v20; // r12 __int64 *v21; // rbp unsigned __int64 v22; // r13 char *v23; // rax __int64 v24; // rdx char *v25; // rcx char *v26; // rsi __int64 v27; // r12 int v28; // eax __int64 v29; // rsi char v30; // r8 __int64 v31; // rbp unsigned __int64 v32; // rcx __int64 v33; // rcx __int64 v34; // rdi __int64 *v35; // rax __int64 *v36; // rax __int64 v37; // rcx unsigned __int64 v38; // r12 __int64 *v39; // rax __int64 *v40; // rbp __int64 v41; // rax int v42; // eax __int64 v43; // rdx unsigned __int64 v44; // r12 unsigned __int64 v45; // rax int v46; // ebp __int64 *v47; // rax __int64 v48; // rdi unsigned __int64 v49; // r12 __int64 *v50; // rax __int64 *v51; // rbp __int64 v52; // rax int v53; // eax __int64 v54; // rdx unsigned __int64 v55; // r12 unsigned __int64 v56; // rax int v57; // ebp __int64 *attribVoidVec; // rax __int64 v59; // rdi _QWORD *v60; // rdx unsigned __int64 v61; // r12 char *v62; // rax unsigned __int64 v63; // r12 char *v64; // rax int v65; // eax __int64 v66; // rbp __int64 v67; // rax __int64 v68; // rdi __int64 *v69; // rcx __int64 v70; // rcx __int64 v71; // rdi __int64 *v72; // rax int v73; // edx int v74; // edx __int64 v75; // rbp __int64 v76; // rax __int64 v77; // rdi __int64 *v78; // rcx int v79; // edx int v80; // edx _QWORD *p_attribIndexMap; // [rsp+8h] [rbp-180h] HDDMBelUsageAttrib v82; // [rsp+10h] [rbp-178h] BYREF unsigned int v83; // [rsp+60h] [rbp-128h] char v84; // [rsp+64h] [rbp-124h] std::string *v85; // [rsp+68h] [rbp-120h] __int16 v86; // [rsp+70h] [rbp-118h] int v87; // [rsp+74h] [rbp-114h] __int64 v88; // [rsp+78h] [rbp-110h] std::string *v89; // [rsp+80h] [rbp-108h] __int64 v90; // [rsp+88h] [rbp-100h] int v91; // [rsp+90h] [rbp-F8h] __int64 v92; // [rsp+B0h] [rbp-D8h] int v93; // [rsp+B8h] [rbp-D0h] char v94; // [rsp+E4h] [rbp-A4h] __int16 v95; // [rsp+E8h] [rbp-A0h] char *v96; // [rsp+F0h] [rbp-98h] int v97; // [rsp+F8h] [rbp-90h] const std::string **v98; // [rsp+110h] [rbp-78h] int v99; // [rsp+118h] [rbp-70h] char v100; // [rsp+14Ch] [rbp-3Ch] char v101; // [rsp+14Dh] [rbp-3Bh] if ( HDDMDeviceDump::useXngMarks ) std::istream::read(stream, HDDMDeviceDump::markBuffer, 14LL); HDDMXng::BelUsageAttrib::BelUsageAttrib((HDDMXng::BelUsageAttrib *)&v82.qword40); HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)&v82.qword40, v4); v5 = (((v83 >> 4) & 1) << 6) | (4 * ((v83 >> 3) & 1)) & 0xFFFFFFC7 | (2 * ((v83 >> 2) & 1)) & 0xFFFFFF83 | (v83 >> 1) & 1 | HIBYTE(this->attrib_code) & 0x80; BYTE1(this->attrib_code1) = ((unsigned __int8)(v83 >> 7) << 7) | (((v83 & 0x40) != 0) << 6) & 0x7F | (32 * ((v83 & 0x20) != 0)) & 0x7F | BYTE1(this->attrib_code1) & 0x1F; v6 = (v100 & 4) == 0; HIBYTE(this->attrib_code) = (8 * (v84 & 7)) | v5; if ( !v6 ) LOWORD(this->attrib_code) = v86 & 0xFFF | this->attrib_code & 0xF000; std::string::assign((std::string *)&this->attrib_name, v85); switch ( (HIBYTE(this->attrib_code) >> 3) & 7 ) { case 1: v49 = v91; v50 = (__int64 *)operator new(0x18uLL); v51 = v50; *v50 = 0LL; v50[1] = 0LL; v50[2] = 0LL; if ( v49 ) { if ( v49 > 0x3FFFFFFFFFFFFFFFLL ) std::__throw_bad_alloc(); v61 = 4 * v49; v62 = (char *)operator new(v61); *v51 = (__int64)v62; v51[1] = (__int64)v62; v51[2] = (__int64)&v62[v61]; memset(v62, 0, v61); v52 = v51[2]; } else { v50[2] = 0LL; v52 = 0LL; } v51[1] = v52; v53 = v91; this->attribVoidVec = v51; if ( v53 <= 0 ) goto LABEL_57; v54 = *v51; if ( !((v51[1] - *v51) >> 2) ) goto LABEL_77; if ( &_pthread_key_create ) { v55 = 1LL; v56 = 0LL; v57 = 0; while ( 1 ) { *(_DWORD *)(v54 + 4 * v56) = *(_DWORD *)(v90 + 4 * v56); HDDMBelUsageAttrib::getValueAsString(&v82, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](&this->attribIndexMap, &v82) = v57; v59 = *(_QWORD *)&v82.attrib_code - 24LL; if ( (_UNKNOWN *)(*(_QWORD *)&v82.attrib_code - 24LL) != &std::string::_Rep::_S_empty_rep_storage && _InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)&v82.attrib_code - 8LL), 0xFFFFFFFF) <= 0 ) { std::string::_Rep::_M_destroy(v59, &v82.qword30); } if ( ++v57 >= v91 ) break; attribVoidVec = (__int64 *)this->attribVoidVec; v54 = *attribVoidVec; if ( (attribVoidVec[1] - *attribVoidVec) >> 2 <= v55 ) goto LABEL_77; v56 = v55++; } } else { v75 = 0LL; v76 = 0LL; while ( 1 ) { *(_DWORD *)(v54 + 4 * v76) = *(_DWORD *)(v90 + 4 * v76); HDDMBelUsageAttrib::getValueAsString(&v82, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](&this->attribIndexMap, &v82) = v75; v77 = *(_QWORD *)&v82.attrib_code - 24LL; if ( (_UNKNOWN *)(*(_QWORD *)&v82.attrib_code - 24LL) != &std::string::_Rep::_S_empty_rep_storage ) { v80 = *(_DWORD *)(*(_QWORD *)&v82.attrib_code - 8LL); *(_DWORD *)(*(_QWORD *)&v82.attrib_code - 8LL) = v80 - 1; if ( v80 <= 0 ) std::string::_Rep::_M_destroy(v77, &v82.qword30); } if ( v91 <= (int)v75 + 1 ) break; v78 = (__int64 *)this->attribVoidVec; v76 = v75 + 1; v54 = *v78; if ( (v78[1] - *v78) >> 2 <= (unsigned __int64)(v75 + 1) ) LABEL_77: std::__throw_out_of_range("vector::_M_range_check"); ++v75; } } LABEL_57: LODWORD(this->qword18) = v87; goto LABEL_17; case 2: v38 = v93; v39 = (__int64 *)operator new(0x18uLL); v40 = v39; *v39 = 0LL; v39[1] = 0LL; v39[2] = 0LL; if ( v38 ) { if ( v38 > 0x1FFFFFFFFFFFFFFFLL ) std::__throw_bad_alloc(); v63 = 8 * v38; v64 = (char *)operator new(v63); *v40 = (__int64)v64; v40[1] = (__int64)v64; v40[2] = (__int64)&v64[v63]; memset(v64, 0, v63); v41 = v40[2]; } else { v39[2] = 0LL; v41 = 0LL; } v40[1] = v41; v42 = v93; this->attribVoidVec = v40; if ( v42 <= 0 ) goto LABEL_46; v43 = *v40; if ( !((v40[1] - *v40) >> 3) ) goto LABEL_72; if ( &_pthread_key_create ) { v44 = 1LL; v45 = 0LL; v46 = 0; while ( 1 ) { *(_QWORD *)(v43 + 8 * v45) = *(_QWORD *)(v92 + 8 * v45); HDDMBelUsageAttrib::getValueAsString((HDDMBelUsageAttrib *)&v82.attribVoidVec, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](&this->attribIndexMap, &v82.attribVoidVec) = v46; v48 = v82.attribVoidVec - 24LL; if ( (_UNKNOWN *)(v82.attribVoidVec - 24LL) != &std::string::_Rep::_S_empty_rep_storage && _InterlockedExchangeAdd((volatile signed __int32 *)(v82.attribVoidVec - 8LL), 0xFFFFFFFF) <= 0 ) { std::string::_Rep::_M_destroy(v48, &v82.qword30); } if ( ++v46 >= v93 ) break; v47 = (__int64 *)this->attribVoidVec; v43 = *v47; if ( (v47[1] - *v47) >> 3 <= v44 ) goto LABEL_72; v45 = v44++; } } else { v66 = 0LL; v67 = 0LL; while ( 1 ) { *(_QWORD *)(v43 + 8 * v67) = *(_QWORD *)(v92 + 8 * v67); HDDMBelUsageAttrib::getValueAsString((HDDMBelUsageAttrib *)&v82.attribVoidVec, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](&this->attribIndexMap, &v82.attribVoidVec) = v66; v68 = v82.attribVoidVec - 24LL; if ( (_UNKNOWN *)(v82.attribVoidVec - 24LL) != &std::string::_Rep::_S_empty_rep_storage ) { v73 = *(_DWORD *)(v82.attribVoidVec - 8LL); *(_DWORD *)(v82.attribVoidVec - 8LL) = v73 - 1; if ( v73 <= 0 ) std::string::_Rep::_M_destroy(v68, &v82.qword30); } if ( v93 <= (int)v66 + 1 ) break; v69 = (__int64 *)this->attribVoidVec; v67 = v66 + 1; v43 = *v69; if ( (v69[1] - *v69) >> 3 <= (unsigned __int64)(v66 + 1) ) LABEL_72: std::__throw_out_of_range("vector::_M_range_check"); ++v66; } } LABEL_46: this->qword18 = v88; goto LABEL_17; case 3: v20 = v97; v21 = (__int64 *)operator new(0x28uLL); *v21 = 0LL; *((_DWORD *)v21 + 2) = 0; v21[2] = 0LL; *((_DWORD *)v21 + 6) = 0; v21[4] = 0LL; v22 = 8 * ((unsigned __int64)(v20 + 63) >> 6); v23 = (char *)operator new(v22); v24 = v20 + 63; v25 = &v23[v22]; *v21 = (__int64)v23; *((_DWORD *)v21 + 2) = 0; if ( v20 >= 0 ) v24 = v20; v21[4] = (__int64)v25; v26 = &v23[8 * (v24 >> 6)]; v27 = v20 % 64; if ( v27 < 0 ) { LODWORD(v27) = v27 + 64; v26 -= 8; } v21[2] = (__int64)v26; *((_DWORD *)v21 + 6) = v27; if ( v25 != v23 ) memset(v23, 0, 8 * ((v22 - 8) >> 3) + 8); v28 = v97; this->attribVoidVec = v21; if ( v28 <= 0 ) goto LABEL_68; v29 = *v21; v30 = *v96; if ( *((_DWORD *)v21 + 2) == *((unsigned int *)v21 + 6) + 8 * (v21[2] - *v21) ) goto LABEL_82; v31 = 0LL; v32 = 0LL; while ( 1 ) { v36 = (__int64 *)(v29 + 8 * (v32 >> 6)); v37 = 1LL << v32; if ( v30 ) v33 = *v36 | v37; else v33 = *v36 & ~v37; *v36 = v33; HDDMBelUsageAttrib::getValueAsString((HDDMBelUsageAttrib *)&v82.attribIndexMap, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](&this->attribIndexMap, &v82.attribIndexMap) = v31; v34 = v82.attribIndexMap - 24LL; if ( (_UNKNOWN *)(v82.attribIndexMap - 24LL) != &std::string::_Rep::_S_empty_rep_storage ) { if ( &_pthread_key_create ) { v65 = _InterlockedExchangeAdd((volatile signed __int32 *)(v34 + 16), 0xFFFFFFFF); } else { v79 = *(_DWORD *)(v82.attribIndexMap - 8LL); *(_DWORD *)(v82.attribIndexMap - 8LL) = v79 - 1; v65 = v79; } if ( v65 <= 0 ) std::string::_Rep::_M_destroy(v34, &v82.qword30); } if ( v97 <= (int)v31 + 1 ) break; v32 = v31 + 1; v30 = v96[v31 + 1]; v35 = (__int64 *)this->attribVoidVec; v29 = *v35; if ( *((unsigned int *)v35 + 6) + 8 * (v35[2] - *v35) - (unsigned __int64)*((unsigned int *)v35 + 2) <= v31 + 1 ) LABEL_82: std::__throw_out_of_range("vector<bool>::_M_range_check"); ++v31; } LABEL_68: LOBYTE(this->qword18) = v94; goto LABEL_17; case 4: case 5: case 6: v7 = v99; v8 = (__int64 *)operator new(0x18uLL); v9 = v8; *v8 = 0LL; v8[1] = 0LL; v8[2] = 0LL; if ( v7 ) { if ( v7 > 0x1FFFFFFFFFFFFFFFLL ) std::__throw_bad_alloc(); v60 = (_QWORD *)operator new(8 * v7); *v9 = (__int64)v60; v9[1] = (__int64)v60; v9[2] = (__int64)&v60[v7]; do { if ( v60 ) *v60 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24; ++v60; --v7; } while ( v7 ); v10 = v9[2]; } else { v8[2] = 0LL; v10 = 0LL; } v9[1] = v10; v11 = v99; this->attribVoidVec = v9; if ( v11 <= 0 ) goto LABEL_16; v12 = *v9; v13 = *v98; if ( !((v9[1] - *v9) >> 3) ) goto LABEL_69; v14 = 1LL; if ( &_pthread_key_create ) { v15 = 0LL; while ( 1 ) { std::string::assign((std::string *)(v12 + v15), v13); HDDMBelUsageAttrib::getValueAsString((HDDMBelUsageAttrib *)&v82.qword30, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](&this->attribIndexMap, &v82.qword30) = v14 - 1; v17 = v82.qword30 - 24LL; if ( (_UNKNOWN *)(v82.qword30 - 24LL) != &std::string::_Rep::_S_empty_rep_storage && _InterlockedExchangeAdd((volatile signed __int32 *)(v82.qword30 - 8LL), 0xFFFFFFFF) <= 0 ) { std::string::_Rep::_M_destroy(v17, &v82.attribIndexMap); } if ( v99 <= (int)v14 ) break; v15 = 8 * v14; v13 = v98[v14]; v16 = (__int64 *)this->attribVoidVec; v12 = *v16; if ( (v16[1] - *v16) >> 3 <= v14 ) goto LABEL_69; ++v14; } } else { v70 = 0LL; p_attribIndexMap = &this->attribIndexMap; while ( 1 ) { std::string::assign((std::string *)(v12 + v70), v13); HDDMBelUsageAttrib::getValueAsString((HDDMBelUsageAttrib *)&v82.qword30, (int)this); *(_WORD *)std::map<std::string,unsigned short>::operator[](p_attribIndexMap, &v82.qword30) = v14 - 1; v71 = v82.qword30 - 24LL; if ( (_UNKNOWN *)(v82.qword30 - 24LL) != &std::string::_Rep::_S_empty_rep_storage ) { v74 = *(_DWORD *)(v82.qword30 - 8LL); *(_DWORD *)(v82.qword30 - 8LL) = v74 - 1; if ( v74 <= 0 ) std::string::_Rep::_M_destroy(v71, &v82.attribIndexMap); } if ( v99 <= (int)v14 ) break; v70 = 8 * v14; v13 = v98[v14]; v72 = (__int64 *)this->attribVoidVec; v12 = *v72; if ( v14 >= (v72[1] - *v72) >> 3 ) LABEL_69: std::__throw_out_of_range("vector::_M_range_check"); ++v14; } } LABEL_16: v18 = v89; v19 = (std::string *)operator new(8uLL); std::string::string(v19, v18); this->qword18 = v19; LABEL_17: if ( (v101 & 0x10) != 0 ) BYTE1(this->attrib_code1) = (4 * (v95 & 7)) | BYTE1(this->attrib_code1) & 0xE3 | 2; HDDMXng::BelUsageAttrib::~BelUsageAttrib((HDDMXng::BelUsageAttrib *)&v82.qword40); return; default: goto LABEL_17; } } void __fastcall HDDMBelUsageAttrib::writeme_pb(HDDMBelUsageAttrib *this, std::ostream *stream) { unsigned __int8 attrib_flags_high; // dl int v4; // ecx int v5; // eax int v6; // ecx unsigned int v7; // eax char v8; // cl unsigned int v9; // esi int v10; // eax unsigned __int16 v11; // dx std::string *v12; // rdi const google::protobuf::Message *v13; // rdx std::string *v14; // rdi const std::string *v15; // rbx __int64 *v16; // rax __int64 v17; // rcx __int64 v18; // r14 __int64 v19; // r14 __int64 v20; // rbp __int64 v21; // rdx std::string *v22; // rax __int64 v23; // rdx __int64 *v24; // rax __int64 v25; // rax const std::string *v26; // r12 __int64 *v27; // rax __int64 v28; // rsi __int64 v29; // rcx __int64 v30; // rdi __int64 v31; // rax __int64 v32; // rcx __int64 v33; // r14 __int64 v34; // rbp unsigned __int64 v35; // rax __int64 *v36; // rdx bool v37; // zf __int64 v38; // rax bool v39; // r12 int v40; // edi __int64 *v41; // r15 __int64 *v42; // rax __int64 v43; // rcx __int64 v44; // r12 __int64 v45; // r12 __int64 v46; // rbp __int64 v47; // rdx __int64 *v48; // rax __int64 v49; // rax int v50; // eax _BYTE *v51; // r14 unsigned __int64 v52; // rdi __int64 *attribVoidVec; // rax __int64 v54; // rcx __int64 v55; // r14 __int64 v56; // r14 __int64 v57; // rbp __int64 v58; // rdx __int64 *v59; // rax __int64 v60; // rax int v61; // r12d int v62; // eax __int64 *v63; // r15 unsigned __int64 v64; // rdi char v65; // al int qword18; // eax unsigned __int8 v67; // al __int64 v68; // xmm0_8 int v69; // esi __int64 v70; // [rsp+8h] [rbp-150h] _BYTE v72[16]; // [rsp+20h] [rbp-138h] BYREF unsigned int v73; // [rsp+30h] [rbp-128h] int v74; // [rsp+34h] [rbp-124h] std::string *v75; // [rsp+38h] [rbp-120h] int v76; // [rsp+40h] [rbp-118h] int v77; // [rsp+44h] [rbp-114h] __int64 v78; // [rsp+48h] [rbp-110h] std::string *v79; // [rsp+50h] [rbp-108h] void *v80; // [rsp+58h] [rbp-100h] int v81; // [rsp+60h] [rbp-F8h] int v82; // [rsp+64h] [rbp-F4h] __int64 v83; // [rsp+68h] [rbp-F0h] BYREF void *v84; // [rsp+80h] [rbp-D8h] int v85; // [rsp+88h] [rbp-D0h] int v86; // [rsp+8Ch] [rbp-CCh] _BYTE v87[40]; // [rsp+90h] [rbp-C8h] BYREF int v88; // [rsp+B8h] [rbp-A0h] void *src; // [rsp+C0h] [rbp-98h] int v90; // [rsp+C8h] [rbp-90h] int v91; // [rsp+CCh] [rbp-8Ch] __int64 v92; // [rsp+D0h] [rbp-88h] BYREF __int64 v93; // [rsp+E0h] [rbp-78h] BYREF int v94; // [rsp+E8h] [rbp-70h] int v95; // [rsp+ECh] [rbp-6Ch] int v96; // [rsp+F0h] [rbp-68h] int v97; // [rsp+11Ch] [rbp-3Ch] if ( HDDMDeviceDump::useXngMarks ) std::ostream::write(stream, "BELUSAGEATTRIB", 14LL); HDDMXng::BelUsageAttrib::BelUsageAttrib((HDDMXng::BelUsageAttrib *)v72); attrib_flags_high = HIBYTE(this->attrib_code); v4 = attrib_flags_high & 1; v5 = -((_BYTE)v4 == 0); v6 = (v4 << 31 >> 31) & 2; v7 = (v5 & 0xFFFFFFFE) + 6; if ( (attrib_flags_high & 2) == 0 ) v7 = v6; if ( (attrib_flags_high & 4) != 0 ) v7 |= 8u; if ( (attrib_flags_high & 0x40) != 0 ) v7 |= 0x10u; v8 = BYTE1(this->attrib_code1); if ( (v8 & 0x20) != 0 ) v7 |= 0x20u; if ( (v8 & 0x40) != 0 ) v7 |= 0x40u; v9 = v7; if ( v8 < 0 ) { LOBYTE(v9) = v7 | 0x80; v7 = v9; } v73 = v7; v74 = (attrib_flags_high >> 3) & 7; v10 = v97 | 3; v11 = this->attrib_code & 0xFFF; if ( v11 ) { v76 = v11; v10 = v97 | 7; } v12 = v75; v97 = v10 | 8; if ( v75 == (std::string *)&google::protobuf::internal::kEmptyString ) { v12 = (std::string *)operator new(8uLL); *(_QWORD *)v12 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24; v75 = v12; } std::string::assign(v12, (const std::string *)&this->attrib_name); v13 = (const google::protobuf::Message *)HIBYTE(this->attrib_code); switch ( (HIBYTE(this->attrib_code) >> 3) & 7 ) { case 1: attribVoidVec = (__int64 *)this->attribVoidVec; if ( !attribVoidVec ) goto LABEL_88; v54 = *attribVoidVec; v55 = (attribVoidVec[1] - *attribVoidVec) >> 2; if ( (int)v55 <= 0 ) goto LABEL_88; if ( !v55 ) goto LABEL_97; v56 = (unsigned int)(v55 - 1); v57 = 0LL; v58 = 0LL; while ( 1 ) { v60 = v81; v61 = *(_DWORD *)(v54 + 4 * v58); if ( v81 == v82 ) { v62 = v81 + 1; v63 = (__int64 *)v80; if ( 2 * v81 >= v81 + 1 ) v62 = 2 * v81; v82 = v62; v64 = 4LL * v62; if ( (unsigned __int64)v62 > 0x1FC0000000000000LL ) v64 = -1LL; v80 = (void *)operator new[](v64); memcpy(v80, v63, 4LL * v81); if ( v63 != &v83 && v63 ) operator delete[](v63); v60 = v81; } v81 = v60 + 1; *((_DWORD *)v80 + v60) = v61; if ( v57 == v56 ) break; v59 = (__int64 *)this->attribVoidVec; v58 = v57 + 1; v54 = *v59; if ( (v59[1] - *v59) >> 2 <= (unsigned __int64)(v57 + 1) ) LABEL_97: std::__throw_out_of_range("vector::_M_range_check"); ++v57; } LOBYTE(v13) = HIBYTE(this->attrib_code); LABEL_88: v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1); if ( (_DWORD)v13 ) { qword18 = this->qword18; v97 |= 0x10u; v77 = qword18; } break; case 2: v42 = (__int64 *)this->attribVoidVec; if ( !v42 ) goto LABEL_91; v43 = *v42; v44 = (v42[1] - *v42) >> 3; if ( (int)v44 <= 0 ) goto LABEL_91; if ( !v44 ) goto LABEL_98; v45 = (unsigned int)(v44 - 1); v46 = 0LL; v47 = 0LL; while ( 1 ) { v49 = v85; v70 = *(_QWORD *)(v43 + 8 * v47); if ( v85 == v86 ) { v50 = v85 + 1; v51 = v84; if ( 2 * v85 >= v85 + 1 ) v50 = 2 * v85; v86 = v50; v52 = 8LL * v50; if ( (unsigned __int64)v50 > 0xFE0000000000000LL ) v52 = -1LL; v84 = (void *)operator new[](v52); memcpy(v84, v51, 8LL * v85); if ( v51 != v87 && v51 ) operator delete[](v51); v49 = v85; } v85 = v49 + 1; *((_QWORD *)v84 + v49) = v70; if ( v46 == v45 ) break; v48 = (__int64 *)this->attribVoidVec; v47 = v46 + 1; v43 = *v48; if ( (v48[1] - *v48) >> 3 <= (unsigned __int64)(v46 + 1) ) LABEL_98: std::__throw_out_of_range("vector::_M_range_check"); ++v46; } LOBYTE(v13) = HIBYTE(this->attrib_code); LABEL_91: v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1); if ( (_DWORD)v13 ) { v68 = this->qword18; v97 |= 0x20u; v78 = v68; } v67 = BYTE1(this->attrib_code1); if ( (v67 & 2) != 0 ) { v97 |= 0x1000u; v88 = (v67 >> 2) & 7; } break; case 3: v27 = (__int64 *)this->attribVoidVec; if ( !v27 ) goto LABEL_85; v28 = *v27; v29 = v27[2]; v30 = *((unsigned int *)v27 + 6); v31 = *((unsigned int *)v27 + 2); v32 = v30 + 8 * (v29 - v28); if ( (int)v32 - (int)v31 <= 0 ) goto LABEL_85; if ( v32 == v31 ) goto LABEL_96; v33 = (unsigned int)(v32 - v31 - 1); v34 = 0LL; v35 = 0LL; while ( 1 ) { v37 = ((1LL << v35) & *(_QWORD *)(v28 + 8 * (v35 >> 6))) == 0; v38 = v90; v39 = !v37; if ( v90 == v91 ) { v40 = 2 * v90; v41 = (__int64 *)src; if ( 2 * v90 < v90 + 1 ) v40 = v90 + 1; v91 = v40; src = (void *)operator new[](v40); memcpy(src, v41, v90); if ( v41 != &v92 && v41 ) operator delete[](v41); v38 = v90; } v90 = v38 + 1; *((_BYTE *)src + v38) = v39; if ( v34 == v33 ) break; v36 = (__int64 *)this->attribVoidVec; v35 = v34 + 1; v28 = *v36; if ( *((unsigned int *)v36 + 6) + 8 * (v36[2] - *v36) - (unsigned __int64)*((unsigned int *)v36 + 2) <= v34 + 1 ) LABEL_96: std::__throw_out_of_range("vector<bool>::_M_range_check"); ++v34; } LOBYTE(v13) = HIBYTE(this->attrib_code); LABEL_85: v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1); if ( (_DWORD)v13 ) { v65 = this->qword18; v97 |= 0x40u; v87[36] = v65; } break; case 4: case 5: case 6: v16 = (__int64 *)this->attribVoidVec; if ( !v16 ) goto LABEL_21; v17 = *v16; v18 = (v16[1] - *v16) >> 3; if ( (int)v18 <= 0 ) goto LABEL_21; if ( !v18 ) goto LABEL_95; v19 = (unsigned int)(v18 - 1); v20 = 0LL; v21 = 0LL; while ( 1 ) { v25 = v94; v69 = v95; v26 = (const std::string *)(v17 + 8 * v21); if ( v94 >= v95 ) { if ( v95 == v96 ) { v12 = (std::string *)&v93; google::protobuf::internal::RepeatedPtrFieldBase::Reserve( (google::protobuf::internal::RepeatedPtrFieldBase *)&v93, v95 + 1); v69 = v95; } v95 = v69 + 1; v22 = (std::string *)google::protobuf::internal::StringTypeHandlerBase::New(v12); v23 = v94; v12 = v22; ++v94; *(_QWORD *)(v93 + 8 * v23) = v22; } else { ++v94; v12 = *(std::string **)(v93 + 8 * v25); } std::string::assign(v12, v26); if ( v20 == v19 ) break; v24 = (__int64 *)this->attribVoidVec; v21 = v20 + 1; v17 = *v24; if ( (v24[1] - *v24) >> 3 <= (unsigned __int64)(v20 + 1) ) LABEL_95: std::__throw_out_of_range("vector::_M_range_check"); ++v20; } LOBYTE(v13) = HIBYTE(this->attrib_code); LABEL_21: v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1); if ( (_DWORD)v13 ) { v97 |= 0x80u; v14 = v79; v15 = (const std::string *)this->qword18; if ( v79 == (std::string *)&google::protobuf::internal::kEmptyString ) { v14 = (std::string *)operator new(8uLL); *(_QWORD *)v14 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24; v79 = v14; } std::string::assign(v14, v15); } break; default: break; } HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)v72, v13); HDDMXng::BelUsageAttrib::~BelUsageAttrib((HDDMXng::BelUsageAttrib *)v72); } void __fastcall HDDMBelUsageAttrib::print(HDDMBelUsageAttrib *this, std::ostream *stream, HDDMDevice *hddmDevice) { __int64 v4; // rsi __int64 v5; // rdx char v6; // al __int64 v7; // r12 __int64 **v8; // rax __int64 *v9; // r12 __int64 *v10; // rax __int64 v11; // rsi __int64 v12; // r12 unsigned int **attribVoidVec; // rax unsigned int *v14; // r12 unsigned int *v15; // rax __int64 v16; // rsi unsigned int qword18; // r12d __int64 v18; // r12 __int64 v19; // rax unsigned int v20; // r12d _QWORD *v21; // rcx int v22; // esi _QWORD *i; // r13 __int64 v24; // rax __int64 v25; // rax unsigned int v26; // eax unsigned int qword18_low; // r12d __int64 v28; // r12 double **v29; // rax double *v30; // r12 double *v31; // rax double v32; // xmm0_8 _QWORD *v33; // r12 double v34; // [rsp+8h] [rbp-30h] v4 = *(_QWORD *)&hddmDevice->byte0; v5 = *(_QWORD *)(*(_QWORD *)&hddmDevice->byte0 - 24LL); v6 = (HIBYTE(this->attrib_code) >> 3) & 7; if ( v6 != 2 ) { if ( v6 != 3 ) { if ( v6 == 1 ) { v12 = std::__ostream_insert<char,std::char_traits<char>>(stream, v4, v5); std::__ostream_insert<char,std::char_traits<char>>(v12, "int ", 4LL); std::__ostream_insert<char,std::char_traits<char>>(v12, this->attrib_name, *((_QWORD *)this->attrib_name - 3)); std::__ostream_insert<char,std::char_traits<char>>(stream, " ( ", 3LL); attribVoidVec = (unsigned int **)this->attribVoidVec; if ( attribVoidVec ) { v14 = *attribVoidVec; v15 = attribVoidVec[1]; while ( v14 != v15 ) { while ( 1 ) { v16 = *v14++; std::ostream::operator<<(stream, v16); v15 = v14; if ( *(unsigned int **)(this->attribVoidVec + 8LL) == v14 ) break; std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2LL); if ( v14 == *(unsigned int **)(this->attribVoidVec + 8LL) ) goto LABEL_18; } } } LABEL_18: if ( (this->attrib_code & 0x1000000) != 0 ) { qword18 = this->qword18; std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9LL); std::ostream::operator<<(stream, qword18); } } else { v7 = std::__ostream_insert<char,std::char_traits<char>>(stream, v4, v5); std::__ostream_insert<char,std::char_traits<char>>(v7, "string ", 7LL); std::__ostream_insert<char,std::char_traits<char>>(v7, this->attrib_name, *((_QWORD *)this->attrib_name - 3)); std::__ostream_insert<char,std::char_traits<char>>(stream, " ( ", 3LL); v8 = (__int64 **)this->attribVoidVec; if ( v8 ) { v9 = *v8; v10 = v8[1]; while ( v9 != v10 ) { while ( 1 ) { v11 = *v9++; std::__ostream_insert<char,std::char_traits<char>>(stream, v11, *(_QWORD *)(v11 - 24)); v10 = v9; if ( *(__int64 **)(this->attribVoidVec + 8LL) == v9 ) break; std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2LL); if ( v9 == *(__int64 **)(this->attribVoidVec + 8LL) ) goto LABEL_9; } } } LABEL_9: if ( (this->attrib_code & 0x1000000) != 0 ) { v33 = (_QWORD *)this->qword18; std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9LL); std::__ostream_insert<char,std::char_traits<char>>(stream, *v33, *(_QWORD *)(*v33 - 24LL)); } } goto LABEL_11; } v18 = std::__ostream_insert<char,std::char_traits<char>>(stream, v4, v5); std::__ostream_insert<char,std::char_traits<char>>(v18, "bool ", 5LL); std::__ostream_insert<char,std::char_traits<char>>(v18, this->attrib_name, *((_QWORD *)this->attrib_name - 3)); std::__ostream_insert<char,std::char_traits<char>>(stream, " ( ", 3LL); v19 = this->attribVoidVec; if ( !v19 ) { LABEL_28: if ( (this->attrib_code & 0x1000000) != 0 ) { qword18_low = LOBYTE(this->qword18); std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9LL); std::ostream::_M_insert<bool>(stream, qword18_low); } goto LABEL_11; } v20 = *(_DWORD *)(v19 + 8); v21 = *(_QWORD **)(v19 + 16); v22 = *(_DWORD *)(v19 + 24); for ( i = *(_QWORD **)v19; ; ++i ) { while ( 1 ) { if ( v21 == i && v20 == v22 ) goto LABEL_28; std::ostream::_M_insert<bool>(stream, ((1LL << v20) & *i) != 0); v24 = this->attribVoidVec; v21 = &i[(v20 + 1LL) >> 6]; if ( v21 == *(_QWORD **)(v24 + 16) ) { v22 = ((_BYTE)v20 + 1) & 0x3F; if ( v22 == *(_DWORD *)(v24 + 24) ) break; } std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2LL); v25 = this->attribVoidVec; v21 = *(_QWORD **)(v25 + 16); v22 = *(_DWORD *)(v25 + 24); v26 = v20 + 1; if ( v20 == 63 ) goto LABEL_32; LABEL_25: v20 = v26; } v26 = v20 + 1; if ( v20 != 63 ) goto LABEL_25; LABEL_32: v20 = 0; } } v28 = std::__ostream_insert<char,std::char_traits<char>>(stream, v4, v5); std::__ostream_insert<char,std::char_traits<char>>(v28, "double ", 7LL); std::__ostream_insert<char,std::char_traits<char>>(v28, this->attrib_name, *((_QWORD *)this->attrib_name - 3)); std::__ostream_insert<char,std::char_traits<char>>(stream, " ( ", 3LL); v29 = (double **)this->attribVoidVec; if ( v29 ) { v30 = *v29; v31 = v29[1]; while ( v30 != v31 ) { while ( 1 ) { v32 = *v30++; std::ostream::_M_insert<double>(stream, v32); v31 = v30; if ( *(double **)(this->attribVoidVec + 8LL) == v30 ) break; std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2LL); if ( v30 == *(double **)(this->attribVoidVec + 8LL) ) goto LABEL_38; } } } LABEL_38: if ( (this->attrib_code & 0x1000000) != 0 ) { v34 = *(double *)&this->qword18; std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9LL); std::ostream::_M_insert<double>(stream, v34); } LABEL_11: std::__ostream_insert<char,std::char_traits<char>>(stream, " ) ", 3LL); if ( (this->attrib_code & 0x2000000) != 0 ) std::__ostream_insert<char,std::char_traits<char>>(stream, " (HIDDEN=true)", 14LL); } void __fastcall HDDMBelUsageAttrib::~HDDMBelUsageAttrib(HDDMBelUsageAttrib *this) { char v2; // al __int64 **v3; // r14 __int64 *v4; // r13 __int64 *v5; // rbp void *v6; // rdi __int64 *v7; // rdi _QWORD *qword18; // rbp void **attribVoidVec; // rbp std::string *attrib_name; // rax volatile signed __int32 *v11; // rdi int v12; // eax __int64 v13; // rax void *v14; // rdi int v15; // edx int v16; // edx _BYTE v17[57]; // [rsp+Fh] [rbp-39h] BYREF v2 = (HIBYTE(this->attrib_code) >> 3) & 7; if ( v2 == 2 || v2 == 3 || v2 == 1 ) { attribVoidVec = (void **)this->attribVoidVec; if ( attribVoidVec ) { if ( *attribVoidVec ) operator delete(*attribVoidVec); operator delete(attribVoidVec); } this->attribVoidVec = 0LL; } else { v3 = (__int64 **)this->attribVoidVec; if ( v3 ) { v4 = v3[1]; v5 = *v3; if ( v4 == *v3 ) { v7 = v3[1]; } else { if ( &_pthread_key_create ) { do { v6 = (void *)(*v5 - 24); if ( v6 != &std::string::_Rep::_S_empty_rep_storage && _InterlockedExchangeAdd((volatile signed __int32 *)(*v5 - 8), 0xFFFFFFFF) <= 0 ) { std::string::_Rep::_M_destroy(v6, v17); } ++v5; } while ( v4 != v5 ); } else { do { v13 = *v5; v14 = (void *)(*v5 - 24); if ( v14 != &std::string::_Rep::_S_empty_rep_storage ) { v16 = *(_DWORD *)(v13 - 8); *(_DWORD *)(v13 - 8) = v16 - 1; if ( v16 <= 0 ) std::string::_Rep::_M_destroy(v14, v17); } ++v5; } while ( v4 != v5 ); } v7 = *v3; } if ( v7 ) operator delete(v7); operator delete(v3); this->attribVoidVec = 0LL; } qword18 = (_QWORD *)this->qword18; if ( qword18 ) { std::string::_Rep::_M_dispose(*qword18 - 24LL, v17); operator delete(qword18); this->qword18 = 0LL; } } sub_2174F50(this); std::_Rb_tree<std::string,std::pair<std::string const,unsigned short>,std::_Select1st<std::pair<std::string const,unsigned short>>,std::less<std::string>,std::allocator<std::pair<std::string const,unsigned short>>>::_M_erase( &this->attribIndexMap, this->qword30); attrib_name = this->attrib_name; v11 = (volatile signed __int32 *)((char *)attrib_name - 24); if ( (_UNKNOWN *)((char *)attrib_name - 24) != &std::string::_Rep::_S_empty_rep_storage ) { if ( &_pthread_key_create ) { v12 = _InterlockedExchangeAdd(v11 + 4, 0xFFFFFFFF); } else { v15 = *((_DWORD *)attrib_name - 2); *((_DWORD *)attrib_name - 2) = v15 - 1; v12 = v15; } if ( v12 <= 0 ) std::string::_Rep::_M_destroy(v11, v17); } } void __fastcall HDDMBelUsageAttrib::HDDMBelUsageAttrib(HDDMBelUsageAttrib *this) { attrib_code1 = this->attrib_code1; LOWORD(this->attrib_code) &= 0xF000u; BYTE2(this->attrib_code1) &= 0xF0u; LODWORD(this->qword28) = 0; this->attrib_code |= 0xFFF000u; this->qword30 = 0LL; HIBYTE(this->attrib_code) = 0; LOWORD(this->attrib_code1) = attrib_code1 & 0xFE00; BYTE1(this->attrib_code1) = 0; HIWORD(this->attrib_code1) |= 0xFFF0u; this->qword48 = 0LL; this->qword18 = 0LL; this->attribVoidVec = 0LL; this->attrib_name = (std::string *)((char *)&std::string::_Rep::_S_empty_rep_storage + 24); this->qword38 = &this->qword28; this->qword40 = &this->qword28; }
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值