sbPropertyInfo.cpp
Go to the documentation of this file.
1 /*
2 //
3 // BEGIN SONGBIRD GPL
4 //
5 // This file is part of the Songbird web player.
6 //
7 // Copyright(c) 2005-2011 POTI, Inc.
8 // http://songbirdnest.com
9 //
10 // This file may be licensed under the terms of of the
11 // GNU General Public License Version 2 (the "GPL").
12 //
13 // Software distributed under the License is distributed
14 // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
15 // express or implied. See the GPL for the specific language
16 // governing rights and limitations.
17 //
18 // You should have received a copy of the GPL along with this
19 // program. If not, go to http://www.gnu.org/licenses/gpl.html
20 // or write to the Free Software Foundation, Inc.,
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 // END SONGBIRD GPL
24 //
25 */
26 
27 #include "sbPropertyInfo.h"
28 #include "sbStandardOperators.h"
29 
30 #include <nsArrayEnumerator.h>
31 #include <nsAutoPtr.h>
32 #include <nsISimpleEnumerator.h>
33 #include <sbLockUtils.h>
34 
35 /*
36  * * To log this module, set the following environment variable:
37  * * NSPR_LOG_MODULES=sbPropInfo:5
38  * */
39 #include <prlog.h>
40 #ifdef PR_LOGGING
41 static PRLogModuleInfo* gPropInfoLog = nsnull;
42 #endif
43 
44 #define LOG(args) PR_LOG(gPropInfoLog, PR_LOG_WARN, args)
45 #ifdef __GNUC__
46 #define __FUNCTION__ __PRETTY_FUNCTION__
47 #endif
48 
49 
51 
53 : mInitialized(PR_FALSE)
54 {
55 }
56 
57 sbPropertyOperator::sbPropertyOperator(const nsAString& aOperator,
58  const nsAString& aOperatorReadable)
59 : mInitialized(PR_TRUE)
60 , mOperator(aOperator)
61 , mOperatorReadable(aOperatorReadable)
62 {
63 }
64 
66 {
67 }
68 
69 NS_IMETHODIMP sbPropertyOperator::GetOperator(nsAString & aOperator)
70 {
71  aOperator = mOperator;
72  return NS_OK;
73 }
74 
75 NS_IMETHODIMP sbPropertyOperator::GetOperatorReadable(nsAString & aOperatorReadable)
76 {
77  aOperatorReadable = mOperatorReadable;
78  return NS_OK;
79 }
80 
81 NS_IMETHODIMP sbPropertyOperator::Init(const nsAString & aOperator, const nsAString & aOperatorReadable)
82 {
83  NS_ENSURE_TRUE(mInitialized == PR_FALSE, NS_ERROR_ALREADY_INITIALIZED);
84  mOperator = aOperator;
85  mOperatorReadable = aOperatorReadable;
86  mInitialized = PR_TRUE;
87  return NS_OK;
88 }
89 
91 
93 : mNullSort(sbIPropertyInfo::SORT_NULL_SMALL)
94 , mSecondarySortLock(nsnull)
95 , mSecondarySort(nsnull)
96 , mIDLock(nsnull)
97 , mTypeLock(nsnull)
98 , mDisplayNameLock(nsnull)
99 , mLocalizationKeyLock(nsnull)
100 , mUserViewableLock(nsnull)
101 , mUserViewable(PR_FALSE)
102 , mUserEditableLock(nsnull)
103 , mUserEditable(PR_TRUE)
104 , mOperatorsLock(nsnull)
105 , mRemoteReadableLock(nsnull)
106 , mRemoteReadable(PR_FALSE)
107 , mRemoteWritableLock(nsnull)
108 , mRemoteWritable(PR_FALSE)
109 , mUnitConverterLock(nsnull)
110 , mUnitConverter(nsnull)
111 , mUsedInIdentityLock(nsnull)
112 , mUsedInIdentity(PR_FALSE)
113 {
114 #ifdef PR_LOGGING
115  if (!gPropInfoLog) {
116  gPropInfoLog = PR_NewLogModule("sbPropInfo");
117  }
118 #endif
119 
120  mSecondarySortLock = PR_NewLock();
121 
122  NS_ASSERTION(mSecondarySortLock,
123  "sbPropertyInfo::mSecondarySortLock failed to create lock!");
124 
125  mIDLock = PR_NewLock();
126  NS_ASSERTION(mIDLock,
127  "sbPropertyInfo::mIDLock failed to create lock!");
128 
129  mTypeLock = PR_NewLock();
130  NS_ASSERTION(mTypeLock,
131  "sbPropertyInfo::mTypeLock failed to create lock!");
132 
133  mDisplayNameLock = PR_NewLock();
134  NS_ASSERTION(mDisplayNameLock,
135  "sbPropertyInfo::mDisplayNameLock failed to create lock!");
136 
137  mLocalizationKeyLock = PR_NewLock();
138  NS_ASSERTION(mLocalizationKeyLock,
139  "sbPropertyInfo::mLocalizationKeyLock failed to create lock!");
140 
141  mUserViewableLock = PR_NewLock();
142  NS_ASSERTION(mUserViewableLock,
143  "sbPropertyInfo::mUserViewableLock failed to create lock!");
144 
145  mUserEditableLock = PR_NewLock();
146  NS_ASSERTION(mUserEditableLock,
147  "sbPropertyInfo::mUserEditableLock failed to create lock!");
148 
149  mOperatorsLock = PR_NewLock();
150  NS_ASSERTION(mOperatorsLock,
151  "sbPropertyInfo::mOperatorsLock failed to create lock!");
152 
153  mRemoteReadableLock = PR_NewLock();
154  NS_ASSERTION(mRemoteReadableLock,
155  "sbPropertyInfo::mRemoteReadableLock failed to create lock!");
156 
157  mRemoteWritableLock = PR_NewLock();
158  NS_ASSERTION(mRemoteWritableLock,
159  "sbPropertyInfo::mRemoteWritableLock failed to create lock!");
160 
161  mUnitConverterLock = PR_NewLock();
162  NS_ASSERTION(mUnitConverterLock,
163  "sbPropertyInfo::mUnitConverterLock failed to create lock!");
164 
165  mUsedInIdentityLock = PR_NewLock();
166  NS_ASSERTION(mUsedInIdentityLock,
167  "sbPropertyInfo::mUsedInIdentityLock failed to create lock!");
168 }
169 
171 {
172  if(mSecondarySortLock) {
173  PR_DestroyLock(mSecondarySortLock);
174  }
175 
176  if(mIDLock) {
177  PR_DestroyLock(mIDLock);
178  }
179 
180  if(mTypeLock) {
181  PR_DestroyLock(mTypeLock);
182  }
183 
184  if(mDisplayNameLock) {
185  PR_DestroyLock(mDisplayNameLock);
186  }
187 
189  PR_DestroyLock(mLocalizationKeyLock);
190  }
191 
192  if(mUserViewableLock) {
193  PR_DestroyLock(mUserViewableLock);
194  }
195 
196  if(mUserEditableLock) {
197  PR_DestroyLock(mUserEditableLock);
198  }
199 
200  if(mOperatorsLock) {
201  PR_DestroyLock(mOperatorsLock);
202  }
203 
204  if(mRemoteReadableLock) {
205  PR_DestroyLock(mRemoteReadableLock);
206  }
207 
208  if(mRemoteWritableLock) {
209  PR_DestroyLock(mRemoteWritableLock);
210  }
211 
212  if(mUnitConverterLock) {
213  PR_DestroyLock(mUnitConverterLock);
214  }
215 
216  if(mUsedInIdentityLock) {
217  PR_DestroyLock(mUsedInIdentityLock);
218  }
219 }
220 
221 nsresult
223 {
224  nsresult rv;
225  nsAutoString op;
226  nsRefPtr<sbPropertyOperator> propOp;
227 
228  rv = sbPropertyInfo::GetOPERATOR_ISSET(op);
229  NS_ENSURE_SUCCESS(rv, rv);
230  propOp = new sbPropertyOperator(op, NS_LITERAL_STRING("&smart.isset"));
231  NS_ENSURE_TRUE(propOp, NS_ERROR_OUT_OF_MEMORY);
232  rv = mOperators.AppendObject(propOp);
233  NS_ENSURE_SUCCESS(rv, rv);
234 
235  rv = sbPropertyInfo::GetOPERATOR_ISNOTSET(op);
236  NS_ENSURE_SUCCESS(rv, rv);
237  propOp = new sbPropertyOperator(op, NS_LITERAL_STRING("&smart.isnotset"));
238  NS_ENSURE_TRUE(propOp, NS_ERROR_OUT_OF_MEMORY);
239  rv = mOperators.AppendObject(propOp);
240  NS_ENSURE_SUCCESS(rv, rv);
241 
242  return NS_OK;
243 }
244 
245 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_EQUALS(nsAString & aOPERATOR_EQUALS)
246 {
247  aOPERATOR_EQUALS = NS_LITERAL_STRING(SB_OPERATOR_EQUALS);
248  return NS_OK;
249 }
250 
251 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_NOTEQUALS(nsAString & aOPERATOR_NOTEQUALS)
252 {
253  aOPERATOR_NOTEQUALS = NS_LITERAL_STRING(SB_OPERATOR_NOTEQUALS);
254  return NS_OK;
255 }
256 
257 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_GREATER(nsAString & aOPERATOR_GREATER)
258 {
259  aOPERATOR_GREATER = NS_LITERAL_STRING(SB_OPERATOR_GREATER);
260  return NS_OK;
261 }
262 
263 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_GREATEREQUAL(nsAString & aOPERATOR_GREATEREQUAL)
264 {
265  aOPERATOR_GREATEREQUAL = NS_LITERAL_STRING(SB_OPERATOR_GREATEREQUAL);
266  return NS_OK;
267 }
268 
269 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_LESS(nsAString & aOPERATOR_LESS)
270 {
271  aOPERATOR_LESS = NS_LITERAL_STRING(SB_OPERATOR_LESS);
272  return NS_OK;
273 }
274 
275 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_LESSEQUAL(nsAString & aOPERATOR_LESSEQUAL)
276 {
277  aOPERATOR_LESSEQUAL = NS_LITERAL_STRING(SB_OPERATOR_LESSEQUAL);
278  return NS_OK;
279 }
280 
281 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_CONTAINS(nsAString & aOPERATOR_CONTAINS)
282 {
283  aOPERATOR_CONTAINS = NS_LITERAL_STRING(SB_OPERATOR_CONTAINS);
284  return NS_OK;
285 }
286 
287 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_NOTCONTAINS(nsAString & aOPERATOR_NOTCONTAINS)
288 {
289  aOPERATOR_NOTCONTAINS = NS_LITERAL_STRING(SB_OPERATOR_NOTCONTAINS);
290  return NS_OK;
291 }
292 
293 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_BEGINSWITH(nsAString & aOPERATOR_BEGINSWITH)
294 {
295  aOPERATOR_BEGINSWITH = NS_LITERAL_STRING(SB_OPERATOR_BEGINSWITH);
296  return NS_OK;
297 }
298 
299 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_NOTBEGINSWITH(nsAString & aOPERATOR_NOTBEGINSWITH)
300 {
301  aOPERATOR_NOTBEGINSWITH = NS_LITERAL_STRING(SB_OPERATOR_NOTBEGINSWITH);
302  return NS_OK;
303 }
304 
305 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_ENDSWITH(nsAString & aOPERATOR_ENDSWITH)
306 {
307  aOPERATOR_ENDSWITH = NS_LITERAL_STRING(SB_OPERATOR_ENDSWITH);
308  return NS_OK;
309 }
310 
311 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_NOTENDSWITH(nsAString & aOPERATOR_NOTENDSWITH)
312 {
313  aOPERATOR_NOTENDSWITH = NS_LITERAL_STRING(SB_OPERATOR_NOTENDSWITH);
314  return NS_OK;
315 }
316 
317 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_BETWEEN(nsAString & aOPERATOR_BETWEEN)
318 {
319  aOPERATOR_BETWEEN = NS_LITERAL_STRING(SB_OPERATOR_BETWEEN);
320  return NS_OK;
321 }
322 
323 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_ISSET(nsAString & aOPERATOR_ISSET)
324 {
325  aOPERATOR_ISSET = NS_LITERAL_STRING(SB_OPERATOR_ISSET);
326  return NS_OK;
327 }
328 
329 NS_IMETHODIMP sbPropertyInfo::GetOPERATOR_ISNOTSET(nsAString & aOPERATOR_ISNOTSET)
330 {
331  aOPERATOR_ISNOTSET = NS_LITERAL_STRING(SB_OPERATOR_ISNOTSET);
332  return NS_OK;
333 }
334 
335 NS_IMETHODIMP sbPropertyInfo::SetNullSort(PRUint32 aNullSort)
336 {
337  mNullSort = aNullSort;
338  return NS_OK;
339 }
340 NS_IMETHODIMP sbPropertyInfo::GetNullSort(PRUint32 *aNullSort)
341 {
342  NS_ENSURE_ARG_POINTER(aNullSort);
343  *aNullSort = mNullSort;
344  return NS_OK;
345 }
346 
347 NS_IMETHODIMP sbPropertyInfo::SetSecondarySort(sbIPropertyArray * aSecondarySort)
348 {
349  NS_ENSURE_ARG_POINTER(aSecondarySort);
350 
352 
353  // XXX - Due to caching we cannot allow the secondary sort
354  // to be updated more than once. This is a nasty hack
355  // and will have to be fixed with a large scale architectural
356  // change.
357  //
358  // See Bug 12677 – "[sorting] cached sortable values should
359  // auto-invalidate when property implementations change"
360  //
361  // If you need to change the secondary sort for a property that
362  // may already be cached in the db, check out
363  // sbILocalDatabasePropertyCache.InvalidateSortData()
364  if (mSecondarySort) {
365  return NS_ERROR_ALREADY_INITIALIZED;
366  }
367 
368  mSecondarySort = aSecondarySort;
369 
370  return NS_OK;
371 }
372 NS_IMETHODIMP sbPropertyInfo::GetSecondarySort(sbIPropertyArray * *aSecondarySort)
373 {
374  NS_ENSURE_ARG_POINTER(aSecondarySort);
375 
377  *aSecondarySort = mSecondarySort;
378  NS_IF_ADDREF(*aSecondarySort);
379 
380  return NS_OK;
381 }
382 
383 NS_IMETHODIMP sbPropertyInfo::GetId(nsAString & aID)
384 {
386  aID = mID;
387  return NS_OK;
388 }
389 NS_IMETHODIMP sbPropertyInfo::SetId(const nsAString &aID)
390 {
391  LOG(( "sbPropertyInfo::SetId(%s)", NS_LossyConvertUTF16toASCII(aID).get() ));
392 
394 
395  if(mID.IsEmpty()) {
396  mID = aID;
397  return NS_OK;
398  }
399 
400  return NS_ERROR_ALREADY_INITIALIZED;
401 }
402 
403 NS_IMETHODIMP sbPropertyInfo::GetType(nsAString & aType)
404 {
406  aType = mType;
407  return NS_OK;
408 }
409 NS_IMETHODIMP sbPropertyInfo::SetType(const nsAString &aType)
410 {
412 
413  if(mType.IsEmpty()) {
414  mType = aType;
415  return NS_OK;
416  }
417 
418  return NS_ERROR_ALREADY_INITIALIZED;
419 }
420 
421 NS_IMETHODIMP sbPropertyInfo::GetDisplayName(nsAString & aDisplayName)
422 {
424 
425  if(mDisplayName.IsEmpty()) {
427  aDisplayName = mID;
428  }
429  else {
430  aDisplayName = mDisplayName;
431  }
432 
433  return NS_OK;
434 }
435 NS_IMETHODIMP sbPropertyInfo::SetDisplayName(const nsAString &aDisplayName)
436 {
438 
439  if(mDisplayName.IsEmpty()) {
440  mDisplayName = aDisplayName;
441  return NS_OK;
442  }
443 
444  return NS_ERROR_ALREADY_INITIALIZED;
445 }
446 
447 /* attribute AString localizationKey; */
448 NS_IMETHODIMP sbPropertyInfo::GetLocalizationKey(nsAString & aLocalizationKey)
449 {
451 
452  if(mLocalizationKey.IsEmpty()) {
454  aLocalizationKey = mID;
455  }
456  else {
457  aLocalizationKey = mLocalizationKey;
458  }
459 
460  return NS_OK;
461 }
462 NS_IMETHODIMP sbPropertyInfo::SetLocalizationKey(const nsAString & aLocalizationKey)
463 {
465 
466  if(mLocalizationKey.IsEmpty()) {
467  mLocalizationKey = aLocalizationKey;
468  return NS_OK;
469  }
470 
471  return NS_ERROR_ALREADY_INITIALIZED;
472 }
473 
474 
475 NS_IMETHODIMP sbPropertyInfo::GetUserViewable(PRBool *aUserViewable)
476 {
477  NS_ENSURE_ARG_POINTER(aUserViewable);
478 
480  *aUserViewable = mUserViewable;
481 
482  return NS_OK;
483 }
484 
485 NS_IMETHODIMP sbPropertyInfo::SetUserViewable(PRBool aUserViewable)
486 {
488  mUserViewable = aUserViewable;
489 
490  return NS_OK;
491 }
492 
493 NS_IMETHODIMP sbPropertyInfo::GetUserEditable(PRBool *aUserEditable)
494 {
495  NS_ENSURE_ARG_POINTER(aUserEditable);
496 
498  *aUserEditable = mUserEditable;
499 
500  return NS_OK;
501 }
502 
503 NS_IMETHODIMP sbPropertyInfo::SetUserEditable(PRBool aUserEditable)
504 {
506  mUserEditable = aUserEditable;
507 
508  return NS_OK;
509 }
510 
511 NS_IMETHODIMP sbPropertyInfo::GetOperators(nsISimpleEnumerator * *aOperators)
512 {
513  NS_ENSURE_ARG_POINTER(aOperators);
514 
516  return NS_NewArrayEnumerator(aOperators, mOperators);
517 }
518 NS_IMETHODIMP sbPropertyInfo::SetOperators(nsISimpleEnumerator * aOperators)
519 {
520  NS_ENSURE_ARG_POINTER(aOperators);
521 
523  mOperators.Clear();
524 
525  PRBool hasMore = PR_FALSE;
526  nsCOMPtr<nsISupports> object;
527 
528  while( NS_SUCCEEDED(aOperators->HasMoreElements(&hasMore)) &&
529  hasMore &&
530  NS_SUCCEEDED(aOperators->GetNext(getter_AddRefs(object)))) {
531  nsresult rv;
532  nsCOMPtr<sbIPropertyOperator> po = do_QueryInterface(object, &rv);
533  NS_ENSURE_SUCCESS(rv, rv);
534 
535  PRBool success = mOperators.AppendObject(po);
536  NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
537  }
538 
539  return NS_OK;
540 }
541 
542 NS_IMETHODIMP sbPropertyInfo::GetOperator(const nsAString & aOperator,
543  sbIPropertyOperator * *_retval)
544 {
545  NS_ENSURE_ARG_POINTER(_retval);
546 
548 
549  PRUint32 length = mOperators.Count();
550  for (PRUint32 i = 0; i < length; i++) {
551  nsAutoString op;
552  nsresult rv = mOperators[i]->GetOperator(op);
553  NS_ENSURE_SUCCESS(rv, rv);
554  if (op.Equals(aOperator)) {
555  NS_ADDREF(*_retval = mOperators[i]);
556  return NS_OK;
557  }
558  }
559 
560  *_retval = nsnull;
561  return NS_OK;
562 }
563 
564 NS_IMETHODIMP sbPropertyInfo::Validate(const nsAString & aValue, PRBool *_retval)
565 {
566  NS_ENSURE_ARG_POINTER(_retval);
567  *_retval = PR_TRUE;
568  return NS_OK;
569 }
570 
571 NS_IMETHODIMP sbPropertyInfo::Sanitize(const nsAString & aValue, nsAString & _retval)
572 {
573  return NS_ERROR_NOT_IMPLEMENTED;
574 }
575 
576 NS_IMETHODIMP sbPropertyInfo::Format(const nsAString & aValue, nsAString & _retval)
577 {
578  _retval = aValue;
579  return NS_OK;
580 }
581 
582 NS_IMETHODIMP sbPropertyInfo::MakeSearchable(const nsAString & aValue, nsAString & _retval)
583 {
584  _retval = aValue;
585  return NS_OK;
586 }
587 
588 NS_IMETHODIMP sbPropertyInfo::MakeSortable(const nsAString & aValue, nsAString & _retval)
589 {
590  // by default, the sortable value of a property is the same as the searchable
591  // value. this may be changed by specific properties, for instance by text
592  // properties which compute collation data for local-specific sort orders.
593  return MakeSearchable(aValue, _retval);
594 }
595 
596 NS_IMETHODIMP sbPropertyInfo::GetRemoteReadable(PRBool *aRemoteReadable)
597 {
598  NS_ENSURE_ARG_POINTER(aRemoteReadable);
599 
601  *aRemoteReadable = mRemoteReadable;
602 
603  return NS_OK;
604 }
605 
606 NS_IMETHODIMP sbPropertyInfo::SetRemoteReadable(PRBool aRemoteReadable)
607 {
609  mRemoteReadable = aRemoteReadable;
610 
611  return NS_OK;
612 }
613 
614 NS_IMETHODIMP sbPropertyInfo::GetRemoteWritable(PRBool *aRemoteWritable)
615 {
616  NS_ENSURE_ARG_POINTER(aRemoteWritable);
617 
619  *aRemoteWritable = mRemoteWritable;
620 
621  return NS_OK;
622 }
623 
624 NS_IMETHODIMP sbPropertyInfo::SetRemoteWritable(PRBool aRemoteWritable)
625 {
627  mRemoteWritable = aRemoteWritable;
628 
629  return NS_OK;
630 }
631 
632 NS_IMETHODIMP sbPropertyInfo::GetUnitConverter(sbIPropertyUnitConverter **aUnitConverter)
633 {
634  NS_ENSURE_ARG_POINTER(aUnitConverter);
635 
637  if (mUnitConverter) {
638  NS_ADDREF(*aUnitConverter = mUnitConverter);
639  } else
640  *aUnitConverter = nsnull;
641 
642  return NS_OK;
643 }
644 
646 {
648  mUnitConverter = aUnitConverter;
649  if (mUnitConverter)
650  mUnitConverter->SetPropertyInfo(this);
651 
652  return NS_OK;
653 }
654 
655 NS_IMETHODIMP sbPropertyInfo::GetUsedInIdentity(PRBool *aUsedInIdentity)
656 {
657  NS_ENSURE_ARG_POINTER(aUsedInIdentity);
658 
660  *aUsedInIdentity = mUsedInIdentity;
661 
662  return NS_OK;
663 }
664 
665 NS_IMETHODIMP sbPropertyInfo::SetUsedInIdentity(PRBool aUsedInIdentity)
666 {
668  mUsedInIdentity = aUsedInIdentity;
669  return NS_OK;
670 }
return NS_OK
PRLock * mDisplayNameLock
PRLock * mUnitConverterLock
onPageChanged aValue
Definition: FeedWriter.js:1395
PRLock * mRemoteWritableLock
#define SB_OPERATOR_NOTEQUALS
virtual ~sbPropertyInfo()
#define SB_OPERATOR_CONTAINS
#define SB_OPERATOR_NOTCONTAINS
#define SB_OPERATOR_ISNOTSET
PRLock * mLocalizationKeyLock
PRLock * mUsedInIdentityLock
NS_IMETHOD SetUnitConverter(sbIPropertyUnitConverter *aUnitConverter)
#define SB_OPERATOR_BEGINSWITH
PRLock * mTypeLock
nsCOMPtr< sbIPropertyUnitConverter > mUnitConverter
nsString mDisplayName
#define SB_OPERATOR_GREATER
PRLock * mRemoteReadableLock
#define SB_OPERATOR_EQUALS
PRBool mRemoteReadable
NS_DECL_ISUPPORTS NS_DECL_SBIPROPERTYOPERATOR sbPropertyOperator()
#define SB_OPERATOR_LESSEQUAL
nsCOMPtr< sbIPropertyArray > mSecondarySort
PRLock * mUserEditableLock
NS_IMPL_THREADSAFE_ISUPPORTS1(sbDeviceCapsCompatibility, sbIDeviceCapsCompatibility) sbDeviceCapsCompatibility
An interface to represent an operator that may act upon a property.
An interface used to describe a metadata property for use by the UI and other sbILibrary interfaces (...
#define SB_OPERATOR_NOTENDSWITH
#define LOG(args)
NS_IMPL_THREADSAFE_ISUPPORTS2(sbDeviceCapabilities, sbIDeviceCapabilities, nsIClassInfo) NS_IMPL_CI_INTERFACE_GETTER2(sbDeviceCapabilities
#define SB_OPERATOR_ISSET
nsString mLocalizationKey
#define SB_OPERATOR_NOTBEGINSWITH
PRBool mRemoteWritable
PRBool mUsedInIdentity
PRLock * mUserViewableLock
StringArrayEnumerator prototype hasMore
Property unit converter interface This is an interface songbird property converter, used to convert a property value between its various units representations.
#define SB_OPERATOR_GREATEREQUAL
nsCOMArray< sbIPropertyOperator > mOperators
#define SB_OPERATOR_BETWEEN
void Init(in AString aOperator, in aString aOperatorReadable)
Initialize the operator.
#define SB_OPERATOR_LESS
#define SB_OPERATOR_ENDSWITH
An interface to carry around arrays of nsIProperty instances. Users of this interface should only QI ...
_getSelectedPageStyle s i
PRLock * mOperatorsLock
PRLock * mSecondarySortLock
PRUint32 mNullSort
PRPackedBool mInitialized