Esempio n. 1
0
int OOBase::File::open(const char* filename, bool writeable)
{
	if (!filename)
		return EINVAL;

#if defined(_WIN32)
	ScopedArrayPtr<wchar_t> wname;
	int err = Win32::utf8_to_wchar_t(filename,wname);
	if (err)
		return err;

	DWORD dwAccess = GENERIC_READ;
	DWORD dwDisp = OPEN_EXISTING;
	if (writeable)
	{
		dwAccess |= GENERIC_WRITE;
		dwDisp = OPEN_ALWAYS;
	}

	m_fd = ::CreateFileW(wname.get(),dwAccess,FILE_SHARE_READ,NULL,dwDisp,FILE_ATTRIBUTE_NORMAL,NULL);
	if (!m_fd.valid())
		return ::GetLastError();

#elif defined(HAVE_UNISTD_H)

	int flags = O_RDONLY;
	if (writeable)
		flags = O_RDWR | O_CREAT;
		
	m_fd = POSIX::open(filename,flags,0664);
	if (!m_fd.valid())
		return errno;
#endif
	return 0;
}
Esempio n. 2
0
bool OOBase::Environment::getenv(const char* envvar, String& strValue)
{
	ScopedArrayPtr<wchar_t> wenvvar;
	ScopedArrayPtr<wchar_t> wenv;

	int err = Win32::utf8_to_wchar_t(envvar,wenvvar);
	for (DWORD dwLen = 128;!err;)
	{
		if (!wenv.resize(dwLen))
			return false;

		DWORD dwActualLen = GetEnvironmentVariableW(wenvvar.get(),wenv.get(),dwLen);
		if (dwActualLen < dwLen)
		{
			if (dwActualLen == 0)
			{
				err = GetLastError();
				if (err == ERROR_ENVVAR_NOT_FOUND)
					err = 0;
			}
			else if (dwActualLen > 1)
				err = strValue.wchar_t_to_utf8(wenv.get());
			
			break;
		}

		dwLen = dwActualLen;
	}
	
	return err == 0;
}
Esempio n. 3
0
int OOBase::CmdArgs::parse(options_t& options, arguments_t& args, int skip) const
{
	int argc = 0;
	UniquePtr<LPWSTR,Win32::LocalAllocator> argvw(CommandLineToArgvW(GetCommandLineW(),&argc));
	if (!argvw)
		return GetLastError();

	ScopedArrayPtr<const char*> argv;
	Vector<SharedString<ThreadLocalAllocator>,ThreadLocalAllocator> arg_strings;
	if (!argv.resize(argc) || !arg_strings.resize(argc))
		return system_error();

	for (int i=0;i<argc;++i)
	{
		int err = arg_strings[i].wchar_t_to_utf8(argvw.get()[i]);
		if (err)
			return err;

		argv[i] = arg_strings[i].c_str();
	}

	return parse(argc,argv.get(),options,args,skip);
}
Esempio n. 4
0
int OOBase::Environment::get_block(const env_table_t& tabEnv, ScopedArrayPtr<wchar_t>& ptr)
{
	if (tabEnv.empty())
		return 0;

	// Copy and widen to UNICODE
	typedef SharedPtr<wchar_t> temp_wchar_t;

	// Sort environment block - UNICODE, no-locale, case-insensitive (from MSDN)
	struct env_sort
	{
		bool operator ()(const OOBase::SharedPtr<wchar_t>& s1, const OOBase::SharedPtr<wchar_t>& s2) const
		{
			return (_wcsicmp(s1.get(),s2.get()) < 0);
		}
	};

	StackAllocator<1024> allocator;
	Table<temp_wchar_t,temp_wchar_t,env_sort,AllocatorInstance> wenv(env_sort(),allocator);

	size_t total_size = 0;
	for (env_table_t::const_iterator i=tabEnv.begin();i;++i)
	{
		int err = Win32::utf8_to_wchar_t(i->first.c_str(),ptr);
		if (!err)
		{
			// Include \0 and optionally '=' length
			size_t len = wcslen(ptr.get());
			total_size += len + 1;

			temp_wchar_t key = make_shared(static_cast<wchar_t*>(allocator.allocate(len+1,alignment_of<wchar_t>::value)),allocator);
			if (!key)
				return ERROR_OUTOFMEMORY;

			wcscpy(key.get(),ptr.get());

			err = Win32::utf8_to_wchar_t(i->second.c_str(),ptr);
			if (!err)
			{
				temp_wchar_t value;

				len = wcslen(ptr.get());
				if (len)
				{
					total_size += len + 1;

					value = make_shared(static_cast<wchar_t*>(allocator.allocate(len+1,alignment_of<wchar_t>::value)),allocator);
					if (!value)
						return ERROR_OUTOFMEMORY;

					wcscpy(value.get(),ptr.get());
				}

				if (!wenv.insert(key,value))
					return ERROR_OUTOFMEMORY;
			}
		}
		
		if (err)
			return err;
	}

	// And now copy into one giant block
	if (!ptr.resize(total_size + 2))
		return ERROR_OUTOFMEMORY;

	wchar_t* pout = ptr.get();
	for (Table<temp_wchar_t,temp_wchar_t,env_sort,AllocatorInstance>::iterator i=wenv.begin();i;++i)
	{
		const wchar_t* p = i->first.get();

		while (*p != L'\0')
			*pout++ = *p++;

		p = i->second.get();
		if (p && *p != L'\0')
		{
			*pout++ = L'=';

			while (*p != L'\0')
				*pout++ = *p++;
		}

		*pout++ = L'\0';
	}

	// Terminate with \0
	*pout++ = L'\0';
	*pout++ = L'\0';

	return 0;
}