/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_registry.hxx"

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>
#include <sys/types.h>

#include "registry/registry.h"
#include	<rtl/ustring.hxx>
#include	<rtl/alloc.h>

using namespace std;

/*****************************************************************
	MyTimer
*****************************************************************/
#ifndef UNX
class MyTimer
{
public:
	void start() { _ftime( &m_start ); };
	void stop()
	{ 	
		_ftime( &m_stop );
		m_diff = difftime(m_stop.time, m_start.time);
		if (m_stop.millitm > m_start.millitm)
		{
			m_diff += ((double)(m_stop.millitm - m_start.millitm)) / 1000;
		}
		else
		{
			m_diff -= 1;
			m_diff += ((double)(1000 - (m_start.millitm - m_stop.millitm))) / 1000;
		}
		printf(" %.4f Sekunden\n", m_diff);
	};

protected:
#ifdef OS2
	struct timeb m_start, m_stop;
#else
	struct _timeb m_start, m_stop;
#endif
	double m_diff;
};
#else
extern "C" int ftime(struct timeb *pt);

class MyTimer
{
public:
	void start() { ftime( &m_start ); };
	void stop()
	{ 	
		ftime( &m_stop );
		m_diff = difftime(m_stop.time, m_start.time);
		if (m_stop.millitm > m_start.millitm)
		{
			m_diff += ((double)(m_stop.millitm - m_start.millitm)) / 1000;
		}
		else
		{
			m_diff -= 1;
			m_diff += ((double)(1000 - (m_start.millitm - m_stop.millitm))) / 1000;
		}
		printf(" %.4f Sekunden\n", m_diff);
	};

protected:
	struct timeb m_start, m_stop;
	double m_diff;
};
#endif

using namespace rtl;

#if (defined UNX) || (defined OS2)
int main( int argc, char * argv[] )
#else
int _cdecl main( int argc, char * argv[] )
#endif
{
	RegHandle 		hReg;
	RegKeyHandle	hRootKey, hKey, hSubKey, hSubSubKey;
	OUString 		sName1(RTL_CONSTASCII_USTRINGPARAM("regkey"));
	OUString 		sName2(RTL_CONSTASCII_USTRINGPARAM("regSubkey"));
	OUString 		sName3(RTL_CONSTASCII_USTRINGPARAM("regSubSubkey"));
	OUString 		keyName1;
	OUString 		keyName2;
	OUString 		keyName3;
	int 			S1 = 10;
	int 			S2 = 10;
	int 			S3 = 10;
	MyTimer			aTimer;

	if (argc < 4)
	{
		cerr << "using regspeed count1 count2 count3\n";
		exit(1);		
	}	

	S1 = atoi(argv[1]);
	S2 = atoi(argv[2]);
	S3 = atoi(argv[3]);

	OUString speedReg( RTL_CONSTASCII_USTRINGPARAM("speed.reg"));	
	if (reg_createRegistry(speedReg.pData, &hReg))
	{
		cout << "creating registry \"test.reg\" failed\n"; 
	} else
	{
		if (reg_openRootKey(hReg, &hRootKey))
		{
			cout << "open root key \"test.reg\" failed\n"; 
		} else
		{
			printf("\n %d keys anlegen, oeffnen und schliessen dauert ... ", (S1 * S2 * S3));
			aTimer.start();
			
			for (sal_Int32 i=0; i < S1; i++)
			{
				keyName1 = sName1;
				keyName1 += OUString().valueOf(i);
				if (reg_createKey(hRootKey, keyName1.pData, &hKey))	
					cout << "creating key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr() 
						 << "\" failed\n"; 

				for (sal_Int32 j=0; j < S2; j++)
				{
					keyName2 = sName2;
					keyName2 += OUString().valueOf(j);
					if (reg_createKey(hKey, keyName2.pData, &hSubKey))	
						cout << "creating key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr()
							 << "\" failed\n"; 

						for (sal_Int32 n=0; n < S3; n++)
						{
							keyName3 = sName3;
							keyName3 += OUString().valueOf(n);
							if (reg_createKey(hSubKey, keyName3.pData, &hSubSubKey))	
								cout << "creating key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr()
									 << "\" failed\n"; 

							if (reg_closeKey(hSubSubKey))
								cout << "closing key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() 
									 << "\" failed\n";						
						}

					if (reg_closeKey(hSubKey))
						cout << "closing key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr() 
							 << "\" failed\n";						
				}

				if (reg_closeKey(hKey))
					cout << "closing key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr()
						 << "\" failed\n";						
			}
	
			aTimer.stop();

			printf("\n %d keys oeffnen und schliessen dauert ... ", (S1 * S2 * S3));
			aTimer.start();
			
			for (sal_Int32 i=0; i < S1; i++)
			{
				keyName1 = OUString::createFromAscii("/");
				keyName1 += sName1;
				keyName1 += OUString().valueOf(i);
				if (reg_openKey(hRootKey, keyName1.pData, &hKey))	
					cout << "open key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr()
						 << "\" failed\n"; 

				for (sal_Int32 j=0; j < S2; j++)
				{
					keyName2 = OUString::createFromAscii("/");
					keyName2 += sName1;
					keyName2 += OUString().valueOf(i);
					keyName2 += OUString::createFromAscii("/");
					keyName2 += sName2;
					keyName2 += OUString().valueOf(j);
					if (reg_openKey(hRootKey, keyName2.pData, &hSubKey))	
						cout << "open key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr()
							 << "\" failed\n"; 

						for (sal_Int32 n=0; n < S3; n++)
						{
							keyName3 = OUString::createFromAscii("/");
							keyName3 += sName1;
							keyName3 += OUString().valueOf(i);
							keyName3 += OUString::createFromAscii("/");
							keyName3 += sName2;
							keyName3 += OUString().valueOf(j);
							keyName3 += OUString::createFromAscii("/");
							keyName3 += sName3;
							keyName3 += OUString().valueOf(n);
							if (reg_openKey(hRootKey, keyName3.pData, &hSubSubKey))	
								cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr()
									 << "\" failed\n"; 

							if (reg_closeKey(hSubSubKey))
								cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr()
									 << "\" failed\n";						
						}

					if (reg_closeKey(hSubKey))
						cout << "closing key \"" << OUStringToOString(keyName2, RTL_TEXTENCODING_ASCII_US).getStr() 
							 << "\" failed\n";						
				}

				if (reg_closeKey(hKey))
					cout << "closing key \"" << OUStringToOString(keyName1, RTL_TEXTENCODING_ASCII_US).getStr()
						 << "\" failed\n";						
			}
	
			aTimer.stop();

			printf("\n 1 key oeffnen und schliessen dauert ... ");
			aTimer.start();

			if (reg_openKey(hRootKey, keyName3.pData, &hSubSubKey))	
				cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() 
					 << "\" failed\n"; 

			if (reg_closeKey(hSubSubKey))
				cout << "open key \"" << OUStringToOString(keyName3, RTL_TEXTENCODING_ASCII_US).getStr() 
					 << "\" failed\n";						

			aTimer.stop();

		}
		
		if (reg_closeKey(hRootKey))
			cout << "closing root key failed\n";						
		if (reg_closeRegistry(hReg))
			cout << "\t41. closing registry \"test.reg\" failed\n"; 
	}
	
	return(0);
}


