1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 : *
3 : * ***** BEGIN LICENSE BLOCK *****
4 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 : *
6 : * The contents of this file are subject to the Mozilla Public License Version
7 : * 1.1 (the "License"); you may not use this file except in compliance with
8 : * the License. You may obtain a copy of the License at
9 : * http://www.mozilla.org/MPL/
10 : *
11 : * Software distributed under the License is distributed on an "AS IS" basis,
12 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 : * for the specific language governing rights and limitations under the
14 : * License.
15 : *
16 : * The Original Code is nsCache.cpp, released
17 : * March 18, 2001.
18 : *
19 : * The Initial Developer of the Original Code is
20 : * Netscape Communications Corporation.
21 : * Portions created by the Initial Developer are Copyright (C) 2001
22 : * the Initial Developer. All Rights Reserved.
23 : *
24 : * Contributor(s):
25 : * Gordon Sheridan <gordon@netscape.com>
26 : * Patrick C. Beard <beard@netscape.com>
27 : * Darin Fisher <darin@netscape.com>
28 : *
29 : * Alternatively, the contents of this file may be used under the terms of
30 : * either the GNU General Public License Version 2 or later (the "GPL"), or
31 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
32 : * in which case the provisions of the GPL or the LGPL are applicable instead
33 : * of those above. If you wish to allow use of your version of this file only
34 : * under the terms of either the GPL or the LGPL, and not to allow others to
35 : * use your version of this file under the terms of the MPL, indicate your
36 : * decision by deleting the provisions above and replace them with the notice
37 : * and other provisions required by the GPL or the LGPL. If you do not delete
38 : * the provisions above, a recipient may use your version of this file under
39 : * the terms of any one of the MPL, the GPL or the LGPL.
40 : *
41 : * ***** END LICENSE BLOCK ***** */
42 :
43 : #include "nsCache.h"
44 : #include "nsReadableUtils.h"
45 : #include "nsDependentSubstring.h"
46 : #include "nsString.h"
47 :
48 :
49 : /**
50 : * Cache Service Utility Functions
51 : */
52 :
53 : #if defined(PR_LOGGING)
54 : PRLogModuleInfo * gCacheLog = nsnull;
55 :
56 :
57 : void
58 269 : CacheLogInit()
59 : {
60 269 : if (gCacheLog) return;
61 269 : gCacheLog = PR_NewLogModule("cache");
62 269 : NS_ASSERTION(gCacheLog, "\nfailed to allocate cache log.\n");
63 : }
64 :
65 :
66 : void
67 236 : CacheLogPrintPath(PRLogModuleLevel level, const char * format, nsIFile * item)
68 : {
69 472 : nsCAutoString path;
70 236 : nsresult rv = item->GetNativePath(path);
71 236 : if (NS_SUCCEEDED(rv)) {
72 236 : PR_LOG(gCacheLog, level, (format, path.get()));
73 : } else {
74 0 : PR_LOG(gCacheLog, level, ("GetNativePath failed: %x", rv));
75 : }
76 236 : }
77 :
78 : #endif
79 :
80 :
81 : PRUint32
82 11035 : SecondsFromPRTime(PRTime prTime)
83 : {
84 : PRInt64 microSecondsPerSecond, intermediateResult;
85 : PRUint32 seconds;
86 :
87 11035 : LL_I2L(microSecondsPerSecond, PR_USEC_PER_SEC);
88 11035 : LL_DIV(intermediateResult, prTime, microSecondsPerSecond);
89 11035 : LL_L2UI(seconds, intermediateResult);
90 11035 : return seconds;
91 : }
92 :
93 :
94 : PRTime
95 168 : PRTimeFromSeconds(PRUint32 seconds)
96 : {
97 : PRInt64 microSecondsPerSecond, intermediateResult;
98 : PRTime prTime;
99 :
100 168 : LL_I2L(microSecondsPerSecond, PR_USEC_PER_SEC);
101 168 : LL_UI2L(intermediateResult, seconds);
102 168 : LL_MUL(prTime, intermediateResult, microSecondsPerSecond);
103 168 : return prTime;
104 : }
105 :
106 :
107 : nsresult
108 0 : ClientIDFromCacheKey(const nsACString& key, char ** result)
109 : {
110 0 : nsresult rv = NS_OK;
111 0 : *result = nsnull;
112 :
113 0 : nsReadingIterator<char> colon;
114 0 : key.BeginReading(colon);
115 :
116 0 : nsReadingIterator<char> start;
117 0 : key.BeginReading(start);
118 :
119 0 : nsReadingIterator<char> end;
120 0 : key.EndReading(end);
121 :
122 0 : if (FindCharInReadable(':', colon, end)) {
123 0 : *result = ToNewCString( Substring(start, colon));
124 0 : if (!*result) rv = NS_ERROR_OUT_OF_MEMORY;
125 : } else {
126 0 : NS_ASSERTION(false, "FindCharInRead failed to find ':'");
127 0 : rv = NS_ERROR_UNEXPECTED;
128 : }
129 0 : return rv;
130 : }
131 :
132 :
133 : nsresult
134 0 : ClientKeyFromCacheKey(const nsCString& key, nsACString &result)
135 : {
136 0 : nsresult rv = NS_OK;
137 :
138 0 : nsReadingIterator<char> start;
139 0 : key.BeginReading(start);
140 :
141 0 : nsReadingIterator<char> end;
142 0 : key.EndReading(end);
143 :
144 0 : if (FindCharInReadable(':', start, end)) {
145 0 : ++start; // advance past clientID ':' delimiter
146 0 : result.Assign(Substring(start, end));
147 : } else {
148 0 : NS_ASSERTION(false, "FindCharInRead failed to find ':'");
149 0 : rv = NS_ERROR_UNEXPECTED;
150 0 : result.Truncate(0);
151 : }
152 0 : return rv;
153 : }
|