home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / BC_502 / SRCBDTO.PAK / WRAPIT.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  8.0 KB  |  388 lines

  1. //-----------------------------------------------------------------------------
  2. // Visual Database Tools
  3. // Copyright (c) 1996 by Borland International, All Rights Reserved
  4. //
  5. // wrapit.cpp
  6. // Functions which create wrapper objects
  7. //-----------------------------------------------------------------------------
  8.  
  9. #define INITGUID
  10. #include <vdbt\bdto.h>
  11.  
  12. #pragma hdrstop
  13.  
  14. #include "wrapit.h"
  15.  
  16. BDTC_ENABLE_EXCEPTIONS;
  17.  
  18. #define NOTUSED( x )        ((void)(long) (x))
  19.  
  20. //-----------------------------------------------------------------------------
  21.  
  22. PTField WrapPITField( PITField pitField )
  23. {
  24.     PTField pt = 0;
  25.  
  26.     if (pitField)
  27.     {
  28.         switch (pitField->get_DataType())
  29.         {
  30.             case ftUnknown:
  31.                 pt = new TField( pitField );
  32.                 break;
  33.             case ftString:
  34.                 pt = new TStringField( pitField );
  35.                 break;
  36.             case ftSmallint:
  37.                 pt = new TSmallintField( pitField );
  38.                 break;
  39.             case ftInteger:
  40.                 pt = new TIntegerField( pitField );
  41.                 break;
  42.             case ftWord:
  43.                 pt = new TWordField( pitField );
  44.                 break;
  45.             case ftBoolean:
  46.                 pt = new TBooleanField( pitField );
  47.                 break;
  48.             case ftFloat:
  49.                 pt = new TFloatField( pitField );
  50.                 break;
  51.             case ftCurrency:
  52.                 pt = new TCurrencyField( pitField );
  53.                 break;
  54.             case ftBCD:
  55.                 pt = new TBCDField( pitField );
  56.                 break;
  57.             case ftDate:
  58.                 pt = new TDateField( pitField );
  59.                 break;
  60.             case ftTime:
  61.                 pt = new TTimeField( pitField );
  62.                 break;
  63.             case ftDateTime:
  64.                 pt = new TDateTimeField( pitField );
  65.                 break;
  66.             case ftBytes:
  67.                 pt = new TBytesField( pitField );
  68.                 break;
  69.             case ftVarBytes:
  70.                 pt = new TVarBytesField( pitField );
  71.                 break;
  72. #ifdef __FLAT__
  73.             case ftAutoInc:
  74.                 pt = new TIntegerField( pitField );
  75.                 break;
  76. #endif // __FLAT__
  77.             case ftBlob:
  78.                 pt = new TBlobField( pitField );
  79.                 break;
  80.             case ftMemo:
  81.                 pt = new TMemoField( pitField );
  82.                 break;
  83.             case ftGraphic:
  84.                 pt = new TGraphicField( pitField );
  85.                 break;
  86. #ifdef __FLAT__
  87.             case ftFmtMemo:
  88.             case ftParadoxOle:
  89.             case ftDBaseOle:
  90.             case ftTypedBinary:
  91.                 pt = new TBlobField( pitField );
  92.                 break;
  93. #endif // __FLAT__
  94.             default:
  95.                 pt = new TField( pitField );
  96.                 break;
  97.         }
  98.     }
  99.  
  100.     return pt;
  101. }
  102.  
  103. //-----------------------------------------------------------------------------
  104.  
  105. PTDataSet WrapPITDataSet( PITDataSet pitDataSet )
  106. {
  107.     PTDataSet pt = 0;
  108.  
  109.     if (pitDataSet)
  110.     {
  111.         PITTable pitTable = 0;
  112.         PITQuery pitQuery = 0;
  113.         PITStoredProc pitStoredProc = 0;
  114.         PITDBDataSet pitDBDataSet = 0;
  115.  
  116.         if (pitDataSet->QueryInterface( IID_ITTable, (void**) &pitTable ) == NOERROR)
  117.         {
  118.             pt = new TTable( pitTable );
  119.             pitTable->Release();
  120.         }
  121.         else if (pitDataSet->QueryInterface( IID_ITQuery, (void**) &pitQuery ) == NOERROR)
  122.         {
  123.             pt = new TQuery( pitQuery );
  124.             pitQuery->Release();
  125.         }
  126.         else if (pitDataSet->QueryInterface( IID_ITStoredProc, (void**) &pitStoredProc ) == NOERROR)
  127.         {
  128.             pt = new TStoredProc( pitStoredProc );
  129.             pitStoredProc->Release();
  130.         }
  131.         else if (pitDataSet->QueryInterface( IID_ITDBDataSet, (void**) &pitDBDataSet ) == NOERROR)
  132.         {
  133.             pt = new TDBDataSet( pitDBDataSet );
  134.             pitDBDataSet->Release();
  135.         }
  136.         else
  137.             pt = new TDataSet( pitDataSet );
  138.     }
  139.  
  140.     return pt;
  141. }
  142.  
  143. //-----------------------------------------------------------------------------
  144.  
  145. PTSession WrapPITSession( PITSession pitSession )
  146. {
  147.     PTSession pt = 0;
  148.  
  149.     if (pitSession)
  150.         pt = new TSession( pitSession );
  151.  
  152.     return pt;
  153. }
  154.  
  155. //-----------------------------------------------------------------------------
  156.  
  157. PTDatabase WrapPITDatabase( PITDatabase pitDatabase )
  158. {
  159.     PTDatabase pt = 0;
  160.  
  161.     if (pitDatabase)
  162.         pt = new TDatabase( pitDatabase );
  163.  
  164.     return pt;
  165. }
  166.  
  167. //-----------------------------------------------------------------------------
  168.  
  169. PTDataSource WrapPITDataSource( PITDataSource pitDataSource )
  170. {
  171.     PTDataSource pt = 0;
  172.  
  173.     if (pitDataSource)
  174.         pt = new TDataSource( pitDataSource );
  175.  
  176.     return pt;
  177. }
  178.  
  179. //-----------------------------------------------------------------------------
  180.  
  181. PTStrings WrapPITStrings( PITStrings pitStrings )
  182. {
  183.     PTStrings pt = 0;
  184.  
  185.     if (pitStrings)
  186.         pt = new TStrings( pitStrings );
  187.  
  188.     return pt;
  189. }
  190.  
  191. //-----------------------------------------------------------------------------
  192.  
  193. AnyString::AnyString( const string& s )
  194. {
  195.     pit = CreateITAnyString();
  196.     if (pit)
  197.         pit->put_AsStringBuf( s.c_str() );
  198. }
  199.  
  200. AnyString::AnyString( PITAnyString p )
  201. {
  202.     pit = p;
  203.     // Don't call AddRef here because the caller isn't going to release.
  204. }
  205.  
  206. AnyString::AnyString( const AnyString& p )
  207. {
  208.     pit = p.pit;
  209.     if (pit)
  210.         pit->AddRef();
  211. }
  212.  
  213. AnyString& AnyString::operator=( AnyString& p )
  214. {
  215.     if (this != &p)
  216.     {
  217.         if (pit)
  218.             pit->Release();
  219.         pit = p.pit;
  220.         if (pit)
  221.             pit->AddRef();
  222.     }
  223.     return *this;
  224. }
  225.  
  226. AnyString::~AnyString( void )
  227. {
  228.     if (pit)
  229.         pit->Release();
  230. }
  231.  
  232. PITAnyString AnyString::GetPITAnyString( void )
  233. {
  234.     return pit;
  235. }
  236.  
  237. void AnyString::GetString( string& s )
  238. {
  239.     if (pit)
  240.     {
  241.         s = pit->get_Buffer();
  242.     }
  243. }
  244.  
  245. //-----------------------------------------------------------------------------
  246.  
  247. #ifdef __FLAT__
  248.  
  249. typedef enum
  250. {
  251.     ItsWindows95,
  252.     ItsWindowsNT,
  253. } SystemType;
  254.  
  255. static SystemType WhatsTheSystem( void )
  256. {
  257.     DWORD version = GetVersion();
  258.  
  259.     if (LOBYTE(LOWORD(version)) >= 4)
  260.     {
  261.         if (version < 0x80000000)
  262.             return ItsWindowsNT;                // NT 4
  263.         else
  264.             return ItsWindows95;
  265.     }
  266.  
  267.     return ItsWindowsNT;                // NT 3.xx
  268. }
  269.  
  270. #else // __FLAT__
  271.  
  272. # define VBXMSG_GETEMUHANDLE "VBXGETEMUHANDLE"
  273.  
  274. #endif // __FLAT__
  275.  
  276. static HMODULE GetVBXEmulator( HWND hwnd )
  277. {
  278.     HMODULE hvbxdll;
  279.  
  280. #ifdef __FLAT__
  281.  
  282.     NOTUSED( hwnd );
  283.  
  284.     if (WhatsTheSystem() == ItsWindows95)
  285.         hvbxdll = GetModuleHandle( "BIVBX31.32C" );    // Windows 95
  286.     else
  287.         hvbxdll = GetModuleHandle( "BIVBX31.32N" );    // Windows NT
  288.  
  289. #else // __FLAT__
  290.  
  291.     WORD wMsgGetEmuHandle = RegisterWindowMessage( VBXMSG_GETEMUHANDLE );
  292.     hvbxdll = HMODULE( SendMessage( hwnd, wMsgGetEmuHandle, 0, 0L ) );
  293.  
  294. #endif // __FLAT__
  295.  
  296.     return hvbxdll;
  297. }
  298.  
  299. typedef LPVOID HCTL;
  300. #define GPA_VBXGETHCTL "VBXGetHctl"
  301. typedef HCTL (FAR PASCAL* VBXGETHCTL)( HWND );
  302.  
  303. static HCTL GetVBXCtl( HWND hdlg, int idc, HMODULE* phvbxdll )
  304. {
  305.     HCTL hctl = 0;
  306.  
  307.     HWND hwnd = GetDlgItem( hdlg, idc );
  308.     if (hwnd)
  309.     {
  310.         HMODULE hvbxdll = GetVBXEmulator( hwnd );
  311.         *phvbxdll = hvbxdll;
  312.         if (hvbxdll)
  313.         {
  314.             VBXGETHCTL fpVBXGetHctl = (VBXGETHCTL) GetProcAddress( hvbxdll, GPA_VBXGETHCTL );
  315.             if (fpVBXGetHctl)
  316.             {
  317.                 hctl = (*fpVBXGetHctl)( hwnd );
  318.             }
  319.         }
  320.     }
  321.  
  322.     return hctl;
  323. }
  324.  
  325. #ifdef __FLAT__
  326. # define GPA_VBXGETPROPBYNAME    ((LPCSTR)(DWORD) 80)
  327. #else // __FLAT__
  328. # define GPA_VBXGETPROPBYNAME "VBXGetPropByName"
  329. #endif // __FLAT__
  330.  
  331. typedef BOOL (FAR PASCAL* VBXGETPROPBYNAME)( HCTL, LPSTR, LPVOID );
  332.  
  333. PIUnknown GetVBXPIUnknown( HWND hdlg, int idc )
  334. {
  335.     HMODULE hvbxdll = 0;
  336.     HCTL hctl = GetVBXCtl( hdlg, idc, &hvbxdll );
  337.     if (hctl)
  338.     {
  339.         VBXGETPROPBYNAME fpVBXGetPropByName = (VBXGETPROPBYNAME) GetProcAddress( hvbxdll, GPA_VBXGETPROPBYNAME );
  340.         if (fpVBXGetPropByName)
  341.         {
  342.             PIUnknown punk = 0;
  343.             if ((*fpVBXGetPropByName)( hctl, "Object", &punk ))
  344.             {
  345.                 return punk;
  346.             }
  347.         }
  348.     }
  349.  
  350.     return 0;
  351. }
  352.  
  353. #ifdef __FLAT__
  354. # define GPA_VBXSETPROPBYNAME    ((LPCSTR)(DWORD) 132)
  355. #else // __FLAT__
  356. # define GPA_VBXSETPROPBYNAME "VBXSetPropByName"
  357. #endif // __FLAT__
  358.  
  359. typedef BOOL (FAR PASCAL* VBXSETPROPBYNAME)( HCTL, LPSTR, LPVOID );
  360.  
  361. void SetVBXPIUnknown( HWND hdlg, int idc, PIUnknown punk )
  362. {
  363.     HMODULE hvbxdll = 0;
  364.     HCTL hctl = GetVBXCtl( hdlg, idc, &hvbxdll );
  365.     if (hctl)
  366.     {
  367.         VBXSETPROPBYNAME fpVBXSetPropByName = (VBXSETPROPBYNAME) GetProcAddress( hvbxdll, GPA_VBXSETPROPBYNAME );
  368.         if (fpVBXSetPropByName)
  369.         {
  370.             (*fpVBXSetPropByName)( hctl, "Object", punk );
  371.         }
  372.     }
  373. }
  374.  
  375. //-----------------------------------------------------------------------------
  376.  
  377. void VDBTEasterEgg( void )
  378. {
  379.     PIBDT50 pBDT = GetIBDT50();
  380.     if (pBDT)
  381.     {
  382.         pBDT->EasterEgg();
  383.         pBDT->Release();
  384.     }
  385. }
  386.  
  387. //-----------------------------------------------------------------------------
  388.