The multiplier is asset specific, so you must set it after selecting the asset, like the other asset parameters.
The time is a union. In historical data it's the quote time, in option chains it's the first 8 bytes of the trading class.
Here's a section of the IB plugin code that loads the option chain into the CONTRACT structs:
void contractDetails(int id, const ContractDetails& CD )
{
if(id != g_Id || !g_Contracts) return;
Contract C = CD.summary;
memset(g_Contracts,0,sizeof(CONTRACT));
int Multiplier = atoi(C.multiplier.c_str());
if(g_Multiplier > 0
&& g_Multiplier != Multiplier) return;
if(*g_TradingClass
&& 0 != strcmpi(g_TradingClass,C.tradingClass.c_str())) return;
if(C.secType == *SecType::FOP) {
g_Contracts->Type = FUTURE | ((C.right == "C")? CALL : PUT);
g_Contracts->fStrike = C.strike;
} else if(C.secType == *SecType::OPT) {
g_Contracts->Type = (C.right == "C"? CALL : PUT);
g_Contracts->fStrike = C.strike;
} else if(C.secType == *SecType::FUT) {
g_Contracts->Type = FUTURE;
g_Contracts->fStrike = 0;
}
strcpy_s((char*)g_Contracts,8,C.tradingClass.c_str());
g_Contracts->Expiry = atoi(C.expiry.c_str());
g_Contracts->fVal = Multiplier;
g_Contracts++;
if(++g_nContracts >= NUM_CONTRACTS) {
g_End = TRUE;
g_Contracts = NULL;
}
}