mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
changed contract
This commit is contained in:
@@ -124,6 +124,7 @@
|
|||||||
<ClCompile Include="src\NetworkOPs.cpp" />
|
<ClCompile Include="src\NetworkOPs.cpp" />
|
||||||
<ClCompile Include="src\NewcoinAddress.cpp" />
|
<ClCompile Include="src\NewcoinAddress.cpp" />
|
||||||
<ClCompile Include="src\NicknameState.cpp" />
|
<ClCompile Include="src\NicknameState.cpp" />
|
||||||
|
<ClCompile Include="src\Operation.cpp" />
|
||||||
<ClCompile Include="src\OrderBook.cpp" />
|
<ClCompile Include="src\OrderBook.cpp" />
|
||||||
<ClCompile Include="src\OrderBookDB.cpp" />
|
<ClCompile Include="src\OrderBookDB.cpp" />
|
||||||
<ClCompile Include="src\PackedMessage.cpp" />
|
<ClCompile Include="src\PackedMessage.cpp" />
|
||||||
@@ -216,6 +217,7 @@
|
|||||||
<ClInclude Include="src\NetworkStatus.h" />
|
<ClInclude Include="src\NetworkStatus.h" />
|
||||||
<ClInclude Include="src\NewcoinAddress.h" />
|
<ClInclude Include="src\NewcoinAddress.h" />
|
||||||
<ClInclude Include="src\NicknameState.h" />
|
<ClInclude Include="src\NicknameState.h" />
|
||||||
|
<ClInclude Include="src\Operation.h" />
|
||||||
<ClInclude Include="src\OrderBook.h" />
|
<ClInclude Include="src\OrderBook.h" />
|
||||||
<ClInclude Include="src\OrderBookDB.h" />
|
<ClInclude Include="src\OrderBookDB.h" />
|
||||||
<ClInclude Include="src\PackedMessage.h" />
|
<ClInclude Include="src\PackedMessage.h" />
|
||||||
|
|||||||
@@ -291,6 +291,9 @@
|
|||||||
<ClCompile Include="src\ScriptData.cpp">
|
<ClCompile Include="src\ScriptData.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\Operation.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="KnownNodeList.h">
|
<ClInclude Include="KnownNodeList.h">
|
||||||
@@ -542,6 +545,9 @@
|
|||||||
<ClInclude Include="src\Interpreter.h">
|
<ClInclude Include="src\Interpreter.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\Operation.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="wallet.xml" />
|
<None Include="wallet.xml" />
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "Interpreter.h"
|
#include "Interpreter.h"
|
||||||
|
#include "Operation.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -8,220 +9,6 @@ We also need to charge for each op
|
|||||||
|
|
||||||
namespace Script {
|
namespace Script {
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
/// Operations
|
|
||||||
|
|
||||||
int Operation::getFee()
|
|
||||||
{
|
|
||||||
return(theConfig.FEE_CONTRACT_OPERATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is just an Int in the code
|
|
||||||
class IntOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer data=interpreter->getIntData();
|
|
||||||
if(data->isInt32())
|
|
||||||
{
|
|
||||||
interpreter->pushStack( data );
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class FloatOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer data=interpreter->getFloatData();
|
|
||||||
if(data->isFloat())
|
|
||||||
{
|
|
||||||
interpreter->pushStack( data );
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Uint160Op : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer data=interpreter->getUint160Data();
|
|
||||||
if(data->isUint160())
|
|
||||||
{
|
|
||||||
interpreter->pushStack( data );
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class AddOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer data1=interpreter->popStack();
|
|
||||||
Data::pointer data2=interpreter->popStack();
|
|
||||||
if( (data1->isInt32() || data1->isFloat()) &&
|
|
||||||
(data2->isInt32() || data2->isFloat()) )
|
|
||||||
{
|
|
||||||
if(data1->isFloat() || data2->isFloat()) interpreter->pushStack(Data::pointer(new FloatData(data1->getFloat()+data2->getFloat())));
|
|
||||||
else interpreter->pushStack(Data::pointer(new IntData(data1->getInt()+data2->getInt())));
|
|
||||||
return(true);
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class SubOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer data1=interpreter->popStack();
|
|
||||||
Data::pointer data2=interpreter->popStack();
|
|
||||||
if( (data1->isInt32() || data1->isFloat()) &&
|
|
||||||
(data2->isInt32() || data2->isFloat()) )
|
|
||||||
{
|
|
||||||
if(data1->isFloat() || data2->isFloat()) interpreter->pushStack(Data::pointer(new FloatData(data1->getFloat()-data2->getFloat())));
|
|
||||||
else interpreter->pushStack(Data::pointer(new IntData(data1->getInt()-data2->getInt())));
|
|
||||||
return(true);
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class StartBlockOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer offset=interpreter->getIntData();
|
|
||||||
return(interpreter->startBlock(offset->getInt()));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class EndBlockOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
return(interpreter->endBlock());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class StopOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
interpreter->stop();
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class AcceptDataOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer data=interpreter->popStack();
|
|
||||||
if(data->isInt32())
|
|
||||||
{
|
|
||||||
interpreter->pushStack( interpreter->getAcceptData(data->getInt()) );
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class JumpIfOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer offset=interpreter->getIntData();
|
|
||||||
Data::pointer cond=interpreter->popStack();
|
|
||||||
if(cond->isBool() && offset->isInt32())
|
|
||||||
{
|
|
||||||
if(cond->isTrue())
|
|
||||||
{
|
|
||||||
return(interpreter->jumpTo(offset->getInt()));
|
|
||||||
}
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class JumpOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer offset=interpreter->getIntData();
|
|
||||||
if(offset->isInt32())
|
|
||||||
{
|
|
||||||
return(interpreter->jumpTo(offset->getInt()));
|
|
||||||
}
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class SendXNSOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer sourceID=interpreter->popStack();
|
|
||||||
Data::pointer destID=interpreter->popStack();
|
|
||||||
Data::pointer amount=interpreter->popStack();
|
|
||||||
if(sourceID->isUint160() && destID->isUint160() && amount->isInt32() && interpreter->canSign(sourceID->getUint160()))
|
|
||||||
{
|
|
||||||
// make sure:
|
|
||||||
// source is either, this contract, issuer, or acceptor
|
|
||||||
|
|
||||||
// TODO do the send
|
|
||||||
//interpreter->pushStack( send result);
|
|
||||||
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class GetDataOp : public Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool work(Interpreter* interpreter)
|
|
||||||
{
|
|
||||||
Data::pointer index=interpreter->popStack();
|
|
||||||
if(index->isInt32())
|
|
||||||
{
|
|
||||||
interpreter->pushStack( interpreter->getContractData(index->getInt()));
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
Interpreter::Interpreter()
|
Interpreter::Interpreter()
|
||||||
{
|
{
|
||||||
mContract=NULL;
|
mContract=NULL;
|
||||||
@@ -234,32 +21,55 @@ Interpreter::Interpreter()
|
|||||||
mBlockJump=0;
|
mBlockJump=0;
|
||||||
|
|
||||||
mFunctionTable.resize(NUM_OF_OPS);
|
mFunctionTable.resize(NUM_OF_OPS);
|
||||||
|
/*
|
||||||
mFunctionTable[INT_OP]=new IntOp();
|
mFunctionTable[INT_OP]=new IntOp();
|
||||||
mFunctionTable[FLOAT_OP]=new FloatOp();
|
mFunctionTable[FLOAT_OP]=new FloatOp();
|
||||||
mFunctionTable[UINT160_OP]=new Uint160Op();
|
mFunctionTable[UINT160_OP]=new Uint160Op();
|
||||||
mFunctionTable[BOOL_OP]=new Uint160Op();
|
mFunctionTable[BOOL_OP]=new Uint160Op();
|
||||||
|
mFunctionTable[PATH_OP]=new Uint160Op();
|
||||||
|
|
||||||
mFunctionTable[ADD_OP]=new AddOp();
|
mFunctionTable[ADD_OP]=new AddOp();
|
||||||
mFunctionTable[SUB_OP]=new SubOp();
|
mFunctionTable[SUB_OP]=new SubOp();
|
||||||
|
mFunctionTable[MUL_OP]=new MulOp();
|
||||||
/*PATH_OP,
|
mFunctionTable[DIV_OP]=new DivOp();
|
||||||
ADD_OP,SUB_OP,MUL_OP,DIV_OP,MOD_OP,
|
mFunctionTable[MOD_OP]=new ModOp();
|
||||||
GTR_OP,LESS_OP,EQUAL_OP,NOT_EQUAL_OP,
|
mFunctionTable[GTR_OP]=new GtrOp();
|
||||||
AND_OP,OR_OP,NOT_OP,
|
mFunctionTable[LESS_OP]=new LessOp();
|
||||||
JUMP_OP, JUMPIF_OP,
|
mFunctionTable[EQUAL_OP]=new SubOp();
|
||||||
STOP_OP, CANCEL_OP,
|
mFunctionTable[NOT_EQUAL_OP]=new SubOp();
|
||||||
|
mFunctionTable[AND_OP]=new SubOp();
|
||||||
BLOCK_OP, BLOCK_END_OP,
|
mFunctionTable[OR_OP]=new SubOp();
|
||||||
SEND_XNS_OP,SEND_OP,REMOVE_CONTRACT_OP,FEE_OP,CHANGE_CONTRACT_OWNER_OP,
|
mFunctionTable[NOT_OP]=new SubOp();
|
||||||
STOP_REMOVE_OP,
|
mFunctionTable[JUMP_OP]=new SubOp();
|
||||||
SET_DATA_OP,GET_DATA_OP, GET_NUM_DATA_OP,
|
mFunctionTable[JUMPIF_OP]=new SubOp();
|
||||||
SET_REGISTER_OP,GET_REGISTER_OP,
|
mFunctionTable[STOP_OP]=new SubOp();
|
||||||
GET_ISSUER_ID_OP, GET_OWNER_ID_OP, GET_LEDGER_TIME_OP, GET_LEDGER_NUM_OP, GET_RAND_FLOAT_OP,
|
mFunctionTable[CANCEL_OP]=new SubOp();
|
||||||
GET_XNS_ESCROWED_OP, GET_RIPPLE_ESCROWED_OP, GET_RIPPLE_ESCROWED_CURRENCY_OP, GET_RIPPLE_ESCROWED_ISSUER,
|
mFunctionTable[BLOCK_OP]=new SubOp();
|
||||||
GET_ACCEPT_DATA_OP, GET_ACCEPTOR_ID_OP, GET_CONTRACT_ID_OP,
|
mFunctionTable[BLOCK_END_OP]=new SubOp();
|
||||||
*/
|
mFunctionTable[SEND_XNS_OP]=new SendXNSOp();
|
||||||
|
mFunctionTable[SEND_OP]=new SendOp();
|
||||||
|
mFunctionTable[REMOVE_CONTRACT_OP]=new SubOp();
|
||||||
|
mFunctionTable[FEE_OP]=new SubOp();
|
||||||
|
mFunctionTable[CHANGE_CONTRACT_OWNER_OP]=new SubOp();
|
||||||
|
mFunctionTable[STOP_REMOVE_OP]=new SubOp();
|
||||||
|
mFunctionTable[SET_DATA_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_DATA_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_NUM_DATA_OP]=new SubOp();
|
||||||
|
mFunctionTable[SET_REGISTER_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_REGISTER_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_ISSUER_ID_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_OWNER_ID_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_LEDGER_TIME_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_LEDGER_NUM_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_RAND_FLOAT_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_XNS_ESCROWED_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_RIPPLE_ESCROWED_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_RIPPLE_ESCROWED_CURRENCY_OP]=new SubOp();
|
||||||
|
mFunctionTable[GET_RIPPLE_ESCROWED_ISSUER]=new GetRippleEscrowedIssuerOp();
|
||||||
|
mFunctionTable[GET_ACCEPT_DATA_OP]=new AcceptDataOp();
|
||||||
|
mFunctionTable[GET_ACCEPTOR_ID_OP]=new GetAcceptorIDOp();
|
||||||
|
mFunctionTable[GET_CONTRACT_ID_OP]=new GetContractIDOp();
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::pointer Interpreter::popStack()
|
Data::pointer Interpreter::popStack()
|
||||||
|
|||||||
@@ -10,20 +10,9 @@
|
|||||||
|
|
||||||
namespace Script {
|
namespace Script {
|
||||||
|
|
||||||
class Interpreter;
|
class Operation;
|
||||||
|
|
||||||
// Contracts are non typed have variable data types
|
// Contracts are non typed have variable data types
|
||||||
|
|
||||||
|
|
||||||
class Operation
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// returns false if there was an error
|
|
||||||
virtual bool work(Interpreter* interpreter)=0;
|
|
||||||
|
|
||||||
virtual int getFee();
|
|
||||||
};
|
|
||||||
|
|
||||||
class Interpreter
|
class Interpreter
|
||||||
{
|
{
|
||||||
std::vector<Operation*> mFunctionTable;
|
std::vector<Operation*> mFunctionTable;
|
||||||
@@ -42,7 +31,7 @@ class Interpreter
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
enum { INT_OP,FLOAT_OP,UINT160_OP,BOOL_OP,PATH_OP,
|
enum { INT_OP=1,FLOAT_OP,UINT160_OP,BOOL_OP,PATH_OP,
|
||||||
ADD_OP,SUB_OP,MUL_OP,DIV_OP,MOD_OP,
|
ADD_OP,SUB_OP,MUL_OP,DIV_OP,MOD_OP,
|
||||||
GTR_OP,LESS_OP,EQUAL_OP,NOT_EQUAL_OP,
|
GTR_OP,LESS_OP,EQUAL_OP,NOT_EQUAL_OP,
|
||||||
AND_OP,OR_OP,NOT_OP,
|
AND_OP,OR_OP,NOT_OP,
|
||||||
|
|||||||
@@ -25,6 +25,23 @@ LedgerEntryFormat LedgerFormats[]=
|
|||||||
{ S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 },
|
{ S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 },
|
||||||
{ sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } }
|
{ sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } }
|
||||||
},
|
},
|
||||||
|
{ "Contract", ltCONTRACT, {
|
||||||
|
{ S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 },
|
||||||
|
{ S_FIELD(Account), STI_ACCOUNT, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(LastTxnID), STI_HASH256, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(Issuer), STI_ACCOUNT, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(Owner), STI_ACCOUNT, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(Expiration), STI_UINT32, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(BondAmount), STI_UINT32, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(CreateCode), STI_VL, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(FundCode), STI_VL, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(RemoveCode), STI_VL, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(ExpireCode), STI_VL, SOE_REQUIRED, 0 },
|
||||||
|
{ S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 },
|
||||||
|
{ sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } }
|
||||||
|
},
|
||||||
{ "DirectoryNode", ltDIR_NODE, {
|
{ "DirectoryNode", ltDIR_NODE, {
|
||||||
{ S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 },
|
{ S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 },
|
||||||
{ S_FIELD(Indexes), STI_VECTOR256, SOE_REQUIRED, 0 },
|
{ S_FIELD(Indexes), STI_VECTOR256, SOE_REQUIRED, 0 },
|
||||||
@@ -77,21 +94,6 @@ LedgerEntryFormat LedgerFormats[]=
|
|||||||
{ S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 },
|
{ S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 },
|
||||||
{ sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } }
|
{ sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } }
|
||||||
},
|
},
|
||||||
{ "Contract", ltCONTRACT, {
|
|
||||||
{ S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 },
|
|
||||||
{ S_FIELD(Issuer), STI_ACCOUNT, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(Owner), STI_ACCOUNT, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(Expiration), STI_UINT32, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(BondAmount), STI_UINT32, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(StampEscrow), STI_UINT32, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(RippleEscrow), STI_AMOUNT, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(CreateCode), STI_VL, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(FundCode), STI_VL, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(RemoveCode), STI_VL, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(ExpireCode), STI_VL, SOE_REQUIRED, 0 },
|
|
||||||
{ S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 },
|
|
||||||
{ sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } }
|
|
||||||
},
|
|
||||||
{ NULL, ltINVALID }
|
{ NULL, ltINVALID }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user