Ignore:
Timestamp:
Feb 11, 2012, 2:26:24 PM (10 years ago)
Author:
roman
Message:
 
Location:
trunk/Utilities/MaxMindGeoLite
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Utilities/MaxMindGeoLite

    • Property svn:ignore
      •  

        old new  
        33*.suo
        44*.sdf
         5*.opensdf
  • trunk/Utilities/MaxMindGeoLite/Location.h

    r47 r48  
    230230
    231231////////////////////////////////////////////////////////////
     232// CFreeThreadedMarshaler
     233
     234class CFreeThreadedMarshaler
     235{
     236private:
     237        CComPtr<IUnknown> m_pMarshalerUnknown;
     238        CComPtr<IMarshal> m_pMarshalerMarshal;
     239
     240public:
     241// CFreeThreadedMarshaler
     242        const CComPtr<IMarshal>& operator -> () const throw()
     243        {
     244                return GetMarshal();
     245        }
     246        VOID Initialize()
     247        {
     248                _A(!m_pMarshalerUnknown && !m_pMarshalerMarshal);
     249                __C(CoCreateFreeThreadedMarshaler(NULL, &m_pMarshalerUnknown));
     250                m_pMarshalerMarshal = m_pMarshalerUnknown;
     251                __D(m_pMarshalerMarshal, E_NOINTERFACE);
     252        }
     253        VOID Terminate() throw()
     254        {
     255                m_pMarshalerMarshal = NULL;
     256                m_pMarshalerUnknown = NULL;
     257        }
     258        const CComPtr<IMarshal>& GetMarshal() const throw()
     259        {
     260                return m_pMarshalerMarshal;
     261        }
     262};
     263
     264////////////////////////////////////////////////////////////
    232265// CLocations
    233266
     
    235268        public CComObjectRootEx<CComMultiThreadModelNoCS>,
    236269        public CComCoClass<CLocations, &__uuidof(Locations)>,
    237         public CBasePersistT<CLocations>,
    238         //public IRoPersistStreamInitT<CLocations>,
    239         //public IRoPersistStorageT<CLocations>,
    240         //public IRoPersistPropertyBagT<CLocations>,
    241         //public IRoSpecifyPropertyPagesT<CLocations>,
    242270        public IDispatchImpl<ILocations>
    243271{
     
    247275//DECLARE_REGISTRY_RESOURCEID(IDR)
    248276
     277DECLARE_CLASSFACTORY_SINGLETON(CLocations)
     278
    249279DECLARE_PROTECT_FINAL_CONSTRUCT()
    250280
    251281BEGIN_COM_MAP(CLocations)
    252         //COM_INTERFACE_ENTRY_IID(__uuidof(IPersist), IPersistStreamInit)
    253         //COM_INTERFACE_ENTRY_IID(__uuidof(IPersistStream), IPersistStreamInit)
    254         //COM_INTERFACE_ENTRY(IPersistStreamInit)
    255         //COM_INTERFACE_ENTRY(IPersistStorage)
    256         //COM_INTERFACE_ENTRY(IPersistPropertyBag)
    257         //COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
    258282        COM_INTERFACE_ENTRY(ILocations)
    259283        COM_INTERFACE_ENTRY(IDispatch)
     284        COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IMarshal), m_FreeThreadedMarshaler)
    260285END_COM_MAP()
    261 
    262 BEGIN_PROP_MAP(CLocations)
    263 END_PROP_MAP()
    264286
    265287public:
     
    427449private:
    428450        CWindowsSockets2 m_Sockets;
    429         CRequiresSave m_bRequiresSave;
    430         mutable CRoCriticalSection m_DataCriticalSection;
     451        CFreeThreadedMarshaler m_FreeThreadedMarshaler;
     452        //mutable CRoCriticalSection m_DataCriticalSection;
    431453        GeoLiteCity::CLocationArray m_LocationArray;
    432454        GeoLiteCity::CBlockArray m_BlockArray;
     
    451473                return S_OK;
    452474        }
    453         CLocations() throw() :
    454                 CBasePersistT<CLocations>(m_DataCriticalSection),
    455                 m_bRequiresSave(m_DataCriticalSection)
     475        CLocations() throw()
    456476        {
    457477                _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this);
     
    466486                {
    467487                        __C(m_Sockets.GetStartupResult());
     488                        m_FreeThreadedMarshaler.Initialize();
    468489                        Initialize();
    469490                }
     
    476497        VOID FinalRelease() throw()
    477498        {
     499                m_FreeThreadedMarshaler.Terminate();
    478500        }
    479501        VOID Initialize()
     
    490512        }
    491513
    492 // ILocation
     514// ILocations
    493515        STDMETHOD(get_Item)(VARIANT vIndex, ILocation** ppLocation) throw()
    494516        {
     
    529551
    530552OBJECT_ENTRY_AUTO(__uuidof(Locations), CLocations)
     553
     554////////////////////////////////////////////////////////////
     555// CLazyLocations
     556
     557class ATL_NO_VTABLE CLazyLocations :
     558        public CComObjectRootEx<CComMultiThreadModelNoCS>,
     559        public CComCoClass<CLazyLocations, &__uuidof(LazyLocations)>,
     560        public IDispatchImpl<ILazyLocations>
     561{
     562        typedef CThreadT<CLazyLocations> CThread;
     563
     564public:
     565        enum { IDR = IDR_LAZYLOCATIONS };
     566
     567//DECLARE_REGISTRY_RESOURCEID(IDR)
     568
     569DECLARE_CLASSFACTORY_SINGLETON(CLazyLocations)
     570
     571DECLARE_PROTECT_FINAL_CONSTRUCT()
     572
     573BEGIN_COM_MAP(CLazyLocations)
     574        COM_INTERFACE_ENTRY(ILazyLocations)
     575        COM_INTERFACE_ENTRY_IID(__uuidof(IDispatch), ILazyLocations)
     576        COM_INTERFACE_ENTRY(ILocations)
     577        COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IMarshal), m_FreeThreadedMarshaler)
     578END_COM_MAP()
     579
     580private:
     581        CFreeThreadedMarshaler m_FreeThreadedMarshaler;
     582        mutable CRoCriticalSection m_ThreadCriticalSection;
     583        CObjectPtr<CThread> m_pThread;
     584        mutable CRoCriticalSection m_DataCriticalSection;
     585        CObjectPtr<CLocations> m_pLocations;
     586
     587        DWORD ThreadProc(CThread* pThread, CEvent& InitializationEvent, CEvent& TerminationEvent)
     588        {
     589                CMultiThreadedApartment MultiThreadedApartment;
     590                _W(InitializationEvent.Set());
     591                CComPtr<ILocations> pLocations;
     592                __C(pLocations.CoCreateInstance(__uuidof(Locations)));
     593                const CObjectPtr<CLocations> pNativeLocations = static_cast<CLocations*>((ILocations*) pLocations);
     594                _A(pNativeLocations);
     595                {
     596                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
     597                        _A(!m_pLocations);
     598                        m_pLocations = pNativeLocations;
     599                }
     600                TerminationEvent;
     601                CRoCriticalSectionLock ThreadLock(m_ThreadCriticalSection);
     602                _A(m_pThread == pThread || !m_pThread && WaitForSingleObject(TerminationEvent, 0) == WAIT_OBJECT_0);
     603                m_pThread.Release();
     604                return 0;
     605        }
     606
     607public:
     608// CLazyLocations
     609        static CString GetObjectFriendlyName()
     610        {
     611                return _StringHelper::GetLine(IDR, 2);
     612        }
     613        static HRESULT WINAPI UpdateRegistry(BOOL bRegister) throw()
     614        {
     615                _Z2(atlTraceRegistrar, 2, _T("bRegister %d\n"), bRegister);
     616                _ATLTRY
     617                {
     618                        UpdateRegistryFromResource<CLazyLocations>(bRegister);
     619                }
     620                _ATLCATCH(Exception)
     621                {
     622                        _C(Exception);
     623                }
     624                return S_OK;
     625        }
     626        CLazyLocations() throw()
     627        {
     628                _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this);
     629        }
     630        ~CLazyLocations() throw()
     631        {
     632                _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this);
     633        }
     634        HRESULT FinalConstruct() throw()
     635        {
     636                _ATLTRY
     637                {
     638                        CRoCriticalSectionLock ThreadLock(m_ThreadCriticalSection);
     639                        CObjectPtr<CThread> pThread;
     640                        __E(pThread.Construct()->Initialize(this, &CLazyLocations::ThreadProc));
     641                        m_pThread = pThread;
     642                }
     643                _ATLCATCH(Exception)
     644                {
     645                        _C(Exception);
     646                }
     647                return S_OK;
     648        }
     649        VOID FinalRelease() throw()
     650        {
     651                CObjectPtr<CThread> pThread;
     652                {
     653                        CRoCriticalSectionLock ThreadLock(m_ThreadCriticalSection);
     654                        m_pThread.Swap(pThread);
     655                }
     656        }
     657        CObjectPtr<CLocations> GetLocations() const throw()
     658        {
     659                CRoCriticalSectionLock DataLock(m_DataCriticalSection);
     660                return m_pLocations;
     661        }
     662
     663// ILazyLocations
     664        STDMETHOD(get_Initialized)(VARIANT_BOOL* pbInitialized) throw()
     665        {
     666                _Z4(atlTraceCOM, 4, _T("...\n"));
     667                _ATLTRY
     668                {
     669                        __D(pbInitialized, E_POINTER);
     670                        //ObjectLock Lock(this);
     671                        //CRoCriticalSectionLock DataLock(m_DataCriticalSection);
     672                        *pbInitialized = GetLocations() ? ATL_VARIANT_TRUE : ATL_VARIANT_FALSE;
     673                }
     674                _ATLCATCH(Exception)
     675                {
     676                        _C(Exception);
     677                }
     678                return S_OK;
     679        }
     680
     681// ILocations
     682        STDMETHOD(get_Item)(VARIANT vIndex, ILocation** ppLocation) throw()
     683        {
     684                _Z4(atlTraceCOM, 4, _T("vIndex.vt 0x%x\n"), vIndex.vt);
     685                _ATLTRY
     686                {
     687                        __D(ppLocation, E_POINTER);
     688                        __D(vIndex.vt == VT_BSTR, E_INVALIDARG);
     689                        //ObjectLock Lock(this);
     690                        //CRoCriticalSectionLock DataLock(m_DataCriticalSection);
     691                        CComPtr<ILocation> pLocation;
     692                        const CObjectPtr<CLocations> pLocations = GetLocations();
     693                        if(pLocations)
     694                                __C(pLocations->get_Item(vIndex, &pLocation));
     695                        *ppLocation = pLocation.Detach();
     696                }
     697                _ATLCATCH(Exception)
     698                {
     699                        _C(Exception);
     700                }
     701                return S_OK;
     702        }
     703};
     704
     705OBJECT_ENTRY_AUTO(__uuidof(LazyLocations), CLazyLocations)
Note: See TracChangeset for help on using the changeset viewer.