Пример #1
0
void VJSSharedWorkerClass::_Construct (XBOX::VJSParms_callAsConstructor &ioParms)
{
    if (!ioParms.CountParams()
            || !ioParms.IsStringParam(1)
            || (ioParms.CountParams() >= 2 && !ioParms.IsStringParam(2))) {

        XBOX::vThrowError(XBOX::VE_INVALID_PARAMETER);
        ioParms.ReturnUndefined();
        return;

    }

    XBOX::VString		url, name;
    bool				reUseContext;
    VJSWorker			*outsideWorker;
    VJSWebWorkerObject	*workerProxy;
    XBOX::VJSContext	context(ioParms.GetContext());
    XBOX::VJSObject		constructedObject(context);

    ioParms.GetStringParam(1, url);
    if (ioParms.CountParams() == 2)

        ioParms.GetStringParam(2, name);

    outsideWorker = VJSWorker::RetainWorker(context);

    if (ioParms.CountParams() < 3 || !ioParms.IsBooleanParam(3) || !ioParms.GetBoolParam(3, &reUseContext))

        reUseContext = false;

    if ((workerProxy = VJSWebWorkerObject::_CreateWorker(context, outsideWorker, reUseContext, url, false, name)) != NULL) {

        constructedObject = VJSDedicatedWorkerClass::CreateInstance(context, workerProxy);
        workerProxy->fOnErrorPort->SetObject(outsideWorker, constructedObject);

        XBOX::VJSObject	messagePortObject(context);

        messagePortObject = VJSMessagePortClass::CreateInstance(context, workerProxy->fOnMessagePort);
        workerProxy->fOnMessagePort->SetObject(outsideWorker, messagePortObject);

        constructedObject.SetProperty("port", messagePortObject);

    } else

        constructedObject.SetNull();

    ioParms.ReturnConstructedObject(constructedObject);

    XBOX::ReleaseRefCountable<VJSWorker>(&outsideWorker);
}
XBOX::VJSObject VJSTextStream::_Construct (VJSParms_withArguments &ioParms)
{
	XBOX::VJSObject	constructedObject(ioParms.GetContext());
	XBOX::VFile		*file;
	
	constructedObject.SetUndefined();
	if ((file = ioParms.RetainFileParam(1)) == NULL) {

		XBOX::vThrowError(XBOX::VE_JVSC_WRONG_PARAMETER_TYPE_FILE, "1");
		return constructedObject;

	}
	
	XBOX::VString	mode;
	bool			forwrite, overwrite	= false;
	CharSet			defaultCharSet		= VTC_UTF_8;
	sLONG			xcharset			= 0;

	if (ioParms.GetStringParam(2, mode) && mode == L"Overwrite") {

		forwrite = true;
		overwrite = true;

	} else

		forwrite = ioParms.GetBoolParam(2, L"Write", L"Read");
	
	if (ioParms.GetLongParam(3, &xcharset) && xcharset != 0)

		defaultCharSet = (CharSet) xcharset;
	
	XBOX::VError	err = XBOX::VE_OK;
	
	if (forwrite) {

		if (!file->Exists())

			err = file->Create();

		else if (overwrite) {

			if ((err = file->Delete()) == XBOX::VE_OK)

				err = file->Create();

		}

	}
	
	VFileStream	*stream = NULL;

	if (err == XBOX::VE_OK) {

		if ((stream = new VFileStream(file)) == NULL) 
		
			XBOX::vThrowError(XBOX::VE_MEMORY_FULL);

		else if (forwrite) {

			if (err == XBOX::VE_OK)

				err = stream->OpenWriting();

			if (err == XBOX::VE_OK)

				stream->SetCharSet(defaultCharSet);

			stream->SetPos(stream->GetSize());

		} else {

			err = stream->OpenReading();
			if (err == XBOX::VE_OK) {

				stream->GuessCharSetFromLeadingBytes(defaultCharSet);
				stream->SetCarriageReturnMode(eCRM_NATIVE);

			}

		}

	}

	if (stream != NULL && err == XBOX::VE_OK) {

		VJSTextStreamState	*textStreamState;
	
		if ((textStreamState = new VJSTextStreamState()) == NULL) {

			delete stream;
			XBOX::vThrowError(XBOX::VE_MEMORY_FULL);

		} else {

			textStreamState->fStream = stream;
			textStreamState->fBuffer.Clear();
			textStreamState->fIndex = 0;
			textStreamState->fPosition = 0;

			constructedObject = VJSTextStream::CreateInstance(ioParms.GetContextRef(), textStreamState);

		}
	
	} 
				
	ReleaseRefCountable(&file);

	return constructedObject;
}