Share Pastebin
Guest
Public paste!

nameczanin

By: a guest | Feb 7th, 2008 | Syntax: C++ | Size: 4.94 KB | Hits: 76 | Expires: Never
This paste has a previous version, view the difference. Copy text to clipboard
  1. #include "stdafx.hpp"
  2.  
  3. using namespace NFR;
  4.  
  5. //
  6. // CCallbackIdCreator
  7. //
  8.  
  9. CCallbackIdCreator::CCallbackIdCreator()
  10. {
  11.     m_dLastId = 0;
  12. }
  13.  
  14. CCallbackIdCreator& CCallbackIdCreator::inst()
  15. {
  16.     static CCallbackIdCreator m_inst;
  17.  
  18.     return m_inst;
  19. }
  20.  
  21. unsigned int CCallbackIdCreator::getId()
  22. {
  23.     return ++m_dLastId;
  24. }
  25.  
  26.  
  27. //
  28. // Callback
  29. //
  30.  
  31. Callback::Callback()
  32. {
  33.     m_vpParameters = NULL;
  34.     Reset();
  35. }
  36.  
  37. Callback::Callback( const Callback& obj )
  38. {
  39.     Reset( obj );
  40. }
  41.  
  42. Callback::~Callback()
  43. {
  44. }
  45.  
  46. Callback::Callback( int parsNum, ... )
  47. {
  48.     va_list list;
  49.     va_start( list, parsNum );
  50.         m_pThis = va_arg( list, void* );
  51.         m_pFunc = va_arg( list, void* );
  52.  
  53.         m_dNumParameters = parsNum;
  54.         m_vpParameters = NULL;
  55.         if( parsNum )
  56.         {
  57.             m_vpParameters = new int[parsNum];
  58.             for( int i = parsNum - 1; i >= 0; i -- )
  59.                 m_vpParameters[i] = va_arg( list, int );
  60.         }
  61.     va_end( list );
  62.  
  63.     m_bIsInstantiated = true;
  64.  
  65.     m_id = CCallbackIdCreator::inst().getId();
  66. }
  67.  
  68. void Callback::call( void* par )
  69. {
  70.     callInt( par );
  71. }
  72.  
  73. int Callback::callInt( unsigned int parsNum, ... )
  74. {
  75.     va_list list;
  76.     delete[] m_vpParameters;
  77.     m_vpParameters = NULL;
  78.  
  79.     if( parsNum )
  80.     {
  81.         m_vpParameters = new int[parsNum];
  82.  
  83.         va_start( list, parsNum );
  84.         for( unsigned int i = parsNum - 1; i >= 0; i -- )
  85.             va_arg( list, int );
  86.         va_end( list );
  87.     }
  88.  
  89.     return callInt();
  90. }
  91.  
  92. int Callback::callInt( void* par )
  93. {
  94.     if( par != NULL )
  95.     {
  96.         setPar( par );
  97.     }
  98.  
  99.     if( m_bIsInstantiated )
  100.     {
  101.         void* pFunc = (void*) m_pFunc;
  102.         void* pThis = m_pThis;
  103.  
  104.         int dSize = 0;
  105.         int dNumParameters = m_dNumParameters;
  106.         int dOut = 0;
  107.  
  108.         /* w tym miejscu wszystkie parametry sa juz ustawione w odpowiedniej konwencji wywolania */
  109.         int* pParameter = m_vpParameters;
  110.         __asm
  111.         {
  112.             mov ecx, 0                        //zerujemy iterator
  113.  
  114.                                               //while( true )
  115.             our_for:                          //{
  116.  
  117.                 cmp ecx, [dNumParameters]     //if( i < dNumParameters )
  118.                 jae end_our_for               //goto end_our_for;
  119.  
  120.                 mov ebx, pParameter           //wrzucamy parametr ze wskaznika
  121.                 push [ebx]                    //na stos
  122.  
  123.                 add ecx, 1                    //i++;
  124.  
  125.                 add dSize, 4                  //zwiekszamy wielkosc oczyszczajaca stos
  126.                 add pParameter, 4             //wybieramy nastepny parametr
  127.  
  128.                 jmp our_for      
  129.  
  130.             end_our_for:                      //}
  131.  
  132.  
  133.             mov ecx, pThis;              //ustawiamy funkcje i wywolujemy ja
  134.             call pFunc;                 //
  135.  
  136.             add esp, [dSize]            //czas oczyscic stos
  137.            
  138.             mov [dOut], eax;            //umieszczamy wynik w zmiennej
  139.                                         //potrzebne to jest w zasadzie
  140.                                         //tylko dla wywolania callInt
  141.                                         //ale nic nie stoi na przeszkodzie
  142.                                         //aby wywolac to takze dla void
  143.         }
  144.      
  145.         return dOut;
  146.     }
  147.  
  148.     //aby kompilator sie nie plul w zasadzie :P
  149.     return 0;
  150. }
  151.  
  152. void Callback::setPar( void* par )
  153. {
  154.     setPars( 0 );
  155. }
  156.  
  157. void Callback::setPars( int parsNum, ... )
  158. {
  159.     va_list list;
  160.     delete[] m_vpParameters;
  161.     m_vpParameters = NULL;
  162.  
  163.     if( parsNum )
  164.     {
  165.         m_vpParameters = new int[parsNum];
  166.  
  167.         va_start( list, parsNum );
  168.         for( unsigned int i = parsNum - 1; i >= 0; i -- )
  169.             va_arg( list, int );
  170.         va_end( list );
  171.     }
  172. }
  173.  
  174. unsigned int Callback::getId()
  175. {
  176.     return m_id;
  177. }
  178.  
  179. void Callback::operator= ( const Callback& obj )
  180. {
  181.     Reset( obj );
  182. }
  183.  
  184. bool Callback::operator== ( const Callback& obj ) const
  185. {
  186.     if( m_id == m_id )
  187.         return true;
  188.     else
  189.         return false;
  190. }
  191.  
  192. bool Callback::operator!= ( const Callback& obj ) const
  193. {
  194.     if( m_id != obj.m_id )
  195.         return true;
  196.     else
  197.         return false;
  198. }
  199.  
  200. void Callback::Reset( const Callback& obj )
  201. {
  202.     m_pThis = obj.m_pThis;
  203.     m_pFunc = obj.m_pFunc;
  204.  
  205.     m_dNumParameters = obj.m_dNumParameters;
  206.     m_vpParameters = new int[m_dNumParameters];
  207.     for( unsigned int i = 0; i < m_dNumParameters; i ++ )
  208.         m_vpParameters[i] = obj.m_vpParameters[i];
  209.  
  210.     m_bIsInstantiated = obj.m_bIsInstantiated;
  211.  
  212.     m_id = obj.m_id;
  213. }
  214.  
  215. void Callback::Reset()
  216. {
  217.     m_pThis = NULL;
  218.     m_pFunc = NULL;
  219.     delete[] m_vpParameters;
  220.     m_vpParameters = NULL;
  221.     m_dNumParameters = 0;
  222.  
  223.     m_bIsInstantiated = NULL;
  224.  
  225.     m_id = NULL;
  226. }
  227.  
  228. Callback::operator bool() const
  229. {
  230.     if( m_id )
  231.         return true;
  232.  
  233.     return false;
  234. }