1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * Copyright 2000, 2010 Oracle and/or its affiliates.
7  *
8  * OpenOffice.org - a multi-platform office productivity suite
9  *
10  * This file is part of OpenOffice.org.
11  *
12  * OpenOffice.org is free software: you can redistribute it and/or modify
13  * it under the terms of the GNU Lesser General Public License version 3
14  * only, as published by the Free Software Foundation.
15  *
16  * OpenOffice.org is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU Lesser General Public License version 3 for more details
20  * (a copy is included in the LICENSE file that accompanied this code).
21  *
22  * You should have received a copy of the GNU Lesser General Public License
23  * version 3 along with OpenOffice.org.  If not, see
24  * <http://www.openoffice.org/license.html>
25  * for a copy of the LGPLv3 License.
26  *
27  ************************************************************************/
28 #pragma once
29 
30 #include <config_lgpl.h>
31 #include <map>
32 #include <string_view>
33 
34 #include <ne_locks.h>
35 
36 #include <osl/mutex.hxx>
37 #include <rtl/ref.hxx>
38 #include "NeonTypes.hxx"
39 
40 namespace webdav_ucp
41 {
42 
43 class TickerThread;
44 class NeonSession;
45 
46 struct LockInfo
47 {
48     rtl::Reference< NeonSession > xSession;
49     sal_Int32 nLastChanceToSendRefreshRequest;
50 
LockInfowebdav_ucp::LockInfo51     LockInfo()
52         : nLastChanceToSendRefreshRequest( -1 ) {}
53 
LockInfowebdav_ucp::LockInfo54     LockInfo( rtl::Reference< NeonSession > const & _xSession,
55               sal_Int32 _nLastChanceToSendRefreshRequest )
56     : xSession( _xSession ),
57       nLastChanceToSendRefreshRequest( _nLastChanceToSendRefreshRequest ) {}
58 
59 };
60 
61 typedef std::map< NeonLock *, LockInfo > LockInfoMap;
62 
63 class NeonLockStore
64 {
65     osl::Mutex         m_aMutex;
66     ne_lock_store    * m_pNeonLockStore;
67     rtl::Reference< TickerThread > m_pTickerThread;
68     LockInfoMap        m_aLockInfoMap;
69     std::vector<NeonLock*> m_aRemoveDeferred;
70 
71 public:
72     NeonLockStore();
73     ~NeonLockStore();
74 
75     void registerSession( HttpSession * pHttpSession );
76 
77     NeonLock * findByUri( std::u16string_view rUri );
78 
79     void addLock( NeonLock * pLock,
80                   rtl::Reference< NeonSession > const & xSession,
81                   // time in seconds since Jan 1 1970
82                   // -1: infinite lock, no refresh
83                   sal_Int32 nLastChanceToSendRefreshRequest );
84 
85     void removeLock( NeonLock * pLock );
86     void removeLockDeferred(NeonLock* pLock);
87 
88     void refreshLocks();
89 
90 private:
91     void startTicker();
92     void stopTicker(osl::ClearableMutexGuard & rGuard);
93 };
94 
95 } // namespace webdav_ucp
96 
97 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
98