#include "camtypes.h"
Go to the source code of this file.
Defines | |
#define | MAXDRIVE 3 |
#define | MAXNAME 8 |
#define | MAXNETNAME 256 |
#define | MAXEXT 16 |
#define | SEPARATOR _T('/') |
#define | FULLSTOP '.' |
#define | COLON ':' |
#define | END_OF_PATH '\0' |
#define | END_OF_STRING '\0' |
#define | SEPARATOR_SYM "\\" |
#define | FULLSTOP_SYM "." |
#define | COLON_SYM ":" |
#define | END_OF_PATH_SYM "\0" |
#define | NET_DRIVE_SYM "\\\\" |
Functions | |
DECLARE_SOURCE ("$Revision: 1282 $") | |
void | AbbreviateName (LPTSTR lpszCanon, INT32 cchMax, BOOL bAtLeastName) |
BOOL | getDrive (const TCHAR **fn, TCHAR *drive) |
Parses the Drive location of file. Scope: Private. | |
BOOL | getNetDrive (const TCHAR **fn, TCHAR *drive, BOOL *pBadCharacter) |
Parses the network Drive location of file and returns whether this was accomplished or not. The network name will consist of the server name followed by a mount point name. Scope: Private. | |
BOOL | getIdentifier (const TCHAR **fn, TCHAR *identifier, UINT32 MaxSize, BOOL *pBadCharacter) |
Parses file or directory identifier Scope: Private. | |
BOOL | getExtension (const TCHAR **fn, TCHAR *ext, UINT32 MaxSize, const TCHAR *StartOfPath) |
Parses from the specified position, which should be the last valid character on the pathname, backwards until we hit either:-
| |
BOOL | getParentDirectory (const TCHAR **fn, TCHAR *directory, UINT32 MaxSize, const TCHAR *StartOfPath) |
Parses from the specified position, which should be something like the first valid character of the filename on the pathname, backwards until we hit either:-
| |
BOOL | IsReservedChar (const TCHAR **fn) |
Checks if character passed in is a special character allowed in file names. No longer used. Scope: Private Checks if character passed in is a reserved character allowed in file names. Does not check for terminators which are allowed by the callers such as . and backslash. These characters are considered illegal when converting long to short filenames and so it would seem sensible to limit their use. Scope: Private. | |
BOOL | IsDeviceName (const String_256 &path) |
Parses a string representing a path and sees if it refers to a device name which would be illegal. |
|
Definition at line 126 of file pathname.cpp. |
|
Definition at line 132 of file pathname.cpp. |
|
Definition at line 127 of file pathname.cpp. |
|
Definition at line 133 of file pathname.cpp. |
|
Definition at line 128 of file pathname.cpp. |
|
Definition at line 125 of file pathname.cpp. |
|
Definition at line 131 of file pathname.cpp. |
|
Definition at line 110 of file pathname.cpp. |
|
Definition at line 113 of file pathname.cpp. |
|
Definition at line 111 of file pathname.cpp. |
|
Definition at line 112 of file pathname.cpp. |
|
Definition at line 134 of file pathname.cpp. |
|
Definition at line 118 of file pathname.cpp. |
|
Definition at line 130 of file pathname.cpp. |
|
|
|
|
|
Parses the Drive location of file. Scope: Private.
Definition at line 1133 of file pathname.cpp. 01134 { 01135 UINT32 i = 0; 01136 01137 if (String::IsAlpha(**fn)) 01138 { 01139 drive[i++] = **fn; // Parse Drive Letter 01140 (*fn)++; 01141 if (**fn == COLON) // Parse colon 01142 { 01143 drive[i++] = **fn; 01144 (*fn)++; 01145 if (**fn == SEPARATOR) // Parse slash 01146 { 01147 drive[i++] = **fn; 01148 (*fn)++; 01149 } 01150 else 01151 return FALSE; // Else Syntax error 01152 } 01153 else 01154 return FALSE; 01155 } 01156 else 01157 return FALSE; 01158 01159 drive[i++] = END_OF_STRING; 01160 01161 return TRUE; 01162 }
|
|
Parses from the specified position, which should be the last valid character on the pathname, backwards until we hit either:-
Definition at line 1350 of file pathname.cpp. 01351 { 01352 UINT32 i = 0; 01353 01354 // Search from the specified string end backwards until we find either:- 01355 // - a full stop indicating a valid extension 01356 // - a path separator indicating no file extension is present 01357 // - the start of the file indicating no file extension is present 01358 while ( 01359 (**fn != SEPARATOR) && // is not at a path separating character 01360 (**fn != FULLSTOP) && // is not at a full stop character 01361 (*fn != StartOfPath) && // is not at the start of the path string 01362 (i < MaxSize) // is not maximum size 01363 ) 01364 { 01365 i++; 01366 (*fn)--; 01367 } 01368 01369 if (**fn != FULLSTOP) // if we are not at a full stop Then Syntax error 01370 return FALSE; 01371 01372 // Make up the string that we are going to return 01373 // Do it this way as otherwise we would be adding the characters in backwards in the above 01374 // routine as we are scanning backwards! 01375 UINT32 position = 0; // Start at first character in the string 01376 (*fn)++; // Move to character after the full stop 01377 while (( i >= 0 ) && (**fn != END_OF_PATH)) 01378 { 01379 ext[position++] = **fn; // Add current character to File Extension 01380 (*fn)++; // Move to next character 01381 i--; // decrement extension letters count 01382 } 01383 01384 ext[position++] = END_OF_STRING; // Set end of string 01385 01386 return TRUE; 01387 }
|
|
Parses file or directory identifier Scope: Private.
Definition at line 1280 of file pathname.cpp. 01281 { 01282 UINT32 i = 0; 01283 01284 // While not a Separator or not EOF or Maximum size 01285 // Used to check for (String::IsAlphaNumeric(**fn) || IsSpecialChar(fn)) 01286 // to see if it was a valid character or not but this would not allow things like 01287 // spaces which are allowed under NT and Chicago. Reduce check to known problem 01288 // characters such as colons in the wrong place and '/'. 01289 // but must only flag this as an error and continue as we must have a filename at the 01290 // end so that a m4essage such as 'cannot open file: xxxxx.xx' can be shown by using 01291 // the GetFileName call. 01292 // Removed the FULLSTOP test as this was stopping directory names having full stops in 01293 01294 while ( **fn != SEPARATOR && // If not a separator for next directory/filename 01295 **fn != END_OF_PATH && // and not terminator 01296 i < (MaxSize)) // is less than maximum name size 01297 { 01298 // Check if this is an illegal character for the filing system and if so 01299 // make a note and continue. 01300 if ( IsReservedChar(fn) ) 01301 { 01302 *pBadCharacter = TRUE; // Flag bad character found 01303 } 01304 01305 identifier[i++] = **fn; // Parse the Identifier 01306 (*fn)++; 01307 } 01308 01309 // if a valid identifier terminator found then return True 01310 // otherwise return False. 01311 // Do not stop on full stops as these are valid in directory names. 01312 if (**fn == SEPARATOR || 01313 **fn == END_OF_PATH) 01314 { 01315 if (**fn == SEPARATOR) 01316 { 01317 identifier[i++] = **fn; // Parse the Separator 01318 } 01319 01320 identifier[i++] = END_OF_STRING; // Set end of string 01321 01322 return TRUE; 01323 } 01324 else 01325 return FALSE; 01326 }
|
|
Parses the network Drive location of file and returns whether this was accomplished or not. The network name will consist of the server name followed by a mount point name. Scope: Private.
Definition at line 1185 of file pathname.cpp. 01186 { 01187 // Used for storing either <ServerName> or <DirectoryName> 01188 String_256 identifier; 01189 TCHAR* pId; 01190 01191 UINT32 i = 0; 01192 01193 if (**fn == SEPARATOR) // Parse '\\' bit 01194 { 01195 drive[i++] = **fn; 01196 01197 (*fn)++; 01198 01199 if (**fn == SEPARATOR) 01200 { 01201 01202 drive[i++] = **fn; 01203 01204 (*fn)++; 01205 01206 identifier.Empty(); 01207 01208 // We have a valid network name start 01209 // Parse Network drive name(s) 01210 if ( getIdentifier(&(*fn), identifier, MAXNETNAME, pBadCharacter) ) 01211 { 01212 pId = identifier; // Copy identifier into drive 01213 01214 while (*pId != END_OF_STRING) 01215 { 01216 drive[i++] = *pId; 01217 pId++; 01218 } 01219 01220 (*fn)++; 01221 01222 identifier.Empty(); 01223 01224 // We have a valid network drive name and so parse the mount point name 01225 if ( getIdentifier(&(*fn), identifier, MAXNETNAME, pBadCharacter) ) 01226 { 01227 pId = identifier; // Copy identifier into drive 01228 01229 while (*pId != END_OF_STRING) 01230 { 01231 drive[i++] = *pId; 01232 pId++; 01233 } 01234 01235 (*fn)++; 01236 01237 drive[i++] = END_OF_STRING; 01238 01239 // Everything has gone ok so now exit 01240 return TRUE; 01241 } 01242 else 01243 return FALSE; 01244 } 01245 else 01246 return FALSE; 01247 } 01248 else 01249 return FALSE; 01250 } 01251 else 01252 return FALSE; 01253 }
|
|
Parses from the specified position, which should be something like the first valid character of the filename on the pathname, backwards until we hit either:-
Definition at line 1410 of file pathname.cpp. 01411 { 01412 UINT32 i = 0; 01413 01414 // Note where we are in the path 01415 const TCHAR* CurrentPosition = *fn; 01416 01417 // If we are tsarting on a separator then skip it 01418 if (**fn == SEPARATOR) 01419 (*fn)--; 01420 01421 // Search from the specified string end backwards until we find either:- 01422 // - a path separator indicating we have found a potential parent directory. 01423 // - the start of the file indicating no parent directory is present 01424 while ( 01425 (**fn != SEPARATOR) && // is not at a path separating character 01426 (*fn != StartOfPath) && // is not at the start of the path string 01427 (i < MaxSize) // is not maximum size 01428 ) 01429 { 01430 i++; 01431 (*fn)--; 01432 } 01433 01434 if (**fn != SEPARATOR) // if we are not at a directory separator 01435 return FALSE; // Then Syntax error 01436 01437 // Make up the string that we are going to return 01438 // Do it this way as otherwise we would be adding the characters in backwards in the above 01439 // routine as we are scanning backwards! 01440 UINT32 position = 0; // Start at first character in the string 01441 while (( i >= 0 ) && (*fn != CurrentPosition)) 01442 { 01443 directory[position++] = **fn; // Add current character to directory name 01444 (*fn)++; // Move to next character 01445 i--; // decrement directory name letters count 01446 } 01447 01448 directory[position++] = END_OF_STRING; // Set end of string 01449 01450 return TRUE; 01451 }
|
|
Parses a string representing a path and sees if it refers to a device name which would be illegal.
Definition at line 1568 of file pathname.cpp. 01569 { 01570 #if defined(__WXMSW__) 01571 const INT32 buffer_size = 256; 01572 TCHAR buffer[buffer_size]; // create buffer of characters 01573 // First use a Windows call to try and see if the pathname supplied is a 01574 // known device name. Use a 256 string as a buffer as not particular bothered 01575 // by what is returned, only if something is returned 01576 DWORD i; 01577 i = QueryDosDevice(path, buffer, buffer_size); // See if known Windows device name 01578 01579 // returns i = number of characters supplied in pBuffer, if 0 then failed 01580 //TRACE( _T("QueryDosDevice returns %d\n"),i); 01581 if (i>0) 01582 return TRUE; // valid device name, therefore passes 01583 #endif 01584 01585 // Check our pathname against some known basic names as a final check 01586 // Device names will in general have three letters with a possible number 01587 // and possible colon on the end. 01588 String_256 temp; // general workspace string 01589 01590 // work out in temp the left most three characters and then compare this with 01591 // some known bad values 01592 path.Left(&temp,4); // temp = left most 4 characters of path 01593 01594 if ( temp.IsIdentical(TEXT(SEPARATOR_SYM) TEXT(SEPARATOR_SYM) TEXT(".") TEXT(SEPARATOR_SYM))) // NT device name starts with this 01595 return TRUE; // if start this then no more checks required 01596 01597 path.Left(&temp,3); // temp = left most 3 characters of path 01598 temp.toUpper(); // Now convert to upper case 01599 01600 if ( (temp.IsIdentical(TEXT("LPT"))) || // basic DOS print device 01601 (temp.IsIdentical(TEXT("COM"))) || // basic DOS communication port 01602 (temp.IsIdentical(TEXT("NUL"))) || // basic DOS null device 01603 (temp.IsIdentical(TEXT("AUX")))) // basic DOS auxiliary port 01604 { 01605 // Check that the length of the name is correct i.e. 3, 4 or 5 long 01606 const TCHAR *dn; // device name pointer 01607 dn = path; // set to point to the current path 01608 01609 switch (path.Length()) 01610 { 01611 case 3: 01612 // correct length and passed the test above so its a device name 01613 // drop through to after case and return True 01614 break; 01615 01616 case 4: 01617 // check for number or a colon on the end 01618 // position is from 0.. and so want character number 3 01619 dn += 3; // point to third character in name 01620 if ( ( !String::IsNumeric(*dn) ) && ( *dn != COLON ) ) 01621 return FALSE; // not colon or number 01622 // drop through to after case and return True 01623 break; 01624 01625 case 5: 01626 // check for number and colon on the end 01627 // position is from 0.. and so want character number 3 01628 dn += 3; // point to third character in name 01629 // first check that the second to last character is a number 01630 if ( !String::IsNumeric(*dn) ) 01631 return FALSE; // not a number so return False 01632 // now check that the last character is a colon 01633 dn += 1; // move to last character 01634 if ( *dn != COLON ) 01635 return FALSE; // not a colon so return False 01636 // drop through to after case and return True 01637 break; 01638 01639 default: 01640 // In all other cases can return False as wrong length 01641 return FALSE; 01642 break; 01643 } // end switch 01644 return TRUE; // passed above tests so return True 01645 } 01646 else 01647 return FALSE; // failed in three letter comparisons so not a recognised device 01648 }
|
|
Checks if character passed in is a special character allowed in file names. No longer used. Scope: Private Checks if character passed in is a reserved character allowed in file names. Does not check for terminators which are allowed by the callers such as . and backslash. These characters are considered illegal when converting long to short filenames and so it would seem sensible to limit their use. Scope: Private.
Definition at line 1528 of file pathname.cpp. 01529 { 01530 const TCHAR SLASH = '/'; 01531 const TCHAR OPENSQUARE = '['; 01532 const TCHAR CLOSESQUARE = ']'; 01533 const TCHAR QUOTES = '"'; 01534 const TCHAR COLON_TCHAR = ':'; 01535 const TCHAR SEMICOLON = ';'; 01536 const TCHAR COMMA = ','; 01537 const TCHAR EQUALS = '='; 01538 01539 if ((**fn != SLASH) && 01540 (**fn != OPENSQUARE) && 01541 (**fn != CLOSESQUARE) && 01542 (**fn != QUOTES) && 01543 (**fn != COLON_TCHAR) && 01544 (**fn != SEMICOLON) && 01545 (**fn != COMMA) && 01546 (**fn != EQUALS)) 01547 return FALSE; 01548 else 01549 return TRUE; 01550 }
|