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:

Code:
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;
	}
}